From d454758450dee05eed204376cf0243f439138c4f Mon Sep 17 00:00:00 2001 From: Lutchy Horace Date: Thu, 4 Jan 2024 00:59:06 -0500 Subject: [PATCH] Initial Draft --- LICENSE.txt | 35 + READ-ME.txt | 11 + about.html | 323 + comparison.html | 278 + contact.html | 257 + css/all.min.css | 9 + css/bootstrap.min.css | 6 + css/css-beautify-minify.css | 4419 +++++ css/style.css | 401 + domain.html | 255 + formmail/formmail.php | 15416 ++++++++++++++++ formmail/formmail927.php | 15369 +++++++++++++++ formmail/sampleform.htm | 121 + hosting.html | 370 + img/about.png | Bin 0 -> 34894 bytes img/anon_img.webp | Bin 0 -> 5670 bytes img/bg-bottom-footer.png | Bin 0 -> 19113 bytes img/bg-bottom-hero.png | Bin 0 -> 18800 bytes img/bg-domain.png | Bin 0 -> 45717 bytes img/bg-line.png | Bin 0 -> 16004 bytes img/bg-round-2.png | Bin 0 -> 17336 bytes img/bg-round.png | Bin 0 -> 16400 bytes img/bg-square.png | Bin 0 -> 15718 bytes img/hero.png | Bin 0 -> 11501 bytes img/team-1.jpg | Bin 0 -> 35525 bytes img/team-2.jpg | Bin 0 -> 21460 bytes img/team-3.jpg | Bin 0 -> 30119 bytes img/team-4.jpg | Bin 0 -> 21777 bytes img/testimonial-1.jpg | Bin 0 -> 3451 bytes img/testimonial-2.jpg | Bin 0 -> 3517 bytes img/testimonial-3.jpg | Bin 0 -> 3066 bytes img/testimonial-4.jpg | Bin 0 -> 3268 bytes index.html | 607 + js/main.js | 103 + jzgiluz7w2u.png | Bin 0 -> 127789 bytes lib/animate/animate.css | 1579 ++ lib/animate/animate.min.css | 11 + lib/counterup/counterup.min.js | 11 + lib/easing/easing.js | 168 + lib/easing/easing.min.js | 1 + lib/owlcarousel/LICENSE | 23 + lib/owlcarousel/assets/ajax-loader.gif | Bin 0 -> 3208 bytes lib/owlcarousel/assets/owl.carousel.css | 170 + lib/owlcarousel/assets/owl.carousel.min.css | 6 + lib/owlcarousel/assets/owl.theme.default.css | 50 + .../assets/owl.theme.default.min.css | 6 + lib/owlcarousel/assets/owl.theme.green.css | 50 + .../assets/owl.theme.green.min.css | 6 + lib/owlcarousel/assets/owl.video.play.png | Bin 0 -> 4976 bytes lib/owlcarousel/owl.carousel.js | 3275 ++++ lib/owlcarousel/owl.carousel.min.js | 7 + lib/waypoints/links.php | 5 + lib/waypoints/waypoints.min.js | 7 + lib/wow/wow.js | 542 + lib/wow/wow.min.js | 3 + mc7aymybu0o.png | Bin 0 -> 69634 bytes privacy.html | 303 + scss/bootstrap.scss | 28 + scss/bootstrap/scss/_accordion.scss | 118 + scss/bootstrap/scss/_alert.scss | 57 + scss/bootstrap/scss/_badge.scss | 29 + scss/bootstrap/scss/_breadcrumb.scss | 28 + scss/bootstrap/scss/_button-group.scss | 139 + scss/bootstrap/scss/_buttons.scss | 111 + scss/bootstrap/scss/_card.scss | 215 + scss/bootstrap/scss/_carousel.scss | 229 + scss/bootstrap/scss/_close.scss | 40 + scss/bootstrap/scss/_containers.scss | 41 + scss/bootstrap/scss/_dropdown.scss | 240 + scss/bootstrap/scss/_forms.scss | 9 + scss/bootstrap/scss/_functions.scss | 205 + scss/bootstrap/scss/_grid.scss | 22 + scss/bootstrap/scss/_helpers.scss | 7 + scss/bootstrap/scss/_images.scss | 42 + scss/bootstrap/scss/_list-group.scss | 174 + scss/bootstrap/scss/_mixins.scss | 42 + scss/bootstrap/scss/_modal.scss | 228 + scss/bootstrap/scss/_nav.scss | 139 + scss/bootstrap/scss/_navbar.scss | 306 + scss/bootstrap/scss/_offcanvas.scss | 77 + scss/bootstrap/scss/_pagination.scss | 64 + scss/bootstrap/scss/_popover.scss | 158 + scss/bootstrap/scss/_progress.scss | 48 + scss/bootstrap/scss/_reboot.scss | 621 + scss/bootstrap/scss/_root.scss | 16 + scss/bootstrap/scss/_spinners.scss | 69 + scss/bootstrap/scss/_tables.scss | 150 + scss/bootstrap/scss/_toasts.scss | 51 + scss/bootstrap/scss/_tooltip.scss | 115 + scss/bootstrap/scss/_transitions.scss | 21 + scss/bootstrap/scss/_type.scss | 104 + scss/bootstrap/scss/_utilities.scss | 594 + scss/bootstrap/scss/_variables.scss | 1464 ++ scss/bootstrap/scss/bootstrap-grid.scss | 65 + scss/bootstrap/scss/bootstrap-reboot.scss | 15 + scss/bootstrap/scss/bootstrap-utilities.scss | 18 + scss/bootstrap/scss/bootstrap.scss | 52 + .../scss/forms/_floating-labels.scss | 61 + scss/bootstrap/scss/forms/_form-check.scss | 152 + scss/bootstrap/scss/forms/_form-control.scss | 219 + scss/bootstrap/scss/forms/_form-range.scss | 91 + scss/bootstrap/scss/forms/_form-select.scss | 67 + scss/bootstrap/scss/forms/_form-text.scss | 11 + scss/bootstrap/scss/forms/_input-group.scss | 121 + scss/bootstrap/scss/forms/_labels.scss | 36 + scss/bootstrap/scss/forms/_validation.scss | 12 + scss/bootstrap/scss/helpers/_clearfix.scss | 3 + .../scss/helpers/_colored-links.scss | 12 + scss/bootstrap/scss/helpers/_position.scss | 30 + scss/bootstrap/scss/helpers/_ratio.scss | 26 + .../scss/helpers/_stretched-link.scss | 15 + .../scss/helpers/_text-truncation.scss | 7 + .../scss/helpers/_visually-hidden.scss | 8 + scss/bootstrap/scss/mixins/_alert.scss | 11 + .../bootstrap/scss/mixins/_border-radius.scss | 78 + scss/bootstrap/scss/mixins/_box-shadow.scss | 18 + scss/bootstrap/scss/mixins/_breakpoints.scss | 127 + scss/bootstrap/scss/mixins/_buttons.scss | 133 + scss/bootstrap/scss/mixins/_caret.scss | 64 + scss/bootstrap/scss/mixins/_clearfix.scss | 9 + scss/bootstrap/scss/mixins/_color-scheme.scss | 7 + scss/bootstrap/scss/mixins/_container.scss | 9 + scss/bootstrap/scss/mixins/_deprecate.scss | 10 + scss/bootstrap/scss/mixins/_forms.scss | 137 + scss/bootstrap/scss/mixins/_gradients.scss | 47 + scss/bootstrap/scss/mixins/_grid.scss | 125 + scss/bootstrap/scss/mixins/_image.scss | 16 + scss/bootstrap/scss/mixins/_list-group.scss | 24 + scss/bootstrap/scss/mixins/_lists.scss | 7 + scss/bootstrap/scss/mixins/_pagination.scss | 31 + scss/bootstrap/scss/mixins/_reset-text.scss | 17 + scss/bootstrap/scss/mixins/_resize.scss | 6 + .../scss/mixins/_table-variants.scss | 21 + .../bootstrap/scss/mixins/_text-truncate.scss | 8 + scss/bootstrap/scss/mixins/_transition.scss | 26 + scss/bootstrap/scss/mixins/_utilities.scss | 68 + .../scss/mixins/_visually-hidden.scss | 29 + scss/bootstrap/scss/utilities/_api.scss | 47 + scss/bootstrap/scss/vendor/_rfs.scss | 312 + team.html | 280 + testimonial.html | 275 + tos.html | 422 + web-hosting-html-template.jpg | Bin 0 -> 71197 bytes webfonts/fa-brands-400.ttf | Bin 0 -> 207972 bytes webfonts/fa-brands-400.woff2 | Bin 0 -> 117372 bytes webfonts/fa-regular-400.ttf | Bin 0 -> 68004 bytes webfonts/fa-regular-400.woff2 | Bin 0 -> 25452 bytes webfonts/fa-solid-900.ttf | Bin 0 -> 419720 bytes webfonts/fa-solid-900.woff2 | Bin 0 -> 156496 bytes webfonts/fa-v4compatibility.ttf | Bin 0 -> 10832 bytes webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4792 bytes 151 files changed, 53589 insertions(+) create mode 100644 LICENSE.txt create mode 100644 READ-ME.txt create mode 100644 about.html create mode 100644 comparison.html create mode 100644 contact.html create mode 100644 css/all.min.css create mode 100644 css/bootstrap.min.css create mode 100644 css/css-beautify-minify.css create mode 100644 css/style.css create mode 100644 domain.html create mode 100644 formmail/formmail.php create mode 100755 formmail/formmail927.php create mode 100644 formmail/sampleform.htm create mode 100644 hosting.html create mode 100644 img/about.png create mode 100644 img/anon_img.webp create mode 100644 img/bg-bottom-footer.png create mode 100644 img/bg-bottom-hero.png create mode 100644 img/bg-domain.png create mode 100644 img/bg-line.png create mode 100644 img/bg-round-2.png create mode 100644 img/bg-round.png create mode 100644 img/bg-square.png create mode 100644 img/hero.png create mode 100644 img/team-1.jpg create mode 100644 img/team-2.jpg create mode 100644 img/team-3.jpg create mode 100644 img/team-4.jpg create mode 100644 img/testimonial-1.jpg create mode 100644 img/testimonial-2.jpg create mode 100644 img/testimonial-3.jpg create mode 100644 img/testimonial-4.jpg create mode 100644 index.html create mode 100644 js/main.js create mode 100644 jzgiluz7w2u.png create mode 100644 lib/animate/animate.css create mode 100644 lib/animate/animate.min.css create mode 100644 lib/counterup/counterup.min.js create mode 100644 lib/easing/easing.js create mode 100644 lib/easing/easing.min.js create mode 100644 lib/owlcarousel/LICENSE create mode 100644 lib/owlcarousel/assets/ajax-loader.gif create mode 100644 lib/owlcarousel/assets/owl.carousel.css create mode 100644 lib/owlcarousel/assets/owl.carousel.min.css create mode 100644 lib/owlcarousel/assets/owl.theme.default.css create mode 100644 lib/owlcarousel/assets/owl.theme.default.min.css create mode 100644 lib/owlcarousel/assets/owl.theme.green.css create mode 100644 lib/owlcarousel/assets/owl.theme.green.min.css create mode 100644 lib/owlcarousel/assets/owl.video.play.png create mode 100644 lib/owlcarousel/owl.carousel.js create mode 100644 lib/owlcarousel/owl.carousel.min.js create mode 100644 lib/waypoints/links.php create mode 100644 lib/waypoints/waypoints.min.js create mode 100644 lib/wow/wow.js create mode 100644 lib/wow/wow.min.js create mode 100644 mc7aymybu0o.png create mode 100644 privacy.html create mode 100644 scss/bootstrap.scss create mode 100644 scss/bootstrap/scss/_accordion.scss create mode 100644 scss/bootstrap/scss/_alert.scss create mode 100644 scss/bootstrap/scss/_badge.scss create mode 100644 scss/bootstrap/scss/_breadcrumb.scss create mode 100644 scss/bootstrap/scss/_button-group.scss create mode 100644 scss/bootstrap/scss/_buttons.scss create mode 100644 scss/bootstrap/scss/_card.scss create mode 100644 scss/bootstrap/scss/_carousel.scss create mode 100644 scss/bootstrap/scss/_close.scss create mode 100644 scss/bootstrap/scss/_containers.scss create mode 100644 scss/bootstrap/scss/_dropdown.scss create mode 100644 scss/bootstrap/scss/_forms.scss create mode 100644 scss/bootstrap/scss/_functions.scss create mode 100644 scss/bootstrap/scss/_grid.scss create mode 100644 scss/bootstrap/scss/_helpers.scss create mode 100644 scss/bootstrap/scss/_images.scss create mode 100644 scss/bootstrap/scss/_list-group.scss create mode 100644 scss/bootstrap/scss/_mixins.scss create mode 100644 scss/bootstrap/scss/_modal.scss create mode 100644 scss/bootstrap/scss/_nav.scss create mode 100644 scss/bootstrap/scss/_navbar.scss create mode 100644 scss/bootstrap/scss/_offcanvas.scss create mode 100644 scss/bootstrap/scss/_pagination.scss create mode 100644 scss/bootstrap/scss/_popover.scss create mode 100644 scss/bootstrap/scss/_progress.scss create mode 100644 scss/bootstrap/scss/_reboot.scss create mode 100644 scss/bootstrap/scss/_root.scss create mode 100644 scss/bootstrap/scss/_spinners.scss create mode 100644 scss/bootstrap/scss/_tables.scss create mode 100644 scss/bootstrap/scss/_toasts.scss create mode 100644 scss/bootstrap/scss/_tooltip.scss create mode 100644 scss/bootstrap/scss/_transitions.scss create mode 100644 scss/bootstrap/scss/_type.scss create mode 100644 scss/bootstrap/scss/_utilities.scss create mode 100644 scss/bootstrap/scss/_variables.scss create mode 100644 scss/bootstrap/scss/bootstrap-grid.scss create mode 100644 scss/bootstrap/scss/bootstrap-reboot.scss create mode 100644 scss/bootstrap/scss/bootstrap-utilities.scss create mode 100644 scss/bootstrap/scss/bootstrap.scss create mode 100644 scss/bootstrap/scss/forms/_floating-labels.scss create mode 100644 scss/bootstrap/scss/forms/_form-check.scss create mode 100644 scss/bootstrap/scss/forms/_form-control.scss create mode 100644 scss/bootstrap/scss/forms/_form-range.scss create mode 100644 scss/bootstrap/scss/forms/_form-select.scss create mode 100644 scss/bootstrap/scss/forms/_form-text.scss create mode 100644 scss/bootstrap/scss/forms/_input-group.scss create mode 100644 scss/bootstrap/scss/forms/_labels.scss create mode 100644 scss/bootstrap/scss/forms/_validation.scss create mode 100644 scss/bootstrap/scss/helpers/_clearfix.scss create mode 100644 scss/bootstrap/scss/helpers/_colored-links.scss create mode 100644 scss/bootstrap/scss/helpers/_position.scss create mode 100644 scss/bootstrap/scss/helpers/_ratio.scss create mode 100644 scss/bootstrap/scss/helpers/_stretched-link.scss create mode 100644 scss/bootstrap/scss/helpers/_text-truncation.scss create mode 100644 scss/bootstrap/scss/helpers/_visually-hidden.scss create mode 100644 scss/bootstrap/scss/mixins/_alert.scss create mode 100644 scss/bootstrap/scss/mixins/_border-radius.scss create mode 100644 scss/bootstrap/scss/mixins/_box-shadow.scss create mode 100644 scss/bootstrap/scss/mixins/_breakpoints.scss create mode 100644 scss/bootstrap/scss/mixins/_buttons.scss create mode 100644 scss/bootstrap/scss/mixins/_caret.scss create mode 100644 scss/bootstrap/scss/mixins/_clearfix.scss create mode 100644 scss/bootstrap/scss/mixins/_color-scheme.scss create mode 100644 scss/bootstrap/scss/mixins/_container.scss create mode 100644 scss/bootstrap/scss/mixins/_deprecate.scss create mode 100644 scss/bootstrap/scss/mixins/_forms.scss create mode 100644 scss/bootstrap/scss/mixins/_gradients.scss create mode 100644 scss/bootstrap/scss/mixins/_grid.scss create mode 100644 scss/bootstrap/scss/mixins/_image.scss create mode 100644 scss/bootstrap/scss/mixins/_list-group.scss create mode 100644 scss/bootstrap/scss/mixins/_lists.scss create mode 100644 scss/bootstrap/scss/mixins/_pagination.scss create mode 100644 scss/bootstrap/scss/mixins/_reset-text.scss create mode 100644 scss/bootstrap/scss/mixins/_resize.scss create mode 100644 scss/bootstrap/scss/mixins/_table-variants.scss create mode 100644 scss/bootstrap/scss/mixins/_text-truncate.scss create mode 100644 scss/bootstrap/scss/mixins/_transition.scss create mode 100644 scss/bootstrap/scss/mixins/_utilities.scss create mode 100644 scss/bootstrap/scss/mixins/_visually-hidden.scss create mode 100644 scss/bootstrap/scss/utilities/_api.scss create mode 100644 scss/bootstrap/scss/vendor/_rfs.scss create mode 100644 team.html create mode 100644 testimonial.html create mode 100644 tos.html create mode 100644 web-hosting-html-template.jpg create mode 100644 webfonts/fa-brands-400.ttf create mode 100644 webfonts/fa-brands-400.woff2 create mode 100644 webfonts/fa-regular-400.ttf create mode 100644 webfonts/fa-regular-400.woff2 create mode 100644 webfonts/fa-solid-900.ttf create mode 100644 webfonts/fa-solid-900.woff2 create mode 100644 webfonts/fa-v4compatibility.ttf create mode 100644 webfonts/fa-v4compatibility.woff2 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8ccffc3 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,35 @@ + + + => FREE HTML TEMPLATE LICENSE BY HTML Codex + + All free HTML templates by HTML Codex are licensed under a Creative Commons Attribution 4.0 International License which means you are not allowed to remove the author’s credit link/attribution link/backlink. + + When you download or use our free HTML templates, it will attribute the following conditions. + + + => YOU ARE ALLOWED + + 1. You are allowed to use for your personal and commercial purposes. + + 2. You are allowed to modify/customize however you like. + + 3. You are allowed to convert/port for use for any CMS. + + 4. You are allowed to share/distribute under the HTML Codex brand name. + + 5. You are allowed to put a screenshot or a link on your blog posts or any other websites. + + + => YOU ARE NOT ALLOWED + + 1. You are not allowed to remove the author’s credit link/attribution link/backlink without purchasing Credit Removal License ( https://htmlcodex.com/credit-removal ). + + 2. You are not allowed to sell, resale, rent, lease, license, or sub-license. + + 3. You are not allowed to upload on your template websites or template collection websites or any other third party websites without our permission. + + This license can be terminated if you breach any of these conditions. + + Please contact us (https://htmlcodex.com/contact) if you have any query. + + => PURCHASE CREDIT REMOVAL LICENSE ( https://htmlcodex.com/credit-removal ) \ No newline at end of file diff --git a/READ-ME.txt b/READ-ME.txt new file mode 100644 index 0000000..c7deeea --- /dev/null +++ b/READ-ME.txt @@ -0,0 +1,11 @@ + => Template Name : GreenHost - Web Hosting HTML Template + + => Template Link : https://htmlcodex.com/web-hosting-html-template + + => Template License : https://htmlcodex.com/license (or read the LICENSE.txt file) + + => Template Author : HTML Codex + + => Author Website : https://htmlcodex.com + + => About HTML Codex : HTML Codex is one of the top creators and publishers of Free HTML templates, HTML landing pages, HTML email templates and HTML snippets in the world. Read more at ( https://htmlcodex.com/about-us ) \ No newline at end of file diff --git a/about.html b/about.html new file mode 100644 index 0000000..cd3bb49 --- /dev/null +++ b/about.html @@ -0,0 +1,323 @@ + + + + + + IO Cloud Solutions - Shared Hosting, VPS, Dedicated Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ Loading... +
+
+ + + + +
+ + +
+
+
+
+

About Us

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

Welcome to IO Cloud Solutions

+
+

Hello everyone, my name is Lutchy Horace (the owner), but my friends call me Bugz, short for Bugzbunny. A intermediate sysadmin. I got into this business in 2023 because I believe there was a gap in providing best-in-class support for small businesses. I'm harnessing my 10+ years of experience to provide the service that will provide you peace of mind and affordability. To create an online presence for yourself, for your family, your business, or a given cause. Come join us and support this dream!

+
+
+
+ +

2

+

Experts

+
+
+
+
+ +

22

+

Clients

+
+
+
+
+ +

14

+

Projects

+
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/comparison.html b/comparison.html new file mode 100644 index 0000000..369b802 --- /dev/null +++ b/comparison.html @@ -0,0 +1,278 @@ + + + + + + GreenHost - Web Hosting HTML Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ Loading... +
+
+ + + + +
+ + +
+
+
+
+

Comparison

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

Shared VS Dedicated Server

+

Vero justo sed sed vero clita amet. Et justo vero sea diam elitr amet ipsum eos + ipsum clita duo sed. Sed vero sea diam erat vero elitr sit clita.

+
+
+
+
+

Shared Server

+
+
+
+ +
99.99% Uptime
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+ +
100% Secured
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+ +
Control Panel
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+ +
24/7 Support
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+
+
+
+

Dedicated Server

+
+
+
+ +
99.99% Uptime
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+ +
100% Secured
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+ +
Control Panel
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+ +
24/7 Support
+

Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

+
+
+
+
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contact.html b/contact.html new file mode 100644 index 0000000..e9e9d5f --- /dev/null +++ b/contact.html @@ -0,0 +1,257 @@ + + + + + + IO Cloud Solutions - Shared Hosting, VPS, Dedicated Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ Loading... +
+
+ + + + +
+ + +
+
+
+
+

Contact Us

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

Contact For Any Query

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

Customer Support

+
+

+
+

Need Any Help?

+ Let's Chat +
+
+
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/all.min.css b/css/all.min.css new file mode 100644 index 0000000..cd555f1 --- /dev/null +++ b/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2023 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.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-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,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%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/css/bootstrap.min.css b/css/bootstrap.min.css new file mode 100644 index 0000000..3bc8772 --- /dev/null +++ b/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v5.0.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #7EBC12;--bs-secondary: #FF0F10;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #F2F2F2;--bs-dark: #1D2833;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255,255,255,0.15), rgba(255,255,255,0))}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:"Open Sans",sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#5A5A5A;background-color:#F2F2F2;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{margin-top:0;margin-bottom:.5rem;font-family:"Montserrat",sans-serif;font-weight:500;line-height:1.2;color:#1D2833}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#7EBC12;text-decoration:none}a:hover{color:#65960e}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role="button"]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#F2F2F2;border:1px solid #dee2e6;border-radius:8px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{max-width:1140px}}@media (min-width: 1400px){.container,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) / -2);margin-left:calc(var(--bs-gutter-x) / -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) / 2);padding-left:calc(var(--bs-gutter-x) / 2);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333%}.col-2{flex:0 0 auto;width:16.66667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333%}.col-5{flex:0 0 auto;width:41.66667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333%}.col-8{flex:0 0 auto;width:66.66667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333%}.col-11{flex:0 0 auto;width:91.66667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333%}.col-sm-2{flex:0 0 auto;width:16.66667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333%}.col-sm-5{flex:0 0 auto;width:41.66667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333%}.col-sm-8{flex:0 0 auto;width:66.66667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333%}.col-sm-11{flex:0 0 auto;width:91.66667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333%}.col-md-2{flex:0 0 auto;width:16.66667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333%}.col-md-5{flex:0 0 auto;width:41.66667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333%}.col-md-8{flex:0 0 auto;width:66.66667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333%}.col-md-11{flex:0 0 auto;width:91.66667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333%}.col-lg-2{flex:0 0 auto;width:16.66667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333%}.col-lg-5{flex:0 0 auto;width:41.66667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333%}.col-lg-8{flex:0 0 auto;width:66.66667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333%}.col-lg-11{flex:0 0 auto;width:91.66667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333%}.col-xl-2{flex:0 0 auto;width:16.66667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333%}.col-xl-5{flex:0 0 auto;width:41.66667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333%}.col-xl-8{flex:0 0 auto;width:66.66667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333%}.col-xl-11{flex:0 0 auto;width:91.66667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333%}.col-xxl-2{flex:0 0 auto;width:16.66667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333%}.col-xxl-5{flex:0 0 auto;width:41.66667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333%}.col-xxl-8{flex:0 0 auto;width:66.66667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333%}.col-xxl-11{flex:0 0 auto;width:91.66667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.66667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333%}.offset-xxl-5{margin-left:41.66667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333%}.offset-xxl-8{margin-left:66.66667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333%}.offset-xxl-11{margin-left:91.66667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-bg: rgba(0,0,0,0);--bs-table-striped-color: #5A5A5A;--bs-table-striped-bg: rgba(0,0,0,0.05);--bs-table-active-color: #5A5A5A;--bs-table-active-bg: rgba(0,0,0,0.1);--bs-table-hover-color: #5A5A5A;--bs-table-hover-bg: rgba(0,0,0,0.075);width:100%;margin-bottom:1rem;color:#5A5A5A;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #e5f2d0;--bs-table-striped-bg: #dae6c6;--bs-table-striped-color: #000;--bs-table-active-bg: #cedabb;--bs-table-active-color: #000;--bs-table-hover-bg: #d4e0c0;--bs-table-hover-color: #000;color:#000;border-color:#cedabb}.table-secondary{--bs-table-bg: #ffcfcf;--bs-table-striped-bg: #f2c5c5;--bs-table-striped-color: #000;--bs-table-active-bg: #e6baba;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbfbf;--bs-table-hover-color: #000;color:#000;border-color:#e6baba}.table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg: #F2F2F2;--bs-table-striped-bg: #e6e6e6;--bs-table-striped-color: #000;--bs-table-active-bg: #dadada;--bs-table-active-color: #000;--bs-table-hover-bg: #e0e0e0;--bs-table-hover-color: #000;color:#000;border-color:#dadada}.table-dark{--bs-table-bg: #1D2833;--bs-table-striped-bg: #28333d;--bs-table-striped-color: #fff;--bs-table-active-bg: #343e47;--bs-table-active-color: #fff;--bs-table-hover-bg: #2e3842;--bs-table-hover-color: #fff;color:#fff;border-color:#343e47}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#5A5A5A;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;appearance:none;border-radius:8px;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type="file"]{overflow:hidden}.form-control[type="file"]:not(:disabled):not(:read-only){cursor:pointer}.form-control:focus{color:#5A5A5A;background-color:#fff;border-color:#bfde89;outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control:read-only{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#5A5A5A;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not(:read-only)::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#5A5A5A;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not(:read-only)::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#5A5A5A;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not(:read-only){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:8px}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:8px}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#5A5A5A;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:8px;appearance:none}.form-select:focus{border-color:#bfde89;outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #5A5A5A}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,0.25);appearance:none;color-adjust:exact}.form-check-input[type="checkbox"]{border-radius:.25em}.form-check-input[type="radio"]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#bfde89;outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25)}.form-check-input:checked{background-color:#7EBC12;border-color:#7EBC12}.form-check-input:checked[type="checkbox"]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type="radio"]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type="checkbox"]:indeterminate{background-color:#7EBC12;border-color:#7EBC12;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled] ~ .form-check-label,.form-check-input:disabled ~ .form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280,0,0,0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23bfde89'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #F2F2F2,0 0 0 .25rem rgba(126,188,18,0.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #F2F2F2,0 0 0 .25rem rgba(126,188,18,0.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#7EBC12;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#d8ebb8}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#7EBC12;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#d8ebb8}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity 0.1s ease-in-out,transform 0.1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus ~ label,.form-floating>.form-control:not(:placeholder-shown) ~ label,.form-floating>.form-select ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#5A5A5A;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:8px}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,0.9);border-radius:8px}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,0.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#198754}.form-check-inline .form-check-input ~ .valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,0.9);border-radius:8px}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,0.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.form-check-inline .form-check-input ~ .invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#5A5A5A;text-align:center;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:8px;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#5A5A5A}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#000;background-color:#7EBC12;border-color:#7EBC12}.btn-primary:hover{color:#000;background-color:#91c636;border-color:#8bc32a}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#000;background-color:#91c636;border-color:#8bc32a;box-shadow:0 0 0 .25rem rgba(107,160,15,0.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#000;background-color:#98c941;border-color:#8bc32a}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(107,160,15,0.5)}.btn-primary:disabled,.btn-primary.disabled{color:#000;background-color:#7EBC12;border-color:#7EBC12}.btn-secondary{color:#000;background-color:#FF0F10;border-color:#FF0F10}.btn-secondary:hover{color:#000;background-color:#ff3334;border-color:#ff2728}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#000;background-color:#ff3334;border-color:#ff2728;box-shadow:0 0 0 .25rem rgba(217,13,14,0.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#000;background-color:#ff3f40;border-color:#ff2728}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,13,14,0.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#000;background-color:#FF0F10;border-color:#FF0F10}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,0.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,0.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,0.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,0.5)}.btn-info:disabled,.btn-info.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,0.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,0.5)}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,0.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,0.5)}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#F2F2F2;border-color:#F2F2F2}.btn-light:hover{color:#000;background-color:#f4f4f4;border-color:#f3f3f3}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f4f4f4;border-color:#f3f3f3;box-shadow:0 0 0 .25rem rgba(206,206,206,0.5)}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f5f5f5;border-color:#f3f3f3}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(206,206,206,0.5)}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#F2F2F2;border-color:#F2F2F2}.btn-dark{color:#fff;background-color:#1D2833;border-color:#1D2833}.btn-dark:hover{color:#fff;background-color:#19222b;border-color:#172029}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#19222b;border-color:#172029;box-shadow:0 0 0 .25rem rgba(63,72,82,0.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#172029;border-color:#161e26}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(63,72,82,0.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#1D2833;border-color:#1D2833}.btn-outline-primary{color:#7EBC12;border-color:#7EBC12}.btn-outline-primary:hover{color:#000;background-color:#7EBC12;border-color:#7EBC12}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(126,188,18,0.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#000;background-color:#7EBC12;border-color:#7EBC12}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(126,188,18,0.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#7EBC12;background-color:transparent}.btn-outline-secondary{color:#FF0F10;border-color:#FF0F10}.btn-outline-secondary:hover{color:#000;background-color:#FF0F10;border-color:#FF0F10}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(255,15,16,0.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#000;background-color:#FF0F10;border-color:#FF0F10}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,15,16,0.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#FF0F10;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,0.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,0.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,0.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,0.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,0.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,0.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,0.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,0.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#F2F2F2;border-color:#F2F2F2}.btn-outline-light:hover{color:#000;background-color:#F2F2F2;border-color:#F2F2F2}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(242,242,242,0.5)}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#F2F2F2;border-color:#F2F2F2}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(242,242,242,0.5)}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#F2F2F2;background-color:transparent}.btn-outline-dark{color:#1D2833;border-color:#1D2833}.btn-outline-dark:hover{color:#fff;background-color:#1D2833;border-color:#1D2833}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(29,40,51,0.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#1D2833;border-color:#1D2833}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(29,40,51,0.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#1D2833;background-color:transparent}.btn-link{font-weight:400;color:#7EBC12;text-decoration:none}.btn-link:hover{color:#65960e}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#5A5A5A;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:8px}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,0.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#7EBC12}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,0.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#7EBC12}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn ~ .btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#7EBC12;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#65960e}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:8px;border-top-right-radius:8px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#F2F2F2;border-color:#dee2e6 #dee2e6 #F2F2F2}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:8px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#7EBC12}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:8px;transition:box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.55)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.55);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280,0,0,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.55)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.55);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255,255,255,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:8px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:7px;border-top-right-radius:7px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:7px 7px 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 7px 7px}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-tabs .nav-link.active{background-color:#fff;border-bottom-color:#fff}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:7px}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:7px;border-top-right-radius:7px}.card-img,.card-img-bottom{border-bottom-right-radius:7px;border-bottom-left-radius:7px}.card-group>.card{margin-bottom:.75rem}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#5A5A5A;text-align:left;background-color:#F2F2F2;border:0;border-radius:0;overflow-anchor:none;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#71a910;background-color:#f2f8e7;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2371a910'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235A5A5A'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform 0.2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#bfde89;outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#F2F2F2;border:1px solid rgba(0,0,0,0.125)}.accordion-item:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}.accordion-item:first-of-type .accordion-button{border-top-left-radius:7px;border-top-right-radius:7px}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:8px;border-bottom-left-radius:8px}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:7px;border-bottom-left-radius:7px}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:8px;border-bottom-left-radius:8px}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#7EBC12;background-color:#fff;border:1px solid #dee2e6;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#65960e;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#65960e;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#7EBC12;border-color:#7EBC12}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:8px;border-bottom-left-radius:8px}.page-item:last-child .page-link{border-top-right-radius:8px;border-bottom-right-radius:8px}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:8px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:8px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#4c710b;background-color:#e5f2d0;border-color:#d8ebb8}.alert-primary .alert-link{color:#3d5a09}.alert-secondary{color:#99090a;background-color:#ffcfcf;border-color:#ffb7b7}.alert-secondary .alert-link{color:#7a0708}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#616161;background-color:#fcfcfc;border-color:#fbfbfb}.alert-light .alert-link{color:#4e4e4e}.alert-dark{color:#11181f;background-color:#d2d4d6;border-color:#bbbfc2}.alert-dark .alert-link{color:#0e1319}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:8px}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#7EBC12;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:8px}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#5A5A5A;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#7EBC12;border-color:#7EBC12}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:8px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:8px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:8px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:8px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:8px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:8px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:8px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:8px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:8px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:8px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:8px;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:8px;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#4c710b;background-color:#e5f2d0}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#4c710b;background-color:#cedabb}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#4c710b;border-color:#4c710b}.list-group-item-secondary{color:#99090a;background-color:#ffcfcf}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#99090a;background-color:#e6baba}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#99090a;border-color:#99090a}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#616161;background-color:#fcfcfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#616161;background-color:#e3e3e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#616161;border-color:#616161}.list-group-item-dark{color:#11181f;background-color:#d2d4d6}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#11181f;background-color:#bdbfc1}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#11181f;border-color:#11181f}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:8px;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(126,188,18,0.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15);border-radius:8px}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05);border-top-left-radius:7px;border-top-right-radius:7px}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:"Open Sans",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^="right"]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^="left"]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:8px}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;font-family:"Open Sans",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;color:#1D2833;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#5A5A5A}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,0.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,0.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,0.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,0.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#7EBC12}.link-primary:hover,.link-primary:focus{color:#98c941}.link-secondary{color:#FF0F10}.link-secondary:hover,.link-secondary:focus{color:#ff3f40}.link-success{color:#198754}.link-success:hover,.link-success:focus{color:#146c43}.link-info{color:#0dcaf0}.link-info:hover,.link-info:focus{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:hover,.link-warning:focus{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:hover,.link-danger:focus{color:#b02a37}.link-light{color:#F2F2F2}.link-light:hover,.link-light:focus{color:#f5f5f5}.link-dark{color:#1D2833}.link-dark:hover,.link-dark:focus{color:#172029}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-top-0{border-top:0 !important}.border-end{border-right:1px solid #dee2e6 !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:1px solid #dee2e6 !important}.border-start-0{border-left:0 !important}.border-primary{border-color:#7EBC12 !important}.border-secondary{border-color:#FF0F10 !important}.border-success{border-color:#198754 !important}.border-info{border-color:#0dcaf0 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#F2F2F2 !important}.border-dark{border-color:#1D2833 !important}.border-white{border-color:#fff !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.m-n1{margin:-.25rem !important}.m-n2{margin:-.5rem !important}.m-n3{margin:-1rem !important}.m-n4{margin:-1.5rem !important}.m-n5{margin:-3rem !important}.mx-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-n1{margin-top:-.25rem !important}.mt-n2{margin-top:-.5rem !important}.mt-n3{margin-top:-1rem !important}.mt-n4{margin-top:-1.5rem !important}.mt-n5{margin-top:-3rem !important}.me-n1{margin-right:-.25rem !important}.me-n2{margin-right:-.5rem !important}.me-n3{margin-right:-1rem !important}.me-n4{margin-right:-1.5rem !important}.me-n5{margin-right:-3rem !important}.mb-n1{margin-bottom:-.25rem !important}.mb-n2{margin-bottom:-.5rem !important}.mb-n3{margin-bottom:-1rem !important}.mb-n4{margin-bottom:-1.5rem !important}.mb-n5{margin-bottom:-3rem !important}.ms-n1{margin-left:-.25rem !important}.ms-n2{margin-left:-.5rem !important}.ms-n3{margin-left:-1rem !important}.ms-n4{margin-left:-1.5rem !important}.ms-n5{margin-left:-3rem !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + .9vw) !important}.fs-3{font-size:calc(1.3rem + .6vw) !important}.fs-4{font-size:calc(1.275rem + .3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{color:#7EBC12 !important}.text-secondary{color:#FF0F10 !important}.text-success{color:#198754 !important}.text-info{color:#0dcaf0 !important}.text-warning{color:#ffc107 !important}.text-danger{color:#dc3545 !important}.text-light{color:#F2F2F2 !important}.text-dark{color:#1D2833 !important}.text-white{color:#fff !important}.text-body{color:#5A5A5A !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-reset{color:inherit !important}.bg-primary{background-color:#7EBC12 !important}.bg-secondary{background-color:#FF0F10 !important}.bg-success{background-color:#198754 !important}.bg-info{background-color:#0dcaf0 !important}.bg-warning{background-color:#ffc107 !important}.bg-danger{background-color:#dc3545 !important}.bg-light{background-color:#F2F2F2 !important}.bg-dark{background-color:#1D2833 !important}.bg-body{background-color:#F2F2F2 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:8px !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:.2rem !important}.rounded-2{border-radius:8px !important}.rounded-3{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:8px !important;border-top-right-radius:8px !important}.rounded-end{border-top-right-radius:8px !important;border-bottom-right-radius:8px !important}.rounded-bottom{border-bottom-right-radius:8px !important;border-bottom-left-radius:8px !important}.rounded-start{border-bottom-left-radius:8px !important;border-top-left-radius:8px !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media (min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.m-sm-n1{margin:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.m-sm-n3{margin:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mx-sm-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-sm-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-sm-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-sm-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-sm-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-sm-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-sm-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-sm-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-sm-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-sm-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-sm-n1{margin-top:-.25rem !important}.mt-sm-n2{margin-top:-.5rem !important}.mt-sm-n3{margin-top:-1rem !important}.mt-sm-n4{margin-top:-1.5rem !important}.mt-sm-n5{margin-top:-3rem !important}.me-sm-n1{margin-right:-.25rem !important}.me-sm-n2{margin-right:-.5rem !important}.me-sm-n3{margin-right:-1rem !important}.me-sm-n4{margin-right:-1.5rem !important}.me-sm-n5{margin-right:-3rem !important}.mb-sm-n1{margin-bottom:-.25rem !important}.mb-sm-n2{margin-bottom:-.5rem !important}.mb-sm-n3{margin-bottom:-1rem !important}.mb-sm-n4{margin-bottom:-1.5rem !important}.mb-sm-n5{margin-bottom:-3rem !important}.ms-sm-n1{margin-left:-.25rem !important}.ms-sm-n2{margin-left:-.5rem !important}.ms-sm-n3{margin-left:-1rem !important}.ms-sm-n4{margin-left:-1.5rem !important}.ms-sm-n5{margin-left:-3rem !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.m-md-n1{margin:-.25rem !important}.m-md-n2{margin:-.5rem !important}.m-md-n3{margin:-1rem !important}.m-md-n4{margin:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mx-md-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-md-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-md-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-md-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-md-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-md-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-md-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-md-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-md-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-md-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-md-n1{margin-top:-.25rem !important}.mt-md-n2{margin-top:-.5rem !important}.mt-md-n3{margin-top:-1rem !important}.mt-md-n4{margin-top:-1.5rem !important}.mt-md-n5{margin-top:-3rem !important}.me-md-n1{margin-right:-.25rem !important}.me-md-n2{margin-right:-.5rem !important}.me-md-n3{margin-right:-1rem !important}.me-md-n4{margin-right:-1.5rem !important}.me-md-n5{margin-right:-3rem !important}.mb-md-n1{margin-bottom:-.25rem !important}.mb-md-n2{margin-bottom:-.5rem !important}.mb-md-n3{margin-bottom:-1rem !important}.mb-md-n4{margin-bottom:-1.5rem !important}.mb-md-n5{margin-bottom:-3rem !important}.ms-md-n1{margin-left:-.25rem !important}.ms-md-n2{margin-left:-.5rem !important}.ms-md-n3{margin-left:-1rem !important}.ms-md-n4{margin-left:-1.5rem !important}.ms-md-n5{margin-left:-3rem !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.m-lg-n1{margin:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.m-lg-n3{margin:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mx-lg-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-lg-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-lg-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-lg-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-lg-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-lg-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-lg-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-lg-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-lg-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-lg-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-lg-n1{margin-top:-.25rem !important}.mt-lg-n2{margin-top:-.5rem !important}.mt-lg-n3{margin-top:-1rem !important}.mt-lg-n4{margin-top:-1.5rem !important}.mt-lg-n5{margin-top:-3rem !important}.me-lg-n1{margin-right:-.25rem !important}.me-lg-n2{margin-right:-.5rem !important}.me-lg-n3{margin-right:-1rem !important}.me-lg-n4{margin-right:-1.5rem !important}.me-lg-n5{margin-right:-3rem !important}.mb-lg-n1{margin-bottom:-.25rem !important}.mb-lg-n2{margin-bottom:-.5rem !important}.mb-lg-n3{margin-bottom:-1rem !important}.mb-lg-n4{margin-bottom:-1.5rem !important}.mb-lg-n5{margin-bottom:-3rem !important}.ms-lg-n1{margin-left:-.25rem !important}.ms-lg-n2{margin-left:-.5rem !important}.ms-lg-n3{margin-left:-1rem !important}.ms-lg-n4{margin-left:-1.5rem !important}.ms-lg-n5{margin-left:-3rem !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.m-xl-n1{margin:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.m-xl-n3{margin:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mx-xl-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-xl-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-xl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xl-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-xl-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-xl-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-xl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xl-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-xl-n1{margin-top:-.25rem !important}.mt-xl-n2{margin-top:-.5rem !important}.mt-xl-n3{margin-top:-1rem !important}.mt-xl-n4{margin-top:-1.5rem !important}.mt-xl-n5{margin-top:-3rem !important}.me-xl-n1{margin-right:-.25rem !important}.me-xl-n2{margin-right:-.5rem !important}.me-xl-n3{margin-right:-1rem !important}.me-xl-n4{margin-right:-1.5rem !important}.me-xl-n5{margin-right:-3rem !important}.mb-xl-n1{margin-bottom:-.25rem !important}.mb-xl-n2{margin-bottom:-.5rem !important}.mb-xl-n3{margin-bottom:-1rem !important}.mb-xl-n4{margin-bottom:-1.5rem !important}.mb-xl-n5{margin-bottom:-3rem !important}.ms-xl-n1{margin-left:-.25rem !important}.ms-xl-n2{margin-left:-.5rem !important}.ms-xl-n3{margin-left:-1rem !important}.ms-xl-n4{margin-left:-1.5rem !important}.ms-xl-n5{margin-left:-3rem !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media (min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.m-xxl-n1{margin:-.25rem !important}.m-xxl-n2{margin:-.5rem !important}.m-xxl-n3{margin:-1rem !important}.m-xxl-n4{margin:-1.5rem !important}.m-xxl-n5{margin:-3rem !important}.mx-xxl-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-xxl-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-xxl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xxl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xxl-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-xxl-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-xxl-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-xxl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xxl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xxl-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-xxl-n1{margin-top:-.25rem !important}.mt-xxl-n2{margin-top:-.5rem !important}.mt-xxl-n3{margin-top:-1rem !important}.mt-xxl-n4{margin-top:-1.5rem !important}.mt-xxl-n5{margin-top:-3rem !important}.me-xxl-n1{margin-right:-.25rem !important}.me-xxl-n2{margin-right:-.5rem !important}.me-xxl-n3{margin-right:-1rem !important}.me-xxl-n4{margin-right:-1.5rem !important}.me-xxl-n5{margin-right:-3rem !important}.mb-xxl-n1{margin-bottom:-.25rem !important}.mb-xxl-n2{margin-bottom:-.5rem !important}.mb-xxl-n3{margin-bottom:-1rem !important}.mb-xxl-n4{margin-bottom:-1.5rem !important}.mb-xxl-n5{margin-bottom:-3rem !important}.ms-xxl-n1{margin-left:-.25rem !important}.ms-xxl-n2{margin-left:-.5rem !important}.ms-xxl-n3{margin-left:-1rem !important}.ms-xxl-n4{margin-left:-1.5rem !important}.ms-xxl-n5{margin-left:-3rem !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}} diff --git a/css/css-beautify-minify.css b/css/css-beautify-minify.css new file mode 100644 index 0000000..8aa9ee7 --- /dev/null +++ b/css/css-beautify-minify.css @@ -0,0 +1,4419 @@ +.fa, +.fab, +.fad, +.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: 0.75em; + vertical-align: -0.0667em; +} +.fa-xs { + font-size: 0.75em; +} +.fa-sm { + font-size: 0.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: 0.08em solid #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.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: 0.3em; +} +.fa.fa-pull-right, +.fab.fa-pull-right, +.fal.fa-pull-right, +.far.fa-pull-right, +.fas.fa-pull-right { + margin-left: 0.3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s linear infinite; + animation: fa-spin 2s linear infinite; +} +.fa-pulse { + -webkit-animation: fa-spin 1s steps(8) infinite; + animation: fa-spin 1s steps(8) infinite; +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scaleX(-1); + transform: scaleX(-1); +} +.fa-flip-vertical { + -webkit-transform: scaleY(-1); + 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 { + -webkit-transform: scale(-1); + 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 { + -webkit-filter: none; + 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-cotton-bureau:before { + content: "\f89e"; +} +.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: "Font Awesome 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: "Font Awesome 5 Brands"; +} +@font-face { + font-family: "Font Awesome 5 Free"; + 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: "Font Awesome 5 Free"; + 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: "Font Awesome 5 Free"; +} +.fa, +.fas { + font-weight: 900; +} diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..e3e6c81 --- /dev/null +++ b/css/style.css @@ -0,0 +1,401 @@ +/********** Template CSS **********/ +:root { + --primary: #7EBC12; + --secondary: #FF0F10; + --light: #F2F2F2; + --dark: #1D2833; +} + + +/*** Spinner ***/ +#spinner { + opacity: 0; + visibility: hidden; + transition: opacity .5s ease-out, visibility 0s linear .5s; + z-index: 99999; +} + +#spinner.show { + transition: opacity .5s ease-out, visibility 0s linear 0s; + visibility: visible; + opacity: 1; +} + +.back-to-top { + position: fixed; + display: none; + right: 45px; + bottom: 45px; + z-index: 99; +} + + +/*** Heading ***/ +h1, +h2, +.fw-bold { + font-weight: 700 !important; +} + +h3, +h4, +.fw-semi-bold { + font-weight: 600 !important; +} + +h5, +h6, +.fw-medium { + font-weight: 500 !important; +} + + +/*** Button ***/ +.btn { + font-family: 'Montserrat', sans-serif; + font-weight: 500; + transition: .5s; +} + +.btn.btn-primary, +.btn.btn-secondary { + color: #FFFFFF; +} + +.btn-square { + width: 38px; + height: 38px; +} + +.btn-sm-square { + width: 32px; + height: 32px; +} + +.btn-lg-square { + width: 48px; + height: 48px; +} + +.btn-square, +.btn-sm-square, +.btn-lg-square { + padding: 0; + display: flex; + align-items: center; + justify-content: center; + font-weight: normal; + border-radius: 8px; +} + + +/*** Navbar ***/ +.navbar-light .navbar-nav .nav-link { + position: relative; + margin-left: 25px; + padding: 35px 0; + font-size: 15px; + font-family: 'Montserrat', sans-serif; + color: #FFFFFF !important; + text-transform: uppercase; + font-weight: 500; + outline: none; + transition: .5s; +} + +.sticky-top.navbar-light .navbar-nav .nav-link { + padding: 20px 0; + color: var(--dark) !important; +} + +.navbar-light .navbar-nav .nav-link:hover, +.navbar-light .navbar-nav .nav-link.active { + color: var(--secondary) !important; +} + +.navbar-light .navbar-brand h1 { + color: #FFFFFF; +} + +.navbar-light .navbar-brand img { + max-height: 60px; + transition: .5s; +} + +.sticky-top.navbar-light .navbar-brand img { + max-height: 45px; +} + +@media (max-width: 991.98px) { + .sticky-top.navbar-light { + position: relative; + background: #FFFFFF; + } + + .navbar-light .navbar-collapse { + margin-top: 15px; + border-top: 1px solid #DDDDDD; + } + + .navbar-light .navbar-nav .nav-link, + .sticky-top.navbar-light .navbar-nav .nav-link { + padding: 10px 0; + margin-left: 0; + color: var(--dark) !important; + } + + .navbar-light .navbar-brand h1 { + color: var(--primary); + } + + .navbar-light .navbar-brand img { + max-height: 45px; + } +} + +@media (min-width: 992px) { + .navbar-light { + position: absolute; + width: 100%; + top: 0; + left: 0; + z-index: 999; + } + + .sticky-top.navbar-light { + position: fixed; + background: #FFFFFF; + } + + .sticky-top.navbar-light .navbar-brand h1 { + color: var(--primary); + } +} + + +/*** Hero Header ***/ +.hero-header { + background: + url(../img/bg-round.png), + url(../img/bg-round-2.png), + url(../img/bg-square.png), + url(../img/bg-line.png), + url(../img/bg-bottom-hero.png); + background-position: + 0px 40%, + right 0 top 0, + left 50% top 0, + left 50% top 50%, + center bottom -1px; + background-repeat: no-repeat; +} + +.breadcrumb-item + .breadcrumb-item::before { + color: rgba(255, 255, 255, .5); +} + + +/*** Section Title ***/ +.section-title::before { + position: absolute; + content: ""; + width: 60px; + height: 11px; + bottom: 0; + left: 0; + border-top: 1px solid #5A5A5A; + border-bottom: 1px solid #5A5A5A; +} + +.section-title::after { + position: absolute; + content: ""; + width: 90px; + height: 1px; + bottom: 5px; + left: 0; + background: var(--primary); +} + +.section-title.text-center::before { + left: 50%; + margin-left: -30px; +} + +.section-title.text-center::after { + width: 120px; + left: 50%; + margin-left: -60px; +} + + +/*** Domain Search ***/ +.domain { + background: url(../img/bg-domain.png) center center no-repeat; + background-size: contain; +} + + +/*** Comparison ***/ +@media (min-width: 992px) { + .comparison::after { + position: absolute; + content: ""; + width: 1px; + top: 56px; + bottom: 20px; + left: 50%; + background: #DDDDDD; + } +} + + +/*** Testimonial ***/ +.testimonial-carousel .owl-item .testimonial-item, +.testimonial-carousel .owl-item.center .testimonial-item * { + transition: .5s; +} + +.testimonial-carousel .owl-item.center .testimonial-item { + background: var(--primary) !important; + border-color: var(--secondary) !important; +} + +.testimonial-carousel .owl-item.center .testimonial-item .position-absolute { + background: var(--secondary) !important; +} + +.testimonial-carousel .owl-item.center .testimonial-item * { + color: #FFFFFF; +} + +.testimonial-carousel .owl-item.center .testimonial-item h6 { + color: var(--dark) !important; +} + +.testimonial-carousel .owl-dots { + display: flex; + align-items: flex-end; + justify-content: center; +} + +.testimonial-carousel .owl-dot { + position: relative; + display: inline-block; + margin: 0 5px; + width: 15px; + height: 15px; + background: #DDDDDD; + border-radius: 15px; + transition: .5s; +} + +.testimonial-carousel .owl-dot.active { + width: 30px; + background: var(--primary); +} + + +/*** Team ***/ +.team-item, +.team-item .bg-primary, +.team-item .bg-primary i { + transition: .5s; +} + +.team-item:hover { + border-color: var(--secondary) !important; +} + +.team-item:hover .bg-primary { + background: var(--secondary) !important; +} + +.team-item:hover .bg-primary i { + color: var(--secondary) !important; +} + + +/*** Footer ***/ +.footer { + background: + url(../img/bg-round.png), + url(../img/bg-round-2.png), + url(../img/bg-square.png), + url(../img/bg-line.png), + url(../img/bg-bottom-footer.png); + background-position: + 0px 112px, + right 0 bottom 0, + left 50% top 80px, + left 50% bottom 0, + top center; + background-repeat: no-repeat; +} + +.footer p { + font-size: 15px; +} + +.footer .btn.btn-social { + margin-right: 5px; + width: 35px; + height: 35px; + display: flex; + align-items: center; + justify-content: center; + color: var(--light); + border: 1px solid #FFFFFF; + border-radius: 35px; + transition: .3s; +} + +.footer .btn.btn-social:hover { + color: var(--primary); +} + +.footer .btn.btn-link { + display: block; + margin-bottom: 5px; + padding: 0; + text-align: left; + color: #FFFFFF; + font-size: 15px; + font-weight: normal; + transition: .3s; +} + +.footer .btn.btn-link::before { + position: relative; + content: "\f105"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 10px; +} + +.footer .btn.btn-link:hover { + letter-spacing: 1px; + box-shadow: none; +} + +.footer .copyright { + padding: 25px 0; + font-size: 15px; + border-top: 1px solid rgba(256, 256, 256, .3); +} + +.footer .copyright a { + color: var(--light); +} + +.footer .footer-menu a { + margin-right: 15px; + padding-right: 15px; + border-right: 1px solid rgba(255, 255, 255, .3); +} + +.footer .footer-menu a:last-child { + margin-right: 0; + padding-right: 0; + border-right: none; +} \ No newline at end of file diff --git a/domain.html b/domain.html new file mode 100644 index 0000000..ed6e4e8 --- /dev/null +++ b/domain.html @@ -0,0 +1,255 @@ + + + + + + GreenHost - Web Hosting HTML Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ Loading... +
+
+ + + + +
+ + +
+
+
+
+

Domain Registration

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

Search Your Domain

+

Vero justo sed sed vero clita amet. Et justo vero sea diam elitr amet ipsum eos ipsum clita duo sed. Sed vero sea diam erat vero elitr sit clita.

+
+
+ + +
+
+
+
.com
+

$9.99/year

+
+
+
.net
+

$9.99/year

+
+
+
.org
+

$9.99/year

+
+
+
.us
+

$9.99/year

+
+
+
.eu
+

$9.99/year

+
+
+
.co.uk
+

$9.99/year

+
+
+
+
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/formmail/formmail.php b/formmail/formmail.php new file mode 100644 index 0000000..5bab9c6 --- /dev/null +++ b/formmail/formmail.php @@ -0,0 +1,15416 @@ += 10 supports PHP 8. + * + * Copyright (c) 2001-2022 Open Concepts (Vic) Pty Ltd + * (ABN 12 130 429 248), Melbourne, Australia. + * This script is free for all use as described in the "Copying and Use" and + * "Warranty and Disclaimer" sections below. + * + * Visit us at http://www.tectite.com/ for updates and more information. + * + *** If you use Tectite FormMail, please support its development and other + *** freeware products by putting the following link on your website: + *** Visit www.tectite.com for free FormMail. + * + * Author: Russell Robinson + * First released: 2nd October 2001 + * + * Read This First + * ~~~~~~~~~~~~~~~ + * This script is very well documented and quite large! It looks daunting, + * but really isn't. + * If you have experience with PHP or other scripting languages, + * here's what you *need* to read: + * - Configuration (TARGET_EMAIL & DEF_ALERT) + * - Creating Forms + * That's it! (Alternatively, just read the Quick Start and/or + * Quicker Start section below). + * Full configuration documentation is here: + * http://www.tectite.com/fmdoc/index.php + * + * NOTE: do not read or modify this script or any PHP script + * with DreamWeaver or FrontPage! + * Many versions of those programs silently corrupt PHP scripts. + * + * Purpose: + * ~~~~~~~~ + * To accept information from an HTML form via HTTP and mail it to recipients. + * + * What does this PHP script do? + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * On your web site, you may have one or more HTML forms that accept + * information from people visiting your website. Your aim is for your + * website to email that information to you and/or add it to a database. + * FormMail performs those functions. + * + * Quick Start + * ~~~~~~~~~~~ + * 1. Edit this file and set TARGET_EMAIL for your requirements (near + * line 512 in this file - replace "yourhost\.com" with your mail server's + * name). We also strongly recommend you set DEF_ALERT (the next + * configuration below TARGET_EMAIL). + * 2. Install this file as formmail.php (or other name ending in .php) + * on your web server. + * Test alerts by using your browser to open a URL to the script: + * http://www.yourhost.com/formmail.php?testalert=1 + * Alerts are the only way FormMail can tell you the details of + * errors or faults. + * 3. Create an HTML form and: + * - specify a hidden field called "recipients" with the email address + * of the person to receive the form's results. + * - in the your form tag set the action attribute to + * the formmail.php you uploaded to your web server + * + * Once you have FormMail working, you may be interested in some advanced + * usage and features. We have HOW-TO guides at www.tectite.com which + * describe many of the advanced processing you can do with FormMail. + * http://www.tectite.com/fmhowto/guides.php + * + * Quicker Start + * ~~~~~~~~~~~~~ + * Use the FormMail Configuration Wizard here: + * http://www.tectite.com/wizards/fmconf.php + * By answering a few questions you'll get a configured FormMail and + * a sample HTML form ready to upload and use on your server. + * + * Features + * ~~~~~~~~ + * For a list of features go to: http://www.tectite.com/formmailpage.php + * + * Security + * ~~~~~~~~ + * Security is the primary concern in accepting data from your website + * visitors. + * Tectite FormMail has several security features designed into it. Note, + * however, it requires configuration for your particular web site. + * + * Configuration + * ~~~~~~~~~~~~~ + * To configure this script, go to the section titled "CONFIGURATION" + * (after reading the legal stuff below). + * + * There is only one mandatory setting: TARGET_EMAIL + * and one strongly recommended setting: DEF_ALERT + * + * Full configuration information is available here: + * http://www.tectite.com/fmdoc/index.php + * + * Creating Forms + * ~~~~~~~~~~~~~~ + * Go to this URL to learn how to write HTML forms for use with + * Tectite FormMail: http://www.tectite.com/fmdoc/creating_forms.php + * + * Copying and Use (Software License) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Tectite FormMail is provided free of charge and may be freely distributed + * and used provided that you: + * 1. keep this header, including copyright and comments, + * in place and unmodified; and, + * 2. do not charge a fee for distributing it, without an agreement + * in writing with Root Software allowing you to do so; and, + * 3. if you modify FormMail before distributing it, you clearly + * identify: + * a) who you are + * b) how to contact you + * c) what changes you have made + * d) why you have made those changes. + * + * By using any of our products, including this script, you are + * agreeing to our standard Terms and Conditions, available here: + * http://www.tectite.com/TermsAndConditions.pdf + * + * This is free software and the Software License shown above + * is to be read in conjunction with our standard Terms and Conditions. + * + * Warranty and Disclaimer + * ~~~~~~~~~~~~~~~~~~~~~~~ + * Tectite FormMail is provided free-of-charge and with ABSOLUTELY NO WARRANTY. + * It has not been verified for use in critical applications, including, + * but not limited to, medicine, defense, aircraft, space exploration, + * or any other potentially dangerous activity. + * + * By using Tectite FormMail you agree to indemnify Root Software and + * Open Concepts (Vic) Pty Ltd, their agents, employees, directors and + * associated companies and businesses from any liability whatsoever. + * + * We still care + * ~~~~~~~~~~~~~ + * If you find a bug or fault in FormMail, please report it to us. + * We will respond to your report and make endeavours to rectify any + * faults you've detected as soon as possible. + * + * To contact us view our contact information: + * http://www.tectite.com/contacts.php + * + * Version History + * ~~~~~~~~~~~~~~~ + * Near the top of this file, you'll find its version. The version + * line looks like this: + * $FM_VERS = "N.MM"; /* script version ... + * + * The version history used to be located within this file. However, + * starting with Version 8.00 we've moved it... + * + * You can read the complete version history of FormMail on our + * main website here: + * http://www.tectite.com/fmdoc/version_history.php + */ + +/** + * An alternative function for sending email. + * You can override this variable in a hook script to use a different function. + */ +$ALT_MAIL_FUNCTION = ''; + +FMDebug('Submission to: ' . (isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : '') . ' from: ' . + (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')); + +if (isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD']) === 'OPTIONS') { + FMDebug('CORS OPTIONS request'); + CORS_Response(); + FormMailExit(); +} + +// +// Capture the current date and time, for various purposes. +// +date_default_timezone_set('UTC'); /* prevent notice in PHP 5.1+ */ +$lNow = time(); + +ini_set('track_errors',1); // enable $php_errormsg + +$aAlertInfo = array(); + +$sLangID = ""; // the language ID +$aMessages = array(); // all FormMail messages in the appropriate language + +function FormMailExit($s_mesg = '') +{ + if (($incFile = hookFileExists("fmhookonexit.inc")) !== false) { + @include($incFile); + } + exit($s_mesg); +} + +/** + * Interrogate and manage the execution environment. + * + * @package tectite_formmail + * @subpackage setup + */ +class ExecEnv +{ + /** + * Value of phpversion(). + * + * @var string + */ + private $_sPHPVersionString; + + /** + * Array containing the elements of the PHP version + * + * @var array + */ + private $_aPHPVersion; + + /** + * The URL for the script. + * + * @var string + */ + private $_sScript; + + /** + * Construct the class, and check PHP version. + */ + function __construct() + { + $this->_Init(); + $this->_CheckVersion(); + } + + /** + * Initialise the object. + * Sets {@link $_aPHPVersion} and {@link $_sPHPVersionString} + */ + private function _Init() + { + $this->_sPHPVersionString = phpversion(); + $this->_aPHPVersion = explode(".",$this->_ZapHyphenPart($this->_sPHPVersionString)); + } + + /** + * Remove any hyphenated component of a version string. + * + * @param $str + * + * @return false|string + */ + private function _ZapHyphenPart($str) + { + if (($i_pos = strpos($str,'-')) !== false) { + return substr($str,0,$i_pos); + } else { + return $str; + } + } + + /** + * @return array + */ + public function getPHPVersion() + { + return $this->_aPHPVersion; + } + + /** + * @return string + */ + public function getPHPVersionString() + { + return $this->_sPHPVersionString; + } + + /** + * Check for old version of PHP - die with a message if too old. + * + * This is actually not required because PHP 4 won't even accept + * the syntax of a PHP 5 script. However, we might need some + * other version check in the future, so this is a useful method + * to have around in that case. + */ + private function _CheckVersion() + { + $s_req_string = "5.0.0"; // We only support PHP 5 onward. + $a_too_old = explode(".",$s_req_string); + + $i_cannot_use = ($a_too_old[0] * 10000) + ($a_too_old[1] * 100) + $a_too_old[2]; + + $i_this_num = ($this->_aPHPVersion[0] * 10000) + ($this->_aPHPVersion[1] * 100) + + $this->_aPHPVersion[2]; + + if ($i_this_num <= $i_cannot_use) { + FormMailExit(GetMessage(MSG_SCRIPT_VERSION, + array("PHPREQ" => $s_req_string,"PHPVERS" => $this->_sPHPVersionString))); + } + } + + /** + * Test PHP version against a particular version string. + * + * @param $s_vers + * + * @return boolean true if the PHP version is at or later than the version + * specified + */ + public function IsPHPAtLeast($s_vers) + { + $a_test_version = explode(".",$s_vers); + if (count($a_test_version) < 3) { + return (false); + } + return ($this->_aPHPVersion[0] > $a_test_version[0] || ($this->_aPHPVersion[0] == + $a_test_version[0] && + ($this->_aPHPVersion[1] > + $a_test_version[1] || + $this->_aPHPVersion[1] == + $a_test_version[1] && + $this->_aPHPVersion[2] >= + $a_test_version[2]))); + } + + public function GetScript() + { + if (!isset($this->_sScript)) { + if (isset($_SERVER["PHP_SELF"]) && + !empty($_SERVER["PHP_SELF"]) && + isset($_SERVER["SERVER_NAME"]) && + !empty($_SERVER["SERVER_NAME"]) + ) { + if (isset($_SERVER["SERVER_PORT"]) && + $_SERVER["SERVER_PORT"] != 80 + ) { + if ($_SERVER["SERVER_PORT"] == 443) // SSL port + // + // just use https prefix + // + { + $this->_sScript = "https://" . $_SERVER["SERVER_NAME"] . + $_SERVER["PHP_SELF"]; + } else + // + // use http with port number + // + { + $this->_sScript = "http://" . $_SERVER["SERVER_NAME"] . + ":" . $_SERVER["SERVER_PORT"] . + $_SERVER["PHP_SELF"]; + } + } else { + $this->_sScript = "http://" . $_SERVER["SERVER_NAME"] . + $_SERVER["PHP_SELF"]; + } + } else { + Error("no_php_self",GetMessage(MSG_NO_PHP_SELF),false,false); + } + } + return ($this->_sScript); + } + + /** + * Get a boolean PHP setting. + * + * @param string $s_name the name of the setting + * + * @return bool|null the value of the setting + */ + public function getINIBool($s_name) + { + $m_val = ini_get($s_name); + if ($m_val !== null) { + if (is_numeric($m_val)) { + $m_val = (int)$m_val; + } elseif (is_string($m_val)) { + $m_val = strtolower($m_val); + switch ($m_val) { + case "1": + case "on": + case "true": + $m_val = true; + break; + default: + $m_val = false; + break; + } + } + } + return ($m_val); + } + + /** + * Return whether the session can be passed in a URL. + * + * @return bool true if the session can be passed in a URL + */ + public function allowSessionURL() + { + $m_only_cookies = $this->getINIBool('session.use_only_cookies'); + FMDebug('only_cookies=' . $m_only_cookies); + if ($m_only_cookies === null) { + $m_only_cookies = $this->IsPHPAtLeast('5.3.0'); + FMDebug('php=' . $this->IsPHPAtLeast('5.3.0') . ',only_cookies=' . $m_only_cookies); + } + return (!$m_only_cookies); + } + + public function getPostMaxSize() + { + $s_max_value = ini_get('post_max_size'); + $number = (int)substr($s_max_value,0,-1); + switch (strtoupper(substr($s_max_value,-1))) { + case "K": + return $number * 1024; + case "M": + return $number * pow(1024,2); + case "G": + return $number * pow(1024,3); + default: + return (int)$s_max_value; + } + } + + public function checkUploadSize() + { + if (isset($_SERVER['CONTENT_LENGTH'])) { + $n_size = (int)$_SERVER['CONTENT_LENGTH']; + $n_max = $this->getPostMaxSize(); + // echo "Size = $n_size, max = $n_max\n"; + if ($n_size > $n_max) { + UserError("post_size_limit",GetMessage(MSG_POST_SIZE_LIMIT,array(),false,false)); + } + } + } + + public function checkFileUploadSize($a_file_vars) + { + if (Settings::get('FILEUPLOADS')) { + $a_field_names = array_keys($a_file_vars); + foreach ($a_field_names as $s_name => $a_upload) { + if (isset($a_upload)) { + switch (isset($a_upload['error']) ? $a_upload['error'] : 0) { + case 0: // no error + case 4: // no file uploaded + break; + default: + UserError('file_upload_error',FieldManager::GetFileUploadErrorMesg($a_upload['error'])); + } + } + } + } + } +} + +$ExecEnv = new ExecEnv(); +if (!$ExecEnv->IsPHPAtLeast("5.3.0")) { + // + // disable this silly setting (usually not enabled) + // it's also deprecated from PHP version 5.3.0 + // + if (function_exists('set_magic_quotes_runtime')) { + /** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */ + @set_magic_quotes_runtime(0); + } +} + +// +// We set references to the appropriate arrays to handle PHP version differences +// Session vars are selected after we start the session. +// +$aServerVars = &$_SERVER; +$aGetVars = &$_GET; +$aFormVars = &$_POST; +$aFileVars = &$_FILES; +$aEnvVars = &$_ENV; + +$bIsGetMethod = false; +$bHasGetData = false; + +if (!isset($REAL_DOCUMENT_ROOT)) { + SetRealDocumentRoot(); +} + +if (isset($aServerVars['SERVER_PORT'])) { + $SCHEME = ($aServerVars['SERVER_PORT'] == 80) ? "http://" : "https://"; +} else { + $SCHEME = ""; +} +if (isset($aServerVars['SERVER_NAME']) && $aServerVars['SERVER_NAME'] !== "") { + $SERVER = $aServerVars['SERVER_NAME']; +} elseif (isset($aServerVars['SERVER_ADDR']) && $aServerVars['SERVER_ADDR'] !== "") { + $SERVER = $aServerVars['SERVER_ADDR']; +} else { + $SERVER = ""; +} + +/* + * Load an optional include file before the configuration. + * You can use this to set variables that can be used in the + * configuration section. + */ +if (includeFileExists("formmail-preconfig.inc.php")) { + @include("formmail-preconfig.inc.php"); +} + +/*****************************************************************************/ +/* CONFIGURATION (do not alter this line in any way!!!) */ +/***************************************************************************** + * This is the *only* place where you need to modify things to use formmail.php + * on your particular system. This section finishes at "END OF CONFIGURATION". + * Help for all settings can be found on our website: + * http://www.tectite.com/fmdoc/index.php + * + * Also, above each setting is a direct URL to the help information for the + * setting. + *****************************************************************************/ + +/* Help: http://www.tectite.com/fmdoc/email_name.php */ +$EMAIL_NAME = "^[-a-z0-9._]+"; /* the '^' is an important security feature! */ + +/* Help: http://www.tectite.com/fmdoc/target_email.php */ +$TARGET_EMAIL = array("^info@iocloudsolutions\.net$"); + +/* Help: http://www.tectite.com/fmdoc/email_addrs.php */ +$EMAIL_ADDRS = array(); + +/* Help: http://www.tectite.com/fmdoc/def_alert.php */ +$DEF_ALERT = "admin@bugzbunny.net"; + +/* Help: http://www.tectite.com/fmdoc/site_domain.php */ +$SITE_DOMAIN = "https://www.iocloudsolutions.net"; /* your website domain name */ + +/* Help: http://www.tectite.com/fmdoc/set_real_document_root.php */ +$SET_REAL_DOCUMENT_ROOT = ""; /* overrides the value set by SetRealDocumentRoot function */ + +// +// override $REAL_DOCUMENT_ROOT from the $SET_REAL_DOCUMENT_ROOT value (if any) +// Do not alter the following code (next 3 lines)! +// +if (isset($SET_REAL_DOCUMENT_ROOT) && $SET_REAL_DOCUMENT_ROOT !== "") { + $REAL_DOCUMENT_ROOT = $SET_REAL_DOCUMENT_ROOT; +} + +/* Help: http://www.tectite.com/fmdoc/config_check.php */ +$CONFIG_CHECK = array("TARGET_EMAIL"); + +/* Help: http://www.tectite.com/fmdoc/at_mangle.php */ +$AT_MANGLE = ""; + +/* Help: http://www.tectite.com/fmdoc/target_urls.php */ +$TARGET_URLS = array(); /* default; no URLs allowed */ + +/* Help: http://www.tectite.com/fmdoc/head_crlf.php */ +$HEAD_CRLF = "\r\n"; + +/* Help: http://www.tectite.com/fmdoc/body_lf.php */ +$BODY_LF = "\r\n"; /* the new default: use this for CR+LF */ +//$BODY_LF = "\n"; /* the old default: just LF */ + +/* Help: http://www.tectite.com/fmdoc/from_user.php */ +$FROM_USER = ""; /* the default - setting not used */ + +/* Help: http://www.tectite.com/fmdoc/sendmail_f_option.php */ +$SENDMAIL_F_OPTION = false; +$SENDMAIL_F_OPTION_LINE = __LINE__ - 1; /* don't modify this line! */ + +/* Help: http://www.tectite.com/fmdoc/fixed_sender.php */ +$FIXED_SENDER = ""; + +/* Help: http://www.tectite.com/fmdoc/set_sender_from_email.php */ +$SET_SENDER_FROM_EMAIL = false; + +/* Help: http://www.tectite.com/fmdoc/ini_set_from.php */ +$INI_SET_FROM = false; + +/* Help: http://www.tectite.com/fmdoc/logdir.php */ +$LOGDIR = "/var/www/logs"; /* directory for log files; empty string to disallow log files */ + +/* Help: http://www.tectite.com/fmdoc/autorespondlog.php */ +$AUTORESPONDLOG = ""; /* file name in $LOGDIR for the auto responder log; empty string for no auto responder log */ + +/* Help: http://www.tectite.com/fmdoc/csv_file_settings.php */ +$CSVDIR = ""; /* directory for csv files; empty string to disallow csv files */ +$CSVSEP = ","; /* comma separator between fields (columns) */ +$CSVINTSEP = ";"; /* semicolon is the separator for fields (columns) with multiple values (checkboxes, etc.) */ +$CSVQUOTE = '"'; /* all fields in the CSV are quoted with this character; default is double quote. You can change it to single quote or leave it empty for no quotes. */ +//$CSVQUOTE = "'"; /* use this if you want single quotes */ +$CSVOPEN = ""; /* set to "b" to force line terminations to be kept as $CSVLINE setting below, regardless of operating + system. Keep as empty string and leave $CSVLINE unchanged, to get text file + terminations for your server's operating system. (Line feed on UNIX, carriage-return line feed on Windows). */ +$CSVLINE = "\n"; /* line termination for CSV files. The default is a single line feed, which may be modified for your + server's operating system. If you want to change + this value, you *must* set $CSVOPEN = "b". */ + +/* Help: http://www.tectite.com/fmdoc/templatedir.php */ +$TEMPLATEDIR = ""; /* directory for template files; empty string if you don't have any templates */ + +/* Help: http://www.tectite.com/fmdoc/templateurl.php */ +$TEMPLATEURL = ""; /* default; no template URL */ + +/* Help: http://www.tectite.com/fmdoc/multiformdir.php */ +$MULTIFORMDIR = ""; /* directory for multi-form template files; empty string if you're not using multi-forms */ + +/* Help: http://www.tectite.com/fmdoc/multiformurl.php */ +$MULTIFORMURL = ""; /* default; no multi-forms templates URL */ + +/* Help: http://www.tectite.com/fmdoc/text_subs.php */ +$TEXT_SUBS = array( + array("srch" => "/\\\\r\\\\n/","repl" => "\r\n",), + array("srch" => "/\\\\n/","repl" => "\n",), + array("srch" => "/\\\\t/","repl" => "\t",), + array("srch" => "/\\[NL\\]/","repl" => "\n",), + array("srch" => "/\\[TAB\\]/","repl" => "\t",), + array("srch" => "/\\[NBSP\\]/","repl" => " ",), + array("srch" => "/\\[DQUOT\\]/","repl" => '"',), + array("srch" => "/\\[SQUOT\\]/","repl" => "'",), + array("srch" => "/\\[COLON\\]/","repl" => ":",), + array("srch" => "/\\[SLOSH\\]/","repl" => "\\",), + array("srch" => "/\\[OPCURL\\]/","repl" => "{",), + array("srch" => "/\\[CLCURL\\]/","repl" => "}",), + array("srch" => "/(on[a-z]*|href|src)\\s*=\\s*/i","repl" => ""), /* strip html attributes that could be unsafe */ + array("srch" => "/<\\s*(table|tr|td|th|p|ul|ol|li|b|i|u|strong|pre|h[1-6]|em|dl|dd|dt|hr|span|br)(\\b[^>]*?)>/i", + "repl" => "<\$1\$2>", + ), + array("srch" => "#<\\s*/\\s*(table|tr|td|th|p|ul|ol|li|b|i|u|strong|pre|h[1-6]|em|dl|dd|dt|hr|span|br)\\s*>#i", + "repl" => "", + ), +); + +/* Help: http://www.tectite.com/fmdoc/authentication_settings.php */ +$AUTHENTICATE = ""; +//$AUTHENTICATE = "Basic cnVzc2VsbHI6dGVzdA=="; // example +$AUTH_USER = ""; +$AUTH_PW = ""; + +/* Help: http://www.tectite.com/fmdoc/form_ini_file.php */ +$FORM_INI_FILE = "/var/www/formmail.ini"; + +/* Help: http://www.tectite.com/fmdoc/moduledir.php */ +$MODULEDIR = "."; + +/* Help: http://www.tectite.com/fmdoc/fmcompute.php */ +$FMCOMPUTE = "fmcompute.php"; + +/* Help: http://www.tectite.com/fmdoc/fmgeoip.php */ +$FMGEOIP = "fmgeoip.php"; + +/* Help: http://www.tectite.com/fmdoc/advanced_templates.php */ +$ADVANCED_TEMPLATES = false; /* set to true for advanced templates */ + +/* Help: http://www.tectite.com/fmdoc/limited_import.php */ +$LIMITED_IMPORT = true; /* set to true if your database cannot handle escaped quotes or newlines within imported data. Microsoft Access is one example. */ + +/* Help: http://www.tectite.com/fmdoc/valid_env.php */ +$VALID_ENV = array('HTTP_REFERER','REMOTE_HOST','REMOTE_ADDR','REMOTE_USER', + 'HTTP_USER_AGENT' +); + +/* Help: http://www.tectite.com/fmdoc/fileuploads.php */ +$FILEUPLOADS = false; /* set to true to allow file attachments */ + +/* Help: http://www.tectite.com/fmdoc/max_file_upload_size.php */ +$MAX_FILE_UPLOAD_SIZE = 0; /* default of 0 means that other software */ +// controls the maximum file upload size +// (FormMail doesn't test the file size) + +/* Help: http://www.tectite.com/fmdoc/file_repository.php */ +$FILE_REPOSITORY = ""; + +/* Help: http://www.tectite.com/fmdoc/file_mode.php */ +$FILE_MODE = 0664; /* always precede with 0 to specify octal! */ + +/* Help: http://www.tectite.com/fmdoc/file_overwrite.php */ +$FILE_OVERWRITE = true; + +/* Help: http://www.tectite.com/fmdoc/next_num_file.php */ +$NEXT_NUM_FILE = ""; + +/* Help: http://www.tectite.com/fmdoc/put_data_in_url.php */ +$PUT_DATA_IN_URL = true; /* set to true to place data in the URL */ +// for bad_url redirects + +/* Help: http://www.tectite.com/fmdoc/allow_get_method.php */ +$ALLOW_GET_METHOD = false; + +/* Help: http://www.tectite.com/fmdoc/db_see_input.php */ +$DB_SEE_INPUT = false; /* set to true to just see the input values */ + +/* Help: http://www.tectite.com/fmdoc/db_see_ini.php */ +$DB_SEE_INI = false; /* set to true to just see the ini file */ + +/* Help: http://www.tectite.com/fmdoc/maxstring.php */ +$MAXSTRING = 1024; /* maximum string length for a value */ + +/* Help: http://www.tectite.com/fmdoc/require_captcha.php */ +$REQUIRE_CAPTCHA = ""; /* set to a message string if your forms */ +// must provide a CAPTCHA string + +/* Help: http://www.tectite.com/fmdoc/recaptcha_private_key.php */ +$RECAPTCHA_PRIVATE_KEY = ""; + +/* Help: http://www.tectite.com/fmdoc/bshowmesgnumbers.php */ +$bShowMesgNumbers = false; + +/* Help: http://www.tectite.com/fmdoc/filters.php */ +/* Note for Tectite personnel: the upgrade Wizard will merge new values + * but be careful of $var usage and quoting in new entries. + */ +/** @noinspection PhpUndefinedVariableInspection */ +$FILTERS = array("encode" => "$REAL_DOCUMENT_ROOT/cgi-bin/fmencoder -kpubkey.txt", + "null" => "null", + "csv" => "csv" +); + +/* Help: http://www.tectite.com/fmdoc/socket_filters.php */ +$SOCKET_FILTERS = array( + "httpencode" => array("site" => "YourSiteHere", + "port" => 80, + "path" => "/cgi-bin/fmencoder", + "params" => array(array("name" => "key", + "file" => "$REAL_DOCUMENT_ROOT/cgi-bin/pubkey.txt" + ) + ) + ), + "sslencode" => array("site" => "ssl://YourSecureSiteHere", + "port" => 443, + "path" => "/cgi-bin/fmencoder", + "params" => array(array("name" => "key", + "file" => "$REAL_DOCUMENT_ROOT/cgi-bin/pubkey.txt" + ) + ) + ), +); + +/* Help: http://www.tectite.com/fmdoc/filter_attribs.php */ +$FILTER_ATTRIBS = array("encode" => "Strips,MIME=application/vnd.fmencoded,Encrypts", + "httpencode" => "Strips,MIME=application/vnd.fmencoded,Encrypts", + "sslencode" => "Strips,MIME=application/vnd.fmencoded,Encrypts", + "csv" => "Strips,MIME=text/csv", +); + +/* Help: http://www.tectite.com/fmdoc/check_for_new_version.php */ +$CHECK_FOR_NEW_VERSION = true; +$CHECK_DAYS = 30; + +/* Help: http://www.tectite.com/fmdoc/scratch_pad.php */ +$SCRATCH_PAD = ""; + +/* Help: http://www.tectite.com/fmdoc/cleanup_time.php */ +$CLEANUP_TIME = 60; /* cleanup time in minutes */ + +/* Help: http://www.tectite.com/fmdoc/cleanup_chance.php */ +$CLEANUP_CHANCE = 20; /* percentage probability that cleanup will be performed */ + +/* Help: http://www.tectite.com/fmdoc/pear_settings.php */ +$PEAR_SMTP_HOST = ""; +$PEAR_SMTP_PORT = 25; +$PEAR_SMTP_USER = ""; +$PEAR_SMTP_PWD = ""; + +/* Help: http://www.tectite.com/fmdoc/alert_on_user_error.php */ +$ALERT_ON_USER_ERROR = true; + +/* Help: http://www.tectite.com/fmdoc/enable_attack_detection.php */ +$ENABLE_ATTACK_DETECTION = true; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_url.php */ +$ATTACK_DETECTION_URL = ""; + +/* Help: http://www.tectite.com/fmdoc/alert_on_attack_detection.php */ +$ALERT_ON_ATTACK_DETECTION = false; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_mime.php */ +$ATTACK_DETECTION_MIME = true; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_junk.php */ +$ATTACK_DETECTION_JUNK = true; +$ATTACK_DETECTION_JUNK_CONSONANTS = "bcdfghjklmnpqrstvwxz"; +$ATTACK_DETECTION_JUNK_VOWELS = "aeiouy"; +$ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS = 5; +$ATTACK_DETECTION_JUNK_CONSEC_VOWELS = 4; +$ATTACK_DETECTION_JUNK_TRIGGER = 2; +$ATTACK_DETECTION_JUNK_LANG_STRIP = array( + "aiia", /* Hawaiian */ + "aeoa", /* palaeoanthropic */ + "aeoe", /* palaeoethnic */ + "ayou", /* layout */ + "ayee", /* payee */ + "buyout", /* buyout */ + "clayey", /* clayey */ + "hooey", /* hooey */ + "ioau", /* radioautograph */ + "opoeia", /* pharmacopoeia, onomatopoeia */ + "ooee", /* cooee */ + "oyee", /* employee */ + "ioau", /* radioautograph */ + "uaia", /* guaiac */ + "uaya", /* uruguayan */ + "ueou", /* aqueous */ + "uiou", /* obsequious */ + "uoya", /* buoyant */ + "queue", /* queue, queueing */ + "earth", /* earthquake, earthslide */ + "cks", /* jockstrap, backscratcher */ + "ngth", /* strengths, length */ + "ndths", /* thousandths */ + "ght", /* nightclub, knightsbridge */ + "phth", /* ophthalmology */ + "sch", /* rothschild */ + "shch", /* borshch */ + "scr", /* corkscrew */ + "spr", /* wingspread, offspring */ + "str", /* armstrong, songstress */ + "sts", /* bursts, postscript */ + "tch", /* catchphrase, scratchproof */ + "thst", /* northstar, birthstone */ + "http", /* https, http */ + "html", /* HTML, XHTML */ +); +$ATTACK_DETECTION_JUNK_IGNORE_FIELDS = array(); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_dups.php */ +$ATTACK_DETECTION_DUPS = array("realname","address1","address2","country","zip", + "phone","postcode","state","email" +); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_specials.php */ +$ATTACK_DETECTION_SPECIALS = true; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_specials.php */ +$ATTACK_DETECTION_SPECIALS_ONLY_EMAIL = array("derive_fields","required", + "mail_options","good_url","bad_url","good_template", + "bad_template" +); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_specials.php */ +$ATTACK_DETECTION_SPECIALS_ANY_EMAIL = array("subject"); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_many_urls.php */ +$ATTACK_DETECTION_MANY_URLS = 3; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_many_url_fields.php */ +$ATTACK_DETECTION_MANY_URL_FIELDS = 0; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_url_patterns.php */ +$ATTACK_DETECTION_URL_PATTERNS = array( + '(^|[^-a-z_.0-9]+)(?'; + debug_print_backtrace(); + echo ''; + FormMailExit("No FormMail setting called '$s_name' exists."); + } + } + + /** + * Tests if the given config setting is empty. + * + * @param string $s_name the name of the config setting + * + * @return boolean true if the config setting is empty + */ + public static function isEmpty($s_name) + { + Settings::_check($s_name); + if (gettype($GLOBALS[$s_name]) == 'string') { + return ($GLOBALS[$s_name] === ''); + } else { + return (empty($GLOBALS[$s_name])); + } + } + + /** + * Returns the value of the given config setting. + * + * @param string $s_name the name of the config setting + * + * @return mixed the value of the config setting + */ + public static function get($s_name) + { + Settings::_check($s_name); + return ($GLOBALS[$s_name]); + } + + /** + * Set the value of a config setting. + * + * @param string $s_name the name of the config setting + * @param mixed $m_value the value to set for the config setting + */ + public static function set($s_name,$m_value) + { + Settings::_check($s_name); + if (($s_orig_type = gettype($GLOBALS[$s_name])) != ($s_new_type = gettype($m_value))) { + echo '
';
+			debug_print_backtrace();
+			echo '
'; + FormMailExit("You cannot set FormMail setting '$s_name' to type '$s_new_type'. It should be type '$s_orig_type'."); + } + $GLOBALS[$s_name] = $m_value; + } +} + +/* + * For PHP v8 we need to check each include file for existence first. + */ +function includeFileExists($file_name) +{ + return (stream_resolve_include_path($file_name) !== false); +} + +function hookFileExists($file_name) +{ + if (!Settings::isEmpty('HOOK_DIR')) { + $hook_file = Settings::get('HOOK_DIR') . DIRECTORY_SEPARATOR . $file_name . ".php"; + if (includeFileExists($hook_file)) { + return ($hook_file); + } + $hook_file = Settings::get('HOOK_DIR') . DIRECTORY_SEPARATOR . $file_name; + if (includeFileExists($hook_file)) { + return ($hook_file); + } + } + return (false); +} + +/* + * Load an optional include file after the configuration. + * You can use this to set variables or make adjustments + * based on the results of the configuration section. + */ +if (includeFileExists("formmail-preconfigdefs.inc.php")) { + @include("formmail-preconfigdefs.inc.php"); +} + +/* + * Many configuration settings used to be constants. However, constants + * cannot be re-defined in PHP. This limitation reduced the value + * of "formmail - postconfig . inc . php" and other hook scripts. + * Therefore, all configuration settings have been changed to be global + * variables (no define's). + * + * The following defines are for backward-compatibility with any existing + * hook scripts that are expecting the old constants. + */ +define("EMAIL_NAME",Settings::get("EMAIL_NAME")); +define("DEF_ALERT",Settings::get("DEF_ALERT")); +define("AT_MANGLE",Settings::get("AT_MANGLE")); +define("HEAD_CRLF",Settings::get("HEAD_CRLF")); +define("BODY_LF",Settings::get("BODY_LF")); +define("SENDMAIL_F_OPTION",Settings::get("SENDMAIL_F_OPTION")); +define("SENDMAIL_F_OPTION_LINE",Settings::get("SENDMAIL_F_OPTION_LINE")); +define("SET_SENDER_FROM_EMAIL",Settings::get("SET_SENDER_FROM_EMAIL")); +define("INI_SET_FROM",Settings::get("INI_SET_FROM")); +define("ADVANCED_TEMPLATES",Settings::get("ADVANCED_TEMPLATES")); +define("LIMITED_IMPORT",Settings::get("LIMITED_IMPORT")); +define("FILEUPLOADS",Settings::get("FILEUPLOADS")); +define("MAX_FILE_UPLOAD_SIZE",Settings::get("MAX_FILE_UPLOAD_SIZE")); +define("FILE_MODE",Settings::get("FILE_MODE")); +define("FILE_OVERWRITE",Settings::get("FILE_OVERWRITE")); +define("PUT_DATA_IN_URL",Settings::get("PUT_DATA_IN_URL")); +define("DB_SEE_INPUT",Settings::get("DB_SEE_INPUT")); +define("DB_SEE_INI",Settings::get("DB_SEE_INI")); +define("MAXSTRING",Settings::get("MAXSTRING")); +define("CHECK_FOR_NEW_VERSION",Settings::get("CHECK_FOR_NEW_VERSION")); +define("CHECK_DAYS",Settings::get("CHECK_DAYS")); +define("ALERT_ON_USER_ERROR",Settings::get("ALERT_ON_USER_ERROR")); +define("ENABLE_ATTACK_DETECTION",Settings::get("ENABLE_ATTACK_DETECTION")); +define("ATTACK_DETECTION_URL",Settings::get("ATTACK_DETECTION_URL")); +define("ALERT_ON_ATTACK_DETECTION",Settings::get("ALERT_ON_ATTACK_DETECTION")); +define("ATTACK_DETECTION_MIME",Settings::get("ATTACK_DETECTION_MIME")); +define("ATTACK_DETECTION_JUNK",Settings::get("ATTACK_DETECTION_JUNK")); +define("ATTACK_DETECTION_JUNK_CONSONANTS",Settings::get("ATTACK_DETECTION_JUNK_CONSONANTS")); +define("ATTACK_DETECTION_JUNK_VOWELS",Settings::get("ATTACK_DETECTION_JUNK_VOWELS")); +define("ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS",Settings::get("ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS")); +define("ATTACK_DETECTION_JUNK_CONSEC_VOWELS",Settings::get("ATTACK_DETECTION_JUNK_CONSEC_VOWELS")); +define("ATTACK_DETECTION_JUNK_TRIGGER",Settings::get("ATTACK_DETECTION_JUNK_TRIGGER")); +define("ATTACK_DETECTION_SPECIALS",Settings::get("ATTACK_DETECTION_SPECIALS")); +define("ATTACK_DETECTION_MANY_URLS",Settings::get("ATTACK_DETECTION_MANY_URLS")); +define("ATTACK_DETECTION_MANY_URL_FIELDS",Settings::get("ATTACK_DETECTION_MANY_URL_FIELDS")); +define("ATTACK_DETECTION_IGNORE_ERRORS",Settings::get("ATTACK_DETECTION_IGNORE_ERRORS")); +define("ZERO_IS_EMPTY",Settings::get("ZERO_IS_EMPTY")); +define("VALIDATE_EMAIL_DOMAIN",Settings::get("VALIDATE_EMAIL_DOMAIN")); +define("DESTROY_SESSION",Settings::get("DESTROY_SESSION")); + +// +// for Ajax allow GET method for cross site JSONP +// +if (IsAjax()) { + Settings::set('ALLOW_GET_METHOD',true); +} + +/* + * Load an optional include file after the configuration. + * You can use this to set variables or make adjustments + * based on the results of the configuration section. + */ +if (includeFileExists("formmail-postconfig.inc.php")) { + @include("formmail-postconfig.inc.php"); +} + +// @formatter:off + +// +// the following constants define all FormMail messages +// +// To re-align comments, use these search and replace patterns: +// Search Replace +// ^(\S{35,39})\s+// $1\t// +// ^(\S{31,35})\s+// $1\t\t// +// ^(\S{27,31})\s+// $1\t\t\t// +// ^(\S{23,27})\s+// $1\t\t\t\t// +// ^(\S{19,23})\s+// $1\t\t\t\t\t// +// +define('MSG_SCRIPT_VERSION',0); // This script requires at least PHP version... +define('MSG_END_VERS_CHK',1); // If you're happy... +define('MSG_VERS_CHK',2); // A later version of FormMail is available... +define('MSG_CHK_FILE_ERROR',3); // Unable to create check file... +define('MSG_UNK_VALUE_SPEC',4); // derive_fields: unknown value specification... +define('MSG_INV_VALUE_SPEC',5); // derive_fields: invalid value specification... +define('MSG_DERIVED_INVALID',6); // Some derive_fields specifications... +define('MSG_INT_FORM_ERROR',7); // Internal form error... +define('MSG_OPTIONS_INVALID',8); // Some mail_options settings... +define('MSG_PLSWAIT_REDIR',9); // Please wait while you are redirected... +define('MSG_IFNOT_REDIR',10); // If you are not redirected... +define('MSG_PEAR_OBJ',11); // Failed to create PEAR Mail object... +define('MSG_PEAR_ERROR',12); // PEAR Mail error... +define('MSG_NO_FOPT_ADDR',13); // You have specified "SendMailFOption"... +define('MSG_MORE_INFO',14); // More information... +define('MSG_INFO_STOPPED',15); // Extra alert information suppressed... +define('MSG_FM_ALERT',16); // FormMail alert +define('MSG_FM_ERROR',17); // FormMail script error +define('MSG_FM_ERROR_LINE',18); // The following error occurred... +define('MSG_USERDATA_STOPPED',19); // User data suppressed... +define('MSG_FILTERED',20); // This alert has been filtered... +define('MSG_TEMPLATES',21); // You must set either TEMPLATEDIR or TEMPLATEURL... +define('MSG_OPEN_TEMPLATE',22); // Failed to open template... +define('MSG_ERROR_PROC',23); // An error occurred while processing... +define('MSG_ALERT_DONE',24); // Our staff have been alerted... +define('MSG_PLS_CONTACT',25); // Please contact us directly... +define('MSG_APOLOGY',26); // We apologize for any inconvenience... +define('MSG_ABOUT_FORMMAIL',27); // Your form submission was processed by... +define('MSG_PREG_FAILED',28); // preg_match_all failed in FindCRMFields... +define('MSG_URL_INVALID',29); // CRM URL "$URL" is not valid... +define('MSG_URL_OPEN',30); // Failed to open Customer Relationship... +define('MSG_CRM_FAILED',31); // Failure report from CRM... +define('MSG_CRM_FORM_ERROR',32); // Your form submission was not... +define('MSG_OR',33); // "$ITEM1" or "$ITEM2" +define('MSG_NOT_BOTH',34); // not both "$ITEM1" and "$ITEM2" +define('MSG_XOR',35); // "$ITEM1" or "$ITEM2" (but not both) +define('MSG_IS_SAME_AS',36); // "$ITEM1" is the same as "$ITEM2" +define('MSG_IS_NOT_SAME_AS',37); // "$ITEM1" is not the same as "$ITEM2" +define('MSG_REQD_OPER',38); // Operator "$OPER" is not valid for "required" +define('MSG_PAT_FAILED',39); // Pattern operator "$OPER" failed: pattern... +define('MSG_COND_OPER',40); // Operator "$OPER" is not valid... +define('MSG_INV_COND',41); // Invalid "conditions" field... +define('MSG_COND_CHARS',42); // The conditions field "$FLD" is not valid... +define('MSG_COND_INVALID',43); // The conditions field "$FLD" is not valid... +define('MSG_COND_TEST_LONG',44); // Field "$FLD" has too many components... +define('MSG_COND_IF_SHORT',45); // Field "$FLD" has too few components for... +define('MSG_COND_IF_LONG',46); // Field "$FLD" has too many components for... +define('MSG_COND_UNK',47); // Field "$FLD" has an unknown command word... +define('MSG_MISSING',48); // Missing "$ITEM"... +define('MSG_NEED_ARRAY',49); // "$ITEM" must be an array... +define('MSG_SUBM_FAILED',50); // Your form submission has failed... +define('MSG_FILTER_WRONG',51); // Filter "$FILTER" is not properly... +define('MSG_FILTER_CONNECT',52); // Could not connect to site "$SITE"... +define('MSG_FILTER_PARAM',53); // Filter "$FILTER" has invalid parameter... +define('MSG_FILTER_OPEN_FILE',54); // Filter "$FILTER" cannot open file... +define('MSG_FILTER_FILE_ERROR',55); // Filter "$FILTER": read error on file... +define('MSG_FILTER_READ_ERROR',56); // Filter '$filter' failed: read error... +define('MSG_FILTER_NOT_OK',57); // Filter 'FILTER' failed... +define('MSG_FILTER_UNK',58); // Unknown filter... +define('MSG_FILTER_CHDIR',59); // Cannot chdir... +define('MSG_FILTER_NOTFOUND',60); // Cannot execute... +define('MSG_FILTER_ERROR',61); // Filter "$FILTER" failed... +define('MSG_SPARE',62); // this value is now spare +define('MSG_TEMPLATE_ERRORS',63); // Template "$NAME" caused the... +define('MSG_TEMPLATE_FAILED',64); // Failed to process template "$NAME"... +define('MSG_MIME_PREAMBLE',65); // (Your mail reader should not show this... +define('MSG_MIME_HTML',66); // This message has been generated by FormMail... +define('MSG_FILE_OPEN_ERROR',67); // Failed to open file "$NAME"... +define('MSG_ATTACH_DATA',68); // Internal error: AttachFile requires... +define('MSG_PHP_HTML_TEMPLATES',69); // HTMLTemplate option is only ... +define('MSG_PHP_FILE_UPLOADS',70); // For security reasons, file upload... +define('MSG_FILE_UPLOAD',71); // File upload attempt ignored... +define('MSG_FILE_UPLOAD_ATTACK',72); // Possible file upload attack... +define('MSG_PHP_PLAIN_TEMPLATES',73); // PlainTemplate option is only... +define('MSG_ATTACH_NAME',74); // filter_options: Attach must contain a name... +define('MSG_PHP_BCC',75); // Warning: BCC is probably not supported... +define('MSG_CSVCOLUMNS',76); // The "csvcolumns" setting is not... +define('MSG_CSVFILE',77); // The "csvfile" setting is not... +define('MSG_TARG_EMAIL_PAT_START',78); // Warning: Your TARGET_EMAIL pattern... +define('MSG_TARG_EMAIL_PAT_END',79); // Warning: Your TARGET_EMAIL pattern... +define('MSG_CONFIG_WARN',80); // The following potential problems... +define('MSG_PHP_AUTORESP',81); // Autorespond is only supported... +define('MSG_ALERT',82); // This is a test alert message... +define('MSG_NO_DEF_ALERT',83); // No DEF_ALERT value has been set.... +define('MSG_TEST_SENT',84); // Test message sent. Check your email..... +define('MSG_TEST_FAILED',85); // FAILED to send alert message... +define('MSG_NO_DATA_PAGE',86); // This URL is a Form submission program... +define('MSG_REQD_ERROR',87); // The form required some values that you... +define('MSG_COND_ERROR',88); // Some of the values you provided... +define('MSG_CRM_FAILURE',89); // The form submission did not succeed... +define('MSG_FOPTION_WARN',90); // Warning: You've used SendMailFOption in... +define('MSG_NO_ACTIONS',91); // The form has an internal error... +define('MSG_NO_RECIP',92); // The form has an internal error... +define('MSG_INV_EMAIL',93); // Invalid email addresses... +define('MSG_FAILED_SEND',94); // Failed to send email... +define('MSG_ARESP_EMAIL',96); // No "email" field was found. Autorespond... +define('MSG_ARESP_SUBJ',97); // Your form submission... +define('MSG_LOG_NO_VERIMG',98); // No VerifyImgString in session... +define('MSG_ARESP_NO_AUTH',99); // Failed to obtain authorization... +define('MSG_LOG_NO_MATCH',100); // User did not match image... +define('MSG_ARESP_NO_MATCH',101); // Your entry did not match... +define('MSG_LOG_FAILED',102); // Failed +define('MSG_ARESP_FAILED',103); // Autoresponder failed +define('MSG_LOG_OK',104); // OK +define('MSG_THANKS_PAGE',105); // Thanks! We've received your.... +define('MSG_LOAD_MODULE',106); // Cannot load module.... +define('MSG_LOAD_FMCOMPUTE',107); // Cannot load FMCompute.... +define('MSG_REGISTER_MODULE',108); // Cannot register module.... +define('MSG_COMP_PARSE',109); // These parse errors occurred.... +define('MSG_COMP_REG_DATA',110); // Failed to register data field.... +define('MSG_COMP_ALERT',111); // The following alert messages.... +define('MSG_COMP_DEBUG',112); // The following debug messages... +define('MSG_COMP_EXEC',113); // The following errors occurred.... +define('MSG_REG_FMCOMPUTE',114); // Cannot register function... +define('MSG_USER_ERRORS',115); // A number of errors occurred... +define('MSG_CALL_PARAM_COUNT',116); // Invalid parameter count... +define('MSG_CALL_UNK_FUNC',117); // Unknown function... +define('MSG_SAVE_FILE',118); // Failed to save file.... +define('MSG_CHMOD',119); // Failed to chmod file.... +define('MSG_VERIFY_MISSING',120); // Image verification string missing... +define('MSG_VERIFY_MATCH',121); // Your entry did not match... +define('MSG_FILE_NAMES_INVALID',122); // Some file_names specifications... +define('MSG_FILE_NAMES_NOT_FILE',123); // Your file_names specification... +define('MSG_TEMPL_ALERT',124); // The following alert messages.... +define('MSG_TEMPL_DEBUG',125); // The following debug messages... +define('MSG_TEMPL_PROC',126); // The following errors occurred.... +define('MSG_SAVE_FILE_EXISTS',127); // Cannot save file.... +define('MSG_EMPTY_ADDRESSES',128); // $COUNT empty addresses +define('MSG_CALL_INVALID_PARAM',129); // Invalid parameter.... +define('MSG_INI_PARSE_WARN',130); // Warning: your INI +define('MSG_INI_PARSE_ERROR',131); // The FormMail INI... +define('MSG_RECAPTCHA_MATCH',132); // reCaptcha verification failed... + +define('MSG_AND',133); // "$ITEM1" and "$ITEM2" +define('MSG_NEXT_PLUS_GOOD',134); // The form specifies both next_form and.... +define('MSG_MULTIFORM',135); // You must set either MULTIFORMDIR or MULTIFORMURL... +define('MSG_MULTIFORM_FAILED',136); // Failed to process multi-page form template "$NAME"... +define('MSG_NEED_THIS_FORM',137); // Multi-page forms require "this_form" field... +define('MSG_NO_PHP_SELF',138); // PHP on the server is not providing "PHP_SELF" +define('MSG_RETURN_URL_INVALID',139); // Return "$URL" is not valid... +define('MSG_GO_BACK',140); // Cannot 'go back' if not a multi-page form... +define('MSG_OPEN_URL',141); // Cannot open URL... +define('MSG_CANNOT_RETURN',142); // Cannot return to page.... +define('MSG_ATTACK_DETECTED',143); // Server attack detected.... +define('MSG_ATTACK_PAGE',144); // Your form submission.... +define('MSG_ATTACK_MIME_INFO',145); // The field "$FLD" contained... +define('MSG_ATTACK_DUP_INFO',146); // The fields "$FLD1" and... +define('MSG_ATTACK_SPEC_INFO',147); // Special field "$FLD"... +define('MSG_NEED_SCRATCH_PAD',148); // You need to set SCRATCH_PAD... +define('MSG_MULTI_UPLOAD',149); // File upload processing failed during multi-page form processing. +define('MSG_OPEN_SCRATCH_PAD',150); // Cannot open directory... +define('MSG_NO_NEXT_NUM_FILE',151); // You cannot use the %nextnum% feature... +define('MSG_NEXT_NUM_FILE',152); // Cannot process next number... +define('MSG_ATTACK_MANYURL_INFO',153); // Field "$FLD"... +define('MSG_ATTACK_MANYFIELDS_INFO',154); // $NUM fields have URLs.... +define('MSG_REV_CAP',155); // ATTACK_DETECTION_REVERSE_CAPTCHA setting.... +define('MSG_ATTACK_REV_CAP_INFO',156); // The field "$FLD" contained... +define('MSG_ATTACK_JUNK_INFO',157); // The field "$FLD" contained... +define('MSG_ARESP_EMPTY',158); // The autoresponse... +define('MSG_LOG_RECAPTCHA',159); // reCaptcha process failed... + +define('MSG_URL_PARSE',160); // URL parse failed +define('MSG_URL_SCHEME',161); // Unsupported URL scheme... +define('MSG_SOCKET',162); // Socket error ... +define('MSG_GETURL_OPEN',163); // Open URL failed: ... +define('MSG_RESOLVE',164); // Cannot resolve... + +define('MSG_FORM_OK',170); // Form Submission Succeeded +define('MSG_FORM_ERROR',171); // Form Submission Error +define('MSG_GET_DISALLOWED',172); // GET method has... +define('MSG_INVALID_SENDER',173); // The form has specified an invalid sender +define('MSG_SET_SENDER_FROM_EMAIL',174); // SET_SENDER_FROM_EMAIL is no longer supported +// +// The following are PHP's file upload error messages +// +define('MSG_FILE_UPLOAD_ERR_UNK',180); // Unknown error code. +define('MSG_FILE_UPLOAD_ERR1',181); // The uploaded file exceeds the upload_max_filesize directive in php.ini. +define('MSG_FILE_UPLOAD_ERR2',182); // The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form. +define('MSG_FILE_UPLOAD_ERR3',183); // The uploaded file was only partially uploaded. +define('MSG_FILE_UPLOAD_ERR4',184); // No file was uploaded. +define('MSG_FILE_UPLOAD_ERR6',186); // Missing a temporary folder. +define('MSG_FILE_UPLOAD_ERR7',187); // Failed to write file to disk. +define('MSG_FILE_UPLOAD_ERR8',188); // File upload stopped by extension. +define('MSG_FILE_UPLOAD_SIZE',189); // Uploaded file "$NAME" is too big... (not a PHP error code - internal maximum file size error) +define('MSG_POST_SIZE_LIMIT',190); // Your form submission exceeds the server's configured size limit. +// +// following are for derive_fields functions +// +define('MSG_DER_FUNC_ERROR',200); // derive_fields: invalid function.... +define('MSG_DER_FUNC_SIZE_FMT',201); // function 'size' requires.... +define('MSG_DER_FUNC_IF_FMT',202); // function 'if' requires.... +define('MSG_DER_FUNC_NEXTNUM_FMT',203); // function 'nextnum' requires.... +define('MSG_DER_FUNC_EXT_FMT',204); // function 'ext' requires.... +define('MSG_DER_FUNC1_FMT',205); // function 'FUNC' requires.... +define('MSG_DER_FUNC_SUBSTR_FMT',206); // function 'substr' requires.... + +define('MSG_USER_ATTACK_JUNK',220); // The following input ... +define('MSG_USER_ATTACK_REV_CAP',221); // Your input ... +define('MSG_USER_ATTACK_DUP',222); // You have ... +define('MSG_USER_ATTACK_MANY_URLS',223); // Your input ... +define('MSG_USER_ATTACK_MANY_URL_FIELDS',224); // Your input ... + +define('MSG_INVALID_EMAIL',230); // The email address...is invalid + +// +// The following messages are no longer used +// +define('MSG_FLD_NOTFOUND', 900); + + +// @formatter:on +// Jump to: + +// +// Return true if using the built-in language +// +/** @noinspection PhpUnused */ +function IsBuiltInLanguage() +{ + global $sLangID; + + return (strpos($sLangID,"builtin") !== false); +} + +$sSavePath = ""; +$bPathSaved = false; +// +// Set include path to include the given directory. +// +function AddIncludePath($s_dir = ".") +{ + global $sSavePath,$bPathSaved; + + $s_path = ini_get('include_path'); + $i_path_len = strlen($s_path); + $s_sep = IsServerWindows() ? ";" : ":"; // get path separator + // + // look for it in the include_path + // + $b_found = false; + $i_pos = 0; + $i_len = strlen($s_dir); + while (!$b_found && ($i_pos = strpos($s_path,$s_dir,$i_pos)) !== false) { + if ($i_pos == 0) { + if ($i_len == $i_path_len) { + $b_found = true; + } // the path only has $s_dir + elseif ($s_path[$i_len] == $s_sep) { + $b_found = true; + } + } elseif ($s_path[$i_pos - 1] == $s_sep && + ($i_pos + $i_len == $i_path_len || + $s_path[$i_pos + $i_len] == $s_sep) + ) { + $b_found = true; + } + if (!$b_found) { + $i_pos++; + } + } + if (!$b_found) { + // + // allow multiple calls, but only store the original path once + // + if (!$bPathSaved) { + $sSavePath = $s_path; + } + if (empty($s_path)) { + $s_path = $s_dir; + } else + // + // prepend the directory + // + { + $s_path = $s_dir . $s_sep . $s_path; + } + ini_set('include_path',$s_path); + $bPathSaved = true; + } +} + +// +// Reset the include path after a call to AddIncludePath. +// +function ResetIncludePath() +{ + global $sSavePath,$bPathSaved; + + if ($bPathSaved) { + ini_set('include_path',$sSavePath); + $bPathSaved = false; + } +} + +// +// Load a language file +// +function LoadLanguageFile() +{ + global $aMessages,$sLangID,$sHTMLCharSet; + + AddIncludePath(); + if (includeFileExists("language.inc.php")) { + include("language.inc.php"); + } else { + if (includeFileExists("language.inc")) { + include("language.inc"); + } + } + + ResetIncludePath(); + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + header("Content-Type: text/html; charset=$sHTMLCharSet"); + } +} + +// +// Load the messages array from the default language, and then +// override with an optional language file. +// Note: all messages get the MNUM parameter sent which they can use. +// If they don't use it, the message number is appended. +// +function LoadBuiltinLanguage() +{ + global $aMessages,$sLangID; + + $sLangID = "English (builtin)"; + // MSG_SCRIPT_VERSION is shown if the PHP version is too old to run + // FormMail + // Parameters: + // $PHPREQ is the minimum required PHP version + // $PHPVERS is the version the server currently has installed. + $aMessages[MSG_SCRIPT_VERSION] = 'This script requires at least PHP version ' . + '$PHPREQ. You have PHP version $PHPVERS.'; + + // MSG_END_VERS_CHK is sent at the end of an Alert message when + // FormMail detects that there's a newer version available + // Parameters: none + $aMessages[MSG_END_VERS_CHK] = '***************************************************\n' . + 'If you are happy with your current version and want\n' . + 'to stop these reminders, edit formmail.php and\n' . + 'set CHECK_FOR_NEW_VERSION to false.\n' . + '***************************************************\n'; + + // MSG_VERS_CHK is sent in an Alert message when + // FormMail detects that there's a newer version available + // Parameters: + // $TECTITE the website to go to + // $FM_VERS the current FormMail version + // $NEWVERS the new FormMail version that's available + $aMessages[MSG_VERS_CHK] = 'A later version of FormMail is available from $TECTITE.\n' . + 'You are currently using version $FM_VERS.\n' . + 'The new version available is $NEWVERS.\n'; + + // MSG_CHK_FILE_ERROR is sent in an Alert message when + // FormMail cannot create a file to record the time of version check. + // Parameters: + // $FILE the file name that could not be created + // $ERROR the actual error message + $aMessages[MSG_CHK_FILE_ERROR] = 'Unable to create check file "$FILE": $ERROR'; + + // MSG_UNK_VALUE_SPEC is sent in an Alert message when + // a form uses an unknown value specification in derive_fields. + // Parameters: + // $SPEC the unknown value specification + // $MSG additional message + $aMessages[MSG_UNK_VALUE_SPEC] = 'derive_fields: unknown value specification ' . + '"$SPEC"$MSG'; + + // MSG_INV_VALUE_SPEC is sent in an Alert message when + // a form uses a value specification in derive_fields that's + // formatted incorrectly (missing terminating '%') + // Parameters: + // $SPEC the invalid value specification + $aMessages[MSG_INV_VALUE_SPEC] = 'derive_fields: invalid value specification ' . + '"$SPEC" (possibly missing a "%")'; + + // MSG_DERIVED_INVALID is sent in an Alert message when + // a form's derive_fields setting has errors + // Parameters: none + // A list of errors is appended on separate lines + $aMessages[MSG_DERIVED_INVALID] = 'Some derive_fields specifications are invalid $MNUM:\n'; + + // MSG_INT_FORM_ERROR is sent in an Alert message and displayed + // to the form user + // Parameters: none + $aMessages[MSG_INT_FORM_ERROR] = 'Internal form error'; + + // MSG_OPTIONS_INVALID is sent in an Alert message when + // a form's options settings are invalid. This applies to + // mail_options, filter_options, crm_options, and autorespond + // Parameters: + // $OPT the name of the options field + // A list of errors is appended on separate lines + $aMessages[MSG_OPTIONS_INVALID] = 'Some $OPT settings are undefined $MNUM:\n'; + + // MSG_PLSWAIT_REDIR is shown to the user for a redirect + // with JavaScript + // Parameters: none + $aMessages[MSG_PLSWAIT_REDIR] = 'Please wait while you are redirected...'; + + // MSG_IFNOT_REDIR is shown to the user for a redirect + // with JavaScript + // Parameters: + // $URL the URL to redirect to + $aMessages[MSG_IFNOT_REDIR] = 'If you are not automatically redirected, ' . + 'please click here.'; + + // MSG_PEAR_OBJ is shown to the user if the PEAR Mail object + // cannot be created + // Parameters: none + $aMessages[MSG_PEAR_OBJ] = 'Failed to create PEAR Mail object'; + + // MSG_PEAR_ERROR is sent in an Alert message if the PEAR Mail processing + // reports an error + // Parameters: + // $MSG the error message from PEAR + $aMessages[MSG_PEAR_ERROR] = 'PEAR Mail error: $MSG'; + + // MSG_NO_FOPT_ADDR is sent in an Alert message SendMailFOption is + // specified in the form and no email address has been provided + // Parameters: none + $aMessages[MSG_NO_FOPT_ADDR] = 'You have specified "SendMailFOption" in your ' . + 'form, but there is no email address to use'; + + // MSG_MORE_INFO is sent in an Alert message on a line by itself, just + // before extra information about the FormMail processing that may have + // led to the alert message + // Parameters: none + $aMessages[MSG_MORE_INFO] = 'More information:'; + + // MSG_INFO_STOPPED is sent in an Alert message to say that extra + // alert information has been suppressed because of potential security + // problems with showing it. + // Parameters: none + $aMessages[MSG_INFO_STOPPED] = '(Extra alert information suppressed for ' . + 'security purposes. $MNUM)'; + + // MSG_FM_ALERT is sent as the subject line of an Alert message + // Parameters: none + $aMessages[MSG_FM_ALERT] = 'FormMail alert'; + + // MSG_FM_ERROR is sent as the subject line of an Alert message + // Parameters: none + $aMessages[MSG_FM_ERROR] = 'FormMail script error'; + + // MSG_FM_ERROR_LINE is sent in an Alert message on a + // separate line to introduce the actual error message + // Parameters: none + $aMessages[MSG_FM_ERROR_LINE] = 'The following error occurred in FormMail $MNUM:'; + + // MSG_USERDATA_STOPPED is sent in an Alert message to say that the + // user's data has been suppressed because of potential security + // problems with showing it. + // Parameters: none + $aMessages[MSG_USERDATA_STOPPED] = '(User data suppressed for security ' . + 'purposes. $MNUM)'; + + // MSG_FILTERED is sent in an Alert message to show what filter + // has been used on the message + // Parameters: + // $FILTER the name of the filter + $aMessages[MSG_FILTERED] = 'This alert has been filtered through "$FILTER" ' . + 'for security purposes.'; + + // MSG_TEMPLATES is sent in an Alert message when a form tries + // to use a template, but templates have not been configured in + // formmail.php + // Parameters: none + $aMessages[MSG_TEMPLATES] = 'You must set either TEMPLATEDIR or TEMPLATEURL ' . + 'in formmail.php before you can specify ' . + 'templates in your forms.'; + + // MSG_OPEN_TEMPLATE is sent in an Alert message when FormMail cannot + // open a template file + // Parameters: + // $NAME the name of the template file + // $ERROR information about the error + $aMessages[MSG_OPEN_TEMPLATE] = 'Failed to open template "$NAME" $MNUM: $ERROR'; + + // MSG_ERROR_PROC is shown to the user as part of an error + // page. This message introduces the error. + // Parameters: none + $aMessages[MSG_ERROR_PROC] = 'An error occurred while processing the ' . + 'form $MNUM.\n\n'; + + // MSG_ALERT_DONE is shown to the user as part of an error + // page if an Alert message has been sent to the website owner. + // Parameters: + // SERVER the name of the server (website) + $aMessages[MSG_ALERT_DONE] = 'The staff at $SERVER have been alerted to the error $MNUM.\n'; + + // MSG_PLS_CONTACT is shown to the user as part of an error + // page if an Alert message could *not* be sent to the website owner. + // Parameters: + // SERVER the name of the server (website) + $aMessages[MSG_PLS_CONTACT] = 'Please contact us ($SERVER) directly since this form ' . + 'is not working $MNUM.\n'; + + // MSG_APOLOGY is shown to the user as part of an error + // page as an apology for a problem with the form. + // Parameters: + // SERVER the name of the server (website) + $aMessages[MSG_APOLOGY] = '$SERVER apologizes for any inconvenience this error ' . + 'may have caused.'; + + // MSG_ABOUT_FORMMAIL is shown to the user at the foot of pages + // generated by FormMail (e.g. the default "Thanks" page and default + // error page). + // Parameters: + // $FM_VERS the FormMail version number + // $TECTITE www.tectite.com + $aMessages[MSG_ABOUT_FORMMAIL] = 'Your form submission was processed by ' . + 'FormMail ' . + '($FM_VERS), a PHP script available from ' . + '$TECTITE.'; + + // MSG_PREG_FAILED is sent in an Alert message if the TectiteCRM + // system failed to return the expected result. + // Parameters: none + $aMessages[MSG_PREG_FAILED] = 'preg_match_all failed in FindCRMFields'; + + // MSG_URL_INVALID is sent in an Alert message if the specified + // URL for TectiteCRM is not valid according to the TARGET_URLS + // configuration setting + // Parameters: + // $URL the invalid URL + $aMessages[MSG_URL_INVALID] = 'The URL "$URL" to access the Customer ' . + 'Relationship Management System is not valid ' . + '(see TARGET_URLS in formmail.php)'; + + // MSG_URL_OPEN is sent in an Alert message if the specified + // URL for TectiteCRM cannot be opened + // Parameters: + // $URL the invalid URL + // $ERROR information about the error + $aMessages[MSG_URL_OPEN] = 'Failed to open Customer Relationship ' . + 'Management System URL "$URL" $MNUM: $ERROR'; + + // MSG_CRM_FAILED is sent in an Alert message if the TectiteCRM + // system doesn't return an OK message + // Parameters: + // $URL the invalid URL + // $MSG more information + $aMessages[MSG_CRM_FAILED] = 'Failure report from Customer Relationship ' . + 'Management System (url="$URL") $MNUM: $MSG'; + + // MSG_CRM_FORM_ERROR is shown to the user if the information + // passed to TectiteCRM was not accepted + // Parameters: none + $aMessages[MSG_CRM_FORM_ERROR] = 'Your form submission was not accepted'; + + // MSG_AND is shown to the user; it shows two items separated + // by "and" + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_AND] = '"$ITEM1" and "$ITEM2"'; + + // MSG_OR is shown to the user; it shows two items separated + // by "or" + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_OR] = '"$ITEM1" or "$ITEM2"'; + + // MSG_NOT_BOTH is shown to the user; it shows two items that must + // be specified together + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_NOT_BOTH] = 'not both "$ITEM1" and "$ITEM2"'; + + // MSG_XOR is shown to the user; it shows two items that must + // not be specified together + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_XOR] = '"$ITEM1" or "$ITEM2" (but not both)'; + + // MSG_IS_SAME_AS is shown to the user; it shows two items that must + // not be the same value + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_IS_SAME_AS] = '"$ITEM1" is the same as "$ITEM2"'; + + // MSG_IS_NOT_SAME_AS is shown to the user; it shows two items that must + // be the same value + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_IS_NOT_SAME_AS] = '"$ITEM1" is not the same as "$ITEM2"'; + + // MSG_REQD_OPER is sent in an Alert message when an unknown + // operator has been used in a "required" specification + // Parameters: + // $OPER the unknown operator + $aMessages[MSG_REQD_OPER] = 'Operator "$OPER" is not valid for "required"'; + + // MSG_PAT_FAILED is sent in an Alert message when a "conditions" pattern + // match has not matched anything (this isn't necessarily an error) + // Parameters: + // $OPER the "conditions" operator + // $PAT the "conditions" pattern + // $VALUE the value that was searched + $aMessages[MSG_PAT_FAILED] = 'Pattern operator "$OPER" failed: pattern ' . + '"$PAT", value searched was "$VALUE".'; + + // MSG_COND_OPER is sent in an Alert message when a "conditions" + // operator is not value + // Parameters: + // $OPER the "conditions" operator + $aMessages[MSG_COND_OPER] = 'Operator "$OPER" is not valid for "conditions"'; + + // MSG_INV_COND is sent in an Alert message when a "conditions" + // field is not valid + // Parameters: + // FLD the field name + $aMessages[MSG_INV_COND] = 'Invalid "conditions" field "$FLD" - not a string or array.'; + + // MSG_COND_CHARS is sent in an Alert message when a "conditions" + // field is missing the mandatory first 2 characters (the separators) + // Parameters: + // FLD the field name + // COND the conditions field value + $aMessages[MSG_COND_CHARS] = 'The conditions field "$FLD" is not valid. ' . + 'You must provide the two separator ' . + 'characters at the beginning. You had "$COND".'; + + // MSG_COND_INVALID is sent in an Alert message when a "conditions" + // field has the wrong format + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the internal separator character for the field. + $aMessages[MSG_COND_INVALID] = 'The conditions field "$FLD" is not valid. ' . + 'There must be at least 5 components ' . + 'separated by "$SEP". Your value was "$COND".'; + + // MSG_COND_TEST_LONG is sent in an Alert message when a "conditions" + // TEST value has too many components + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the list separator character for the field. + $aMessages[MSG_COND_TEST_LONG] = 'Field "$FLD" has too many components for ' . + 'a "TEST" command: "$COND".\nAre you missing ' . + 'a "$SEP"?'; + + // MSG_COND_IF_SHORT is sent in an Alert message when a "conditions" + // IF value has too few components + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the internal separator character for the field. + $aMessages[MSG_COND_IF_SHORT] = 'Field "$FLD" has too few components for ' . + 'an "IF" command: "$COND".\nThere must be ' . + 'at least 6 components separated by "$SEP"'; + + // MSG_COND_IF_LONG is sent in an Alert message when a "conditions" + // IF value has too many components + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the list separator character for the field. + $aMessages[MSG_COND_IF_LONG] = 'Field "$FLD" has too many components for ' . + 'an "IF" command: "$COND".\nAre you missing ' . + 'a "$SEP"?'; + + // MSG_COND_UNK is sent in an Alert message when a "conditions" + // value has an unknown command + // Parameters: + // FLD the field name + // COND the conditions field value + // CMD the unknown command + $aMessages[MSG_COND_UNK] = 'Field "$FLD" has an unknown command word ' . + '"$CMD": "$COND".'; + + // MSG_MISSING is sent in an Alert message when + // a socket filter is incorrectly defined + // Parameters: + // ITEM the missing item + $aMessages[MSG_MISSING] = 'Missing "$ITEM"'; + + // MSG_NEED_ARRAY is sent in an Alert message when + // a socket filter is incorrectly defined + // Parameters: + // ITEM the item that should be an array + $aMessages[MSG_NEED_ARRAY] = '"$ITEM" must be an array'; + + // MSG_SUBM_FAILED is shown to the user when an internal error + // as occurred and that error is not to be shown + // Parameters: none + $aMessages[MSG_SUBM_FAILED] = 'Your form submission has failed due to ' . + 'an error on our server.'; + + // MSG_FILTER_WRONG is sent in an Alert message when + // a socket filter is incorrectly defined + // Parameters: + // FILTER the filter name + // ERRORS a string containing a list of errors + $aMessages[MSG_FILTER_WRONG] = 'Filter "$FILTER" is not properly defined: ' . + '$ERRORS'; + + // MSG_FILTER_CONNECT is sent in an Alert message when FormMail + // cannot connect to a socket filter + // Parameters: + // FILTER the filter name + // SITE the site + // ERRNUM socket error number + // ERRSTR socket error message + $aMessages[MSG_FILTER_CONNECT] = 'Could not connect to site "$SITE" ' . + 'for filter "$FILTER" ($ERRNUM): $ERRSTR'; + + // MSG_FILTER_PARAM is sent in an Alert message when a socket + // filter has an invalid parameter specification + // Parameters: + // FILTER the filter name + // NUM parameter number + // NAME parameter name + $aMessages[MSG_FILTER_PARAM] = 'Filter "$FILTER" has invalid parameter ' . + '#$NUM: no "$NAME"'; + + // MSG_FILTER_OPEN_FILE is sent in an Alert message when a socket + // filter cannot open the required file + // Parameters: + // FILTER the filter name + // FILE the file that could not be opened + // ERROR the error message + $aMessages[MSG_FILTER_OPEN_FILE] = 'Filter "$FILTER" cannot open file ' . + '"$FILE": $ERROR'; + + // MSG_FILTER_FILE_ERROR is sent in an Alert message when a socket + // filter gets an error message during reading a file + // Parameters: + // FILTER the filter name + // FILE the file that could not be opened + // ERROR the error message + // NLINES the number of lines that were read successfully + $aMessages[MSG_FILTER_FILE_ERROR] = 'Filter "$FILTER": read error on file ' . + '"$FILE" after $NLINES lines: $ERROR'; + + // MSG_FILTER_READ_ERROR is sent in an Alert message when a socket + // filter gets an error during reading from the socket + // Parameters: + // FILTER the filter name + // ERROR the error message + $aMessages[MSG_FILTER_READ_ERROR] = 'Filter "$FILTER" failed: read error: ' . + '$ERROR'; + + // MSG_FILTER_NOT_OK is sent in an Alert message when a socket + // filter fails to return the agreed __OK__ indicator + // Parameters: + // FILTER the filter name + // DATA the data returned from the filter + $aMessages[MSG_FILTER_NOT_OK] = 'Filter "$FILTER" failed (missing ' . + '__OK__ line): $DATA'; + + // MSG_FILTER_UNK is sent in an Alert message + // when an unknown filter is specified by a form + // Parameters: + // FILTER the filter name + $aMessages[MSG_FILTER_UNK] = 'Unknown filter "$FILTER"'; + + // MSG_FILTER_CHDIR is sent in an Alert message + // when FormMail cannot change to the filter's directory + // Parameters: + // FILTER the filter name + // DIR the directory name + // ERROR an error message from the system + $aMessages[MSG_FILTER_CHDIR] = 'Cannot chdir to "$DIR" to run filter ' . + '"$FILTER": $ERROR'; + + // MSG_FILTER_NOTFOUND is sent in an Alert message + // when FormMail cannot execute the filter + // Parameters: + // FILTER the filter name + // CMD the command line being executed + // ERROR an error message from the system + $aMessages[MSG_FILTER_NOTFOUND] = 'Cannot execute filter "$FILTER" with ' . + 'command "$CMD": $ERROR'; + + // MSG_FILTER_ERROR is sent in an Alert message + // when a filter returns a non-zero status + // Parameters: + // FILTER the filter name + // ERROR an error message from the system + // STATUS the status return from the command + $aMessages[MSG_FILTER_ERROR] = 'Filter "$FILTER" failed (status $STATUS): ' . + '$ERROR'; + + // MSG_SPARE is a spare message + $aMessages[MSG_SPARE] = ''; + + // MSG_TEMPLATE_ERRORS is sent as part of an Alert message + // when a template has generated some errors. The message + // should end with a new line and the actual errors are + // output after it. + // Parameters: + // NAME the template name + $aMessages[MSG_TEMPLATE_ERRORS] = 'Template "$NAME" caused the ' . + 'following errors $MNUM:\n'; + + // MSG_TEMPLATE_FAILED is sent in an Alert message + // when processing a template has failed. + // Parameters: + // NAME the template name + $aMessages[MSG_TEMPLATE_FAILED] = 'Failed to process template "$NAME"'; + + // MSG_MIME_PREAMBLE is sent in the preamble of MIME emails + // Parameters: none + $aMessages[MSG_MIME_PREAMBLE] = '(Your mail reader should not show this ' . + 'text.\nIf it does you may need to ' . + 'upgrade to more modern software.)'; + + // MSG_MIME_HTML is sent in the preamble of HTML emails + // Parameters: + // NAME the template name + $aMessages[MSG_MIME_HTML] = 'This message has been generated by FormMail ' . + 'using an HTML template\ncalled "$NAME". The ' . + 'raw text of the form results\nhas been ' . + 'included below, but your mail reader should ' . + 'display the HTML\nversion only (unless it\'s ' . + 'not capable of doing so).'; + + // MSG_FILE_OPEN_ERROR is sent in an Alert message when FormMail + // cannot open a file + // Parameters: + // NAME the file name + // TYPE the type of file + // ERROR the system error message + $aMessages[MSG_FILE_OPEN_ERROR] = 'Failed to open $TYPE file "$NAME": $ERROR'; + + // MSG_ATTACH_DATA is sent in an Alert message when the file + // attachment through 'data' has gone wrong. + // Parameters: none + $aMessages[MSG_ATTACH_DATA] = 'Internal error: AttachFile requires ' . + '"tmp_name" or "data"'; + + // MSG_PHP_HTML_TEMPLATES is sent in an Alert message when an + // HTML template is used but the PHP version is too old. (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_HTML_TEMPLATES] = ''; + + // MSG_PHP_FILE_UPLOADS is sent in an Alert message when + // file upload is used but the PHP version is too old. (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_FILE_UPLOADS] = ''; + + // MSG_FILE_UPLOAD is sent in an Alert message when + // file upload is attempted but FormMail is not configured to allow + // it + // Parameters: none + $aMessages[MSG_FILE_UPLOAD] = 'File upload attempt ignored'; + + // MSG_FILE_UPLOAD_ATTACK is sent in an Alert message when + // possible file upload attack is detected + // Parameters: + // NAME file name + // TEMP temporary file name + // FLD name of the file upload field + $aMessages[MSG_FILE_UPLOAD_ATTACK] = 'Possible file upload attack ' . + 'detected: field="$FLD", name="$NAME" ' . + 'temp name="$TEMP"'; + + // MSG_PHP_PLAIN_TEMPLATES is sent in an Alert message when a + // Plain template is used but the PHP version is too old. (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_PLAIN_TEMPLATES] = ''; + + // MSG_ATTACH_NAME is sent in an Alert message when a + // the form uses the Attach feature without specifying a file name + // Parameters: none + $aMessages[MSG_ATTACH_NAME] = 'filter_options: Attach must contain a name ' . + '(e.g. Attach=data.txt)'; + + // MSG_PHP_BCC is sent in an Alert message when a + // the form uses the BCC feature and the PHP version may not support it + // (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_BCC] = ''; + + // MSG_CSVCOLUMNS is sent in an Alert message when a csvcolumns field + // is not correct + // Parameters: + // $VALUE the csvcolumns field value + $aMessages[MSG_CSVCOLUMNS] = 'The "csvcolumns" setting is not ' . + 'valid: "$VALUE"'; + + // MSG_CSVFILE is sent in an Alert message when a csvfile field + // is not correct + // Parameters: + // $VALUE the csvfile field value + $aMessages[MSG_CSVFILE] = 'The "csvfile" setting is not valid: "$VALUE"'; + + // MSG_TARG_EMAIL_PAT_START is sent in an Alert message when a + // $TARGET_EMAIL pattern is insecure because of a missing '^' + // at the beginning + // Parameters: + // $PAT the pattern + $aMessages[MSG_TARG_EMAIL_PAT_START] = 'Warning: Your TARGET_EMAIL pattern ' . + '"$PAT" is missing a ^ at the ' . + 'beginning.'; + + // MSG_TARG_EMAIL_PAT_END is sent in an Alert message when a + // $TARGET_EMAIL pattern is insecure because of a missing '$' + // at the end + // Parameters: + // $PAT the pattern + $aMessages[MSG_TARG_EMAIL_PAT_END] = 'Warning: Your TARGET_EMAIL pattern ' . + '"$PAT" is missing a $ at the end.'; + + // MSG_CONFIG_WARN is sent in an Alert message when the FormMail + // configuration may have some problems. The messages are + // passed on separate lines, so the line terminations below + // are important. + // Parameters: + // $MESGS lines of messages + $aMessages[MSG_CONFIG_WARN] = 'The following potential problems were found ' . + 'in your configuration:\n$MESGS\n\n' . + 'These are not necessarily errors, but you ' . + 'should review the documentation\n' . + 'inside formmail.php. If you are sure your ' . + 'configuration is correct\n' . + 'you can disable the above messages by ' . + 'changing the CONFIG_CHECK settings.'; + + // MSG_PHP_AUTORESP is sent in an Alert message when the PHP version + // does not support autoresponding (deprecated) + // Parameters: + // $PHPVERS current PHP version + $aMessages[MSG_PHP_AUTORESP] = ''; + + // MSG_ALERT is the test alert message (formmail.php?testalert=1) + // Parameters: + // $LANG the language ID + // $PHPVERS PHP version + // $FM_VERS FormMail version + // $SERVER server type + // $DOCUMENT_ROOT PHP's DOCUMENT_ROOT value + // $SCRIPT_FILENAME PHP's SCRIPT_FILENAME value + // $PATH_TRANSLATED PHP's PATH_TRANSLATED value + // $REAL_DOCUMENT_ROOT the REAL_DOCUMENT_ROOT value + $aMessages[MSG_ALERT] = 'This is a test alert message $MNUM\n' . + 'Loaded language is $LANG\n' . + 'PHP version is $PHPVERS\n' . + 'FormMail version is $FM_VERS\n' . + 'Server type: $SERVER\n' . + '\n' . + 'DOCUMENT_ROOT: $DOCUMENT_ROOT\n' . + 'SCRIPT_FILENAME: $SCRIPT_FILENAME\n' . + 'PATH_TRANSLATED: $PATH_TRANSLATED\n' . + 'REAL_DOCUMENT_ROOT: $REAL_DOCUMENT_ROOT'; + + // MSG_NO_DEF_ALERT is displayed if you use the testalert feature + // and no DEF_ALERT setting has been provided. + // Parameters: none + $aMessages[MSG_NO_DEF_ALERT] = 'No DEF_ALERT value has been set.'; + + // MSG_TEST_SENT is displayed if when use the testalert feature + // Parameters: none + $aMessages[MSG_TEST_SENT] = 'Test message sent. Check your email.'; + + // MSG_TEST_FAILED is displayed if when use the testalert feature + // and the mail sending fails. + // Parameters: none + $aMessages[MSG_TEST_FAILED] = 'FAILED to send alert message. Check your ' . + 'server error logs.'; + + // MSG_NO_DATA_PAGE is the page that's displayed if the user + // just opens the URL to FormMail directly. + // Parameters: none + $aMessages[MSG_NO_DATA_PAGE] = 'This URL is a Form submission program.\n' . + 'It appears the form is not working ' . + 'correctly as there was no data found.\n' . + 'You\'re not supposed to browse to this ' . + 'URL; it should be accessed from a form.'; + + // MSG_REQD_ERROR is displayed to the user as a default error + // message when they haven't supplied some required fields + // Parameters: none + $aMessages[MSG_REQD_ERROR] = 'The form required some values that you ' . + 'did not seem to provide.'; + + // MSG_COND_ERROR is displayed to the user as a default error + // message when some form conditions have failed + // Parameters: none + $aMessages[MSG_COND_ERROR] = 'Some of the values you provided are not valid.'; + + // MSG_CRM_FAILURE is displayed to the user when submission + // to the CRM has failed. + // Parameters: + // $URL the URL that was used + // $DATA data returned from the CRM + $aMessages[MSG_CRM_FAILURE] = 'The form submission did not succeed due to ' . + 'a CRM failure. URL was \'$URL\'. ' . + 'Returned CRM data:\n$DATA'; + + // MSG_FOPTION_WARN is sent in an Alert message when the form + // uses the superseded SendMailFOption feature + // Parameters: + // $LINE line number for SENDMAIL_F_OPTION + $aMessages[MSG_FOPTION_WARN] = 'Warning: You\'ve used SendMailFOption in ' . + '"mail_options" in your form. This has been ' . + 'superseded with a configuration setting ' . + 'inside formmail.php. Please update your ' . + 'formmail.php configuration (look for ' . + 'SENDMAIL_F_OPTION on line $LINE) and set ' . + 'it to "true", then remove SendMailFOption ' . + 'from your form(s).'; + + // MSG_NO_ACTIONS is sent in an Alert message when there is no + // action to perform or email address to send to + // Parameters: none + $aMessages[MSG_NO_ACTIONS] = 'The form has an internal error - no actions ' . + 'or recipients were specified.'; + + // MSG_NO_RECIP is sent in an Alert message when there are no + // valid recipients to send to + // Parameters: none + $aMessages[MSG_NO_RECIP] = 'The form has an internal error - no valid ' . + 'recipients were specified.'; + + // MSG_INV_EMAIL is sent in an Alert message when there are errors + // in the email addresses specified in the form + // Parameters: + // $ERRORS list of errors + $aMessages[MSG_INV_EMAIL] = 'Invalid email addresses were specified ' . + 'in the form $MNUM:\n$ERRORS'; + + // MSG_FAILED_SEND is sent in an Alert message when the mail sending fails. + // Parameters: none + $aMessages[MSG_FAILED_SEND] = 'Failed to send email'; + + // MSG_ARESP_EMAIL is sent in an Alert message when + // no email address has been specified for an autoreponse + // Parameters: none + $aMessages[MSG_ARESP_EMAIL] = 'No "email" field was found. Autorespond ' . + 'requires the submitter\'s email address.'; + + // MSG_ARESP_SUBJ is the default subject for the auto response email + // Parameters: none + $aMessages[MSG_ARESP_SUBJ] = 'Your form submission'; + + // MSG_LOG_NO_VERIMG is written to the auto respond log file + // if no VerifyImgString session variable was found + // Parameters: none + $aMessages[MSG_LOG_NO_VERIMG] = 'No VerifyImgString or turing_string in session, ' . + 'no reverse CAPTCHA, no reCaptcha'; + + // MSG_ARESP_NO_AUTH is shown to the user + // if no VerifyImgString session variable was found + // Parameters: none + $aMessages[MSG_ARESP_NO_AUTH] = 'Failed to obtain authorization to send ' . + 'you email. This is probably a fault on ' . + 'the server.'; + + // MSG_LOG_NO_MATCH is written to the auto respond log file + // if the user's entry did not match the image verification + // Parameters: none + $aMessages[MSG_LOG_NO_MATCH] = 'User did not match image'; + + // MSG_LOG_RECAPTCHA is written to the auto respond log file + // if the reCaptcha process fails + // Parameters: + // ERR the reCaptcha error code + $aMessages[MSG_LOG_RECAPTCHA] = 'reCaptcha process failed ($ERR)'; + + // MSG_ARESP_NO_MATCH is shown to the user + // if the user's entry did not match the image verification + // Parameters: none + $aMessages[MSG_ARESP_NO_MATCH] = 'Your entry did not match the image'; + + // MSG_LOG_FAILED is written to the auto respond log file + // if the autoresponding failed + // Parameters: none + $aMessages[MSG_LOG_FAILED] = 'Failed'; + + // MSG_ARESP_FAILED is sent in an Alert message + // if the autoresponding failed + // Parameters: none + $aMessages[MSG_ARESP_FAILED] = 'Autoresponder failed'; + + // MSG_LOG_OK is written to the auto respond log file + // if the autoresponding succeeded + // Parameters: none + $aMessages[MSG_LOG_OK] = 'OK'; + + // MSG_THANKS_PAGE is the default page that's displayed if the + // submission is successful + // Parameters: none + $aMessages[MSG_THANKS_PAGE] = 'Thanks! We\'ve received your information ' . + 'and, if it\'s appropriate, we\'ll be in ' . + 'contact with you soon.'; + + // MSG_LOAD_MODULE is sent in an alert message if a module + // could not be loaded. + // Parameters: + // $FILE the file name + // $ERROR the error message + $aMessages[MSG_LOAD_MODULE] = 'Cannot load module from file \'$FILE\': $ERROR'; + + // MSG_LOAD_FMCOMPUTE is sent in an alert message if the form + // specifies at least one "fmcompute" field and the FMCompute + // module cannot be loaded. + // Parameters: + // $FILE the file name + // $ERROR the error message + $aMessages[MSG_LOAD_FMCOMPUTE] = 'Cannot load FMCompute module from file ' . + '\'$FILE\': $ERROR'; + + // MSG_REGISTER_MODULE is sent in an alert message if a module + // could not register with FMCompute + // Parameters: + // $NAME the name of the module + // $ERROR the error message + $aMessages[MSG_REGISTER_MODULE] = 'Cannot register module $NAME with ' . + 'FMCompute: $ERROR'; + + // MSG_COMP_PARSE is sent in an alert message if a parse error + // occurs in an fmcompute field + // Parameters: + // $CODE the code with an error + // $ERRORS the error messages + $aMessages[MSG_COMP_PARSE] = 'These parse errors occurred in the following ' . + 'code:\n$ERRORS\n$CODE'; + + // MSG_COMP_REG_DATA is sent in an alert message if FormMail cannot + // register a data field with the FMCompute module + // Parameters: + // $NAME the field name + // $ERROR the error message + $aMessages[MSG_COMP_REG_DATA] = 'Failed to register data field \'$NAME\': ' . + '$ERROR'; + + // MSG_COMP_ALERT is sent in an alert message if the FMCompute + // module has generated some alert messages. + // Parameters: + // $ALERTS the alerts + $aMessages[MSG_COMP_ALERT] = 'The following alert messages were reported ' . + 'from the FMCompute module: $ALERTS'; + + // MSG_COMP_DEBUG is sent in an alert message if the FMCompute + // module has generated some debug messages. + // Parameters: + // $DEBUG the alerts + $aMessages[MSG_COMP_DEBUG] = 'The following debug messages were reported ' . + 'from the FMCompute module: $DEBUG'; + + // MSG_COMP_EXEC is sent in an alert message if the FMCompute + // module has generated some error messages during execution + // Parameters: + // $ERRORS the errors + $aMessages[MSG_COMP_EXEC] = 'The following error messages were reported ' . + 'from the FMCompute module: $ERRORS'; + + // MSG_TEMPL_ALERT is sent in an alert message if Advanced Template + // Processing has generated some alert messages. + // Parameters: + // $ALERTS the alerts + $aMessages[MSG_TEMPL_ALERT] = 'The following alert messages were reported ' . + 'from the Advanced Template Processor: $ALERTS'; + + // MSG_TEMPL_DEBUG is sent in an alert message if Advanced Template + // Processing has generated some debug messages. + // Parameters: + // $DEBUG the alerts + $aMessages[MSG_TEMPL_DEBUG] = 'The following debug messages were reported ' . + 'from the Advanced Template Processor: $DEBUG'; + + // MSG_TEMPL_PROC is sent in an alert message if Advanced Template Processing + // has generated some error messages during processing + // Parameters: + // $ERRORS the errors + $aMessages[MSG_TEMPL_PROC] = 'The following error messages were reported ' . + 'from the Advanced Template Processor: $ERRORS'; + + // MSG_REG_FMCOMPUTE is sent in an Alert message when FormMail + // cannot register an external function with FMCompute. + // Parameters: + // FUNC the function that could not be registered + // ERROR the error message + $aMessages[MSG_REG_FMCOMPUTE] = 'Cannot register function "$FUNC" with ' . + 'FMCompute: $ERROR'; + + // MSG_USER_ERRORS is shown as part of a user error when an FMCompute + // has called the "UserError" function one or more times. + // Parameters: + // NONE + $aMessages[MSG_USER_ERRORS] = 'One or more errors occurred in your form submission'; + + // MSG_CALL_PARAM_COUNT is sent in an alert when a call to a FormMail + // function from FMCompute has the wrong number of parameters + // Parameters: + // FUNC the function name + // COUNT the actual number of parameters passed + $aMessages[MSG_CALL_PARAM_COUNT] = 'FMCompute called FormMail function ' . + '\'$FUNC\' with wrong number of ' . + 'parameters: $COUNT'; + + // MSG_CALL_UNK_FUNC is sent in an alert when FMCompute calls an + // unknown FormMail function + // Parameters: + // FUNC the function name + $aMessages[MSG_CALL_UNK_FUNC] = 'FMCompute called unknown FormMail function ' . + '\'$FUNC\''; + + // MSG_SAVE_FILE is sent in an alert when saving a file to + // the server has failed + // Parameters: + // FILE the source file name (usually a temporary file name) + // DEST the destination file name + // ERR the error message + $aMessages[MSG_SAVE_FILE] = 'Failed to save file \'$FILE\' to \'$DEST\': $ERR'; + + // MSG_SAVE_FILE_EXISTS is sent as part of an alert when saving a file to + // the repository ($FILE_REPOSITORY) has failed because the file + // already exists and FILE_OVERWRITE is set to false. + // Parameters: + // FILE the destination file name + $aMessages[MSG_SAVE_FILE_EXISTS] = 'Cannot save file to repository as this would ' . + 'overwrite \'$FILE\' and you have ' . + 'set FILE_OVERWRITE to false.'; + + // MSG_EMPTY_ADDRESSES is sent as part of an alert when a number of empty + // email addresses have been specified in recipients, cc, or bcc + // *and* there are no valid addresses provided + // in the list + // Parameters: + // COUNT the number of empty addresses + $aMessages[MSG_EMPTY_ADDRESSES] = '$COUNT empty addresses'; + + // MSG_CALL_INVALID_PARAM is sent in an alert when a call to a FormMail + // function from FMCompute has an invalid parameter + // Parameters: + // FUNC the function name + // PARAM the parameter number + // CORRECT information about correct values + $aMessages[MSG_CALL_INVALID_PARAM] = 'FMCompute called FormMail function ' . + '\'$FUNC\' with an invalid parameter ' . + 'number $PARAM. Correct values are: $CORRECT'; + + // MSG_INI_PARSE_WARN is sent in an alert when the INI file + // may have a syntax error and cannot be parsed. + // Parameters: + // FILE the file name + $aMessages[MSG_INI_PARSE_WARN] = 'Warning: your INI file \'$FILE\' appears ' . + 'to be empty. This may indicate a syntax error.'; + + // MSG_INI_PARSE_ERROR is shown as an error message when the INI file + // has a syntax error and cannot be parsed. + // Parameters: + // FILE the file name + $aMessages[MSG_INI_PARSE_ERROR] = 'The FormMail INI file \'$FILE\' has a syntax error'; + + // MSG_CHMOD is sent in an alert when changing the protection + // mode of a file to has failed + // Parameters: + // FILE the file name + // MODE the mode + // ERR the error message + $aMessages[MSG_CHMOD] = 'Failed to change protection mode of file \'$FILE\' ' . + 'to $MODE: $ERR'; + + // MSG_VERIFY_MISSING is shown to the user image verification string + // was not found + // Parameters: none + $aMessages[MSG_VERIFY_MISSING] = 'Image verification string missing. This' . + ' is probably a fault on the server.'; + + // MSG_VERIFY_MATCH is shown to the user + // if the user's entry did not match the image verification for the + // imgverify option + // Parameters: none + $aMessages[MSG_VERIFY_MATCH] = 'Your entry did not match the image'; + + // MSG_RECAPTCHA_MATCH is shown to the user + // if using the reCaptcha system and there was an error + // Parameters: + // ERR the error code from the reCaptcha API + $aMessages[MSG_RECAPTCHA_MATCH] = 'reCaptcha verification failed ($ERR)'; + + // MSG_FILE_NAMES_INVALID is sent in an Alert message when + // a form's file_names setting has errors + // Parameters: none + // A list of errors is appended on separate lines + $aMessages[MSG_FILE_NAMES_INVALID] = 'Some file_names specifications are invalid $MNUM:\n'; + + // MSG_FILE_NAMES_NOT_FILE is sent in an Alert message when + // a form's file_names setting refers to a file field that doesn't + // exist + // Parameters: + // NAME the name of the file field that doesn't exist + $aMessages[MSG_FILE_NAMES_NOT_FILE] = 'Your file_names specification has ' . + 'an error. \'$NAME\' is not the name ' . + 'of a file upload field\n'; + + // MSG_NEXT_PLUS_GOOD is sent in an alert message if the form is + // ambiguous and specifies both "next_form" and "good_url" or + // "good_template" + // Parameters: + // $WHICH the "good_" field that was specified + $aMessages[MSG_NEXT_PLUS_GOOD] = 'The form has specified both "next_form" ' . + 'and "$WHICH" fields - the action to ' . + 'to perform is ambiguous'; + + // MSG_MULTIFORM is sent in an Alert message when a form tries + // to use a multi-form template, but templates have not been configured in + // formmail.php + // Parameters: none + $aMessages[MSG_MULTIFORM] = 'You must set either MULTIFORMDIR or MULTIFORMURL ' . + 'in formmail.php before you can use ' . + 'multi-page forms.'; + + // MSG_MULTIFORM_FAILED is sent in an Alert message + // when processing a multi-page form template has failed. + // Parameters: + // NAME the template name + $aMessages[MSG_MULTIFORM_FAILED] = 'Failed to process multi-page form template "$NAME"'; + + // MSG_NEED_THIS_FORM is sent in an Alert message + // when a multi-page form does not specify the "this_form" field. + // Parameters: + // none + $aMessages[MSG_NEED_THIS_FORM] = 'Multi-page forms require "this_form" field'; + + // MSG_NO_PHP_SELF is sent in an Alert message + // when FormMail requires the "PHP_SELF" server variable and PHP is not + // providing it. + // Parameters: + // none + $aMessages[MSG_NO_PHP_SELF] = 'PHP on the server is not providing "PHP_SELF"'; + + // MSG_RETURN_URL_INVALID is sent in an Alert message + // when "this_form" is not a valid return URL. This occurs for + // multi-page forms. + // Parameters: + // URL the invalid URL + $aMessages[MSG_RETURN_URL_INVALID] = 'Return URL "$URL" is not valid'; + + // MSG_GO_BACK is sent in an Alert message + // when "multi_go_back" has been submitted but this isn't part of a + // multi-page form. + // Parameters: + // none + $aMessages[MSG_GO_BACK] = 'Cannot "go back" if not in a multi-page form ' . + 'sequence or at the first page of the form ' . + 'sequence'; + + // MSG_OPEN_URL is sent in an Alert message when a URL cannot + // be opened. + // Parameters: + // URL the invalid URL + // ERROR error message + $aMessages[MSG_OPEN_URL] = 'Cannot open URL "$URL": $ERROR'; + + // MSG_CANNOT_RETURN is sent in an Alert message when an invalid return + // request is made in a multi-page form sequence. + // Parameters: + // TO the requested page index + // TOPINDEX the top page index + $aMessages[MSG_CANNOT_RETURN] = 'Cannot return to page $TO. The top page ' . + 'index is $TOPINDEX'; + + // MSG_ATTACK_DETECTED is sent in an Alert message when an attack on + // the server has been detected + // Parameters: + // ATTACK name or description of the attack + // INFO more information about the attack + $aMessages[MSG_ATTACK_DETECTED] = 'Server attack "$ATTACK" detected. ' . + 'Your server is safe as FormMail is ' . + 'invulnerable to this attack. You can ' . + 'disable these messages by setting ' . + 'ALERT_ON_ATTACK_DETECTION to false ' . + 'in FormMail\'s configuration section.' . + '\nMore information:\n$INFO'; + + // MSG_ATTACK_PAGE is the contents of the browser page displayed to the + // user when an attack is detected + // Parameters: + // SERVER the name of the server (website) + // USERINFO details of the error + $aMessages[MSG_ATTACK_PAGE] = 'Your form submission has been rejected ' . + 'as it appears to be an abuse of our server (' . + '$SERVER).
' . + 'Our supplier of forms processing software has ' . + 'provided more information about this error.

' . + '$USERINFO'; + + // MSG_ATTACK_MIME_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the MIME attack + // Parameters: + // FLD name of the field + // CONTENT the invalid content found in the field + $aMessages[MSG_ATTACK_MIME_INFO] = 'The field "$FLD" contained invalid ' . + 'content "$CONTENT"'; + + // MSG_ATTACK_DUP_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Duplicate Data attack + // Parameters: + // FLD1 name of the first field + // FLD2 name of the second field + $aMessages[MSG_ATTACK_DUP_INFO] = 'The fields "$FLD1" and "$FLD2" contained ' . + 'duplicate data'; + + // MSG_ATTACK_SPEC_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Special Field attack + // Parameters: + // FLD name of the special field + $aMessages[MSG_ATTACK_SPEC_INFO] = 'Special field "$FLD" contained an email address'; + + // MSG_ATTACK_MANYURL_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Many URLs attack + // Parameters: + // FLD name of the field + // NUM number of URLs detected + $aMessages[MSG_ATTACK_MANYURL_INFO] = 'Field "$FLD" contained $NUM URLs'; + + // MSG_ATTACK_MANYFIELDS_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Many Fields with URLs + // attack + // Parameters: + // NUM number of fields detected with URLs + // FLDS list of fields with URLs in them + $aMessages[MSG_ATTACK_MANYFIELDS_INFO] = '$NUM fields contained URLs: $FLDS'; + + // MSG_REV_CAP is an error regarding the setting of ATTACK_DETECTION_REVERSE_CAPTCHA + // Parameters: none + $aMessages[MSG_REV_CAP] = 'ATTACK_DETECTION_REVERSE_CAPTCHA is not set correctly, ' . + 'and will be ignored. Please refer to the documentation ' . + 'to make the correct setting.'; + + // MSG_ATTACK_REV_CAP_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Reverse Captcha attack + // detection + // Parameters: + // FLD name of the field + // CONTENT the invalid content found in the field + $aMessages[MSG_ATTACK_REV_CAP_INFO] = 'The field "$FLD" contained unexpected ' . + 'content "$CONTENT".'; + + // MSG_ATTACK_JUNK_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the JUNK attack + // Parameters: + // FLD name of the field + // JUNK the junk that was found + $aMessages[MSG_ATTACK_JUNK_INFO] = 'The field "$FLD" contained junk ' . + 'data "$JUNK"'; + + // MSG_ARESP_EMPTY is an alert message sent when + // an autoresponse template or file is empty + // Parameters: + // TYPE the type of autoreponse requested + $aMessages[MSG_ARESP_EMPTY] = 'The autoresponse is empty. The form ' . + 'requested $TYPE'; + + // MSG_NEED_SCRATCH_PAD is an alert message when processing requires + // SCRATCH_PAD configuration for file upload processing. This occurs + // when you upload files in pages of a multi page form sequence. + // Parameters: + // none + $aMessages[MSG_NEED_SCRATCH_PAD] = 'You need to set SCRATCH_PAD in the ' . + 'configuration section to process ' . + 'uploaded files.'; + + // MSG_OPEN_SCRATCH_PAD is an alert message when the SCRATCH_PAD + // directory cannot be opened for cleanup. + // Parameters: + // DIR name of the directory + // ERR more error information + $aMessages[MSG_OPEN_SCRATCH_PAD] = 'Cannot open SCRATCH_PAD directory ' . + '"$DIR". Open failed: $ERR'; + + // MSG_NO_NEXT_NUM_FILE is an alert message when a form tries to + // use the %nextnum% derivation feature but you haven't + // setup FormMail's configuration correctly. + // Parameters: + // none + $aMessages[MSG_NO_NEXT_NUM_FILE] = 'You cannot use the %nextnum% feature: ' . + 'you have not configured NEXT_NUM_FILE'; + + // MSG_NEXT_NUM_FILE is an alert message when a form tries to + // use the %nextnum% derivation feature but the next number file cannot + // be processed. + // Parameters: + // FILE name of the file + // ACT action + // ERR more error information + $aMessages[MSG_NEXT_NUM_FILE] = 'Cannot $ACT next number file ' . + '\'$FILE\': $ERR'; + + // MSG_MULTI_UPLOAD is an alert message when processing of uploaded + // fails during a multi-page form sequence + // Parameters: + // none + $aMessages[MSG_MULTI_UPLOAD] = 'File upload processing failed during ' . + 'multi-page form processing.'; + + // MSG_URL_PARSE is an error message when a URL to be opened + // cannot be parsed + // Parameters: + // none + $aMessages[MSG_URL_PARSE] = 'Failed to parse URL'; + + // MSG_URL_SCHEME is an error message when a URL to be opened + // has an unsupported "scheme" value + // Parameters: + // SCHEME the scheme that was seen + $aMessages[MSG_URL_SCHEME] = 'Unsupported URL scheme "$SCHEME"'; + + // MSG_SOCKET is an error message when opening a socket for a URL + // fails + // Parameters: + // ERRNO the error code + // ERRSTR the error string + // PHPERR the value of $php_errormsg + $aMessages[MSG_SOCKET] = 'Socket error $ERRNO: $ERRSTR: $PHPERR'; + + // MSG_GETURL_OPEN is an error message when the web server reports + // a failure on opening a URL + // Parameters: + // STATUS the HTTP status value (number + string) + $aMessages[MSG_GETURL_OPEN] = 'Open URL failed: $STATUS URL=$URL'; + + // MSG_RESOLVE is an error message when a host name cannot be + // resolved to an IP address + // Parameters: + // NAME the host name that could not be resolved + $aMessages[MSG_RESOLVE] = 'Cannot resolve host name "$NAME"'; + + // MSG_FORM_OK is the page title for the default + // "thank you" page + // Parameters: + // none + $aMessages[MSG_FORM_OK] = 'Form Submission Succeeded'; + + // MSG_FORM_ERROR is the page title for default + // error pages + // Parameters: + // none + $aMessages[MSG_FORM_ERROR] = 'Form Submission Error'; + + // MSG_GET_DISALLOWED is the message shown when GET method is used + // but has been disabled. + // Parameters: + // none + $aMessages[MSG_GET_DISALLOWED] = 'GET method has been disabled. Forms must use ' . + 'the POST method. Alternatively, reconfigure ' . + 'FormMail to allow the GET method.'; + + // MSG_INVALID_SENDER is the alert message sent when an sender email address + // has been specified that is not a known or valid email address + // Parameters: + // LOC the location of the error + // EMAIL the invalid email address + $aMessages[MSG_INVALID_SENDER] = 'The form has specified an invalid sender email address ($EMAIL) in $LOC.'; + + // MSG_SET_SENDER_FROM_EMAIL is the configuration check message when SET_SENDER_FROM_EMAIL + // has been set to true in the configuration section. This feature is no longer available + // as can lead to a security problem. + // Parameters: + // none + $aMessages[MSG_SET_SENDER_FROM_EMAIL] = 'SET_SENDER_FROM_EMAIL is no longer supported and will be ignored.'; + + // MSG_FILE_UPLOAD_ERRn are the error messages corresponding to the + // PHP file upload error code n. + // Parameters: + // none + $aMessages[MSG_FILE_UPLOAD_ERR1] = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.'; + $aMessages[MSG_FILE_UPLOAD_ERR2] = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form.'; + $aMessages[MSG_FILE_UPLOAD_ERR3] = 'The uploaded file was only partially uploaded.'; + $aMessages[MSG_FILE_UPLOAD_ERR4] = 'No file was uploaded.'; + $aMessages[MSG_FILE_UPLOAD_ERR6] = 'Missing a temporary folder.'; + $aMessages[MSG_FILE_UPLOAD_ERR7] = 'Failed to write file to disk.'; + $aMessages[MSG_FILE_UPLOAD_ERR8] = 'File upload stopped by extension.'; + + // MSG_FILE_UPLOAD_ERR_UNK is displayed when an unknown error code + // is provided by PHP for a file upload + // Parameters: + // ERRNO the error code + $aMessages[MSG_FILE_UPLOAD_ERR_UNK] = 'Unknown file upload error code $ERRNO'; + + // MSG_FILE_UPLOAD_SIZE is displayed when an uploaded file exceeds + // the configured maximum size + // Parameters: + // NAME the uploaded file's name + // SIZE the size of the uploaded file + // MAX the maximum size that was exceeded + $aMessages[MSG_FILE_UPLOAD_SIZE] = 'Uploaded file "$NAME" is too big (' . + '$SIZE bytes). The maximum permitted ' . + 'size is $MAX kilobytes.'; + + // MSG_POST_SIZE_LIMIT is displayed when a form submission is larger + // than the configured maximum size in PHP + // Parameters: + // NAME the uploaded file's name + // SIZE the size of the uploaded file + // MAX the maximum size that was exceeded + $aMessages[MSG_POST_SIZE_LIMIT] = 'Your form submission exceeds the server\'s configured size limit.'; + + // MSG_DER_FUNC_ERROR is sent in an Alert message when + // a form uses a derive_fields function that's + // formatted incorrectly + // Parameters: + // $SPEC the invalid value specification + // $MSG a message describing the error or providing an example + $aMessages[MSG_DER_FUNC_ERROR] = 'derive_fields: invalid function specification ' . + '"$SPEC": $MSG'; + + // MSG_DER_FUNC_SIZE_FMT describes the right syntax for the "size" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_SIZE_FMT] = '"size" function requires this format: ' . + 'size(file_field)'; + + // MSG_DER_FUNC_IF_FMT describes the right syntax for the "if" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_IF_FMT] = '"if" function requires this format: ' . + 'if(field;spec;spec)'; + + // MSG_DER_FUNC_NEXTNUM_FMT describes the right syntax for the "nextnum" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_NEXTNUM_FMT] = '"nextnum" function requires this format: ' . + 'nextnum(pad) or nextnum(pad;base). pad and base ' . + 'must be numbers. base must be 2 to 36 inclusive'; + + // MSG_DER_FUNC_EXT_FMT describes the right syntax for the "ext" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_EXT_FMT] = '"ext" function requires this format: ' . + 'ext(file_field)'; + + // MSG_DER_FUNC1_FMT describes the right syntax for a function + // requiring one parameter + // Parameters: + // FUNC name of the function + $aMessages[MSG_DER_FUNC1_FMT] = '"$FUNC" function requires this format: ' . + '$FUNC(fieldname)'; + + // MSG_DER_FUNC_SUBSTR_FMT describes the right syntax for the "substr" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_SUBSTR_FMT] = '"substr" function requires this format: ' . + 'substr(fieldname;start) or ' . + 'substr(fieldname;start;length) - ' . + 'start and length must be numbers.'; + + // MSG_USER_ATTACK_JUNK is a message shown to the user when a junk + // attack has been detected + // Parameters: + // INPUT the data the user input + $aMessages[MSG_USER_ATTACK_JUNK] = 'The following input looks like a junk attack ' . + 'on our server. Please avoid scientific ' . + 'or technical terms with long sequences ' . + 'of consonants or vowels: $INPUT'; + + // MSG_USER_ATTACK_REV_CAP is a message shown to the user when a reverse + // captcha attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_REV_CAP] = 'Your input looks like an automated spambot ' . + 'attacking our server. Some automatic form ' . + 'fillers can trigger this detection. Try ' . + 'filling in our form manually. If you use the ' . + 'back button to go back, make sure you ' . + 'refresh the page before trying again.'; + + // MSG_USER_ATTACK_DUP is a message shown to the user when a duplicate + // data attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_DUP] = 'You have input the same information in ' . + 'several fields in the form. Please ' . + 're-submit the form without duplication'; + + // MSG_USER_ATTACK_MANY_URLS is a message shown to the user when a many urls + // attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_MANY_URLS] = 'Your input includes a number of URLs. ' . + 'This server has been configured to reject ' . + 'form submissions with too many URLs. ' . + 'Please re-submit the form without URLs or ' . + 'with fewer URLs.'; + + // MSG_USER_ATTACK_MANY_URL_FIELDS is a message shown to the user when a many urls + // attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_MANY_URL_FIELDS] = $aMessages[MSG_USER_ATTACK_MANY_URLS]; + + $aMessages[MSG_INVALID_EMAIL] = 'The email address "$EMAIL" is not valid: $REASON'; +} // Jump to: + +// +// If the form submission was using the GET method, switch to the +// GET vars instead of the POST vars +// +if (isset($aServerVars["REQUEST_METHOD"]) && $aServerVars["REQUEST_METHOD"] === "GET") { + $bIsGetMethod = true; + if (Settings::get('ALLOW_GET_METHOD')) { + $aFormVars = &$_GET; + } elseif (count($_GET) > 0) { + $bHasGetData = true; + } +} + +// +// Load the default language, and then override with an optional language file. +// +function LoadLanguage() +{ + LoadBuiltinLanguage(); + LoadLanguageFile(); +} + +// +// To return the value of a string or empty string if not set. +// +function CheckString($ss) +{ + return (isset($ss) ? $ss : ""); +} + +$aGetMessageSubstituteErrors = array(); +$aGetMessageSubstituteFound = array(); +$bGetMessageSubstituteNoErrors = false; + +// +// Worker function for GetMessage's preg_replace_callback calls. +// Returns the value of the matched variable name. +// Variables are searched for in the global $aGetMessageValues. +// If no such variable exists, an empty string is returned and the +// global variable $aGetMessageSubstituteErrors lists the missing names. +// +function GetMessageSubstituteParam($a_matches) +{ + global $aGetMessageValues,$aGetMessageSubstituteErrors; + global $aGetMessageSubstituteFound,$bGetMessageSubstituteNoErrors; + + $s_name = $a_matches[1]; + $aGetMessageSubstituteFound[] = $s_name; + $s_value = ""; + if (isset($aGetMessageValues[$s_name])) { + $s_value = $aGetMessageValues[$s_name]; + } elseif ($bGetMessageSubstituteNoErrors) { + $s_value = '$' . $s_name; + } else { + $aGetMessageSubstituteErrors[] = $s_name; + } + return ($s_value); +} + +// +// Returns message text from a message number, with optional parameters. +// +function GetMessage($i_msg_num,$a_params = array(), + $b_show_mnum = true,$b_no_errors = false) +{ + global $aMessages,$sLangID; + + if (count($aMessages) == 0) { + LoadLanguage(); + } + if (!isset($aMessages[$i_msg_num])) { + SendAlert("Unknown Message Number $i_msg_num was used",false,true); + $s_text = ""; + } else { + $s_text = $aMessages[$i_msg_num]; + } + $s_mno = Settings::get('bShowMesgNumbers') ? "[M$i_msg_num]" : ""; + + $s_orig_text = $s_text; + // + // substitute parameters; only works with PHP version 4.0.5 or later + // + if (strpos($s_text,'$') !== false) { + global $aGetMessageValues,$aGetMessageSubstituteErrors; + global $aGetMessageSubstituteFound,$bGetMessageSubstituteNoErrors; + + $aGetMessageSubstituteErrors = array(); + $aGetMessageSubstituteFound = array(); + $aGetMessageValues = HTMLEntitiesArray($a_params,true); + $bGetMessageSubstituteNoErrors = $b_no_errors; + $aGetMessageValues["MNUM"] = $s_mno; // add the message number + // + // search for words in this form: + // $word + // where word begins with an alphabetic character and + // consists of alphanumeric and underscore + // + $s_text = preg_replace_callback('/\$([a-z][a-z0-9_]*)/i', + 'GetMessageSubstituteParam',$s_text); + if (count($aGetMessageSubstituteErrors) > 0) { + SendAlert("Message Number $i_msg_num ('$s_orig_text') in language $sLangID " . + "specified the following unsupported parameters: " . + implode(',',$aGetMessageSubstituteErrors)); + } + if (!in_array("MNUM",$aGetMessageSubstituteFound)) + // + // append the message number + // + { + $s_text .= $b_show_mnum ? " $s_mno" : ""; + } + } else + // + // append the message number + // + { + $s_text .= $b_show_mnum ? " $s_mno" : ""; + } + // + // replace '\n' sequences with new lines + // + return (str_replace('\n',"\n",$s_text)); +} + +// +// Check if the server is Windows +// +function IsServerWindows() +{ + static $bGotAnswer = false; + static $bAnswer; + + if (!$bGotAnswer) { + if ((isset($_ENV["OS"]) && stristr($_ENV["OS"],"windows") !== false) || + (isset($_SERVER["PATH"]) && stristr($_SERVER["PATH"],"winnt") !== false) || + (isset($_SERVER["PATH"]) && stristr($_SERVER["PATH"],"windows") !== false) || + (isset($_SERVER["SystemRoot"]) && stristr($_SERVER["SystemRoot"],"winnt") !== false) || + (isset($_ENV["SystemRoot"]) && stristr($_ENV["SystemRoot"],"winnt") !== false) || + (isset($_SERVER["SystemRoot"]) && stristr($_SERVER["SystemRoot"],"windows") !== false) || + (isset($_ENV["SystemRoot"]) && stristr($_ENV["SystemRoot"],"windows") !== false) || + (isset($_SERVER["Path"]) && stristr($_SERVER["Path"],"windows") !== false) + ) { + $bAnswer = true; + } else { + $bAnswer = false; + } + $bGotAnswer = true; + } + return ($bAnswer); +} + +// +// To return a temporary file name from $SCRATCH_PAD +// +function GetScratchPadFile($s_prefix) +{ + + switch (substr(Settings::get('SCRATCH_PAD'),-1)) { + case '/': + case '\\': + $s_dir = substr(Settings::get('SCRATCH_PAD'),0,-1); + break; + default: + $s_dir = Settings::get('SCRATCH_PAD'); + break; + } + // + // Ideally, we could use tempnam. But, + // tempnam is system dependent and might not use the + // SCRATCH_PAD directory even if we tell it to. + // So, we'll force the file into SCRATCH_PAD. + // + // Note that we do *not* create the file, even though tempnam + // does create it in PHP version 4.0.3 and above. (The reason is + // we can't guarantee a non-race condition anyway.) + // + do { + $i_rand = mt_rand(0,16777215); // 16777215 is FFFFFF in hex + $s_name = $s_dir . "/" . $s_prefix . sprintf("%06X",$i_rand); + } while (file_exists($s_name)); + return ($s_name); +} + +// +// To return a temporary file name. +// +function GetTempName($s_prefix) +{ + if (!Settings::isEmpty('SCRATCH_PAD')) { + $s_name = GetScratchPadFile($s_prefix); + } else { + $s_name = tempnam("/tmp",$s_prefix); + } + return ($s_name); +} + +// +// To find a directory on the server for temporary files. +// +function GetTempDir() +{ + $s_name = GetTempName("fm"); + if (file_exists($s_name)) { + unlink($s_name); + } + $s_dir = dirname($s_name); + return ($s_dir); +} + +define('DEBUG',false); // for production +//define('DEBUG',true); // for development and debugging +define('RFCLINELEN',76); // recommend maximum line length from RFC 2822 + +// +// The user agent string to use when opening URLs +// +$sUserAgent = "FormMail/$FM_VERS (from www.tectite.com)"; + +if (DEBUG) { + error_reporting(E_ALL); // trap everything! + ini_set("display_errors","stdout"); + ini_set("display_startup_errors","1"); + assert_options(ASSERT_ACTIVE,true); + assert_options(ASSERT_BAIL,true); + LoadLanguage(); +} else { + $iOldLevel = error_reporting(E_ALL ^ E_WARNING); + LoadLanguage(); + // + // report everything except warnings and notices + // + error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE); +} + +function SetRealDocumentRoot() +{ + global $aServerVars,$REAL_DOCUMENT_ROOT; + + if (isset($aServerVars['SCRIPT_FILENAME'])) { + $REAL_DOCUMENT_ROOT = $aServerVars['SCRIPT_FILENAME']; + } elseif (isset($aServerVars['PATH_TRANSLATED'])) { + $REAL_DOCUMENT_ROOT = $aServerVars['PATH_TRANSLATED']; + } else { + $REAL_DOCUMENT_ROOT = ""; + } + // + // look for 'www' or 'public_html' and strip back to that if found, + // otherwise just get the directory name + // + if (($i_pos = strpos($REAL_DOCUMENT_ROOT,"/www/")) !== false) { + $REAL_DOCUMENT_ROOT = substr($REAL_DOCUMENT_ROOT,0,$i_pos + 4); + } elseif (($i_pos = strpos($REAL_DOCUMENT_ROOT,"/public_html/")) !== false) { + $REAL_DOCUMENT_ROOT = substr($REAL_DOCUMENT_ROOT,0,$i_pos + 12); + } elseif (!empty($REAL_DOCUMENT_ROOT)) { + $REAL_DOCUMENT_ROOT = dirname($REAL_DOCUMENT_ROOT); + } elseif (isset($aServerVars['DOCUMENT_ROOT']) && + !empty($aServerVars['DOCUMENT_ROOT']) + ) { + $REAL_DOCUMENT_ROOT = $aServerVars['DOCUMENT_ROOT']; + } +} + +// +// Hook system: before initialization (but after configuration) +// +if (($incFile = hookFileExists("fmhookpreinit.inc")) !== false) { + @include($incFile); +} + +if (!Settings::isEmpty('SESSION_NAME')) { + session_name(Settings::get('SESSION_NAME')); +} + +/** + * Session data access + * + * @param $s_name + * + * @return mixed null session variable's value or null if not set + */ +function GetSession($s_name) +{ + return (isset($_SESSION) ? $_SESSION[$s_name] : null); +} + +/** + * Session data isset + * + * @param $s_name + * + * @return boolean true if the given session variable is set + */ +function IsSetSession($s_name) +{ + return (isset($_SESSION) && isset($_SESSION[$s_name])); +} + +/** + * Session data setting + * + * Sets the given session variable to the given value. + * + * @param $s_name string + * name of the session variable + * @param $m_value mixed + * value to set + */ +function SetSession($s_name,$m_value) +{ + $_SESSION[$s_name] = $m_value; +} + +/** + * Session data un-setting + * + * Unsets the given session variable. + * + * @param $s_name string + * name of the session variable + */ +function UnsetSession($s_name) +{ + $_SESSION[$s_name] = null; + unset($_SESSION[$s_name]); +} + +function ZapSession() +{ + global $aSessionVarNames; + + if (Settings::get('DESTROY_SESSION')) { + if (session_id() != '') { + session_destroy(); + } + } else { + foreach ($aSessionVarNames as $s_var_name) { + UnsetSession($s_var_name); + } + } +} + +$bReverseCaptchaCompleted = false; // records whether ATTACK_DETECTION_REVERSE_CAPTCHA has been completed successfully +session_start(); + +// +// Hook system: after session initialization +// +if (($incFile = hookFileExists("fmhookpostsess.inc")) !== false) { + @include($incFile); +} + +// +// This array lists the private variables used by FormMail. +// We use the names here to cleanup the session when FormMail has +// finished its processing. +// +$aSessionVarNames = array("FormError","FormErrorInfo","FormErrorCode", + "FormErrorItems","FormData","FormIsUserError", + "FormAlerted","FormSavedFiles","FormIndex", + "FormList","FormKeep","VerifyImgString", + "turing_string" +); + +UnsetSession("FormError"); // start with no error +UnsetSession("FormErrorInfo"); // start with no error +UnsetSession("FormErrorCode"); // start with no error +UnsetSession("FormErrorItems"); // start with no error +UnsetSession("FormData"); // start with no data +UnsetSession("FormIsUserError"); // start with no data +UnsetSession("FormAlerted"); // start with no data + +// +// Note that HTTP_REFERER is easily spoofed, so there's no point in +// using it for security. +// + +// +// SPECIAL_FIELDS is the list of fields that formmail.php looks for to +// control its operation +// +$SPECIAL_FIELDS = array( + "email", // email address of the person who filled in the form + "realname", // the real name of the person who filled in the form + "recipients", // comma-separated list of email addresses to which we'll send the results + "cc", // comma-separated list of email addresses to which we'll CC the results + "bcc", // comma-separated list of email addresses to which we'll BCC the results + "replyto", // comma-separated list of email addresses to whom replies should be sent + "required", // comma-separated list of fields that must be found in the input + "conditions", // complex condition tests + "fmcompute", // computations + "fmmodules", // list of modules required + "fmmode", // mode of operation + "mail_options", // comma-separated list of options + "good_url", // URL to go to on success + "good_template", // template file to display on success + "bad_url", // URL to go to on error + "bad_template", // template file to display on error + "template_list_sep", // separator when expanding lists in templates + "this_form", // the URL of the form (can be used by bad_url) + "subject", // subject for the email + "env_report", // comma-separated list of environment variables to report + "filter", // a supported filter to use + "filter_options", // options for using the filter + "filter_fields", // list of fields to filter (default is to filter all fields) + "filter_files", // list of file fields to filter (default is to filter no file fields) + "logfile", // log file to write to + "csvfile", // file to write CSV records to + "csvcolumns", // columns to save in the csvfile + "crm_url", // URL for sending data to the CRM; note that the + // value must have a valid prefix specified in TARGET_URLS + "crm_spec", // CRM specification (field mapping) + "crm_options", // comma-separated list of options to control CRM processing + "derive_fields", // a list of fields to derive from other fields + "file_names", // specifies names for files being uploaded + "autorespond", // specification for auto-responding + "arverify", // verification field to allow auto-responding + "imgverify", // verification field to allow submission + "multi_start", // set this field on the first page of a multi-page form sequence + "multi_keep", // set this field on the pages of a multi-page form sequence + // to the list of fields that should be kept when moving + // forward after going backwards + "next_form", // next form name or empty for last form + "multi_go_back", // this field should be set when the user clicks the + // back button or link in a multi-page form sequence + "alert_to", // email address to send alerts (errors) to + // + // fields for reCaptcha implementation + // + "recaptcha_response_field", // verification field to allow submission + "recaptcha_challenge_field", // challenge field + // + // reCaptcha version 2 + // + "g-recaptcha-response", + "email_validation_time_secs" // set via the VALIDATE_EMAIL_DOMAIN process +); + +// +// $SPECIAL_MULTI is the list of fields from $SPECIAL_FIELDS that can +// have multiple values, for example: +// name="conditions1" +// name="conditions2" +// +$SPECIAL_MULTI = array( + "conditions", + "fmcompute", +); + +// +// $SPECIAL_ARRAYS is the list of fields from $SPECIAL_FIELDS that can +// be submitted as arrays of values, for example: +// +// +$SPECIAL_ARRAYS = array( + "recipients", + "cc", + "bcc", + "replyto", +); + +// +// $SPECIAL_NOSTRIP is the list of fields from $SPECIAL_FIELDS that +// should not be stripped (other than for magic_quotes_gpc reasons). +// +$SPECIAL_NOSTRIP = array( + "conditions", + "fmcompute", + "recaptcha_response_field", + "recaptcha_challenge_field", + "g-recaptcha-response", + "arverify", + "imgverify", +); + +// +// VALID_MAIL_OPTIONS lists the valid mail_options words +// +$VALID_MAIL_OPTIONS = array( + "AlwaysEmailFiles" => true, + "AlwaysList" => true, + "CharSet" => true, + "DupHeader" => true, + "Exclude" => true, + "FromAddr" => true, + "FromLineStyle" => true, + "HTMLTemplate" => true, + "KeepLines" => true, + "NoEmpty" => true, + "NoPlain" => true, + "PlainTemplate" => true, + "SendMailFOption" => true, + "StartLine" => true, + "TemplateMissing" => true, +); + +// +// VALID_CRM_OPTIONS lists the valid crm_options words +// +$VALID_CRM_OPTIONS = array( + "ErrorOnFail" => true, +); + +// +// VALID_AR_OPTIONS lists the valid autorespond words +// +$VALID_AR_OPTIONS = array( + "Subject" => true, + "HTMLTemplate" => true, + "PlainTemplate" => true, + "TemplateMissing" => true, + "PlainFile" => true, + "HTMLFile" => true, + "FromAddr" => true, + "FromName" => true +); + +// +// VALID_FILTER_OPTIONS lists the valid filter_options words +// +$VALID_FILTER_OPTIONS = array( + "Attach" => true, + "KeepInLine" => true, + "CSVHeading" => true, + "CSVSep" => true, + "CSVIntSep" => true, + "CSVQuote" => true, + "CSVEscPolicy" => true, + "CSVRaw" => true, +); + +// +// SPECIAL_VALUES is set to the value of the fields we've found +// usage: $SPECIAL_VALUES["email"] is the value of the email field +// +$SPECIAL_VALUES = array(); +// +// Array of mail options; set by the function 'ProcessMailOptions' +// +$MAIL_OPTS = array(); +// +// Array of crm options; set by the function 'ProcessCRMOptions' +// +$CRM_OPTS = array(); +// +// Array of autorespond options; set by the function 'ProcessAROptions' +// +$AR_OPTS = array(); +// +// Array of filter options; set by the function 'ProcessFilterOptions' +// +$FILTER_OPTS = array(); + +// +// initialise $SPECIAL_VALUES so that we don't fail on using unset values +// +foreach ($SPECIAL_FIELDS as $sFieldName) { + $SPECIAL_VALUES[$sFieldName] = ""; +} + +// +// Defaults for some special fields.... +// +$SPECIAL_VALUES['template_list_sep'] = ","; + +// +// FORMATTED_INPUT contains the input variables formatted nicely +// This is used for error reporting and debugging only. +// +$FORMATTED_INPUT = array(); + +// +// $FILTER_ATTRIBS_LOOKUP is the parsed $FILTER_ATTRIBS array +// +$FILTER_ATTRIBS_LOOKUP = array(); + +// +// BuiltinFunctions provides additional functions that can be called via derive_fields +// +class BuiltinFunctions +{ + private $_aFunctions; + + function __construct() + { + $this->_aFunctions = array(); + } + + /** + * Adds a builtin function. + * + * @param string $s_name name of the function + * @param string $n_params number of parameters the function expects + */ + public function Add($s_name,$n_params) + { + $this->_aFunctions[$s_name] = array('nparams' => $n_params); + } + + /** + * Calls a builtin function. + * + * @param string $s_name name of the function + * @param array $a_params list of parameters + * @param string &$s_result result of the function or error message + * + * @return boolean true on success, otherwise false + */ + public function Call($s_name,$a_params,&$s_result) + { + if (!isset($this->_aFunctions[$s_name])) { + $s_result = "Function '$s_name' is not a builtin function"; + return (false); + } + $a_func = $this->_aFunctions[$s_name]; + if (count($a_params) != $a_func['nparams']) { + $s_result = "Function '$s_name' expects " . $a_func['nparams'] . " parameters, " . count($a_params) . + " given."; + return (false); + } + $s_result = call_user_func_array($s_name,$a_params); + return (true); + } +} + +$BuiltinFunctions = new BuiltinFunctions(); + +$reCaptchaProcessor = null; +if (Settings::get('RECAPTCHA_PRIVATE_KEY') !== "") { + // + // Assume version 1 unless g-recaptcha-response is found in the form data. + // If we cannot load recaptchalib, then we assume it's version 2. + // + $bRecaptchaVersion = 1; + if (isset($aFormVars['g-recaptcha-response']) && $aFormVars['g-recaptcha-response'] != '') { + $bRecaptchaVersion = 2; + } + if ($bRecaptchaVersion == 1 && (!includeFileExists("recaptchalib.php") || !@include_once("recaptchalib.php"))) { + $bRecaptchaVersion = 2; + } + + if ($bRecaptchaVersion == 2) { + if (!function_exists('json_decode')) { + SendAlert("reCaptcha version 2 requires PHP version 5.2.0 or later",false,false); + } + + /* + * Class: reCaptchaWrapper + * Description: + * Wraps processing of reCaptcha version 2. + */ + + class reCaptchaWrapperV2 + { + var $_sPrivate; // the private key + var $_bDone; // true when done + var $_Resp; // the response from reCaptcha + + /* + * Method: reCaptchaWrapperV2 ctor + * Parameters: $s_priv the private key + * Returns: n/a + * Description: + * Initializes the wrapper ready to process reCaptcha. + */ + function __construct($s_priv) + { + $this->_sPrivate = $s_priv; + $this->_bDone = false; + } + + /** + * Try to contact Google reCaptcha. + * PHP version 5.6.2 has problems with sockets, so this may fail with PHP 5.6.2. + * + * @param string $s_response the reCaptcha response. + */ + function _askGoogle($s_response) + { + $s_url = 'https://www.google.com/recaptcha/api/siteverify'; + + $a_post_data = array( + 'secret' => $this->_sPrivate, + 'response' => $s_response + ); + if (isset($_SERVER['REMOTE_ADDR'])) { + $a_post_data['remoteip'] = $_SERVER['REMOTE_ADDR']; + } + + FMDebug('Posting to google reCaptcha'); + $recaptcha = new HTTPPost($s_url); + $a_resp_lines = $recaptcha->Post($a_post_data); + + if ($a_resp_lines === false) { + FMDebug('reCaptcha via HTTPPost socket failed'); + $s_resp = '{"success":false,"error-codes":["reCaptcha failed"]}'; + } else { + $s_resp = implode('',$a_resp_lines); + FMDebug('reCaptcha via HTTPPost socket succeeded: ' . $s_resp); + } + /** @noinspection PhpComposerExtensionStubsInspection */ + $this->_Resp = json_decode($s_resp,true); + } + + /* + * Method: reCaptchaWrapper::Check + * Parameters: $s_response the reCaptcha response value + * $a_values field values + * $s_error returns the reCaptcha error code + * Returns: bool true on success, otherwise false + * Description: + * Performs the reCaptcha check and caches the result so it's + * only done once. + */ + function Check($s_response,$a_values,&$s_error) + { + if (!$this->_bDone) { + $this->_askGoogle($s_response); + } + $this->_bDone = true; + $s_error = ""; + if (!$this->_Resp['success']) { + if (!isset($this->_Resp['error-codes']) || count($this->_Resp['error-codes']) == 0 || + !$this->_Resp['error-codes'][0] + ) { + $s_error = 'verification failed (error not specified)'; + } else { + $s_error = $this->_Resp['error-codes'][0]; + } + } + return ($this->_Resp['success']); + } + } + + $reCaptchaProcessor = new reCaptchaWrapperV2(Settings::get('RECAPTCHA_PRIVATE_KEY')); + } else { + + /* + * Class: reCaptchaWrapper + * Description: + * Wraps processing of reCaptcha version 1. + */ + + class reCaptchaWrapper + { + var $_sPrivate; // the private key + var $_bDone; // true when done + var $_Resp; // the response from reCaptcha + + /* + * Method: reCaptchaWrapper ctor + * Parameters: $s_priv the private key + * Returns: n/a + * Description: + * Initializes the wrapper ready to process reCaptcha. + */ + function __construct($s_priv) + { + $this->_sPrivate = $s_priv; + $this->_bDone = false; + } + + /* + * Method: reCaptchaWrapper::Check + * Parameters: $s_response the reCaptcha response value + * $a_values field values + * $s_error returns the reCaptcha error code + * Returns: bool true on success, otherwise false + * Description: + * Performs the reCaptcha check and caches the result so it's + * only done once. + */ + function Check($s_response,$a_values,&$s_error) + { + if (!$this->_bDone) { + /** @noinspection PhpUndefinedFunctionInspection */ + $this->_Resp = recaptcha_check_answer($this->_sPrivate, + $_SERVER["REMOTE_ADDR"], + $a_values["recaptcha_challenge_field"], + $s_response); + } + $this->_bDone = true; + $s_error = ""; + if (!$this->_Resp->is_valid) { + $s_error = $this->_Resp->error; + } + return ($this->_Resp->is_valid); + } + } + + $reCaptchaProcessor = new reCaptchaWrapper(Settings::get('RECAPTCHA_PRIVATE_KEY')); + } +} + +/** + * Contains a list of valid email addresses and + * email address patterns. Provides methods for checking the validity of an + * email address. + */ +class EmailChecker +{ + + var $_aAddresses; // valid email addresses (as keys) + var $_aTargetPatterns; // valid email address patterns + + /** + * Constructs the object. + * + * @param array $a_aliases + * @param array $a_patterns an array of email address patterns + */ + function __construct($a_aliases = array(),$a_patterns = array()) + { + $this->_aAddresses = array(); + $this->_aTargetPatterns = $a_patterns; + foreach ($a_aliases as $s_list) { + $this->AddAddresses($s_list); + } + } + + /** + * Adds an email address to the list of valid * email addresses. + * + * @param string $s_addr an email address + */ + function AddAddress($s_addr) + { + $this->_aAddresses[$s_addr] = true; + } + + /** + * Adds a comma-separated list of email addresses to the list of valid email addresses. + * + * @param string $s_list a list of email addresses + */ + function AddAddresses($s_list) + { + $a_addrs = TrimArray(explode(",",$s_list)); + foreach ($a_addrs as $s_addr) { + $this->AddAddress($s_addr); + } + } + + /** + * Checks an email address for validity. + * + * @param string $s_email an email address + * + * @return boolean true if the address is valid, otherwise false + */ + function CheckAddress($s_email) + { + $b_is_valid = false; + if (isset($this->_aAddresses[$s_email])) { + $b_is_valid = true; + } else { + for ($ii = 0 ; $ii < count($this->_aTargetPatterns) ; $ii++) { + // + // prepend / with \ + // + $s_pat = "/" . str_replace('/','\\/',$this->_aTargetPatterns[$ii]) . "/i"; + if (preg_match($s_pat,$s_email)) { + $b_is_valid = true; + break; + } + } + } + return ($b_is_valid); + } +} + +// +// Create the object for checking emails +// +$ValidEmails = new EmailChecker(Settings::get('EMAIL_ADDRS'),Settings::get('TARGET_EMAIL')); + +/** + * Class SpecialFieldsManager + * + * Encapsulate storage and access to special fields. + * + * NOTE: this is initial code implemented in version 9.17 and is not complete. + * It's part of our transition to a more complete Object Oriented code base + * which is targeted for version 9.??. + */ +class SpecialFieldsManager +{ + /** + * list of special field names + * + * @var array + */ + private $_aFieldNames; + + /** + * list of special field names that can have multiple values by a numeric suffic + * + * @var array + */ + private $_aMultiFieldNames; + + /** + * list of special field names that can be arrays + * + * @var array + */ + private $_aArrayFieldNames; + + /** + * list of special field names that must be used in raw format (not cleaned/stripped) + * + * @var array + */ + private $_aRawFieldNames; + + /** + * list of field values keyed by field name + * + * @var array + */ + private $_aValues; + + function __construct($a_field_names,$a_multi_field_names,$a_array_field_names,$a_raw_field_names) + { + $this->_aFieldNames = $a_field_names; + $this->_aMultiFieldNames = $a_multi_field_names; + $this->_aArrayFieldNames = $a_array_field_names; + $this->_aRawFieldNames = $a_raw_field_names; + } + + public static function getCleanEmail($s_email) + { + if (function_exists('filter_var')) { + return filter_var($s_email,FILTER_VALIDATE_EMAIL) === false ? '' : $s_email; + } else { + // basic email pattern if filter_var is not available + return preg_match('/^[a-z0-9]+@[a-z\.]+$/i',$s_email) ? $s_email : ''; + } + } +} + +// TODO implement this! +//$SpecialFields = new SpecialFieldsManager($SPECIAL_FIELDS,$SPECIAL_MULTI,$SPECIAL_ARRAYS,$SPECIAL_NOSTRIP); + +/** + * Class FieldManager + * + * Encapsulates storage and lookup of field data. + * + * NOTE: this is initial code implemented in version 8.27 and is not complete. + * It's part of our transition to a more complete Object Oriented code base + * which is targeted for version 9.??. + */ +class FieldManager +{ + + /** + * list of fields keyed by field name + * + * @var array + */ + private $_aFields; + + /** + * list of file fields keyed by field name (not currently used) + * + * @var array + */ + private $_aFileFields; + + /** + * last array separator specified + * + * @var string + */ + private $_sArraySep; + + /** + * array separator to use (after substitutions) + * + * @var string + */ + private $_sArraySepValue; + + /** + * counter for unique generation + * + * @var int + */ + private $_nUnique; + + /** + * Constructs the object. + * + * @param array $a_fields list of fields + * @param array $a_file_fields list of file fields + */ + public function __construct($a_fields = array(),$a_file_fields = array()) + { + $this->_sArraySepValue = $this->_sArraySep = ""; + $this->_aFields = $this->_aFileFields = array(); + $this->_nUnique = 0; + $this->Init($a_fields,$a_file_fields); + } + + public function GetFields() + { + return $this->_aFields; + } + + /** + * Initializes the object with the field data. + * + * @param array $a_fields list of fields + * @param array $a_file_fields list of file fields + * + * @return void + */ + public function Init($a_fields = array(),$a_file_fields = array()) + { + $this->_aFields = $a_fields; + $this->_aFileFields = $a_file_fields; + } + + /** + * Return a field value. + * Empty string is returned if the field is + * not found. File fields return the original name of the uploaded file. + * + * @param string $s_fld name of the field + * @param string $s_array_sep string to use to separate array values + * + * @return string the field's value + */ + public function GetFieldValue($s_fld,$s_array_sep = ";") + { + if (!isset($this->_aFields[$s_fld])) { + if (($s_value = $this->GetFileName($s_fld)) === false) { + $s_value = ""; + } + } else { + if (is_array($this->_aFields[$s_fld])) { + $s_value = implode($this->_GetArraySep($s_array_sep),$this->_aFields[$s_fld]); + } else { + $s_value = (string)$this->_aFields[$s_fld]; + } + } + return ($s_value); + } + + /** + * Return a field value. + * Empty string is returned if the field is + * not found. File fields return the original name of the uploaded file. + * The returned value is HTML-safe. + * b_text_subs performs text substitutions on the field value + * that are not affected by HTML-safety replacement. This means + * + * @param string $s_fld name of the field + * @param bool $b_text_subs perform text substitutions + * @param string $s_array_sep string to use to separate array values + * + * @return string the field's value + * @uses $TEXT_SUBS can be used to force allowance of particular HTML tags. Note + * that b_text_subs is not yet implemented for array * field + * values. + * + */ + public function GetSafeFieldValue($s_fld,$b_text_subs = false,$s_array_sep = ";") + { + // + // for array values, insert the array separator after making + // the individual values HTML-safe + // The equivalent logic up to and including version 8.24 used + // htmlspecialchars not htmlentities. + // The use of htmlentities broke UTF-8 template processing, + // and this was reported in version 8.28. + // By specifying the character set, we trigger the use of + // htmlspecialchars + // so the logic is equivalent to the old logic. + // + if (isset($this->_aFields[$s_fld]) && is_array($this->_aFields[$s_fld])) { + $s_value = implode($this->_GetArraySep($s_array_sep), + HTMLEntitiesArray($this->_aFields[$s_fld],false, + GetMailOption("CharSet"))); + } else { + if (!isset($this->_aFields[$s_fld])) { + if (($s_name = $this->GetFileName($s_fld)) === false) { + $s_name = ""; + } + $s_value = $s_name; + } else { + $s_value = (string)$this->_aFields[$s_fld]; + } + if ($b_text_subs) { + list ($s_value,$a_subs_data) = $this->_PrepareTextSubstitute($s_value); + } + $s_value = FixedHTMLEntities($s_value,GetMailOption("CharSet")); + if ($b_text_subs) { + $s_value = $this->_CompleteTextSubstitute($s_value,$a_subs_data); + } + } + return ($s_value); + } + + /** + * Prepares a value for text substitution using $TEXT_SUBS. + * + * @param string $s_value + * the value to perform substitutions on + * + * @return array [0]=>the processed value, [1]=>array of substitution data + */ + private function _PrepareTextSubstitute($s_value) + { + $a_subs_data = array(); + $a_text_subs = Settings::get('TEXT_SUBS'); + for ($ii = 0 ; $ii < count($a_text_subs) ; $ii++) { + $a_match_data = array(); + if (($n_matches = preg_match_all($a_text_subs[$ii]["srch"],$s_value,$a_matches, + PREG_OFFSET_CAPTURE)) !== false && $n_matches > 0 + ) { + $a_match_data["srch"] = $a_text_subs[$ii]["srch"]; + $a_match_data["repl"] = $a_text_subs[$ii]["repl"]; + $s_value = $this->_HTMLSafeSubstitute($s_value,$a_matches,$a_match_data); + } + $a_subs_data[$ii] = $a_match_data; + } + return (array($s_value,$a_subs_data)); + } + + /** + * Completes text substitution started by _PrepareTextSubstitute. + * + * @param string $s_value + * the value to perform substitutions on + * @param array $a_subs_data + * data that describes the substitutions to perform + * + * @return string the new value + */ + private function _CompleteTextSubstitute($s_value,$a_subs_data) + { + // + // because later substitutions can capture earlier ones, + // we have to process them all in reverse order + // + for ($ii = count($a_subs_data) ; --$ii >= 0 ;) { + $a_subs_list = $a_subs_data[$ii]; + for ($jj = count($a_subs_list) ; --$jj >= 0 ;) { + $s_code = $a_subs_list[$jj]["code"]; + $s_subs = $a_subs_list[$jj]["subs"]; + $s_value = str_replace($s_code,$s_subs,$s_value); + } + } + return ($s_value); + } + + /** + * Generates a unique string from a base string + * + * @param string $s_base + * a base of the unique string + * + * @return string a unique string + */ + private function _MakeUniqueString($s_base) + { + $n_uniq = $this->_nUnique++; + return ($s_base . "_" . str_pad("$n_uniq",5,"0",STR_PAD_LEFT)); + } + + /** + * Performs a temporary substitution on a string of the given matches with + * the given replacement specification. + * This makes the replacement using + * a special indicator string that can be substituted for the real value + * later. This allows non-replaced parts of the string to be processed + * and made safe for HTML entities, without affecting our actual + * replacements. + * + * @param string $s_value + * the string to substitute + * @param array $a_matches + * list of matches and offsets from preg_match_all + * @param array $a_match_data + * contains some data, and returns replacement data for the + * temporary substitution + * + * @return string the temporarily substituted string + */ + private function _HTMLSafeSubstitute($s_value,$a_matches,&$a_match_data) + { + $a_matches = $a_matches[0]; // we're only interested in the full pattern + // matches + $s_srch = $a_match_data["srch"]; + $s_repl = $a_match_data["repl"]; + + // + // to preserve offsets, we must process the string in reverse order + // of the matches; since we don't assume the array is ordered + // by ascending offset, we'll sort it now + // + usort($a_matches,function ($a,$b) { + return $b[1] - $a[1]; + }); + $a_match_data = array(); + for ($ii = 0 ; $ii < count($a_matches) ; $ii++) { + $s_match = $a_matches[$ii][0]; + $i_offset = $a_matches[$ii][1]; + $i_len = strlen($s_match); + + $s_subs = preg_replace($s_srch,$s_repl,$s_match); + // + // the code string must e HTML safe so it doesn't get altered + // before we can replace it; we use ! at the edges so that + // other patterns can successfully match word boundaries + // An improvement would be to determine the type of characters + // at the edges of the matched string, then choose the substitution + // edges accordingly. + // + $s_code = "!" . $this->_MakeUniqueString("SUBS") . "!"; + $a_match_data[$ii] = array("subs" => $s_subs,"code" => $s_code); + + $s_value = substr($s_value,0,$i_offset) . $s_code . substr($s_value,$i_offset + $i_len); + } + return ($s_value); + } + + /** + * Test if a field is set in the $_aFields array or in the uploaded + * files. + * + * @param string $s_fld name of the field + * + * @return bool true if the field has a value + */ + public function IsFieldSet($s_fld) + { + if (isset($this->_aFields[$s_fld])) { + return (true); + } + if (Settings::get('FILEUPLOADS')) { + if (isset($this->_aFileFields[$s_fld])) { + return (true); + } + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + if (isset($a_saved_files[$s_fld])) { + return (true); + } + } + } + return (false); + } + + public static function GetFileUploadErrorMesg($n_error) + { + $s_mesg = ''; + switch ($n_error) { + case 0: // no error + break; + case 1: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR1); + break; + case 2: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR2); + break; + case 3: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR3); + break; + case 4: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR4); + break; + case 6: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR6); + break; + case 7: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR7); + break; + case 8: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR8); + break; + default: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR_UNK,array("ERRNO" => $n_error)); + break; + } + return $s_mesg; + } + + /** + * Tests a field against the $_aFields array for emptiness. + * If the var isn't found there, then the POSTed files array is checked. + * Returns true if the field is empty (a specific error may + * be returned in the $s_mesg parameter). + * + * @param string $s_fld name of the field + * @param string $s_mesg returns an error message, where possible + * + * @return bool true if the field is empty + */ + public function TestFieldEmpty($s_fld,&$s_mesg) + { + $s_mesg = ""; + $b_empty = TRUE; + if (!isset($this->_aFields[$s_fld])) { + // + // Each file var is an array with these elements: + // "name" => The original name of the file on the client machine. + // "type" => The mime type of the file, if the browser provided this + // information. + // "tmp_name" => The temporary filename of the file in which the + // uploaded file was stored on the server. + // "error" => The error code associated with this file upload. + // NOTE: "error" was added in PHP 4.2.0 + // "size" => The size, in bytes, of the uploaded file. + // + // Error codes (the constants are only available from PHP 4.3.0 so + // we have to use the raw numbers): + // UPLOAD_ERR_OK + // Value: 0; There is no error, the file uploaded with success. + // UPLOAD_ERR_INI_SIZE + // Value: 1; The uploaded file exceeds the upload_max_filesize + // directive in php.ini. + // UPLOAD_ERR_FORM_SIZE + // Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive + // that was specified in the html form. + // UPLOAD_ERR_PARTIAL + // Value: 3; The uploaded file was only partially uploaded. + // UPLOAD_ERR_NO_FILE + // Value: 4; No file was uploaded. + // + if (Settings::get('FILEUPLOADS')) { + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + if (isset($a_saved_files[$s_fld])) { + $a_upload = $a_saved_files[$s_fld]; + } elseif (isset($this->_aFileFields[$s_fld])) { + $a_upload = $this->_aFileFields[$s_fld]; + } + } elseif (isset($this->_aFileFields[$s_fld])) { + $a_upload = $this->_aFileFields[$s_fld]; + } + } + if (isset($a_upload)) { + if (isset($a_upload["tmp_name"]) && !empty($a_upload["tmp_name"]) && + isset($a_upload["name"]) && !empty($a_upload["name"]) + ) { + if ($this->_IsUploadedFile($a_upload)) { + $b_empty = false; + } + } + if ($b_empty && isset($a_upload["error"])) { + $s_mesg = FieldManager::GetFileUploadErrorMesg($a_upload["error"]); + } + } + } else { + $b_empty = FieldManager::IsEmpty($this->_aFields[$s_fld]); + } + return ($b_empty); + } + + /** + * Same as "empty" but checks for true emptiness if ZERO_IS_EMPTY is + * set to false. + * + * @param string $s_value the value to test + * + * @return bool true if the value is "empty" + */ + public static function IsEmpty($s_value) + { + if (Settings::get('ZERO_IS_EMPTY') || is_array($s_value)) { + return (empty($s_value)); + } else { + return ($s_value === ""); + } + } + + /** + * Makes substitutions on strings as specified in the configuration setting $TEXT_SUBS. + * + * @param string $s_str a string on which to perform substitutions + * + * @return string the string, substituted + */ + public static function Substitute($s_str) + { + + $a_srch = $a_repl = array(); + foreach (Settings::get('TEXT_SUBS') as $a_sub) { + if (isset($a_sub["srch"]) && isset($a_sub["repl"]) && $a_sub["srch"] !== "") { + $a_srch[] = $a_sub["srch"]; + $a_repl[] = $a_sub["repl"]; + } + } + return (preg_replace($a_srch,$a_repl,$s_str)); + } + + /** + * Computes the array separation string. + * $s_sep is subject to + * substitutions specified in $TEXT_SUBS, and then returned. + * + * @param string $s_sep the string specified for array separations + * + * @return string the string to use for array separations + */ + private function _GetArraySep($s_sep) + { + // + // check for cached (previously calculated) value + // + if ($s_sep !== $this->_sArraySep) { + $this->_sArraySep = $s_sep; + $this->_sArraySepValue = FieldManager::Substitute($this->_sArraySep); + } + return ($this->_sArraySepValue); + } + + /** + * Return the info for the uploaded file, or false on error. + * + * @param string $s_fld field name + * + * @return bool + */ + public function GetFileInfo($s_fld) + { + if (Settings::get('FILEUPLOADS')) { + // + // Must look at new file uploads first. + // + if (isset($this->_aFileFields[$s_fld]) && !empty($this->_aFileFields[$s_fld])) { + $a_upload = $this->_aFileFields[$s_fld]; + } elseif (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + if (isset($a_saved_files[$s_fld])) { + $a_upload = $a_saved_files[$s_fld]; + } + } + } + if (isset($a_upload)) { + if (isset($a_upload["tmp_name"]) && !empty($a_upload["tmp_name"]) && + isset($a_upload["name"]) && !empty($a_upload["name"]) && + $this->_IsUploadedFile($a_upload) + ) { + return ($a_upload); + } + } + return (false); + } + + /** + * Return the original name of the uploaded file or false on error. + * + * @param string $s_fld field name + * + * @return bool + * @see \FormMail\UnitTests\GetFileNameTest + */ + public function GetFileName($s_fld) + { + if (($a_upload = $this->GetFileInfo($s_fld)) !== false) { + return ($a_upload["name"]); + } + return (false); + } + + /** + * Check if a file is a valid uploaded file. + * + * @param array $a_file_spec file specification + * + * @return bool + */ + public static function IsUploadedFile($a_file_spec) + { + // + // $a_file_spec["moved"] is our own internal flag to say we've + // saved the file + // + if (isset($a_file_spec["moved"]) && $a_file_spec["moved"]) { + return (true); + } + return (is_uploaded_file($a_file_spec["tmp_name"])); + } + + /** + * Internal access to static method. This allows us to mock the operation in unit tests. + * + * @param $a_file_spec + * + * @return bool + */ + protected function _IsUploadedFile($a_file_spec) + { + return self::IsUploadedFile($a_file_spec); + } + +} + +// +// Perform general line folding. +// This function can be used for RFC 2822 line folding, as well +// Quoted Printable soft line breaks (RFC 2045). +// $s_before lists the characters before which we should fold the line. +// $s_after lists the characters after which we should fold the line. +// $s_fold is the string to insert to fold the line. +// +function LineFolding($s_str,$i_max_line,$s_before,$s_after,$s_fold) +{ + $i_str_len = strlen($s_str); + $ii = $i_start = 0; + $i_line_len = 0; + while ($ii < $i_str_len) { + if ($i_line_len == $i_max_line) { + // + // fold this line: + // search backwards for a character at which we can + // fold the line + // + $b_done = false; + for ($jj = $ii ; !$b_done && $jj > $i_start ; $jj--) { + $b_found = false; + if (strpos($s_before,$s_str[$jj]) !== false) { + // + // fold before this character + // + $b_found = true; + } elseif (strpos($s_after,$s_str[$jj]) !== false) { + // + // fold after this character + // + $jj++; + $b_found = true; + } + if ($b_found) { + $s_str = substr($s_str,0,$jj) . $s_fold . substr($s_str,$jj); + $i_fold_len = strlen($s_fold); + $i_str_len += $i_fold_len; // the additional chars we inserted + $i_start = $jj + $i_fold_len; // start of the next line + $b_done = true; + } + } + // + // if we cannot fold and shorten the line, + // ignore this and try for the next line + // + if ($b_done) { + $ii = $i_start; + } else { + $i_start = $ii; + } + $i_line_len = 0; + } elseif (substr($s_str,$ii,2) == "\r\n") { + // + // end of line found - reset counters + // + $i_line_len = 0; + $ii += 2; + $i_start = $ii; + } else { + $ii++; + $i_line_len++; + } + } + return ($s_str); +} + +// +// Quoted Printable Encoding with soft line breaks. +// +// Process a string to fit the requirements of RFC2045 section 6.7. Note that +// this works, but replaces more characters than the minimum set. +// Prior to version 8.34, for readability the spaces were not encoded, which was +// WRONG (see http://tools.ietf.org/html/rfc2047#section-2). Spaces must +// be encoded. +// +// Adapted from: +// http://www.php.net/manual/en/function.quoted-printable-decode.php +// Note that we *must* split long lines because a QP string might not +// contain any Folding White Space (FWS). In this case, it would +// not be possible to fold the line according to RFC 2822. +// Therefore, we need to use Soft Line Breaks as defined by the +// Quoted Printable definition in RFC 2045. +// +// Set $i_max_line to -ve to skip the line folding. +// +function QPEncode($s_str,$i_max_line) +{ + // + // According to RFC2045 section 6.7 point (4), we need to keep any + // actual \r\n breaks encoded in the QP. The original code replaced + // them with CRLF pairs. + // + $s_str = str_replace('%','=',rawurlencode($s_str)); + if ($i_max_line < 0) { + return ($s_str); + } else { + $s_before = "="; // characters before which we can fold the line + return (LineFolding($s_str,$i_max_line,$s_before,"","=\r\n")); + } +} + +// +// Peform header line folding according to RFC 2822. +// $s_before lists the characters before which we should fold the line. +// $s_after lists the characters after which we should fold the line. +// Characters left out of folding: +// [] are part of no-fold-literal +// () are part of comments, and should work, but don't +// +function HeaderFolding($s_str,$i_max_line = RFCLINELEN,$s_before = "<",$s_after = ">;, ") +{ + return (LineFolding($s_str,$i_max_line,$s_before,$s_after,"\r\n ")); +} + +// +// Access the www.tectite.com website to get the current version. +// +function CheckVersion() +{ + global $FM_VERS,$php_errormsg; + + $http_get = new HTTPGet("http://www.tectite.com/fmversion.txt"); + $php_errormsg = ""; // clear this out in case we get an error that doesn't set it + FMDebug("CheckVersion"); + if (($a_lines = $http_get->Read()) !== false) { + // + // version file looks like this: + // Version=versionumber + // Message=a message to send in the alert + // + $s_version = ""; + $s_message = ""; + $s_line = ""; + $b_in_mesg = false; + foreach ($a_lines as $s_line) { + if ($b_in_mesg) { + $s_message .= $s_line; + } else { + $s_prefix = substr($s_line,0,8); + if ($s_prefix == "Message=") { + $s_message .= substr($s_line,8); + $b_in_mesg = true; + } elseif ($s_prefix == "Version=") { + $s_version = substr($s_line,8); + } + } + } + $s_version = str_replace("\r","",$s_version); + $s_version = str_replace("\n","",$s_version); + $s_stop_mesg = GetMessage(MSG_END_VERS_CHK); + FMDebug("CheckVersion: vers=$s_version"); + if ((float)$s_version > (float)$FM_VERS) { + SendAlert(GetMessage(MSG_VERS_CHK,array( + "TECTITE" => "www.tectite.com", + "FM_VERS" => "$FM_VERS", + "NEWVERS" => $s_version, + )) . + "\n$s_message\n$s_stop_mesg",true,true); + } + } +} + +// +// Check for new FormMail version +// +function Check4Update($s_chk_file,$s_id = "") +{ + global $lNow,$php_errormsg; + + @ $l_last_chk = filemtime($s_chk_file); + if ($l_last_chk === false || $lNow - $l_last_chk >= (Settings::get('CHECK_DAYS') * 24 * 60 * 60)) { + CheckVersion(); + // + // update the check file's time stamp + // + @ $fp = fopen($s_chk_file,"w"); + if ($fp !== false) { + fwrite($fp,"FormMail version check " . + (empty($s_id) ? "" : "for identifier '$s_id' ") . + "at " . date("H:i:s d-M-Y",$lNow) . "\n"); + fclose($fp); + } else { + SendAlert(GetMessage(MSG_CHK_FILE_ERROR,array("FILE" => $s_chk_file, + "ERROR" => CheckString($php_errormsg) + ))); + } + } +} + +// +// Perform various processing at the end of the script's execution. +// +function OnExit() +{ + FMDebug("OnExit"); + + // + // Check the www.tectite.com website for a new version, but only + // do this check once every CHECK_DAYS days (or on server reboot). + // + if (Settings::get('CHECK_FOR_NEW_VERSION')) { + global $SERVER; + + $a_targets = Settings::get('TARGET_EMAIL'); + if (isset($a_targets[0])) { + // + // use the first few characters of the MD5 of first email + // address pattern from $TARGET_EMAIL to get a unique file + // for the server + // + $s_id = ""; + if (isset($SERVER) && !empty($SERVER)) { + $s_id = $SERVER; + } + $s_dir = GetTempDir(); + $s_md5 = md5($a_targets[0]); + $s_uniq = substr($s_md5,0,6); + $s_chk_file = "fm" . "$s_uniq" . ".txt"; + Check4Update($s_dir . "/" . $s_chk_file,$s_id); + } + } +} + +register_shutdown_function('OnExit'); + +// +// Return the array with each string processed by htmlentities +// +function HTMLEntitiesArray($a_array,$b_equals_processing = false,$s_charset = NULL) +{ + foreach ($a_array as $m_key => $s_str) { + // + // only encode the value after the '=' + // + if ($b_equals_processing && ($i_pos = strpos($s_str,'=')) !== false) { + $a_array[$m_key] = substr($s_str,0,$i_pos + 1) . + FixedHTMLEntities(substr($s_str,$i_pos + 1),$s_charset); + } else { + $a_array[$m_key] = FixedHTMLEntities($s_str,$s_charset); + } + } + return ($a_array); +} + +// +// Unfortunately, htmlentities (in some versions of PHP) gets +// some characters wrong and converts them even when the +// charset is provided. +// This function overcomes this problem. +// +function FixedHTMLEntities($s_str,$s_charset = NULL) +{ + global $sHTMLCharSet; + + if (isset($s_charset) && $s_charset != "") { + return (htmlspecialchars($s_str,ENT_COMPAT,$s_charset)); + } + if (isset($sHTMLCharSet) && $sHTMLCharSet != "") { + return (htmlspecialchars($s_str,ENT_COMPAT,$sHTMLCharSet)); + } + return (htmlentities($s_str)); +} + +// +// Return the array with each string urlencode'd. +// +function URLEncodeArray($a_array) +{ + foreach ($a_array as $m_key => $s_str) { + // + // only encode the value after the '=' + // + if (($i_pos = strpos($s_str,'=')) !== false) { + $a_array[$m_key] = substr($s_str,0,$i_pos + 1) . + urlencode(substr($s_str,$i_pos + 1)); + } else { + $a_array[$m_key] = urlencode($s_str); + } + } + return ($a_array); +} + +// +// Performs charset encoding for header line text. +// This operates according to RFC 2047, but without +// imposing the 75 character limit on an encoding. +// I haven't implemented that because of all the dramas +// with *trying* to obey the header line length rules that +// don't seem to work with PHP, the MTA, and email clients. +// +function EncodeHeaderText($s_text,$i_max_line = -1) +{ + global $sHTMLCharSet; + + // + // RFCLINELEN is the RFC recommended maximum line length, but we don't know + // what the front part of the line will be at this point. + // So, we'll be conservative and reduce it. + // + if ($i_max_line == 0) { + $i_max_line = RFCLINELEN - 15; + } + $s_charset = ""; + if (isset($sHTMLCharSet) && $sHTMLCharSet != "") { + $s_charset = $sHTMLCharSet; + } else { + if (IsMailOptionSet("CharSet")) { + $s_charset = GetMailOption("CharSet"); + } + } + if ($s_charset != "") { + // + // this is the (unused) code for base64 encoding. + // quoted printable is a better choice for human readability + // + //return ("=?".$s_charset."?B?".base64_encode($s_text)."?="); + $s_prefix = "=?" . $s_charset . "?Q?"; + $s_suffix = "?="; + // + // pick a line length that allows a line split with the prefix or suffix added + // to be within the RFC maximum recommended line length + // + return ($s_prefix . QPEncode($s_text,$i_max_line - strlen($s_prefix)) . $s_suffix); + } else { + return ($s_text); + } +} + +// +// Add a parameter or list of parameters to a URL. +// +function AddURLParams($s_url,$m_params,$b_encode = true) +{ + if (!empty($m_params)) { + if (!is_array($m_params)) { + $m_params = array($m_params); + } + $s_anchor = ""; + if (($i_pos = strpos($s_url,'#')) !== false) { + // + // extract the anchor + // + $s_anchor = substr($s_url,$i_pos); + $s_url = substr($s_url,0,$i_pos); + } + if (strpos($s_url,'?') === false) { + $s_url .= '?'; + } else { + $s_url .= '&'; + } + $s_url .= implode('&',($b_encode) ? URLEncodeArray($m_params) : $m_params); + if ($s_anchor !== "") { + $s_url .= "$s_anchor"; + } + } + return ($s_url); +} + +// +// Recursively trim an array of strings (non string values are converted +// to a string first). +// +function TrimArray($a_list) +{ + foreach ($a_list as $m_key => $m_item) { + if (is_array($m_item)) { + $a_list[$m_key] = TrimArray($m_item); + } elseif (is_scalar($m_item)) { + $a_list[$m_key] = trim("$m_item"); + } else { + $a_list[$m_key] = ""; + } + } + return ($a_list); +} + +// +// Parse a derivation specification and return an array of +// field names and operators. +// +function ParseDerivation($s_fld_spec,$s_name,&$a_errors) +{ + $a_deriv = array(); + while (($i_len = strlen($s_fld_spec)) > 0) { + // + // we support the following operators: + // + concatenate with a single space between, but skip the space + // if the next field is empty + // * concatenate with a single space between + // . concatenate with no space between + // + $i_span = strcspn($s_fld_spec,'+*.'); + if ($i_span == 0) { + $a_errors[] = $s_name; + return (false); + } + $a_deriv[] = trim(substr($s_fld_spec,0,$i_span)); + if ($i_span < $i_len) { + $a_deriv[] = substr($s_fld_spec,$i_span,1); + $s_fld_spec = substr($s_fld_spec,$i_span + 1); + } else { + $s_fld_spec = ""; + } + } + return ($a_deriv); +} + +// +// Test if a character is an alphabetic. +// +function IsAlpha($ch) +{ + return ($ch !== "" && strpos("abcdefghijklmnopqrstuvwxyz",strtolower($ch)) !== false); +} + +// +// Test if a character is a digit. +// +function IsNumeric($ch) +{ + return ($ch !== "" && strpos("0123456789",$ch) !== false); +} + +// +// Test if a character is an alphanumeric +// +function IsAlnum($ch) +{ + return (IsAlpha($ch) || IsNumeric($ch)); +} + +/** + * Test if there is a number at the current position in a string. + * (I had to write this because Badoo SoftMocks was crashing on the original + * complex expression.) + * + * @param string $s_str the string + * @param int $i_pos the current position in the string + * @param int $i_len the length of the string + * + * @return bool + */ +function IsANumber($s_str,$i_pos,$i_len) +{ + $ch = $s_str[$i_pos]; + if (IsNumeric($ch)) { + return true; + } + if ($ch == ".") { + if (($i_pos + 1) <= ($i_len - 1)) { + $ch = $s_str[$i_pos + 1]; + return IsNumeric($ch); + } + } + return false; +} + +// +// Return an array of tokens extracted from the given string. +// A token is: +// - a word (begins with alpha or _, and is followed by any number +// of alphanumerics or _ chars) +// - a number (any number of consecutive digits with up to one period) +// - a string enclosed in specified quotes (this can be disabled) +// - any punctuation character +// +// Note that no string escapes (e.g. backslashes) are supported +// Anything not matching the above is silently ignored! +// +function GetTokens($s_str,$s_quotes = "'\"") +{ + $b_allow_strings = $s_quotes !== ""; + $ii = 0; + $i_len = strlen($s_str); + $a_toks = array(); + + while ($ii < $i_len) { + switch ($ch = $s_str[$ii]) { + case " ": + case "\t": + case "\n": + case "\r": + $ii++; + continue 2; + } + // + // start of a token + // + $i_start = $ii; + if ($ch == "_" || IsAlpha($ch)) { + // + // a word + // + $i_count = 1; + while (++$ii < $i_len && + (($ch = $s_str[$ii]) == "_" || IsAlnum($ch))) { + ++$i_count; + } + $a_toks[] = substr($s_str,$i_start,$i_count); + } elseif (IsANumber($s_str,$ii,$i_len)) { + // note: $ch == $s_str[$ii] + // + // a number + // + $b_had_dot = ($ch == "."); + $i_count = 1; + while (++$ii < $i_len) { + $c_check = $s_str[$ii]; + if (IsNumeric($c_check)) { + ++$i_count; + } elseif ($c_check == "." && !$b_had_dot) { + ++$i_count; + $b_had_dot = true; + } else { + break; + } + } + $a_toks[] = substr($s_str,$i_start,$i_count); + } elseif ($b_allow_strings && strpos($s_quotes,$ch) !== false) { + $c_quote = $ch; + // + // a quoted string + // + while (++$ii < $i_len) { + if ($s_str[$ii] == $c_quote) { + ++$ii; // include the terminating quote + break; + } + } + $a_toks[] = substr($s_str,$i_start,$ii - $i_start); + } else { + $s_punct = "~!@#$%^&*()-+={}[]|:;<>,.?/`\\"; + if (!$b_allow_strings) { + $s_punct .= "'\""; + } + if (strpos($s_punct,$ch) !== false) { + $a_toks[] = $ch; + } + ++$ii; + } + } + return ($a_toks); +} + +/** + * Return the value from a derive_fields specification. + * Specifications are in this format: + * %info% + * where info is a predefined word or a literal in quotes + * (e.g. 'the time is ') + * + * @param string $s_spec the specification + * @param FieldManager $field_mgr form fields manager + * @param array $a_errors returns the list of errors + * + * @return string + * @see \FormMail\UnitTests\ValueSpecTest + */ +function ValueSpec($s_spec,$field_mgr,&$a_errors) +{ + global $lNow; + + $s_value = ""; + switch (trim($s_spec)) { + case 'date': // "standard" date format: DD-MMM-YYYY + $s_value = date('d-M-Y',$lNow); + break; + case 'time': // "standard" time format: HH:MM:SS + $s_value = date('H:i:s',$lNow); + break; + case 'ampm': // am or pm + $s_value = date('a',$lNow); + break; + case 'AMPM': // AM or PM + $s_value = date('A',$lNow); + break; + case 'dom0': // day of month with possible leading zero + $s_value = date('d',$lNow); + break; + case 'dom': // day of month with no leading zero + $s_value = date('j',$lNow); + break; + case 'day': // day name (abbreviated) + $s_value = date('D',$lNow); + break; + case 'dayname': // day name (full) + $s_value = date('l',$lNow); + break; + case 'daysuffix': // day number suffix for English (st for 1st, nd for 2nd, etc.) + $s_value = date('S',$lNow); + break; + case 'moy0': // month of year with possible leading zero + $s_value = date('m',$lNow); + break; + case 'moy': // month of year with no leading zero + $s_value = date('n',$lNow); + break; + case 'month': // month name (abbreviated) + $s_value = date('M',$lNow); + break; + case 'monthname': // month name (full) + $s_value = date('F',$lNow); + break; + case 'year': // year (two digits) + $s_value = date('y',$lNow); + break; + case 'fullyear': // year (full) + $s_value = date('Y',$lNow); + break; + case 'rfcdate': // date formatted according to RFC 822 + $s_value = date('r',$lNow); + break; + case 'tzname': // timezone name + $s_value = date('T',$lNow); + break; + case 'tz': // timezone difference from Greenwich +NNNN or -NNNN + $s_value = date('O',$lNow); + break; + case 'hour120': // hour of day (01-12) with possible leading zero + $s_value = date('h',$lNow); + break; + case 'hour240': // hour of day (00-23) with possible leading zero + $s_value = date('H',$lNow); + break; + case 'hour12': // hour of day (1-12) with no leading zero + $s_value = date('g',$lNow); + break; + case 'hour24': // hour of day (0-23) with no leading zero + $s_value = date('G',$lNow); + break; + case 'min': // minute of hour (00-59) + $s_value = date('i',$lNow); + break; + case 'sec': // seconds of minute (00-59) + $s_value = date('s',$lNow); + break; + default: + if ($s_spec[0] == "'") { + // + // to get a quote, use 3 quotes: + // ''' + // + if ($s_spec == "'''") { + $s_value = "'"; + } elseif (substr($s_spec,-1,1) == "'") { + $s_value = substr($s_spec,1,-1); + } else + // + // missing final quote is OK + // + { + $s_value = substr($s_spec,1); + } + } elseif (strspn($s_spec,"0123456789ABCDEF") == 2) { + // + // insert the ASCII character corresponding to + // the hexadecimal value + // + $i_val = intval(substr($s_spec,0,2),16); + $s_value = chr($i_val); + } else { + // + // look for supported functions, start by getting all + // the tokens + // + $a_toks = GetTokens($s_spec); + if (count($a_toks) > 0) { + switch ($a_toks[0]) { + case "if": + // + // "if" function: test first field + // if not empty, then use second field + // else, use third field + // + // Example: if(fld1 ; fld2 ; fld3) + // + // tokens are: + // 1 ( + // 2 the field name to test (first) + // 3 ; + // 4 the "then" spec (can be missing) + // 5 ; + // 6 the "else" spec (can be missing) + // 7 ) + // + if (($n_tok = count($a_toks)) < 6 || + $a_toks[1] != "(" || + $a_toks[3] != ";" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_IF_FMT) + ))); + } else { + $b_ok = true; + $s_fld_name = $a_toks[2]; + $s_then_spec = $s_else_spec = ""; + for ($ii = 4 ; $ii < $n_tok && $a_toks[$ii] != ';' ; $ii++) { + $s_then_spec .= $a_toks[$ii]; + } + if ($ii == $n_tok) { + $b_ok = false; + } else { + // + // Concatenate tokens until the ')'. + // This provides the "else" spec. + // + for (; ++$ii < $n_tok && $a_toks[$ii] != ')' ;) { + $s_else_spec .= $a_toks[$ii]; + } + if ($ii == $n_tok) { + $b_ok = false; + } + } + $s_mesg = ""; + if ($b_ok) { + if (!$field_mgr->TestFieldEmpty($s_fld_name,$s_mesg)) { + $s_fld_spec = $s_then_spec; + } else { + $s_fld_spec = $s_else_spec; + } + $s_value = GetDerivedValue($field_mgr,$s_fld_spec,$a_errors); + } else { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_IF_FMT) + ))); + } + } + break; + case "size": + // + // "size" function: return size of uploaded file + // + // Example: size(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name for the file upload + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SIZE_FMT) + ))); + } elseif (($i_size = GetFileSize($a_toks[2])) !== false) { + $s_value = "$i_size"; + } + break; + case "ext": + // + // "ext" function: return filename extension of uploaded file + // + // Example: ext(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name for the file upload + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_EXT_FMT) + ))); + } elseif (($s_name = GetFileName($a_toks[2])) !== false) { + if (($i_pos = strrpos($s_name,".")) !== false) { + $s_value = substr($s_name,$i_pos + 1); + } + } + break; + case "ucase": + case "lcase": + // + // "ucase" and "lcase" functions: return field + // converted to upper or lower case + // + // Example: lcase(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name to convert + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } elseif ($a_toks[0] == "ucase") { + $s_value = strtoupper($field_mgr->GetFieldValue($a_toks[2])); + } else { + $s_value = strtolower($field_mgr->GetFieldValue($a_toks[2])); + } + break; + case "ltrim": + case "rtrim": + case "trim": + // + // trim functions: return field with whitespace removed + // from left (ltrim), right (rtrim), or both (trim) + // ends. + // + // Example: ltrim(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name to trim + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } else { + $s_value = $a_toks[0]($field_mgr->GetFieldValue($a_toks[2])); + } + break; + case "ltrim0": + // + // ltrim0 function: return field with blanks and + // leading 0's removed from the left. + // + // Example: ltrim0(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name to trim + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } else { + $s_value = $field_mgr->GetFieldValue($a_toks[2]); + $s_value = ltrim($s_value); // trim blanks on left + $i_len = strspn($s_value,"0"); + // + // if the whole string is zeroes, make sure we leave + // one of them! + // + if ($i_len == strlen($s_value)) { + if (--$i_len < 0) { + $i_len = 0; + } + } + $s_value = substr($s_value,$i_len); + } + break; + case "nextnum": + // + // "nextnum" function: return a unique number (next number) + // + // Usage: nextnum[(pad[,base])] + // + // Examples: + // %nextnum% + // %nextnum(8)% + // %nextnum(5;16)% + // + // You can provide a padding amount. In this case, the + // number is padded on the left with zeroes to the number + // of digits specified. + // + // You can also provide a base for your numbers. Valid + // values for base are 2 to 36, inclusive. + // + // tokens are: + // 1 ( + // 2 the padding amount + // 3 ; + // 4 the base + // 5 ) + // + $i_pad = 0; // no padding + $i_base = 10; // base 10 + if (($n_tok = count($a_toks)) > 1) { + if (($n_tok != 4 && $n_tok != 6) || + $a_toks[1] != "(" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T1)" + ))); + } + if ($n_tok == 6 && $a_toks[3] != ";") { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T2)" + ))); + } + if (!is_numeric($a_toks[2]) || + ($n_tok == 6 && !is_numeric($a_toks[4])) + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T3)" + ))); + } + $i_pad = intval($a_toks[2]); + if ($n_tok == 6) { + $i_base = intval($a_toks[4]); + if ($i_base < 2 || $i_base > 36) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => + GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T4)" + ))); + $i_base = 10; + } + } + $s_value = GetNextNum($i_pad,$i_base); + } else { + $s_value = GetNextNum($i_pad,$i_base); + } + break; + case "substr": + // + // "substr" function: return part of a string + // + // Usage: substr(fieldname;start;length) + // + // Examples: + // %substr(field1;0;5)% + // %substr(field1;4)% + // %substr(field1;-4;-1)% + // + // The start is the number of characters to skip + // at the beginning of the string, if positive. + // If negative, the start is calculated from the + // end of the string, and says how many characters + // to go backward from the end. + // + // The length is the number of characters to return, + // if positive. If not specified, then the remainder + // of the string is returned. If negative, it + // specifies the number of characters to be omitted + // from the end of the string. + // + // Examples: + // Assume "f1" has the value "abcdef": + // %substr(f1;0;5)% returns "abcde" + // %substr(f1;4)% returns "ef" + // %substr(f1;1;-1)% returns "bcde" + // %substr(f1;-4;-1)% returns "cde" + // + // tokens are: + // 1 ( + // 2 the field name + // 3 ; + // 4 the start + // 5 ; + // 6 the length + // 7 ) + // + $i_start = 0; // default start + $i_len = null; // no length + if (($n_tok = count($a_toks)) > 1) { + if (($n_tok != 6 && $n_tok != 8) || + $a_toks[1] != "(" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T1)" + ))); + } + if ($n_tok == 8 && + ($a_toks[3] != ";" || $a_toks[5] != ";") + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T2)" + ))); + } + if ($n_tok == 6 && $a_toks[3] != ";") { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T3)" + ))); + } + if (!is_numeric($a_toks[4]) || + ($n_tok == 8 && !is_numeric($a_toks[6])) + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T4)" + ))); + } + $i_start = intval($a_toks[4]); + $s_value = $field_mgr->GetFieldValue($a_toks[2]); + if ($n_tok == 8) { + $i_len = intval($a_toks[6]); + } + if (isset($i_len)) { + $s_value = substr($s_value,$i_start,$i_len); + } else { + $s_value = substr($s_value,$i_start); + } + if ($s_value === FALSE) { + $s_value = ""; + } + } else { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T5)" + ))); + } + break; + case "call": + // + // "call" function: calls a builtin function + // + // Example: call(name ; p1 ; p2 ; ...) + // + // tokens are: + // 1 ( + // 2 the function name + // 3 ; + // 4 first parameter + // 5 ; + // 6 second parameter + // ... ... + // n ) + // + if (($n_tok = count($a_toks)) < 3 || + $a_toks[1] != "(" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => 'Incorrect format for call function' + ))); + } else { + $b_ok = true; + $s_func_name = $a_toks[2]; + $a_params = array(); + if (3 < $n_tok && $a_toks[3] == ';') { + $a_params = CollectParams($a_toks,$n_tok,3); + } + for ($ii = 0 ; $ii < count($a_params) ; $ii++) { + $a_params[$ii] = GetDerivedValue($field_mgr,$a_params[$ii],$a_errors); + } + global $BuiltinFunctions; + + if (!$BuiltinFunctions->Call($s_func_name,$a_params,$s_result)) { + SendAlert($s_result); + } else { + $s_value = $s_result; + } + } + break; + case "urlencode": + // code supplied by Jeff Shields + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } else { + $s_value = urlencode($field_mgr->GetFieldValue($a_toks[2])); + } + break; + default: + SendAlertIgnoreSpam(GetMessage(MSG_UNK_VALUE_SPEC, + array("SPEC" => $s_spec,"MSG" => ""))); + break; + } + } else { + SendAlertIgnoreSpam(GetMessage(MSG_UNK_VALUE_SPEC,array("SPEC" => $s_spec, + "MSG" => "" + ))); + } + } + break; + } + return ($s_value); +} + +// +// Collect parameters for a builtin function call +// +function CollectParams($a_toks,$n_tok,$i_tok) +{ + $a_params = array(); + $i_param = 0; + do { + $i_tok++; + $a_params[$i_param] = ''; + for (; $i_tok < $n_tok && $a_toks[$i_tok] != ';' && $a_toks[$i_tok] != ')' ; $i_tok++) { + $a_params[$i_param] .= $a_toks[$i_tok]; + } + $i_param++; + } while ($a_toks[$i_tok] != ')'); + return ($a_params); +} + +// +// Return the next number or fail on error +// +function GetNextNum($i_pad,$i_base) +{ + global $php_errormsg; + + if (Settings::isEmpty('NEXT_NUM_FILE') || Settings::get('NEXT_NUM_FILE') === "") { + ErrorWithIgnore("next_num_config",GetMessage(MSG_NO_NEXT_NUM_FILE)); + FormMailExit(); + } + if (($fp = @fopen(Settings::get('NEXT_NUM_FILE'),"r+")) === false) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "open", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + if (!flock($fp,defined("LOCK_EX") ? LOCK_EX : 2)) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "flock", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + // + // read the first line only + // + if (!feof($fp)) { + if (($s_line = fread($fp,1024)) === false) { + $i_next = 1; + } elseif (($i_next = intval($s_line)) <= 0) { + $i_next = 1; + } + } else { + $i_next = 1; + } + if (rewind($fp) == 0) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "rewind", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + $s_ret = strval($i_next++); + if (fputs($fp,"$i_next\r\n") <= 0) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "fputs", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + fclose($fp); + if ($i_base != 10) { + $s_ret = base_convert($s_ret,10,$i_base); + $s_ret = strtoupper($s_ret); // always upper case if alphas are used + } + if ($i_pad != 0) { + $s_ret = str_pad($s_ret,$i_pad,"0",STR_PAD_LEFT); + } + return ($s_ret); +} + +// +// Return the value of an object or array as a string. +// +function GetObjectAsString($m_value) +{ + ob_start(); + print_r($m_value); + $s_ret = ob_get_contents(); + ob_end_clean(); + return ($s_ret); +} + +// +// Return a Server or Environment variable value. Returns false if +// not found, otherwise a string value. +// +function GetEnvValue($s_name) +{ + global $aServerVars,$aEnvVars; + + if (isset($aEnvVars[$s_name])) { + $m_value = $aEnvVars[$s_name]; + } elseif (isset($aServerVars[$s_name])) { + $m_value = $aServerVars[$s_name]; + } + // + // some values might not be strings - so convert + // + if (isset($m_value) && !is_scalar($m_value)) { + $m_value = GetObjectAsString($m_value); + } + return (isset($m_value) ? ((string)$m_value) : false); +} + +/** + * Test if a field is set in the given vars array or in the uploaded + * files. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld the field name + * @param array $a_main_vars the field list array + * + * @return bool + */ +function IsFieldSet($s_fld,$a_main_vars) +{ + global $aFileVars; + + $mgr = new FieldManager($a_main_vars,$aFileVars); + return ($mgr->IsFieldSet($s_fld)); +} + +/* + * Function: IsFileField + * Parameters: $s_fld the field name + * Returns: bool true if this is a file upload field + * Description: + * Checks if a field is a file upload field (regardless of whether + * file uploads are being allowed, or whether the actual upload + * is valid in any way). + */ +/** @noinspection PhpUnused */ +function IsFileField($s_fld) +{ + global $aFileVars; + + return (isset($aFileVars[$s_fld])); +} + +// +// Delete the info for an uploaded file +// +function DeleteFileInfo($s_fld) +{ + global $aFileVars; + global $aCleanedValues,$aRawDataValues,$aAllRawValues; + + if (Settings::get('FILEUPLOADS')) { + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + unset($a_saved_files[$s_fld]); + SetSession("FormSavedFiles",$a_saved_files); + } + if (isset($aFileVars[$s_fld])) { + unset($aFileVars[$s_fld]); + } + // + // zap any "name_of" field that has been created + // + $s_name = "name_of_$s_fld"; + unset($aCleanedValues[$s_name]); + unset($aRawDataValues[$s_name]); + unset($aAllRawValues[$s_name]); + } +} + +/** + * Return the info for the uploaded file, or false on error. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * + * @return bool + * @see \FormMail\UnitTests\GetFieldValueTest + */ +function GetFileInfo($s_fld) +{ + global $aFileVars; + + $mgr = new FieldManager(array(),$aFileVars); + return ($mgr->GetFileInfo($s_fld)); +} + +/** + * Return the original name of the uploaded file or false on error. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * + * @return bool + * @see \FormMail\UnitTests\GetFileNameTest + */ +function GetFileName($s_fld) +{ + global $aFileVars; + + $mgr = new FieldManager(array(),$aFileVars); + return ($mgr->GetFileName($s_fld)); +} + +// +// Return the size of the uploaded file or false on error. +// +function GetFileSize($s_fld) +{ + if (($a_upload = GetFileInfo($s_fld)) !== false) { + return ($a_upload["size"]); + } + return (false); +} + +/** + * Return a field value. Empty string is returned if the field is + * not found. File fields return the original name of the uploaded file. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * @param array $a_main_vars the array of fields + * @param string $s_array_sep a separator for joining array values + * + * @return bool|string + * @see \FormMail\UnitTests\GetFieldValueTest + */ +function GetFieldValue($s_fld,$a_main_vars,$s_array_sep = ";") +{ + global $aFileVars; + + $mgr = new FieldManager($a_main_vars,$aFileVars); + return ($mgr->GetFieldValue($s_fld,$s_array_sep)); +} + +/** + * Tests a field against an array of vars for emptiness. + * If the var isn't found there, then the POSTed files array is checked. + * Returns true if the field is empty (a specific error may + * be returned in the $s_mesg parameter). + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * @param array $a_main_vars the array of fields + * @param string $s_mesg returned error message + * + * @return bool + * @see \FormMail\UnitTests\TestFieldEmptyTest + */ +function TestFieldEmpty($s_fld,$a_main_vars,&$s_mesg) +{ + global $aFileVars; + + $mgr = new FieldManager($a_main_vars,$aFileVars); + return ($mgr->TestFieldEmpty($s_fld,$s_mesg)); +} + +// +// Return a derived field value or value specification. +// +function GetDerivedValue($field_mgr,$s_word,&$a_errors) +{ + $s_value = ""; + // + // a field name or a value specification + // value specifications have the following format: + // %spec% + // + if (substr($s_word,0,1) == '%') { + if (substr($s_word,-1,1) != '%') { + SendAlert(GetMessage(MSG_INV_VALUE_SPEC,array("SPEC" => $s_word))); + $s_value = $s_word; + } else { + $s_spec = substr($s_word,1,-1); + $s_value = ValueSpec($s_spec,$field_mgr,$a_errors); + } + } else { + $s_fld_name = $s_word; + // + // try form data first, then the environment/server data + // + if ($field_mgr->IsFieldSet($s_fld_name)) { + $s_value = $field_mgr->GetFieldValue($s_fld_name); + } elseif (($s_value = GetEnvValue($s_fld_name)) === false) { + $s_value = ""; + } + $s_value = trim($s_value); + } + return ($s_value); +} + +// +// Derive a value from the form data using the specification returned +// from ParseDerivation. +// +function DeriveValue($field_mgr,$a_value_spec,$s_name,&$a_errors) +{ + $s_value = ""; + for ($ii = 0 ; $ii < count($a_value_spec) ; $ii++) { + switch ($a_value_spec[$ii]) { + case '+': + // + // concatenate with a single space between, but skip the space + // if the next field is empty + // + if ($ii < count($a_value_spec) - 1) { + $s_temp = GetDerivedValue($field_mgr,$a_value_spec[$ii + 1],$a_errors); + if (!FieldManager::IsEmpty($s_temp)) { + $s_value .= ' '; + } + } + break; + case '.': + // + // concatenate with no space between + // + break; + case '*': + // + // concatenate with a single space between + // + $s_value .= ' '; + break; + default: + // + // a field name or a value specification + // value specifications have the following format: + // %name% + // + $s_value .= GetDerivedValue($field_mgr,$a_value_spec[$ii],$a_errors); + break; + } + } + return ($s_value); +} + +// +// Create derived fields specified by the "derive_fields" value. +// +function CreateDerived($a_form_data) +{ + global $aFileVars; + + if (isset($a_form_data["derive_fields"])) { + $a_errors = array(); + // + // get the list of derived field specifications + // + $a_list = TrimArray(explode(",",$a_form_data["derive_fields"])); + $field_mgr = new FieldManager($a_form_data,$aFileVars); + foreach ($a_list as $s_fld_spec) { + if ($s_fld_spec === "") + // + // silently ignore empty derivations + // + { + continue; + } + if (($i_pos = strpos($s_fld_spec,"=")) === false) { + $a_errors[] = $s_fld_spec; + continue; + } + $s_name = trim(substr($s_fld_spec,0,$i_pos)); + $s_fld_spec = substr($s_fld_spec,$i_pos + 1); + + if (($a_value_spec = ParseDerivation($s_fld_spec,$s_name,$a_errors)) === false + ) { + break; + } + $a_form_data[$s_name] = DeriveValue($field_mgr,$a_value_spec,$s_name,$a_errors); + // we've added a new field, so we need a new FieldManager object + $field_mgr = new FieldManager($a_form_data,$aFileVars); + } + if (count($a_errors) > 0) { + SendAlertIgnoreSpam(GetMessage(MSG_DERIVED_INVALID) . implode("\n",$a_errors)); + ErrorWithIgnore("derivation_failure",GetMessage(MSG_INT_FORM_ERROR)); + } + } + return ($a_form_data); +} + +// +// To process the name specification for files and update the +// array of file variables accordingly. +// +function SetFileNames($s_name_spec,$a_order,$a_fields,$a_raw_fields,$a_all_raw_values,$a_file_vars) +{ + $a_errors = array(); + // + // get the list of file name derivations + // + $a_list = TrimArray(explode(",",$s_name_spec)); + foreach ($a_list as $s_fld_spec) { + if ($s_fld_spec === "") + // + // silently ignore empty file name derivations + // + { + continue; + } + if (($i_pos = strpos($s_fld_spec,"=")) === false) { + $a_errors[] = $s_fld_spec; + continue; + } + $s_name = trim(substr($s_fld_spec,0,$i_pos)); + $s_fld_spec = substr($s_fld_spec,$i_pos + 1); + + if (($a_value_spec = ParseDerivation($s_fld_spec,$s_name,$a_errors)) === false + ) { + break; + } + if (isset($a_file_vars[$s_name]) && FieldManager::IsUploadedFile($a_file_vars[$s_name])) { + // + // we create our own special entry in the file variable's data + // + $a_file_vars[$s_name]["new_name"] = DeriveValue(new FieldManager($a_raw_fields,$a_file_vars), + $a_value_spec,$s_name,$a_errors); + // + // we also create (derive) a new field called 'name_of_X' + // where X is the file fields's name + // + ProcessField("name_of_$s_name",$a_file_vars[$s_name]["new_name"], + $a_order,$a_fields,$a_raw_fields); + $a_all_raw_values["name_of_$s_name"] = $a_file_vars[$s_name]["new_name"]; + } + /* This is annoying if a file upload is optional. Just ignore missing + file upload fields. + else + SendAlert(GetMessage(MSG_FILE_NAMES_NOT_FILE, + array("NAME"=>$s_name)));*/ + } + if (count($a_errors) > 0) { + SendAlertIgnoreSpam(GetMessage(MSG_FILE_NAMES_INVALID) . implode("\n",$a_errors)); + ErrorWithIgnore("file_names_derivation_failure",GetMessage(MSG_INT_FORM_ERROR)); + } + return (array($a_order,$a_fields,$a_raw_fields,$a_all_raw_values,$a_file_vars)); +} + +$aProcessSpecsFormData = array(); +$sProcessSpecsFieldName = ""; + +// +// Callback function for ProcessSpecs +// +function ProcessSpecsMatch($a_matches) +{ + global $aProcessSpecsFormData,$sProcessSpecsFieldName,$aFileVars; + + // + // strip % at either end + // + $s_spec = substr($a_matches[0],1,-1); + $a_errors = array(); + $s_value = ValueSpec($s_spec,new FieldManager($aProcessSpecsFormData,$aFileVars),$a_errors); + return ($s_value); +} + +// +// Process %...% specifications in a string. +// This function is used for processing options values, such as in "autorespond" +// and "mail_options". +// +function ProcessSpecs($s_fld_name,$a_form_data,$s_value) +{ + global $aProcessSpecsFormData,$sProcessSpecsFieldName; + + $aProcessSpecsFormData = $a_form_data; + $sProcessSpecsFieldName = $s_fld_name; + // + // un-greedy pattern match + // Note that this means we can't use %..% within a %if(..)%, for example. + // + $s_value = preg_replace_callback('/%.+?%/',"ProcessSpecsMatch",$s_value); + $aProcessSpecsFormData = array(); + $sProcessSpecsFieldName = ""; + return ($s_value); +} + +// +// Process a list of attributes or options. +// Format for each attribute/option: +// name +// or +// name=value +// +// Values can be simple values or semicolon (;) separated lists: +// avalue +// value1;value2;value3;... +// +// Returns attribute/options in the associative array $a_attribs. +// Optionally, valid attributes can be provided in $a_valid_attribs +// (if empty, all attributes found are considered valid). +// Errors are returned in $a_errors. +// +function ProcessAttributeList($s_fld_name,$a_form_data,$a_list,&$a_attribs,&$a_errors, + $a_valid_attribs = array()) +{ + $b_got_valid_list = (count($a_valid_attribs) > 0); + foreach ($a_list as $s_attrib) { + // + // if the name begins with '.' then silently ignore it; + // this allows you to temporarily disable an option without + // getting an alert message + // + if (($i_pos = strpos($s_attrib,"=")) === false) { + $s_name = trim($s_attrib); + if (empty($s_name) || $s_name[0] == '.') { + continue; + } + // + // option is a simple "present" value + // + $a_attribs[$s_name] = true; + } else { + $s_name = trim(substr($s_attrib,0,$i_pos)); + if (empty($s_name) || $s_name[0] == '.') { + continue; + } + $s_value_list = substr($s_attrib,$i_pos + 1); + if (($i_pos = strpos($s_value_list,";")) === false) + // + // single value + // + { + $a_attribs[$s_name] = ProcessSpecs($s_fld_name,$a_form_data,trim($s_value_list)); + } else + // + // list of values + // + { + $a_attribs[$s_name] = TrimArray(explode(";",$s_value_list)); + } + } + if ($b_got_valid_list && !isset($a_valid_attribs[$s_name])) { + $a_errors[] = $s_name; + } + } +} + +// +// Process the options specified in the form. +// Options can be specified in this format: +// option1,option2,option3,... +// Each option can be a simple word or a word and value: +// name +// name=value +// No name or value can contain a comma. +// Values can be simple values or semicolon (;) separated lists: +// avalue +// value1;value2;value3;... +// No value can contain a semicolon. +// Be careful of values beginning and ending with whitespace characters; +// they will be trimmed. +// +function ProcessOptions($s_name,$a_form_data,&$a_options,$a_valid_options) +{ + $a_errors = array(); + $a_options = array(); + if (isset($a_form_data[$s_name])) { + // + // get the options list and trim each one + // + $a_list = TrimArray(explode(",",$a_form_data[$s_name])); + ProcessAttributeList($s_name,$a_form_data,$a_list,$a_options,$a_errors,$a_valid_options); + } + if (count($a_errors) > 0) { + SendAlertIgnoreSpam(GetMessage(MSG_OPTIONS_INVALID,array("OPT" => $s_name)) . + implode("\n",$a_errors)); + } +} + +// +// Process the mail_options specified in the form. +// +function ProcessMailOptions($a_form_data) +{ + global $MAIL_OPTS,$VALID_MAIL_OPTIONS; + + ProcessOptions("mail_options",$a_form_data,$MAIL_OPTS,$VALID_MAIL_OPTIONS); +} + +// +// Check if an option is set +// +function IsMailOptionSet($s_name) +{ + global $MAIL_OPTS; + + return (isset($MAIL_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +function GetMailOption($s_name) +{ + global $MAIL_OPTS; + + return (isset($MAIL_OPTS[$s_name]) ? $MAIL_OPTS[$s_name] : NULL); +} + +// +// Process the crm_options specified in the form. +// +function ProcessCRMOptions($a_form_data) +{ + global $CRM_OPTS,$VALID_CRM_OPTIONS; + + ProcessOptions("crm_options",$a_form_data,$CRM_OPTS,$VALID_CRM_OPTIONS); +} + +// +// Check if an option is set +// +function IsCRMOptionSet($s_name) +{ + global $CRM_OPTS; + + return (isset($CRM_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +/** @noinspection PhpUnused */ +function GetCRMOption($s_name) +{ + global $CRM_OPTS; + + return (isset($CRM_OPTS[$s_name]) ? $CRM_OPTS[$s_name] : NULL); +} + +// +// Check if a field is in the mail exclusion list. +// +function IsMailExcluded($s_name) +{ + $a_list = GetMailOption("Exclude"); + if (!isset($a_list)) { + return (false); + } + if (is_array($a_list)) { + return (in_array($s_name,$a_list)); + } else { + return ($s_name === $a_list); + } +} + +// +// Process the autorespond specified in the form. +// +function ProcessAROptions($a_form_data) +{ + global $AR_OPTS,$VALID_AR_OPTIONS; + + ProcessOptions("autorespond",$a_form_data,$AR_OPTS,$VALID_AR_OPTIONS); +} + +// +// Check if an option is set +// +function IsAROptionSet($s_name) +{ + global $AR_OPTS; + + return (isset($AR_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +function GetAROption($s_name) +{ + global $AR_OPTS; + + return (isset($AR_OPTS[$s_name]) ? $AR_OPTS[$s_name] : NULL); +} + +// +// Process the mail_options specified in the form. +// +function ProcessFilterOptions($a_form_data) +{ + global $FILTER_OPTS,$VALID_FILTER_OPTIONS; + + ProcessOptions("filter_options",$a_form_data,$FILTER_OPTS,$VALID_FILTER_OPTIONS); +} + +// +// Check if an option is set +// +function IsFilterOptionSet($s_name) +{ + global $FILTER_OPTS; + + return (isset($FILTER_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +function GetFilterOption($s_name) +{ + global $FILTER_OPTS; + + return (isset($FILTER_OPTS[$s_name]) ? $FILTER_OPTS[$s_name] : NULL); +} + +// +// Lookup a filter attribute for the given filter. +// Return it's value or false if not set. +// +function GetFilterAttrib($s_filter,$s_attrib) +{ + global $FILTER_ATTRIBS_LOOKUP; + + $a_attribs = Settings::get('FILTER_ATTRIBS'); + if (!isset($a_attribs[$s_filter])) + // + // no attributes for the filter + // + { + return (false); + } + if (!isset($FILTER_ATTRIBS_LOOKUP[$s_filter])) { + // + // the attributes have not yet been parsed - create the lookup table + // + $a_list = TrimArray(explode(",",$a_attribs[$s_filter])); + $FILTER_ATTRIBS_LOOKUP[$s_filter] = array(); + $a_errors = array(); + + ProcessAttributeList('FILTER_ATTRIBS',array(),$a_list,$FILTER_ATTRIBS_LOOKUP[$s_filter],$a_errors); + } + // + // perform the lookup and return the value + // + if (!isset($FILTER_ATTRIBS_LOOKUP[$s_filter][$s_attrib])) { + return (false); + } + return ($FILTER_ATTRIBS_LOOKUP[$s_filter][$s_attrib]); +} + +// +// Check the filter attributes for the given filter. +// Return true if the given attribute is set otherwise false. +// +function IsFilterAttribSet($s_filter,$s_attrib) +{ + return (GetFilterAttrib($s_filter,$s_attrib)); +} + +// +// Process the given .ini file. +// +function ProcessFormIniFile($s_file) +{ + global $EMAIL_ADDRS,$ValidEmails; + + $a_sections = parse_ini_file($s_file,TRUE); + // + // from PHP 5.2.7, parse_ini_file returns false on syntax problems + // prior to that, an empty array. So, on previous versions of PHP + // we cannot detect an actual error (an empty array is perfectly valid). + // + if ($a_sections === false) { + Error("bad_ini",GetMessage(MSG_INI_PARSE_ERROR,array("FILE" => $s_file))); + } elseif (empty($a_sections)) { + SendAlert(GetMessage(MSG_INI_PARSE_WARN,array("FILE" => $s_file)),false,true); + } + if (Settings::get('DB_SEE_INI')) { + // + // just display the ini file + // + $s_text = "

The following settings were found in the file '$s_file':

"; + foreach ($a_sections as $s_sect => $a_settings) { + $s_text .= "

[$s_sect]\n"; + foreach ($a_settings as $s_name => $s_value) { + $s_text .= "$s_name = \"$s_value\"\n"; + } + $s_text .= "

"; + } + CreatePage($s_text,"Debug Output - INI File Display"); + FormMailExit(); + } + // + // Load the email_addresses section. + // + if (isset($a_sections["email_addresses"])) { + $a_addr_list = $a_sections["email_addresses"]; + // + // make these addresses valid + // + foreach ($a_addr_list as $s_alias => $s_list) { + $EMAIL_ADDRS[$s_alias] = $s_list; + $ValidEmails->AddAddresses($s_list); + } + } + // + // Process special fields + // + if (isset($a_sections["special_fields"])) { + foreach ($a_sections["special_fields"] as $s_name => $m_value) { + if (IsSpecialField($s_name)) { + ValidateSpecialField($s_name,$m_value,false); + SetSpecialField($s_name,$m_value); + // + // if this is the recipients, cc, or bcc field, + // make the addresses valid + // + if ($s_name === "recipients" || $s_name === "cc" || $s_name === "bcc") + // + // coming from the INI file, the values can only be strings + // + { + if (is_string($m_value)) { + $ValidEmails->AddAddresses($m_value); + } + } + } + // + // check for multiple valued special fields + // + if (($a_multi_fld = IsSpecialMultiField($s_name)) !== false) { + SetSpecialMultiField($a_multi_fld[0],$a_multi_fld[1],$m_value); + } + } + } +} + +/** + * UnMangle an email address. This means replacing AT_MANGLE in the given + * string with the @ symbol. + * It can also lookup an email alias and return the corresponding email address. + * Email aliases are defined in the EMAIL_ADDRS configuration setting or in an INI file. + * + * @param string $s_email the email address to unmangle + * + * @return string the actual email address + */ +function UnMangle($s_email) +{ + $email_addrs = Settings::get('EMAIL_ADDRS'); + + // + // map from a name to the real email address; if it exists + // + if (isset($email_addrs[$s_email])) { + $s_email = $email_addrs[$s_email]; + } + // + // unmangle + // + if (Settings::get('AT_MANGLE') != "") { + $s_email = str_replace(Settings::get('AT_MANGLE'),"@",$s_email); + } + return ($s_email); +} + +// +// Check a list of email addresses (comma separated); returns a list +// of valid email addresses (comma separated). +// The list can be an array of comma separated lists. +// The return value is true if there is at least one valid email address. +// +function CheckEmailAddress($m_addr,&$s_valid,&$s_invalid,$b_check = true) +{ + global $ValidEmails; + + $s_invalid = $s_valid = ""; + if (is_array($m_addr)) { + $a_list = array(); + foreach ($m_addr as $s_addr_list) { + $a_list = array_merge($a_list,TrimArray(explode(",",$s_addr_list))); + } + } else { + $a_list = TrimArray(explode(",",$m_addr)); + } + $a_invalid = array(); + $n_empty = 0; + for ($ii = 0 ; $ii < count($a_list) ; $ii++) { + if ($a_list[$ii] === "") { + // + // ignore, but count empty addresses + // + $n_empty++; + continue; + } + $s_email = UnMangle($a_list[$ii]); + // + // UnMangle works with INI files too, and a single + // word can expand to a list of email addresses. + // + $a_this_list = TrimArray(explode(",",$s_email)); + foreach ($a_this_list as $s_email) { + if ($s_email === "") { + // + // ignore, but count empty addresses + // + $n_empty++; + continue; + } + if ($b_check) { + $b_is_valid = $ValidEmails->CheckAddress($s_email); + } else { + $b_is_valid = true; + } + if ($b_is_valid) { + if (empty($s_valid)) { + $s_valid = $s_email; + } else { + $s_valid .= "," . $s_email; + } + } else { + $a_invalid[] = $s_email; + } + } + } + // + // just ignore empty recipients unless there are *no* valid recipients + // + if (empty($s_valid) && $n_empty > 0) { + $a_invalid[] = GetMessage(MSG_EMPTY_ADDRESSES,array("COUNT" => $n_empty)); + } + if (count($a_invalid) > 0) { + $s_invalid = implode(",",$a_invalid); + } + return (!empty($s_valid)); +} + +// +// PHP 8 replacement for +// filter_var($url,FILTER_SANITIZE_STRING) +// See: https://stackoverflow.com/questions/69207368/constant-filter-sanitize-string-is-deprecated +// +function filter_string_polyfill(string $string): string +{ + $str = preg_replace('/\x00|<[^>]*>?/','',$string); + return str_replace(["'",'"'],[''','"'],$str); +} + +// +// Redirect to another URL +// +function Redirect($url,$title) +{ + global $ExecEnv; + + // + // for browsers without cookies enabled, append the Session ID + // + if ($ExecEnv->allowSessionURL()) { + if (session_id() !== "") { + $url = AddURLParams($url,session_name() . "=" . urlencode(session_id())); + } elseif (defined("SID")) { + $url = AddURLParams($url,SID); + } + } + + //FMDebug("Before redirecting, FormData = ".(isset($_SESSION["FormData"]) ? var_export($_SESSION["FormData"],true) : "NULL")); + + // + // this is probably a good idea to ensure the session data + // is written away + // + if (function_exists('session_write_close')) { + session_write_close(); + } + + header("Location: $url"); + + // + // avoid XSS by sanitizing the URL + // + $url = stripJS(filter_string_polyfill($url)); + + // + // if the header doesn't work, try JavaScript. + // if that doesn't work, provide a manual link + // + $s_text = GetMessage(MSG_PLSWAIT_REDIR) . "\n\n"; + $s_text .= ""; + $s_text .= "\n\n" . GetMessage(MSG_IFNOT_REDIR,array("URL" => $url)); + CreatePage($s_text,$title); + FormMailExit(); +} + +/** + * Remove 'javascript:' from the given text. + * + * @param string $s_text the text to be modified + * + * @return string|string[] + */ +function stripJS($s_text) +{ + return str_ireplace('javascript:','',$s_text); +} + +class JSON +{ + function _Format($m_val) + { + if (is_bool($m_val)) { + $s_value = ($m_val) ? "true" : "false"; + } elseif (is_string($m_val)) { + // + // convert literal line breaks into JavaScript escape sequences + // + $s_value = '"' . str_replace(array("\r","\n"),array('\\r','\\n'),addslashes($m_val)) . '"'; + } elseif (is_numeric($m_val)) { + $s_value = $m_val; + } elseif (is_array($m_val)) { + $s_value = $this->_FormatArray($m_val); + } else { + $s_value = "null"; + } + return ($s_value); + } + + function _FormatArray($a_array) + { + if ($this->_IsNumericArray($a_array)) { + $a_values = array(); + foreach ($a_array as $m_val) { + $a_values[] = $this->_Format($m_val); + } + $s_value = "[" . implode(",",$a_values) . "]"; + } else { + // + // associative arrays are objects + // + $s_value = $this->MakeObject($a_array); + } + return ($s_value); + } + + // + // check if we have a numeric array or an associative array + // numeric arrays may have holes; numeric array indexes must + // be integers + // + function _IsNumericArray($a_data) + { + if (empty($a_data)) { + return (true); + } // empty array - treat as numeric + // + // check all the keys for numeric + // + $a_keys = array_keys($a_data); + foreach ($a_keys as $m_index) { + if (!is_int($m_index)) { + return (false); + } + } + return (true); + } + + function MakeObject($a_data) + { + $a_members = array(); + foreach ($a_data as $s_key => $m_val) { + $a_members[] = '"' . $s_key . '":' . $this->_Format($m_val); + } + return ("{" . implode(",",$a_members) . "}"); + } +} + +function CORS_Response() +{ + header('Access-Control-Allow-Origin: *'); + header('Access-Control-Max-Age: 36000'); + header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); + header('Access-Control-Allow-Headers: X-Requested-With'); +} + +function JSON_Result($s_result,$a_data = array()) +{ + global $aGetVars; + + FMDebug("Sending JSON_Result: $s_result"); + $a_data["Result"] = $s_result; + $json = new JSON(); + $s_ret = $json->MakeObject($a_data); + CORS_Response(); + // + // handle JSONP request + // + if (isset($aGetVars['callback']) && $aGetVars['callback'] != '') { + header('Content-Type: text/javascript; charset=utf-8'); + $s_ret = $aGetVars['callback'] . "($s_ret);"; + FMDebug('JSONP request callback=' . $aGetVars['callback']); + } else { + header('Content-Encoding: utf-8'); + header('Content-Type: application/json; charset=utf-8'); + } + FMDebug("JSON_Result output: " . $s_ret); + echo $s_ret; +} + +// +// JoinLines is just like "implode" except that it checks +// the end of each array for the separator already being +// there. This allows us to join a mixture of mail +// header lines (already terminated) with body lines. +// This logic works if HEAD_CRLF, for example, is the same +// as BODY_LF (i.e. both "\r\n") or if BODY_LF is the +// same as the last character in HEAD_CRLF (i.e. +// HEAD_CRLF = "\r\n" and BODY_LF = "\n"). +// Other value combinations may break things. +// +function JoinLines($s_sep,$a_lines) +{ + $s_str = ""; + if (($i_sep_len = strlen($s_sep)) == 0) + // + // no separator + // + { + return (implode("",$a_lines)); + } + $n_lines = count($a_lines); + for ($ii = 0 ; $ii < $n_lines ; $ii++) { + $s_line = $a_lines[$ii]; + if (substr($s_line,-$i_sep_len) == $s_sep) { + $s_str .= $s_line; + } else { + $s_str .= $s_line; + // + // don't append a separator to the last line + // + if ($ii < $n_lines - 1) { + $s_str .= $s_sep; + } + } + } + return ($s_str); +} + +// +// Re-orders an array of email headers into the +// order recommended by RFC822, section 4.1: +// It is recommended that, if present, +// headers be sent in the order "Return- +// Path", "Received", "Date", "From", "Subject", +// "Sender", "To", "cc", etc. +// +// Note that RFC822 is obsoleted by RFC2822 and +// the latter states that field order doesn't +// matter (except for some tracing fields). +// However, a FormMail user reported that Yahoo doesn't like +// email where the CC header appears before the From +// header. So, as always, we try to work with broken +// servers too... +// +// Returns an array indexed by the require numerical +// order. Each element is an array containing the +// header value (name,value pair). +// +function OrderHeaders($a_headers) +{ + // + // we list the headers we're responsible for + // in the order suggested + // + $a_ordering = array("From","Subject","To","Cc","Bcc","Reply-To"); + $a_ordered_headers = array(); + foreach ($a_ordering as $s_name) { + if (isset($a_headers[$s_name])) { + $a_ordered_headers[] = array($s_name => $a_headers[$s_name]); + unset($a_headers[$s_name]); + } + } + // + // now add in the remaining headers + // + foreach ($a_headers as $s_name => $s_value) { + $a_ordered_headers[] = array($s_name => $a_headers[$s_name]); + } + return ($a_ordered_headers); +} + +// +// Makes a mail header field body "safe". +// This simply places a backslash in front of every double-quote. +// There's probably more we could do if required, but this +// attempts to provide the same protection that was in the first +// version of FormMail. In that version, every incoming +// field had double-quotes replaced with single quotes. +// That processing is no longer performed, and this +// function is used to protect against potential attacks in +// header fields - not by replacing double quotes with single quotes, +// but by using the backslash "quoting" feature of RFC2822. +// +// This code could be improved by parsing the header and rewriting +// it to be valid, possibly removing junk. +// +// That's a lot of code, though! +// +function SafeHeader($s_str) +{ + return (str_replace('"','\\"',$s_str)); +} + +// +// makes a string safe to put as words in a header +// +function SafeHeaderWords($s_str) +{ + // + // We zap various characters and replace them with a question mark. + // Also, we don't handle quoted strings, which are valid words. + // + $s_specials = '()<>@,;:\\".[]'; // special characters defined by RFC822 + $s_str = preg_replace('/[[:cntrl:]]+/',"?",$s_str); // zap all control chars + $s_str = preg_replace("/[" . preg_quote($s_specials,"/") . "]/","?",$s_str); // zap all specials + return ($s_str); +} + +// +// makes a string safe to put as a quoted string in a header +// +function SafeHeaderQString($s_str) +{ + return (str_replace('"','\\"', + str_replace("\\","\\\\", + str_replace("\r"," ", + str_replace("\r\n"," ",$s_str))))); +} + +// +// makes a string safe to put in a header comment +// +function SafeHeaderComment($s_str) +{ + return (str_replace("(","\\(", + str_replace(")","\\)", + str_replace("\\","\\\\", + str_replace("\r"," ", + str_replace("\r\n"," ",$s_str)))))); +} + +// +// makes a string safe to put in a header as an email address +// +function SafeHeaderEmail($s_str) +{ + // + // An email address is made up of local and domain parts + // each of these is made up of "words" separated by "." + // each "word" can be a sequence of characters excluding + // specials, space and control characters OR it can be + // a quoted string. + // + // The correct processing would be to completely + // parse the address, strip junk, double-quote + // words that need to be turned into quote strings, + // and return a well-formed email address. + // + // That's a lot of code! + // + // So, instead, we opt for stripping out control characters. + // + $s_str = preg_replace('/[[:cntrl:]]+/',"",$s_str); // zap all control chars + return ($s_str); +} + +// +// Expands an array of mail headers into mail header lines. +// +function ExpandMailHeaders($a_headers,$b_fold = false) +{ + $s_hdrs = ""; + $a_ordered_headers = OrderHeaders($a_headers); + for ($ii = 0 ; $ii < count($a_ordered_headers) ; $ii++) { + foreach ($a_ordered_headers[$ii] as $s_name => $s_value) { + if ($s_name != "") { + if ($s_hdrs != "") { + $s_hdrs .= Settings::get('HEAD_CRLF'); + } + if ($b_fold) { + $s_hdrs .= HeaderFolding($s_name . ": " . $s_value); + } else { + $s_hdrs .= $s_name . ": " . $s_value; + } + } + } + } + //FMDebug("Headers are: $s_hdrs"); + return ($s_hdrs); +} + +// +// Expands an array of mail headers into an array containing header lines. +// +function ExpandMailHeadersArray($a_headers) +{ + $a_hdrs = array(); + $a_ordered_headers = OrderHeaders($a_headers); + for ($ii = 0 ; $ii < count($a_ordered_headers) ; $ii++) { + foreach ($a_ordered_headers[$ii] as $s_name => $s_value) { + if ($s_name != "") { + $a_hdrs[] = $s_name . ": " . $s_value . Settings::get('HEAD_CRLF'); + } + } + } + return ($a_hdrs); +} + +// +// Low-level email send function; either calls PHP's mail function +// or uses the PEAR Mail object. +// NOTE: for some errors, there's no point trying to email +// an alert message! So, in these cases, we just display the error to +// the user. +// $s_options are ignored for PEAR sending. +// +function DoMail($s_to,$s_subject,$s_mesg,$a_headers,$s_options) +{ + global $ALT_MAIL_FUNCTION; + + if ($ALT_MAIL_FUNCTION !== '') { + return ($ALT_MAIL_FUNCTION($s_to,$s_subject,$s_mesg,$a_headers,$s_options)); + } else { + // + // Encode the subject line. + // Ideally, we want to encode the relevant parts of To, From, Cc, + // Reply-To, and this is the right place to do it. + // However, it's another 1000 lines of code! + // So, we must compromise the code quality because of this cost. + // We encode subject here, and we encode the From line where it's + // created. The rest remain for a future version where code size + // can be controlled. + // + $s_subject = EncodeHeaderText($s_subject); + if (!Settings::isEmpty('PEAR_SMTP_HOST')) { + // + // Note that PEAR Mail seems to take responsibility for header line folding + // + require_once("Mail.php"); + + $a_params = array("host" => Settings::get('PEAR_SMTP_HOST'), + "port" => Settings::get('PEAR_SMTP_PORT') + ); + if (!Settings::isEmpty('PEAR_SMTP_USER')) { + $a_params["auth"] = TRUE; + $a_params["username"] = Settings::get('PEAR_SMTP_USER'); + $a_params["password"] = Settings::get('PEAR_SMTP_PWD'); + } + $mailer = Mail::factory("smtp",$a_params); + if (!is_object($mailer)) { + ShowError("pear_error",GetMessage(MSG_PEAR_OBJ),FALSE,FALSE); + FormMailExit(); + } + if (strtolower(get_class($mailer)) === 'pear_error') { + ShowError("pear_error",$mailer->getMessage(),FALSE,FALSE); + FormMailExit(); + } + if (!isset($a_headers['To']) && !isset($a_headers['to'])) { + $a_headers['To'] = SafeHeader($s_to); + } + if (!isset($a_headers['Subject']) && !isset($a_headers['subject'])) { + $a_headers['Subject'] = SafeHeader($s_subject); + } + $res = $mailer->send($s_to,$a_headers,$s_mesg); + if ($res === TRUE) { + return (TRUE); + } + + global $aAlertInfo; + + $aAlertInfo[] = GetMessage(MSG_PEAR_ERROR,array("MSG" => $res->getMessage())); + return (FALSE); + } else { + //$s_subject = HeaderFolding($s_subject,RFCLINELEN-10); // "Subject: " is about 10 chars + // + // Notes from Feb 2010.... + // + // PHP's mail function (tested in version 5.2.6) does folding of the + // To line and the Subject line. + // If we do it, then things break. + // + // This area is quite confusing. It's not clear whether the script + // should be folding header lines or whether the MTA should do it. + // We *do know* (as stated above) that folding To and Subject breaks things. + // + // But folding other header lines properly, seems to be OK. + // + // However, for years FormMail never did header line folding (except for the + // soft line breaks inserted by the quoted_printable_encode function we had used), + // and we didn't seem to get any reports of breakage (except for problems + // with the quoted_printable_encode soft line breaks!). + // + // So, even though we've implemented all the code for header line folding, + // we'll not use it. + // No header line folding will be performed in version 8.22 onwards. + // + if ($s_options !== "") { + return (mail($s_to,$s_subject,$s_mesg,ExpandMailHeaders($a_headers),$s_options)); + } else { + return (mail($s_to,$s_subject,$s_mesg,ExpandMailHeaders($a_headers))); + } + } + } +} + +// +// Send an email +// +function SendCheckedMail($to,$subject,$mesg,$sender,$a_headers = array()) +{ + + $b_f_option = false; + $b_form_option = IsMailOptionSet("SendMailFOption"); // this is superseded, but still supported + if (Settings::get('SENDMAIL_F_OPTION') || $b_form_option) { + if (empty($sender)) { + // + // SENDMAIL_F_OPTION with no sender is silently ignored + // + if ($b_form_option) { + // + // form has specified SendMailFOption, but there's no + // sender address + // + static $b_in_here = false; + global $SERVER; + + if (!$b_in_here) // prevent infinite recursion + { + $b_in_here = true; + SendAlert(GetMessage(MSG_NO_FOPT_ADDR)); + $b_in_here = false; + } + // + // if there's no from address, create a dummy one + // + $sender = "dummy@" . (isset($SERVER) ? $SERVER : "UnknownServer"); + $a_headers['From'] = $sender; + $b_f_option = true; + } + } else { + $b_f_option = true; + } + } + if (Settings::get('INI_SET_FROM') && !empty($sender)) { + ini_set('sendmail_from',$sender); + } + + return (DoMail($to,$subject,$mesg,$a_headers,($b_f_option ? "-f$sender" : ""))); +} + +// +// Send an alert email, but not if ATTACK_DETECTION_IGNORE_ERRORS is true. +// +function SendAlertIgnoreSpam($s_error,$b_filter = true,$b_non_error = false) +{ + if (!Settings::get('ATTACK_DETECTION_IGNORE_ERRORS')) { + SendAlert($s_error,$b_filter,$b_non_error); + } +} + +// +// Send an alert email +// +function SendAlert($s_error,$b_filter = true,$b_non_error = false,$s_addl_subject = '') +{ + global $SPECIAL_VALUES,$FORMATTED_INPUT,$aServerVars,$aStrippedFormVars; + global $aAlertInfo,$aCleanedValues,$aFieldOrder,$sHTMLCharSet; + + // + // The following initialisations are so that ShowError can run from fmhookpreinit scripts + // + $aSpecialValues = isset($SPECIAL_VALUES) ? $SPECIAL_VALUES : array(); + $aFormattedInputValues = isset($FORMATTED_INPUT) ? $FORMATTED_INPUT : array(); + $aServerVarValues = isset($aServerVars) ? $aServerVars : array(); + $aStrippedFormVarValues = isset($aStrippedFormVars) ? $aStrippedFormVars : array(); + $aAlertInfoValues = isset($aAlertInfo) ? $aAlertInfo : array(); + $aCleaned = isset($aCleanedValues) ? $aCleanedValues : array(); + $aFieldOrderValues = isset($aFieldOrder) ? $aFieldOrder : array(); + + $s_error = str_replace("\n",Settings::get('BODY_LF'),$s_error); + $b_got_filter = GetFilterSpec($s_filter_name,$a_filter_list); + + // + // if there is a filter specified and we're not sending the alert + // through the filter, don't show the user's data. This is + // on the assumption that the filter is an encryption program; so, + // we don't want to send the user's data in clear text inside the + // alerts. + // + $b_show_data = true; + if ($b_got_filter && !$b_filter) { + $b_show_data = false; + } + + $s_form_subject = $s_alert_to = ""; + $b_check = true; + // + // might be too early to have $aSpecialValues set, so + // look in the form vars too + // + if (isset($aSpecialValues["alert_to"])) { + $s_alert_to = trim($aSpecialValues["alert_to"]); + } + if (empty($s_alert_to) && isset($aStrippedFormVarValues["alert_to"])) { + $s_alert_to = trim($aStrippedFormVarValues["alert_to"]); + } + + if (isset($aSpecialValues["subject"])) { + $s_form_subject = trim($aSpecialValues["subject"]); + } + if (empty($s_form_subject) && isset($aStrippedFormVarValues["subject"])) { + $s_form_subject = trim($aStrippedFormVarValues["subject"]); + } + + if (empty($s_alert_to)) { + $s_alert_to = Settings::get('DEF_ALERT'); + $b_check = false; + } + if (!empty($s_alert_to)) { + $s_from_addr = $s_from = ""; + $a_headers = array(); + if (!Settings::isEmpty('FROM_USER')) { + if (Settings::get('FROM_USER') != "NONE") { + $a_headers['From'] = Settings::get('FROM_USER'); + $s_from_addr = Settings::get('FROM_USER'); + $s_from = "From: $s_from_addr"; + } + } else { + global $SERVER; + + $s_from_addr = "FormMail@" . $SERVER; + $a_headers['From'] = $s_from_addr; + $s_from = "From: $s_from_addr"; + } + $s_mesg = "To: " . UnMangle($s_alert_to) . Settings::get('BODY_LF'); + // + // if a language pack has been included, a lot of error messages + // may need the character set to be provided. + // If that's available from the language pack, use it, + // otherwise, if it's a mail_option, use it from there. + // + $s_charset = ""; + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + $s_charset = $sHTMLCharSet; + } else { + if (IsMailOptionSet("CharSet")) { + $s_charset = GetMailOption("CharSet"); + } + } + + // + // Alerts are plain text emails, so convert any HTML entities + // back to their original characters. Note, this will only work on PHP + // version 4.3.0 and above. + // + if (function_exists("html_entity_decode")) { + $s_error = @html_entity_decode($s_error,ENT_COMPAT,$s_charset); + } + + if ($s_charset !== "") { + $a_headers['Content-Type'] = SafeHeader("text/plain; charset=$s_charset"); + } + + if (!empty($s_from)) { + $s_mesg .= $s_from . Settings::get('BODY_LF'); + } + $s_mesg .= Settings::get('BODY_LF'); + if (count($aAlertInfoValues) > 0) { + if ($b_show_data) { + $s_error .= Settings::get('BODY_LF') . GetMessage(MSG_MORE_INFO) . Settings::get('BODY_LF'); + $s_error .= implode(Settings::get('BODY_LF'),$aAlertInfoValues); + } else { + $s_error .= Settings::get('BODY_LF') . GetMessage(MSG_INFO_STOPPED) . Settings::get('BODY_LF'); + } + } + // + // some fields aren't security issues - show those in the alert + // + $a_safe_fields = array( + "email: " . isset($aSpecialValues["email"]) ? $aSpecialValues["email"] : '', + "realname: " . isset($aSpecialValues["realname"]) ? $aSpecialValues["realname"] : '', + ); + $s_safe_data = implode(Settings::get('BODY_LF'),$a_safe_fields); + + if ($b_non_error) { + $s_preamble = $s_error . Settings::get('BODY_LF') . Settings::get('BODY_LF'); + $s_mesg .= $s_preamble; + $s_subj = GetMessage(MSG_FM_ALERT) . ($s_addl_subject !== '' ? " - $s_addl_subject" : ''); + if (!empty($s_form_subject)) { + $s_subj .= " ($s_form_subject)"; + } + } else { + $s_preamble = GetMessage(MSG_FM_ERROR_LINE) . Settings::get('BODY_LF') . + $s_error . Settings::get('BODY_LF') . Settings::get('BODY_LF'); + $s_mesg .= $s_preamble; + $s_subj = GetMessage(MSG_FM_ERROR) . ($s_addl_subject !== '' ? " - $s_addl_subject" : ''); + if (!empty($s_form_subject)) { + $s_subj .= " ($s_form_subject)"; + } + $s_mesg .= $s_safe_data; + $s_mesg .= Settings::get('BODY_LF') . Settings::get('BODY_LF'); + if ($b_show_data) { + $s_mesg .= implode(Settings::get('BODY_LF'),$aFormattedInputValues); + } else { + $s_mesg .= GetMessage(MSG_USERDATA_STOPPED); + } + } + + /* + * We only need to filter the form fields if the filter that + * is specified is an encrypting filter. + */ + if ($b_filter && $b_got_filter && + IsFilterAttribSet($aSpecialValues["filter"],"Encrypts") + ) { + $s_new_mesg = $s_preamble . $s_safe_data; + $s_new_mesg .= Settings::get('BODY_LF') . Settings::get('BODY_LF'); + + if ($a_filter_list !== false) { + // + // just filter the critical fields + // + list($s_unfiltered,$s_filtered_results) = + GetFilteredOutput($aFieldOrderValues,$aCleaned, + $s_filter_name,$a_filter_list); + $s_new_mesg .= $s_unfiltered; + } else { + // + // filter everything + // + $s_filtered_results = Filter($s_filter_name,$s_mesg); + } + $s_new_mesg .= GetMessage(MSG_FILTERED,array("FILTER" => $s_filter_name)) . + Settings::get('BODY_LF') . Settings::get('BODY_LF') . + $s_filtered_results; + $s_mesg = $s_new_mesg; + } + $s_mesg .= Settings::get('BODY_LF'); + + if (isset($aServerVarValues['HTTP_REFERER'])) { + $s_mesg .= "Referring page was " . $aServerVarValues['HTTP_REFERER']; + } elseif (isset($aSpecialValues['this_form']) && $aSpecialValues['this_form'] !== "") { + $s_mesg .= "Referring form was " . $aSpecialValues['this_form']; + } + + $s_mesg .= Settings::get('BODY_LF'); + + if (isset($aServerVarValues['SERVER_NAME'])) { + $s_mesg .= "SERVER_NAME was " . $aServerVarValues['SERVER_NAME'] . Settings::get('BODY_LF'); + } + if (isset($aServerVarValues['REQUEST_URI'])) { + $s_mesg .= "REQUEST_URI was " . $aServerVarValues['REQUEST_URI'] . Settings::get('BODY_LF'); + } + + $s_mesg .= Settings::get('BODY_LF'); + + if (isset($aServerVarValues['REMOTE_ADDR'])) { + $s_mesg .= "User IP address was " . $aServerVarValues['REMOTE_ADDR'] . Settings::get('BODY_LF'); + } + if (isset($aServerVarValues['HTTP_USER_AGENT'])) { + $s_mesg .= "User agent was " . $aServerVarValues['HTTP_USER_AGENT'] . Settings::get('BODY_LF'); + } + + if ($b_check) { + if (CheckEmailAddress($s_alert_to,$s_valid,$s_invalid)) { + return (SendCheckedMail($s_valid,$s_subj,$s_mesg,$s_from_addr,$a_headers)); + } + } else { + return (SendCheckedMail($s_alert_to,$s_subj,$s_mesg,$s_from_addr,$a_headers)); + } + } + return (false); +} + +// +// Read the lines in a file and return an array. +// Each line is stripped of line termination characters. +// +function ReadLines($fp) +{ + $a_lines = array(); + while (!feof($fp)) { + $s_line = fgets($fp,4096); + // + // strip carriage returns and line feeds + // + $s_line = str_replace("\r","",$s_line); + $s_line = str_replace("\n","",$s_line); + $a_lines[] = $s_line; + } + return ($a_lines); +} + +// +// Open a URL and return the data from it as a string or array of lines. +// Returns false on failure ($s_error has the error string) +// +function GetURL($s_url,&$s_error,$b_ret_lines = false,$n_depth = 0) +{ + global $php_errormsg,$aServerVars,$sUserAgent,$ExecEnv; + + // + // open the URL with the same session as we have + // + if ($ExecEnv->allowSessionURL()) { + if (session_id() !== "") { + $s_url = AddURLParams($s_url,session_name() . "=" . urlencode(session_id())); + } + if (defined("SID")) { + $s_url = AddURLParams($s_url,SID); + } + } + + $http_get = new HTTPGet($s_url); + + // + // Determine authentication requirements + // + if (Settings::get('AUTHENTICATE') !== "" || Settings::get('AUTH_USER') !== "" || Settings::get('AUTH_PW') !== "") { + if (Settings::get('AUTHENTICATE') === "") { + $http_get->SetAuthentication("Basic",Settings::get('AUTH_USER'),Settings::get('AUTH_PW')); + } else { + $http_get->SetAuthenticationLine(Settings::get('AUTHENTICATE')); + } + } else { + $a_parts = $http_get->GetURLSplit(); + if (isset($a_parts["user"]) || isset($a_parts["pass"])) { + $s_auth_user = isset($a_parts["user"]) ? $a_parts["user"] : ""; + $s_auth_pass = isset($a_parts["pass"]) ? $a_parts["pass"] : ""; + } else { + $s_auth_type = isset($aServerVars["PHP_AUTH_TYPE"]) ? $aServerVars["PHP_AUTH_TYPE"] : ""; + $s_auth_user = isset($aServerVars["PHP_AUTH_USER"]) ? $aServerVars["PHP_AUTH_USER"] : ""; + $s_auth_pass = isset($aServerVars["PHP_AUTH_PW"]) ? $aServerVars["PHP_AUTH_PW"] : ""; + } + if (!isset($s_auth_type) || $s_auth_type === "") { + $s_auth_type = "Basic"; + } + if ($s_auth_user !== "" || $s_auth_pass !== "") { + $http_get->SetAuthentication($s_auth_type,$s_auth_user,$s_auth_pass); + } + } + // + // set the user agent + // + $http_get->SetAgent($sUserAgent); + // + // resolve the name now so the DNS cache can be written to the session + // + $http_get->Resolve(); + + // + // Since we might be opening a URL within the same session, we can + // get locks. So, close the session for writing to prevent this. + // + $b_closed = false; + if (function_exists('session_write_close')) { + session_write_close(); + $b_closed = true; + //ob_flush(); // this prevents automatic redirects if $TEMPLATEURL + // is in use and JavaScript is switched off + } + + $m_buf = FALSE; + + //FMDebug("Begin read"); + if (($a_lines = $http_get->Read()) === FALSE) { + $http_get->Close(); + // + // get the error code and send the appropriate alert + // + list($i_error,$i_sys_err,$s_sys_msg) = $http_get->GetError(); + switch ($i_error) { + case $http_get->nErrParse: + $s_error = GetMessage(MSG_URL_PARSE); + break; + case $http_get->nErrScheme: + $a_parts = $http_get->GetURLSplit(); + $s_error = GetMessage(MSG_URL_SCHEME,array("SCHEME" => $a_parts["scheme"])); + break; + default: + $s_error = GetMessage(MSG_SOCKET, + array("ERRNO" => $i_sys_err, + "ERRSTR" => $s_sys_msg, + "PHPERR" => isset($php_errormsg) ? $php_errormsg : "" + )); + break; + } + } else { + $http_get->Close(); + // + // check the HTTP response for actual status. Anything outside + // 200-299 is a failure, but we also handle redirects. + // + list($i_http_code,$s_http_status) = $http_get->GetHTTPStatus(); + + if ($i_http_code < 200 || $i_http_code > 299) { + switch ($i_http_code) { + case 300: // multiple choices (we'll take the first) + case 301: // moved permanently + case 302: // found + case 303: // see other + /** @noinspection PhpMissingBreakStatementInspection */ + case 307: // temporary redirect + // + // a "location" header must be present for us to continue + // In the case of infinite redirects, we need to stop. + // So, we limit to a maximum of 10 redirects. + // + if ($n_depth < 10) { + if (($s_location = $http_get->FindHeader("location")) !== false) { + FMDebug("Redirect from '$s_url' to '$s_location'"); + $m_buf = GetURL($s_location,$s_error,$b_ret_lines,$n_depth + 1); + $b_closed = false; + break; + } + FMDebug("Redirect FAILED - no location header"); + } else { + FMDebug("Redirect FAILED depth=$n_depth"); + } + // FALL THRU + default: + $s_error = GetMessage(MSG_GETURL_OPEN,array("STATUS" => $s_http_status,"URL" => $s_url)); + break; + } + } elseif ($b_ret_lines) { + $m_buf = $a_lines; + } else + // + // return lines as one big string buffer + // + { + $m_buf = implode("",$a_lines); + } + } + // + // re-open our session + // + if ($b_closed) { + session_start(); + } + + return ($m_buf); +} + +// +// Write to the debug log if it exists and is writable. +// +function FMDebug($s_mesg) +{ + static $fDebug = NULL; + + if (!isset($fDebug)) { + $fDebug = false; // only initialize once + $s_db_file = "fmdebug.log"; // look for debug file in current directory + // + // we only open an existing file - we don't create one + // + if (file_exists($s_db_file)) { + if (($fDebug = fopen($s_db_file,"a")) === false) { + return; + } + } + } + if ($fDebug !== false) { + fwrite($fDebug,date('r') . ": " . $s_mesg . "\n"); + fflush($fDebug); + } +} + +/* + * Class: NetIO + * Description: + * A class to provide internet input/output capabilities. + * Use as a base class for more specific functions. + */ + +class NetIO +{ + var $_sHost; + var $_iPort; + var $_sPrefix; + + var $_iConnTimeout; + var $_fSock; + + var $_aIPs; + + var $_iError = 0; + var $_iSysErr; + var $_sSysMesg; + + var $nErrInit = -1; // not initialized + var $nErrRead = -2; // read error + var $nErrWrite = -3; // write error + var $nErrWriteShort = -4; // failed to write all bytes + + var $nErrSocket = -100; // error in socket open + + function __construct($s_host = NULL,$i_port = NULL,$s_prefix = "") + { + if (isset($s_host)) { + $this->_sHost = $s_host; + } + if (isset($i_port)) { + $this->_iPort = $i_port; + } + $this->_sPrefix = $s_prefix; + $this->_iConnTimeout = 30; + $this->_iSysErr = 0; + $this->_sSysMesg = ""; + } + + function _SetError($i_error,$i_sys_err = 0,$s_sys_mesg = "") + { + $this->_iError = $i_error; + $this->_iSysErr = $i_sys_err; + $this->_sSysMesg = $s_sys_mesg; + return (FALSE); + } + + function IsError() + { + return $this->_iError !== 0; + } + + function ClearError() + { + $this->_SetError(0); + } + + function GetError() + { + return (array($this->_iError,$this->_iSysErr,$this->_sSysMesg)); + } + + function SetHost($s_host) + { + $this->_sHost = $s_host; + } + + function SetPort($i_port) + { + $this->_iPort = $i_port; + } + + function SetConnectionTimeout($i_secs) + { + $this->_iConnTimeout = $i_secs; + } + + function SetPrefix($s_prefix) + { + $this->_sPrefix = $s_prefix; + } + + function GetHost() + { + return (isset($this->_sHost) ? $this->_sHost : ""); + } + + function GetPort() + { + return (isset($this->_iPort) ? $this->_iPort : 0); + } + + function GetPrefix() + { + return ($this->_sPrefix); + } + + function GetConnectionTimeout() + { + return ($this->_iConnTimeout); + } + + function _CacheIt() + { + FMDebug("Caching " . implode(",",$this->_aIPs)); + if (IsSetSession("FormNetIODNSCache")) { + $a_cache = GetSession("FormNetIODNSCache"); + } else { + $a_cache = array(); + } + $a_cache[$this->_sHost] = $this->_aIPs; + SetSession("FormNetIODNSCache",$a_cache); + } + + /* + * Some versions of PHP seem to have a major slowdown when resolving + * names with gethostbyname (5 seconds with PHP 4.3.9). + * So, in the case of multi-page forms using MULTIFORMURL, we get a big speed up + * by caching the IP address of the server. + */ + function _CheckCache() + { + if (!IsSetSession("FormNetIODNSCache")) { + return (FALSE); + } + $a_cache = GetSession("FormNetIODNSCache"); + if (!is_array($a_cache) || !isset($a_cache[$this->_sHost]) || !is_array($a_cache[$this->_sHost])) { + return (FALSE); + } + $this->_aIPs = $a_cache[$this->_sHost]; + return (TRUE); + } + + function Resolve() + { + $this->ClearError(); + if (!isset($this->_sHost)) { + return ($this->_SetError($this->nErrInit)); + } + if ($this->_CheckCache()) { + return (TRUE); + } + FMDebug("Start resolve of " . $this->_sHost); + // + // if host is an actual IP address, then it is returned unchanged, which is good! + // + if (($a_ip_list = gethostbynamel($this->_sHost)) === FALSE) { + FMDebug("Resolve failed"); + return ($this->_SetError($this->nErrInit,0, + GetMessage(MSG_RESOLVE,array("NAME" => $this->_sHost)))); + } + FMDebug("Done resolve: " . implode(",",$a_ip_list)); + $this->_aIPs = $a_ip_list; + $this->_CacheIt(); + return (TRUE); + } + + function _SSLOpen($s_ip,&$errno,&$errstr,$i_timeout) + { + global $ExecEnv; + + FMDebug("Using _SSLOpen (stream_socket_client), SNI, host=" . $this->GetHost()); + $context = stream_context_create(); + $result = stream_context_set_option($context,'ssl','verify_host',true); + $result = stream_context_set_option($context,'ssl','verify_peer',false); + $result = stream_context_set_option($context,'ssl','allow_self_signed',true); + $result = stream_context_set_option($context,'ssl','SNI_enabled',true); + if ($ExecEnv->IsPHPAtLeast("5.6.0")) { + $result = stream_context_set_option($context,'ssl','peer_name',$this->GetHost()); + } else { + $result = stream_context_set_option($context,'ssl','SNI_server_name',$this->GetHost()); + } + // + // Note that even if SNI fails, the socket will still open, but the + // web server should send a 400 error. + // + return (stream_socket_client($this->GetPrefix() . $s_ip . ":" . $this->GetPort(), + $errno,$errstr,$i_timeout,STREAM_CLIENT_CONNECT,$context)); + } + + /** @noinspection PhpUndefinedVariableInspection */ + function Open() + { + $this->ClearError(); + if (!isset($this->_sHost) || !isset($this->_iPort)) { + return ($this->_SetError($this->nErrInit)); + } + if (!$this->Resolve()) { + return (FALSE); + } + FMDebug("Starting socket open"); + $f_sock = FALSE; + // + // Now, run through the list of IPs until we find one that connects. + // However, this can cause problems with SNI in SSL/TLS connections. + // If there is only one IP address, use the host name. + // Otherwise, if we can specify SNI and it's an SSL connection + // use streams, otherwise try each IP individually. + // + if (count($this->_aIPs) == 1) { + FMDebug("Trying host " . $this->_sHost . ", timeout " . $this->GetConnectionTimeout()); + $f_sock = @fsockopen($this->GetPrefix() . $this->_sHost,$this->GetPort(), + $errno,$errstr,$this->GetConnectionTimeout()); + } else { + foreach ($this->_aIPs as $s_ip) { + global $ExecEnv; + + FMDebug("Trying IP $s_ip, timeout " . $this->GetConnectionTimeout()); + if ($ExecEnv->IsPHPAtLeast("5.3.2") && substr($this->GetPrefix(),0,3) == "ssl") { + if (($f_sock = $this->_SSLOpen($s_ip,$errno,$errstr, + $this->GetConnectionTimeout())) !== FALSE + ) { + break; + } + } elseif (($f_sock = @fsockopen($this->GetPrefix() . $s_ip,$this->GetPort(), + $errno,$errstr,$this->GetConnectionTimeout())) !== FALSE + ) { + break; + } + } + } + if ($f_sock === FALSE) { + FMDebug("open failed: $errno $errstr"); + return ($this->_SetError($this->nErrSocket,$errno,$errstr)); + } + $this->_fSock = $f_sock; + FMDebug("Done socket open"); + return (TRUE); + } + + function Read() + { + $this->ClearError(); + $a_lines = array(); + while (($s_line = fgets($this->_fSock)) !== FALSE) { + $a_lines[] = $s_line; + } + FMDebug("Read " . count($a_lines) . " lines"); + return ($a_lines); + } + + function Write($s_str,$b_flush = TRUE) + { + $this->ClearError(); + if (!isset($this->_fSock)) { + return ($this->_SetError($this->nErrInit)); + } + if (($n_write = fwrite($this->_fSock,$s_str)) === FALSE) { + return ($this->_SetError($this->nErrWrite)); + } + if ($n_write != strlen($s_str)) { + return ($this->_SetError($this->nErrWriteShort)); + } + if ($b_flush) { + if (fflush($this->_fSock) === FALSE) { + return ($this->_SetError($this->nErrWriteShort)); + } + } + return (TRUE); + } + + function Close() + { + if (isset($this->_fSock)) { + fclose($this->_fSock); + unset($this->_fSock); + } + } +} + +/* + * Class: HTTPGet + * Description: + * A class that implements HTTP GET method. + */ + +class HTTPGet extends NetIO +{ + var $_sURL; + var $_aURLSplit; + + var $_sRequest; + var $_aResponse; + var $_aRespHeaders; + + var $_sAuthLine; + var $_sAuthType; + var $_sAuthUser; + var $_sAuthPass; + + var $_sAgent; + + var $nErrParse = -1000; // failed to parse URL + var $nErrScheme = -1001; // unsupported URL scheme + + function __construct($s_url = "") + { + parent::__construct(); + $this->_aURLSplit = array(); + if (($this->_sURL = $s_url) !== "") { + $this->_SplitURL(); + } + } + + function _SplitURL() + { + FMDebug("URL: " . $this->_sURL); + if (($this->_aURLSplit = parse_url($this->_sURL)) === FALSE) { + $this->_aURLSplit = array(); + return ($this->_SetError($this->nErrParse)); + } + return (TRUE); + } + + function GetURLSplit() + { + return ($this->_aURLSplit); + } + + function SetURL($s_url) + { + $this->_aURLSplit = array(); + $this->_sURL = $s_url; + return ($this->_SplitURL()); + } + + function _Init() + { + if (!isset($this->_aURLSplit["host"])) { + return ($this->_SetError($this->nErrInit)); + } + $this->SetHost($this->_aURLSplit["host"]); + $i_port = 80; + $b_use_ssl = false; + if (isset($this->_aURLSplit["scheme"])) { + switch (strtolower($this->_aURLSplit["scheme"])) { + case "http": + break; + case "https": + $b_use_ssl = true; + $i_port = 443; + break; + default: + return ($this->_SetError($this->nErrScheme)); + } + } + if (isset($this->_aURLSplit["port"])) { + $i_port = $this->_aURLSplit["port"]; + } + if ($b_use_ssl) + // + // we require ssl:// for port 443 + // + { + $this->SetPrefix("ssl://"); + } + $this->SetPort($i_port); + return (TRUE); + } + + function _SendRequest() + { + $this->_PrepareRequest(); + return (parent::Write($this->_sRequest)); + } + + function _PrepareRequest($s_method = 'GET') + { + FMDebug("Path: " . $this->_aURLSplit["path"]); + if (!isset($this->_aURLSplit["path"]) || $this->_aURLSplit["path"] === "") { + $s_path = "/"; + } // default path + else { + $s_path = $this->_aURLSplit["path"]; + } + if (isset($this->_aURLSplit["query"])) { + // + // add the query to the path + // Note that parse_url decodes the query string (urldecode), so + // we need to split it into its component parameters + // are re-encode their values. Calling urlencode($this->_aURLSplit["query"]) + // encodes the '=' between parameters and this breaks things. + // + $a_params = explode('&',$this->_aURLSplit["query"]); + foreach ($a_params as $i_idx => $s_param) { + if (($i_pos = strpos($s_param,"=")) === false) { + $a_params[$i_idx] = urlencode($s_param); + } else { + $a_params[$i_idx] = substr($s_param,0,$i_pos) . '=' . + urlencode(substr($s_param,$i_pos + 1)); + } + } + $s_path .= "?" . implode('&',$a_params); + } + // + // add the fragment to the path. + // + if (isset($this->_aURLSplit["fragment"])) { + $s_path .= '#' . urlencode($this->_aURLSplit["fragment"]); + } + // + // build the request + // + $s_req = $s_method . " $s_path HTTP/1.0\r\n"; + // + // Add authentication + // + if (isset($this->_sAuthLine)) { + $s_req .= "Authorization: $this->_sAuthLine\r\n"; + } elseif (isset($this->_sAuthType)) { + $s_req .= "Authorization: " . $this->_sAuthType . " " . + base64_encode($this->_sAuthUser . ":" . $this->_sAuthPass) . "\r\n"; + } + // + // Specify the host name + // + $s_req .= "Host: " . $this->GetHost() . "\r\n"; + // + // Specify the user agent + // + if (isset($this->_sAgent)) { + $s_req .= "User-Agent: " . $this->_sAgent . "\r\n"; + } + // + // Accept any output + // use of concatenation to avoid problems with IDE syntax highlighting. + // + $s_req .= "Accept: */" . "*\r\n"; + $s_req .= $this->_AdditionalHeaders(); + // + // End of request headers + // + $s_req .= "\r\n"; + $this->_sRequest = $s_req; + } + + function _AdditionalHeaders() + { + return (''); + } + + function _GetResponse() + { + FMDebug("Reading"); + if (($a_lines = parent::Read()) === FALSE) { + return (FALSE); + } + + $this->_aRespHeaders = $this->_aResponse = array(); + $b_body = FALSE; + for ($ii = 0 ; $ii < count($a_lines) ; $ii++) { + if ($b_body) { + //FMDebug("Body line: ".rtrim($a_lines[$ii])); + $this->_aResponse[] = $a_lines[$ii]; + } elseif ($a_lines[$ii] == "\r\n" || $a_lines[$ii] == "\n") { + $b_body = TRUE; + } else { + //FMDebug("Header line: ".rtrim($a_lines[$ii])); + $this->_aRespHeaders[] = $a_lines[$ii]; + } + } + return (TRUE); + } + + function GetResponseHeaders() + { + return ($this->_aRespHeaders); + } + + function FindHeader($s_name) + { + $s_name = strtolower($s_name); + $i_len = strlen($s_name); + for ($ii = 0 ; $ii < count($this->_aRespHeaders) ; $ii++) { + $s_line = $this->_aRespHeaders[$ii]; + if (($s_hdr = substr($s_line,0,$i_len)) !== false) { + $s_hdr = strtolower($s_hdr); + if ($s_hdr === $s_name && substr($s_line,$i_len,1) === ":") { + return (trim(substr($s_line,$i_len + 1))); + } + } + } + return (false); + } + + function GetHTTPStatus() + { + $i_http_code = 0; + $s_status = ""; + for ($ii = 0 ; $ii < count($this->_aRespHeaders) ; $ii++) { + $s_line = $this->_aRespHeaders[$ii]; + if (substr($s_line,0,4) == "HTTP") { + $i_pos = strpos($s_line," "); + $s_status = substr($s_line,$i_pos + 1); + $i_end_pos = strpos($s_status," "); + if ($i_end_pos === false) { + $i_end_pos = strlen($s_status); + } + $i_http_code = (int)substr($s_status,0,$i_end_pos); + } + } + return (array($i_http_code,$s_status)); + } + + function Resolve() + { + if (!$this->_Init()) { + return (FALSE); + } + return (parent::Resolve()); + } + + function Read() + { + if (!$this->_Init()) { + return (FALSE); + } + FMDebug("Init done"); + if (!$this->Open()) { + return (FALSE); + } + FMDebug("Open done"); + if (!$this->_SendRequest()) { + return (FALSE); + } + FMDebug("Send done"); + if (!$this->_GetResponse()) { + return (FALSE); + } + FMDebug("Get done"); + $this->Close(); + return ($this->_aResponse); + } + + function SetAuthenticationLine($s_auth) + { + $this->_sAuthLine = $s_auth; + } + + function SetAuthentication($s_type,$s_user,$s_pass) + { + $this->_sAuthType = $s_type; + $this->_sAuthUser = $s_user; + $this->_sAuthPass = $s_pass; + } + + function SetAgent($s_agent) + { + $this->_sAgent = $s_agent; + } +} + +/* + * Class: HTTPPost + * Description: + * A class that implements HTTP POST method. + */ + +class HTTPPost extends HTTPGet +{ + var $_sPostData; /* data to POST */ + + function __construct($s_url = "") + { + $this->_sPostData = ''; + parent::__construct($s_url); + } + + function _SendRequest() + { + $this->_PrepareRequest(); + return (NetIO::Write($this->_sRequest)); + } + + function _PrepareRequest($s_method = 'POST') + { + parent::_PrepareRequest($s_method); + $this->_AddData(); + } + + function _AdditionalHeaders() + { + // + // we don't handle file uploads yet + // + $a_hdrs = array( + 'Content-Type: application/x-www-form-urlencoded', + 'Content-Length: ' . strlen($this->_sPostData), + ); + return (implode("\r\n",$a_hdrs)); + } + + function _AddData() + { + $this->_sRequest .= "\r\n"; // blank line after headers + $this->_sRequest .= $this->_sPostData; + } + + function _EncodeData($a_fields) + { + $s_data = ''; + foreach ($a_fields as $s_name => $s_value) { + if ($s_data != '') { + $s_data .= '&'; + } + if (is_string($s_value)) { + $s_data .= urlencode($s_name) . '=' . urlencode($s_value); + } else { + $s_data .= urlencode($s_name) . '=' . urlencode(serialize($s_value)); + } + } + return ($s_data); + } + + function Post($a_fields) + { + // + // we don't handle file uploads yet + // + $this->_sPostData = $this->_EncodeData($a_fields); + return ($this->Read()); + } +} + +// +// Load a template file into a string. +// +function LoadTemplate($s_name,$s_dir,$s_url,$b_ret_lines = false) +{ + global $php_errormsg; + + $s_buf = ""; + $a_lines = array(); + if (!empty($s_dir)) { + $s_name = "$s_dir/" . basename($s_name); + @ $fp = fopen($s_name,"r"); + if ($fp === false) { + SendAlert(GetMessage(MSG_OPEN_TEMPLATE,array("NAME" => $s_name, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + if ($b_ret_lines) { + $a_lines = ReadLines($fp); + } else + // + // load the whole template into a string + // + { + $s_buf = fread($fp,filesize($s_name)); + } + fclose($fp); + } else { + if (substr($s_url,-1) == '/') { + $s_name = "$s_url" . basename($s_name); + } else { + $s_name = "$s_url/" . basename($s_name); + } + if (($m_data = GetURL($s_name,$s_error,$b_ret_lines)) === false) { + SendAlert($s_error); + return (false); + } + if ($b_ret_lines) { + $a_lines = $m_data; + // + // strip line terminations from each line + // + for ($ii = count($a_lines) ; --$ii >= 0 ;) { + $s_line = $a_lines[$ii]; + $s_line = str_replace("\r","",$s_line); + $s_line = str_replace("\n","",$s_line); + $a_lines[$ii] = $s_line; + } + } else { + $s_buf = $m_data; + } + } + return ($b_ret_lines ? $a_lines : $s_buf); +} + +// +// To show an error template. The template must be HTML and, for security +// reasons, must be a file on the server in the directory specified +// by $TEMPLATEDIR or $TEMPLATEURL. +// $a_specs is an array of substitutions to perform, as follows: +// tag-name replacement string +// +// For example: +// "fmerror"=>"An error message" +// +function ShowErrorTemplate($s_name,$a_specs,$b_user_error) +{ + if (function_exists('FMHookShowErrorTemplate')) { + if (FMHookShowErrorTemplate($s_name,$a_specs,$b_user_error)) { + return (true); + } + } + if (Settings::isEmpty('TEMPLATEDIR') && Settings::isEmpty('TEMPLATEURL')) { + SendAlert(GetMessage(MSG_TEMPLATES)); + return (false); + } + if (($s_buf = LoadTemplate($s_name,Settings::get('TEMPLATEDIR'),Settings::get('TEMPLATEURL'))) === false) { + return (false); + } + + // + // now look for the tags to replace + // + foreach ($a_specs as $s_tag => $s_value) + // + // search for + // + // or + // [tagname/] + // with optional whitespace + // + { + $s_buf = preg_replace('/[<\[]\s*' . preg_quote($s_tag,"/") . '\s*\/\s*[>\]]/ims', + nl2br($s_value),$s_buf); + } + if ($b_user_error) { + // strip any and tags + // or [fmusererrors] and [/fmusererror] tags + // + // You can show information that's specific to user + // errors between these special tags. + // + $s_buf = preg_replace('/[<\[]\s*\/?\s*fmusererror\s*[>\]]/ims','',$s_buf); + // + // since this isn't a system error, strip anything between + // and + // or [fmsyserrors] and [/fmsyserror] tags + // + $s_buf = preg_replace('/[<\[]\s*fmsyserror\s*[>\]].*[<\[]\s*\/\s*fmsyserror\s*[>\]]/ims','',$s_buf); + } else { + // strip any and tags + // or [fmsyserrors] and [/fmsyserror] tags + // + // You can show information that's specific to system + // errors between these special tags. + // + $s_buf = preg_replace('/[<\[]\s*\/?\s*fmsyserror\s*[>\]]/ims','',$s_buf); + // + // since this isn't a user error, strip anything between + // and + // or [fmusererrors] and [/fmusererror] tags + // + $s_buf = preg_replace('/[<\[]\s*fmusererror\s*[>\]].*[<\[]\s*\/\s*fmusererror\s*[>\]]/ims','',$s_buf); + } + // + // just output the page + // + echo $s_buf; + return (true); +} + +// +// To show an error to the user. +// +function ShowError($error_code,$error_mesg,$b_user_error, + $b_alerted = false,$a_item_list = array(),$s_extra_info = "") +{ + global $SPECIAL_FIELDS,$SPECIAL_MULTI,$SPECIAL_VALUES; + global $aServerVars,$aStrippedFormVars; + + // + // The following initialisations are so that ShowError can run from fmhookpreinit scripts + // + $aSpecialFieldValues = isset($SPECIAL_FIELDS) ? $SPECIAL_FIELDS : array(); + $aSpecialValues = isset($SPECIAL_VALUES) ? $SPECIAL_VALUES : array(); + $aSpecialMultiValues = isset($SPECIAL_MULTI) ? $SPECIAL_MULTI : array(); + $aServerVarValues = isset($aServerVars) ? $aServerVars : array(); + $aStrippedFormVarValues = isset($aStrippedFormVars) ? $aStrippedFormVars : array(); + + // + // Testing with PHP 4.0.6 indicates that sessions don't always work. + // So, we'll also add the error to the URL, unless + // PUT_DATA_IN_URL is false. + // + SetSession("FormError",$error_mesg); + SetSession("FormErrorInfo",$s_extra_info); + SetSession("FormErrorCode",$error_code); + SetSession("FormErrorItems",$a_item_list); + SetSession("FormIsUserError",$b_user_error); + SetSession("FormAlerted",$b_alerted); + SetSession("FormData",array()); + + $bad_url = isset($aSpecialValues["bad_url"]) ? $aSpecialValues["bad_url"] : ''; + $bad_template = isset($aSpecialValues["bad_template"]) ? $aSpecialValues["bad_template"] : ''; + $this_form = isset($aSpecialValues["this_form"]) ? $aSpecialValues["this_form"] : ''; + if (IsAjax()) { + JSON_Result("ERROR",array("ErrorCode" => $error_code, + "UserError" => $b_user_error, + "ErrorMesg" => $error_mesg, + "Alerted" => $b_alerted, + "ErrorItems" => $a_item_list + )); + ZapSession(); + } elseif (!empty($bad_url)) { + $a_params = array(); + if (Settings::get('PUT_DATA_IN_URL')) { + $a_params[] = "this_form=" . urlencode("$this_form"); + $a_params[] = "bad_template=" . urlencode("$bad_template"); + $a_params[] = "error=" . urlencode("$error_mesg"); + $a_params[] = "extra=" . urlencode("$s_extra_info"); + $a_params[] = "errcode=" . urlencode("$error_code"); + $a_params[] = "isusererror=" . ($b_user_error ? "1" : "0"); + $a_params[] = "alerted=" . ($b_alerted ? "1" : "0"); + $i_count = 1; + foreach ($a_item_list as $s_item) { + $a_params[] = "erroritem$i_count=" . urlencode("$s_item"); + $i_count++; + } + } else { + $a_sess_data = GetSession("FormData"); + $a_sess_data["this_form"] = "$this_form"; + $a_sess_data["bad_template"] = "$bad_template"; + SetSession("FormData",$a_sess_data); + // + // tell the bad_url to look in the session only + // + $a_params[] = "insession=1"; + } + // + // Add the posted data to the URL so that an intelligent + // $bad_url can call the form again + // + foreach ($aStrippedFormVarValues as $s_name => $m_value) { + // + // skip special fields + // + $b_special = false; + if (in_array($s_name,$aSpecialFieldValues)) { + $b_special = true; + } else { + foreach ($aSpecialMultiValues as $s_multi_fld) { + $i_len = strlen($s_multi_fld); + if (substr($s_name,0,$i_len) == $s_multi_fld) { + $i_index = (int)substr($s_name,$i_len); + if ($i_index > 0) { + $b_special = true; + break; + } + } + } + } + if (!$b_special) { + if (Settings::get('PUT_DATA_IN_URL')) { + if (is_array($m_value)) { + foreach ($m_value as $s_value) { + $a_params[] = "$s_name" . '[]=' . + urlencode(substr($s_value,0,Settings::get('MAXSTRING'))); + } + } else { + $a_params[] = "$s_name=" . urlencode(substr($m_value,0,Settings::get('MAXSTRING'))); + } + } else { + $a_sess_data = GetSession("FormData"); + if (is_array($m_value)) { + $a_sess_data["$s_name"] = $m_value; + } else { + $a_sess_data["$s_name"] = substr($m_value,0,Settings::get('MAXSTRING')); + } + SetSession("FormData",$a_sess_data); + } + } + } + // + // Now add the authentication data, if any + // + if ((isset($aServerVarValues["PHP_AUTH_USER"]) && + $aServerVarValues["PHP_AUTH_USER"] !== "") || + (isset($aServerVarValues["PHP_AUTH_PW"]) && + $aServerVarValues["PHP_AUTH_PW"] !== "") + ) { + if (Settings::get('PUT_DATA_IN_URL')) { + if (isset($aServerVarValues["PHP_AUTH_USER"])) { + $a_params[] = "PHP_AUTH_USER=" . urlencode($aServerVarValues["PHP_AUTH_USER"]); + } + + if (isset($aServerVarValues["PHP_AUTH_PW"])) { + $a_params[] = "PHP_AUTH_PW=" . urlencode($aServerVarValues["PHP_AUTH_PW"]); + } + + if (isset($aServerVarValues["PHP_AUTH_TYPE"])) { + $a_params[] = "PHP_AUTH_TYPE=" . urlencode($aServerVarValues["PHP_AUTH_TYPE"]); + } + } else { + $a_sess_data = GetSession("FormData"); + if (isset($aServerVarValues["PHP_AUTH_USER"])) { + $a_sess_data["PHP_AUTH_USER"] = $aServerVarValues["PHP_AUTH_USER"]; + } + + if (isset($aServerVarValues["PHP_AUTH_PW"])) { + $a_sess_data["PHP_AUTH_PW"] = $aServerVarValues["PHP_AUTH_PW"]; + } + + if (isset($aServerVarValues["PHP_AUTH_TYPE"])) { + $a_sess_data["PHP_AUTH_TYPE"] = $aServerVarValues["PHP_AUTH_TYPE"]; + } + SetSession("FormData",$a_sess_data); + } + } + $bad_url = AddURLParams($bad_url,$a_params,false); + Redirect($bad_url,GetMessage(MSG_FORM_ERROR)); + } else { + if (!empty($bad_template)) { + $a_specs = array("fmerror" => htmlspecialchars("$error_mesg"), + "fmerrorcode" => htmlspecialchars("$error_code"), + "fmfullerror" => htmlspecialchars("$error_mesg") . "\n" . + htmlspecialchars("$s_extra_info"), + "fmerrorextra" => htmlspecialchars("$s_extra_info"), + ); + for ($i_count = 1 ; $i_count <= 20 ; $i_count++) { + $a_specs["fmerroritem$i_count"] = ""; + } + $i_count = 1; + foreach ($a_item_list as $s_item) { + $a_specs["fmerroritem$i_count"] = htmlspecialchars($s_item); + $i_count++; + } + $s_list = ""; + foreach ($a_item_list as $s_item) { + $s_list .= "
  • " . htmlspecialchars($s_item) . "
  • "; + } + $a_specs["fmerroritemlist"] = $s_list; + if (ShowErrorTemplate($bad_template,$a_specs,$b_user_error)) { + return; + } + } + $s_text = GetMessage(MSG_ERROR_PROC); + if ($b_user_error) { + $s_text .= $error_mesg . "\n" . FixedHTMLEntities($s_extra_info); + } else { + global $SERVER; + + if ($b_alerted) { + $s_text .= GetMessage(MSG_ALERT_DONE,array("SERVER" => $SERVER)); + } else { + $s_text .= GetMessage(MSG_PLS_CONTACT,array("SERVER" => $SERVER)); + } + $s_text .= GetMessage(MSG_APOLOGY,array("SERVER" => $SERVER)); + } + CreatePage($s_text,GetMessage(MSG_FORM_ERROR),false); + // + // the session data is not needed now + // + ZapSession(); + } +} + +// +// Report an error. Same as Error, but implements +// ATTACK_DETECTION_IGNORE_ERRORS. +// +function ErrorWithIgnore($error_code,$error_mesg,$b_filter = true,$show = true,$int_mesg = "") +{ + if (function_exists('FMHookErrorWithIgnore')) { + FMHookErrorWithIgnore($error_code,$error_mesg,$b_filter,$show,$int_mesg); + } + + $b_alerted = false; + if (!Settings::get('ATTACK_DETECTION_IGNORE_ERRORS')) { + if (SendAlert("$error_code\n *****$int_mesg*****\nError=$error_mesg\n",$b_filter)) { + $b_alerted = true; + } + } + if ($show) { + ShowError($error_code,$error_mesg,false,$b_alerted); + } else + // + // show something to the user + // + { + ShowError($error_code,GetMessage(MSG_SUBM_FAILED),false,$b_alerted); + } + FormMailExit(); +} + +// +// Report an error +// +function Error($error_code,$error_mesg,$b_filter = true,$show = true,$int_mesg = "") +{ + if (function_exists('FMHookError')) { + FMHookError($error_code,$error_mesg,$b_filter,$show,$int_mesg); + } + + $b_alerted = false; + if (SendAlert("$error_code\n *****$int_mesg*****\nError=$error_mesg\n",$b_filter)) { + $b_alerted = true; + } + if ($show) { + ShowError($error_code,$error_mesg,false,$b_alerted); + } else + // + // show something to the user + // + { + ShowError($error_code,GetMessage(MSG_SUBM_FAILED),false,$b_alerted); + } + FormMailExit(); +} + +// +// Report a user error +// +function UserError($s_error_code,$s_error_mesg, + $s_extra_info = "",$a_item_list = array()) +{ + if (function_exists('FMHookUserError')) { + FMHookUserError($s_error_code,$s_error_mesg,$s_extra_info,$a_item_list); + } + $b_alerted = false; + if (Settings::get('ALERT_ON_USER_ERROR') || + ($s_error_code === "invalid_email" && Settings::get('ALERT_ON_EMAIL_VALIDATION_FAILED'))) { + $s_addl_subject = $s_error_code === "invalid_email" ? 'Invalid Email Domain' : ''; + if (SendAlert("$s_error_code\nError=$s_error_mesg\n$s_extra_info\n",true,false,$s_addl_subject)) { + $b_alerted = true; + } + } + ShowError($s_error_code,$s_error_mesg,true,$b_alerted,$a_item_list,$s_extra_info); + FormMailExit(); +} + +// +// Create a simple page with the given text. +// +function CreatePage($text,$title = "",$b_show_about = true) +{ + global $FM_VERS,$sHTMLCharSet; + + if (IsAjax()) { + // + // CreatePage should not be called in Ajax mode. + // If it is, it must be an error or debugging state. + // + JSON_Result("ERROR",array("ErrorCode" => $title, + "ErrorMesg" => $text + )); + } else { + echo + '' . + "\n"; + echo '' . "\n"; + echo "\n"; + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + echo "\n"; + } + if ($title != "") { + echo "" . FixedHTMLEntities($title) . "\n"; + } + echo "\n"; + echo "\n"; + echo nl2br($text); + echo "

    "; + if ($b_show_about) { + echo "

    \n"; + echo GetMessage(MSG_ABOUT_FORMMAIL,array("FM_VERS" => $FM_VERS, + "TECTITE" => "www.tectite.com" + )); + echo "

    \n"; + } + echo "\n"; + echo "\n"; + } +} + +function GetMagicQuotesGPC() +{ + global $ExecEnv; + $b_result = false; + + // the magic_quotes_gpc setting was removed in PHP 5.4.0 + // get_magic_quotes_gpc was deprecated in PHP 7.4.0 and removed in PHP 8.0.0 + if (function_exists('get_magic_quotes_gpc')) { + if (!$ExecEnv->IsPHPAtLeast("5.4.0")) { + $b_result = (get_magic_quotes_gpc() != 0); + } + } + return $b_result; +} + +// +// Strip slashes if magic_quotes_gpc is set. +// +function StripGPC($s_value) +{ + global $ExecEnv; + + if (GetMagicQuotesGPC()) { + $s_value = stripslashes($s_value); + } + return ($s_value); +} + +// +// return an array, stripped of slashes if magic_quotes_gpc is set +// +function StripGPCArray($a_values) +{ + global $ExecEnv; + + if (GetMagicQuotesGPC()) { + foreach ($a_values as $m_key => $m_value) { + if (is_array($m_value)) + // + // strip arrays recursively + // + { + $a_values[$m_key] = StripGPCArray($m_value); + } else + // + // convert scalar to string and strip + // + { + $a_values[$m_key] = stripslashes("$m_value"); + } + } + } + + return ($a_values); +} + +// +// Strip a value of unwanted characters, which might be hacks. +// The stripping of \r and \n is a *critical* security feature. +// +function Strip($value) +{ + // + // When working with character sets such as UTF-8, stripping + // control characters is a *really bad idea* and breaks things. + // From version 8.22, FormMail only strips \r and \n as these + // are really the only characters that can cause header hacks + // to be inserted. (Strip means replace with a single space). + // We also handle multiple spaces. + // + $value = preg_replace('/[ \r\n]+/'," ",$value); // zap all CRLF and multiple blanks + return ($value); +} + +// +// Clean a value. This means: +// 1. convert to string +// 2. truncate to maximum length +// 3. strip the value of unwanted or dangerous characters (hacks) +// 4. trim both ends of whitespace +// Each element of an array is cleaned as above. This process occurs +// recursively, so arrays of arrays work OK too (though there's no +// need for that in this program). +// +// Non-scalar values are changed to the string "" where X is the type. +// In general, FormMail won't receive non-scalar non-array values, so this +// is more a future-proofing measure. +// +function CleanValue($m_value) +{ + if (is_array($m_value)) { + foreach ($m_value as $m_key => $m_item) { + $m_value[$m_key] = CleanValue($m_item); + } + } elseif (!is_scalar($m_value)) { + $m_value = "<" . gettype($m_value) . ">"; + } else { + // + // convert to string and truncate + // + $m_value = substr("$m_value",0,Settings::get('MAXSTRING')); + // + // strip unwanted chars and trim + // + $m_value = trim(Strip($m_value)); + } + return ($m_value); +} + +// +// Clean a special value. Special values listed in $SPECIAL_NOSTRIP +// will not be cleaned. +// +function SpecialCleanValue($s_name,$m_value) +{ + global $SPECIAL_NOSTRIP; + + if (!in_array($s_name,$SPECIAL_NOSTRIP)) { + $m_value = CleanValue($m_value); + } + return ($m_value); +} + +// +// Return the fields and their values in a string containing one +// field per line. +// +function MakeFieldOutput($a_order,$a_fields,$s_line_feed = null) +{ + if ($s_line_feed === null) { + $s_line_feed = Settings::get('BODY_LF'); + } + $n_order = count($a_order); + $s_output = ""; + for ($ii = 0 ; $ii < $n_order ; $ii++) { + $s_name = $a_order[$ii]; + if (isset($a_fields[$s_name])) { + $s_output .= "$s_name: " . $a_fields[$s_name] . $s_line_feed; + } + } + return ($s_output); +} + +// +// Check if a field name is special. Returns true if it is. +// +function IsSpecialField($s_name) +{ + global $SPECIAL_FIELDS; + + return (in_array($s_name,$SPECIAL_FIELDS)); +} + +// +// Set a special field value. +// +function SetSpecialField($s_name,$m_value) +{ + global $SPECIAL_VALUES; + + // + // most special values cannot be arrays; ignore them if they are + // + if (is_array($m_value)) { + global $SPECIAL_ARRAYS; + + if (!in_array($s_name,$SPECIAL_ARRAYS)) { + return; + } + } + $SPECIAL_VALUES[$s_name] = SpecialCleanValue($s_name,$m_value); +} + +// +// Check if a field name is a special "multi" field. +// A multi field is the name plus a sequence number. For example, +// conditions1 +// conditions2 +// Returns a list (array) if it is, otherwise false if not. +// The list contains: +// 1. the name of the special multi field +// 2. the index number for multi field +// +function IsSpecialMultiField($s_name) +{ + global $SPECIAL_MULTI; + + foreach ($SPECIAL_MULTI as $s_multi_fld) { + $i_len = strlen($s_multi_fld); + // + // look for nameN where N is a number starting from 1 + // + if (substr($s_name,0,$i_len) == $s_multi_fld) { + $i_index = (int)substr($s_name,$i_len); + if ($i_index > 0) { + // + // re-index to zero + // + --$i_index; + return (array($s_multi_fld,$i_index)); + } + } + } + return (false); +} + +// +// Set a multi field value. +// +function SetSpecialMultiField($s_name,$i_index,$m_value) +{ + global $SPECIAL_VALUES; + + // + // these special fields cannot be arrays - ignore if it is + // + if (!is_array($m_value)) { + // + // Convert the special field itself into an array so it can be correctly + // indexed. + // + if (!is_array($SPECIAL_VALUES[$s_name])) { + $SPECIAL_VALUES[$s_name] = array(); + } + $SPECIAL_VALUES[$s_name][$i_index] = SpecialCleanValue($s_name,$m_value); + } +} + +// +// Check if a field is part of Reverse Captcha processing. +// +function IsReverseCaptchaField($s_name) +{ + $a_rev_captcha = Settings::get('ATTACK_DETECTION_REVERSE_CAPTCHA'); + return (isset($a_rev_captcha[$s_name])); +} + +/** + * Validate an email address. + * Generate a UserError if $b_user_error is true. + * + * @param $s_name + * @param $s_value + * @param $b_user_error + */ +function ValidateEmailAddress($s_name,$s_value,$b_user_error) +{ + $b_error_on_invalid = true; + $b_valid = true; + $s_reason = ''; + $a_components = explode('@',$s_value,2); + if (count($a_components) !== 2) { + $b_valid = false; + $s_reason = "missing '@'"; + } else { + if ($a_components[0] === '' || $a_components[1] === '') { + $b_valid = false; + $s_reason = "missing name or domain name"; + } else { + if (Settings::get('VALIDATE_EMAIL_DOMAIN')) { + $n_max_monitoring_secs = Settings::get('EMAIL_VALIDATION_MAX_MONITORING_TIME_SECS'); + if ($n_max_monitoring_secs > 0) { + $f_start_time = microtime(true); + } + if (!checkdnsrr($a_components[1])) { + $b_valid = false; + $s_reason = "invalid domain name '" . $a_components[1] . "'"; + } + if ($n_max_monitoring_secs > 0) { + $f_end_time = microtime(true); + $f_diff = $f_end_time - $f_start_time; + SetSpecialField("email_validation_time_secs",number_format($f_diff,2)); + if ($f_diff >= $n_max_monitoring_secs) { + // + // let the submission go through because the time is >= EMAIL_VALIDATION_MAX_MONITORING_TIME_SECS + // + $b_error_on_invalid = false; + } + } + } + } + } + if (!$b_valid) { + if ($b_error_on_invalid) { + $s_error_mesg = GetMessage(MSG_INVALID_EMAIL, + array("EMAIL" => $s_value, + "REASON" => $s_reason + )); + if ($b_user_error) { + UserError("invalid_email",$s_error_mesg,'',array($s_name => $s_error_mesg)); + } else { + SendAlert($s_error_mesg); + } + } + } +} + +/** + * Perform some basic validation on a special field before setting it. + * Generate a UserError if $b_user_error is true. + * + * @param $s_name + * @param $s_value + * @param $b_user_error + */ +function ValidateSpecialField($s_name,$s_value,$b_user_error) +{ + switch ($s_name) { + case "email": + if ($s_value !== '') { + ValidateEmailAddress($s_name,$s_value,$b_user_error); + } + break; + } +} + +// +// Process a field +// +function ProcessField($s_name,$raw_value,&$a_order,&$a_fields,&$a_raw_fields) +{ + global $FORMATTED_INPUT; + + // + // fields go into an array of special values or an array of other values + // or get completely ignored. + // + $b_ignore = $b_special = false; + if (IsSpecialField($s_name)) { + ValidateSpecialField($s_name,$raw_value,true); + SetSpecialField($s_name,$raw_value); + $b_special = true; + } + // + // check for multiple valued special fields + // + if (($a_multi_fld = IsSpecialMultiField($s_name)) !== false) { + SetSpecialMultiField($a_multi_fld[0],$a_multi_fld[1],$raw_value); + $b_special = true; + } + if (!$b_special) { + if (IsReverseCaptchaField($s_name)) { + $b_ignore = true; + } + } + if (!$b_special && !$b_ignore) { + // + // return the raw value unchanged in the $a_raw_fields array + // + $a_raw_fields[$s_name] = $raw_value; + // + // handle checkboxes and multiple-selection lists + // Thanks go to Theodore Boardman for the suggestion + // and initial working code. + // + if (is_array($raw_value)) { + if (empty($raw_value)) { + $s_cleaned_value = ""; + } else { + $a_cleaned_values = CleanValue($raw_value); + // + // the output is a comma separated list of values for the + // checkbox. For example, + // events: Diving,Cycling,Running + // + // Set the clean value to the list of cleaned checkbox + // values. + // First, remove any commas in the values themselves. + // + $a_cleaned_values = str_replace(",","",$a_cleaned_values); + $s_cleaned_value = implode(",",$a_cleaned_values); + } + } else { + // + // NOTE: there is a minor bug here now that we support + // $FORM_INI_FILE. The INI file is processed at the end + // so if you set the mail_options below in the INI file they + // won't get processed here. This means you must set + // the following mail_options in the HTML form for now. + // (To be fixed at a later date. RJR 17-Feb-06). + // + + // + // if the form specifies the "KeepLines" option, + // don't strip new lines + // + if (IsMailOptionSet("KeepLines") && strpos($raw_value,"\n") !== false) { + // + // truncate first + // + $s_truncated = substr("$raw_value",0,Settings::get('MAXSTRING')); + // + // split into lines, clean each individual line, + // then put it back together again + // + $a_lines = explode("\n",$s_truncated); + $a_lines = CleanValue($a_lines); + $s_cleaned_value = implode(Settings::get('BODY_LF'),$a_lines); + // + // and, for this special case, prepend a new line + // so that the value is shown on a fresh line + // + $s_cleaned_value = Settings::get('BODY_LF') . $s_cleaned_value; + } else { + $s_cleaned_value = CleanValue($raw_value); + } + } + // + // if the form specifies the "NoEmpty" option, skip + // empty values. + // + if (!IsMailOptionSet("NoEmpty") || !FieldManager::IsEmpty($s_cleaned_value)) { + if (!IsMailExcluded($s_name)) { + // + // by default, we maintain the order as passed in + // the HTTP request + // + $a_order[] = $s_name; + $a_fields[$s_name] = $s_cleaned_value; + } + } + + // + // add to the $FORMATTED_INPUT array for debugging and + // error reporting + // + array_push($FORMATTED_INPUT,"$s_name: '$s_cleaned_value'"); + } +} + +// +// Parse the input variables and return: +// 1. an array that specifies the required field order in the output +// 2. an array containing the non-special cleaned field values indexed +// by field name. +// 3. an array containing the non-special raw field values indexed by +// field name. +// +function ParseInput($a_vars) +{ + $a_order = array(); + $a_fields = array(); + $a_raw_fields = array(); + // + // scan the array of values passed in (name-value pairs) and + // produce slightly formatted (not HTML) textual output + // and extract any special values found. + // + foreach ($a_vars as $s_name => $raw_value) { + ProcessField($s_name,$raw_value,$a_order,$a_fields,$a_raw_fields); + } + + return (array($a_order,$a_fields,$a_raw_fields)); +} + +// +// Get the URL for sending to the CRM. +// +function GetCRMURL($spec,$vars,$url) +{ + $bad = false; + $list = TrimArray(explode(",",$spec)); + $map = array(); + for ($ii = 0 ; $ii < count($list) ; $ii++) { + $name = $list[$ii]; + if ($name) { + // + // the specification must be in this format: + // form-field-name:CRM-field-name + // + if (($i_crm_name_pos = strpos($name,":")) > 0) { + $s_crm_name = substr($name,$i_crm_name_pos + 1); + $name = substr($name,0,$i_crm_name_pos); + if (isset($vars[$name])) { + $map[] = $s_crm_name . "=" . urlencode($vars[$name]); + $map[] = "Orig_" . $s_crm_name . "=" . urlencode($name); + } + } else { + // + // not the right format, so just include as a parameter + // check for name=value format to choose encoding + // + $a_values = explode("=",$name); + if (count($a_values) > 1) { + $map[] = urlencode($a_values[0]) . "=" . urlencode($a_values[1]); + } else { + $map[] = urlencode($a_values[0]); + } + } + } + } + if (count($map) == 0) { + return (""); + } + return (AddURLParams($url,$map,false)); +} + +// +// strip the HTML from a string or array of strings +// +function StripHTML($m_value,$s_line_feed = "\n") +{ + if (is_array($m_value)) { + foreach ($m_value as $m_key => $s_str) { + $m_value[$m_key] = StripHTML($s_str); + } + return ($m_value); + } + $s_str = $m_value; + // + // strip HTML comments (s option means include new lines in matches) + // + $s_str = preg_replace('//s','',$s_str); + // + // strip any scripts (i option means case-insensitive) + // + $s_str = preg_replace('/]*?>.*?<\/script[^>]*?>/si','',$s_str); + // + // replace paragraphs with new lines (line feeds) + // + $s_str = preg_replace('/]*?>/i',$s_line_feed,$s_str); + // + // replace breaks with new lines (line feeds) + // + $s_str = preg_replace('//i',$s_line_feed,$s_str); + // + // overcome this bug: http://bugs.php.net/bug.php?id=21311 + // + $s_str = preg_replace('/]*>/s','',$s_str); + // + // get rid of all HTML tags + // + $s_str = strip_tags($s_str); + return ($s_str); +} + +// +// Check for valid URL in TARGET_URLS +// +function CheckValidURL($s_url) +{ + + foreach (Settings::get('TARGET_URLS') as $s_prefix) { + if (!empty($s_prefix) && + strtolower(substr($s_url,0,strlen($s_prefix))) == + strtolower($s_prefix) + ) { + return (true); + } + } + return (false); +} + +// +// Scan the given data for fields returned from the CRM. +// A field has this following format: +// __FIELDNAME__=value +// terminated by a line feed. +// +function FindCRMFields($s_data) +{ + $a_ret = array(); + if (preg_match_all('/^__([A-Za-z][A-Za-z0-9_]*)__=(.*)$/m',$s_data,$a_matches) === false) { + SendAlert(GetMessage(MSG_PREG_FAILED)); + } else { + $n_matches = count($a_matches[0]); + // SendAlert("$n_matches on '$s_data'"); + for ($ii = 0 ; $ii < $n_matches ; $ii++) { + if (isset($a_matches[1][$ii]) && isset($a_matches[2][$ii])) { + $a_ret[$a_matches[1][$ii]] = $a_matches[2][$ii]; + } + } + } + return ($a_ret); +} + +// +// open the given URL to send data to it, we expect the response +// to contain at least '__OK__=' followed by true or false +// +function SendToCRM($s_url,&$a_data) +{ + global $php_errormsg; + + if (!CheckValidURL($s_url)) { + SendAlert(GetMessage(MSG_URL_INVALID,array("URL" => $s_url))); + return (false); + } + @ $fp = fopen($s_url,"r"); // RJR: TO DO: re-implement using NetIO + if ($fp === false) { + SendAlert(GetMessage(MSG_URL_OPEN,array("URL" => $s_url, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + $s_mesg = ""; + while (!feof($fp)) { + $s_line = fgets($fp,4096); + $s_mesg .= $s_line; + } + fclose($fp); + $s_mesg = StripHTML($s_mesg); + $s_result = preg_match('/__OK__=(.*)/',$s_mesg,$a_matches); + if (count($a_matches) < 2 || $a_matches[1] === "") { + // + // no agreed __OK__ value returned - assume system error + // + SendAlert(GetMessage(MSG_CRM_FAILED,array("URL" => $s_url, + "MSG" => $s_mesg + ))); + return (false); + } + // + // look for fields to return + // + $a_data = FindCRMFields($s_mesg); + // + // check for success or user error + // + switch (strtolower($a_matches[1])) { + case "true": + break; + case "false": + // + // check for user error + // + if (isset($a_data["USERERRORCODE"])) { + $s_error_code = "crm_error"; + $s_error_mesg = GetMessage(MSG_CRM_FORM_ERROR); + $s_error_code .= $a_data["USERERRORCODE"]; + if (isset($a_data["USERERRORMESG"])) { + $s_error_mesg = $a_data["USERERRORMESG"]; + } + UserError($s_error_code,$s_error_mesg); + // no return + } + return (false); + } + return (true); +} + +// +// Split into field name and friendly name; returns an array with +// two elements. +// Format is: +// fieldname:Nice printable name for displaying +// +function GetFriendlyName($s_name) +{ + if (($i_pos = strpos($s_name,':')) === false) { + return (array(trim($s_name),trim($s_name))); + } + return (array(trim(substr($s_name,0,$i_pos)),trim(substr($s_name,$i_pos + 1)))); +} + +define("REQUIREDOPS","|^!="); // operand characters for advanced required processing + +// +// Perform a field comparison test. +// +/** @noinspection PhpStatementHasEmptyBodyInspection */ +function FieldTest($s_oper,$s_fld1,$s_fld2,$a_vars,&$s_error_mesg, + $s_friendly1 = "",$s_friendly2 = "") +{ + $b_ok = true; + $s_empty1 = $s_empty2 = ""; + // + // perform the test + // + switch ($s_oper) { + case '&': // both fields must be present + if (!TestFieldEmpty($s_fld1,$a_vars,$s_empty1) && + !TestFieldEmpty($s_fld2,$a_vars,$s_empty2) + ) { + } // OK + else { + // + // failed + // + $s_error_mesg = GetMessage(MSG_AND,array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + break; + case '|': // either field or both must be present + if (!TestFieldEmpty($s_fld1,$a_vars,$s_empty1) || + !TestFieldEmpty($s_fld2,$a_vars,$s_empty2) + ) { + } // OK + else { + // + // failed + // + $s_error_mesg = GetMessage(MSG_OR,array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + break; + case '^': // either field but not both must be present + $b_got1 = !TestFieldEmpty($s_fld1,$a_vars,$s_empty1); + $b_got2 = !TestFieldEmpty($s_fld2,$a_vars,$s_empty2); + if ($b_got1 || $b_got2) { + if ($b_got1 && $b_got2) { + // + // failed + // + $s_error_mesg = GetMessage(MSG_NOT_BOTH, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + } else { + // + // failed + // + $s_error_mesg = GetMessage(MSG_XOR, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + break; + case '!=': + case '=': + $b_got1 = !TestFieldEmpty($s_fld1,$a_vars,$s_empty1); + $b_got2 = !TestFieldEmpty($s_fld2,$a_vars,$s_empty2); + if ($b_got1 && $b_got2) { + $b_match = (GetFieldValue($s_fld1,$a_vars) == + GetFieldValue($s_fld2,$a_vars)); + } elseif (!$b_got1 && !$b_got2) + // + // haven't got either value - they match + // + { + $b_match = true; + } else + // + // got one value, but not the other - they don't match + // + { + $b_match = false; + } + if ($s_oper != '=') { + // + // != operator + // + $b_match = !$b_match; + $s_desc = GetMessage(MSG_IS_SAME_AS, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + } else { + $s_desc = GetMessage(MSG_IS_NOT_SAME_AS, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + } + if (!$b_match) { + // + // failed + // + $s_error_mesg = $s_desc; + $b_ok = false; + } + break; + } + return ($b_ok); +} + +// +// Process advanced "required" conditionals +// +function AdvancedRequired($s_cond,$i_span,$a_vars,&$s_missing,&$a_missing_list) +{ + $b_ok = true; + // + // get first field name + // + list($s_fld1,$s_friendly1) = GetFriendlyName(substr($s_cond,0,$i_span)); + // + // get the operator + // + $s_rem = substr($s_cond,$i_span); + $i_span = strspn($s_rem,REQUIREDOPS); + $s_oper = substr($s_rem,0,$i_span); + switch ($s_oper) { + case '|': + case '^': + case '=': + case '!=': + // + // second component is a field name + // + list($s_fld2,$s_friendly2) = GetFriendlyName(substr($s_rem,$i_span)); + if (!FieldTest($s_oper,$s_fld1,$s_fld2,$a_vars,$s_error_mesg, + $s_friendly1,$s_friendly2) + ) { + // + // failed + // + $s_missing .= "$s_error_mesg\n"; + $a_missing_list[$s_fld1] = "$s_error_mesg"; + $b_ok = false; + } + break; + default: + SendAlert(GetMessage(MSG_REQD_OPER,array("OPER" => $s_oper))); + break; + } + return ($b_ok); +} + +// +// Check the input for required values. The list of required fields +// is a comma-separated list of field names or conditionals +// +function CheckRequired($s_reqd,$a_vars,&$s_missing,&$a_missing_list) +{ + global $reCaptchaProcessor; + + $b_bad = false; + $a_list = TrimArray(explode(",",$s_reqd)); + $s_missing = ""; + $a_missing_list = array(); + $s_mesg = ""; + for ($ii = 0 ; $ii < count($a_list) ; $ii++) { + $s_cond = $a_list[$ii]; + $i_len = strlen($s_cond); + if ($i_len <= 0) { + continue; + } + if (($i_span = strcspn($s_cond,REQUIREDOPS)) >= $i_len) { + // + // no advanced operator; just a field name + // + list($s_fld,$s_friendly) = GetFriendlyName($s_cond); + if (TestFieldEmpty($s_fld,$a_vars,$s_mesg)) { + if ($s_mesg === "") { + $s_mesg = "$s_friendly"; + } else { + $s_mesg = "$s_friendly ($s_mesg)"; + } + $b_bad = true; + $s_missing .= "$s_mesg\n"; + $a_missing_list[$s_fld] = "$s_mesg"; + } + } elseif (!AdvancedRequired($s_cond,$i_span,$a_vars, + $s_missing,$a_missing_list) + ) { + $b_bad = true; + } + } + + global $SPECIAL_VALUES; + + // + // implement REQUIRE_CAPTCHA feature + // + if (!Settings::isEmpty('REQUIRE_CAPTCHA')) { + if ($SPECIAL_VALUES["imgverify"] === "") { + $s_missing .= Settings::get('REQUIRE_CAPTCHA') . "\n"; + $a_missing_list['imgverify'] = Settings::get('REQUIRE_CAPTCHA'); + $b_bad = true; + } + } + return (!$b_bad); +} + +/** + * Class Conditions + * Implements "conditions" processing. + */ +class Conditions +{ + /** @var array|string the conditions to process */ + private $_mConditions; // + /** @var string the "conditions" field being processed */ + private $_sField; + /** @var string */ + private $_sMissing; + /** @var array */ + private $_aMissingList; + /** @var FieldManager */ + private $_FldManager; + + /** + * @param array|string $m_conditions the conditions to process + * @param string $s_missing returns the message from the condition's failure + * @param array $a_missing_list appended with the field name(s) that failed + */ + function __construct($m_conditions,&$s_missing,&$a_missing_list) + { + $this->_mConditions = $m_conditions; + $this->_sMissing = &$s_missing; + $this->_aMissingList = &$a_missing_list; + $this->_FldManager = new FieldManager(); + } + + /** + * Run the given field logic. + * + * @param string $s_test a string containing the field logic to run + * + * @return string|bool true if the logic evaluates to true, otherwise name of a field if the logic evaluates to false + */ + private function _runLogic($s_test) + { + global $aAlertInfo; + + $s_op_chars = "&|^!=~#<>"; // these are the characters for the operators + $i_len = strlen($s_test); + $b_ok = true; + $s_mesg = ""; + $s_fld_name = ""; + /** @noinspection PhpStatementHasEmptyBodyInspection */ + if ($i_len <= 0) + // + // empty test - true + // + { + } elseif ($s_test == "!") + // + // test asserts false + // + { + $b_ok = false; + } elseif (($i_span = strcspn($s_test,$s_op_chars)) >= $i_len) + // + // no operator - just check field presence + // + { + $s_fld_name = $s_test; + $b_ok = !$this->_FldManager->TestFieldEmpty($s_test,$s_mesg); + } else { + // + // get first field name + // + $s_fld_name = $s_fld1 = trim(substr($s_test,0,$i_span)); + // + // get the operator + // + $s_rem = substr($s_test,$i_span); + $i_span = strspn($s_rem,$s_op_chars); + $s_oper = substr($s_rem,0,$i_span); + switch ($s_oper) { + case '&': + case '|': + case '^': + case '=': + case '!=': + // + // get the second field name + // + $s_fld2 = trim(substr($s_rem,$i_span)); + $b_ok = FieldTest($s_oper,$s_fld1,$s_fld2,$this->_FldManager->GetFields(),$s_error_mesg); + break; + case '~': + case '!~': + // + // get the regular expression + // + $s_pat = trim(substr($s_rem,$i_span)); + if (!$this->_FldManager->TestFieldEmpty($s_fld1,$s_mesg)) { + $s_value = $this->_FldManager->GetFieldValue($s_fld1); + } else { + $s_value = ""; + } + //echo "

    Pattern: '".htmlspecialchars($s_pat)."': count=".preg_match($s_pat,$s_value)."

    "; + // + // match the regular expression + // + if (preg_match($s_pat,$s_value) > 0) { + $b_ok = ($s_oper == '~'); + } else { + $b_ok = ($s_oper == '!~'); + } + if (!$b_ok) { + $aAlertInfo[] = GetMessage(MSG_PAT_FAILED,array("OPER" => $s_oper, + "PAT" => $s_pat, + "VALUE" => $s_value + )); + } + break; + case '#=': + case '#!=': + case '#<': + case '#>': + case '#<=': + case '#>=': + // + // numeric tests + // + $s_num = trim(substr($s_rem,$i_span)); + // + // if this is a file field, get the size of the file for + // numeric tests + // + if (($s_value = GetFileSize($s_fld1)) === false) { + $s_value = $this->_FldManager->GetFieldValue($s_fld1); + } + if (strpos($s_num,'.') === false) { + // + // treat as integer + // + $m_num = (int)$s_num; + $m_fld = (int)$s_value; + } else { + // + // treat as floating point + // + $m_num = (float)$s_num; + $m_fld = (float)$s_value; + } + switch ($s_oper) { + case '#=': + $b_ok = ($m_fld == $m_num); + break; + case '#!=': + $b_ok = ($m_fld != $m_num); + break; + case '#<': + $b_ok = ($m_fld < $m_num); + break; + case '#>': + $b_ok = ($m_fld > $m_num); + break; + case '#<=': + $b_ok = ($m_fld <= $m_num); + break; + case '#>=': + $b_ok = ($m_fld >= $m_num); + break; + } + break; + default: + SendAlert(GetMessage(MSG_COND_OPER,array("OPER" => $s_oper))); + break; + } + } + return $b_ok ? true : $s_fld_name; + } + + // + // Check the input for condition tests. + // + public function Check($a_vars,$a_file_vars = array()) + { + $this->_FldManager->Init($a_vars,$a_file_vars); + // + // handle a list of conditions in an array + // + if (is_array($this->_mConditions)) { + // + // Sort the conditions by their numeric value. This ensures + // conditions are executed in the right order. + // + ksort($this->_mConditions,SORT_NUMERIC); + foreach ($this->_mConditions as $m_key => $s_cond) { + if (!$this->_checkString($s_cond,$m_key)) { + return (false); + } + } + return (true); + } else { + // + // handle one set of conditions in a string + // + return $this->_checkString($this->_mConditions); + } + } + + /** + * Test a condition represented in a string. + * + * @param string $s_cond the condition + * @param bool|int $m_id ID of the condition being processed + * + * @return bool true if the condition passed, otherwise false + */ + private function _checkString($s_cond,$m_id = false) + { + $this->_sField = "conditions" . ($m_id === false ? "" : ($m_id + 1)); + if (!is_string($s_cond)) { + SendAlert(GetMessage(MSG_INV_COND,array("FLD" => $this->_sField))); + // + // invalid conditions are simple "true" + // + return (true); + } + // + // empty conditions are simply "true" + // + if ($s_cond == "") { + return (true); + } + // + // extract the separator characters + // + if (strlen($s_cond) < 2) { + SendAlert(GetMessage(MSG_COND_CHARS, + array("FLD" => $this->_sField,"COND" => $s_cond))); + // + // invalid conditions are simple "true" + // + return (true); + } + return $this->_checkString2($s_cond); + } + + /** + * Test a condition represented in a string. This method is called by _checkString to do the real + * work after some initial sanity checks. + * + * @param string $s_cond the condition + * + * @return bool true if the condition passed, otherwise false + */ + private function _checkString2($s_cond) + { + $s_list_sep = $s_cond[0]; + $s_int_sep = $s_cond[1]; + $s_full_cond = $s_cond = substr($s_cond,2); + $b_bad = false; + $a_list = TrimArray(explode($s_list_sep,$s_cond)); + for ($ii = 0 ; $ii < count($a_list) ; $ii++) { + $s_curr_cond = $a_list[$ii]; + $i_len = strlen($s_curr_cond); + if ($i_len <= 0) { + continue; + } + // + // split the condition into its internal components + // + $a_components = TrimArray(explode($s_int_sep,$s_curr_cond)); + if (count($a_components) < 5) { + SendAlert(GetMessage(MSG_COND_INVALID, + array("FLD" => $this->_sField,"COND" => $s_curr_cond, + "SEP" => $s_int_sep + ))); + // + // the smallest condition has 5 components + // + continue; + } + // + // first component is ignored (it's blank) + // + $a_components = array_slice($a_components,1); + switch ($a_components[0]) { + case "TEST": + if (!$this->_doTest($s_curr_cond,$a_components,$s_list_sep)) { + $b_bad = true; + } + break; + case "IF": + if (!$this->_doIf($s_curr_cond,$a_components,$s_int_sep,$s_list_sep)) { + $b_bad = true; + } + break; + default: + SendAlert(GetMessage(MSG_COND_UNK, + array("FLD" => $this->_sField,"COND" => $s_curr_cond, + "CMD" => $a_components[0] + ))); + break; + } + } + return (!$b_bad); + } + + /** + * Process a TEST condition. + * + * @param string $s_cond the condition + * @param array $a_components components of the TEST condition + * @param string $s_list_sep the separator for lists in the condition + * + * @return bool true if the condition passed, otherwise false + */ + private function _doTest($s_cond,$a_components,$s_list_sep) + { + // + // sanity check - if failed, just pass the TEST + // + if (count($a_components) > 5) { + SendAlert(GetMessage(MSG_COND_TEST_LONG, + array("FLD" => $this->_sField,"COND" => $s_cond, + "SEP" => $s_list_sep + ))); + return true; + } elseif (($m_test_result = $this->_runLogic($a_components[1])) === true) { + return true; + } else { + $this->_recordField($m_test_result,$a_components[2]); + return false; + } + } + + /** + * Process an IF condition. + * + * @param string $s_cond the condition + * @param array $a_components components of the TEST condition + * @param string $s_int_sep the internal separator for the condition + * @param string $s_list_sep the separator for lists in the condition + * + * @return bool true if the condition passed, otherwise false + */ + private function _doIf($s_cond,$a_components,$s_int_sep,$s_list_sep) + { + // + // sanity checks - if failed, just pass the IF + // + if (count($a_components) < 6) { + SendAlert(GetMessage(MSG_COND_IF_SHORT, + array("FLD" => $this->_sField,"COND" => $s_cond, + "SEP" => $s_int_sep + ))); + return true; + } + if (count($a_components) > 7) { + SendAlert(GetMessage(MSG_COND_IF_LONG, + array("FLD" => $this->_sField,"COND" => $s_cond, + "SEP" => $s_list_sep + ))); + return true; + } + if (($m_test_result = $this->_runLogic($a_components[1])) === true) { + $m_test_result = $this->_runLogic($a_components[2]); + } else { + $m_test_result = $this->_runLogic($a_components[3]); + } + if ($m_test_result !== true) { + $this->_recordField($m_test_result,$a_components[4]); + return false; + } else { + return true; + } + } + + private function _recordField($s_fld_name,$s_mesg) + { + $this->_sMissing .= $s_mesg . "\n"; + $this->_aMissingList[$s_fld_name] = $s_mesg; + } + +} + +/** + * Original interface to processing conditions. + * This function is only kept for backwards compatibility with any existing hook code. + * + * @param mixed $m_conditions a single condition or an array of them + * @param array $a_vars field values + * @param string $s_missing returns the message from the condition's failure + * @param array $a_missing_list appended with the field name(s) that failed + * @param bool|int $m_id was never used - deprecated + * + * @return bool true if the condition passed, otherwise false + * @noinspection PhpUnused + */ +function CheckConditions($m_conditions,$a_vars,&$s_missing,&$a_missing_list,$m_id = false) +{ + global $aFileVars; + + $cond = new Conditions($m_conditions,$s_missing,$a_missing_list); + + return $cond->Check($a_vars,$aFileVars); +} + +// +// Return a formatted list of the given environment variables. +// +function GetEnvVars($list,$s_line_feed) +{ + global $aServerVars; + + $output = ""; + for ($ii = 0 ; $ii < count($list) ; $ii++) { + $name = $list[$ii]; + if ($name && array_search($name,Settings::get('VALID_ENV'),true) !== false) { + // + // if the environment variable is empty or non-existent, try + // looking for the value in the server vars. + // + if (($s_value = getenv($name)) === "" || $s_value === false) { + if (isset($aServerVars[$name])) { + $s_value = $aServerVars[$name]; + } else { + $s_value = ""; + } + } + $output .= $name . "=" . $s_value . $s_line_feed; + } + } + return ($output); +} + +// +// open a socket connection to a filter and post the data there +// RJR: TO DO: re-implement using NetIO +// +function SocketFilter($filter,$a_filter_info,$m_data) +{ + static $b_in_here = false; + global $php_errormsg; + + // + // prevent recursive errors + // + if ($b_in_here) { + return (""); + } + $b_in_here = true; + + $a_errors = array(); + if (!isset($a_filter_info["site"])) { + $a_errors[] = GetMessage(MSG_MISSING,array("ITEM" => "site")); + } else { + $s_site = $a_filter_info["site"]; + } + + if (!isset($a_filter_info["port"])) { + $a_errors[] = GetMessage(MSG_MISSING,array("ITEM" => "port")); + } else { + $i_port = (int)$a_filter_info["port"]; + } + + if (!isset($a_filter_info["path"])) { + $a_errors[] = GetMessage(MSG_MISSING,array("ITEM" => "path")); + } else { + $s_path = $a_filter_info["path"]; + } + + if (!isset($a_filter_info["params"])) { + $a_params = array(); + } elseif (!is_array($a_filter_info["params"])) { + $a_errors[] = GetMessage(MSG_NEED_ARRAY,array("ITEM" => "params")); + } else { + $a_params = $a_filter_info["params"]; + } + + if (!empty($a_errors)) { + Error("bad_filter",GetMessage(MSG_FILTER_WRONG,array( + "FILTER" => $filter, + "ERRORS" => implode(', ',$a_errors) + )), false,false); + FormMailExit(); + } + + // + // ready to build the socket - we need a longer time limit for the + // script if we're doing this; we allow 30 seconds for the connection + // (should be instantaneous, especially if it's the same domain) + // + set_time_limit(60); + /** @noinspection PhpUndefinedVariableInspection */ + /** @noinspection PhpUndefinedVariableInspection */ + @ $f_sock = fsockopen($s_site,$i_port,$i_errno,$s_errstr,30); + if ($f_sock === false) { + Error("filter_connect",GetMessage(MSG_FILTER_CONNECT,array( + "FILTER" => $filter, + "SITE" => $s_site, + "ERRNUM" => $i_errno, + "ERRSTR" => "$s_errstr (" . CheckString($php_errormsg) . ")" + )), + false,false); + FormMailExit(); + } + // + // build the data to send + // + $m_request_data = array(); + $i_count = 0; + /** @noinspection PhpUndefinedVariableInspection */ + foreach ($a_params as $m_var) { + $i_count++; + // + // if the parameter spec is an array, process it specially; + // it must have "name" and "file" elements + // + if (is_array($m_var)) { + if (!isset($m_var["name"])) { + Error("bad_filter",GetMessage(MSG_FILTER_PARAM, + array("FILTER" => $filter, + "NUM" => $i_count, + "NAME" => "name" + )),false,false); + fclose($f_sock); + FormMailExit(); + } + $s_name = $m_var["name"]; + if (!isset($m_var["file"])) { + Error("bad_filter",GetMessage(MSG_FILTER_PARAM, + array("FILTER" => $filter, + "NUM" => $i_count, + "NAME" => "file" + )),false,false); + fclose($f_sock); + FormMailExit(); + } + // + // open the file and read its contents + // + @ $fp = fopen($m_var["file"],"r"); + if ($fp === false) { + Error("filter_error",GetMessage(MSG_FILTER_OPEN_FILE, + array("FILTER" => $filter, + "FILE" => $m_var["file"], + "ERROR" => CheckString($php_errormsg) + )),false,false); + fclose($f_sock); + FormMailExit(); + } + $s_data = ""; + $n_lines = 0; + while (!feof($fp)) { + if (($s_line = fgets($fp,2048)) === false) { + if (feof($fp)) { + break; + } else { + Error("filter_error",GetMessage(MSG_FILTER_FILE_ERROR, + array("FILTER" => $filter, + "FILE" => $m_var["file"], + "ERROR" => CheckString($php_errormsg), + "NLINES" => $n_lines + )),false,false); + fclose($f_sock); + FormMailExit(); + } + } + $s_data .= $s_line; + $n_lines++; + } + + fclose($fp); + $m_request_data[] = "$s_name=" . urlencode($s_data); + } else { + $m_request_data[] = (string)$m_var; + } + } + // + // add the data + // + if (is_array($m_data)) { + $m_request_data[] = "data=" . urlencode(implode(Settings::get('BODY_LF'),$m_data)); + } else { + $m_request_data[] = "data=" . urlencode($m_data); + } + $s_request = implode("&",$m_request_data); + + if (($i_pos = strpos($s_site,"://")) !== false) { + $s_site_name = substr($s_site,$i_pos + 3); + } else { + $s_site_name = $s_site; + } + + /** @noinspection PhpUndefinedVariableInspection */ + fputs($f_sock,"POST $s_path HTTP/1.0\r\n"); + fputs($f_sock,"Host: $s_site_name\r\n"); + fputs($f_sock,"Content-Type: application/x-www-form-urlencoded\r\n"); + fputs($f_sock,"Content-Length: " . strlen($s_request) . "\r\n"); + fputs($f_sock,"\r\n"); + fputs($f_sock,"$s_request\r\n"); + + // + // now read the response + // + $m_hdr = ""; + $m_data = ""; + $b_in_hdr = true; + $b_ok = false; + while (!feof($f_sock)) { + if (($s_line = fgets($f_sock,2048)) === false) { + if (feof($f_sock)) { + break; + } else { + Error("filter_failed",GetMessage(MSG_FILTER_READ_ERROR, + array("FILTER" => $filter, + "ERROR" => CheckString($php_errormsg) + )),false,false); + fclose($f_sock); + FormMailExit(); + } + } + // + // look for an "__OK__" line + // + if (trim($s_line) == "__OK__") { + $b_ok = true; + } elseif ($b_in_hdr) { + // + // blank line signals end of header + // + if (trim($s_line) == "") { + $b_in_hdr = false; + } else { + $m_hdr .= $s_line; + } + } else { + $m_data .= $s_line; + } + } + // + // if not OK, then report error + // + if (!$b_ok) { + Error("filter_failed",GetMessage(MSG_FILTER_NOT_OK, + array("FILTER" => $filter, + "DATA" => $m_data + )),false,false); + fclose($f_sock); + FormMailExit(); + } + fclose($f_sock); + $b_in_here = false; + return ($m_data); +} + +// +// run data through a supported filter +// +/** @noinspection PhpStatementHasEmptyBodyInspection */ +function Filter($filter,$m_data) +{ + + global $php_errormsg; + static $b_in_here = false; + + // + // prevent recursive errors + // + if ($b_in_here) { + return (""); + } + $b_in_here = true; + + // + // Any errors sent in an alert are flagged to not run through the + // filter - this also means the user's data won't be included in the + // alert. + // The reason for this is that the Filter is typically an encryption + // program. If the filter fails, then sending the user's data in + // clear text in an alert breaks the security of having encryption + // in the first place! + // + + // + // find the filter + // + $a_filters = Settings::get('FILTERS'); + if (!isset($a_filters[$filter]) || $a_filters[$filter] == "") { + // + // check for SOCKET_FILTERS + // + $a_filters = Settings::get('SOCKET_FILTERS'); + if (!isset($a_filters[$filter]) || $a_filters[$filter] == "") { + ErrorWithIgnore("bad_filter",GetMessage(MSG_FILTER_UNK, + array("FILTER" => $filter)),false,false); + FormMailExit(); + } + $m_data = SocketFilter($filter,$a_filters[$filter],$m_data); + } elseif ($a_filters[$filter] == "null") + // + // do nothing - just return the original data unchanged + // + { + } elseif ($a_filters[$filter] == "csv") { + $m_data = BuiltinFilterCSV(); + } else { + $cmd = $a_filters[$filter]; + // + // get the program name - assumed to be the first blank-separated word + // + $a_words = preg_split('/\s+/',$cmd); + $prog = $a_words[0]; + + $s_cwd = getcwd(); + // + // change to the directory that contains the filter program + // + $dirname = dirname($prog); + if ($dirname != "" && $dirname != "." && !chdir($dirname)) { + Error("chdir_filter", + GetMessage(MSG_FILTER_CHDIR, + array("DIR" => $dirname, + "FILTER" => $filter, + "ERROR" => CheckString($php_errormsg) + )), + false,false); + FormMailExit(); + } + + // + // the output of the filter goes to a temporary file; this works + // OK on Windows too, even with the Unix shell syntax. + // + $temp_file = GetTempName("FMF"); + $temp_error_file = GetTempName("FME"); + $cmd = "$cmd >$temp_file 2>$temp_error_file"; + // + // start the filter + // + $pipe = popen($cmd,"w"); + if ($pipe === false) { + $s_sv_err = CheckString($php_errormsg); + $err = join('',file($temp_error_file)); + unlink($temp_file); + unlink($temp_error_file); + Error("filter_not_found", + GetMessage(MSG_FILTER_NOTFOUND, + array("CMD" => $cmd, + "FILTER" => $filter, + "ERROR" => $s_sv_err + )), + false, + false, + $err); + FormMailExit(); + } + // + // write the data to the filter + // + if (is_array($m_data)) { + fwrite($pipe,implode(Settings::get('BODY_LF'),$m_data)); + } else { + fwrite($pipe,$m_data); + } + if (($i_st = pclose($pipe)) != 0) { + $s_sv_err = CheckString($php_errormsg); + $err = join('',file($temp_error_file)); + unlink($temp_file); + unlink($temp_error_file); + Error("filter_failed",GetMessage(MSG_FILTER_ERROR, + array("FILTER" => $filter, + "ERROR" => $s_sv_err, + "STATUS" => $i_st + )),false,false,$err); + FormMailExit(); + } + // + // read in the filter's output and return as the data to be sent + // + $m_data = join('',file($temp_file)); + unlink($temp_error_file); + unlink($temp_file); + + // + // return to previous directory + // + chdir($s_cwd); + } + $b_in_here = false; + return ($m_data); +} + +/* + * Function: FilterFiles + * Parameters: $a_files list of file uploads to filter + * Returns: void + * Description: + * Run the given files through any filter for which they are specified. + */ +function FilterFiles(&$a_files) +{ + global $SPECIAL_VALUES; + + FMDebug("FilterFiles " . count($a_files)); + if (!GetFilterSpec($s_filter,$a_filter_list,true) || $a_filter_list === false) + // + // no filter or file fields to filter + // + { + return; + } + if (($s_mime = GetFilterAttrib($s_filter,"MIME")) === false) { + $s_mime = ""; + } + // + // now, for each file, check if it is specified in the filter list + // + foreach ($a_files as $s_fld => $a_upload) { + FMDebug("Checking $s_fld"); + if (!FieldManager::IsUploadedFile($a_upload)) { + FMDebug("Not uploaded"); + // + // failed security check + // + continue; + } + if (!in_array($s_fld,$a_filter_list,true)) { + FMDebug("Not to be filtered"); + continue; + } + /*** not sure what to do with this.... + * if (isset($a_upload["error"])) + * // + * // there was an upload error + * // + * continue; + ***/ + // + // this file upload has been specified for filtering + // + $s_file_name = $a_upload["tmp_name"]; + // + // check if the file has been saved elsewhere + // + if (isset($a_upload["saved_as"]) && !empty($a_upload["saved_as"])) { + $s_file_name = $a_upload["saved_as"]; + } + FMDebug("File name is $s_file_name"); + // + // read in the file + // + if (($s_data = ReadInFile($s_file_name,"upload")) === false) { + Error("filter_files",GetMessage(MSG_FILE_UPLOAD_ERR_UNK,array("ERRNO" => "reading $s_fld")),false, + false); + } + // + // filter and write it back out to the same file + // + $s_data = Filter($s_filter,$s_data); + if (!WriteOutFile($s_file_name,$s_data,"upload")) { + Error("filter_files",GetMessage(MSG_FILE_UPLOAD_ERR_UNK,array("ERRNO" => "writing $s_fld")),false, + false); + } + // + // update size and MIME type for this upload + // + $a_upload["size"] = strlen($s_data); + if ($s_mime !== "") { + $a_upload["type"] = $s_mime; + } + $a_files[$s_fld] = $a_upload; + } +} + +/* + * Function: ReadInFile + * Parameters: $s_file_name the name of the file + * $s_file_error_type type of file for any error message + * $b_text if true, read file as text + * Returns: mixed the entire contents of the file + * as a string, or false on error + * Description: + * Reads the contents of a file into a string. + */ +function ReadInFile($s_file_name,$s_file_error_type,$b_text = false) +{ + global $php_errormsg; + + if (($fp = @fopen($s_file_name,"r" . ($b_text ? "t" : "b"))) === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_file_name, + "TYPE" => "read " . $s_file_error_type, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + $s_data = ""; + while (!feof($fp)) { + $s_data .= fread($fp,8192); + } + @fclose($fp); + return ($s_data); +} + +/* + * Function: WriteOutFile + * Parameters: $s_file_name the name of the file + * $s_data the data to write + * $s_file_error_type type of file for any error message + * $b_text if true, read file as text + * Returns: bool true on success, otherwise false + * Description: + * Writes the contents of a file from a string. + */ +function WriteOutFile($s_file_name,$s_data,$s_file_error_type,$b_text = false) +{ + global $php_errormsg; + + if (($fp = @fopen($s_file_name,"w" . ($b_text ? "t" : "b"))) === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_file_name, + "TYPE" => "write " . $s_file_error_type, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + if (fwrite($fp,$s_data) < strlen($s_data)) { + @fclose($fp); + return (false); + } + @fclose($fp); + return (true); +} + +/* + * Class: CSVFormat + * Description: + * Manages formatting of CSV content. + */ + +class CSVFormat +{ + var $_cSep; /* field separator character */ + var $_cQuote; /* field quote character */ + var $_cIntSep; /* internal separator character (for lists) */ + var $_sEscPolicy; /* escape processing policy */ + var $_sCleanFunc; /* cleaning function for fields */ + + /* + * Method: CSVFormat ctor + * Parameters: $c_sep the field separator + * $c_quote the quote character to use + * $c_int_sep the internal field separator to use + * $s_esc_policy escape processing policy to use + * $s_clean_func a cleaning function + * Returns: n/a + * Description: + * Constructs the object. + */ + function __construct($c_sep = ',',$c_quote = '"',$c_int_sep = ';', + $s_esc_policy = "backslash",$s_clean_func = NULL) + { + $this->SetSep($c_sep); + $this->SetQuote($c_quote); + $this->SetIntSep($c_int_sep); + $this->SetEscPolicy($s_esc_policy); + $this->SetCleanFunc($s_clean_func); + } + + /* + * Method: SetEscPolicy + * Parameters: $s_esc_policy a string specifying the escape processing + * policy to use + * Returns: void + * Description: + * Set the escape processing policy. + */ + function SetEscPolicy($s_esc_policy) + { + switch ($s_esc_policy) { + default: /* should generate a warning */ + case "backslash": + $this->_sEscPolicy = "b"; + break; + case "double": + $this->_sEscPolicy = "d"; + break; + case "strip": + $this->_sEscPolicy = "s"; + break; + case "conv": + $this->_sEscPolicy = "c"; + break; + } + } + + /* + * Method: SetSep + * Parameters: $c_sep the separator character to use + * Returns: void + * Description: + * Set the separator character for between fields. + */ + function SetSep($c_sep) + { + $this->_cSep = $c_sep; + } + + /* + * Method: SetQuote + * Parameters: $c_quote the quote character to use + * Returns: void + * Description: + * Set the quote character for quoting fields. + */ + function SetQuote($c_quote) + { + $this->_cQuote = $c_quote; + } + + /* + * Method: SetIntSep + * Parameters: $c_int_sep the internal separator character to use + * Returns: void + * Description: + * Set the internal separator character for inside fields. + */ + function SetIntSep($c_int_sep) + { + $this->_cIntSep = $c_int_sep; + } + + /* + * Method: SetCleanFunc + * Parameters: $s_clean_func the name of a cleaning function (can be NULL) + * Returns: void + * Description: + * Set the cleaning function for fields. + */ + function SetCleanFunc($s_clean_func) + { + $this->_sCleanFunc = $s_clean_func; + } + + /* + * Method: _Escape + * Parameters: $m_value the field value; string or array of strings + * Returns: mixed the field value escaped according to the + * escape processing policy + * Description: + * Escapes a field value according to the configured requirements. + */ + function _Escape($m_value) + { + switch ($this->_sEscPolicy) { + default: /* should generate an error */ + case "b": + /* + * 'backslash' escape policy: replace \ with \\ and + * " with \" + */ + $m_value = str_replace("\\","\\\\",$m_value); + $m_value = str_replace($this->_cQuote,"\\" . $this->_cQuote, + $m_value); + break; + case "d": + /* + * 'double' escape policy: replace " with "" + * This is suitable for Microsoft apps such as Excel + * and Access. It also meets the specification of + * RFC4180, though this RFC only specified double + * quotes whereas we handle any quote character. + */ + $m_value = str_replace($this->_cQuote, + $this->_cQuote . $this->_cQuote,$m_value); + break; + case "s": + /* + * 'strip' escape policy: strip quotes + */ + $m_value = str_replace($this->_cQuote,"",$m_value); + break; + case "c": + /* + * 'conv' escape policy: convert quotes to the other quotes + */ + switch ($this->_cQuote) { + case '"': + /* + * convert double quotes in the data to single quotes + */ + $m_value = str_replace("\"","'",$m_value); + break; + case '\'': + /* + * convert single quotes in the data to double quotes + */ + $m_value = str_replace("'","\"",$m_value); + break; + default: + /* + * otherwise, leave the data unchanged + */ + break; + } + break; + } + return ($m_value); + } + + /* + * Method: _Format + * Parameters: $s_value the string value to format + * $s_format a format specification + * a list of characters: + * c CleanValue + * s force to be a string + * r remove carriage returns + * Returns: string the formatted value + * Description: + * Formats a value. + */ + function _Format($s_value,$s_format = "") + { + $s_value = $this->_Escape($s_value); + $s_prefix = ""; + /* + * now implement any special formatting to overcome + * problems with importing + */ + $i_len = strlen($s_format); + for ($ii = 0 ; $ii < $i_len ; $ii++) { + switch ($s_format[$ii]) { + case "c": + /* + * implement "c" formatting - CleanValue + */ + $s_value = CleanValue($s_value); + break; + case "r": + /* + * implement "r" formatting - remove + * carriage returns. Useful for Microsoft Excel + */ + $s_value = str_replace("\r","",$s_value); + break; + case "s": + /* + * implement "s" formatting - force + * a value to be a string (by making it a string + * formula). Useful for Microsoft Excel and OpenOffice + * spreadsheet, which don't understand numeric phone + * numbers, for example. + */ + if (strlen($s_value) > 0) { + $s_prefix = "="; + } + break; + } + } + + return ($s_prefix . $this->_cQuote . $s_value . $this->_cQuote); + } + + /* + * Method: _GetColumn + * Parameters: $s_col_spec a column specification + * Returns: array the column name and the format specifier, if + * any + * Description: + * Returns the column name and any format specifier. + */ + function _GetColumn($s_col_spec) + { + $s_format = ""; + if (($i_pos = strpos($s_col_spec,":")) !== false) { + $s_col_name = trim(substr($s_col_spec,0,$i_pos)); + $s_format = trim(substr($s_col_spec,$i_pos + 1)); + } else { + $s_col_name = $s_col_spec; + } + return (array($s_col_name,$s_format)); + } + + /* + * Method: MakeCSVRecord + * Parameters: $a_column_list a list of column names (field names) to + * include; can include format specifiers + * $a_vars raw data array indexed by column name + * (field name). + * A data value can be a string or an array + * of strings. + * Returns: string the comma-separated value + * Description: + * Creates a single CSV record for a list of columns. + */ + function MakeCSVRecord($a_column_list,$a_vars) + { + $s_rec = ""; + $n_columns = count($a_column_list); + for ($ii = 0 ; $ii < $n_columns ; $ii++) { + list($s_col_name,$s_format) = $this->_GetColumn($a_column_list[$ii]); + /* + * if a column is specified it must be included, even if there + * is no data for it. + */ + $s_value = GetFieldValue($s_col_name,$a_vars,$this->_cIntSep); + if (isset($this->_sCleanFunc)) { + $s_func = $this->_sCleanFunc; + $s_value = $s_func($s_value); + } + + $s_value = $this->_Format($s_value,$s_format); + if ($ii > 0) /* + * prepend the separator from the second field onwards + */ { + $s_rec .= $this->_cSep; + } + $s_rec .= $s_value; + } + return ($s_rec); + } + + /* + * Method: MakeHeading + * Parameters: $a_column_list a list of column names (field names) to + * include + * Returns: string the comma-separated heading record + * Description: + * Creates a heading record for the CSV data. + */ + function MakeHeading($a_column_list) + { + $s_rec = ""; + $n_columns = count($a_column_list); + for ($ii = 0 ; $ii < $n_columns ; $ii++) { + list($s_col_name,$s_format) = $this->_GetColumn($a_column_list[$ii]); + $s_value = $this->_Format($s_col_name); + if ($ii > 0) /* + * prepend the separator from the second field onwards + */ { + $s_rec .= $this->_cSep; + } + $s_rec .= $s_value; + } + return ($s_rec); + } +} + +/* + * Built-in filter. Generates CSV (comma separated values) content from + * the submitted fields. The special field "filter_fields" determines + * which fields to include in the CSV content. + * The following options are support in "filter_options": + * CSVHeading if set, includes a heading line first with the field names + * CSVSep specifies a separator character instead of comma + * CSVIntSep specifies an internal separator character for lists + * CSVQuote specifies the character to use to quote each column; default + * is double quotes + * CSVEscPolicy controls the way quotes are escaped in the data. Supported + * values are: backslash (the default),double,strip + * CSVRaw if set, then the fields are recorded as raw values and + * are *not* cleaned according to FormMail's normal field + * cleaning process. + * If the "filter_fields" field does not exist, then the "csvcolumns" field is + * used instead. If neither exist, then all fields are included along with + * a Heading line. + */ +function BuiltinFilterCSV() +{ + global $aAllRawValues,$aRawDataValues,$SPECIAL_VALUES; + + $b_heading = false; + $a_column_list = array(); + $s_cols = $SPECIAL_VALUES["filter_fields"]; + if (!isset($s_cols) || empty($s_cols) || !is_string($s_cols)) { + $s_cols = $SPECIAL_VALUES["csvcolumns"]; + if (!isset($s_cols) || empty($s_cols) || !is_string($s_cols)) { + /* + * neither filter_fields nor csvcolumns defined - get all columns + */ + $s_cols = ""; + /* + * special case - include these two special fields + */ + $a_column_list = array("email","realname"); + /* + * now include all the data fields + */ + $a_column_list = array_merge($a_column_list, + array_keys($aRawDataValues)); + $b_heading = true; + } + } + if (empty($a_column_list)) { + $a_column_list = TrimArray(explode(",",$s_cols)); + } + + $csv_format = new CSVFormat(); + + /* + * get the various options and set them + */ + $m_temp = GetFilterOption("CSVQuote"); + if (isset($m_temp)) { + $csv_format->SetQuote($m_temp); + } + $m_temp = GetFilterOption("CSVSep"); + if (isset($m_temp)) { + $csv_format->SetSep($m_temp); + } + $m_temp = GetFilterOption("CSVIntSep"); + if (isset($m_temp)) { + $csv_format->SetIntSep($m_temp); + } + $m_temp = GetFilterOption("CSVEscPolicy"); + if (isset($m_temp)) { + $csv_format->SetEscPolicy($m_temp); + } + $m_temp = GetFilterOption("CSVHeading"); + if (isset($m_temp)) { + $b_heading = true; + } + + /* + * clean fields unless CSVRaw is specified + */ + $m_temp = GetFilterOption("CSVRaw"); + if (!isset($m_temp)) { + $csv_format->SetCleanFunc(function ($m_value) { + return CleanValue($m_value); + }); + } + + $s_csv = $csv_format->MakeCSVRecord($a_column_list,$aAllRawValues); + + if ($b_heading) { + $s_head = $csv_format->MakeHeading($a_column_list); + /* + * return the heading and the record with $CSVLINE as record separator + */ + return ($s_head . Settings::get('CSVLINE') . $s_csv . Settings::get('CSVLINE')); + } else { + /* + * return this record with $CSVLINE appended + */ + return ($s_csv . Settings::get('CSVLINE')); + } +} + +$aSubstituteErrors = array(); +$SubstituteFields = NULL; +$sSubstituteMissing = NULL; + +// +// Run htmlspecialchars on every value in an array. +// +function ArrayHTMLSpecialChars($a_list) +{ + $a_new = array(); + foreach ($a_list as $m_key => $m_value) { + if (is_array($m_value)) { + $a_new[$m_key] = ArrayHTMLSpecialChars($m_value); + } else { + $a_new[$m_key] = htmlspecialchars($m_value); + } + } + return ($a_new); +} + +// +// Truncate a value based on the specified maximums. +// +function Truncate($s_value,$n_max_chars,$n_max_lines) +{ + if ($n_max_lines > 0) { + $a_lines = explode("\n",$s_value); + if (count($a_lines) > $n_max_lines) { + $a_lines = array_slice($a_lines,0,$n_max_lines); + $s_value = implode("\n",$a_lines); + $s_value .= "..."; + } + } + if ($n_max_chars > 0) { + $a_lines = explode("\n",$s_value); + for ($ii = 0 ; $ii < count($a_lines) ; $ii++) { + $n_len = strlen($a_lines[$ii]); + $s_eol = ""; + if (substr($a_lines[$ii],-1) == "\n") { + $n_len--; + $s_eol = "\n"; + } + if ($n_len > $n_max_chars) { + $a_lines[$ii] = substr($a_lines[$ii],0,$n_max_chars) . "..." . $s_eol; + } + } + $s_value = implode("\n",$a_lines); + } + return ($s_value); +} + +// +// Worker function for SubstituteValue and SubstituteValueForPage. +// Returns the value of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, an error is reported or the given +// replacement string is used. +// Errors are stored in the global $aSubstituteErrors. +// +function SubstituteValueWorker($a_matches,$s_repl,$b_html = true) +{ + /** + * @global FieldManager $SubstituteFields + */ + global $aSubstituteErrors,$SubstituteFields,$SPECIAL_VALUES; + + $b_insert_br = true; // option to put "
    " tags before newlines in HTML templates + $n_max_chars = 0; + $n_max_lines = 0; + $s_list_sep = $SPECIAL_VALUES['template_list_sep']; + $b_text_subs = false; + + $s_name = $a_matches[0]; + assert(strlen($s_name) > 1 && $s_name[0] == '$'); + $s_name = substr($s_name,1); + if (($i_len = strlen($s_name)) > 0 && $s_name[0] == '{') { + assert($s_name[$i_len - 1] == '}'); + $s_name = substr($s_name,1,-1); + // + // grab any processing options + // + $a_args = explode(":",$s_name); + $s_name = $a_args[0]; + if (($n_args = count($a_args)) > 1) { + for ($ii = 1 ; $ii < $n_args ; $ii++) { + // + // some options are followed by =X + // where X is a value + // + $s_param = ""; + if (($i_pos = strpos($a_args[$ii],'=')) !== false) { + $s_param = substr($a_args[$ii],$i_pos + 1); + $s_opt = substr($a_args[$ii],0,$i_pos); + } else { + $s_opt = $a_args[$ii]; + } + switch ($s_opt) { + case "nobr": + $b_insert_br = false; + break; + case "chars": + if ($s_param !== "") { + $n_max_chars = (int)$s_param; + } + break; + case "lines": + if ($s_param !== "") { + $n_max_lines = (int)$s_param; + } + break; + case "sep": + if ($s_param !== "") { + $s_list_sep = $s_param; + } + break; + case "subs": + $b_text_subs = true; + break; + } + } + } + } + $s_value = ""; + $s_mesg = ""; + if ($SubstituteFields->IsFieldSet($s_name) && + !$SubstituteFields->TestFieldEmpty($s_name,$s_mesg) + ) { + if ($b_html) + // + // Up to and including version 8.24, the code used + // htmlspecialchars. Version 8.28 caused UTF-8 template + // processing to break, because it started using htmlentities + // without specifying the charset. + // + { + $s_value = $SubstituteFields->GetSafeFieldValue($s_name,$b_text_subs,$s_list_sep); + } else { + $s_value = $SubstituteFields->GetFieldValue($s_name,$s_list_sep); + } + $s_value = Truncate($s_value,$n_max_chars,$n_max_lines); + if ($b_html && $b_insert_br) + // + // Insert HTML line breaks before newlines. + // + { + $s_value = nl2br($s_value); + } + } elseif (isset($SPECIAL_VALUES[$s_name])) { + $s_value = $b_html ? + htmlspecialchars((string)$SPECIAL_VALUES[$s_name]) : + (string)$SPECIAL_VALUES[$s_name]; + $s_value = Truncate($s_value,$n_max_chars,$n_max_lines); + } elseif (isset($s_repl)) + // + // If a replacement value has been specified use it, and + // don't call htmlspecialchars. This allows the use + // of HTML tags in a replacement string. + // + { + $s_value = $s_repl; + } else { + $s_value = ""; + } + return ($s_value); +} + +// +// Callback function for preg_replace_callback. Returns the value +// of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, an error is reported or an special +// replacement string is used. +// Errors are stored in the global $aSubstituteErrors. +// +/** @noinspection PhpUnused */ +function SubstituteValue($a_matches) +{ + global $sSubstituteMissing; + + return (SubstituteValueWorker($a_matches,$sSubstituteMissing)); +} + +// +// Callback function for preg_replace_callback. Returns the value +// of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, an error is reported or an special +// replacement string is used. +// Errors are stored in the global $aSubstituteErrors. +// +/** @noinspection PhpUnused */ +function SubstituteValuePlain($a_matches) +{ + global $sSubstituteMissing; + + return (SubstituteValueWorker($a_matches,$sSubstituteMissing,false)); +} + +// +// Callback function for preg_replace_callback. Returns the value +// of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, the empty string is substituted. +// Errors are stored in the global $aSubstituteErrors. +// +/** @noinspection PhpUnused */ +function SubstituteValueForPage($a_matches) +{ + return (SubstituteValueWorker($a_matches,"")); +} + +// +// Callback function for preg_replace_callback. Returns +// exactly what was matched. +// +/** @noinspection PhpUnused */ +function SubstituteValueDummy($a_matches) +{ + return ($a_matches[0]); +} + +// +// Process the given HTML template and fill the fields. +// +function DoProcessTemplate($s_dir,$s_url,$s_template,&$a_lines, + $a_values,$s_missing,$s_subs_func) +{ + global $aSubstituteErrors,$SubstituteFields,$sSubstituteMissing,$aFileVars; + + if (($a_template_lines = LoadTemplate($s_template,$s_dir, + $s_url,true)) === false + ) { + return (false); + } + FMDebug("Template '$s_template' contains " . count($a_template_lines) . " lines"); + + $b_ok = true; + // + // initialize the errors list + // + $aSubstituteErrors = array(); + // + // initialize the values + // + $SubstituteFields = new FieldManager($a_values,$aFileVars); + $sSubstituteMissing = $s_missing; + + foreach ($a_template_lines as $s_line) { + // + // search for words in these forms: + // $word + // ${word:options} + // where word begins with an alphabetic character and + // consists of alphanumeric and underscore + // + $a_lines[] = preg_replace_callback('/\$[a-z][a-z0-9_]*|\$\{[a-z][a-z0-9_]*(:[^\}]*)*\}/i', + $s_subs_func,$s_line); + } + + FMDebug("DoProcessTemplate error count=" . count($aSubstituteErrors)); + if (count($aSubstituteErrors) != 0) { + SendAlert(GetMessage(MSG_TEMPLATE_ERRORS,array("NAME" => $s_template)) . + implode("\n",$aSubstituteErrors)); + $b_ok = false; + } + global $FMCTemplProc; + + // + // note that it's possible for an old version of FormMail Computation + // module to get loaded which doesn't provide FMCTemplProc + // + if ($b_ok && Settings::get('ADVANCED_TEMPLATES') && isset($FMCTemplProc)) { + $s_buf = implode("\n",$a_lines); + /* + * Look for a string that means we can skip advanced template + * processing on this template. The string is "FormMail-Basic-Template". + */ + if (strpos($s_buf,"FormMail-Basic-Template") === FALSE) { + $a_mesgs = array(); + /*foreach ($a_lines as $i_lno=>$s_line) + if (strpos($s_line,"\n") !== false) + SendAlert("Line $i_lno has a newline");*/ + set_time_limit(60); + if (($m_result = $FMCTemplProc->Process($s_buf,$a_mesgs)) === false) { + $s_msgs = "\n"; + foreach ($a_mesgs as $a_msg) { + $s_msgs .= "Line " . $a_msg["LINE"]; + $s_msgs .= ", position " . $a_msg["CHAR"] . ": "; + $s_msgs .= $a_msg["MSG"] . "\n"; + } + Error("fmadvtemplates",GetMessage(MSG_TEMPL_PROC, + array("ERRORS" => $s_msgs)),false,false); + $b_ok = false; + } else { + /*foreach ($m_result as $i_lno=>$s_line) + if (($nn = substr_count($s_line,"\n")) > 1) + SendAlert("Result line $i_lno has $nn newlines");*/ + // + // strip the new lines + // + $a_lines = explode("\n",implode("",$m_result)); + } + $a_alerts = $FMCTemplProc->GetAlerts(); + if (count($a_alerts) > 0) { + SendAlert(GetMessage(MSG_TEMPL_ALERT, + array("ALERTS" => implode("\n",$a_alerts)))); + } + $a_debug = $FMCTemplProc->GetDebug(); + if (count($a_debug) > 0) { + SendAlert(GetMessage(MSG_TEMPL_DEBUG, + array("DEBUG" => implode("\n",$a_debug)))); + } + } + } + + return ($b_ok); +} + +// +// Process the given HTML template and fill the fields. +// +function ProcessTemplate($s_template,&$a_lines,$a_values,$s_missing = NULL, + $s_subs_func = 'SubstituteValue') +{ + + if (Settings::isEmpty('TEMPLATEDIR') && Settings::isEmpty('TEMPLATEURL')) { + SendAlert(GetMessage(MSG_TEMPLATES)); + return (false); + } + return (DoProcessTemplate(Settings::get('TEMPLATEDIR'),Settings::get('TEMPLATEURL'),$s_template,$a_lines, + $a_values,$s_missing,$s_subs_func)); +} + +// +// Output the given HTML template after filling in the fields. +// +function OutputTemplate($s_template,$a_values) +{ + $a_lines = array(); + if (!ProcessTemplate($s_template,$a_lines,$a_values,"",'SubstituteValueForPage')) { + Error("template_failed",GetMessage(MSG_TEMPLATE_FAILED, + array("NAME" => $s_template)),false,false); + } else { + for ($ii = 0 ; $ii < count($a_lines) ; $ii++) { + echo $a_lines[$ii] . "\n"; + } + } +} + +// +// This function handles input type fields. +// +function RemoveFieldValue($s_name,$s_buf) +{ + // + // we search for: + // + // and change it to: + // + // + + // handle name attribute first + $s_pat = '/<(\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*)>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'',$s_buf); + + return ($s_buf); +} + +// +// Quote special characters in a replacement expression +// for preg_replace. +// +function RegReplaceQuote($s_value) +{ + return (str_replace('$','\\$',str_replace('\\','\\\\',$s_value))); +} + +// +// This function handles input type "text" and "password" +// +function FixInputText($s_name,$s_value,$s_buf) +{ + // + // we search for: + // ',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:text|password|email|tel|search|number|date|month|datetime|datetime-local|time|week|range|url|color)"[^>]*)(value="[^"]*")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // + // now add in the new value + // + $s_repl = '$1 value="' . htmlspecialchars(RegReplaceQuote($s_value)) . '" $2>'; + + // handle type attribute first + $s_pat = '/(<\s*input[^>]*type="(?:text|password|email|tel|search|number|date|month|datetime|datetime-local|time|week|range|url|color)"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:text|password|email|tel|search|number|date|month|datetime|datetime-local|time|week|range|url|color)"[^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + return ($s_buf); +} + +// +// This function handles textareas. +// +function FixTextArea($s_name,$s_value,$s_buf) +{ + // + // we search for: + // + // and change it to: + // + // + + $s_pat = '/(<\s*textarea[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*)>.*?<\s*\/\s*textarea\s*>'; + $s_pat .= '/ims'; + // + // we exclude the closing '>' from the match above so that + // we can put it below. We need to do this so that the replacement + // string is not faulty if the value begins with a digit: + // $19 Some Street + // + $s_repl = '$1>' . htmlspecialchars(RegReplaceQuote($s_value)) . ''; + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + return ($s_buf); +} + +// +// This function handles radio buttons and non-array checkboxes. +// +function FixButton($s_name,$s_value,$s_buf) +{ + // + // we search for: + // + // [^>]*?[^"\w] matches up to a word boundary starting with + // 'checked' but not '"checked' + // (="checked"|(?=[^"\w]))? this matches: + // nothing + // ="checked" + // any character except a word character or " (without + // consuming it) + // + $s_pat = '/(<\s*input[^>]*type="(?:radio|checkbox)"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:radio|checkbox)"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // handle type attribute first + $s_pat = '/(<\s*input[^>]*type="(?:radio|checkbox)"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked" $3>',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:radio|checkbox)"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked" $3>',$s_buf); + + return ($s_buf); +} + +// +// This function handles checkboxes as an array of values. +// +function FixCheckboxes($s_name,$a_values,$s_buf) +{ + //global $aDebug; + + // + // we search for: + // + $s_pat = '/(<\s*input[^>]*type="checkbox"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[]"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[]"[^>]*type="checkbox"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + foreach ($a_values as $s_value) { + // handle type attribute first + $s_pat = '/(<\s*input[^>]*type="checkbox"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[\]"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked"$3>',$s_buf); + //$aDebug[] = "Name='$s_name', pat='$s_pat'"; + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[\]"[^>]*type="checkbox"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked">',$s_buf); + } + return ($s_buf); +} + +// +// This function handles selects. +// +function FixSelect($s_name,$s_value,$s_buf) +{ + // + // we search for: + // + // + + $s_pat = '/(<\s*select[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '".*?<\s*option[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '"[^>]*)>'; + $s_pat .= '/ims'; + $s_repl = '$1 selected="selected">'; + // echo "

    pat: ".htmlspecialchars($s_pat); + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + return ($s_buf); +} + +// +// This function handles multiple selects. +// +function FixMultiSelect($s_name,$a_values,$s_buf) +{ + // + // we search for: + // + // + + foreach ($a_values as $s_value) { + $s_pat = '/(<\s*select[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[\]".*?<\s*option[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '"[^>]*)>'; + $s_pat .= '/ims'; + $s_repl = '$1 selected="selected">'; + // echo "

    pat: ".htmlspecialchars($s_pat); + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + } + return ($s_buf); +} + +// +// This function unchecks all checkboxes and select options. +// +function UnCheckStuff($s_buf) +{ + global $php_errormsg; + + // + // we search for: + // + // + + $s_pat = '/(<\s*input[^>]*type="checkbox"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // + // we search for: + // + // + + $s_pat = '/(<\s*option[^>]*?[^"\w])selected(="selected"|(?=[^"\w]))?([^>]*)>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3>',$s_buf); + + return ($s_buf); +} + +// +// Add the user agent to the url as a parameter called USER_AGENT. +// This allows dynamic web sites to know what the user's browser is. +// +function AddUserAgent($s_url) +{ + global $aServerVars,$aGetVars; + + // + // check if the USER_AGENT has been passed as a URL parameter, + // if so, use it + // + $s_agent = ""; + if (isset($aGetVars['USER_AGENT']) && $aGetVars['USER_AGENT'] !== "") { + $s_agent = $aGetVars['USER_AGENT']; + // + // check for URL encoding, and if not, then encode it + // + if (!IsURLEncoded($s_agent)) { + $s_agent = urlencode($s_agent); + } + } elseif (isset($aServerVars['HTTP_USER_AGENT'])) { + $s_agent = urlencode($aServerVars['HTTP_USER_AGENT']); + } + + if ($s_agent !== "") { + return (AddURLParams($s_url,"USER_AGENT=$s_agent",false)); + } else { + return ($s_url); + } +} + +// +// Try to determine if the given string is already URL-encoded +// +function IsURLEncoded($s_str) +{ + // + // the only non-alphanumeric characters we'd expect + // to see are defined as safe or extra in RFC 1738: + // safe = "$" | "-" | "_" | "." | "+" + // extra = "!" | "*" | "'" | "(" | ")" | "," + // plus the encoding character % + // + if (preg_match('/[^a-z0-9$_.+!*\'(),%-]/i',$s_str,$a_matches)) { + FMDebug("IsURLEncoded: '$s_str' matched '" . $a_matches[0] . "' and is therefore not URL-encoded"); + return (false); + } + return (true); +} + +// +// Sets previous values in a form. +// +function SetPreviousValues($s_form_buf,$a_values,$a_strip = array()) +{ + // + // Uncheck any checkboxes and select options + // + $s_form_buf = UnCheckStuff($s_form_buf); + foreach ($a_values as $s_name => $m_value) { + if (is_array($m_value)) { + // + // note that if no values are selected for a field, + // then we will never get here for that field + // + $s_form_buf = FixCheckboxes($s_name,$m_value,$s_form_buf); + $s_form_buf = FixMultiSelect($s_name,$m_value,$s_form_buf); + } else { + // + // Fix the field if it's an input type "text" or "password". + // + $s_form_buf = FixInputText($s_name,$m_value,$s_form_buf); + // + // Fix the field if it's radio button. + // + $s_form_buf = FixButton($s_name,$m_value,$s_form_buf); + // + // Fix the field if it's a "textarea". + // + $s_form_buf = FixTextArea($s_name,$m_value,$s_form_buf); + // + // Fix the field if it's a "select". + // + $s_form_buf = FixSelect($s_name,$m_value,$s_form_buf); + } + } + // + // Now strip particular field values. + // + foreach ($a_strip as $s_name) { + $s_form_buf = RemoveFieldValue($s_name,$s_form_buf); + } + return ($s_form_buf); +} + +// +// Open a URL, do value substitutions, and send to browser. +// The a_strip array provides a list of fields (usually +// hidden fields) to remove from the form (their values are +// set to empty). +// +function ProcessReturnToForm($s_url,$a_values,$a_strip = array()) +{ + global $php_errormsg; + + // + // read the original form, and modify it to provide values + // for the fields + // + if (!CheckValidURL($s_url)) { + Error("invalid_url",GetMessage(MSG_RETURN_URL_INVALID, + array("URL" => $s_url)),false,false); + } + + $s_form_url = AddUserAgent($s_url); + $s_error = ""; + $s_form_buf = GetURL($s_form_url,$s_error); + if ($s_form_buf === false) { + Error("invalid_url", + GetMessage(MSG_OPEN_URL, + array("URL" => $s_form_url, + "ERROR" => $s_error . + ": " . + (isset($php_errormsg) ? + $php_errormsg : "") + )), + false, + false); + } + + // + // Next, we replace or set actual field values. + // + echo SetPreviousValues($s_form_buf,$a_values,$a_strip); +} + +// +// To return the URL for returning to a particular multi-page form URL. +// +function GetReturnLink($s_this_script,$i_form_index) +{ + global $aServerVars; + + if (!CheckValidURL($s_this_script)) { + Error("not_valid_url",GetMessage(MSG_RETURN_URL_INVALID, + array("URL" => $s_this_script)),false,false); + } + + $a_params = array(); + $a_params[] = "return=$i_form_index"; + if (isset($aServerVars["QUERY_STRING"])) { + $a_params[] = $aServerVars["QUERY_STRING"]; + } + $a_params[] = session_name() . "=" . session_id(); + return (AddURLParams($s_this_script,$a_params)); +} + +// +// Process a multi-page form template. +// +function ProcessMultiFormTemplate($s_template,$a_values,&$a_lines) +{ + global $SPECIAL_VALUES; + + if (Settings::isEmpty('MULTIFORMDIR') && Settings::isEmpty('MULTIFORMURL')) { + SendAlert(GetMessage(MSG_MULTIFORM)); + return (false); + } + // + // create the "this_form_url" field + // + + $i_index = GetSession("FormIndex"); + $a_list = GetSession("FormList"); + $a_values["this_form_url"] = $a_list[$i_index]["URL"]; + // + // get the persistent file fields + // + $a_values = GetSavedFileNames($a_values); + //$a_values["prev_form"] = GetReturnLink($SPECIAL_VALUES["this_form"]); + return (DoProcessTemplate(Settings::get('MULTIFORMDIR'),Settings::get('MULTIFORMURL'),$s_template,$a_lines, + $a_values,"",'SubstituteValueForPage')); +} + +// +// Output the multi-form template after filling in the fields. +// +function OutputMultiFormTemplate($s_template,$a_values) +{ + $a_lines = array(); + if (!ProcessMultiFormTemplate($s_template,$a_values,$a_lines)) { + Error("multi_form_failed",GetMessage(MSG_MULTIFORM_FAILED, + array("NAME" => $s_template)),false,false); + } else { + $n_lines = count($a_lines); + $s_buf = ""; + for ($ii = 0 ; $ii < $n_lines ; $ii++) { + $s_buf .= $a_lines[$ii] . "\n"; + unset($a_lines[$ii]); // free memory (hopefully) + } + unset($a_lines); // free memory (hopefully) + + if (IsSetSession("FormKeep")) + // + // put in any values that are being forward-remembered + // + { + echo SetPreviousValues($s_buf,GetSession("FormKeep")); + } else { + echo $s_buf; + } + } +} + +// +// Insert a preamble into a MIME message. +// +function MimePreamble(&$a_lines,$a_mesg = array()) +{ + $a_preamble = explode("\n",GetMessage(MSG_MIME_PREAMBLE)); + foreach ($a_preamble as $s_line) { + $a_lines[] = $s_line . Settings::get('HEAD_CRLF'); + } + + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + $b_need_blank = false; + foreach ($a_mesg as $s_line) { + $a_lines[] = $s_line . Settings::get('HEAD_CRLF'); + if (!empty($s_line)) { + $b_need_blank = true; + } + } + if ($b_need_blank) { + $a_lines[] = Settings::get('HEAD_CRLF'); + } // blank line +} + +// +// Create the HTML mail +// +function HTMLMail(&$a_lines,&$a_headers,$s_body,$s_template,$s_missing,$s_filter, + $s_boundary,$a_raw_fields,$b_no_plain,$b_process_template) +{ + $s_charset = GetMailOption("CharSet"); + if (!isset($s_charset)) { + $s_charset = "ISO-8859-1"; + } + if ($b_no_plain) { + $b_multi = false; + // + // don't provide a plain text version - just the HTML + // + $a_headers['Content-Type'] = SafeHeader("text/html; charset=$s_charset"); + } else { + $b_multi = true; + $a_headers['Content-Type'] = "multipart/alternative; boundary=\"$s_boundary\""; + + $a_pre_lines = explode("\n",GetMessage(MSG_MIME_HTML, + array("NAME" => $s_template))); + + MimePreamble($a_lines,$a_pre_lines); + + // + // first part - the text version only + // + $a_lines[] = "--$s_boundary" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Type: text/plain; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + // + // treat the body like one line, even though it isn't + // + $a_lines[] = $s_body; + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + // + // second part - the HTML version + // + $a_lines[] = "--$s_boundary" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Type: text/html; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + } + + $a_html_lines = array(); + if (!$b_process_template) { + if (!ProcessTemplate($s_template,$a_html_lines,$a_raw_fields,NULL,'SubstituteValueDummy')) { + return (false); + } + } elseif (!ProcessTemplate($s_template,$a_html_lines,$a_raw_fields,$s_missing)) { + return (false); + } + + if (!empty($s_filter)) + // + // treat the data like one line, even though it isn't + // + { + $a_lines[] = Filter($s_filter,$a_html_lines); + } else { + foreach ($a_html_lines as $s_line) { + $a_lines[] = $s_line; + } + } + + if ($b_multi) { + // + // end + // + $a_lines[] = "--$s_boundary--" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + } + return (true); +} + +// +// Add the contents of a file in base64 encoding. +// +function AddFile(&$a_lines,$s_file_name,$i_file_size,$b_remove = true) +{ + global $php_errormsg; + + @ $fp = fopen($s_file_name,"rb"); + if ($fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_file_name, + "TYPE" => "attachment", + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + // + // PHP under IIS has problems with the filesize function when + // the file is on another drive. So, we replaced a call + // to filesize with the $i_file_size parameter (this occurred + // in version 3.01). + // + $s_contents = fread($fp,$i_file_size); + // + // treat as a single line, even though it isn't + // + $a_lines[] = chunk_split(base64_encode($s_contents)); + fclose($fp); + if ($b_remove) { + @unlink($s_file_name); + } + return (true); +} + +// +// Add the contents of a string in base64 encoding. +// +function AddData(&$a_lines,$s_data) +{ + // + // treat as a single line, even though it isn't + // + $a_lines[] = chunk_split(base64_encode($s_data)); + return (true); +} + +/** + * Check if a file is a valid uploaded file. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param array $a_file_spec file specification + * + * @return bool + */ +function IsUploadedFile($a_file_spec) +{ + return FieldManager::IsUploadedFile($a_file_spec); +} + +// +// Save an uploaded file to the repository directory. +// +function SaveFileInRepository(&$a_file_spec) +{ + global $php_errormsg; + + // + // if a replacement name has been specified, use that, otherwise + // use the original name + // + if (isset($a_file_spec["new_name"])) { + $s_file_name = basename($a_file_spec["new_name"]); + } else { + $s_file_name = basename($a_file_spec["name"]); + } + $s_dest = Settings::get('FILE_REPOSITORY') . "/" . $s_file_name; + + $b_ok = true; + $s_error = ""; + + if (isset($a_file_spec["saved_as"]) && !empty($a_file_spec["saved_as"])) { + FMDebug("SaveFileInRepository: saved_as"); + $s_srce = $a_file_spec["saved_as"]; + } else { + $s_srce = $a_file_spec["tmp_name"]; + } + + FMDebug("SaveFileInRepository: $s_srce"); + if (!Settings::get('FILE_OVERWRITE')) { + clearstatcache(); + if (@file_exists($s_dest)) { + $b_ok = false; + $s_error = GetMessage(MSG_SAVE_FILE_EXISTS,array("FILE" => $s_dest)); + } + } + if (Settings::get('MAX_FILE_UPLOAD_SIZE') != 0 && + $a_file_spec["size"] > Settings::get('MAX_FILE_UPLOAD_SIZE') * 1024 + ) + // + // this exits + // + { + UserError("upload_size",GetMessage(MSG_FILE_UPLOAD_SIZE, + array("NAME" => $a_file_spec["name"], + "SIZE" => $a_file_spec["size"], + "MAX" => Settings::get('MAX_FILE_UPLOAD_SIZE') + ))); + } + if ($b_ok) { + if (isset($a_file_spec["saved_as"]) && !empty($a_file_spec["saved_as"])) { + if (!copy($s_srce,$s_dest) || !@unlink($s_srce)) { + $b_ok = false; + } + } else { + if (!move_uploaded_file($s_srce,$s_dest)) { + $b_ok = false; + } + } + if ($b_ok) { + // + // Flag to say it's been put in the repository. + // + $a_file_spec["in_repository"] = true; + // + // Its new location + // + $a_file_spec["saved_as"] = $s_dest; + // + // Now that the file has been saved, "is_uploaded_file" + // will return false. So, we create a flag to say it was + // valid. + // + $a_file_spec["moved"] = true; + } else { + $s_error = $php_errormsg; + } + } + if (!$b_ok) { + SendAlert(GetMessage(MSG_SAVE_FILE,array( + "FILE" => $s_srce, + "DEST" => $s_dest, + "ERR" => $s_error + ))); + return (false); + } + // + // ignore chmod fails (other than reporting them) + // + if (Settings::get('FILE_MODE') != 0 && !chmod($s_dest,Settings::get('FILE_MODE'))) { + SendAlert(GetMessage(MSG_CHMOD,array( + "FILE" => $s_dest, + "MODE" => Settings::get('FILE_MODE'), + "ERR" => $s_error + ))); + } + return (true); +} + +// +// Save all uploaded files to the repository directory. +// +function SaveAllFilesToRepository() +{ + global $aFileVars; + + if (!Settings::get('FILEUPLOADS') || Settings::get('FILE_REPOSITORY') === "") + // + // nothing to do + // + { + return (true); + } + + foreach ($aFileVars as $m_file_key => $a_upload) { + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (!isset($a_upload["tmp_name"]) || empty($a_upload["tmp_name"]) || + !isset($a_upload["name"]) || empty($a_upload["name"]) + ) { + continue; + } + if (isset($a_upload["in_repository"]) && $a_upload["in_repository"]) + // + // already saved + // + { + continue; + } + if (!FieldManager::IsUploadedFile($a_upload)) { + SendAlert(GetMessage(MSG_FILE_UPLOAD_ATTACK, + array("NAME" => $a_upload["name"], + "TEMP" => $a_upload["tmp_name"], + "FLD" => $m_file_key + ))); + continue; + } + if (!SaveFileInRepository($aFileVars[$m_file_key])) { + return (false); + } + // + // Now the file has been saved in the repository, make + // the field persistent through all further processing + // (e.g. all movements in a multi-page form) + // + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + } else { + $a_saved_files = array(); + } + $a_saved_files["repository_" . $m_file_key] = $aFileVars[$m_file_key]; + SetSession("FormSavedFiles",$a_saved_files); + } + return (true); +} + +// +// Delete an uploaded file from the repository directory. +// For security reasons, only the field name can be used. This +// uniquely identifies an uploaded file by this form process. +// +function DeleteFileFromRepository($s_fld) +{ + global $aFileVars; + + if (!Settings::get('FILEUPLOADS') || Settings::get('FILE_REPOSITORY') === "") + // + // nothing to do + // + { + return (false); + } + + if (($a_upload = GetFileInfo($s_fld)) === false) { + return (false); + } + + if (isset($a_upload["in_repository"]) && $a_upload["in_repository"]) { + if (isset($a_upload["saved_as"]) && !empty($a_upload["saved_as"])) { + @unlink($a_upload["saved_as"]); + } + } + DeleteFileInfo($s_fld); + return (true); +} + +// +// Save an uploaded file for later processing. +// +function SaveUploadedFile(&$a_file_spec,$s_prefix) +{ + global $php_errormsg; + + FMDebug("SaveUploadedFile"); + $s_dest = GetScratchPadFile($s_prefix); + if (!move_uploaded_file($a_file_spec["tmp_name"],$s_dest)) { + SendAlert(GetMessage(MSG_SAVE_FILE,array( + "FILE" => $a_file_spec["tmp_name"], + "DEST" => $s_dest, + "ERR" => $php_errormsg + ))); + return (false); + } + $a_file_spec["saved_as"] = $s_dest; + $a_file_spec["moved"] = true; + return (true); +} + +// +// Remove old files from the scratchpad directory. +// +function CleanScratchPad($s_prefix = "") +{ + global $lNow; + global $php_errormsg; + + if (Settings::isEmpty('SCRATCH_PAD')) + // + // no scratchpad to cleanup! + // + { + return; + } + if (Settings::get('CLEANUP_TIME') <= 0) + // + // cleanup disabled + // + { + return; + } + // + // compute chance of cleanup + // + if (Settings::get('CLEANUP_CHANCE') < 100) { + $i_rand = mt_rand(1,100); + if ($i_rand > Settings::get('CLEANUP_CHANCE')) { + return; + } + } + if (($f_dir = @opendir(Settings::get('SCRATCH_PAD'))) === false) { + Error("open_scratch_pad",GetMessage(MSG_OPEN_SCRATCH_PAD,array( + "DIR" => Settings::get('SCRATCH_PAD'), + "ERR" => $php_errormsg + )), false,false); + return; + } + $i_len = strlen($s_prefix); + while (($s_file = readdir($f_dir)) !== false) { + $s_path = Settings::get('SCRATCH_PAD') . "/" . $s_file; + if (is_file($s_path) && ($i_len == 0 || substr($s_file,0,$i_len) == $s_prefix)) { + if (($a_stat = @stat($s_path)) !== false) { + if (isset($a_stat['mtime'])) { + $l_time = $a_stat['mtime']; + } else { + $l_time = $a_stat[9]; + } + if (($lNow - $l_time) / 60 >= Settings::get('CLEANUP_TIME')) { + @unlink($s_path); + } + } + } + } + closedir($f_dir); +} + +// +// Save all uploaded files for later processing. +// +function SaveAllUploadedFiles(&$a_file_vars) +{ + global $php_errormsg; + + $s_prefix = "UPLD"; + if (Settings::isEmpty('SCRATCH_PAD')) { + Error("need_scratch_pad",GetMessage(MSG_NEED_SCRATCH_PAD),false,false); + return (false); + } + + // + // remove old uploaded files that have not been moved out. + // + CleanScratchPad($s_prefix); + + foreach (array_keys($a_file_vars) as $m_file_key) { + $a_upload = &$a_file_vars[$m_file_key]; + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (!isset($a_upload["tmp_name"]) || empty($a_upload["tmp_name"]) || + !isset($a_upload["name"]) || empty($a_upload["name"]) + ) { + continue; + } + // + // ensure we don't move the file more than once + // + if (!isset($a_upload["saved_as"]) || empty($a_upload["saved_as"])) { + if (!FieldManager::IsUploadedFile($a_upload)) { + SendAlert(GetMessage(MSG_FILE_UPLOAD_ATTACK, + array("NAME" => $a_upload["name"], + "TEMP" => $a_upload["tmp_name"], + "FLD" => $m_file_key + ))); + } elseif (!SaveUploadedFile($a_upload,$s_prefix)) { + return (false); + } + } + } + return (true); +} + +// +// Attach a file to the body of a MIME formatted email. $a_lines is the +// current body, and is modified to include the file. +// $a_file_spec must have the following values (just like an uploaded +// file specification): +// name the name of the file +// type the mime type +// tmp_name the name of the temporary file +// size the size of the temporary file +// +// Alternatively, you supply the following instead of tmp_name and size: +// data the data to attach +// +function AttachFile(&$a_lines,$s_att_boundary,$a_file_spec,$s_charset,$b_remove = true) +{ + $a_lines[] = "--$s_att_boundary" . Settings::get('HEAD_CRLF'); + // + // if a replacement name has been specified, use that, otherwise + // use the original name + // + if (isset($a_file_spec["new_name"])) { + $s_file_name = $a_file_spec["new_name"]; + } else { + $s_file_name = $a_file_spec["name"]; + } + $s_file_name = str_replace('"','',$s_file_name); + $s_mime_type = $a_file_spec["type"]; + // + // The following says that the data is encoded in + // base64 and is an attachment and that once decoded the + // character set of the decoded data is $s_charset. + // (See RFC 1521 Section 5.) + // + $a_lines[] = "Content-Type: $s_mime_type; name=\"$s_file_name\"; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Transfer-Encoding: base64" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Disposition: attachment; filename=\"$s_file_name\"" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + if (isset($a_file_spec["tmp_name"]) && isset($a_file_spec["size"])) { + $s_srce = $a_file_spec["tmp_name"]; + // + // check if the file has been saved elsewhere + // + if (isset($a_file_spec["saved_as"]) && !empty($a_file_spec["saved_as"])) { + $s_srce = $a_file_spec["saved_as"]; + } + FMDebug("AttachFile: $s_srce"); + return (AddFile($a_lines,$s_srce,$a_file_spec["size"],$b_remove)); + } + if (!isset($a_file_spec["data"])) { + SendAlert(GetMessage(MSG_ATTACH_DATA)); + return (false); + } + return (AddData($a_lines,$a_file_spec["data"])); +} + +// +// Reformat the email to be in MIME format. +// Process file attachments and and fill out any +// specified HTML template. +// +function MakeMimeMail(&$s_body,&$a_headers,$a_raw_fields,$s_template = "", + $s_missing = NULL,$b_no_plain = false, + $s_filter = "",$a_file_vars = array(), + $a_attach_spec = array(),$b_process_template = true) +{ + global $FM_VERS; + global $SPECIAL_VALUES; + + $s_charset = GetMailOption("CharSet"); + if (!isset($s_charset)) { + $s_charset = "ISO-8859-1"; + } + $b_att = $b_html = false; + $b_got_filter = (isset($s_filter) && !empty($s_filter)); + if (isset($s_template) && !empty($s_template)) { + $b_html = true; + } + if (count($a_file_vars) > 0) { + if (!Settings::get('FILEUPLOADS')) { + SendAlert(GetMessage(MSG_FILE_UPLOAD)); + // + // if storing files in the server repository, don't attach + // unless the mail_options insist + // + } elseif (Settings::get('FILE_REPOSITORY') === "" || IsMailOptionSet("AlwaysEmailFiles")) { + foreach ($a_file_vars as $a_upload) { + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (isset($a_upload["tmp_name"]) && !empty($a_upload["tmp_name"]) && + isset($a_upload["name"]) && !empty($a_upload["name"]) + ) { + $b_att = true; + break; + } + } + } + } + // + // check for an internally-generated attachment + // + if (isset($a_attach_spec["Data"])) { + $b_att = true; + } + + $s_uniq = md5($s_body); + $s_body_boundary = "BODY$s_uniq"; + $s_att_boundary = "PART$s_uniq"; + $a_headers['MIME-Version'] = "1.0 (produced by FormMail $FM_VERS from www.tectite.com)"; + + // + // if the filter strips formatting, then we'll only have plain text + // to send, even after the template has been used + // + if ($b_got_filter && IsFilterAttribSet($s_filter,"Strips")) + // + // no HTML if the filter strips the formatting + // + { + $b_html = false; + } + $a_new = array(); + if ($b_att) { + $a_headers['Content-Type'] = "multipart/mixed; boundary=\"$s_att_boundary\""; + + MimePreamble($a_new); + // + // add the body of the email + // + $a_new[] = "--$s_att_boundary" . Settings::get('HEAD_CRLF'); + if ($b_html) { + $a_lines = $a_local_headers = array(); + if (!HTMLMail($a_lines,$a_local_headers,$s_body,$s_template, + $s_missing,($b_got_filter) ? $s_filter : "", + $s_body_boundary,$a_raw_fields,$b_no_plain, + $b_process_template) + ) { + return (false); + } + $a_new = array_merge($a_new,ExpandMailHeadersArray($a_local_headers)); + $a_new[] = Settings::get('HEAD_CRLF'); // blank line after header + $a_new = array_merge($a_new,$a_lines); + } else { + $a_new[] = "Content-Type: text/plain; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_new[] = Settings::get('HEAD_CRLF'); // blank line + // + // treat the body like one line, even though it isn't + // + $a_new[] = $s_body; + } + // + // now add the attachments or save to the $FILE_REPOSITORY + // + if (Settings::get('FILEUPLOADS') && + (Settings::get('FILE_REPOSITORY') === "" || IsMailOptionSet("AlwaysEmailFiles")) + ) { + foreach ($a_file_vars as $m_file_key => $a_upload) { + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (!isset($a_upload["tmp_name"]) || empty($a_upload["tmp_name"]) || + !isset($a_upload["name"]) || empty($a_upload["name"]) + ) { + continue; + } + if (!FieldManager::IsUploadedFile($a_upload)) { + SendAlert(GetMessage(MSG_FILE_UPLOAD_ATTACK, + array("NAME" => $a_upload["name"], + "TEMP" => $a_upload["tmp_name"], + "FLD" => $m_file_key + ))); + continue; + } + if (Settings::get('MAX_FILE_UPLOAD_SIZE') != 0 && + $a_upload["size"] > Settings::get('MAX_FILE_UPLOAD_SIZE') * 1024 + ) { + UserError("upload_size",GetMessage(MSG_FILE_UPLOAD_SIZE, + array("NAME" => $a_upload["name"], + "SIZE" => $a_upload["size"], + "MAX" => Settings::get('MAX_FILE_UPLOAD_SIZE') + ))); + } + if (!AttachFile($a_new,$s_att_boundary,$a_upload,$s_charset, + Settings::get('FILE_REPOSITORY') === "") + ) { + return (false); + } + } + } + if (isset($a_attach_spec["Data"])) { + // + // build a specification similar to a file upload + // + $a_file_spec["name"] = isset($a_attach_spec["Name"]) ? + $a_attach_spec["Name"] : + "attachment.dat"; + $a_file_spec["type"] = isset($a_attach_spec["MIME"]) ? + $a_attach_spec["MIME"] : + "text/plain"; + $a_file_spec["data"] = $a_attach_spec["Data"]; + if (!AttachFile($a_new,$s_att_boundary,$a_file_spec, + isset($a_attach_spec["CharSet"]) ? + $a_attach_spec["CharSet"] : + $s_charset) + ) { + return (false); + } + } + $a_new[] = "--$s_att_boundary--" . Settings::get('HEAD_CRLF'); // the end + $a_new[] = Settings::get('HEAD_CRLF'); // blank line + } elseif ($b_html) { + if (!HTMLMail($a_new,$a_headers,$s_body,$s_template, + $s_missing,($b_got_filter) ? $s_filter : "", + $s_body_boundary,$a_raw_fields,$b_no_plain, + $b_process_template) + ) { + return (false); + } + } else { + $a_headers['Content-Type'] = SafeHeader("text/plain; charset=$s_charset"); + // + // treat the body like one line, even though it isn't + // + $a_new[] = $s_body; + } + + $s_body = JoinLines(Settings::get('BODY_LF'),$a_new); + return (true); +} + +// +// to make a From line for the email +// +function MakeFromLine($s_email,$s_name) +{ + $s_style = GetMailOption("FromLineStyle"); + $s_line = ""; + if (!isset($s_style)) { + $s_style = ""; + } + // + // the following From line styles are in accordance with RFC 822 + // + switch ($s_style) { + default: + case "": + case "default": + case "AddrSpecName": + // + // this is the original From line style that FormMail produced + // e.g. + // jack@nowhere.com (Jack Smith) + // this is an addr-spec with a trailing comment with the name + // + if (!empty($s_email)) { + $s_line .= SafeHeaderEmail($s_email) . " "; + } + if (!empty($s_name)) { + $s_line .= "(" . SafeHeaderComment(EncodeHeaderText($s_name)) . ")"; + } + break; + case "NameAddrSpec": + // + // email address as an addr-spec preceded by a comment with the name + // e.g. + // (Jack Smith) jack@nowhere.com + // + if (!empty($s_name)) { + $s_line .= "(" . SafeHeaderComment(EncodeHeaderText($s_name)) . ") "; + } + if (!empty($s_email)) { + $s_line .= SafeHeaderEmail($s_email); + } + break; + case "RouteAddr": + // + // just the email address as a route-addr + // e.g. + // + // + if (!empty($s_email)) { + $s_line .= "<" . SafeHeaderEmail($s_email) . ">"; + } + break; + case "QuotedNameRouteAddr": + // + // email address as a route-addr preceded + // by the name of the user as a quoted string + // e.g. + // "Jack Smith" + // + if (!empty($s_name)) { + $s_line .= '"' . SafeHeaderQString(EncodeHeaderText($s_name)) . '" '; + } + if (!empty($s_email)) { + $s_line .= "<" . SafeHeaderEmail($s_email) . ">"; + } + break; + case "NameRouteAddr": + // + // email address as a route-addr preceded + // by the name of the user as words + // e.g. + // Jack Smith + // + if (!empty($s_name)) { + $s_line .= SafeHeaderWords(EncodeHeaderText($s_name)) . ' '; + } + if (!empty($s_email)) { + $s_line .= "<" . SafeHeaderEmail($s_email) . ">"; + } + break; + } + return ($s_line); +} + +// +// Return two sets of plain text output: the filtered fields and the +// non-filtered fields. +// +function GetFilteredOutput($a_fld_order,$a_clean_fields,$s_filter,$a_filter_list) +{ + // + // find the non-filtered fields and make unfiltered text from them + // + $a_unfiltered_list = array(); + $n_flds = count($a_fld_order); + for ($ii = 0 ; $ii < $n_flds ; $ii++) { + if (!in_array($a_fld_order[$ii],$a_filter_list)) { + $a_unfiltered_list[] = $a_fld_order[$ii]; + } + } + $s_unfiltered_results = MakeFieldOutput($a_unfiltered_list,$a_clean_fields); + // + // filter the specified fields only + // + $s_filtered_results = MakeFieldOutput($a_filter_list,$a_clean_fields); + $s_filtered_results = Filter($s_filter,$s_filtered_results); + return (array($s_unfiltered_results,$s_filtered_results)); +} + +// +// Make a plain text email body +// +function MakePlainEmail($a_fld_order,$a_clean_fields, + $s_to,$s_cc,$s_bcc,$a_raw_fields,$s_filter,$a_filter_list) +{ + global $SPECIAL_VALUES; + + $s_unfiltered_results = $s_filtered_results = ""; + $b_got_filter = (isset($s_filter) && !empty($s_filter)); + if ($b_got_filter) { + if (isset($a_filter_list) && count($a_filter_list) > 0) { + $b_limited_filter = true; + } else { + $b_limited_filter = false; + } + } + $b_used_template = false; + if (IsMailOptionSet("PlainTemplate")) { + $s_template = GetMailOption("PlainTemplate"); + if (ProcessTemplate($s_template,$a_lines,$a_raw_fields,GetMailOption('TemplateMissing'), + 'SubstituteValuePlain') + ) { + $b_used_template = true; + $s_unfiltered_results = implode(Settings::get('BODY_LF'),$a_lines); + if ($b_got_filter) { + // + // with a limited filter, the template goes unfiltered + // and the named fields get filtered + // + if ($b_limited_filter) { + list ($s_discard,$s_filtered_results) = GetFilteredOutput($a_fld_order, + $a_clean_fields, + $s_filter,$a_filter_list); + } else { + $s_filtered_results = Filter($s_filter,$s_unfiltered_results); + $s_unfiltered_results = ""; + } + } + } + } + if (!$b_used_template) { + $res_hdr = ""; + + if (IsMailOptionSet("DupHeader")) { + // + // write some standard mail headers + // + $res_hdr = "To: $s_to" . Settings::get('BODY_LF'); + if (!empty($s_cc)) { + $res_hdr .= "Cc: $s_cc" . Settings::get('BODY_LF'); + } + if (!empty($SPECIAL_VALUES["email"])) { + $res_hdr .= "From: " . MakeFromLine($SPECIAL_VALUES["email"], + $SPECIAL_VALUES["realname"]) . Settings::get('BODY_LF'); + } + $res_hdr .= Settings::get('BODY_LF'); + if (IsMailOptionSet("StartLine")) { + $res_hdr .= "--START--" . Settings::get('BODY_LF'); + } // signals the beginning of the text to filter + } + + // + // put the realname and the email address at the top of the results + // (if not excluded) + // + if (!IsMailExcluded("realname")) { + array_unshift($a_fld_order,"realname"); + $a_clean_fields["realname"] = $SPECIAL_VALUES["realname"]; + } + if (!IsMailExcluded("email")) { + array_unshift($a_fld_order,"email"); + $a_clean_fields["email"] = $SPECIAL_VALUES["email"]; + } + if ($b_got_filter) { + if ($b_limited_filter) { + list($s_unfiltered_results,$s_filtered_results) = + GetFilteredOutput($a_fld_order,$a_clean_fields, + $s_filter,$a_filter_list); + } else { + // + // make text output and filter it (filter all fields) + // + $s_filtered_results = MakeFieldOutput($a_fld_order,$a_clean_fields); + $s_filtered_results = Filter($s_filter,$s_filtered_results); + } + } else { + //SendAlert("There are ".count($a_fld_order)." fields in the order array"); + //SendAlert("Here is the clean fields array:\r\n".var_export($a_clean_fields,true)); + $s_unfiltered_results = MakeFieldOutput($a_fld_order,$a_clean_fields); + } + $s_unfiltered_results = $res_hdr . $s_unfiltered_results; + } + $s_results = $s_unfiltered_results; + if ($b_got_filter && !empty($s_filtered_results)) { + if (!empty($s_results)) { + $s_results .= Settings::get('BODY_LF'); + } + $s_results .= $s_filtered_results; + } + // + // append the environment variables report + // + if (isset($SPECIAL_VALUES["env_report"]) && !empty($SPECIAL_VALUES["env_report"])) { + $s_results .= Settings::get('BODY_LF') . "==================================" . Settings::get('BODY_LF'); + $s_results .= Settings::get('BODY_LF') . GetEnvVars(TrimArray(explode(",",$SPECIAL_VALUES["env_report"])), + Settings::get('BODY_LF')); + } + return (array($s_results,$s_unfiltered_results,$s_filtered_results)); +} + +// +// Return the list of fields to be filtered, FALSE if no list provided. +// +function GetFilterList($b_file_fields) +{ + global $SPECIAL_VALUES; + + // + // no filter means no list of fields + // + if (!empty($SPECIAL_VALUES["filter"])) { + if ($b_file_fields) { + if (isset($SPECIAL_VALUES["filter_files"]) && !empty($SPECIAL_VALUES["filter_files"])) { + return (TrimArray(explode(",",$SPECIAL_VALUES["filter_files"]))); + } + } else { + if (isset($SPECIAL_VALUES["filter_fields"]) && !empty($SPECIAL_VALUES["filter_fields"])) { + return (TrimArray(explode(",",$SPECIAL_VALUES["filter_fields"]))); + } + } + } + return (false); +} + +/* + * Function: GetFilterSpec + * Parameters: $s_filter returns the filter name + * $m_filter_list returns the list of fields to filter (an array) + * or is set to false if there is no filter list + * $b_file_fields if true, return file fields, otherwise return non-file fields + * Returns: bool true if filtering a list of fields of the specified type + * Description: + * Checks whether the form has specified to filter a list of + * fields of the specified type (file fields or non-file fields). + */ +function GetFilterSpec(&$s_filter,&$m_filter_list,$b_file_fields = false) +{ + global $SPECIAL_VALUES; + + if (isset($SPECIAL_VALUES["filter"]) && !empty($SPECIAL_VALUES["filter"])) { + $s_filter = $SPECIAL_VALUES["filter"]; + $m_filter_list = GetFilterList($b_file_fields); + return (true); + } + return (false); +} + +// +// send the given results to the given email addresses +// +function SendResults($a_fld_order,$a_clean_fields,$s_to,$s_cc,$s_bcc,$a_raw_fields) +{ + global $SPECIAL_VALUES,$aFileVars,$ValidEmails; + + // + // check for a filter and how to use it + // + $b_filter_attach = false; + $a_attach_spec = array(); + $s_filter = ""; + $a_filter_list = array(); + if ($b_got_filter = GetFilterSpec($s_filter,$a_filter_list)) { + if ($a_filter_list === false) { + // + // not a limited filter, so filter all fields + // + $b_limited_filter = false; + $a_filter_list = array(); + } else { + $b_limited_filter = true; + } + FMDebug("SendResults: got filter '$s_filter', limited=$b_limited_filter"); + $s_filter_attach_name = GetFilterOption("Attach"); + if (isset($s_filter_attach_name)) { + if (!is_string($s_filter_attach_name) || empty($s_filter_attach_name)) { + SendAlert(GetMessage(MSG_ATTACH_NAME)); + } else { + $b_filter_attach = true; + $a_attach_spec = array("Name" => $s_filter_attach_name); + if (($s_mime = GetFilterAttrib($s_filter,"MIME")) !== false) { + $a_attach_spec["MIME"] = $s_mime; + } + // + // Regarding the character set... + // A filter will not generally change the character set + // of the message, however, if it does, then we + // provide that information to the MIME encoder. + // Remember: this character set specification refers + // to the data *after* the effect of the filter + // has been reversed (e.g. an encrypted message + // in UTF-8 is in UTF-8 when it is decrypted). + // + if (($s_cset = GetFilterAttrib($s_filter,"CharSet")) !== false) { + $a_attach_spec["CharSet"] = $s_cset; + } + } + } + } + + // + // check the need for MIME formatted mail + // + $b_mime_mail = (IsMailOptionSet("HTMLTemplate") || count($aFileVars) > 0 || + $b_filter_attach); + + // + // create the email header lines - CC, BCC, From, and Reply-To + // + $a_headers = array(); + if (!empty($s_cc)) { + $a_headers['Cc'] = SafeHeader($s_cc); + } + if (!empty($SPECIAL_VALUES["replyto"])) { + // + // expand replyto list + // + CheckEmailAddress($SPECIAL_VALUES["replyto"],$s_list,$s_invalid,false); + if (!empty($s_list)) { + $a_headers['Reply-To'] = SafeHeader($s_list); + } + } + if (!empty($s_bcc)) { + $a_headers['Bcc'] = SafeHeader($s_bcc); + } + // + // create the From address + // + // Some servers won't let you set the email address to the + // submitter of the form. Therefore, use FromAddr if it's been + // specified to set the sender and the "From" address. + // + $s_sender = GetMailOption("FromAddr"); + if (!isset($s_sender)) { + $s_sender = ""; + if (!empty($SPECIAL_VALUES["email"])) { + $a_headers['From'] = MakeFromLine($SPECIAL_VALUES["email"], + $SPECIAL_VALUES["realname"]); + } + } elseif ($s_sender !== "") { + $s_sender = UnMangle($s_sender); + if ($ValidEmails->CheckAddress($s_sender)) { + $s_sender = $a_headers['From'] = SafeHeader($s_sender); + } else { + SendAlert(GetMessage(MSG_INVALID_SENDER,array("LOC" => "FromAddr in mail_options","EMAIL" => $s_sender))); + $s_sender = ""; + } + } + + /* + * Override sender if $FIXED_SENDER is set. + */ + if (Settings::get('FIXED_SENDER') !== "") { + $s_sender = Settings::get('FIXED_SENDER'); + } + + // + // special case: if there is only one non-special string value, then + // format it as an email (unless an option says not to) + // + $a_keys = array_keys($a_raw_fields); + if (count($a_keys) == 1 && is_string($a_raw_fields[$a_keys[0]]) && + !IsMailOptionSet("AlwaysList") && !IsMailOptionSet("DupHeader") + ) { + if (IsMailExcluded($a_keys[0])) { + SendAlert("Exclusion of single field '" . $a_keys[0] . "' ignored"); + } + $s_value = $a_raw_fields[$a_keys[0]]; + // + // replace carriage return/linefeeds with
    + // + $s_value = str_replace("\r\n",'
    ',$s_value); + // + // replace lone linefeeds with
    + // + $s_value = str_replace("\n",'
    ',$s_value); + // + // remove lone carriage returns + // + $s_value = str_replace("\r","",$s_value); + // + // replace all control chars with
    + // + $s_value = preg_replace('/[[:cntrl:]]+/','
    ',$s_value); + // + // strip HTML (note that all the
    above will now be + // replaced with BODY_LF) + // + $s_value = StripHTML($s_value,Settings::get('BODY_LF')); + + if ($b_mime_mail) { + if ($b_got_filter) { + // + // filter the whole value (ignore filter_fields for this + // special case) if a filter has been specified + // + $s_results = Filter($s_filter,$s_value); + if ($b_filter_attach) { + $a_attach_spec["Data"] = $s_results; + // + // KeepInLine keeps the filtered version inline as well + // as an attachment + // + if (!IsFilterOptionSet("KeepInLine")) { + $s_results = ""; + } + $s_filter = ""; // no more filtering + } + } else { + $s_results = $s_value; + } + + // + // send this single value off to get formatted in a MIME + // email + // + if (!MakeMimeMail($s_results,$a_headers,$a_raw_fields, + GetMailOption('HTMLTemplate'), + GetMailOption('TemplateMissing'), + IsMailOptionSet("NoPlain"), + $s_filter,$aFileVars,$a_attach_spec) + ) { + return (false); + } + } elseif ($b_got_filter) + // + // filter the whole value (ignore filter_fields for this special case) + // if a filter has been specified + // + { + $s_results = Filter($s_filter,$s_value); + } else { + $s_results = $s_value; + if (IsMailOptionSet("CharSet")) + // + // sending plain text email, and the CharSet has been + // specified; include a header + // + { + $a_headers['Content-Type'] = "text/plain; charset=" . SafeHeader(GetMailOption("CharSet")); + } + } + } else { + if ($b_mime_mail) { + // + // get the plain text version of the email then send it + // to get MIME formatted + // + list($s_results,$s_unfiltered_results,$s_filtered_results) = + MakePlainEmail($a_fld_order,$a_clean_fields, + $s_to,$s_cc,$s_bcc,$a_raw_fields,$s_filter, + $a_filter_list); + if ($b_filter_attach) { + // + // attached the filtered results + // + $a_attach_spec["Data"] = $s_filtered_results; + // + // KeepInLine keeps the filtered version inline as well + // as an attachment + // + if (!IsFilterOptionSet("KeepInLine")) + // + // put the unfiltered results in the body of the message + // + { + $s_results = $s_unfiltered_results; + } + $s_filter = ""; // no more filtering + } + if (!MakeMimeMail($s_results,$a_headers,$a_raw_fields, + GetMailOption('HTMLTemplate'), + GetMailOption('TemplateMissing'), + IsMailOptionSet("NoPlain"), + $s_filter,$aFileVars,$a_attach_spec) + ) { + return (false); + } + } else { + list($s_results,$s_unfiltered_results,$s_filtered_results) = + MakePlainEmail($a_fld_order,$a_clean_fields, + $s_to,$s_cc,$s_bcc,$a_raw_fields,$s_filter, + $a_filter_list); + if (!$b_got_filter && IsMailOptionSet("CharSet")) + // + // sending plain text email, and the CharSet has been + // specified; include a header + // + { + $a_headers['Content-Type'] = "text/plain; charset=" . SafeHeader(GetMailOption("CharSet")); + } + } + } + + // + // now save uploaded files to the repository + // + if (Settings::get('FILEUPLOADS') && Settings::get('FILE_REPOSITORY') !== "") { + if (!SaveAllFilesToRepository()) { + return (false); + } + } + + // + // send the mail - assumes the email addresses have already been checked + // + return (SendCheckedMail($s_to,$SPECIAL_VALUES["subject"],$s_results, + $s_sender,$a_headers)); +} + +// +// append an entry to a log file +// +function WriteLog($log_file) +{ + global $SPECIAL_VALUES,$php_errormsg; + + @ $log_fp = fopen($log_file,"a"); + if ($log_fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $log_file, + "TYPE" => "log", + "ERROR" => CheckString($php_errormsg) + ))); + return; + } + $date = gmdate("H:i:s d-M-y T"); + $entry = $date . ":" . $SPECIAL_VALUES["email"] . "," . + $SPECIAL_VALUES["realname"] . "," . $SPECIAL_VALUES["subject"] . "\n"; + fwrite($log_fp,$entry); + fclose($log_fp); +} + +// +// write the data to a comma-separated-values file +// +function WriteCSVFile($s_csv_file,$a_vars) +{ + global $SPECIAL_VALUES; + + // + // create an array of column values in the order specified + // in $SPECIAL_VALUES["csvcolumns"] + // + $a_column_list = $SPECIAL_VALUES["csvcolumns"]; + if (!isset($a_column_list) || empty($a_column_list) || !is_string($a_column_list)) { + SendAlert(GetMessage(MSG_CSVCOLUMNS,array("VALUE" => $a_column_list))); + return; + } + if (!isset($s_csv_file) || empty($s_csv_file) || !is_string($s_csv_file)) { + SendAlert(GetMessage(MSG_CSVFILE,array("VALUE" => $s_csv_file))); + return; + } + + @ $fp = fopen($s_csv_file,"a" . Settings::get('CSVOPEN')); + if ($fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_csv_file, + "TYPE" => "CSV", + "ERROR" => CheckString($php_errormsg) + ))); + return; + } + + // + // convert the column list to an array, trim the names too + // + $a_column_list = TrimArray(explode(",",$a_column_list)); + $n_columns = count($a_column_list); + + // + // if the file is currently empty, put the column names in the first line + // + $b_heading = false; + if (filesize($s_csv_file) == 0) { + $b_heading = true; + } + + $csv_format = new CSVFormat(); + + // + // now configure the CSVFormat object + // according to FormMail's configuration settings + // + $csv_format->SetQuote(Settings::get('CSVQUOTE')); + $csv_format->SetEscPolicy("conv"); + $csv_format->SetSep(Settings::get('CSVSEP')); + $csv_format->SetIntSep(Settings::get('CSVINTSEP')); + if (Settings::get('LIMITED_IMPORT')) { + $csv_format->SetCleanFunc(function ($m_value) { + return CleanValue($m_value); + }); + } + + $s_csv = $csv_format->MakeCSVRecord($a_column_list,$a_vars); + + if ($b_heading) { + fwrite($fp,$csv_format->MakeHeading($a_column_list) . Settings::get('CSVLINE')); + } + + fwrite($fp,$s_csv . Settings::get('CSVLINE')); + fclose($fp); + // CreatePage($debug); + // FormMailExit(); +} + +function CheckConfig() +{ + $a_mesgs = array(); + if (in_array("TARGET_EMAIL",Settings::get('CONFIG_CHECK'))) { + // + // $TARGET_EMAIL values should begin with ^ and end with $ + // + $a_target_email = Settings::get('TARGET_EMAIL'); + for ($ii = 0 ; $ii < count($a_target_email) ; $ii++) { + $s_pattern = $a_target_email[$ii]; + if (substr($s_pattern,0,1) != '^') { + $a_mesgs[] = GetMessage(MSG_TARG_EMAIL_PAT_START, + array("PAT" => $s_pattern)); + } + if (substr($s_pattern,-1) != '$') { + $a_mesgs[] = GetMessage(MSG_TARG_EMAIL_PAT_END, + array("PAT" => $s_pattern)); + } + } + } + if (Settings::get('SET_SENDER_FROM_EMAIL')) { + $a_mesgs[] = GetMessage(MSG_SET_SENDER_FROM_EMAIL); + } + if (count($a_mesgs) > 0) { + SendAlert(GetMessage(MSG_CONFIG_WARN, + array("MESGS" => implode("\n",$a_mesgs))),false,true); + } +} + +// +// append an entry to the Auto Responder log file +// +function WriteARLog($s_to,$s_subj,$s_info) +{ + global $aServerVars,$php_errormsg; + + if (Settings::isEmpty('LOGDIR') || Settings::isEmpty('AUTORESPONDLOG')) { + return; + } + + $log_file = Settings::get('LOGDIR') . "/" . Settings::get('AUTORESPONDLOG'); + @ $log_fp = fopen($log_file,"a"); + if ($log_fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $log_file, + "TYPE" => "log", + "ERROR" => CheckString($php_errormsg) + ))); + return; + } + $a_entry = array(); + $a_entry[] = gmdate("H:i:s d-M-y T"); // date/time in GMT + $a_entry[] = $aServerVars['REMOTE_ADDR']; // remote IP address + $a_entry[] = $s_to; // target email address + $a_entry[] = $s_subj; // subject line + $a_entry[] = $s_info; // information + + $s_log_entry = implode(",",$a_entry) . "\n"; + fwrite($log_fp,$s_log_entry); + fclose($log_fp); +} + +/* + * The main logic starts here.... + */ + +// +// First, a special case; if formmail.php is called like this: +// http://.../formmail.php?testalert=1 +// it sends a test message to the default alert address with some +// information about your PHP version and the DOCUMENT_ROOT. +// +if (isset($aGetVars["testalert"])) { + if ($aGetVars["testalert"] == Settings::get('TEST_PASSWORD')) { + function ShowServerVar($s_name) + { + global $aServerVars; + + return (isset($aServerVars[$s_name]) ? $aServerVars[$s_name] : "-not set-"); + } + + $sAlert = GetMessage(MSG_ALERT, + array("LANG" => $sLangID, + "PHPVERS" => $ExecEnv->getPHPVersionString(), + "FM_VERS" => $FM_VERS, + "SERVER" => (IsServerWindows() ? "Windows" : "non-Windows"), + "DOCUMENT_ROOT" => ShowServerVar('DOCUMENT_ROOT'), + "SCRIPT_FILENAME" => ShowServerVar('SCRIPT_FILENAME'), + "PATH_TRANSLATED" => ShowServerVar('PATH_TRANSLATED'), + "REAL_DOCUMENT_ROOT" => CheckString($REAL_DOCUMENT_ROOT), + )); + + if (Settings::get('DEF_ALERT') == "") { + echo "

    " . GetMessage(MSG_NO_DEF_ALERT) . "

    "; + } elseif (SendAlert($sAlert,false,true)) { + echo "

    " . GetMessage(MSG_TEST_SENT) . "

    "; + } else { + echo "

    " . GetMessage(MSG_TEST_FAILED) . "

    "; + } + FormMailExit(); + } else { + echo "

    Wrong password for testalert!

    "; + FormMailExit(); + } +} + +if (isset($aGetVars["testlang"]) && $aGetVars["testlang"] == 1) { + + function ShowMessages() + { + global $aMessages,$sLangID,$aGetVars,$sHTMLCharSet; + + // + // force message numbers on unless "mnums=no" + // + if (isset($aGetVars["mnums"]) && $aGetVars["mnums"] == "no") { + Settings::set('bShowMesgNumbers',false); + } else { + Settings::set('bShowMesgNumbers',true); + } + LoadBuiltinLanguage(); + + $s_def_lang = $sLangID; + $a_def_mesgs = $aMessages; + + LoadLanguageFile(); + + $s_active_lang = $sLangID; + $a_active_mesgs = $aMessages; + + $a_list = get_defined_constants(); + + echo "\n"; + echo "\n"; + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($a_list as $s_name => $i_value) { + if (substr($s_name,0,4) == "MSG_") { + // + // some PHP constants begin with MSG_, so we try to skip them + // too + // + switch ($s_name) { + case "MSG_IPC_NOWAIT": + case "MSG_EAGAIN": + case "MSG_ENOMSG": + case "MSG_NOERROR": + case "MSG_EXCEPT": + case "MSG_OOB": + case "MSG_PEEK": + case "MSG_DONTROUTE": + case "MSG_EOR": + continue 2; + } + if ($i_value >= 256) { + continue; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + echo "
    \n"; + echo "Message Number"; + echo "\n"; + echo "$s_def_lang"; + echo "\n"; + echo "$s_active_lang"; + echo "
    \n"; + echo "$s_name ($i_value)"; + echo "\n"; + $aMessages = $a_def_mesgs; + $s_def_msg = GetMessage((int)$i_value,array(),true,true); + echo nl2br(htmlentities($s_def_msg)); // English - don't need + // FixedHTMLEntities + echo "\n"; + $aMessages = $a_active_mesgs; + $s_act_msg = GetMessage((int)$i_value,array(),true,true); + if ($s_def_msg == $s_act_msg) { + echo "identical\n"; + } else { + echo nl2br(FixedHTMLEntities($s_act_msg)); + } + echo "
    \n"; + + echo "\n"; + echo "\n"; + } + + ShowMessages(); + FormMailExit(); +} + +// +// For saved files, add in the "new_name" values to the given +// array. +// +function GetSavedFileNames($a_values) +{ + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + foreach ($a_saved_files as $s_fld => $a_upload) { + if (isset($a_upload["name"])) { + $a_values[$s_fld] = $a_upload["name"]; + } + if (isset($a_upload["new_name"])) { + $a_values["name_of_$s_fld"] = $a_upload["new_name"]; + } + } + } + return ($a_values); +} + +// +// Scan the Multi form sequence values and build up the values that +// were submitted to the given form index. +// +function GetMultiValues($a_form_list,$i_form_index,$a_order = array(), + $a_clean = array(), + $a_raw_data = array(), + $a_all_data = array(), + $a_file_data = array()) +{ + $a_ret_clean = $a_ret_raw = $a_ret_all = $a_ret_files = array(); + for ($ii = 0 ; $ii < $i_form_index ; $ii++) { + // + // only add a field to the order if it's not already there + // + $a_form_order = $a_form_list[$ii]["ORDER"]; + $n_order = count($a_form_order); + for ($jj = 0 ; $jj < $n_order ; $jj++) { + if (array_search($a_form_order[$jj],$a_order) === false) { + $a_order[] = $a_form_order[$jj]; + } + } + $a_ret_clean = array_merge($a_ret_clean,$a_form_list[$ii]["CLEAN"]); + $a_ret_raw = array_merge($a_ret_raw,$a_form_list[$ii]["RAWDATA"]); + $a_ret_all = array_merge($a_ret_all,$a_form_list[$ii]["ALLDATA"]); + $a_ret_files = array_merge($a_ret_files,$a_form_list[$ii]["FILES"]); + } + // + // later values must take precedence to earlier values, + // so merge in the passed-in data last + // + $a_ret_clean = array_merge($a_ret_clean,$a_clean); + $a_ret_raw = array_merge($a_ret_raw,$a_raw_data); + $a_ret_all = array_merge($a_ret_all,$a_all_data); + $a_ret_files = array_merge($a_ret_files,$a_file_data); + return (array($a_order,$a_ret_clean,$a_ret_raw,$a_ret_all,$a_ret_files)); +} + +$bMultiForm = false; + +// +// Multi-page form sequencing is complicated.... +// Requirements: +// 1. The first page in a multi-page form sequence must provide: +// - multi_start field set to 1 +// - this_form field (it's own URL) +// - next_form field (multi-page form template name) +// 2. Subsequent pages must provide either: +// next_form (the next template name in the sequence) +// OR +// good_url or good_template or neither; this terminates +// the multi-page processing and provides the final URL. +// Logic: +// 1. We create session variables to contain information about +// the sequence. +// 2. On the first submission from the starting form, we record +// its "this_form" URL and the data submitted. +// We also create a URL (to FormMail) that will allow return +// to the *next* form in the sequence. +// 3. On submission from other forms in the sequence, we record +// the data that was submitted so we can return to that +// form with the user's data re-filled into the form. +// We also create a URL (to FormMail) that will allow return +// to the *next* form in the sequence. +// 4. A return URL contains "return=index" where index is the +// form sequence index number. This is a URL to FormMail. +// FormMail gets the template name or URL (URL only for the +// starting form) and outputs the requested HTML form. It also +// truncates the session data for forms after the returned-to +// one. +// + +// +// Return to a previous form in a sequence. +// +function MultiFormReturn($i_return_to) +{ + global $iFormIndex; + global $SessionAccessor; + + if (!IsSetSession("FormList") || + !IsSetSession("FormIndex") || + $i_return_to < 0 || + $i_return_to > GetSession("FormIndex") + ) { + Error("cannot_return",GetMessage(MSG_CANNOT_RETURN, + array("TO" => $i_return_to, + "TOPINDEX" => ( + IsSetSession("FormIndex") ? + GetSession("FormIndex") : + "") + )), + false,false); + } + $a_list = GetSession("FormList"); + assert($i_return_to < count($a_list)); + $a_form_def = $a_list[$i_return_to]; + SetSession("FormList",$a_list = array_slice($a_list,0,$i_return_to + 1)); + SetSession("FormIndex",$iFormIndex = $i_return_to); + if (isset($a_form_def["FORM"])) { + // + // get the values that were originally submitted to this form + // + list(,,$a_values,,) = GetMultiValues($a_list,$i_return_to); + // + // get the session values + // + $SessionAccessor->CopyIn($a_values,true); + $a_lines = array(); + // + // process the page as a template + // + if (ProcessMultiFormTemplate($a_form_def["FORM"],$a_values,$a_lines)) { + $n_lines = count($a_lines); + $s_buf = ""; + for ($ii = 0 ; $ii < $n_lines ; $ii++) { + $s_buf .= $a_lines[$ii] . "\n"; + unset($a_lines[$ii]); // free memory (hopefully) + } + unset($a_lines); // free memory (hopefully) + // + // put in the values that the user previously submitted + // to this form + // + echo SetPreviousValues($s_buf,$a_form_def["RAWDATA"]); + } else { + Error("multi_form_failed",GetMessage(MSG_MULTIFORM_FAILED, + array("NAME" => $a_form_def["FORM"])),false,false); + } + } else + // + // we probably should include + // $SessionAccessor->CopyIn(...,true); + // at some stage in the future to get the session values....need to think about this + // and run some case studies. + // + { + ProcessReturnToForm($a_form_def["URL"],$a_form_def["RAWDATA"],array("multi_start")); + } + //echo "Returned to $i_return_to"; +} + +// +// Store any data just submitted and specified as "multi_keep". +// +function MultiKeep() +{ + global $SPECIAL_VALUES,$aRawDataValues; + + if (isset($SPECIAL_VALUES["multi_keep"]) && + !empty($SPECIAL_VALUES["multi_keep"]) + ) { + $a_list = TrimArray(explode(",",$SPECIAL_VALUES["multi_keep"])); + if (IsSetSession("FormKeep")) { + $a_keep = GetSession("FormKeep"); + } else { + $a_keep = array(); + } + // + // For each data field specified in "multi_keep" store its + // value in the FormKeep session variable. + // If a field is specified and does not exist in the + // recent submission, its value is discarded. + // + foreach ($a_list as $s_fld_name) { + if (!empty($s_fld_name)) { + if (isset($aRawDataValues[$s_fld_name])) { + $a_keep[$s_fld_name] = $aRawDataValues[$s_fld_name]; + } else { + unset($a_keep[$s_fld_name]); + } + } + } + SetSession("FormKeep",$a_keep); + } +} + +// +// Perform Logic for Multi-Page form sequences +// +function MultiFormLogic() +{ + global $bMultiForm,$SPECIAL_VALUES,$aServerVars,$aFileVars,$ExecEnv; + global $sFormMailScript,$bGotGoBack,$bGotNextForm,$iFormIndex; + global $aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues; + + if ($SPECIAL_VALUES["multi_start"] == 1) { + if (empty($SPECIAL_VALUES["this_form"])) { + ErrorWithIgnore("need_this_form",GetMessage(MSG_NEED_THIS_FORM),false,false); + } + + $bMultiForm = true; + // + // Start of multi-page form sequence + // + $a_list = array(); + $a_list[0] = array("URL" => $SPECIAL_VALUES["this_form"], + "ORDER" => $aFieldOrder, + "CLEAN" => $aCleanedValues, + "RAWDATA" => $aRawDataValues, + "ALLDATA" => $aAllRawValues, + "FILES" => $aFileVars + ); + $iFormIndex = 0; // zero is the first form, which was just submitted + SetSession("FormList",$a_list); + SetSession("FormIndex",$iFormIndex); + // + // this is a fresh session, so remove any remembered values + // + UnsetSession("FormSavedFiles"); + UnsetSession("FormKeep"); + } elseif (IsSetSession("FormList")) { + $bMultiForm = true; + } + + if ($bMultiForm) { + $sFormMailScript = $ExecEnv->GetScript(); + $iFormIndex = GetSession("FormIndex"); + } + + // + // If we're going forward in a multi-page form sequence, + // compute a URL to return to the form we're about to display. + // + if ($bMultiForm && !$bGotGoBack) { + // + // record the data that was just submitted by the previous form + // + $iFormIndex = GetSession("FormIndex"); + $a_list = GetSession("FormList"); + $a_list[$iFormIndex]["ORDER"] = $aFieldOrder; + $a_list[$iFormIndex]["CLEAN"] = $aCleanedValues; + $a_list[$iFormIndex]["RAWDATA"] = $aRawDataValues; + $a_list[$iFormIndex]["ALLDATA"] = $aAllRawValues; + if (count($aFileVars) > 0 && !Settings::get('FILEUPLOADS')) { + SendAlert(GetMessage(MSG_FILE_UPLOAD)); + } elseif (count($aFileVars) > 0 && !SaveAllUploadedFiles($aFileVars)) { + Error("upload_save_failed",GetMessage(MSG_MULTI_UPLOAD),false,false); + } + $a_list[$iFormIndex]["FILES"] = $aFileVars; + $iFormIndex++; + $s_url = GetReturnLink($sFormMailScript,$iFormIndex); + $a_list[$iFormIndex] = array("URL" => $s_url, + "FORM" => $SPECIAL_VALUES["next_form"], + "ORDER" => $aFieldOrder, + "CLEAN" => $aCleanedValues, + "RAWDATA" => $aRawDataValues, + "ALLDATA" => $aAllRawValues, + "FILES" => $aFileVars + ); + SetSession("FormList",$a_list); + SetSession("FormIndex",$iFormIndex); + MultiKeep(); + } +} + +// +// Check for the MIME Attack +// +function DetectMimeAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // if any of the recipient fields contain "MIME-Version" or + // "Content-Type" then this is the MIME attack + // Now also checks the subject field. + // + $a_rec_flds = array("recipients","cc","bcc","replyto","subject"); + foreach ($a_rec_flds as $s_fld) { + if (isset($a_fields[$s_fld])) { + // + // some of the fields can be arrays + // + if (is_array($a_fields[$s_fld])) { + $s_data = implode(",",$a_fields[$s_fld]); + } else { + $s_data = $a_fields[$s_fld]; + } + $s_data = strtolower($s_data); + if (($i_mime = strpos($s_data,"mime-version")) !== false || + ($i_cont = strpos($s_data,"content-type")) !== false + ) { + $s_attack = "MIME"; + $s_info = GetMessage(MSG_ATTACK_MIME_INFO, + array("FLD" => $s_fld, + "CONTENT" => ($i_mime !== + false) ? + "mime-version" : + "content-type" + ), + false); + return (true); + } + } + } + return (false); +} + +// +// Strip common language sequences from the data +// that might otherwise look like a junk attack. +// We replace them with a space so that the stripping +// cannot create more junk accidentally. +// +function AttackDetectionStripLang($s_data) +{ + + foreach (Settings::get('ATTACK_DETECTION_JUNK_LANG_STRIP') as $s_seq) { + $s_data = str_replace($s_seq," ",$s_data); + } + return ($s_data); +} + +// +// Find strings of $n_consec characters from the alphabet of $s_alpha +// in $s_data. Return the count of instances found. +// +function AttackDetectionFindJunk($s_data,$s_alpha,$n_consec,&$a_matches) +{ + $s_pat = "/[" . preg_quote($s_alpha,"/") . "]{" . "$n_consec,$n_consec" . "}/"; + if (($n_count = preg_match_all($s_pat,$s_data,$a_matches)) === false) { + $n_count = 0; + $a_matches = array(); + } else { + $a_matches = $a_matches[0]; + } + return ($n_count); +} + +// +// Test if a field name is a technical field. +// This means a field that is likely to contain junk values. +// Any special field and certain other field names are counted as technical. +// +function IsTechnicalField($s_fld) +{ + $b_is_technical = false; + if (IsSpecialField($s_fld) || IsSpecialMultiField($s_fld)) { + $b_is_technical = true; + } else { + // case doesn't matter + $s_lower_fld = strtolower($s_fld); + + $a_prefix_list = array('email'); + $a_prefix_found = array_filter($a_prefix_list,function ($s_prefix) use ($s_lower_fld) { + return substr($s_lower_fld,strlen($s_prefix)) === $s_prefix; + }); + $a_suffix_list = array('check','url','email'); + $a_suffix_found = array_filter($a_suffix_list,function ($s_suffix) use ($s_lower_fld) { + return substr($s_lower_fld,-strlen($s_suffix)) === $s_suffix; + }); + $a_fullname_list = array('tectiteformid'); + $b_fullname_match = array_search($s_lower_fld,$a_fullname_list) !== false; + $b_is_technical = $b_fullname_match || count($a_prefix_found) > 0 || count($a_suffix_found) > 0; + } + return $b_is_technical; +} + +// +// Check for the Junk Attack +// +function DetectJunkAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // If any field contains junk data, trigger detection. + // + $n_count = 0; + $a_matches = array(); + $a_user_matches = array(); + foreach ($a_fields as $s_fld => $m_value) { + if (IsTechnicalField($s_fld)) { + // + // Skip special fields because they don't contain + // normal user input. + // But, some special fields do contain normal user + // input, so we don't skip them. + // + $b_skip = true; + switch ($s_fld) { + case "realname": + case "subject": + $b_skip = false; + break; + } + if ($b_skip) { + continue; + } + } + // + // Ignore fields that are specified to contain + // technical information. + // + if (in_array($s_fld,Settings::get('ATTACK_DETECTION_JUNK_IGNORE_FIELDS'),true)) { + continue; + } + if (isset($m_value) && !FieldManager::IsEmpty($m_value)) { + if (!is_array($m_value)) { + $m_value = array($m_value); + } + foreach ($m_value as $s_data) { + $s_orig_data = $s_data = strtolower($s_data); + // + // Strip out sequences that might be common to + // the user's language. + // For example, in English, there are a lot of common + // words that can easily be protected from our + // tests. For example, "thousandths" has 5 consecutive consonants + // but is a reasonable word. + // Similarly, "queue" has 4 consecutive vowels. + // + $s_data = AttackDetectionStripLang($s_data); + // + // Look for strings of too many vowels or too many consonants. + // For safety, we must detect more than one instance, because there + // are a lot of normal words that may be caught by this test. + // The number of instances is controlled by configuration. + // + $n_match = AttackDetectionFindJunk($s_data,Settings::get('ATTACK_DETECTION_JUNK_CONSONANTS'), + Settings::get('ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS'), + $a_match_cons); + if ($n_match > 0) { + $a_user_matches[] = $s_orig_data; + } + $n_count += $n_match; + $n_match = AttackDetectionFindJunk($s_data,Settings::get('ATTACK_DETECTION_JUNK_VOWELS'), + Settings::get('ATTACK_DETECTION_JUNK_CONSEC_VOWELS'), + $a_match_vow); + if ($n_match > 0) { + $a_user_matches[] = $s_orig_data; + } + $n_count += $n_match; + if ($n_count >= Settings::get('ATTACK_DETECTION_JUNK_TRIGGER')) { + $a_matches = array_merge($a_matches,$a_match_cons,$a_match_vow); + $s_user_info = GetMessage(MSG_USER_ATTACK_JUNK, + array("INPUT" => implode(", ",$a_user_matches)),false); + $s_attack = "JUNK"; + $s_info = GetMessage(MSG_ATTACK_JUNK_INFO, + array("FLD" => $s_fld, + "JUNK" => implode(" ", + $a_matches) + ), + false); + return (true); + } + } + } + } + return (false); +} + +// +// Check for the duplicate data attack +// +function DetectDupAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // if any of the configured fields contain duplicate data, + // then this lame attack has been detected + // + + $a_data_map = array(); + foreach (Settings::get('ATTACK_DETECTION_DUPS') as $s_fld) { + if (isset($a_fields[$s_fld]) && + is_scalar($a_fields[$s_fld]) && // can only work with string data + !empty($a_fields[$s_fld]) + ) { + $s_data = (string)$a_fields[$s_fld]; + if (isset($a_data_map[$s_data])) { + // + // duplicate found! + // + $s_attack = "Duplicate Fields"; + $s_info = GetMessage(MSG_ATTACK_DUP_INFO, + array("FLD1" => $a_data_map[$s_data], + "FLD2" => $s_fld + ),false); + $s_user_info = GetMessage(MSG_USER_ATTACK_DUP,array(),false); + return (true); + } + $a_data_map[$s_data] = $s_fld; + } + } + return (false); +} + +// +// Check for the email addresses in specials attack +// +function DetectSpecialsAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // look for email addresses in whole fields + // + foreach (Settings::get('ATTACK_DETECTION_SPECIALS_ONLY_EMAIL') as $s_fld) { + if (isset($a_fields[$s_fld]) && + is_scalar($a_fields[$s_fld]) && // can only work with string data + !empty($a_fields[$s_fld]) + ) { + $s_data = $a_fields[$s_fld]; + if (preg_match("/^\b[-a-z0-9._%]+@[-.%_a-z0-9]+\.[a-z]{2,9}\b$/i", + $s_data) === 1 + ) { + // + // email address found in wrong field + // + $s_attack = "Special Fields Only"; + $s_info = GetMessage(MSG_ATTACK_SPEC_INFO, + array("FLD" => $s_fld),false); + return (true); + } + } + } + // + // look for email addresses in any part of fields + // + foreach (Settings::get('ATTACK_DETECTION_SPECIALS_ANY_EMAIL') as $s_fld) { + if (isset($a_fields[$s_fld]) && + is_scalar($a_fields[$s_fld]) && // can only work with string data + !empty($a_fields[$s_fld]) + ) { + $s_data = $a_fields[$s_fld]; + if (preg_match("/\b[-a-z0-9._%]+@[-.%_a-z0-9]+\.[a-z]{2,9}\b/i", + $s_data) > 0 + ) { + // + // email address found in wrong field + // + $s_attack = "Special Fields Any"; + $s_info = GetMessage(MSG_ATTACK_SPEC_INFO, + array("FLD" => $s_fld),false); + return (true); + } + } + } + return (false); +} + +// +// Check for "many URLs in a field" and "many fields with URLs" attacks +// +function DetectManyURLsAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // This suffix to patterns ensure that a domain name is not actually the name component + // of an email address. For example, 'ss.game@bigpond.com' would get incorrectly recognised as a URL + // without this additional pattern. + // + $s_not_email_name = '(?!@[a-z]+\.)'; + + $a_fld_names = array(); + // + // actual URL link patterns + // 21-Jul-18: We've removed looking for alphanumerics here because it doesn't + // detect non-English chars. The UTF-8 options for preg_match did not help. + // + $s_srch = '(\bhttps{0,1}:\/\/|<\s*a\s+href=)'; + + // + // now add configurable patterns + // + if (!Settings::isEmpty('ATTACK_DETECTION_URL_PATTERNS') && + is_array(Settings::get('ATTACK_DETECTION_URL_PATTERNS')) + ) { + // + // escape / characters and build up a string + // of alternate patterns + // + foreach (Settings::get('ATTACK_DETECTION_URL_PATTERNS') as $s_pat) { + if ($s_pat == "") { + continue; + } + $s_srch .= "|" . str_replace('/','\/',$s_pat) . $s_not_email_name; + } + } + if (Settings::get('SITE_DOMAIN')) { + if (strpos(Settings::get('SITE_DOMAIN'),'://') !== false) { + $a_url_parts = parse_url(Settings::get('SITE_DOMAIN')); + $own_domain = $a_url_parts['host']; + } else { + $own_domain = Settings::get('SITE_DOMAIN'); + } + $own_domain = str_ireplace('www.','',$own_domain); + } else { + $own_domain = ''; + } + foreach ($a_fields as $s_fld => $s_data) { + if (IsSpecialField($s_fld) || IsSpecialMultiField($s_fld)) + // + // skip special fields because some are supposed to + // have URLs in them + // + { + continue; + } + if (isset($s_data) && + is_scalar($s_data) && // can only work with string data + !empty($s_data) + ) { + $n_match = preg_match_all("/$s_srch/msi",$s_data,$a_matches); + if (!is_int($n_match)) { + $n_match = 0; + } + // allow links to SITE_DOMAIN + if ($own_domain) { + $n_site_match = preg_match('/\b' . $own_domain . '\b/msi',$s_data); + if (is_int($n_site_match) && $n_site_match > 0) { + $n_match -= $n_site_match; + } + } + /* + * debugging code.... + if ($n_match > 0) + echo "Pattern is '".htmlentities($s_srch)."' with '". + htmlentities($s_data)."' field '$s_fld', matched=$n_match
    "; + */ + if (Settings::get('ATTACK_DETECTION_MANY_URLS') > 0) { + if ($n_match >= Settings::get('ATTACK_DETECTION_MANY_URLS')) { + $s_attack = "Many URLS in a field"; + $s_info = GetMessage(MSG_ATTACK_MANYURL_INFO, + array("FLD" => $s_fld,"NUM" => ($n_match)),false); + $s_user_info = GetMessage(MSG_USER_ATTACK_MANY_URLS,array(),false); + return (true); + } + } + if ($n_match > 0) { + $a_fld_names[] = $s_fld; + } + } + } + if (Settings::get('ATTACK_DETECTION_MANY_URL_FIELDS') > 0) { + if (count($a_fld_names) >= Settings::get('ATTACK_DETECTION_MANY_URL_FIELDS')) { + $s_attack = "Many fields with URLs"; + $s_info = GetMessage(MSG_ATTACK_MANYFIELDS_INFO, + array("FLDS" => implode(",",$a_fld_names), + "NUM" => (count($a_fld_names)) + ),false); + $s_user_info = GetMessage(MSG_USER_ATTACK_MANY_URL_FIELDS,array(),false); + return (true); + } + } + return (false); +} + +function IsAjax() +{ + global $SPECIAL_VALUES,$aFormVars,$aGetVars; + + // + // this may be called too early to have SPECIAL_VALUES loaded, + // so we check the submitted form vars too. + // + if (isset($SPECIAL_VALUES) && $SPECIAL_VALUES["fmmode"] == "ajax") { + return (true); + } + if (isset($aFormVars["fmmode"])) { + return ($aFormVars["fmmode"] == "ajax"); + } + if (isset($aGetVars["fmmode"])) { + return ($aGetVars["fmmode"] == "ajax"); + } + return (false); +} + +// +// Detect annoying attacks and prevent them from sending spurious +// alert messages. +// +function DetectAttacks($a_fields) +{ + + $s_info = $s_attack = ""; + $b_attacked = false; + $s_user_info = ""; + if (Settings::get('ATTACK_DETECTION_MIME')) { + if (DetectMimeAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (!$b_attacked && !Settings::isEmpty('ATTACK_DETECTION_DUPS')) { + if (DetectDupAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (!$b_attacked && Settings::get('ATTACK_DETECTION_SPECIALS')) { + if (DetectSpecialsAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (!$b_attacked && (Settings::get('ATTACK_DETECTION_MANY_URLS') || + Settings::get('ATTACK_DETECTION_MANY_URL_FIELDS')) + ) { + if (DetectManyURLsAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (Settings::get('ATTACK_DETECTION_JUNK')) { + if (DetectJunkAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + + if (!$b_attacked && !Settings::isEmpty('ATTACK_DETECTION_REVERSE_CAPTCHA')) { + if (DetectRevCaptchaAttack(Settings::get('ATTACK_DETECTION_REVERSE_CAPTCHA'),$a_fields,$s_attack,$s_info, + $s_user_info) + ) { + $b_attacked = true; + } + } + if (function_exists('FMHookDetectAttacks')) { + if (FMHookDetectAttacks($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + + if ($b_attacked) { + if (function_exists('FMHookAttacked')) { + FMHookAttacked($s_attack); + } + if (Settings::get('ALERT_ON_ATTACK_DETECTION')) { + SendAlert(GetMessage(MSG_ATTACK_DETECTED, + array("ATTACK" => $s_attack, + "INFO" => $s_info, + )), + false); + } + if (!IsAjax() && Settings::get('ATTACK_DETECTION_URL') !== "") { + Redirect(Settings::get('ATTACK_DETECTION_URL'),GetMessage(MSG_FORM_ERROR)); + } else { + global $SERVER; + + CreatePage(GetMessage(MSG_ATTACK_PAGE,array("SERVER" => $SERVER,"USERINFO" => $s_user_info)), + GetMessage(MSG_FORM_ERROR)); + } + FormMailExit(); + } +} + +// +// Implement reverse captcha. At least two fields must be provided. +// At least one of the fields should have a non-empty value. +// +function DetectRevCaptchaAttack($a_revcap_spec,$a_form_data,&$s_attack,&$s_info,&$s_user_info) +{ + global $bReverseCaptchaCompleted; + + if (count($a_revcap_spec) < 2) { + SendAlert(GetMessage(MSG_REV_CAP)); + return (false); + } + // + // check the reverse captcha fields + // + $n_empty = $n_non_empty = 0; + $b_attacked = false; + $s_info = ""; + foreach ($a_revcap_spec as $s_fld_name => $s_value) { + if ($s_value === "") { + $n_empty++; + if (isset($a_form_data[$s_fld_name]) && + $a_form_data[$s_fld_name] !== "" + ) { + $b_attacked = true; + $s_info .= "\n" . GetMessage(MSG_ATTACK_REV_CAP_INFO, + array("FLD" => $s_fld_name, + "CONTENT" => $a_form_data[$s_fld_name] + ), + false); + } + } else { + $n_non_empty++; + if (!isset($a_form_data[$s_fld_name]) || + $a_form_data[$s_fld_name] !== $s_value + ) { + $b_attacked = true; + $s_info .= "\n" . GetMessage(MSG_ATTACK_REV_CAP_INFO, + array("FLD" => $s_fld_name, + "CONTENT" => + isset($a_form_data[$s_fld_name]) ? + $a_form_data[$s_fld_name] : + "" + ), + false); + } + } + } + // + // check that the rev captcha specification is correct: + // at least two fields, at least one empty + // and at least one non-empty + // + if ($n_empty + $n_non_empty < 2 || + $n_empty == 0 || $n_non_empty == 0 + ) { + SendAlert(GetMessage(MSG_REV_CAP)); + return (false); + } + if ($b_attacked) { + $s_attack = "Reverse Captcha"; + $s_user_info = GetMessage(MSG_USER_ATTACK_REV_CAP,array(),false); + } + $bReverseCaptchaCompleted = !$b_attacked; + FMDebug('RevCaptcha: ' . $s_info); + //FMDebug("RevCaptcha done: ".($bReverseCaptchaCompleted ? "success" : "failure")); + return ($b_attacked); +} + +// +// Check whether a form submission is allowed based on any Captcha provided +// +function CheckCaptchaSubmit() +{ + global $SPECIAL_VALUES,$reCaptchaProcessor; + + if ($SPECIAL_VALUES["imgverify"] !== "") { + // + // implement reCaptcha + // + if (isset($reCaptchaProcessor)) { + $s_error = ''; + if (!$reCaptchaProcessor->Check($SPECIAL_VALUES["imgverify"],$SPECIAL_VALUES,$s_error)) { + $s_error_mesg = GetMessage(MSG_RECAPTCHA_MATCH,array("ERR" => $s_error)); + UserError("recaptcha",$s_error_mesg,'',array('imgverify' => $s_error_mesg)); + } + } + // + // implement other CAPTCHA + // + else { + // + // VerifyImgString is from Tectite's simple verifyimg.php CAPTCHA + // turing_string is from Captcha Creator + // + if (!IsSetSession("VerifyImgString") && + !IsSetSession("turing_string") + ) { + ErrorWithIgnore("verify_failed",GetMessage(MSG_VERIFY_MISSING),false); + } + // + // the user's entry must match the value in the session; allow + // spaces in the user's input + // + if (IsSetSession("VerifyImgString")) { + if (strtoupper(str_replace(" ","",$SPECIAL_VALUES["imgverify"])) !== + strtoupper(GetSession("VerifyImgString")) + ) { + $s_error_mesg = GetMessage(MSG_VERIFY_MATCH); + UserError("img_verify",$s_error_mesg,'',array('imgverify' => $s_error_mesg)); + } + } else { + if (strtoupper(str_replace(" ","",$SPECIAL_VALUES["imgverify"])) !== + strtoupper(GetSession("turing_string")) + ) { + $s_error_mesg = GetMessage(MSG_VERIFY_MATCH); + UserError("img_verify",$s_error_mesg,'',array('imgverify' => $s_error_mesg)); + } + } + } + } +} + +/* + * Class: AutoResponder + * Description: + * Implements the auto responding feature of FormMail. + * The object must only be created after special fields have been + * processed. + */ + +class AutoResponder +{ + var $_bRequested; // true if requested by the form + var $_sTo; // to-address for auto response + var $_sSubject; // subject for auto response + + var $_iNone = 0; // must be zero - initializes iType and iCaptchaType + + var $_iCaptchaType; // type of CAPTCHA that's been successfully processed + var $_bCaptchaOK; // true if CAPTCHA processing is OK, otherwise false + + // + // values of _iCaptchaType + // + var $_iFull = 1; // full captcha + var $_iRev = 2; // reverse captcha + + var $_iType; // type of autoresponse (template or plain) + + // + // values of _iType + // + var $_iSendTemplate = 1; // send a template + var $_iSendPlain = 2; // send a plain file + + /* + * Method: AutoResponder ctor + * Parameters: void + * Returns: n/a + * Description: + * Constructs the object. + */ + function __construct() + { + global $SPECIAL_VALUES; + + $this->_bCaptchaOK = $this->_bRequested = false; + $this->_sTo = ""; + $this->_sSubject = ""; + $this->_iType = $this->_iNone; + $this->_iCaptchaType = $this->_iNone; + + // + // An autoreponse is sometimes optional in the sense the user + // can choose whether they want it. + // It can also be mandatory, and enforced by the form owner. + // Here are the rules: + // 1. If there is no return email address (email field), no autoresponse. + // In this case, if autoresponse has been requested by the form, send + // an alert message to the form owner, but otherwise ignore the problem + // (it's optional). + // 2. If no autoresponse has been requested by the form, skip. + // 3. If HTMLTemplate or PlainTemplate is set: + // 3a. If full CAPTCHA has been performed, send autoresponse. + // 3b If no full CAPTCHA has been performed, no autoresponse. + // 4. If HTMLTemplate and PlainTemplate are *not* set and either + // PlainFile or HTMLFile is set: + // 4a. If full CAPTCHA has been performed, send autoresponse. + // 4b. If Reverse CAPTCHA has been performed, send autoresponse. + // 4c. Otherwise, no autoresponse. + // 5. If full CAPTCHA is attempted but fails (e.g. wrong input), display + // error. + // + // The form owner can enforce autoresponse by making "email" required, + // and making "arverify" or "recaptcha_response_field" required (for templates) + // or by ensuring Reverse CAPTCHA is performed (for PlainFile or HTMLFile). + // + if (IsAROptionSet('HTMLTemplate') || + IsAROptionSet('PlainTemplate') + ) { + $this->_iType = $this->_iSendTemplate; + } + if (IsAROptionSet('PlainFile') || + IsAROptionSet('HTMLFile') + ) { + $this->_iType = $this->_iSendPlain; + } + if ($this->_iType) { + // + // the form has requested autoresponse.... + // we need an email address to send to + // + if (!isset($SPECIAL_VALUES["email"]) || empty($SPECIAL_VALUES["email"])) { + SendAlert(GetMessage(MSG_ARESP_EMAIL)); + } else { + $this->_bRequested = true; + $this->_sTo = $SPECIAL_VALUES["email"]; + if (IsAROptionSet('Subject')) { + $this->_sSubject = GetAROption('Subject'); + } else { + $this->_sSubject = GetMessage(MSG_ARESP_SUBJ,array(),false); + } + } + } + } + + /* + * Method: AutoResponder::IsRequested + * Parameters: void + * Returns: bool true if autoresponding has been requested + * Description: + * Determines if autoresponding has been requested by the HTML. + */ + function IsRequested() + { + return ($this->_bRequested); + } + + /* + * Method: AutoResponder::Process + * Parameters: $b_check_only if true, perform checks but do not send + * Returns: void + * Description: + * Processes the autorespond. + */ + function Process($b_check_only = false) + { + global $SPECIAL_VALUES; + + FMDebug("AutoResponder::Process: check=" . ($b_check_only ? "Y" : "N")); + if ($this->IsRequested()) { + FMDebug("AutoResponder::Process: requested"); + $b_done = false; + // + // You can create a function called SpecialAutoResponderProcess in a hook script. + // It gets passed the AutoResponder object and the $b_check_only flag. + // If the function returns true, then the standard process is not performed. + // Otherwise the standard process continues as-is. + // Your special function can call any of the public methods of this class including: + // StandarProcess + // Send + // + if (function_exists('SpecialAutoResponderProcess')) { + $b_done = SpecialAutoResponderProcess($this,$b_check_only); + } + if (!$b_done) { + $this->StandardProcess($b_check_only); + } + } + } + + function StandardProcess($b_check_only) + { + // + // verify CAPTCHA or that Reverse CAPTCHA has been completed + // (unless we've already done that) + // + $this->_CheckCaptcha(); + if (!$b_check_only && $this->_bCaptchaOK) { + FMDebug("AutoResponder::Process: proceeding, type=" . $this->_iType); + // + // for a template, full CAPTCHA must have been processed + // + if ($this->_iType == $this->_iSendTemplate) { + if ($this->_iCaptchaType == $this->_iFull) { + $this->Send(true); + } + } + // + // for a plain file, reverse CAPTCHA is sufficient, any CAPTCHA is OK + // + elseif ($this->_iType == $this->_iSendPlain) { + if ($this->_iCaptchaType) { + $this->Send(false); + } + } + } + } + + /* + * Method: AutoResponder::_CheckCaptcha + * Parameters: void + * Returns: void + * Description: + * Checks the type of CAPTCHA that has been processed. + * This method should only be called if autoresponse has been requested + * by the form (i.e. IsRequested returns true). + */ + function _CheckCaptcha() + { + global $SPECIAL_VALUES,$bReverseCaptchaCompleted; + global $reCaptchaProcessor; + + // + // only check for CAPTCHA once + // + if (!$this->_iCaptchaType) { + // + // check for full CAPTCHA attempt + // first, check for reCaptcha + // + if (isset($reCaptchaProcessor) && $SPECIAL_VALUES["arverify"] !== "") { + $this->_iCaptchaType = $this->_iFull; + $s_error = ''; + if ($reCaptchaProcessor->Check($SPECIAL_VALUES["arverify"],$SPECIAL_VALUES,$s_error)) { + $this->_bCaptchaOK = true; + } else { + $this->_bCaptchaOK = false; + // + // report the error + // + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_RECAPTCHA,array("ERR" => $s_error),false)); + UserError("recaptcha",GetMessage(MSG_RECAPTCHA_MATCH,array("ERR" => $s_error))); + } + } + // + // now check for our verifyimg or Captcha Creator + // + elseif ($SPECIAL_VALUES["arverify"] !== "") { + // + // allow spaces in the user's input, except for reCaptcha + // + $s_arverify = str_replace(" ","",$SPECIAL_VALUES["arverify"]); + $this->_iCaptchaType = $this->_iFull; + // + // full CAPTCHA has been attempted + // VerifyImgString is from Tectite's simple verifyimg.php CAPTCHA. + // turing_string is from Captcha Creator + // + if (IsSetSession("VerifyImgString") || IsSetSession("turing_string")) { + $b_match = false; + // + // the user's entry must match the value in the session + // + if (IsSetSession("VerifyImgString")) { + if (strtoupper($s_arverify) === strtoupper(GetSession("VerifyImgString"))) { + $b_match = true; + } + } else { + if (strtoupper($s_arverify) === strtoupper(GetSession("turing_string"))) { + $b_match = true; + } + } + if ($b_match) { + $this->_bCaptchaOK = true; + } else { + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_NO_MATCH,array(),false)); + UserError("ar_verify",GetMessage(MSG_ARESP_NO_MATCH)); + } + } else { + // + // ...and it has failed because there's no session data + // + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_NO_VERIMG,array(),false)); + ErrorWithIgnore("verify_failed",GetMessage(MSG_ARESP_NO_AUTH),true); + } + } elseif (Settings::get('ENABLE_ATTACK_DETECTION') && + !Settings::isEmpty('ATTACK_DETECTION_REVERSE_CAPTCHA') + ) { + // + // Reverse CAPTCHA has been configured + // + $this->_iCaptchaType = $this->_iRev; + $this->_bCaptchaOK = $bReverseCaptchaCompleted; + } + } + } + + /* + * Method: AutoResponder::_Send + * Parameters: $b_use_template if true, allow template, otherwise file + * Returns: void + * Description: + * Sends an autoreponse using a template. + */ + function Send($b_use_template) + { + global $SPECIAL_VALUES; + // + // declare some global vars for the hook system calls below + // + global $aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues,$aFileVars; + + FMDebug("Sending auto response: " . ($b_use_template ? "template" : "plain")); + + // + // Hook system: before sending auto response + // + if (($incFile = hookFileExists("fmhookprearesp.inc")) !== false) { + @include($incFile); + } + if (!$this->_SendEmail($this->_sTo,$this->_sSubject,$aRawDataValues,$b_use_template)) { + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_FAILED,array(),false)); + SendAlert(GetMessage(MSG_ARESP_FAILED)); + } else { + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_OK,array(),false)); + // + // Hook system: after sending auto response + // + if (($incFile = hookFileExists("fmhookpostaresp.inc")) !== false) { + @include($incFile); + } + } + } + + /* + * Method: AutoResponder::_SendEmail + * Parameters: $s_to the email address to send to + * $s_subj the subject line + * $a_values field values to access + * $b_use_template if true, use a template, otherwise plain file + * Returns: bool true on success, otherwise false + * Description: + * Sends an autoresponse email to the user. + */ + function _SendEmail($s_to,$s_subj,$a_values,$b_use_template) + { + global $ValidEmails; + + $a_headers = array(); + $s_mail_text = ""; + $s_from_addr = GetAROption("FromAddr"); + + if (isset($s_from_addr)) { + $s_from_addr = UnMangle($s_from_addr); + if (!$ValidEmails->CheckAddress($s_from_addr)) { + SendAlert(GetMessage(MSG_INVALID_SENDER, + array("LOC" => "FromAddr in autorespond","EMAIL" => $s_from_addr))); + unset($s_from_addr); + } + } + if (!isset($s_from_addr)) { + $s_from_addr = ""; + if (!Settings::isEmpty('FROM_USER')) { + if (Settings::get('FROM_USER') != "NONE") { + $s_from_addr = Settings::get('FROM_USER'); + } + } else { + global $SERVER; + + $s_from_addr = "FormMail@" . $SERVER; + } + } + + if (!empty($s_from_addr)) { + $s_from_name = GetAROption('FromName'); + $a_headers['From'] = MakeFromLine($s_from_addr,$s_from_name); + } + if (Settings::get('FIXED_SENDER') !== "") { + $s_sender = Settings::get('FIXED_SENDER'); + } else { + $s_sender = $s_from_addr; + } + $s_type = ""; + if ($b_use_template) { + if (IsAROptionSet('PlainTemplate')) { + $s_type .= "PlainTemplate "; + $s_template = GetAROption("PlainTemplate"); + if (!ProcessTemplate($s_template,$a_lines,$a_values, + GetAROption('TemplateMissing'), + 'SubstituteValuePlain') + ) { + return (false); + } + FMDebug("AutoRespond: PlainTemplate " . count($a_lines) . " lines"); + $s_mail_text = implode(Settings::get('BODY_LF'),$a_lines); + } + if (IsAROptionSet("HTMLTemplate")) { + $s_type .= "HTMLTemplate "; + if (!MakeMimeMail($s_mail_text,$a_headers,$a_values, + GetAROption("HTMLTemplate"), + GetAROption('TemplateMissing')) + ) { + return (false); + } + FMDebug("AutoRespond: HTMLTemplate " . strlen($s_mail_text) . " bytes"); + } + } else { + + if (IsAROptionSet('PlainFile')) { + $s_type .= "PlainFile "; + // + // load the plain text file from the templates area + // + if (Settings::isEmpty('TEMPLATEDIR') && Settings::isEmpty('TEMPLATEURL')) { + SendAlert(GetMessage(MSG_TEMPLATES)); + return (false); + } + $s_file = GetAROption("PlainFile"); + if (($a_lines = LoadTemplate($s_file,Settings::get('TEMPLATEDIR'),Settings::get('TEMPLATEURL'), + true)) === false + ) { + return (false); + } + $s_mail_text = implode(Settings::get('BODY_LF'),$a_lines); + FMDebug("AutoRespond: PlainFile " . count($a_lines) . " lines"); + } + if (IsAROptionSet("HTMLFile")) { + $s_type .= "HTMLFile "; + if (!MakeMimeMail($s_mail_text,$a_headers,$a_values, + GetAROption("HTMLFile"),"", + false,"",array(),array(),false) + ) { + return (false); + } + FMDebug("AutoRespond: HTMLTemplate " . strlen($s_mail_text) . " bytes"); + } + } + if (strlen($s_mail_text) == 0) { + SendAlert(GetMessage(MSG_ARESP_EMPTY),array("TYPE" => $s_type)); + } + FMDebug("AutoRespond: message is " . strlen($s_mail_text) . " bytes"); + return (SendCheckedMail($s_to,$s_subj,$s_mail_text,$s_sender,$a_headers)); + } +} + +/* + * Class: SessionAccess + * Description: + * Implements access to the general PHP session. + * This provides a secure way of copy data to and from the + * user's PHP session. + */ + +class SessionAccess +{ + var $_aAccessList; + + /* + * Method: SessionAccess ctor + * Parameters: $a_access_list list of variables that can be accessed + * Returns: n/a + * Description: + * Constructs the object. + */ + function __construct($a_access_list) + { + $this->_aAccessList = $a_access_list; + } + + /* + * Method: SessionAccess::CopyIn + * Parameters: $a_vars reference to an array of values (keyed on name) + * $b_overwrite_empty if true, the session value will overwrite + * an empty array variable + * Returns: int number of values copied + * Description: + * Copies in the list of variables from the session to the given array. + */ + function CopyIn(&$a_vars,$b_overwrite_empty) + { + //$s_db = "Session CopyIn:\n"; + $n_copied = 0; + foreach ($this->_aAccessList as $s_var_name) { + if (IsSetSession($s_var_name)) { + if (!isset($a_vars[$s_var_name]) || + ($b_overwrite_empty && + FieldManager::IsEmpty($a_vars[$s_var_name])) + ) { + $a_vars[$s_var_name] = GetSession($s_var_name); + //$s_db .= "$s_var_name='".$a_vars[$s_var_name]."'\n"; + $n_copied++; + } + } + } + //SendAlert($s_db); + return ($n_copied); + } + + /* + * Method: SessionAccess::CopyOut + * Parameters: $a_vars reference to an array of values (keyed on name) + * $a_fields an array of fields to copy + * Returns: int number of values copied + * Description: + * Copies the variables from the given array into the session. + * The list of fields to copy is specified in _aAccessList. + * If $a_fields is provided, it contains a list of fields to copy, which + * limits the fields selected from _aAccessList, otherwise all fields + * listed in _aAccessList are copied. + */ + function CopyOut($a_vars,$a_fields = array()) + { + //$s_db = "Session CopyOut:\n"; + + $n_copied = 0; + foreach ($this->_aAccessList as $s_var_name) { + if (isset($a_vars[$s_var_name])) { + if (empty($a_fields) || in_array($s_var_name,$a_fields)) { + SetSession($s_var_name,$a_vars[$s_var_name]); + //$s_db .= "$s_var_name='".GetSession($s_var_name)."'\n"; + $n_copied++; + } + } + } + //SendAlert($s_db); + return ($n_copied); + } +} + +$SessionAccessor = new SessionAccess(Settings::get('SESSION_ACCESS')); + +$bAdvTemplates = false; +if (Settings::get('ADVANCED_TEMPLATES') && ( + !Settings::isEmpty('TEMPLATEDIR') + || !Settings::isEmpty('TEMPLATEURL') + || !Settings::isEmpty('MULTIFORMDIR') + || !Settings::isEmpty('MULTIFORMURL') + )) { + $bAdvTemplates = true; +} + +// +// Hook system: after configuring Advanced Templates +// +if (($incFile = hookFileExists("fmhookpostadvtemplates.inc")) !== false) { + @include($incFile); +} + +// +// Hook system: before return check and processing +// +if (($incFile = hookFileExists("fmhookprereturnform.inc")) !== false) { + @include($incFile); +} + +if (isset($aGetVars["return"]) && is_numeric($aGetVars["return"])) { + // + // if advanced templates are in use, we will need them for + // performing a multi-page form return + // + if ($bAdvTemplates) { + $FMCTEMPLATE_PROC = true; + if (!include_once("$MODULEDIR/$FMCOMPUTE")) { + Error("load_fmcompute", + GetMessage(MSG_LOAD_FMCOMPUTE, + array("FILE" => "$MODULEDIR/$FMCOMPUTE", + "ERROR" => $php_errormsg + )), + false, + false); + } + } + MultiFormReturn($aGetVars["return"]); + // + // Hook system: after multi-page return to form output + // + if (($incFile = hookFileExists("fmhookpostreturnform.inc")) !== false) { + @include($incFile); + } + FormMailExit(); +} + +// +// Hook system: after initialization +// +if (($incFile = hookFileExists("fmhookpostinit.inc")) !== false) { + @include($incFile); +} + +$ExecEnv->checkUploadSize(); +$ExecEnv->checkFileUploadSize($aFileVars); +// +// check configuration values for potential security problems +// +CheckConfig(); + +// +// otherwise, do the real processing of FormMail +// +$aStrippedFormVars = $aAllRawValues = StripGPCArray($aFormVars); + +if (Settings::get('ENABLE_ATTACK_DETECTION')) { + DetectAttacks($aAllRawValues); +} + +// +// Copy in configured session variables, overwriting any +// fields that are empty. +// +$SessionAccessor->CopyIn($aAllRawValues,true); +$SessionAccessor->CopyIn($aStrippedFormVars,true); + +// +// process the options +// +ProcessMailOptions($aAllRawValues); +ProcessCRMOptions($aAllRawValues); +ProcessAROptions($aAllRawValues); +ProcessFilterOptions($aAllRawValues); + +// +// create any derived fields +// NOTE: it's important that derivation occurs before cleaned values +// are created. If derivation occurred after cleaning or it created +// fields that were assumed to be clean, then an attack could create +// forged email headers using derive_fields. The code is safe with +// the logic sequence below. +// +$aAllRawValues = CreateDerived($aAllRawValues); + +list($aFieldOrder,$aCleanedValues,$aRawDataValues) = ParseInput($aAllRawValues); + +FilterFiles($aFileVars); + +// +// if we're processing multi-forms, then merge in the raw data from previous +// forms unless this is the first page of the form sequence +// +if (IsSetSession("FormList") && $SPECIAL_VALUES["multi_start"] != 1) { + list($aFieldOrder,$aCleanedValues, + $aRawDataValues,$aAllRawValues,$aFileVars) = GetMultiValues( + GetSession("FormList"), + GetSession("FormIndex"), + $aFieldOrder,$aCleanedValues, + $aRawDataValues,$aAllRawValues, + $aFileVars); +} + +if ($SPECIAL_VALUES["file_names"] !== "") { + list($aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues,$aFileVars) = + SetFileNames($SPECIAL_VALUES["file_names"],$aFieldOrder, + $aCleanedValues,$aRawDataValues,$aAllRawValues,$aFileVars); +} + +// +// Hook system: after loading and processing data +// +if (($incFile = hookFileExists("fmhookload.inc")) !== false) { + @include($incFile); +} + +if (Settings::get('FORM_INI_FILE') !== "") { + ProcessFormIniFile(Settings::get('FORM_INI_FILE')); + // + // Hook system: after processing INI file + // + if (($incFile = hookFileExists("fmhookinifile.inc")) !== false) { + @include($incFile); + } +} + +$bDoneSomething = false; +if (Settings::get('DB_SEE_INPUT')) { + /*** + * echo "
    ";
    +	 * print_r($aFormVars);
    +	 * print_r($aServerVars);
    +	 * echo "
    "; + * exit; + ****/ + CreatePage(implode("\n",$FORMATTED_INPUT),"Debug Output - Fields Submitted"); + ZapSession(); + FormMailExit(); +} + +if (!empty($SPECIAL_VALUES["fmcompute"]) || $bAdvTemplates) { + $FM_UserErrors = array(); + // + // Generalized interface between FMCompute and FormMail functions + // + /** @noinspection PhpUnused */ + function FM_CallFunction($s_func,$a_params,&$m_return, + &$s_mesg,&$a_debug,&$a_alerts) + { + switch ($s_func) { + case "FMFatalError": + SendComputeAlerts(); + if (count($a_params) < 3) { + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + Error("fmcompute_error",$a_params[0],$a_params[1],$a_params[2]); + } + break; + + case "FMFatalUserError": + SendComputeAlerts(); + if (count($a_params) < 1) { + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + UserError("fmcompute_usererror",$a_params[0]); + } + break; + + case "FMUserError": + if (count($a_params) < 1) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + global $FM_UserErrors; + + $FM_UserErrors[] = $a_params[0]; + } + break; + + case "FMSaveAllFilesToRepository": + if (count($a_params) != 0) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + $m_return = SaveAllFilesToRepository(); + } + break; + + case "FMDeleteFileFromRepository": + if (count($a_params) != 1) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + $m_return = DeleteFileFromRepository($a_params[0]); + } + break; + + case "FMNextNum": + if (count($a_params) != 2) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + $i_pad = $a_params[0]; + $i_base = $a_params[1]; + if ($i_base < 2 || $i_base > 36) { + Error("fmcompute_call",GetMessage(MSG_CALL_INVALID_PARAM, + array("FUNC" => $s_func, + "PARAM" => 2, + "CORRECT" => 2. . .36 + )), + false,false); + } + $m_return = GetNextNum($i_pad,$i_base); + } + break; + + default: + $s_mesg = GetMessage(MSG_CALL_UNK_FUNC,array("FUNC" => $s_func)); + return (false); + } + return (true); + } + + // + // register useful FormMail functions with FMCompute module + // + function RegisterFormMailFunctions($fmc) + { + // + // Allows the user to call "Error" from within a computation + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","void", + "FMFatalError", + array("string","bool","bool"), + "FM_CallFunction")) !== true + ) { + Error("fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMFatalError", + "ERROR" => $s_msg + )), + false,false); + } + // + // Allows the user to call "UserError" from within a computation + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","void", + "FMFatalUserError", + array("string"), + "FM_CallFunction")) !== true + ) { + Error("fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMFatalUserError", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Allows the user to record an error to be displayed + // from within a computation. + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","void", + "FMUserError", + array("string"), + "FM_CallFunction")) !== true + ) { + Error("fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMUserError", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Saves files to the repository. + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","bool", + "FMSaveAllFilesToRepository", + array(), + "FM_CallFunction")) !== true + ) { + Error("fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMSaveAllFilesToRepository", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Delete a file from the repository. + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","bool", + "FMDeleteFileFromRepository", + array("string"), + "FM_CallFunction")) !== true + ) { + Error("fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMDeleteFileFromRepository", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Generate a Next Number + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","string", + "FMNextNum", + array("int","int"), + "FM_CallFunction")) !== true + ) { + Error("fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMNextNum", + "ERROR" => $s_msg + )), + false,false); + } + } + + // + // load the fmcompute module + // + if (!empty($SPECIAL_VALUES["fmcompute"])) { + $FMCOMPUTE_CLASS = true; + $FMCOMPUTE_NODEBUG = true; + } + if ($bAdvTemplates) { + $FMCTEMPLATE_PROC = true; + } + if (!include_once("$MODULEDIR/$FMCOMPUTE")) { + Error("load_fmcompute", + GetMessage(MSG_LOAD_FMCOMPUTE, + array("FILE" => "$MODULEDIR/$FMCOMPUTE", + "ERROR" => $php_errormsg + )), + false,false); + } + if (!empty($SPECIAL_VALUES["fmcompute"])) { + /** @noinspection PhpUndefinedVariableInspection */ + RegisterFormMailFunctions($FMCalc); + + // + // if GeoIP support is specified, load that module now + // + if (!Settings::isEmpty('GEOIP_LIC')) { + $FMMODULE_LOAD = true; // signal module load + if (!include_once("$MODULEDIR/$FMGEOIP")) { + Error("load_module", + GetMessage(MSG_LOAD_MODULE, + array("FILE" => "$MODULEDIR/$FMGEOIP", + "ERROR" => $php_errormsg + )), + false,false); + } + // + // load the license and register the module + // + /** @noinspection PhpUndefinedClassInspection */ + $GeoIP = new FMGeoIP(Settings::get('GEOIP_LIC')); + /** @noinspection PhpUndefinedMethodInspection */ + if (!$GeoIP->RegisterModule($FMCalc)) { + /** @noinspection PhpUndefinedMethodInspection */ + Error("reg_module", + GetMessage(MSG_REGISTER_MODULE, + array("NAME" => "FMGeoIP", + "ERROR" => $GeoIP->GetError() + )), + false,false); + } + } + } +} + +if (isset($SPECIAL_VALUES["multi_go_back"]) && !empty($SPECIAL_VALUES["multi_go_back"])) { + if (!IsSetSession("FormList") || GetSession("FormIndex") == 0) { + ErrorWithIgnore("go_back",GetMessage(MSG_GO_BACK),false,false); + } + MultiKeep(); // store any "multi_keep" data just submitted + // + // save back to the session any variables that have been specified in + // multi_keep + // + if (isset($SPECIAL_VALUES["multi_keep"]) && !empty($SPECIAL_VALUES["multi_keep"])) { + $SessionAccessor->CopyOut($aAllRawValues,$SPECIAL_VALUES["multi_keep"]); + } + MultiFormReturn(GetSession("FormIndex") - 1); + // echo "Form index = ".GetSession("FormIndex"); + // + // Hook system: after multi-page return to form output + // + if (($incFile = hookFileExists("fmhookpostreturnform.inc")) !== false) { + @include($incFile); + } + FormMailExit(); +} + +// +// This is the check for spiders; I can't imagine a spider will +// ever use the POST method. +// +if ($bIsGetMethod && count($aFormVars) == 0) { + if (!Settings::get('ALLOW_GET_METHOD') && $bHasGetData) { + CreatePage(GetMessage(MSG_GET_DISALLOWED),GetMessage(MSG_FORM_ERROR)); + } else { + CreatePage(GetMessage(MSG_NO_DATA_PAGE),GetMessage(MSG_FORM_ERROR)); + } + ZapSession(); + FormMailExit(); +} + +// +// Hook system: before performing required and conditions etc. +// +if (($incFile = hookFileExists("fmhookprechecks.inc")) !== false) { + @include($incFile); +} + +// +// check for required fields +// +if (!CheckRequired($SPECIAL_VALUES["required"],$aAllRawValues,$sMissing,$aMissingList)) { + UserError("missing_fields",GetMessage(MSG_REQD_ERROR),$sMissing,$aMissingList); +} + +// +// check complex conditions +// +$fmConditions = new Conditions($SPECIAL_VALUES["conditions"],$sMissing,$aMissingList); +if (!$fmConditions->Check($aAllRawValues,$aFileVars)) { + UserError("failed_conditions",GetMessage(MSG_COND_ERROR),$sMissing,$aMissingList); +} + +// +// check CAPTCHA +// +CheckCaptchaSubmit(); + +// +// Hook system: after performing required and conditions etc. +// +if (($incFile = hookFileExists("fmhookchecks.inc")) !== false) { + @include($incFile); +} + +if (!empty($SPECIAL_VALUES["fmmodules"])) { + $aModuleList = TrimArray(explode(",",$SPECIAL_VALUES["fmmodules"])); + $FMMODULE_LOAD = true; // signal module load + foreach ($aModuleList as $sModule) { + if (!include_once("$MODULEDIR/$sModule")) { + Error("load_module", + GetMessage(MSG_LOAD_MODULE, + array("FILE" => "$MODULEDIR/$sModule", + "ERROR" => $php_errormsg + )), + false,false); + } + } +} + +if (!empty($SPECIAL_VALUES["fmcompute"])) { + // + // Callback function for preg_replace_callback to add line + // numbers on each match + // + function AddLineNumbersCallback($a_matches) + { + global $iAddLineNumbersCounter; + + return (sprintf("%d:",++$iAddLineNumbersCounter) . $a_matches[0]); + } + + // + // Add line numbers to some code + // + function AddLineNumbers($s_code) + { + global $iAddLineNumbersCounter; + + $iAddLineNumbersCounter = 0; + return (preg_replace_callback('/^/m','AddLineNumbersCallback',$s_code)); + } + + // + // Load some more code into FMCalc + // + function Load($s_code) + { + global $FMCalc; + + $a_mesgs = array(); + // echo "Loading '$s_code'"; + if ($FMCalc->Parse($s_code,$a_mesgs) === false) { + $s_msgs = ""; + foreach ($a_mesgs as $a_msg) { + $s_msgs .= "Line " . $a_msg["LINE"]; + $s_msgs .= ", position " . $a_msg["CHAR"] . ": "; + $s_msgs .= $a_msg["MSG"] . "\n"; + } + Error("fmcompute_parse", + GetMessage(MSG_COMP_PARSE, + array("CODE" => AddLineNumbers($s_code), + "ERRORS" => $s_msgs + )), + false, + false); + } + } + + // + // Send any alerts found in FMCalc + // + function SendComputeAlerts() + { + global $FMCalc; + + $a_alerts = $FMCalc->GetAlerts(); + if (count($a_alerts) > 0) { + SendAlert(GetMessage(MSG_COMP_ALERT, + array("ALERTS" => implode("\n",StripHTML($a_alerts))))); + } + $a_debug = $FMCalc->GetDebug(); + if (count($a_debug) > 0) { + SendAlert(GetMessage(MSG_COMP_DEBUG, + array("DEBUG" => implode("\n",StripHTML($a_debug))))); + } + } + + // + // Perform the computations in FMCalc + // + function Compute(&$a_field_order,&$a_cleaned_values,&$a_raw_data_values, + &$a_values) + { + global $FMCalc,$FM_UserErrors; + + $a_mesgs = array(); + $FM_UserErrors = array(); + if (($a_flds = $FMCalc->Execute($a_mesgs)) !== false) { + SendComputeAlerts(); + foreach ($a_flds as $s_name => $s_value) { + $a_values[$s_name] = $s_value; + ProcessField($s_name,$s_value,$a_field_order, + $a_cleaned_values,$a_raw_data_values); + } + if (count($FM_UserErrors) > 0) { + UserError("fmcompute_usererrors",GetMessage(MSG_USER_ERRORS), + "",$FM_UserErrors); + } + } else { + SendComputeAlerts(); + Error("fmcompute_exec",GetMessage(MSG_COMP_EXEC, + array("ERRORS" => implode("\n",$a_mesgs))),false,false); + } + } + + // + // Register all fields; a future improvement should use a call-back + // function so as not to copy all the data into the FMCompute object + // + function RegisterData($a_form_data,$a_file_vars) + { + global $FMCalc; + + foreach ($a_form_data as $s_name => $s_value) { + if (isset($s_name) && isset($s_value)) { + if (($s_msg = $FMCalc->RegisterExternalData("PHP","string", + $s_name,"c",$s_value)) !== true + ) { + Error("fmcompute_regdata",GetMessage(MSG_COMP_REG_DATA, + array("NAME" => $s_name,"ERROR" => $s_msg)),false,false); + } + } + } + + foreach ($a_file_vars as $s_fld_name => $a_file_spec) { + if (FieldManager::IsUploadedFile($a_file_spec)) { + if (isset($a_file_spec["new_name"])) { + // + // we ignore errors here, because name_of_ field often already + // exists from the above loop + // + $FMCalc->RegisterExternalData("PHP","string", + "name_of_" . $s_fld_name,"c",$a_file_spec["new_name"]); + } + $s_value = $a_file_spec["name"]; + } else { + $s_value = ""; + } + if (($s_msg = $FMCalc->RegisterExternalData("PHP","string", + $s_fld_name,"c",$s_value)) !== true + ) { + Error("fmcompute_regdata",GetMessage(MSG_COMP_REG_DATA, + array("NAME" => $s_fld_name,"ERROR" => $s_msg)),false,false); + } + } + } + + /* + * Function: MergeFileArrays + * Parameters: $a_new_files the list of files just submitted by the form + * $a_saved_files the list of files that have been previously saved (can be NULL) + * Returns: array a merged array + * Description: + * Intelligently merges two arrays of file definitions. + * If a file has been newly uploaded, its definition takes precedence. + */ + function MergeFileArrays($a_new_files,$a_saved_files) + { + if (isset($a_saved_files)) { + foreach ($a_saved_files as $s_key => $a_def) { + if (isset($a_new_files[$s_key])) { + if (!FieldManager::IsUploadedFile($a_new_files[$s_key])) { + $a_new_files[$s_key] = $a_def; + } + } else { + $a_new_files[$s_key] = $a_def; + } + } + } + return ($a_new_files); + } + + RegisterData($aAllRawValues,MergeFileArrays($aFileVars,IsSetSession("FormSavedFiles") ? + GetSession("FormSavedFiles") : array())); + // + // parse all fmcompute fields + // + if (is_array($SPECIAL_VALUES["fmcompute"])) { + $nCompute = count($SPECIAL_VALUES["fmcompute"]); + for ($iCompute = 0 ; $iCompute < $nCompute ; $iCompute++) { + Load($SPECIAL_VALUES["fmcompute"][$iCompute]); + } + } else { + Load($SPECIAL_VALUES["fmcompute"]); + } + + // + // run computations + // + Compute($aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues); + // + // Hook system: after computations + // + if (($incFile = hookFileExists("fmhookcompute.inc")) !== false) { + @include($incFile); + } +} + +$bGotGoBack = $bGotNextForm = $bGotGoodTemplate = $bGotGoodUrl = false; +if (isset($SPECIAL_VALUES["good_url"]) && + !empty($SPECIAL_VALUES["good_url"]) +) { + $bGotGoodUrl = true; +} + +if (isset($SPECIAL_VALUES["good_template"]) && + !empty($SPECIAL_VALUES["good_template"]) +) { + $bGotGoodTemplate = true; +} + +if (isset($SPECIAL_VALUES["next_form"]) && + !empty($SPECIAL_VALUES["next_form"]) +) { + $bGotNextForm = true; +} + +if (isset($SPECIAL_VALUES["multi_go_back"]) && + !empty($SPECIAL_VALUES["multi_go_back"]) +) { + $bGotGoBack = true; +} + +// +// it's not valid to specify "next_form" as well as "good_url" or +// "good_template"; this is because it's ambiguous - do we go to the +// next form or the final 'thank you' page? +// +if ($bGotNextForm && ($bGotGoodTemplate || $bGotGoodUrl)) { + ErrorWithIgnore("next_plus_good",GetMessage(MSG_NEXT_PLUS_GOOD,array("WHICH" => + ($bGotGoodUrl ? "good_url" : + "good_template") + )), false,false); +} + +MultiFormLogic(); + +// +// Hook system: after multi-page form logic +// +if (($incFile = hookFileExists("fmhookmulti.inc")) !== false) { + @include($incFile); +} + +// +// write to the CSV database +// +if (!Settings::isEmpty('CSVDIR') && isset($SPECIAL_VALUES["csvfile"]) && + !empty($SPECIAL_VALUES["csvfile"]) +) { + // + // Hook system: before writing CSV file + // + if (($incFile = hookFileExists("fmhookprecsv.inc")) !== false) { + @include($incFile); + } + WriteCSVFile(Settings::get('CSVDIR') . "/" . basename($SPECIAL_VALUES["csvfile"]),$aAllRawValues); + // + // Hook system: after writing CSV file + // + if (($incFile = hookFileExists("fmhookpostcsv.inc")) !== false) { + @include($incFile); + } + $bDoneSomething = true; +} + +// +// write to the log file +// +if (!Settings::isEmpty('LOGDIR') && isset($SPECIAL_VALUES["logfile"]) && !empty($SPECIAL_VALUES["logfile"])) { + // + // Hook system: before writing log file + // + if (($incFile = hookFileExists("fmhookprelog.inc")) !== false) { + @include($incFile); + } + WriteLog(Settings::get('LOGDIR') . "/" . basename($SPECIAL_VALUES["logfile"])); + // + // Hook system: after writing log file + // + if (($incFile = hookFileExists("fmhookpostlog.inc")) !== false) { + @include($incFile); + } + $bDoneSomething = true; +} + +// +// send to the CRM +// +if (isset($SPECIAL_VALUES["crm_url"]) && isset($SPECIAL_VALUES["crm_spec"]) && + !empty($SPECIAL_VALUES["crm_url"]) && !empty($SPECIAL_VALUES["crm_spec"]) +) { + $sCRM = GetCRMURL($SPECIAL_VALUES["crm_spec"],$aAllRawValues,$SPECIAL_VALUES["crm_url"]); + if (!empty($sCRM)) { + $aCRMReturnData = array(); + // + // Hook system: before sending to CRM + // + if (($incFile = hookFileExists("fmhookprecrm.inc")) !== false) { + @include($incFile); + } + if (!SendToCRM($sCRM,$aCRMReturnData)) { + // + // CRM interface failed, check if the form wants an error + // displayed + // + if (IsCRMOptionSet("ErrorOnFail")) { + Error("crm_failed",GetMessage(MSG_CRM_FAILURE, + array("URL" => $sCRM, + "DATA" => GetObjectAsString($aCRMReturnData) + )), + false,false); + } + } else + // + // append the returned data to the raw data values of the form + // + { + $aRawDataValues = array_merge($aRawDataValues,$aCRMReturnData); + } + // + // Hook system: after sending to CRM + // + if (($incFile = hookFileExists("fmhookpostcrm.inc")) !== false) { + @include($incFile); + } + $bDoneSomething = true; + } +} + +// +// Check obsolete SendMailFOption +// +if (IsMailOptionSet("SendMailFOption")) { + SendAlert(GetMessage(MSG_FOPTION_WARN,array("LINE" => Settings::get('SENDMAIL_F_OPTION_LINE'))), + false,true); +} + +$AutoResp = new AutoResponder(); +// +// check for autoresponse problems +// +$AutoResp->Process(true); + +// +// Hook system: before completion +// +if (($incFile = hookFileExists("fmhookprecomplete.inc")) !== false) { + @include($incFile); +} + +// +// send email +// +if (!isset($SPECIAL_VALUES["recipients"]) || empty($SPECIAL_VALUES["recipients"])) { + // + // No recipients - don't email anyone... + // If nothing has been done above (CSV, logging, or CRM), + // then report an error. + // + if (!$bDoneSomething) { + if (!$bGotGoBack && !$bGotNextForm) { + ErrorWithIgnore("no_recipients",GetMessage(MSG_NO_ACTIONS)); + } + } +} else { + // + // Hook system: before sending emails + // + if (($incFile = hookFileExists("fmhookpreemail.inc")) !== false) { + @include($incFile); + } + $s_invalid = $s_invalid_cc = $s_invalid_bcc = ""; + if (!CheckEmailAddress($SPECIAL_VALUES["recipients"],$s_valid_recipients,$s_invalid)) { + ErrorWithIgnore("no_valid_recipients",GetMessage(MSG_NO_RECIP)); + } else { + $s_valid_cc = $s_valid_bcc = ""; + + // + // check CC and BCC addresses + // + if (isset($SPECIAL_VALUES["cc"]) && !empty($SPECIAL_VALUES["cc"])) { + CheckEmailAddress($SPECIAL_VALUES["cc"],$s_valid_cc,$s_invalid_cc); + } + if (isset($SPECIAL_VALUES["bcc"]) && !empty($SPECIAL_VALUES["bcc"])) { + CheckEmailAddress($SPECIAL_VALUES["bcc"],$s_valid_bcc,$s_invalid_bcc); + } + + // + // send an alert for invalid addresses + // + $s_error = ""; + if (!empty($s_invalid)) { + $s_error .= "recipients: $s_invalid\r\n"; + } + if (!empty($s_invalid_cc)) { + $s_error .= "cc: $s_invalid_cc\r\n"; + } + if (!empty($s_invalid_bcc)) { + $s_error .= "bcc: $s_invalid_bcc\r\n"; + } + if (!empty($s_error)) { + SendAlert(GetMessage(MSG_INV_EMAIL,array("ERRORS" => $s_error))); + } + + // + // send the actual results + // + if (!SendResults($aFieldOrder,$aCleanedValues,$s_valid_recipients,$s_valid_cc, + $s_valid_bcc,$aRawDataValues) + ) { + Error("mail_failed",GetMessage(MSG_FAILED_SEND)); + } + // + // Hook system: after sending emails + // + if (($incFile = hookFileExists("fmhookpostemail.inc")) !== false) { + @include($incFile); + } + } +} + +// +// Process autoresponse +// +$AutoResp->Process(); + +$SessionAccessor->CopyOut($aAllRawValues); +// +// multi-form processing +// +if ($bGotNextForm) { + OutputMultiFormTemplate($SPECIAL_VALUES["next_form"],$aRawDataValues); + // echo "Form index = ".GetSession("FormIndex"); + // + // Hook system: after multi-page next form output + // + if (($incFile = hookFileExists("fmhookpostnextform.inc")) !== false) { + @include($incFile); + } +} else { + // + // Hook system: before finishing + // + if (($incFile = hookFileExists("fmhookprefinish.inc")) !== false) { + @include($incFile); + } + // + // redirect to the good URL page, or create a default page; + // we're no longer processing a multi-page form sequence + // + UnsetSession("FormList"); + UnsetSession("FormIndex"); + UnsetSession("FormKeep"); + if (!$bGotGoodUrl) { + if (IsAjax()) { + JSON_Result("OK"); + } else { + if ($bGotGoodTemplate) { + OutputTemplate($SPECIAL_VALUES["good_template"],$aRawDataValues); + } else { + CreatePage(GetMessage(MSG_THANKS_PAGE),GetMessage(MSG_FORM_OK)); + } + } + // + // Hook system: after finishing (before session is cleared) + // + if (($incFile = hookFileExists("fmhookpostfinish.inc")) !== false) { + @include($incFile); + } + // + // everything's good, so we don't need the session any more + // + ZapSession(); + } elseif (IsAjax()) { + JSON_Result("OK"); + } else + + // + // Note that a redirect terminates the script and prevents + // the processing of fmhookpostfinish.inc. Also, the session + // is left intact (which the good_url can use). + // + { + Redirect($SPECIAL_VALUES["good_url"],GetMessage(MSG_FORM_OK)); + } +} diff --git a/formmail/formmail927.php b/formmail/formmail927.php new file mode 100755 index 0000000..9ed8e8f --- /dev/null +++ b/formmail/formmail927.php @@ -0,0 +1,15369 @@ +FormMail
    . + * + * Author: Russell Robinson + * First released: 2nd October 2001 + * + * Read This First + * ~~~~~~~~~~~~~~~ + * This script is very well documented and quite large! It looks daunting, + * but really isn't. + * If you have experience with PHP or other scripting languages, + * here's what you *need* to read: + * - Configuration (TARGET_EMAIL & DEF_ALERT) + * - Creating Forms + * That's it! (Alternatively, just read the Quick Start and/or + * Quicker Start section below). + * Full configuration documentation is here: + * http://www.tectite.com/fmdoc/index.php + * + * NOTE: do not read or modify this script or any PHP script + * with DreamWeaver or FrontPage! + * Many versions of those programs silently corrupt PHP scripts. + * + * Purpose: + * ~~~~~~~~ + * To accept information from an HTML form via HTTP and mail it to recipients. + * + * What does this PHP script do? + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * On your web site, you may have one or more HTML forms that accept + * information from people visiting your website. Your aim is for your + * website to email that information to you and/or add it to a database. + * FormMail performs those functions. + * + * Quick Start + * ~~~~~~~~~~~ + * 1. Edit this file and set TARGET_EMAIL for your requirements (near + * line 512 in this file - replace "yourhost\.com" with your mail server's + * name). We also strongly recommend you set DEF_ALERT (the next + * configuration below TARGET_EMAIL). + * 2. Install this file as formmail.php (or other name ending in .php) + * on your web server. + * Test alerts by using your browser to open a URL to the script: + * http://www.yourhost.com/formmail.php?testalert=1 + * Alerts are the only way FormMail can tell you the details of + * errors or faults. + * 3. Create an HTML form and: + * - specify a hidden field called "recipients" with the email address + * of the person to receive the form's results. + * - in the your form tag set the action attribute to + * the formmail.php you uploaded to your web server + * + * Once you have FormMail working, you may be interested in some advanced + * usage and features. We have HOW-TO guides at www.tectite.com which + * describe many of the advanced processing you can do with FormMail. + * http://www.tectite.com/fmhowto/guides.php + * + * Quicker Start + * ~~~~~~~~~~~~~ + * Use the FormMail Configuration Wizard here: + * http://www.tectite.com/wizards/fmconf.php + * By answering a few questions you'll get a configured FormMail and + * a sample HTML form ready to upload and use on your server. + * + * Features + * ~~~~~~~~ + * For a list of features go to: http://www.tectite.com/formmailpage.php + * + * Security + * ~~~~~~~~ + * Security is the primary concern in accepting data from your website + * visitors. + * Tectite FormMail has several security features designed into it. Note, + * however, it requires configuration for your particular web site. + * + * Configuration + * ~~~~~~~~~~~~~ + * To configure this script, go to the section titled "CONFIGURATION" + * (after reading the legal stuff below). + * + * There is only one mandatory setting: TARGET_EMAIL + * and one strongly recommended setting: DEF_ALERT + * + * Full configuration information is available here: + * http://www.tectite.com/fmdoc/index.php + * + * Creating Forms + * ~~~~~~~~~~~~~~ + * Go to this URL to learn how to write HTML forms for use with + * Tectite FormMail: http://www.tectite.com/fmdoc/creating_forms.php + * + * Copying and Use (Software License) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Tectite FormMail is provided free of charge and may be freely distributed + * and used provided that you: + * 1. keep this header, including copyright and comments, + * in place and unmodified; and, + * 2. do not charge a fee for distributing it, without an agreement + * in writing with Root Software allowing you to do so; and, + * 3. if you modify FormMail before distributing it, you clearly + * identify: + * a) who you are + * b) how to contact you + * c) what changes you have made + * d) why you have made those changes. + * + * By using any of our products, including this script, you are + * agreeing to our standard Terms and Conditions, available here: + * http://www.tectite.com/TermsAndConditions.pdf + * + * This is free software and the Software License shown above + * is to be read in conjunction with our standard Terms and Conditions. + * + * Warranty and Disclaimer + * ~~~~~~~~~~~~~~~~~~~~~~~ + * Tectite FormMail is provided free-of-charge and with ABSOLUTELY NO WARRANTY. + * It has not been verified for use in critical applications, including, + * but not limited to, medicine, defense, aircraft, space exploration, + * or any other potentially dangerous activity. + * + * By using Tectite FormMail you agree to indemnify Root Software and + * Open Concepts (Vic) Pty Ltd, their agents, employees, directors and + * associated companies and businesses from any liability whatsoever. + * + * We still care + * ~~~~~~~~~~~~~ + * If you find a bug or fault in FormMail, please report it to us. + * We will respond to your report and make endeavours to rectify any + * faults you've detected as soon as possible. + * + * To contact us view our contact information: + * http://www.tectite.com/contacts.php + * + * Version History + * ~~~~~~~~~~~~~~~ + * Near the top of this file, you'll find its version. The version + * line looks like this: + * $FM_VERS = "N.MM"; /* script version ... + * + * The version history used to be located within this file. However, + * starting with Version 8.00 we've moved it... + * + * You can read the complete version history of FormMail on our + * main website here: + * http://www.tectite.com/fmdoc/version_history.php + */ + +/** + * An alternative function for sending email. + * You can override this variable in a hook script to use a different function. + */ +$ALT_MAIL_FUNCTION = ''; + +FMDebug('Submission to: ' . (isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : '') . ' from: ' . + (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')); + +if (isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD']) === 'OPTIONS') { + FMDebug('CORS OPTIONS request'); + CORS_Response(); + FormMailExit(); +} + +// +// Capture the current date and time, for various purposes. +// +date_default_timezone_set('UTC'); /* prevent notice in PHP 5.1+ */ +$lNow = time(); + +ini_set('track_errors',1); // enable $php_errormsg + +$aAlertInfo = array(); + +$sLangID = ""; // the language ID +$aMessages = array(); // all FormMail messages in the appropriate language + +function FormMailExit($s_mesg = '') +{ + if (!@include(Settings::get('HOOK_DIR') . "/fmhookonexit.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookonexit.inc"); + } + exit($s_mesg); +} + +/** + * Interrogate and manage the execution environment. + * + * @package tectite_formmail + * @subpackage setup + */ +class ExecEnv +{ + /** + * Value of phpversion(). + * + * @var string + */ + private $_sPHPVersionString; + + /** + * Array containing the elements of the PHP version + * + * @var array + */ + private $_aPHPVersion; + + /** + * The URL for the script. + * + * @var string + */ + private $_sScript; + + /** + * Construct the class, and check PHP version. + */ + function __construct() + { + $this->_Init(); + $this->_CheckVersion(); + } + + /** + * Initialise the object. + * Sets {@link $_aPHPVersion} and {@link $_sPHPVersionString} + */ + private function _Init() + { + $this->_sPHPVersionString = phpversion(); + $this->_aPHPVersion = explode(".",$this->_ZapHyphenPart($this->_sPHPVersionString)); + } + + /** + * Remove any hyphenated component of a version string. + * + * @param $str + * + * @return false|string + */ + private function _ZapHyphenPart($str) + { + if (($i_pos = strpos($str,'-')) !== false) { + return substr($str,0,$i_pos); + } else { + return $str; + } + } + + /** + * @return array + */ + public function getPHPVersion() + { + return $this->_aPHPVersion; + } + + /** + * @return string + */ + public function getPHPVersionString() + { + return $this->_sPHPVersionString; + } + + /** + * Check for old version of PHP - die with a message if too old. + * + * This is actually not required because PHP 4 won't even accept + * the syntax of a PHP 5 script. However, we might need some + * other version check in the future, so this is a useful method + * to have around in that case. + */ + private function _CheckVersion() + { + $s_req_string = "5.0.0"; // We only support PHP 5 onward. + $a_too_old = explode(".",$s_req_string); + + $i_cannot_use = ($a_too_old[0] * 10000) + ($a_too_old[1] * 100) + $a_too_old[2]; + + $i_this_num = ($this->_aPHPVersion[0] * 10000) + ($this->_aPHPVersion[1] * 100) + + $this->_aPHPVersion[2]; + + if ($i_this_num <= $i_cannot_use) { + FormMailExit(GetMessage(MSG_SCRIPT_VERSION, + array("PHPREQ" => $s_req_string,"PHPVERS" => $this->_sPHPVersionString))); + } + } + + /** + * Test PHP version against a particular version string. + * + * @param $s_vers + * + * @return boolean true if the PHP version is at or later than the version + * specified + */ + public function IsPHPAtLeast($s_vers) + { + $a_test_version = explode(".",$s_vers); + if (count($a_test_version) < 3) { + return (false); + } + return ($this->_aPHPVersion[0] > $a_test_version[0] || ($this->_aPHPVersion[0] == + $a_test_version[0] && + ($this->_aPHPVersion[1] > + $a_test_version[1] || + $this->_aPHPVersion[1] == + $a_test_version[1] && + $this->_aPHPVersion[2] >= + $a_test_version[2]))); + } + + public function GetScript() + { + if (!isset($this->_sScript)) { + if (isset($_SERVER["PHP_SELF"]) && + !empty($_SERVER["PHP_SELF"]) && + isset($_SERVER["SERVER_NAME"]) && + !empty($_SERVER["SERVER_NAME"]) + ) { + if (isset($_SERVER["SERVER_PORT"]) && + $_SERVER["SERVER_PORT"] != 80 + ) { + if ($_SERVER["SERVER_PORT"] == 443) // SSL port + // + // just use https prefix + // + { + $this->_sScript = "https://" . $_SERVER["SERVER_NAME"] . + $_SERVER["PHP_SELF"]; + } else + // + // use http with port number + // + { + $this->_sScript = "http://" . $_SERVER["SERVER_NAME"] . + ":" . $_SERVER["SERVER_PORT"] . + $_SERVER["PHP_SELF"]; + } + } else { + $this->_sScript = "http://" . $_SERVER["SERVER_NAME"] . + $_SERVER["PHP_SELF"]; + } + } else { + Error("no_php_self",GetMessage(MSG_NO_PHP_SELF),false,false); + } + } + return ($this->_sScript); + } + + /** + * Get a boolean PHP setting. + * + * @param string $s_name the name of the setting + * + * @return bool|null the value of the setting + */ + public function getINIBool($s_name) + { + $m_val = ini_get($s_name); + if ($m_val !== null) { + if (is_numeric($m_val)) { + $m_val = (int)$m_val; + } elseif (is_string($m_val)) { + $m_val = strtolower($m_val); + switch ($m_val) { + case "1": + case "on": + case "true": + $m_val = true; + break; + default: + $m_val = false; + break; + } + } + } + return ($m_val); + } + + /** + * Return whether the session can be passed in a URL. + * + * @return bool true if the session can be passed in a URL + */ + public function allowSessionURL() + { + $m_only_cookies = $this->getINIBool('session.use_only_cookies'); + FMDebug('only_cookies=' . $m_only_cookies); + if ($m_only_cookies === null) { + $m_only_cookies = $this->IsPHPAtLeast('5.3.0'); + FMDebug('php=' . $this->IsPHPAtLeast('5.3.0') . ',only_cookies=' . $m_only_cookies); + } + return (!$m_only_cookies); + } + + public function getPostMaxSize() + { + $s_max_value = ini_get('post_max_size'); + $number = (int)substr($s_max_value,0,-1); + switch (strtoupper(substr($s_max_value,-1))) { + case "K": + return $number * 1024; + case "M": + return $number * pow(1024,2); + case "G": + return $number * pow(1024,3); + default: + return (int)$s_max_value; + } + } + + public function checkUploadSize() + { + if (isset($_SERVER['CONTENT_LENGTH'])) { + $n_size = (int)$_SERVER['CONTENT_LENGTH']; + $n_max = $this->getPostMaxSize(); + // echo "Size = $n_size, max = $n_max\n"; + if ($n_size > $n_max) { + UserError("post_size_limit",GetMessage(MSG_POST_SIZE_LIMIT,array(),false,false)); + } + } + } + + public function checkFileUploadSize($a_file_vars) + { + if (Settings::get('FILEUPLOADS')) { + $a_field_names = array_keys($a_file_vars); + foreach ($a_field_names as $s_name => $a_upload) { + if (isset($a_upload)) { + switch (isset($a_upload['error']) ? $a_upload['error'] : 0) { + case 0: // no error + case 4: // no file uploaded + break; + default: + UserError('file_upload_error',FieldManager::GetFileUploadErrorMesg($a_upload['error'])); + } + } + } + } + } +} + +$ExecEnv = new ExecEnv(); +if (!$ExecEnv->IsPHPAtLeast("5.3.0")) { + // + // disable this silly setting (usually not enabled) + // it's also deprecated from PHP version 5.3.0 + // + if (function_exists('set_magic_quotes_runtime')) { + /** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */ + @set_magic_quotes_runtime(0); + } +} + +// +// We set references to the appropriate arrays to handle PHP version differences +// Session vars are selected after we start the session. +// +$aServerVars = &$_SERVER; +$aGetVars = &$_GET; +$aFormVars = &$_POST; +$aFileVars = &$_FILES; +$aEnvVars = &$_ENV; + +$bIsGetMethod = false; +$bHasGetData = false; + +if (!isset($REAL_DOCUMENT_ROOT)) { + SetRealDocumentRoot(); +} + +if (isset($aServerVars['SERVER_PORT'])) { + $SCHEME = ($aServerVars['SERVER_PORT'] == 80) ? "http://" : "https://"; +} else { + $SCHEME = ""; +} +if (isset($aServerVars['SERVER_NAME']) && $aServerVars['SERVER_NAME'] !== "") { + $SERVER = $aServerVars['SERVER_NAME']; +} elseif (isset($aServerVars['SERVER_ADDR']) && $aServerVars['SERVER_ADDR'] !== "") { + $SERVER = $aServerVars['SERVER_ADDR']; +} else { + $SERVER = ""; +} + +/* + * Load an optional include file before the configuration. + * You can use this to set variables that can be used in the + * configuration section. + */ +@include("formmail-preconfig.inc.php"); + +/*****************************************************************************/ +/* CONFIGURATION (do not alter this line in any way!!!) */ +/***************************************************************************** + * This is the *only* place where you need to modify things to use formmail.php + * on your particular system. This section finishes at "END OF CONFIGURATION". + * Help for all settings can be found on our website: + * http://www.tectite.com/fmdoc/index.php + * + * Also, above each setting is a direct URL to the help information for the + * setting. + *****************************************************************************/ + +/* Help: http://www.tectite.com/fmdoc/email_name.php */ +$EMAIL_NAME = "^[-a-z0-9._]+"; /* the '^' is an important security feature! */ + +/* Help: http://www.tectite.com/fmdoc/target_email.php */ +$TARGET_EMAIL = array($EMAIL_NAME . "@yourhost\.com$"); + +/* Help: http://www.tectite.com/fmdoc/email_addrs.php */ +$EMAIL_ADDRS = array(); + +/* Help: http://www.tectite.com/fmdoc/def_alert.php */ +$DEF_ALERT = ""; + +/* Help: http://www.tectite.com/fmdoc/site_domain.php */ +$SITE_DOMAIN = ""; /* your website domain name */ + +/* Help: http://www.tectite.com/fmdoc/set_real_document_root.php */ +$SET_REAL_DOCUMENT_ROOT = ""; /* overrides the value set by SetRealDocumentRoot function */ + +// +// override $REAL_DOCUMENT_ROOT from the $SET_REAL_DOCUMENT_ROOT value (if any) +// Do not alter the following code (next 3 lines)! +// +if (isset($SET_REAL_DOCUMENT_ROOT) && $SET_REAL_DOCUMENT_ROOT !== "") { + $REAL_DOCUMENT_ROOT = $SET_REAL_DOCUMENT_ROOT; +} + +/* Help: http://www.tectite.com/fmdoc/config_check.php */ +$CONFIG_CHECK = array("TARGET_EMAIL"); + +/* Help: http://www.tectite.com/fmdoc/at_mangle.php */ +$AT_MANGLE = ""; + +/* Help: http://www.tectite.com/fmdoc/target_urls.php */ +$TARGET_URLS = array(); /* default; no URLs allowed */ + +/* Help: http://www.tectite.com/fmdoc/head_crlf.php */ +$HEAD_CRLF = "\r\n"; + +/* Help: http://www.tectite.com/fmdoc/body_lf.php */ +$BODY_LF = "\r\n"; /* the new default: use this for CR+LF */ +//$BODY_LF = "\n"; /* the old default: just LF */ + +/* Help: http://www.tectite.com/fmdoc/from_user.php */ +$FROM_USER = ""; /* the default - setting not used */ + +/* Help: http://www.tectite.com/fmdoc/sendmail_f_option.php */ +$SENDMAIL_F_OPTION = false; +$SENDMAIL_F_OPTION_LINE = __LINE__ - 1; /* don't modify this line! */ + +/* Help: http://www.tectite.com/fmdoc/fixed_sender.php */ +$FIXED_SENDER = ""; + +/* Help: http://www.tectite.com/fmdoc/set_sender_from_email.php */ +$SET_SENDER_FROM_EMAIL = false; + +/* Help: http://www.tectite.com/fmdoc/ini_set_from.php */ +$INI_SET_FROM = false; + +/* Help: http://www.tectite.com/fmdoc/logdir.php */ +$LOGDIR = ""; /* directory for log files; empty string to disallow log files */ + +/* Help: http://www.tectite.com/fmdoc/autorespondlog.php */ +$AUTORESPONDLOG = ""; /* file name in $LOGDIR for the auto responder log; empty string for no auto responder log */ + +/* Help: http://www.tectite.com/fmdoc/csv_file_settings.php */ +$CSVDIR = ""; /* directory for csv files; empty string to disallow csv files */ +$CSVSEP = ","; /* comma separator between fields (columns) */ +$CSVINTSEP = ";"; /* semicolon is the separator for fields (columns) with multiple values (checkboxes, etc.) */ +$CSVQUOTE = '"'; /* all fields in the CSV are quoted with this character; default is double quote. You can change it to single quote or leave it empty for no quotes. */ +//$CSVQUOTE = "'"; /* use this if you want single quotes */ +$CSVOPEN = ""; /* set to "b" to force line terminations to be kept as $CSVLINE setting below, regardless of operating + system. Keep as empty string and leave $CSVLINE unchanged, to get text file + terminations for your server's operating system. (Line feed on UNIX, carriage-return line feed on Windows). */ +$CSVLINE = "\n"; /* line termination for CSV files. The default is a single line feed, which may be modified for your + server's operating system. If you want to change + this value, you *must* set $CSVOPEN = "b". */ + +/* Help: http://www.tectite.com/fmdoc/templatedir.php */ +$TEMPLATEDIR = ""; /* directory for template files; empty string if you don't have any templates */ + +/* Help: http://www.tectite.com/fmdoc/templateurl.php */ +$TEMPLATEURL = ""; /* default; no template URL */ + +/* Help: http://www.tectite.com/fmdoc/multiformdir.php */ +$MULTIFORMDIR = ""; /* directory for multi-form template files; empty string if you're not using multi-forms */ + +/* Help: http://www.tectite.com/fmdoc/multiformurl.php */ +$MULTIFORMURL = ""; /* default; no multi-forms templates URL */ + +/* Help: http://www.tectite.com/fmdoc/text_subs.php */ +$TEXT_SUBS = array( + array("srch" => "/\\\\r\\\\n/","repl" => "\r\n",), + array("srch" => "/\\\\n/","repl" => "\n",), + array("srch" => "/\\\\t/","repl" => "\t",), + array("srch" => "/\\[NL\\]/","repl" => "\n",), + array("srch" => "/\\[TAB\\]/","repl" => "\t",), + array("srch" => "/\\[NBSP\\]/","repl" => " ",), + array("srch" => "/\\[DQUOT\\]/","repl" => '"',), + array("srch" => "/\\[SQUOT\\]/","repl" => "'",), + array("srch" => "/\\[COLON\\]/","repl" => ":",), + array("srch" => "/\\[SLOSH\\]/","repl" => "\\",), + array("srch" => "/\\[OPCURL\\]/","repl" => "{",), + array("srch" => "/\\[CLCURL\\]/","repl" => "}",), + array("srch" => "/(on[a-z]*|href|src)\\s*=\\s*/i","repl" => ""), /* strip html attributes that could be unsafe */ + array("srch" => "/<\\s*(table|tr|td|th|p|ul|ol|li|b|i|u|strong|pre|h[1-6]|em|dl|dd|dt|hr|span|br)(\\b[^>]*?)>/i", + "repl" => "<\$1\$2>", + ), + array("srch" => "#<\\s*/\\s*(table|tr|td|th|p|ul|ol|li|b|i|u|strong|pre|h[1-6]|em|dl|dd|dt|hr|span|br)\\s*>#i", + "repl" => "", + ), +); + +/* Help: http://www.tectite.com/fmdoc/authentication_settings.php */ +$AUTHENTICATE = ""; +//$AUTHENTICATE = "Basic cnVzc2VsbHI6dGVzdA=="; // example +$AUTH_USER = ""; +$AUTH_PW = ""; + +/* Help: http://www.tectite.com/fmdoc/form_ini_file.php */ +$FORM_INI_FILE = ""; + +/* Help: http://www.tectite.com/fmdoc/moduledir.php */ +$MODULEDIR = "."; + +/* Help: http://www.tectite.com/fmdoc/fmcompute.php */ +$FMCOMPUTE = "fmcompute.php"; + +/* Help: http://www.tectite.com/fmdoc/fmgeoip.php */ +$FMGEOIP = "fmgeoip.php"; + +/* Help: http://www.tectite.com/fmdoc/advanced_templates.php */ +$ADVANCED_TEMPLATES = false; /* set to true for advanced templates */ + +/* Help: http://www.tectite.com/fmdoc/limited_import.php */ +$LIMITED_IMPORT = true; /* set to true if your database cannot handle escaped quotes or newlines within imported data. Microsoft Access is one example. */ + +/* Help: http://www.tectite.com/fmdoc/valid_env.php */ +$VALID_ENV = array('HTTP_REFERER','REMOTE_HOST','REMOTE_ADDR','REMOTE_USER', + 'HTTP_USER_AGENT' +); + +/* Help: http://www.tectite.com/fmdoc/fileuploads.php */ +$FILEUPLOADS = false; /* set to true to allow file attachments */ + +/* Help: http://www.tectite.com/fmdoc/max_file_upload_size.php */ +$MAX_FILE_UPLOAD_SIZE = 0; /* default of 0 means that other software */ +// controls the maximum file upload size +// (FormMail doesn't test the file size) + +/* Help: http://www.tectite.com/fmdoc/file_repository.php */ +$FILE_REPOSITORY = ""; + +/* Help: http://www.tectite.com/fmdoc/file_mode.php */ +$FILE_MODE = 0664; /* always precede with 0 to specify octal! */ + +/* Help: http://www.tectite.com/fmdoc/file_overwrite.php */ +$FILE_OVERWRITE = true; + +/* Help: http://www.tectite.com/fmdoc/next_num_file.php */ +$NEXT_NUM_FILE = ""; + +/* Help: http://www.tectite.com/fmdoc/put_data_in_url.php */ +$PUT_DATA_IN_URL = true; /* set to true to place data in the URL */ +// for bad_url redirects + +/* Help: http://www.tectite.com/fmdoc/allow_get_method.php */ +$ALLOW_GET_METHOD = false; + +/* Help: http://www.tectite.com/fmdoc/db_see_input.php */ +$DB_SEE_INPUT = false; /* set to true to just see the input values */ + +/* Help: http://www.tectite.com/fmdoc/db_see_ini.php */ +$DB_SEE_INI = false; /* set to true to just see the ini file */ + +/* Help: http://www.tectite.com/fmdoc/maxstring.php */ +$MAXSTRING = 1024; /* maximum string length for a value */ + +/* Help: http://www.tectite.com/fmdoc/require_captcha.php */ +$REQUIRE_CAPTCHA = ""; /* set to a message string if your forms */ +// must provide a CAPTCHA string + +/* Help: http://www.tectite.com/fmdoc/recaptcha_private_key.php */ +$RECAPTCHA_PRIVATE_KEY = ""; + +/* Help: http://www.tectite.com/fmdoc/bshowmesgnumbers.php */ +$bShowMesgNumbers = false; + +/* Help: http://www.tectite.com/fmdoc/filters.php */ +/* Note for Tectite personnel: the upgrade Wizard will merge new values + * but be careful of $var usage and quoting in new entries. + */ +/** @noinspection PhpUndefinedVariableInspection */ +$FILTERS = array("encode" => "$REAL_DOCUMENT_ROOT/cgi-bin/fmencoder -kpubkey.txt", + "null" => "null", + "csv" => "csv" +); + +/* Help: http://www.tectite.com/fmdoc/socket_filters.php */ +$SOCKET_FILTERS = array( + "httpencode" => array("site" => "YourSiteHere", + "port" => 80, + "path" => "/cgi-bin/fmencoder", + "params" => array(array("name" => "key", + "file" => "$REAL_DOCUMENT_ROOT/cgi-bin/pubkey.txt" + ) + ) + ), + "sslencode" => array("site" => "ssl://YourSecureSiteHere", + "port" => 443, + "path" => "/cgi-bin/fmencoder", + "params" => array(array("name" => "key", + "file" => "$REAL_DOCUMENT_ROOT/cgi-bin/pubkey.txt" + ) + ) + ), +); + +/* Help: http://www.tectite.com/fmdoc/filter_attribs.php */ +$FILTER_ATTRIBS = array("encode" => "Strips,MIME=application/vnd.fmencoded,Encrypts", + "httpencode" => "Strips,MIME=application/vnd.fmencoded,Encrypts", + "sslencode" => "Strips,MIME=application/vnd.fmencoded,Encrypts", + "csv" => "Strips,MIME=text/csv", +); + +/* Help: http://www.tectite.com/fmdoc/check_for_new_version.php */ +$CHECK_FOR_NEW_VERSION = true; +$CHECK_DAYS = 30; + +/* Help: http://www.tectite.com/fmdoc/scratch_pad.php */ +$SCRATCH_PAD = ""; + +/* Help: http://www.tectite.com/fmdoc/cleanup_time.php */ +$CLEANUP_TIME = 60; /* cleanup time in minutes */ + +/* Help: http://www.tectite.com/fmdoc/cleanup_chance.php */ +$CLEANUP_CHANCE = 20; /* percentage probability that cleanup will be performed */ + +/* Help: http://www.tectite.com/fmdoc/pear_settings.php */ +$PEAR_SMTP_HOST = ""; +$PEAR_SMTP_PORT = 25; +$PEAR_SMTP_USER = ""; +$PEAR_SMTP_PWD = ""; + +/* Help: http://www.tectite.com/fmdoc/alert_on_user_error.php */ +$ALERT_ON_USER_ERROR = true; + +/* Help: http://www.tectite.com/fmdoc/enable_attack_detection.php */ +$ENABLE_ATTACK_DETECTION = true; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_url.php */ +$ATTACK_DETECTION_URL = ""; + +/* Help: http://www.tectite.com/fmdoc/alert_on_attack_detection.php */ +$ALERT_ON_ATTACK_DETECTION = false; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_mime.php */ +$ATTACK_DETECTION_MIME = true; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_junk.php */ +$ATTACK_DETECTION_JUNK = false; +$ATTACK_DETECTION_JUNK_CONSONANTS = "bcdfghjklmnpqrstvwxz"; +$ATTACK_DETECTION_JUNK_VOWELS = "aeiouy"; +$ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS = 5; +$ATTACK_DETECTION_JUNK_CONSEC_VOWELS = 4; +$ATTACK_DETECTION_JUNK_TRIGGER = 2; +$ATTACK_DETECTION_JUNK_LANG_STRIP = array( + "aiia", /* Hawaiian */ + "aeoa", /* palaeoanthropic */ + "aeoe", /* palaeoethnic */ + "ayou", /* layout */ + "ayee", /* payee */ + "buyout", /* buyout */ + "clayey", /* clayey */ + "hooey", /* hooey */ + "ioau", /* radioautograph */ + "opoeia", /* pharmacopoeia, onomatopoeia */ + "ooee", /* cooee */ + "oyee", /* employee */ + "ioau", /* radioautograph */ + "uaia", /* guaiac */ + "uaya", /* uruguayan */ + "ueou", /* aqueous */ + "uiou", /* obsequious */ + "uoya", /* buoyant */ + "queue", /* queue, queueing */ + "earth", /* earthquake, earthslide */ + "cks", /* jockstrap, backscratcher */ + "ngth", /* strengths, length */ + "ndths", /* thousandths */ + "ght", /* nightclub, knightsbridge */ + "phth", /* ophthalmology */ + "sch", /* rothschild */ + "shch", /* borshch */ + "scr", /* corkscrew */ + "spr", /* wingspread, offspring */ + "str", /* armstrong, songstress */ + "sts", /* bursts, postscript */ + "tch", /* catchphrase, scratchproof */ + "thst", /* northstar, birthstone */ + "http", /* https, http */ + "html", /* HTML, XHTML */ +); +$ATTACK_DETECTION_JUNK_IGNORE_FIELDS = array(); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_dups.php */ +$ATTACK_DETECTION_DUPS = array("realname","address1","address2","country","zip", + "phone","postcode","state","email" +); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_specials.php */ +$ATTACK_DETECTION_SPECIALS = true; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_specials.php */ +$ATTACK_DETECTION_SPECIALS_ONLY_EMAIL = array("derive_fields","required", + "mail_options","good_url","bad_url","good_template", + "bad_template" +); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_specials.php */ +$ATTACK_DETECTION_SPECIALS_ANY_EMAIL = array("subject"); + +/* Help: http://www.tectite.com/fmdoc/attack_detection_many_urls.php */ +$ATTACK_DETECTION_MANY_URLS = 0; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_many_url_fields.php */ +$ATTACK_DETECTION_MANY_URL_FIELDS = 0; + +/* Help: http://www.tectite.com/fmdoc/attack_detection_url_patterns.php */ +$ATTACK_DETECTION_URL_PATTERNS = array( + '(^|[^-a-z_.0-9]+)(?'; + debug_print_backtrace(); + echo ''; + FormMailExit("No FormMail setting called '$s_name' exists."); + } + } + + /** + * Tests if the given config setting is empty. + * + * @param string $s_name the name of the config setting + * + * @return boolean true if the config setting is empty + */ + public static function isEmpty($s_name) + { + Settings::_check($s_name); + if (gettype($GLOBALS[$s_name]) == 'string') { + return ($GLOBALS[$s_name] === ''); + } else { + return (empty($GLOBALS[$s_name])); + } + } + + /** + * Returns the value of the given config setting. + * + * @param string $s_name the name of the config setting + * + * @return mixed the value of the config setting + */ + public static function get($s_name) + { + Settings::_check($s_name); + return ($GLOBALS[$s_name]); + } + + /** + * Set the value of a config setting. + * + * @param string $s_name the name of the config setting + * @param mixed $m_value the value to set for the config setting + */ + public static function set($s_name,$m_value) + { + Settings::_check($s_name); + if (($s_orig_type = gettype($GLOBALS[$s_name])) != ($s_new_type = gettype($m_value))) { + echo '
    ';
    +			debug_print_backtrace();
    +			echo '
    '; + FormMailExit("You cannot set FormMail setting '$s_name' to type '$s_new_type'. It should be type '$s_orig_type'."); + } + $GLOBALS[$s_name] = $m_value; + } +} + +/* + * Load an optional include file after the configuration. + * You can use this to set variables or make adjustments + * based on the results of the configuration section. + */ +@include("formmail-preconfigdefs.inc.php"); + +/* + * Many configuration settings used to be constants. However, constants + * cannot be re-defined in PHP. This limitation reduced the value + * of "formmail-postconfig.inc.php" and other hook scripts. + * Therefore, all configuration settings have been changed to be global + * variables (no define's). + * + * The following defines are for backward-compatibility with any existing + * hook scripts that are expecting the old constants. + */ +define("EMAIL_NAME",Settings::get("EMAIL_NAME")); +define("DEF_ALERT",Settings::get("DEF_ALERT")); +define("AT_MANGLE",Settings::get("AT_MANGLE")); +define("HEAD_CRLF",Settings::get("HEAD_CRLF")); +define("BODY_LF",Settings::get("BODY_LF")); +define("SENDMAIL_F_OPTION",Settings::get("SENDMAIL_F_OPTION")); +define("SENDMAIL_F_OPTION_LINE",Settings::get("SENDMAIL_F_OPTION_LINE")); +define("SET_SENDER_FROM_EMAIL",Settings::get("SET_SENDER_FROM_EMAIL")); +define("INI_SET_FROM",Settings::get("INI_SET_FROM")); +define("ADVANCED_TEMPLATES",Settings::get("ADVANCED_TEMPLATES")); +define("LIMITED_IMPORT",Settings::get("LIMITED_IMPORT")); +define("FILEUPLOADS",Settings::get("FILEUPLOADS")); +define("MAX_FILE_UPLOAD_SIZE",Settings::get("MAX_FILE_UPLOAD_SIZE")); +define("FILE_MODE",Settings::get("FILE_MODE")); +define("FILE_OVERWRITE",Settings::get("FILE_OVERWRITE")); +define("PUT_DATA_IN_URL",Settings::get("PUT_DATA_IN_URL")); +define("DB_SEE_INPUT",Settings::get("DB_SEE_INPUT")); +define("DB_SEE_INI",Settings::get("DB_SEE_INI")); +define("MAXSTRING",Settings::get("MAXSTRING")); +define("CHECK_FOR_NEW_VERSION",Settings::get("CHECK_FOR_NEW_VERSION")); +define("CHECK_DAYS",Settings::get("CHECK_DAYS")); +define("ALERT_ON_USER_ERROR",Settings::get("ALERT_ON_USER_ERROR")); +define("ENABLE_ATTACK_DETECTION",Settings::get("ENABLE_ATTACK_DETECTION")); +define("ATTACK_DETECTION_URL",Settings::get("ATTACK_DETECTION_URL")); +define("ALERT_ON_ATTACK_DETECTION",Settings::get("ALERT_ON_ATTACK_DETECTION")); +define("ATTACK_DETECTION_MIME",Settings::get("ATTACK_DETECTION_MIME")); +define("ATTACK_DETECTION_JUNK",Settings::get("ATTACK_DETECTION_JUNK")); +define("ATTACK_DETECTION_JUNK_CONSONANTS",Settings::get("ATTACK_DETECTION_JUNK_CONSONANTS")); +define("ATTACK_DETECTION_JUNK_VOWELS",Settings::get("ATTACK_DETECTION_JUNK_VOWELS")); +define("ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS",Settings::get("ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS")); +define("ATTACK_DETECTION_JUNK_CONSEC_VOWELS",Settings::get("ATTACK_DETECTION_JUNK_CONSEC_VOWELS")); +define("ATTACK_DETECTION_JUNK_TRIGGER",Settings::get("ATTACK_DETECTION_JUNK_TRIGGER")); +define("ATTACK_DETECTION_SPECIALS",Settings::get("ATTACK_DETECTION_SPECIALS")); +define("ATTACK_DETECTION_MANY_URLS",Settings::get("ATTACK_DETECTION_MANY_URLS")); +define("ATTACK_DETECTION_MANY_URL_FIELDS",Settings::get("ATTACK_DETECTION_MANY_URL_FIELDS")); +define("ATTACK_DETECTION_IGNORE_ERRORS",Settings::get("ATTACK_DETECTION_IGNORE_ERRORS")); +define("ZERO_IS_EMPTY",Settings::get("ZERO_IS_EMPTY")); +define("VALIDATE_EMAIL_DOMAIN",Settings::get("VALIDATE_EMAIL_DOMAIN")); +define("DESTROY_SESSION",Settings::get("DESTROY_SESSION")); + +// +// for Ajax allow GET method for cross site JSONP +// +if (IsAjax()) { + Settings::set('ALLOW_GET_METHOD',true); +} + +/* + * Load an optional include file after the configuration. + * You can use this to set variables or make adjustments + * based on the results of the configuration section. + */ +@include("formmail-postconfig.inc.php"); + +// @formatter:off + +// +// the following constants define all FormMail messages +// +// To re-align comments, use these search and replace patterns: +// Search Replace +// ^(\S{35,39})\s+// $1\t// +// ^(\S{31,35})\s+// $1\t\t// +// ^(\S{27,31})\s+// $1\t\t\t// +// ^(\S{23,27})\s+// $1\t\t\t\t// +// ^(\S{19,23})\s+// $1\t\t\t\t\t// +// +define('MSG_SCRIPT_VERSION',0); // This script requires at least PHP version... +define('MSG_END_VERS_CHK',1); // If you're happy... +define('MSG_VERS_CHK',2); // A later version of FormMail is available... +define('MSG_CHK_FILE_ERROR',3); // Unable to create check file... +define('MSG_UNK_VALUE_SPEC',4); // derive_fields: unknown value specification... +define('MSG_INV_VALUE_SPEC',5); // derive_fields: invalid value specification... +define('MSG_DERIVED_INVALID',6); // Some derive_fields specifications... +define('MSG_INT_FORM_ERROR',7); // Internal form error... +define('MSG_OPTIONS_INVALID',8); // Some mail_options settings... +define('MSG_PLSWAIT_REDIR',9); // Please wait while you are redirected... +define('MSG_IFNOT_REDIR',10); // If you are not redirected... +define('MSG_PEAR_OBJ',11); // Failed to create PEAR Mail object... +define('MSG_PEAR_ERROR',12); // PEAR Mail error... +define('MSG_NO_FOPT_ADDR',13); // You have specified "SendMailFOption"... +define('MSG_MORE_INFO',14); // More information... +define('MSG_INFO_STOPPED',15); // Extra alert information suppressed... +define('MSG_FM_ALERT',16); // FormMail alert +define('MSG_FM_ERROR',17); // FormMail script error +define('MSG_FM_ERROR_LINE',18); // The following error occurred... +define('MSG_USERDATA_STOPPED',19); // User data suppressed... +define('MSG_FILTERED',20); // This alert has been filtered... +define('MSG_TEMPLATES',21); // You must set either TEMPLATEDIR or TEMPLATEURL... +define('MSG_OPEN_TEMPLATE',22); // Failed to open template... +define('MSG_ERROR_PROC',23); // An error occurred while processing... +define('MSG_ALERT_DONE',24); // Our staff have been alerted... +define('MSG_PLS_CONTACT',25); // Please contact us directly... +define('MSG_APOLOGY',26); // We apologize for any inconvenience... +define('MSG_ABOUT_FORMMAIL',27); // Your form submission was processed by... +define('MSG_PREG_FAILED',28); // preg_match_all failed in FindCRMFields... +define('MSG_URL_INVALID',29); // CRM URL "$URL" is not valid... +define('MSG_URL_OPEN',30); // Failed to open Customer Relationship... +define('MSG_CRM_FAILED',31); // Failure report from CRM... +define('MSG_CRM_FORM_ERROR',32); // Your form submission was not... +define('MSG_OR',33); // "$ITEM1" or "$ITEM2" +define('MSG_NOT_BOTH',34); // not both "$ITEM1" and "$ITEM2" +define('MSG_XOR',35); // "$ITEM1" or "$ITEM2" (but not both) +define('MSG_IS_SAME_AS',36); // "$ITEM1" is the same as "$ITEM2" +define('MSG_IS_NOT_SAME_AS',37); // "$ITEM1" is not the same as "$ITEM2" +define('MSG_REQD_OPER',38); // Operator "$OPER" is not valid for "required" +define('MSG_PAT_FAILED',39); // Pattern operator "$OPER" failed: pattern... +define('MSG_COND_OPER',40); // Operator "$OPER" is not valid... +define('MSG_INV_COND',41); // Invalid "conditions" field... +define('MSG_COND_CHARS',42); // The conditions field "$FLD" is not valid... +define('MSG_COND_INVALID',43); // The conditions field "$FLD" is not valid... +define('MSG_COND_TEST_LONG',44); // Field "$FLD" has too many components... +define('MSG_COND_IF_SHORT',45); // Field "$FLD" has too few components for... +define('MSG_COND_IF_LONG',46); // Field "$FLD" has too many components for... +define('MSG_COND_UNK',47); // Field "$FLD" has an unknown command word... +define('MSG_MISSING',48); // Missing "$ITEM"... +define('MSG_NEED_ARRAY',49); // "$ITEM" must be an array... +define('MSG_SUBM_FAILED',50); // Your form submission has failed... +define('MSG_FILTER_WRONG',51); // Filter "$FILTER" is not properly... +define('MSG_FILTER_CONNECT',52); // Could not connect to site "$SITE"... +define('MSG_FILTER_PARAM',53); // Filter "$FILTER" has invalid parameter... +define('MSG_FILTER_OPEN_FILE',54); // Filter "$FILTER" cannot open file... +define('MSG_FILTER_FILE_ERROR',55); // Filter "$FILTER": read error on file... +define('MSG_FILTER_READ_ERROR',56); // Filter '$filter' failed: read error... +define('MSG_FILTER_NOT_OK',57); // Filter 'FILTER' failed... +define('MSG_FILTER_UNK',58); // Unknown filter... +define('MSG_FILTER_CHDIR',59); // Cannot chdir... +define('MSG_FILTER_NOTFOUND',60); // Cannot execute... +define('MSG_FILTER_ERROR',61); // Filter "$FILTER" failed... +define('MSG_SPARE',62); // this value is now spare +define('MSG_TEMPLATE_ERRORS',63); // Template "$NAME" caused the... +define('MSG_TEMPLATE_FAILED',64); // Failed to process template "$NAME"... +define('MSG_MIME_PREAMBLE',65); // (Your mail reader should not show this... +define('MSG_MIME_HTML',66); // This message has been generated by FormMail... +define('MSG_FILE_OPEN_ERROR',67); // Failed to open file "$NAME"... +define('MSG_ATTACH_DATA',68); // Internal error: AttachFile requires... +define('MSG_PHP_HTML_TEMPLATES',69); // HTMLTemplate option is only ... +define('MSG_PHP_FILE_UPLOADS',70); // For security reasons, file upload... +define('MSG_FILE_UPLOAD',71); // File upload attempt ignored... +define('MSG_FILE_UPLOAD_ATTACK',72); // Possible file upload attack... +define('MSG_PHP_PLAIN_TEMPLATES',73); // PlainTemplate option is only... +define('MSG_ATTACH_NAME',74); // filter_options: Attach must contain a name... +define('MSG_PHP_BCC',75); // Warning: BCC is probably not supported... +define('MSG_CSVCOLUMNS',76); // The "csvcolumns" setting is not... +define('MSG_CSVFILE',77); // The "csvfile" setting is not... +define('MSG_TARG_EMAIL_PAT_START',78); // Warning: Your TARGET_EMAIL pattern... +define('MSG_TARG_EMAIL_PAT_END',79); // Warning: Your TARGET_EMAIL pattern... +define('MSG_CONFIG_WARN',80); // The following potential problems... +define('MSG_PHP_AUTORESP',81); // Autorespond is only supported... +define('MSG_ALERT',82); // This is a test alert message... +define('MSG_NO_DEF_ALERT',83); // No DEF_ALERT value has been set.... +define('MSG_TEST_SENT',84); // Test message sent. Check your email..... +define('MSG_TEST_FAILED',85); // FAILED to send alert message... +define('MSG_NO_DATA_PAGE',86); // This URL is a Form submission program... +define('MSG_REQD_ERROR',87); // The form required some values that you... +define('MSG_COND_ERROR',88); // Some of the values you provided... +define('MSG_CRM_FAILURE',89); // The form submission did not succeed... +define('MSG_FOPTION_WARN',90); // Warning: You've used SendMailFOption in... +define('MSG_NO_ACTIONS',91); // The form has an internal error... +define('MSG_NO_RECIP',92); // The form has an internal error... +define('MSG_INV_EMAIL',93); // Invalid email addresses... +define('MSG_FAILED_SEND',94); // Failed to send email... +define('MSG_ARESP_EMAIL',96); // No "email" field was found. Autorespond... +define('MSG_ARESP_SUBJ',97); // Your form submission... +define('MSG_LOG_NO_VERIMG',98); // No VerifyImgString in session... +define('MSG_ARESP_NO_AUTH',99); // Failed to obtain authorization... +define('MSG_LOG_NO_MATCH',100); // User did not match image... +define('MSG_ARESP_NO_MATCH',101); // Your entry did not match... +define('MSG_LOG_FAILED',102); // Failed +define('MSG_ARESP_FAILED',103); // Autoresponder failed +define('MSG_LOG_OK',104); // OK +define('MSG_THANKS_PAGE',105); // Thanks! We've received your.... +define('MSG_LOAD_MODULE',106); // Cannot load module.... +define('MSG_LOAD_FMCOMPUTE',107); // Cannot load FMCompute.... +define('MSG_REGISTER_MODULE',108); // Cannot register module.... +define('MSG_COMP_PARSE',109); // These parse errors occurred.... +define('MSG_COMP_REG_DATA',110); // Failed to register data field.... +define('MSG_COMP_ALERT',111); // The following alert messages.... +define('MSG_COMP_DEBUG',112); // The following debug messages... +define('MSG_COMP_EXEC',113); // The following errors occurred.... +define('MSG_REG_FMCOMPUTE',114); // Cannot register function... +define('MSG_USER_ERRORS',115); // A number of errors occurred... +define('MSG_CALL_PARAM_COUNT',116); // Invalid parameter count... +define('MSG_CALL_UNK_FUNC',117); // Unknown function... +define('MSG_SAVE_FILE',118); // Failed to save file.... +define('MSG_CHMOD',119); // Failed to chmod file.... +define('MSG_VERIFY_MISSING',120); // Image verification string missing... +define('MSG_VERIFY_MATCH',121); // Your entry did not match... +define('MSG_FILE_NAMES_INVALID',122); // Some file_names specifications... +define('MSG_FILE_NAMES_NOT_FILE',123); // Your file_names specification... +define('MSG_TEMPL_ALERT',124); // The following alert messages.... +define('MSG_TEMPL_DEBUG',125); // The following debug messages... +define('MSG_TEMPL_PROC',126); // The following errors occurred.... +define('MSG_SAVE_FILE_EXISTS',127); // Cannot save file.... +define('MSG_EMPTY_ADDRESSES',128); // $COUNT empty addresses +define('MSG_CALL_INVALID_PARAM',129); // Invalid parameter.... +define('MSG_INI_PARSE_WARN',130); // Warning: your INI +define('MSG_INI_PARSE_ERROR',131); // The FormMail INI... +define('MSG_RECAPTCHA_MATCH',132); // reCaptcha verification failed... + +define('MSG_AND',133); // "$ITEM1" and "$ITEM2" +define('MSG_NEXT_PLUS_GOOD',134); // The form specifies both next_form and.... +define('MSG_MULTIFORM',135); // You must set either MULTIFORMDIR or MULTIFORMURL... +define('MSG_MULTIFORM_FAILED',136); // Failed to process multi-page form template "$NAME"... +define('MSG_NEED_THIS_FORM',137); // Multi-page forms require "this_form" field... +define('MSG_NO_PHP_SELF',138); // PHP on the server is not providing "PHP_SELF" +define('MSG_RETURN_URL_INVALID',139); // Return "$URL" is not valid... +define('MSG_GO_BACK',140); // Cannot 'go back' if not a multi-page form... +define('MSG_OPEN_URL',141); // Cannot open URL... +define('MSG_CANNOT_RETURN',142); // Cannot return to page.... +define('MSG_ATTACK_DETECTED',143); // Server attack detected.... +define('MSG_ATTACK_PAGE',144); // Your form submission.... +define('MSG_ATTACK_MIME_INFO',145); // The field "$FLD" contained... +define('MSG_ATTACK_DUP_INFO',146); // The fields "$FLD1" and... +define('MSG_ATTACK_SPEC_INFO',147); // Special field "$FLD"... +define('MSG_NEED_SCRATCH_PAD',148); // You need to set SCRATCH_PAD... +define('MSG_MULTI_UPLOAD',149); // File upload processing failed during multi-page form processing. +define('MSG_OPEN_SCRATCH_PAD',150); // Cannot open directory... +define('MSG_NO_NEXT_NUM_FILE',151); // You cannot use the %nextnum% feature... +define('MSG_NEXT_NUM_FILE',152); // Cannot process next number... +define('MSG_ATTACK_MANYURL_INFO',153); // Field "$FLD"... +define('MSG_ATTACK_MANYFIELDS_INFO',154); // $NUM fields have URLs.... +define('MSG_REV_CAP',155); // ATTACK_DETECTION_REVERSE_CAPTCHA setting.... +define('MSG_ATTACK_REV_CAP_INFO',156); // The field "$FLD" contained... +define('MSG_ATTACK_JUNK_INFO',157); // The field "$FLD" contained... +define('MSG_ARESP_EMPTY',158); // The autoresponse... +define('MSG_LOG_RECAPTCHA',159); // reCaptcha process failed... + +define('MSG_URL_PARSE',160); // URL parse failed +define('MSG_URL_SCHEME',161); // Unsupported URL scheme... +define('MSG_SOCKET',162); // Socket error ... +define('MSG_GETURL_OPEN',163); // Open URL failed: ... +define('MSG_RESOLVE',164); // Cannot resolve... + +define('MSG_FORM_OK',170); // Form Submission Succeeded +define('MSG_FORM_ERROR',171); // Form Submission Error +define('MSG_GET_DISALLOWED',172); // GET method has... +define('MSG_INVALID_SENDER',173); // The form has specified an invalid sender +define('MSG_SET_SENDER_FROM_EMAIL',174); // SET_SENDER_FROM_EMAIL is no longer supported +// +// The following are PHP's file upload error messages +// +define('MSG_FILE_UPLOAD_ERR_UNK',180); // Unknown error code. +define('MSG_FILE_UPLOAD_ERR1',181); // The uploaded file exceeds the upload_max_filesize directive in php.ini. +define('MSG_FILE_UPLOAD_ERR2',182); // The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form. +define('MSG_FILE_UPLOAD_ERR3',183); // The uploaded file was only partially uploaded. +define('MSG_FILE_UPLOAD_ERR4',184); // No file was uploaded. +define('MSG_FILE_UPLOAD_ERR6',186); // Missing a temporary folder. +define('MSG_FILE_UPLOAD_ERR7',187); // Failed to write file to disk. +define('MSG_FILE_UPLOAD_ERR8',188); // File upload stopped by extension. +define('MSG_FILE_UPLOAD_SIZE',189); // Uploaded file "$NAME" is too big... (not a PHP error code - internal maximum file size error) +define('MSG_POST_SIZE_LIMIT',190); // Your form submission exceeds the server's configured size limit. +// +// following are for derive_fields functions +// +define('MSG_DER_FUNC_ERROR',200); // derive_fields: invalid function.... +define('MSG_DER_FUNC_SIZE_FMT',201); // function 'size' requires.... +define('MSG_DER_FUNC_IF_FMT',202); // function 'if' requires.... +define('MSG_DER_FUNC_NEXTNUM_FMT',203); // function 'nextnum' requires.... +define('MSG_DER_FUNC_EXT_FMT',204); // function 'ext' requires.... +define('MSG_DER_FUNC1_FMT',205); // function 'FUNC' requires.... +define('MSG_DER_FUNC_SUBSTR_FMT',206); // function 'substr' requires.... + +define('MSG_USER_ATTACK_JUNK',220); // The following input ... +define('MSG_USER_ATTACK_REV_CAP',221); // Your input ... +define('MSG_USER_ATTACK_DUP',222); // You have ... +define('MSG_USER_ATTACK_MANY_URLS',223); // Your input ... +define('MSG_USER_ATTACK_MANY_URL_FIELDS',224); // Your input ... + +define('MSG_INVALID_EMAIL',230); // The email address...is invalid + +// @formatter:on +// Jump to: + +// +// Return true if using the built-in language +// +/** @noinspection PhpUnused */ +function IsBuiltInLanguage() +{ + global $sLangID; + + return (strpos($sLangID,"builtin") !== false); +} + +$sSavePath = ""; +$bPathSaved = false; +// +// Set include path to include the given directory. +// +function AddIncludePath($s_dir = ".") +{ + global $sSavePath,$bPathSaved; + + $s_path = ini_get('include_path'); + $i_path_len = strlen($s_path); + $s_sep = IsServerWindows() ? ";" : ":"; // get path separator + // + // look for it in the include_path + // + $b_found = false; + $i_pos = 0; + $i_len = strlen($s_dir); + while (!$b_found && ($i_pos = strpos($s_path,$s_dir,$i_pos)) !== false) { + if ($i_pos == 0) { + if ($i_len == $i_path_len) { + $b_found = true; + } // the path only has $s_dir + elseif ($s_path[$i_len] == $s_sep) { + $b_found = true; + } + } elseif ($s_path[$i_pos - 1] == $s_sep && + ($i_pos + $i_len == $i_path_len || + $s_path[$i_pos + $i_len] == $s_sep) + ) { + $b_found = true; + } + if (!$b_found) { + $i_pos++; + } + } + if (!$b_found) { + // + // allow multiple calls, but only store the original path once + // + if (!$bPathSaved) { + $sSavePath = $s_path; + } + if (empty($s_path)) { + $s_path = $s_dir; + } else + // + // prepend the directory + // + { + $s_path = $s_dir . $s_sep . $s_path; + } + ini_set('include_path',$s_path); + $bPathSaved = true; + } +} + +// +// Reset the include path after a call to AddIncludePath. +// +function ResetIncludePath() +{ + global $sSavePath,$bPathSaved; + + if ($bPathSaved) { + ini_set('include_path',$sSavePath); + $bPathSaved = false; + } +} + +// +// Load a language file +// +function LoadLanguageFile() +{ + global $aMessages,$sLangID,$sHTMLCharSet; + + AddIncludePath(); + if (!@include("language.inc.php")) { + @include("language.inc"); + } + ResetIncludePath(); + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + header("Content-Type: text/html; charset=$sHTMLCharSet"); + } +} + +// +// Load the messages array from the default language, and then +// override with an optional language file. +// Note: all messages get the MNUM parameter sent which they can use. +// If they don't use it, the message number is appended. +// +function LoadBuiltinLanguage() +{ + global $aMessages,$sLangID; + + $sLangID = "English (builtin)"; + // MSG_SCRIPT_VERSION is shown if the PHP version is too old to run + // FormMail + // Parameters: + // $PHPREQ is the minimum required PHP version + // $PHPVERS is the version the server currently has installed. + $aMessages[MSG_SCRIPT_VERSION] = 'This script requires at least PHP version ' . + '$PHPREQ. You have PHP version $PHPVERS.'; + + // MSG_END_VERS_CHK is sent at the end of an Alert message when + // FormMail detects that there's a newer version available + // Parameters: none + $aMessages[MSG_END_VERS_CHK] = '***************************************************\n' . + 'If you are happy with your current version and want\n' . + 'to stop these reminders, edit formmail.php and\n' . + 'set CHECK_FOR_NEW_VERSION to false.\n' . + '***************************************************\n'; + + // MSG_VERS_CHK is sent in an Alert message when + // FormMail detects that there's a newer version available + // Parameters: + // $TECTITE the website to go to + // $FM_VERS the current FormMail version + // $NEWVERS the new FormMail version that's available + $aMessages[MSG_VERS_CHK] = 'A later version of FormMail is available from $TECTITE.\n' . + 'You are currently using version $FM_VERS.\n' . + 'The new version available is $NEWVERS.\n'; + + // MSG_CHK_FILE_ERROR is sent in an Alert message when + // FormMail cannot create a file to record the time of version check. + // Parameters: + // $FILE the file name that could not be created + // $ERROR the actual error message + $aMessages[MSG_CHK_FILE_ERROR] = 'Unable to create check file "$FILE": $ERROR'; + + // MSG_UNK_VALUE_SPEC is sent in an Alert message when + // a form uses an unknown value specification in derive_fields. + // Parameters: + // $SPEC the unknown value specification + // $MSG additional message + $aMessages[MSG_UNK_VALUE_SPEC] = 'derive_fields: unknown value specification ' . + '"$SPEC"$MSG'; + + // MSG_INV_VALUE_SPEC is sent in an Alert message when + // a form uses a value specification in derive_fields that's + // formatted incorrectly (missing terminating '%') + // Parameters: + // $SPEC the invalid value specification + $aMessages[MSG_INV_VALUE_SPEC] = 'derive_fields: invalid value specification ' . + '"$SPEC" (possibly missing a "%")'; + + // MSG_DERIVED_INVALID is sent in an Alert message when + // a form's derive_fields setting has errors + // Parameters: none + // A list of errors is appended on separate lines + $aMessages[MSG_DERIVED_INVALID] = 'Some derive_fields specifications are invalid $MNUM:\n'; + + // MSG_INT_FORM_ERROR is sent in an Alert message and displayed + // to the form user + // Parameters: none + $aMessages[MSG_INT_FORM_ERROR] = 'Internal form error'; + + // MSG_OPTIONS_INVALID is sent in an Alert message when + // a form's options settings are invalid. This applies to + // mail_options, filter_options, crm_options, and autorespond + // Parameters: + // $OPT the name of the options field + // A list of errors is appended on separate lines + $aMessages[MSG_OPTIONS_INVALID] = 'Some $OPT settings are undefined $MNUM:\n'; + + // MSG_PLSWAIT_REDIR is shown to the user for a redirect + // with JavaScript + // Parameters: none + $aMessages[MSG_PLSWAIT_REDIR] = 'Please wait while you are redirected...'; + + // MSG_IFNOT_REDIR is shown to the user for a redirect + // with JavaScript + // Parameters: + // $URL the URL to redirect to + $aMessages[MSG_IFNOT_REDIR] = 'If you are not automatically redirected, ' . + 'please click here.'; + + // MSG_PEAR_OBJ is shown to the user if the PEAR Mail object + // cannot be created + // Parameters: none + $aMessages[MSG_PEAR_OBJ] = 'Failed to create PEAR Mail object'; + + // MSG_PEAR_ERROR is sent in an Alert message if the PEAR Mail processing + // reports an error + // Parameters: + // $MSG the error message from PEAR + $aMessages[MSG_PEAR_ERROR] = 'PEAR Mail error: $MSG'; + + // MSG_NO_FOPT_ADDR is sent in an Alert message SendMailFOption is + // specified in the form and no email address has been provided + // Parameters: none + $aMessages[MSG_NO_FOPT_ADDR] = 'You have specified "SendMailFOption" in your ' . + 'form, but there is no email address to use'; + + // MSG_MORE_INFO is sent in an Alert message on a line by itself, just + // before extra information about the FormMail processing that may have + // led to the alert message + // Parameters: none + $aMessages[MSG_MORE_INFO] = 'More information:'; + + // MSG_INFO_STOPPED is sent in an Alert message to say that extra + // alert information has been suppressed because of potential security + // problems with showing it. + // Parameters: none + $aMessages[MSG_INFO_STOPPED] = '(Extra alert information suppressed for ' . + 'security purposes. $MNUM)'; + + // MSG_FM_ALERT is sent as the subject line of an Alert message + // Parameters: none + $aMessages[MSG_FM_ALERT] = 'FormMail alert'; + + // MSG_FM_ERROR is sent as the subject line of an Alert message + // Parameters: none + $aMessages[MSG_FM_ERROR] = 'FormMail script error'; + + // MSG_FM_ERROR_LINE is sent in an Alert message on a + // separate line to introduce the actual error message + // Parameters: none + $aMessages[MSG_FM_ERROR_LINE] = 'The following error occurred in FormMail $MNUM:'; + + // MSG_USERDATA_STOPPED is sent in an Alert message to say that the + // user's data has been suppressed because of potential security + // problems with showing it. + // Parameters: none + $aMessages[MSG_USERDATA_STOPPED] = '(User data suppressed for security ' . + 'purposes. $MNUM)'; + + // MSG_FILTERED is sent in an Alert message to show what filter + // has been used on the message + // Parameters: + // $FILTER the name of the filter + $aMessages[MSG_FILTERED] = 'This alert has been filtered through "$FILTER" ' . + 'for security purposes.'; + + // MSG_TEMPLATES is sent in an Alert message when a form tries + // to use a template, but templates have not been configured in + // formmail.php + // Parameters: none + $aMessages[MSG_TEMPLATES] = 'You must set either TEMPLATEDIR or TEMPLATEURL ' . + 'in formmail.php before you can specify ' . + 'templates in your forms.'; + + // MSG_OPEN_TEMPLATE is sent in an Alert message when FormMail cannot + // open a template file + // Parameters: + // $NAME the name of the template file + // $ERROR information about the error + $aMessages[MSG_OPEN_TEMPLATE] = 'Failed to open template "$NAME" $MNUM: $ERROR'; + + // MSG_ERROR_PROC is shown to the user as part of an error + // page. This message introduces the error. + // Parameters: none + $aMessages[MSG_ERROR_PROC] = 'An error occurred while processing the ' . + 'form $MNUM.\n\n'; + + // MSG_ALERT_DONE is shown to the user as part of an error + // page if an Alert message has been sent to the website owner. + // Parameters: + // SERVER the name of the server (website) + $aMessages[MSG_ALERT_DONE] = 'The staff at $SERVER have been alerted to the error $MNUM.\n'; + + // MSG_PLS_CONTACT is shown to the user as part of an error + // page if an Alert message could *not* be sent to the website owner. + // Parameters: + // SERVER the name of the server (website) + $aMessages[MSG_PLS_CONTACT] = 'Please contact us ($SERVER) directly since this form ' . + 'is not working $MNUM.\n'; + + // MSG_APOLOGY is shown to the user as part of an error + // page as an apology for a problem with the form. + // Parameters: + // SERVER the name of the server (website) + $aMessages[MSG_APOLOGY] = '$SERVER apologizes for any inconvenience this error ' . + 'may have caused.'; + + // MSG_ABOUT_FORMMAIL is shown to the user at the foot of pages + // generated by FormMail (e.g. the default "Thanks" page and default + // error page). + // Parameters: + // $FM_VERS the FormMail version number + // $TECTITE www.tectite.com + $aMessages[MSG_ABOUT_FORMMAIL] = 'Your form submission was processed by ' . + 'FormMail ' . + '($FM_VERS), a PHP script available from ' . + '$TECTITE.'; + + // MSG_PREG_FAILED is sent in an Alert message if the TectiteCRM + // system failed to return the expected result. + // Parameters: none + $aMessages[MSG_PREG_FAILED] = 'preg_match_all failed in FindCRMFields'; + + // MSG_URL_INVALID is sent in an Alert message if the specified + // URL for TectiteCRM is not valid according to the TARGET_URLS + // configuration setting + // Parameters: + // $URL the invalid URL + $aMessages[MSG_URL_INVALID] = 'The URL "$URL" to access the Customer ' . + 'Relationship Management System is not valid ' . + '(see TARGET_URLS in formmail.php)'; + + // MSG_URL_OPEN is sent in an Alert message if the specified + // URL for TectiteCRM cannot be opened + // Parameters: + // $URL the invalid URL + // $ERROR information about the error + $aMessages[MSG_URL_OPEN] = 'Failed to open Customer Relationship ' . + 'Management System URL "$URL" $MNUM: $ERROR'; + + // MSG_CRM_FAILED is sent in an Alert message if the TectiteCRM + // system doesn't return an OK message + // Parameters: + // $URL the invalid URL + // $MSG more information + $aMessages[MSG_CRM_FAILED] = 'Failure report from Customer Relationship ' . + 'Management System (url="$URL") $MNUM: $MSG'; + + // MSG_CRM_FORM_ERROR is shown to the user if the information + // passed to TectiteCRM was not accepted + // Parameters: none + $aMessages[MSG_CRM_FORM_ERROR] = 'Your form submission was not accepted'; + + // MSG_AND is shown to the user; it shows two items separated + // by "and" + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_AND] = '"$ITEM1" and "$ITEM2"'; + + // MSG_OR is shown to the user; it shows two items separated + // by "or" + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_OR] = '"$ITEM1" or "$ITEM2"'; + + // MSG_NOT_BOTH is shown to the user; it shows two items that must + // be specified together + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_NOT_BOTH] = 'not both "$ITEM1" and "$ITEM2"'; + + // MSG_XOR is shown to the user; it shows two items that must + // not be specified together + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_XOR] = '"$ITEM1" or "$ITEM2" (but not both)'; + + // MSG_IS_SAME_AS is shown to the user; it shows two items that must + // not be the same value + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_IS_SAME_AS] = '"$ITEM1" is the same as "$ITEM2"'; + + // MSG_IS_NOT_SAME_AS is shown to the user; it shows two items that must + // be the same value + // Parameters: + // $ITEM1 the first item + // $ITEM2 the second item + $aMessages[MSG_IS_NOT_SAME_AS] = '"$ITEM1" is not the same as "$ITEM2"'; + + // MSG_REQD_OPER is sent in an Alert message when an unknown + // operator has been used in a "required" specification + // Parameters: + // $OPER the unknown operator + $aMessages[MSG_REQD_OPER] = 'Operator "$OPER" is not valid for "required"'; + + // MSG_PAT_FAILED is sent in an Alert message when a "conditions" pattern + // match has not matched anything (this isn't necessarily an error) + // Parameters: + // $OPER the "conditions" operator + // $PAT the "conditions" pattern + // $VALUE the value that was searched + $aMessages[MSG_PAT_FAILED] = 'Pattern operator "$OPER" failed: pattern ' . + '"$PAT", value searched was "$VALUE".'; + + // MSG_COND_OPER is sent in an Alert message when a "conditions" + // operator is not value + // Parameters: + // $OPER the "conditions" operator + $aMessages[MSG_COND_OPER] = 'Operator "$OPER" is not valid for "conditions"'; + + // MSG_INV_COND is sent in an Alert message when a "conditions" + // field is not valid + // Parameters: + // FLD the field name + $aMessages[MSG_INV_COND] = 'Invalid "conditions" field "$FLD" - not a string or array.'; + + // MSG_COND_CHARS is sent in an Alert message when a "conditions" + // field is missing the mandatory first 2 characters (the separators) + // Parameters: + // FLD the field name + // COND the conditions field value + $aMessages[MSG_COND_CHARS] = 'The conditions field "$FLD" is not valid. ' . + 'You must provide the two separator ' . + 'characters at the beginning. You had "$COND".'; + + // MSG_COND_INVALID is sent in an Alert message when a "conditions" + // field has the wrong format + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the internal separator character for the field. + $aMessages[MSG_COND_INVALID] = 'The conditions field "$FLD" is not valid. ' . + 'There must be at least 5 components ' . + 'separated by "$SEP". Your value was "$COND".'; + + // MSG_COND_TEST_LONG is sent in an Alert message when a "conditions" + // TEST value has too many components + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the list separator character for the field. + $aMessages[MSG_COND_TEST_LONG] = 'Field "$FLD" has too many components for ' . + 'a "TEST" command: "$COND".\nAre you missing ' . + 'a "$SEP"?'; + + // MSG_COND_IF_SHORT is sent in an Alert message when a "conditions" + // IF value has too few components + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the internal separator character for the field. + $aMessages[MSG_COND_IF_SHORT] = 'Field "$FLD" has too few components for ' . + 'an "IF" command: "$COND".\nThere must be ' . + 'at least 6 components separated by "$SEP"'; + + // MSG_COND_IF_LONG is sent in an Alert message when a "conditions" + // IF value has too many components + // Parameters: + // FLD the field name + // COND the conditions field value + // SEP the list separator character for the field. + $aMessages[MSG_COND_IF_LONG] = 'Field "$FLD" has too many components for ' . + 'an "IF" command: "$COND".\nAre you missing ' . + 'a "$SEP"?'; + + // MSG_COND_UNK is sent in an Alert message when a "conditions" + // value has an unknown command + // Parameters: + // FLD the field name + // COND the conditions field value + // CMD the unknown command + $aMessages[MSG_COND_UNK] = 'Field "$FLD" has an unknown command word ' . + '"$CMD": "$COND".'; + + // MSG_MISSING is sent in an Alert message when + // a socket filter is incorrectly defined + // Parameters: + // ITEM the missing item + $aMessages[MSG_MISSING] = 'Missing "$ITEM"'; + + // MSG_NEED_ARRAY is sent in an Alert message when + // a socket filter is incorrectly defined + // Parameters: + // ITEM the item that should be an array + $aMessages[MSG_NEED_ARRAY] = '"$ITEM" must be an array'; + + // MSG_SUBM_FAILED is shown to the user when an internal error + // as occurred and that error is not to be shown + // Parameters: none + $aMessages[MSG_SUBM_FAILED] = 'Your form submission has failed due to ' . + 'an error on our server.'; + + // MSG_FILTER_WRONG is sent in an Alert message when + // a socket filter is incorrectly defined + // Parameters: + // FILTER the filter name + // ERRORS a string containing a list of errors + $aMessages[MSG_FILTER_WRONG] = 'Filter "$FILTER" is not properly defined: ' . + '$ERRORS'; + + // MSG_FILTER_CONNECT is sent in an Alert message when FormMail + // cannot connect to a socket filter + // Parameters: + // FILTER the filter name + // SITE the site + // ERRNUM socket error number + // ERRSTR socket error message + $aMessages[MSG_FILTER_CONNECT] = 'Could not connect to site "$SITE" ' . + 'for filter "$FILTER" ($ERRNUM): $ERRSTR'; + + // MSG_FILTER_PARAM is sent in an Alert message when a socket + // filter has an invalid parameter specification + // Parameters: + // FILTER the filter name + // NUM parameter number + // NAME parameter name + $aMessages[MSG_FILTER_PARAM] = 'Filter "$FILTER" has invalid parameter ' . + '#$NUM: no "$NAME"'; + + // MSG_FILTER_OPEN_FILE is sent in an Alert message when a socket + // filter cannot open the required file + // Parameters: + // FILTER the filter name + // FILE the file that could not be opened + // ERROR the error message + $aMessages[MSG_FILTER_OPEN_FILE] = 'Filter "$FILTER" cannot open file ' . + '"$FILE": $ERROR'; + + // MSG_FILTER_FILE_ERROR is sent in an Alert message when a socket + // filter gets an error message during reading a file + // Parameters: + // FILTER the filter name + // FILE the file that could not be opened + // ERROR the error message + // NLINES the number of lines that were read successfully + $aMessages[MSG_FILTER_FILE_ERROR] = 'Filter "$FILTER": read error on file ' . + '"$FILE" after $NLINES lines: $ERROR'; + + // MSG_FILTER_READ_ERROR is sent in an Alert message when a socket + // filter gets an error during reading from the socket + // Parameters: + // FILTER the filter name + // ERROR the error message + $aMessages[MSG_FILTER_READ_ERROR] = 'Filter "$FILTER" failed: read error: ' . + '$ERROR'; + + // MSG_FILTER_NOT_OK is sent in an Alert message when a socket + // filter fails to return the agreed __OK__ indicator + // Parameters: + // FILTER the filter name + // DATA the data returned from the filter + $aMessages[MSG_FILTER_NOT_OK] = 'Filter "$FILTER" failed (missing ' . + '__OK__ line): $DATA'; + + // MSG_FILTER_UNK is sent in an Alert message + // when an unknown filter is specified by a form + // Parameters: + // FILTER the filter name + $aMessages[MSG_FILTER_UNK] = 'Unknown filter "$FILTER"'; + + // MSG_FILTER_CHDIR is sent in an Alert message + // when FormMail cannot change to the filter's directory + // Parameters: + // FILTER the filter name + // DIR the directory name + // ERROR an error message from the system + $aMessages[MSG_FILTER_CHDIR] = 'Cannot chdir to "$DIR" to run filter ' . + '"$FILTER": $ERROR'; + + // MSG_FILTER_NOTFOUND is sent in an Alert message + // when FormMail cannot execute the filter + // Parameters: + // FILTER the filter name + // CMD the command line being executed + // ERROR an error message from the system + $aMessages[MSG_FILTER_NOTFOUND] = 'Cannot execute filter "$FILTER" with ' . + 'command "$CMD": $ERROR'; + + // MSG_FILTER_ERROR is sent in an Alert message + // when a filter returns a non-zero status + // Parameters: + // FILTER the filter name + // ERROR an error message from the system + // STATUS the status return from the command + $aMessages[MSG_FILTER_ERROR] = 'Filter "$FILTER" failed (status $STATUS): ' . + '$ERROR'; + + // MSG_SPARE is a spare message + $aMessages[MSG_SPARE] = ''; + + // MSG_TEMPLATE_ERRORS is sent as part of an Alert message + // when a template has generated some errors. The message + // should end with a new line and the actual errors are + // output after it. + // Parameters: + // NAME the template name + $aMessages[MSG_TEMPLATE_ERRORS] = 'Template "$NAME" caused the ' . + 'following errors $MNUM:\n'; + + // MSG_TEMPLATE_FAILED is sent in an Alert message + // when processing a template has failed. + // Parameters: + // NAME the template name + $aMessages[MSG_TEMPLATE_FAILED] = 'Failed to process template "$NAME"'; + + // MSG_MIME_PREAMBLE is sent in the preamble of MIME emails + // Parameters: none + $aMessages[MSG_MIME_PREAMBLE] = '(Your mail reader should not show this ' . + 'text.\nIf it does you may need to ' . + 'upgrade to more modern software.)'; + + // MSG_MIME_HTML is sent in the preamble of HTML emails + // Parameters: + // NAME the template name + $aMessages[MSG_MIME_HTML] = 'This message has been generated by FormMail ' . + 'using an HTML template\ncalled "$NAME". The ' . + 'raw text of the form results\nhas been ' . + 'included below, but your mail reader should ' . + 'display the HTML\nversion only (unless it\'s ' . + 'not capable of doing so).'; + + // MSG_FILE_OPEN_ERROR is sent in an Alert message when FormMail + // cannot open a file + // Parameters: + // NAME the file name + // TYPE the type of file + // ERROR the system error message + $aMessages[MSG_FILE_OPEN_ERROR] = 'Failed to open $TYPE file "$NAME": $ERROR'; + + // MSG_ATTACH_DATA is sent in an Alert message when the file + // attachment through 'data' has gone wrong. + // Parameters: none + $aMessages[MSG_ATTACH_DATA] = 'Internal error: AttachFile requires ' . + '"tmp_name" or "data"'; + + // MSG_PHP_HTML_TEMPLATES is sent in an Alert message when an + // HTML template is used but the PHP version is too old. (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_HTML_TEMPLATES] = ''; + + // MSG_PHP_FILE_UPLOADS is sent in an Alert message when + // file upload is used but the PHP version is too old. (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_FILE_UPLOADS] = ''; + + // MSG_FILE_UPLOAD is sent in an Alert message when + // file upload is attempted but FormMail is not configured to allow + // it + // Parameters: none + $aMessages[MSG_FILE_UPLOAD] = 'File upload attempt ignored'; + + // MSG_FILE_UPLOAD_ATTACK is sent in an Alert message when + // possible file upload attack is detected + // Parameters: + // NAME file name + // TEMP temporary file name + // FLD name of the file upload field + $aMessages[MSG_FILE_UPLOAD_ATTACK] = 'Possible file upload attack ' . + 'detected: field="$FLD", name="$NAME" ' . + 'temp name="$TEMP"'; + + // MSG_PHP_PLAIN_TEMPLATES is sent in an Alert message when a + // Plain template is used but the PHP version is too old. (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_PLAIN_TEMPLATES] = ''; + + // MSG_ATTACH_NAME is sent in an Alert message when a + // the form uses the Attach feature without specifying a file name + // Parameters: none + $aMessages[MSG_ATTACH_NAME] = 'filter_options: Attach must contain a name ' . + '(e.g. Attach=data.txt)'; + + // MSG_PHP_BCC is sent in an Alert message when a + // the form uses the BCC feature and the PHP version may not support it + // (deprecated) + // Parameters: + // $PHPVERS the current PHP version + $aMessages[MSG_PHP_BCC] = ''; + + // MSG_CSVCOLUMNS is sent in an Alert message when a csvcolumns field + // is not correct + // Parameters: + // $VALUE the csvcolumns field value + $aMessages[MSG_CSVCOLUMNS] = 'The "csvcolumns" setting is not ' . + 'valid: "$VALUE"'; + + // MSG_CSVFILE is sent in an Alert message when a csvfile field + // is not correct + // Parameters: + // $VALUE the csvfile field value + $aMessages[MSG_CSVFILE] = 'The "csvfile" setting is not valid: "$VALUE"'; + + // MSG_TARG_EMAIL_PAT_START is sent in an Alert message when a + // $TARGET_EMAIL pattern is insecure because of a missing '^' + // at the beginning + // Parameters: + // $PAT the pattern + $aMessages[MSG_TARG_EMAIL_PAT_START] = 'Warning: Your TARGET_EMAIL pattern ' . + '"$PAT" is missing a ^ at the ' . + 'beginning.'; + + // MSG_TARG_EMAIL_PAT_END is sent in an Alert message when a + // $TARGET_EMAIL pattern is insecure because of a missing '$' + // at the end + // Parameters: + // $PAT the pattern + $aMessages[MSG_TARG_EMAIL_PAT_END] = 'Warning: Your TARGET_EMAIL pattern ' . + '"$PAT" is missing a $ at the end.'; + + // MSG_CONFIG_WARN is sent in an Alert message when the FormMail + // configuration may have some problems. The messages are + // passed on separate lines, so the line terminations below + // are important. + // Parameters: + // $MESGS lines of messages + $aMessages[MSG_CONFIG_WARN] = 'The following potential problems were found ' . + 'in your configuration:\n$MESGS\n\n' . + 'These are not necessarily errors, but you ' . + 'should review the documentation\n' . + 'inside formmail.php. If you are sure your ' . + 'configuration is correct\n' . + 'you can disable the above messages by ' . + 'changing the CONFIG_CHECK settings.'; + + // MSG_PHP_AUTORESP is sent in an Alert message when the PHP version + // does not support autoresponding (deprecated) + // Parameters: + // $PHPVERS current PHP version + $aMessages[MSG_PHP_AUTORESP] = ''; + + // MSG_ALERT is the test alert message (formmail.php?testalert=1) + // Parameters: + // $LANG the language ID + // $PHPVERS PHP version + // $FM_VERS FormMail version + // $SERVER server type + // $DOCUMENT_ROOT PHP's DOCUMENT_ROOT value + // $SCRIPT_FILENAME PHP's SCRIPT_FILENAME value + // $PATH_TRANSLATED PHP's PATH_TRANSLATED value + // $REAL_DOCUMENT_ROOT the REAL_DOCUMENT_ROOT value + $aMessages[MSG_ALERT] = 'This is a test alert message $MNUM\n' . + 'Loaded language is $LANG\n' . + 'PHP version is $PHPVERS\n' . + 'FormMail version is $FM_VERS\n' . + 'Server type: $SERVER\n' . + '\n' . + 'DOCUMENT_ROOT: $DOCUMENT_ROOT\n' . + 'SCRIPT_FILENAME: $SCRIPT_FILENAME\n' . + 'PATH_TRANSLATED: $PATH_TRANSLATED\n' . + 'REAL_DOCUMENT_ROOT: $REAL_DOCUMENT_ROOT'; + + // MSG_NO_DEF_ALERT is displayed if you use the testalert feature + // and no DEF_ALERT setting has been provided. + // Parameters: none + $aMessages[MSG_NO_DEF_ALERT] = 'No DEF_ALERT value has been set.'; + + // MSG_TEST_SENT is displayed if when use the testalert feature + // Parameters: none + $aMessages[MSG_TEST_SENT] = 'Test message sent. Check your email.'; + + // MSG_TEST_FAILED is displayed if when use the testalert feature + // and the mail sending fails. + // Parameters: none + $aMessages[MSG_TEST_FAILED] = 'FAILED to send alert message. Check your ' . + 'server error logs.'; + + // MSG_NO_DATA_PAGE is the page that's displayed if the user + // just opens the URL to FormMail directly. + // Parameters: none + $aMessages[MSG_NO_DATA_PAGE] = 'This URL is a Form submission program.\n' . + 'It appears the form is not working ' . + 'correctly as there was no data found.\n' . + 'You\'re not supposed to browse to this ' . + 'URL; it should be accessed from a form.'; + + // MSG_REQD_ERROR is displayed to the user as a default error + // message when they haven't supplied some required fields + // Parameters: none + $aMessages[MSG_REQD_ERROR] = 'The form required some values that you ' . + 'did not seem to provide.'; + + // MSG_COND_ERROR is displayed to the user as a default error + // message when some form conditions have failed + // Parameters: none + $aMessages[MSG_COND_ERROR] = 'Some of the values you provided are not valid.'; + + // MSG_CRM_FAILURE is displayed to the user when submission + // to the CRM has failed. + // Parameters: + // $URL the URL that was used + // $DATA data returned from the CRM + $aMessages[MSG_CRM_FAILURE] = 'The form submission did not succeed due to ' . + 'a CRM failure. URL was \'$URL\'. ' . + 'Returned CRM data:\n$DATA'; + + // MSG_FOPTION_WARN is sent in an Alert message when the form + // uses the superseded SendMailFOption feature + // Parameters: + // $LINE line number for SENDMAIL_F_OPTION + $aMessages[MSG_FOPTION_WARN] = 'Warning: You\'ve used SendMailFOption in ' . + '"mail_options" in your form. This has been ' . + 'superseded with a configuration setting ' . + 'inside formmail.php. Please update your ' . + 'formmail.php configuration (look for ' . + 'SENDMAIL_F_OPTION on line $LINE) and set ' . + 'it to "true", then remove SendMailFOption ' . + 'from your form(s).'; + + // MSG_NO_ACTIONS is sent in an Alert message when there is no + // action to perform or email address to send to + // Parameters: none + $aMessages[MSG_NO_ACTIONS] = 'The form has an internal error - no actions ' . + 'or recipients were specified.'; + + // MSG_NO_RECIP is sent in an Alert message when there are no + // valid recipients to send to + // Parameters: none + $aMessages[MSG_NO_RECIP] = 'The form has an internal error - no valid ' . + 'recipients were specified.'; + + // MSG_INV_EMAIL is sent in an Alert message when there are errors + // in the email addresses specified in the form + // Parameters: + // $ERRORS list of errors + $aMessages[MSG_INV_EMAIL] = 'Invalid email addresses were specified ' . + 'in the form $MNUM:\n$ERRORS'; + + // MSG_FAILED_SEND is sent in an Alert message when the mail sending fails. + // Parameters: none + $aMessages[MSG_FAILED_SEND] = 'Failed to send email'; + + // MSG_ARESP_EMAIL is sent in an Alert message when + // no email address has been specified for an autoreponse + // Parameters: none + $aMessages[MSG_ARESP_EMAIL] = 'No "email" field was found. Autorespond ' . + 'requires the submitter\'s email address.'; + + // MSG_ARESP_SUBJ is the default subject for the auto response email + // Parameters: none + $aMessages[MSG_ARESP_SUBJ] = 'Your form submission'; + + // MSG_LOG_NO_VERIMG is written to the auto respond log file + // if no VerifyImgString session variable was found + // Parameters: none + $aMessages[MSG_LOG_NO_VERIMG] = 'No VerifyImgString or turing_string in session, ' . + 'no reverse CAPTCHA, no reCaptcha'; + + // MSG_ARESP_NO_AUTH is shown to the user + // if no VerifyImgString session variable was found + // Parameters: none + $aMessages[MSG_ARESP_NO_AUTH] = 'Failed to obtain authorization to send ' . + 'you email. This is probably a fault on ' . + 'the server.'; + + // MSG_LOG_NO_MATCH is written to the auto respond log file + // if the user's entry did not match the image verification + // Parameters: none + $aMessages[MSG_LOG_NO_MATCH] = 'User did not match image'; + + // MSG_LOG_RECAPTCHA is written to the auto respond log file + // if the reCaptcha process fails + // Parameters: + // ERR the reCaptcha error code + $aMessages[MSG_LOG_RECAPTCHA] = 'reCaptcha process failed ($ERR)'; + + // MSG_ARESP_NO_MATCH is shown to the user + // if the user's entry did not match the image verification + // Parameters: none + $aMessages[MSG_ARESP_NO_MATCH] = 'Your entry did not match the image'; + + // MSG_LOG_FAILED is written to the auto respond log file + // if the autoresponding failed + // Parameters: none + $aMessages[MSG_LOG_FAILED] = 'Failed'; + + // MSG_ARESP_FAILED is sent in an Alert message + // if the autoresponding failed + // Parameters: none + $aMessages[MSG_ARESP_FAILED] = 'Autoresponder failed'; + + // MSG_LOG_OK is written to the auto respond log file + // if the autoresponding succeeded + // Parameters: none + $aMessages[MSG_LOG_OK] = 'OK'; + + // MSG_THANKS_PAGE is the default page that's displayed if the + // submission is successful + // Parameters: none + $aMessages[MSG_THANKS_PAGE] = 'Thanks! We\'ve received your information ' . + 'and, if it\'s appropriate, we\'ll be in ' . + 'contact with you soon.'; + + // MSG_LOAD_MODULE is sent in an alert message if a module + // could not be loaded. + // Parameters: + // $FILE the file name + // $ERROR the error message + $aMessages[MSG_LOAD_MODULE] = 'Cannot load module from file \'$FILE\': $ERROR'; + + // MSG_LOAD_FMCOMPUTE is sent in an alert message if the form + // specifies at least one "fmcompute" field and the FMCompute + // module cannot be loaded. + // Parameters: + // $FILE the file name + // $ERROR the error message + $aMessages[MSG_LOAD_FMCOMPUTE] = 'Cannot load FMCompute module from file ' . + '\'$FILE\': $ERROR'; + + // MSG_REGISTER_MODULE is sent in an alert message if a module + // could not register with FMCompute + // Parameters: + // $NAME the name of the module + // $ERROR the error message + $aMessages[MSG_REGISTER_MODULE] = 'Cannot register module $NAME with ' . + 'FMCompute: $ERROR'; + + // MSG_COMP_PARSE is sent in an alert message if a parse error + // occurs in an fmcompute field + // Parameters: + // $CODE the code with an error + // $ERRORS the error messages + $aMessages[MSG_COMP_PARSE] = 'These parse errors occurred in the following ' . + 'code:\n$ERRORS\n$CODE'; + + // MSG_COMP_REG_DATA is sent in an alert message if FormMail cannot + // register a data field with the FMCompute module + // Parameters: + // $NAME the field name + // $ERROR the error message + $aMessages[MSG_COMP_REG_DATA] = 'Failed to register data field \'$NAME\': ' . + '$ERROR'; + + // MSG_COMP_ALERT is sent in an alert message if the FMCompute + // module has generated some alert messages. + // Parameters: + // $ALERTS the alerts + $aMessages[MSG_COMP_ALERT] = 'The following alert messages were reported ' . + 'from the FMCompute module: $ALERTS'; + + // MSG_COMP_DEBUG is sent in an alert message if the FMCompute + // module has generated some debug messages. + // Parameters: + // $DEBUG the alerts + $aMessages[MSG_COMP_DEBUG] = 'The following debug messages were reported ' . + 'from the FMCompute module: $DEBUG'; + + // MSG_COMP_EXEC is sent in an alert message if the FMCompute + // module has generated some error messages during execution + // Parameters: + // $ERRORS the errors + $aMessages[MSG_COMP_EXEC] = 'The following error messages were reported ' . + 'from the FMCompute module: $ERRORS'; + + // MSG_TEMPL_ALERT is sent in an alert message if Advanced Template + // Processing has generated some alert messages. + // Parameters: + // $ALERTS the alerts + $aMessages[MSG_TEMPL_ALERT] = 'The following alert messages were reported ' . + 'from the Advanced Template Processor: $ALERTS'; + + // MSG_TEMPL_DEBUG is sent in an alert message if Advanced Template + // Processing has generated some debug messages. + // Parameters: + // $DEBUG the alerts + $aMessages[MSG_TEMPL_DEBUG] = 'The following debug messages were reported ' . + 'from the Advanced Template Processor: $DEBUG'; + + // MSG_TEMPL_PROC is sent in an alert message if Advanced Template Processing + // has generated some error messages during processing + // Parameters: + // $ERRORS the errors + $aMessages[MSG_TEMPL_PROC] = 'The following error messages were reported ' . + 'from the Advanced Template Processor: $ERRORS'; + + // MSG_REG_FMCOMPUTE is sent in an Alert message when FormMail + // cannot register an external function with FMCompute. + // Parameters: + // FUNC the function that could not be registered + // ERROR the error message + $aMessages[MSG_REG_FMCOMPUTE] = 'Cannot register function "$FUNC" with ' . + 'FMCompute: $ERROR'; + + // MSG_USER_ERRORS is shown as part of a user error when an FMCompute + // has called the "UserError" function one or more times. + // Parameters: + // NONE + $aMessages[MSG_USER_ERRORS] = 'One or more errors occurred in your form submission'; + + // MSG_CALL_PARAM_COUNT is sent in an alert when a call to a FormMail + // function from FMCompute has the wrong number of parameters + // Parameters: + // FUNC the function name + // COUNT the actual number of parameters passed + $aMessages[MSG_CALL_PARAM_COUNT] = 'FMCompute called FormMail function ' . + '\'$FUNC\' with wrong number of ' . + 'parameters: $COUNT'; + + // MSG_CALL_UNK_FUNC is sent in an alert when FMCompute calls an + // unknown FormMail function + // Parameters: + // FUNC the function name + $aMessages[MSG_CALL_UNK_FUNC] = 'FMCompute called unknown FormMail function ' . + '\'$FUNC\''; + + // MSG_SAVE_FILE is sent in an alert when saving a file to + // the server has failed + // Parameters: + // FILE the source file name (usually a temporary file name) + // DEST the destination file name + // ERR the error message + $aMessages[MSG_SAVE_FILE] = 'Failed to save file \'$FILE\' to \'$DEST\': $ERR'; + + // MSG_SAVE_FILE_EXISTS is sent as part of an alert when saving a file to + // the repository ($FILE_REPOSITORY) has failed because the file + // already exists and FILE_OVERWRITE is set to false. + // Parameters: + // FILE the destination file name + $aMessages[MSG_SAVE_FILE_EXISTS] = 'Cannot save file to repository as this would ' . + 'overwrite \'$FILE\' and you have ' . + 'set FILE_OVERWRITE to false.'; + + // MSG_EMPTY_ADDRESSES is sent as part of an alert when a number of empty + // email addresses have been specified in recipients, cc, or bcc + // *and* there are no valid addresses provided + // in the list + // Parameters: + // COUNT the number of empty addresses + $aMessages[MSG_EMPTY_ADDRESSES] = '$COUNT empty addresses'; + + // MSG_CALL_INVALID_PARAM is sent in an alert when a call to a FormMail + // function from FMCompute has an invalid parameter + // Parameters: + // FUNC the function name + // PARAM the parameter number + // CORRECT information about correct values + $aMessages[MSG_CALL_INVALID_PARAM] = 'FMCompute called FormMail function ' . + '\'$FUNC\' with an invalid parameter ' . + 'number $PARAM. Correct values are: $CORRECT'; + + // MSG_INI_PARSE_WARN is sent in an alert when the INI file + // may have a syntax error and cannot be parsed. + // Parameters: + // FILE the file name + $aMessages[MSG_INI_PARSE_WARN] = 'Warning: your INI file \'$FILE\' appears ' . + 'to be empty. This may indicate a syntax error.'; + + // MSG_INI_PARSE_ERROR is shown as an error message when the INI file + // has a syntax error and cannot be parsed. + // Parameters: + // FILE the file name + $aMessages[MSG_INI_PARSE_ERROR] = 'The FormMail INI file \'$FILE\' has a syntax error'; + + // MSG_CHMOD is sent in an alert when changing the protection + // mode of a file to has failed + // Parameters: + // FILE the file name + // MODE the mode + // ERR the error message + $aMessages[MSG_CHMOD] = 'Failed to change protection mode of file \'$FILE\' ' . + 'to $MODE: $ERR'; + + // MSG_VERIFY_MISSING is shown to the user image verification string + // was not found + // Parameters: none + $aMessages[MSG_VERIFY_MISSING] = 'Image verification string missing. This' . + ' is probably a fault on the server.'; + + // MSG_VERIFY_MATCH is shown to the user + // if the user's entry did not match the image verification for the + // imgverify option + // Parameters: none + $aMessages[MSG_VERIFY_MATCH] = 'Your entry did not match the image'; + + // MSG_RECAPTCHA_MATCH is shown to the user + // if using the reCaptcha system and there was an error + // Parameters: + // ERR the error code from the reCaptcha API + $aMessages[MSG_RECAPTCHA_MATCH] = 'reCaptcha verification failed ($ERR)'; + + // MSG_FILE_NAMES_INVALID is sent in an Alert message when + // a form's file_names setting has errors + // Parameters: none + // A list of errors is appended on separate lines + $aMessages[MSG_FILE_NAMES_INVALID] = 'Some file_names specifications are invalid $MNUM:\n'; + + // MSG_FILE_NAMES_NOT_FILE is sent in an Alert message when + // a form's file_names setting refers to a file field that doesn't + // exist + // Parameters: + // NAME the name of the file field that doesn't exist + $aMessages[MSG_FILE_NAMES_NOT_FILE] = 'Your file_names specification has ' . + 'an error. \'$NAME\' is not the name ' . + 'of a file upload field\n'; + + // MSG_NEXT_PLUS_GOOD is sent in an alert message if the form is + // ambiguous and specifies both "next_form" and "good_url" or + // "good_template" + // Parameters: + // $WHICH the "good_" field that was specified + $aMessages[MSG_NEXT_PLUS_GOOD] = 'The form has specified both "next_form" ' . + 'and "$WHICH" fields - the action to ' . + 'to perform is ambiguous'; + + // MSG_MULTIFORM is sent in an Alert message when a form tries + // to use a multi-form template, but templates have not been configured in + // formmail.php + // Parameters: none + $aMessages[MSG_MULTIFORM] = 'You must set either MULTIFORMDIR or MULTIFORMURL ' . + 'in formmail.php before you can use ' . + 'multi-page forms.'; + + // MSG_MULTIFORM_FAILED is sent in an Alert message + // when processing a multi-page form template has failed. + // Parameters: + // NAME the template name + $aMessages[MSG_MULTIFORM_FAILED] = 'Failed to process multi-page form template "$NAME"'; + + // MSG_NEED_THIS_FORM is sent in an Alert message + // when a multi-page form does not specify the "this_form" field. + // Parameters: + // none + $aMessages[MSG_NEED_THIS_FORM] = 'Multi-page forms require "this_form" field'; + + // MSG_NO_PHP_SELF is sent in an Alert message + // when FormMail requires the "PHP_SELF" server variable and PHP is not + // providing it. + // Parameters: + // none + $aMessages[MSG_NO_PHP_SELF] = 'PHP on the server is not providing "PHP_SELF"'; + + // MSG_RETURN_URL_INVALID is sent in an Alert message + // when "this_form" is not a valid return URL. This occurs for + // multi-page forms. + // Parameters: + // URL the invalid URL + $aMessages[MSG_RETURN_URL_INVALID] = 'Return URL "$URL" is not valid'; + + // MSG_GO_BACK is sent in an Alert message + // when "multi_go_back" has been submitted but this isn't part of a + // multi-page form. + // Parameters: + // none + $aMessages[MSG_GO_BACK] = 'Cannot "go back" if not in a multi-page form ' . + 'sequence or at the first page of the form ' . + 'sequence'; + + // MSG_OPEN_URL is sent in an Alert message when a URL cannot + // be opened. + // Parameters: + // URL the invalid URL + // ERROR error message + $aMessages[MSG_OPEN_URL] = 'Cannot open URL "$URL": $ERROR'; + + // MSG_CANNOT_RETURN is sent in an Alert message when an invalid return + // request is made in a multi-page form sequence. + // Parameters: + // TO the requested page index + // TOPINDEX the top page index + $aMessages[MSG_CANNOT_RETURN] = 'Cannot return to page $TO. The top page ' . + 'index is $TOPINDEX'; + + // MSG_ATTACK_DETECTED is sent in an Alert message when an attack on + // the server has been detected + // Parameters: + // ATTACK name or description of the attack + // INFO more information about the attack + $aMessages[MSG_ATTACK_DETECTED] = 'Server attack "$ATTACK" detected. ' . + 'Your server is safe as FormMail is ' . + 'invulnerable to this attack. You can ' . + 'disable these messages by setting ' . + 'ALERT_ON_ATTACK_DETECTION to false ' . + 'in FormMail\'s configuration section.' . + '\nMore information:\n$INFO'; + + // MSG_ATTACK_PAGE is the contents of the browser page displayed to the + // user when an attack is detected + // Parameters: + // SERVER the name of the server (website) + // USERINFO details of the error + $aMessages[MSG_ATTACK_PAGE] = 'Your form submission has been rejected ' . + 'as it appears to be an abuse of our server (' . + '$SERVER).
    ' . + 'Our supplier of forms processing software has ' . + 'provided more information about this error.

    ' . + '$USERINFO'; + + // MSG_ATTACK_MIME_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the MIME attack + // Parameters: + // FLD name of the field + // CONTENT the invalid content found in the field + $aMessages[MSG_ATTACK_MIME_INFO] = 'The field "$FLD" contained invalid ' . + 'content "$CONTENT"'; + + // MSG_ATTACK_DUP_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Duplicate Data attack + // Parameters: + // FLD1 name of the first field + // FLD2 name of the second field + $aMessages[MSG_ATTACK_DUP_INFO] = 'The fields "$FLD1" and "$FLD2" contained ' . + 'duplicate data'; + + // MSG_ATTACK_SPEC_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Special Field attack + // Parameters: + // FLD name of the special field + $aMessages[MSG_ATTACK_SPEC_INFO] = 'Special field "$FLD" contained an email address'; + + // MSG_ATTACK_MANYURL_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Many URLs attack + // Parameters: + // FLD name of the field + // NUM number of URLs detected + $aMessages[MSG_ATTACK_MANYURL_INFO] = 'Field "$FLD" contained $NUM URLs'; + + // MSG_ATTACK_MANYFIELDS_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Many Fields with URLs + // attack + // Parameters: + // NUM number of fields detected with URLs + // FLDS list of fields with URLs in them + $aMessages[MSG_ATTACK_MANYFIELDS_INFO] = '$NUM fields contained URLs: $FLDS'; + + // MSG_REV_CAP is an error regarding the setting of ATTACK_DETECTION_REVERSE_CAPTCHA + // Parameters: none + $aMessages[MSG_REV_CAP] = 'ATTACK_DETECTION_REVERSE_CAPTCHA is not set correctly, ' . + 'and will be ignored. Please refer to the documentation ' . + 'to make the correct setting.'; + + // MSG_ATTACK_REV_CAP_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the Reverse Captcha attack + // detection + // Parameters: + // FLD name of the field + // CONTENT the invalid content found in the field + $aMessages[MSG_ATTACK_REV_CAP_INFO] = 'The field "$FLD" contained unexpected ' . + 'content "$CONTENT".'; + + // MSG_ATTACK_JUNK_INFO is the contents of the INFO parameter + // to the MSG_ATTACK_DETECTED message for the JUNK attack + // Parameters: + // FLD name of the field + // JUNK the junk that was found + $aMessages[MSG_ATTACK_JUNK_INFO] = 'The field "$FLD" contained junk ' . + 'data "$JUNK"'; + + // MSG_ARESP_EMPTY is an alert message sent when + // an autoresponse template or file is empty + // Parameters: + // TYPE the type of autoreponse requested + $aMessages[MSG_ARESP_EMPTY] = 'The autoresponse is empty. The form ' . + 'requested $TYPE'; + + // MSG_NEED_SCRATCH_PAD is an alert message when processing requires + // SCRATCH_PAD configuration for file upload processing. This occurs + // when you upload files in pages of a multi page form sequence. + // Parameters: + // none + $aMessages[MSG_NEED_SCRATCH_PAD] = 'You need to set SCRATCH_PAD in the ' . + 'configuration section to process ' . + 'uploaded files.'; + + // MSG_OPEN_SCRATCH_PAD is an alert message when the SCRATCH_PAD + // directory cannot be opened for cleanup. + // Parameters: + // DIR name of the directory + // ERR more error information + $aMessages[MSG_OPEN_SCRATCH_PAD] = 'Cannot open SCRATCH_PAD directory ' . + '"$DIR". Open failed: $ERR'; + + // MSG_NO_NEXT_NUM_FILE is an alert message when a form tries to + // use the %nextnum% derivation feature but you haven't + // setup FormMail's configuration correctly. + // Parameters: + // none + $aMessages[MSG_NO_NEXT_NUM_FILE] = 'You cannot use the %nextnum% feature: ' . + 'you have not configured NEXT_NUM_FILE'; + + // MSG_NEXT_NUM_FILE is an alert message when a form tries to + // use the %nextnum% derivation feature but the next number file cannot + // be processed. + // Parameters: + // FILE name of the file + // ACT action + // ERR more error information + $aMessages[MSG_NEXT_NUM_FILE] = 'Cannot $ACT next number file ' . + '\'$FILE\': $ERR'; + + // MSG_MULTI_UPLOAD is an alert message when processing of uploaded + // fails during a multi-page form sequence + // Parameters: + // none + $aMessages[MSG_MULTI_UPLOAD] = 'File upload processing failed during ' . + 'multi-page form processing.'; + + // MSG_URL_PARSE is an error message when a URL to be opened + // cannot be parsed + // Parameters: + // none + $aMessages[MSG_URL_PARSE] = 'Failed to parse URL'; + + // MSG_URL_SCHEME is an error message when a URL to be opened + // has an unsupported "scheme" value + // Parameters: + // SCHEME the scheme that was seen + $aMessages[MSG_URL_SCHEME] = 'Unsupported URL scheme "$SCHEME"'; + + // MSG_SOCKET is an error message when opening a socket for a URL + // fails + // Parameters: + // ERRNO the error code + // ERRSTR the error string + // PHPERR the value of $php_errormsg + $aMessages[MSG_SOCKET] = 'Socket error $ERRNO: $ERRSTR: $PHPERR'; + + // MSG_GETURL_OPEN is an error message when the web server reports + // a failure on opening a URL + // Parameters: + // STATUS the HTTP status value (number + string) + $aMessages[MSG_GETURL_OPEN] = 'Open URL failed: $STATUS URL=$URL'; + + // MSG_RESOLVE is an error message when a host name cannot be + // resolved to an IP address + // Parameters: + // NAME the host name that could not be resolved + $aMessages[MSG_RESOLVE] = 'Cannot resolve host name "$NAME"'; + + // MSG_FORM_OK is the page title for the default + // "thank you" page + // Parameters: + // none + $aMessages[MSG_FORM_OK] = 'Form Submission Succeeded'; + + // MSG_FORM_ERROR is the page title for default + // error pages + // Parameters: + // none + $aMessages[MSG_FORM_ERROR] = 'Form Submission Error'; + + // MSG_GET_DISALLOWED is the message shown when GET method is used + // but has been disabled. + // Parameters: + // none + $aMessages[MSG_GET_DISALLOWED] = 'GET method has been disabled. Forms must use ' . + 'the POST method. Alternatively, reconfigure ' . + 'FormMail to allow the GET method.'; + + // MSG_INVALID_SENDER is the alert message sent when an sender email address + // has been specified that is not a known or valid email address + // Parameters: + // LOC the location of the error + // EMAIL the invalid email address + $aMessages[MSG_INVALID_SENDER] = 'The form has specified an invalid sender email address ($EMAIL) in $LOC.'; + + // MSG_SET_SENDER_FROM_EMAIL is the configuration check message when SET_SENDER_FROM_EMAIL + // has been set to true in the configuration section. This feature is no longer available + // as can lead to a security problem. + // Parameters: + // none + $aMessages[MSG_SET_SENDER_FROM_EMAIL] = 'SET_SENDER_FROM_EMAIL is no longer supported and will be ignored.'; + + // MSG_FILE_UPLOAD_ERRn are the error messages corresponding to the + // PHP file upload error code n. + // Parameters: + // none + $aMessages[MSG_FILE_UPLOAD_ERR1] = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.'; + $aMessages[MSG_FILE_UPLOAD_ERR2] = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form.'; + $aMessages[MSG_FILE_UPLOAD_ERR3] = 'The uploaded file was only partially uploaded.'; + $aMessages[MSG_FILE_UPLOAD_ERR4] = 'No file was uploaded.'; + $aMessages[MSG_FILE_UPLOAD_ERR6] = 'Missing a temporary folder.'; + $aMessages[MSG_FILE_UPLOAD_ERR7] = 'Failed to write file to disk.'; + $aMessages[MSG_FILE_UPLOAD_ERR8] = 'File upload stopped by extension.'; + + // MSG_FILE_UPLOAD_ERR_UNK is displayed when an unknown error code + // is provided by PHP for a file upload + // Parameters: + // ERRNO the error code + $aMessages[MSG_FILE_UPLOAD_ERR_UNK] = 'Unknown file upload error code $ERRNO'; + + // MSG_FILE_UPLOAD_SIZE is displayed when an uploaded file exceeds + // the configured maximum size + // Parameters: + // NAME the uploaded file's name + // SIZE the size of the uploaded file + // MAX the maximum size that was exceeded + $aMessages[MSG_FILE_UPLOAD_SIZE] = 'Uploaded file "$NAME" is too big (' . + '$SIZE bytes). The maximum permitted ' . + 'size is $MAX kilobytes.'; + + // MSG_POST_SIZE_LIMIT is displayed when a form submission is larger + // than the configured maximum size in PHP + // Parameters: + // NAME the uploaded file's name + // SIZE the size of the uploaded file + // MAX the maximum size that was exceeded + $aMessages[MSG_POST_SIZE_LIMIT] = 'Your form submission exceeds the server\'s configured size limit.'; + + // MSG_DER_FUNC_ERROR is sent in an Alert message when + // a form uses a derive_fields function that's + // formatted incorrectly + // Parameters: + // $SPEC the invalid value specification + // $MSG a message describing the error or providing an example + $aMessages[MSG_DER_FUNC_ERROR] = 'derive_fields: invalid function specification ' . + '"$SPEC": $MSG'; + + // MSG_DER_FUNC_SIZE_FMT describes the right syntax for the "size" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_SIZE_FMT] = '"size" function requires this format: ' . + 'size(file_field)'; + + // MSG_DER_FUNC_IF_FMT describes the right syntax for the "if" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_IF_FMT] = '"if" function requires this format: ' . + 'if(field;spec;spec)'; + + // MSG_DER_FUNC_NEXTNUM_FMT describes the right syntax for the "nextnum" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_NEXTNUM_FMT] = '"nextnum" function requires this format: ' . + 'nextnum(pad) or nextnum(pad;base). pad and base ' . + 'must be numbers. base must be 2 to 36 inclusive'; + + // MSG_DER_FUNC_EXT_FMT describes the right syntax for the "ext" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_EXT_FMT] = '"ext" function requires this format: ' . + 'ext(file_field)'; + + // MSG_DER_FUNC1_FMT describes the right syntax for a function + // requiring one parameter + // Parameters: + // FUNC name of the function + $aMessages[MSG_DER_FUNC1_FMT] = '"$FUNC" function requires this format: ' . + '$FUNC(fieldname)'; + + // MSG_DER_FUNC_SUBSTR_FMT describes the right syntax for the "substr" function + // Parameters: + // none + $aMessages[MSG_DER_FUNC_SUBSTR_FMT] = '"substr" function requires this format: ' . + 'substr(fieldname;start) or ' . + 'substr(fieldname;start;length) - ' . + 'start and length must be numbers.'; + + // MSG_USER_ATTACK_JUNK is a message shown to the user when a junk + // attack has been detected + // Parameters: + // INPUT the data the user input + $aMessages[MSG_USER_ATTACK_JUNK] = 'The following input looks like a junk attack ' . + 'on our server. Please avoid scientific ' . + 'or technical terms with long sequences ' . + 'of consonants or vowels: $INPUT'; + + // MSG_USER_ATTACK_REV_CAP is a message shown to the user when a reverse + // captcha attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_REV_CAP] = 'Your input looks like an automated spambot ' . + 'attacking our server. Some automatic form ' . + 'fillers can trigger this detection. Try ' . + 'filling in our form manually. If you use the ' . + 'back button to go back, make sure you ' . + 'refresh the page before trying again.'; + + // MSG_USER_ATTACK_DUP is a message shown to the user when a duplicate + // data attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_DUP] = 'You have input the same information in ' . + 'several fields in the form. Please ' . + 're-submit the form without duplication'; + + // MSG_USER_ATTACK_MANY_URLS is a message shown to the user when a many urls + // attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_MANY_URLS] = 'Your input includes a number of URLs. ' . + 'This server has been configured to reject ' . + 'form submissions with too many URLs. ' . + 'Please re-submit the form without URLs or ' . + 'with fewer URLs.'; + + // MSG_USER_ATTACK_MANY_URL_FIELDS is a message shown to the user when a many urls + // attack has been detected + // Parameters: + // none + $aMessages[MSG_USER_ATTACK_MANY_URL_FIELDS] = $aMessages[MSG_USER_ATTACK_MANY_URLS]; + + $aMessages[MSG_INVALID_EMAIL] = 'The email address "$EMAIL" is not valid: $REASON'; +} // Jump to: + +// +// If the form submission was using the GET method, switch to the +// GET vars instead of the POST vars +// +if (isset($aServerVars["REQUEST_METHOD"]) && $aServerVars["REQUEST_METHOD"] === "GET") { + $bIsGetMethod = true; + if (Settings::get('ALLOW_GET_METHOD')) { + $aFormVars = &$_GET; + } elseif (count($_GET) > 0) { + $bHasGetData = true; + } +} + +// +// Load the default language, and then override with an optional language file. +// +function LoadLanguage() +{ + LoadBuiltinLanguage(); + LoadLanguageFile(); +} + +// +// To return the value of a string or empty string if not set. +// +function CheckString($ss) +{ + return (isset($ss) ? $ss : ""); +} + +$aGetMessageSubstituteErrors = array(); +$aGetMessageSubstituteFound = array(); +$bGetMessageSubstituteNoErrors = false; + +// +// Worker function for GetMessage's preg_replace_callback calls. +// Returns the value of the matched variable name. +// Variables are searched for in the global $aGetMessageValues. +// If no such variable exists, an empty string is returned and the +// global variable $aGetMessageSubstituteErrors lists the missing names. +// +function GetMessageSubstituteParam($a_matches) +{ + global $aGetMessageValues,$aGetMessageSubstituteErrors; + global $aGetMessageSubstituteFound,$bGetMessageSubstituteNoErrors; + + $s_name = $a_matches[1]; + $aGetMessageSubstituteFound[] = $s_name; + $s_value = ""; + if (isset($aGetMessageValues[$s_name])) { + $s_value = $aGetMessageValues[$s_name]; + } elseif ($bGetMessageSubstituteNoErrors) { + $s_value = '$' . $s_name; + } else { + $aGetMessageSubstituteErrors[] = $s_name; + } + return ($s_value); +} + +// +// Returns message text from a message number, with optional parameters. +// +function GetMessage($i_msg_num,$a_params = array(), + $b_show_mnum = true,$b_no_errors = false) +{ + global $aMessages,$sLangID; + + if (count($aMessages) == 0) { + LoadLanguage(); + } + if (!isset($aMessages[$i_msg_num])) { + SendAlert("Unknown Message Number $i_msg_num was used",false,true); + $s_text = ""; + } else { + $s_text = $aMessages[$i_msg_num]; + } + $s_mno = Settings::get('bShowMesgNumbers') ? "[M$i_msg_num]" : ""; + + $s_orig_text = $s_text; + // + // substitute parameters; only works with PHP version 4.0.5 or later + // + if (strpos($s_text,'$') !== false) { + global $aGetMessageValues,$aGetMessageSubstituteErrors; + global $aGetMessageSubstituteFound,$bGetMessageSubstituteNoErrors; + + $aGetMessageSubstituteErrors = array(); + $aGetMessageSubstituteFound = array(); + $aGetMessageValues = HTMLEntitiesArray($a_params,true); + $bGetMessageSubstituteNoErrors = $b_no_errors; + $aGetMessageValues["MNUM"] = $s_mno; // add the message number + // + // search for words in this form: + // $word + // where word begins with an alphabetic character and + // consists of alphanumeric and underscore + // + $s_text = preg_replace_callback('/\$([a-z][a-z0-9_]*)/i', + 'GetMessageSubstituteParam',$s_text); + if (count($aGetMessageSubstituteErrors) > 0) { + SendAlert("Message Number $i_msg_num ('$s_orig_text') in language $sLangID " . + "specified the following unsupported parameters: " . + implode(',',$aGetMessageSubstituteErrors)); + } + if (!in_array("MNUM",$aGetMessageSubstituteFound)) + // + // append the message number + // + { + $s_text .= $b_show_mnum ? " $s_mno" : ""; + } + } else + // + // append the message number + // + { + $s_text .= $b_show_mnum ? " $s_mno" : ""; + } + // + // replace '\n' sequences with new lines + // + return (str_replace('\n',"\n",$s_text)); +} + +// +// Check if the server is Windows +// +function IsServerWindows() +{ + static $bGotAnswer = false; + static $bAnswer; + + if (!$bGotAnswer) { + if ((isset($_ENV["OS"]) && stristr($_ENV["OS"],"windows") !== false) || + (isset($_SERVER["PATH"]) && stristr($_SERVER["PATH"],"winnt") !== false) || + (isset($_SERVER["PATH"]) && stristr($_SERVER["PATH"],"windows") !== false) || + (isset($_SERVER["SystemRoot"]) && stristr($_SERVER["SystemRoot"],"winnt") !== false) || + (isset($_ENV["SystemRoot"]) && stristr($_ENV["SystemRoot"],"winnt") !== false) || + (isset($_SERVER["SystemRoot"]) && stristr($_SERVER["SystemRoot"],"windows") !== false) || + (isset($_ENV["SystemRoot"]) && stristr($_ENV["SystemRoot"],"windows") !== false) || + (isset($_SERVER["Path"]) && stristr($_SERVER["Path"],"windows") !== false) + ) { + $bAnswer = true; + } else { + $bAnswer = false; + } + $bGotAnswer = true; + } + return ($bAnswer); +} + +// +// To return a temporary file name from $SCRATCH_PAD +// +function GetScratchPadFile($s_prefix) +{ + + switch (substr(Settings::get('SCRATCH_PAD'),-1)) { + case '/': + case '\\': + $s_dir = substr(Settings::get('SCRATCH_PAD'),0,-1); + break; + default: + $s_dir = Settings::get('SCRATCH_PAD'); + break; + } + // + // Ideally, we could use tempnam. But, + // tempnam is system dependent and might not use the + // SCRATCH_PAD directory even if we tell it to. + // So, we'll force the file into SCRATCH_PAD. + // + // Note that we do *not* create the file, even though tempnam + // does create it in PHP version 4.0.3 and above. (The reason is + // we can't guarantee a non-race condition anyway.) + // + do { + $i_rand = mt_rand(0,16777215); // 16777215 is FFFFFF in hex + $s_name = $s_dir . "/" . $s_prefix . sprintf("%06X",$i_rand); + } while (file_exists($s_name)); + return ($s_name); +} + +// +// To return a temporary file name. +// +function GetTempName($s_prefix) +{ + if (!Settings::isEmpty('SCRATCH_PAD')) { + $s_name = GetScratchPadFile($s_prefix); + } else { + $s_name = tempnam("/tmp",$s_prefix); + } + return ($s_name); +} + +// +// To find a directory on the server for temporary files. +// +function GetTempDir() +{ + $s_name = GetTempName("fm"); + if (file_exists($s_name)) { + unlink($s_name); + } + $s_dir = dirname($s_name); + return ($s_dir); +} + +define('DEBUG',false); // for production +//define('DEBUG',true); // for development and debugging +define('RFCLINELEN',76); // recommend maximum line length from RFC 2822 + +// +// The user agent string to use when opening URLs +// +$sUserAgent = "FormMail/$FM_VERS (from www.tectite.com)"; + +if (DEBUG) { + error_reporting(E_ALL); // trap everything! + ini_set("display_errors","stdout"); + ini_set("display_startup_errors","1"); + assert_options(ASSERT_ACTIVE,true); + assert_options(ASSERT_BAIL,true); + LoadLanguage(); +} else { + $iOldLevel = error_reporting(E_ALL ^ E_WARNING); + LoadLanguage(); + // + // report everything except warnings and notices + // + error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE); +} + +function SetRealDocumentRoot() +{ + global $aServerVars,$REAL_DOCUMENT_ROOT; + + if (isset($aServerVars['SCRIPT_FILENAME'])) { + $REAL_DOCUMENT_ROOT = $aServerVars['SCRIPT_FILENAME']; + } elseif (isset($aServerVars['PATH_TRANSLATED'])) { + $REAL_DOCUMENT_ROOT = $aServerVars['PATH_TRANSLATED']; + } else { + $REAL_DOCUMENT_ROOT = ""; + } + // + // look for 'www' or 'public_html' and strip back to that if found, + // otherwise just get the directory name + // + if (($i_pos = strpos($REAL_DOCUMENT_ROOT,"/www/")) !== false) { + $REAL_DOCUMENT_ROOT = substr($REAL_DOCUMENT_ROOT,0,$i_pos + 4); + } elseif (($i_pos = strpos($REAL_DOCUMENT_ROOT,"/public_html/")) !== false) { + $REAL_DOCUMENT_ROOT = substr($REAL_DOCUMENT_ROOT,0,$i_pos + 12); + } elseif (!empty($REAL_DOCUMENT_ROOT)) { + $REAL_DOCUMENT_ROOT = dirname($REAL_DOCUMENT_ROOT); + } elseif (isset($aServerVars['DOCUMENT_ROOT']) && + !empty($aServerVars['DOCUMENT_ROOT']) + ) { + $REAL_DOCUMENT_ROOT = $aServerVars['DOCUMENT_ROOT']; + } +} + +// +// Hook system: before initialization (but after configuration) +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpreinit.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpreinit.inc"); + } +} + +if (!Settings::isEmpty('SESSION_NAME')) { + session_name(Settings::get('SESSION_NAME')); +} + +/** + * Session data access + * + * @param $s_name + * + * @return mixed null session variable's value or null if not set + */ +function GetSession($s_name) +{ + return (isset($_SESSION) ? $_SESSION[$s_name] : null); +} + +/** + * Session data isset + * + * @param $s_name + * + * @return boolean true if the given session variable is set + */ +function IsSetSession($s_name) +{ + return (isset($_SESSION) && isset($_SESSION[$s_name])); +} + +/** + * Session data setting + * + * Sets the given session variable to the given value. + * + * @param $s_name string + * name of the session variable + * @param $m_value mixed + * value to set + */ +function SetSession($s_name,$m_value) +{ + $_SESSION[$s_name] = $m_value; +} + +/** + * Session data un-setting + * + * Unsets the given session variable. + * + * @param $s_name string + * name of the session variable + */ +function UnsetSession($s_name) +{ + $_SESSION[$s_name] = null; + unset($_SESSION[$s_name]); +} + +function ZapSession() +{ + global $aSessionVarNames; + + if (Settings::get('DESTROY_SESSION')) { + if (session_id() != '') { + session_destroy(); + } + } else { + foreach ($aSessionVarNames as $s_var_name) { + UnsetSession($s_var_name); + } + } +} + +$bReverseCaptchaCompleted = false; // records whether ATTACK_DETECTION_REVERSE_CAPTCHA has been completed successfully +session_start(); + +// +// Hook system: after session initialization +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostsess.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostsess.inc"); + } +} + +// +// This array lists the private variables used by FormMail. +// We use the names here to cleanup the session when FormMail has +// finished its processing. +// +$aSessionVarNames = array("FormError","FormErrorInfo","FormErrorCode", + "FormErrorItems","FormData","FormIsUserError", + "FormAlerted","FormSavedFiles","FormIndex", + "FormList","FormKeep","VerifyImgString", + "turing_string" +); + +UnsetSession("FormError"); // start with no error +UnsetSession("FormErrorInfo"); // start with no error +UnsetSession("FormErrorCode"); // start with no error +UnsetSession("FormErrorItems"); // start with no error +UnsetSession("FormData"); // start with no data +UnsetSession("FormIsUserError"); // start with no data +UnsetSession("FormAlerted"); // start with no data + +// +// Note that HTTP_REFERER is easily spoofed, so there's no point in +// using it for security. +// + +// +// SPECIAL_FIELDS is the list of fields that formmail.php looks for to +// control its operation +// +$SPECIAL_FIELDS = array( + "email", // email address of the person who filled in the form + "realname", // the real name of the person who filled in the form + "recipients", // comma-separated list of email addresses to which we'll send the results + "cc", // comma-separated list of email addresses to which we'll CC the results + "bcc", // comma-separated list of email addresses to which we'll BCC the results + "replyto", // comma-separated list of email addresses to whom replies should be sent + "required", // comma-separated list of fields that must be found in the input + "conditions", // complex condition tests + "fmcompute", // computations + "fmmodules", // list of modules required + "fmmode", // mode of operation + "mail_options", // comma-separated list of options + "good_url", // URL to go to on success + "good_template", // template file to display on success + "bad_url", // URL to go to on error + "bad_template", // template file to display on error + "template_list_sep", // separator when expanding lists in templates + "this_form", // the URL of the form (can be used by bad_url) + "subject", // subject for the email + "env_report", // comma-separated list of environment variables to report + "filter", // a supported filter to use + "filter_options", // options for using the filter + "filter_fields", // list of fields to filter (default is to filter all fields) + "filter_files", // list of file fields to filter (default is to filter no file fields) + "logfile", // log file to write to + "csvfile", // file to write CSV records to + "csvcolumns", // columns to save in the csvfile + "crm_url", // URL for sending data to the CRM; note that the + // value must have a valid prefix specified in TARGET_URLS + "crm_spec", // CRM specification (field mapping) + "crm_options", // comma-separated list of options to control CRM processing + "derive_fields", // a list of fields to derive from other fields + "file_names", // specifies names for files being uploaded + "autorespond", // specification for auto-responding + "arverify", // verification field to allow auto-responding + "imgverify", // verification field to allow submission + "multi_start", // set this field on the first page of a multi-page form sequence + "multi_keep", // set this field on the pages of a multi-page form sequence + // to the list of fields that should be kept when moving + // forward after going backwards + "next_form", // next form name or empty for last form + "multi_go_back", // this field should be set when the user clicks the + // back button or link in a multi-page form sequence + "alert_to", // email address to send alerts (errors) to + // + // fields for reCaptcha implementation + // + "recaptcha_response_field", // verification field to allow submission + "recaptcha_challenge_field", // challenge field + // + // reCaptcha version 2 + // + "g-recaptcha-response", +); + +// +// $SPECIAL_MULTI is the list of fields from $SPECIAL_FIELDS that can +// have multiple values, for example: +// name="conditions1" +// name="conditions2" +// +$SPECIAL_MULTI = array( + "conditions", + "fmcompute", +); + +// +// $SPECIAL_ARRAYS is the list of fields from $SPECIAL_FIELDS that can +// be submitted as arrays of values, for example: +// +// +$SPECIAL_ARRAYS = array( + "recipients", + "cc", + "bcc", + "replyto", +); + +// +// $SPECIAL_NOSTRIP is the list of fields from $SPECIAL_FIELDS that +// should not be stripped (other than for magic_quotes_gpc reasons). +// +$SPECIAL_NOSTRIP = array( + "conditions", + "fmcompute", + "recaptcha_response_field", + "recaptcha_challenge_field", + "g-recaptcha-response", + "arverify", + "imgverify", +); + +// +// VALID_MAIL_OPTIONS lists the valid mail_options words +// +$VALID_MAIL_OPTIONS = array( + "AlwaysEmailFiles" => true, + "AlwaysList" => true, + "CharSet" => true, + "DupHeader" => true, + "Exclude" => true, + "FromAddr" => true, + "FromLineStyle" => true, + "HTMLTemplate" => true, + "KeepLines" => true, + "NoEmpty" => true, + "NoPlain" => true, + "PlainTemplate" => true, + "SendMailFOption" => true, + "StartLine" => true, + "TemplateMissing" => true, +); + +// +// VALID_CRM_OPTIONS lists the valid crm_options words +// +$VALID_CRM_OPTIONS = array( + "ErrorOnFail" => true, +); + +// +// VALID_AR_OPTIONS lists the valid autorespond words +// +$VALID_AR_OPTIONS = array( + "Subject" => true, + "HTMLTemplate" => true, + "PlainTemplate" => true, + "TemplateMissing" => true, + "PlainFile" => true, + "HTMLFile" => true, + "FromAddr" => true, + "FromName" => true +); + +// +// VALID_FILTER_OPTIONS lists the valid filter_options words +// +$VALID_FILTER_OPTIONS = array( + "Attach" => true, + "KeepInLine" => true, + "CSVHeading" => true, + "CSVSep" => true, + "CSVIntSep" => true, + "CSVQuote" => true, + "CSVEscPolicy" => true, + "CSVRaw" => true, +); + +// +// SPECIAL_VALUES is set to the value of the fields we've found +// usage: $SPECIAL_VALUES["email"] is the value of the email field +// +$SPECIAL_VALUES = array(); +// +// Array of mail options; set by the function 'ProcessMailOptions' +// +$MAIL_OPTS = array(); +// +// Array of crm options; set by the function 'ProcessCRMOptions' +// +$CRM_OPTS = array(); +// +// Array of autorespond options; set by the function 'ProcessAROptions' +// +$AR_OPTS = array(); +// +// Array of filter options; set by the function 'ProcessFilterOptions' +// +$FILTER_OPTS = array(); + +// +// initialise $SPECIAL_VALUES so that we don't fail on using unset values +// +foreach ($SPECIAL_FIELDS as $sFieldName) { + $SPECIAL_VALUES[$sFieldName] = ""; +} + +// +// Defaults for some special fields.... +// +$SPECIAL_VALUES['template_list_sep'] = ","; + +// +// FORMATTED_INPUT contains the input variables formatted nicely +// This is used for error reporting and debugging only. +// +$FORMATTED_INPUT = array(); + +// +// $FILTER_ATTRIBS_LOOKUP is the parsed $FILTER_ATTRIBS array +// +$FILTER_ATTRIBS_LOOKUP = array(); + +// +// BuiltinFunctions provides additional functions that can be called via derive_fields +// +class BuiltinFunctions +{ + private $_aFunctions; + + function __construct() + { + $this->_aFunctions = array(); + } + + /** + * Adds a builtin function. + * + * @param string $s_name name of the function + * @param string $n_params number of parameters the function expects + */ + public function Add($s_name,$n_params) + { + $this->_aFunctions[$s_name] = array('nparams' => $n_params); + } + + /** + * Calls a builtin function. + * + * @param string $s_name name of the function + * @param array $a_params list of parameters + * @param string &$s_result result of the function or error message + * + * @return boolean true on success, otherwise false + */ + public function Call($s_name,$a_params,&$s_result) + { + if (!isset($this->_aFunctions[$s_name])) { + $s_result = "Function '$s_name' is not a builtin function"; + return (false); + } + $a_func = $this->_aFunctions[$s_name]; + if (count($a_params) != $a_func['nparams']) { + $s_result = "Function '$s_name' expects " . $a_func['nparams'] . " parameters, " . count($a_params) . + " given."; + return (false); + } + $s_result = call_user_func_array($s_name,$a_params); + return (true); + } +} + +$BuiltinFunctions = new BuiltinFunctions(); + +$reCaptchaProcessor = null; +if (Settings::get('RECAPTCHA_PRIVATE_KEY') !== "") { + // + // Assume version 1 unless g-recaptcha-response is found in the form data. + // If we cannot load recaptchalib, then we assume it's version 2. + // + $bRecaptchaVersion = 1; + if (isset($aFormVars['g-recaptcha-response']) && $aFormVars['g-recaptcha-response'] != '') { + $bRecaptchaVersion = 2; + } + if ($bRecaptchaVersion == 1 && !@include_once("recaptchalib.php")) { + $bRecaptchaVersion = 2; + } + + if ($bRecaptchaVersion == 2) { + if (!function_exists('json_decode')) { + SendAlert("reCaptcha version 2 requires PHP version 5.2.0 or later",false,false); + } + + /* + * Class: reCaptchaWrapper + * Description: + * Wraps processing of reCaptcha version 2. + */ + + class reCaptchaWrapperV2 + { + var $_sPrivate; // the private key + var $_bDone; // true when done + var $_Resp; // the response from reCaptcha + + /* + * Method: reCaptchaWrapperV2 ctor + * Parameters: $s_priv the private key + * Returns: n/a + * Description: + * Initializes the wrapper ready to process reCaptcha. + */ + function __construct($s_priv) + { + $this->_sPrivate = $s_priv; + $this->_bDone = false; + } + + /** + * Try to contact Google reCaptcha. + * PHP version 5.6.2 has problems with sockets, so this may fail with PHP 5.6.2. + * + * @param string $s_response the reCaptcha response. + */ + function _askGoogle($s_response) + { + $s_url = 'https://www.google.com/recaptcha/api/siteverify'; + + $a_post_data = array( + 'secret' => $this->_sPrivate, + 'response' => $s_response + ); + if (isset($_SERVER['REMOTE_ADDR'])) { + $a_post_data['remoteip'] = $_SERVER['REMOTE_ADDR']; + } + + FMDebug('Posting to google reCaptcha'); + $recaptcha = new HTTPPost($s_url); + $a_resp_lines = $recaptcha->Post($a_post_data); + + if ($a_resp_lines === false) { + FMDebug('reCaptcha via HTTPPost socket failed'); + $s_resp = '{"success":false,"error-codes":["reCaptcha failed"]}'; + } else { + $s_resp = implode('',$a_resp_lines); + FMDebug('reCaptcha via HTTPPost socket succeeded: ' . $s_resp); + } + /** @noinspection PhpComposerExtensionStubsInspection */ + $this->_Resp = json_decode($s_resp,true); + } + + /* + * Method: reCaptchaWrapper::Check + * Parameters: $s_response the reCaptcha response value + * $a_values field values + * $s_error returns the reCaptcha error code + * Returns: bool true on success, otherwise false + * Description: + * Performs the reCaptcha check and caches the result so it's + * only done once. + */ + function Check($s_response,$a_values,&$s_error) + { + if (!$this->_bDone) { + $this->_askGoogle($s_response); + } + $this->_bDone = true; + $s_error = ""; + if (!$this->_Resp['success']) { + if (!isset($this->_Resp['error-codes']) || count($this->_Resp['error-codes']) == 0 || + !$this->_Resp['error-codes'][0] + ) { + $s_error = 'verification failed (error not specified)'; + } else { + $s_error = $this->_Resp['error-codes'][0]; + } + } + return ($this->_Resp['success']); + } + } + + $reCaptchaProcessor = new reCaptchaWrapperV2(Settings::get('RECAPTCHA_PRIVATE_KEY')); + } else { + + /* + * Class: reCaptchaWrapper + * Description: + * Wraps processing of reCaptcha version 1. + */ + + class reCaptchaWrapper + { + var $_sPrivate; // the private key + var $_bDone; // true when done + var $_Resp; // the response from reCaptcha + + /* + * Method: reCaptchaWrapper ctor + * Parameters: $s_priv the private key + * Returns: n/a + * Description: + * Initializes the wrapper ready to process reCaptcha. + */ + function __construct($s_priv) + { + $this->_sPrivate = $s_priv; + $this->_bDone = false; + } + + /* + * Method: reCaptchaWrapper::Check + * Parameters: $s_response the reCaptcha response value + * $a_values field values + * $s_error returns the reCaptcha error code + * Returns: bool true on success, otherwise false + * Description: + * Performs the reCaptcha check and caches the result so it's + * only done once. + */ + function Check($s_response,$a_values,&$s_error) + { + if (!$this->_bDone) { + /** @noinspection PhpUndefinedFunctionInspection */ + $this->_Resp = recaptcha_check_answer($this->_sPrivate, + $_SERVER["REMOTE_ADDR"], + $a_values["recaptcha_challenge_field"], + $s_response); + } + $this->_bDone = true; + $s_error = ""; + if (!$this->_Resp->is_valid) { + $s_error = $this->_Resp->error; + } + return ($this->_Resp->is_valid); + } + } + + $reCaptchaProcessor = new reCaptchaWrapper(Settings::get('RECAPTCHA_PRIVATE_KEY')); + } +} + +/** + * Contains a list of valid email addresses and + * email address patterns. Provides methods for checking the validity of an + * email address. + */ +class EmailChecker +{ + + var $_aAddresses; // valid email addresses (as keys) + var $_aTargetPatterns; // valid email address patterns + + /** + * Constructs the object. + * + * @param array $a_aliases + * @param array $a_patterns an array of email address patterns + */ + function __construct($a_aliases = array(),$a_patterns = array()) + { + $this->_aAddresses = array(); + $this->_aTargetPatterns = $a_patterns; + foreach ($a_aliases as $s_list) { + $this->AddAddresses($s_list); + } + } + + /** + * Adds an email address to the list of valid * email addresses. + * + * @param string $s_addr an email address + */ + function AddAddress($s_addr) + { + $this->_aAddresses[$s_addr] = true; + } + + /** + * Adds a comma-separated list of email addresses to the list of valid email addresses. + * + * @param string $s_list a list of email addresses + */ + function AddAddresses($s_list) + { + $a_addrs = TrimArray(explode(",",$s_list)); + foreach ($a_addrs as $s_addr) { + $this->AddAddress($s_addr); + } + } + + /** + * Checks an email address for validity. + * + * @param string $s_email an email address + * + * @return boolean true if the address is valid, otherwise false + */ + function CheckAddress($s_email) + { + $b_is_valid = false; + if (isset($this->_aAddresses[$s_email])) { + $b_is_valid = true; + } else { + for ($ii = 0 ; $ii < count($this->_aTargetPatterns) ; $ii++) { + // + // prepend / with \ + // + $s_pat = "/" . str_replace('/','\\/',$this->_aTargetPatterns[$ii]) . "/i"; + if (preg_match($s_pat,$s_email)) { + $b_is_valid = true; + break; + } + } + } + return ($b_is_valid); + } +} + +// +// Create the object for checking emails +// +$ValidEmails = new EmailChecker(Settings::get('EMAIL_ADDRS'),Settings::get('TARGET_EMAIL')); + +/** + * Class SpecialFieldsManager + * + * Encapsulate storage and access to special fields. + * + * NOTE: this is initial code implemented in version 9.17 and is not complete. + * It's part of our transition to a more complete Object Oriented code base + * which is targeted for version 9.??. + */ +class SpecialFieldsManager +{ + /** + * list of special field names + * + * @var array + */ + private $_aFieldNames; + + /** + * list of special field names that can have multiple values by a numeric suffic + * + * @var array + */ + private $_aMultiFieldNames; + + /** + * list of special field names that can be arrays + * + * @var array + */ + private $_aArrayFieldNames; + + /** + * list of special field names that must be used in raw format (not cleaned/stripped) + * + * @var array + */ + private $_aRawFieldNames; + + /** + * list of field values keyed by field name + * + * @var array + */ + private $_aValues; + + function __construct($a_field_names,$a_multi_field_names,$a_array_field_names,$a_raw_field_names) + { + $this->_aFieldNames = $a_field_names; + $this->_aMultiFieldNames = $a_multi_field_names; + $this->_aArrayFieldNames = $a_array_field_names; + $this->_aRawFieldNames = $a_raw_field_names; + } + + public static function getCleanEmail($s_email) + { + if (function_exists('filter_var')) { + return filter_var($s_email,FILTER_VALIDATE_EMAIL) === false ? '' : $s_email; + } else { + // basic email pattern if filter_var is not available + return preg_match('/^[a-z0-9]+@[a-z\.]+$/i',$s_email) ? $s_email : ''; + } + } +} + +// TODO implement this! +//$SpecialFields = new SpecialFieldsManager($SPECIAL_FIELDS,$SPECIAL_MULTI,$SPECIAL_ARRAYS,$SPECIAL_NOSTRIP); + +/** + * Class FieldManager + * + * Encapsulates storage and lookup of field data. + * + * NOTE: this is initial code implemented in version 8.27 and is not complete. + * It's part of our transition to a more complete Object Oriented code base + * which is targeted for version 9.??. + */ +class FieldManager +{ + + /** + * list of fields keyed by field name + * + * @var array + */ + private $_aFields; + + /** + * list of file fields keyed by field name (not currently used) + * + * @var array + */ + private $_aFileFields; + + /** + * last array separator specified + * + * @var string + */ + private $_sArraySep; + + /** + * array separator to use (after substitutions) + * + * @var string + */ + private $_sArraySepValue; + + /** + * counter for unique generation + * + * @var int + */ + private $_nUnique; + + /** + * Constructs the object. + * + * @param array $a_fields list of fields + * @param array $a_file_fields list of file fields + */ + public function __construct($a_fields = array(),$a_file_fields = array()) + { + $this->_sArraySepValue = $this->_sArraySep = ""; + $this->_aFields = $this->_aFileFields = array(); + $this->_nUnique = 0; + $this->Init($a_fields,$a_file_fields); + } + + public function GetFields() + { + return $this->_aFields; + } + + /** + * Initializes the object with the field data. + * + * @param array $a_fields list of fields + * @param array $a_file_fields list of file fields + * + * @return void + */ + public function Init($a_fields = array(),$a_file_fields = array()) + { + $this->_aFields = $a_fields; + $this->_aFileFields = $a_file_fields; + } + + /** + * Return a field value. + * Empty string is returned if the field is + * not found. File fields return the original name of the uploaded file. + * + * @param string $s_fld name of the field + * @param string $s_array_sep string to use to separate array values + * + * @return string the field's value + */ + public function GetFieldValue($s_fld,$s_array_sep = ";") + { + if (!isset($this->_aFields[$s_fld])) { + if (($s_value = $this->GetFileName($s_fld)) === false) { + $s_value = ""; + } + } else { + if (is_array($this->_aFields[$s_fld])) { + $s_value = implode($this->_GetArraySep($s_array_sep),$this->_aFields[$s_fld]); + } else { + $s_value = (string)$this->_aFields[$s_fld]; + } + } + return ($s_value); + } + + /** + * Return a field value. + * Empty string is returned if the field is + * not found. File fields return the original name of the uploaded file. + * The returned value is HTML-safe. + * b_text_subs performs text substitutions on the field value + * that are not affected by HTML-safety replacement. This means + * + * @param string $s_fld name of the field + * @param bool $b_text_subs perform text substitutions + * @param string $s_array_sep string to use to separate array values + * + * @return string the field's value + * @uses $TEXT_SUBS can be used to force allowance of particular HTML tags. Note + * that b_text_subs is not yet implemented for array * field + * values. + * + */ + public function GetSafeFieldValue($s_fld,$b_text_subs = false,$s_array_sep = ";") + { + // + // for array values, insert the array separator after making + // the individual values HTML-safe + // The equivalent logic up to and including version 8.24 used + // htmlspecialchars not htmlentities. + // The use of htmlentities broke UTF-8 template processing, + // and this was reported in version 8.28. + // By specifying the character set, we trigger the use of + // htmlspecialchars + // so the logic is equivalent to the old logic. + // + if (isset($this->_aFields[$s_fld]) && is_array($this->_aFields[$s_fld])) { + $s_value = implode($this->_GetArraySep($s_array_sep), + HTMLEntitiesArray($this->_aFields[$s_fld],false, + GetMailOption("CharSet"))); + } else { + if (!isset($this->_aFields[$s_fld])) { + if (($s_name = $this->GetFileName($s_fld)) === false) { + $s_name = ""; + } + $s_value = $s_name; + } else { + $s_value = (string)$this->_aFields[$s_fld]; + } + if ($b_text_subs) { + list ($s_value,$a_subs_data) = $this->_PrepareTextSubstitute($s_value); + } + $s_value = FixedHTMLEntities($s_value,GetMailOption("CharSet")); + if ($b_text_subs) { + $s_value = $this->_CompleteTextSubstitute($s_value,$a_subs_data); + } + } + return ($s_value); + } + + /** + * Prepares a value for text substitution using $TEXT_SUBS. + * + * @param string $s_value + * the value to perform substitutions on + * + * @return array [0]=>the processed value, [1]=>array of substitution data + */ + private function _PrepareTextSubstitute($s_value) + { + $a_subs_data = array(); + $a_text_subs = Settings::get('TEXT_SUBS'); + for ($ii = 0 ; $ii < count($a_text_subs) ; $ii++) { + $a_match_data = array(); + if (($n_matches = preg_match_all($a_text_subs[$ii]["srch"],$s_value,$a_matches, + PREG_OFFSET_CAPTURE)) !== false && $n_matches > 0 + ) { + $a_match_data["srch"] = $a_text_subs[$ii]["srch"]; + $a_match_data["repl"] = $a_text_subs[$ii]["repl"]; + $s_value = $this->_HTMLSafeSubstitute($s_value,$a_matches,$a_match_data); + } + $a_subs_data[$ii] = $a_match_data; + } + return (array($s_value,$a_subs_data)); + } + + /** + * Completes text substitution started by _PrepareTextSubstitute. + * + * @param string $s_value + * the value to perform substitutions on + * @param array $a_subs_data + * data that describes the substitutions to perform + * + * @return string the new value + */ + private function _CompleteTextSubstitute($s_value,$a_subs_data) + { + // + // because later substitutions can capture earlier ones, + // we have to process them all in reverse order + // + for ($ii = count($a_subs_data) ; --$ii >= 0 ;) { + $a_subs_list = $a_subs_data[$ii]; + for ($jj = count($a_subs_list) ; --$jj >= 0 ;) { + $s_code = $a_subs_list[$jj]["code"]; + $s_subs = $a_subs_list[$jj]["subs"]; + $s_value = str_replace($s_code,$s_subs,$s_value); + } + } + return ($s_value); + } + + /** + * Generates a unique string from a base string + * + * @param string $s_base + * a base of the unique string + * + * @return string a unique string + */ + private function _MakeUniqueString($s_base) + { + $n_uniq = $this->_nUnique++; + return ($s_base . "_" . str_pad("$n_uniq",5,"0",STR_PAD_LEFT)); + } + + /** + * Performs a temporary substitution on a string of the given matches with + * the given replacement specification. + * This makes the replacement using + * a special indicator string that can be substituted for the real value + * later. This allows non-replaced parts of the string to be processed + * and made safe for HTML entities, without affecting our actual + * replacements. + * + * @param string $s_value + * the string to substitute + * @param array $a_matches + * list of matches and offsets from preg_match_all + * @param array $a_match_data + * contains some data, and returns replacement data for the + * temporary substitution + * + * @return string the temporarily substituted string + */ + private function _HTMLSafeSubstitute($s_value,$a_matches,&$a_match_data) + { + $a_matches = $a_matches[0]; // we're only interested in the full pattern + // matches + $s_srch = $a_match_data["srch"]; + $s_repl = $a_match_data["repl"]; + + // + // to preserve offsets, we must process the string in reverse order + // of the matches; since we don't assume the array is ordered + // by ascending offset, we'll sort it now + // + usort($a_matches,function ($a,$b) { + return $b[1] - $a[1]; + }); + $a_match_data = array(); + for ($ii = 0 ; $ii < count($a_matches) ; $ii++) { + $s_match = $a_matches[$ii][0]; + $i_offset = $a_matches[$ii][1]; + $i_len = strlen($s_match); + + $s_subs = preg_replace($s_srch,$s_repl,$s_match); + // + // the code string must e HTML safe so it doesn't get altered + // before we can replace it; we use ! at the edges so that + // other patterns can successfully match word boundaries + // An improvement would be to determine the type of characters + // at the edges of the matched string, then choose the substitution + // edges accordingly. + // + $s_code = "!" . $this->_MakeUniqueString("SUBS") . "!"; + $a_match_data[$ii] = array("subs" => $s_subs,"code" => $s_code); + + $s_value = substr($s_value,0,$i_offset) . $s_code . substr($s_value,$i_offset + $i_len); + } + return ($s_value); + } + + /** + * Test if a field is set in the $_aFields array or in the uploaded + * files. + * + * @param string $s_fld name of the field + * + * @return bool true if the field has a value + */ + public function IsFieldSet($s_fld) + { + if (isset($this->_aFields[$s_fld])) { + return (true); + } + if (Settings::get('FILEUPLOADS')) { + if (isset($this->_aFileFields[$s_fld])) { + return (true); + } + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + if (isset($a_saved_files[$s_fld])) { + return (true); + } + } + } + return (false); + } + + public static function GetFileUploadErrorMesg($n_error) + { + $s_mesg = ''; + switch ($n_error) { + case 0: // no error + break; + case 1: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR1); + break; + case 2: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR2); + break; + case 3: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR3); + break; + case 4: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR4); + break; + case 6: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR6); + break; + case 7: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR7); + break; + case 8: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR8); + break; + default: + $s_mesg = GetMessage(MSG_FILE_UPLOAD_ERR_UNK,array("ERRNO" => $n_error)); + break; + } + return $s_mesg; + } + + /** + * Tests a field against the $_aFields array for emptiness. + * If the var isn't found there, then the POSTed files array is checked. + * Returns true if the field is empty (a specific error may + * be returned in the $s_mesg parameter). + * + * @param string $s_fld name of the field + * @param string $s_mesg returns an error message, where possible + * + * @return bool true if the field is empty + */ + public function TestFieldEmpty($s_fld,&$s_mesg) + { + $s_mesg = ""; + $b_empty = TRUE; + if (!isset($this->_aFields[$s_fld])) { + // + // Each file var is an array with these elements: + // "name" => The original name of the file on the client machine. + // "type" => The mime type of the file, if the browser provided this + // information. + // "tmp_name" => The temporary filename of the file in which the + // uploaded file was stored on the server. + // "error" => The error code associated with this file upload. + // NOTE: "error" was added in PHP 4.2.0 + // "size" => The size, in bytes, of the uploaded file. + // + // Error codes (the constants are only available from PHP 4.3.0 so + // we have to use the raw numbers): + // UPLOAD_ERR_OK + // Value: 0; There is no error, the file uploaded with success. + // UPLOAD_ERR_INI_SIZE + // Value: 1; The uploaded file exceeds the upload_max_filesize + // directive in php.ini. + // UPLOAD_ERR_FORM_SIZE + // Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive + // that was specified in the html form. + // UPLOAD_ERR_PARTIAL + // Value: 3; The uploaded file was only partially uploaded. + // UPLOAD_ERR_NO_FILE + // Value: 4; No file was uploaded. + // + if (Settings::get('FILEUPLOADS')) { + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + if (isset($a_saved_files[$s_fld])) { + $a_upload = $a_saved_files[$s_fld]; + } elseif (isset($this->_aFileFields[$s_fld])) { + $a_upload = $this->_aFileFields[$s_fld]; + } + } elseif (isset($this->_aFileFields[$s_fld])) { + $a_upload = $this->_aFileFields[$s_fld]; + } + } + if (isset($a_upload)) { + if (isset($a_upload["tmp_name"]) && !empty($a_upload["tmp_name"]) && + isset($a_upload["name"]) && !empty($a_upload["name"]) + ) { + if ($this->_IsUploadedFile($a_upload)) { + $b_empty = false; + } + } + if ($b_empty && isset($a_upload["error"])) { + $s_mesg = FieldManager::GetFileUploadErrorMesg($a_upload["error"]); + } + } + } else { + $b_empty = FieldManager::IsEmpty($this->_aFields[$s_fld]); + } + return ($b_empty); + } + + /** + * Same as "empty" but checks for true emptiness if ZERO_IS_EMPTY is + * set to false. + * + * @param string $s_value the value to test + * + * @return bool true if the value is "empty" + */ + public static function IsEmpty($s_value) + { + if (Settings::get('ZERO_IS_EMPTY') || is_array($s_value)) { + return (empty($s_value)); + } else { + return ($s_value === ""); + } + } + + /** + * Makes substitutions on strings as specified in the configuration setting $TEXT_SUBS. + * + * @param string $s_str a string on which to perform substitutions + * + * @return string the string, substituted + */ + public static function Substitute($s_str) + { + + $a_srch = $a_repl = array(); + foreach (Settings::get('TEXT_SUBS') as $a_sub) { + if (isset($a_sub["srch"]) && isset($a_sub["repl"]) && $a_sub["srch"] !== "") { + $a_srch[] = $a_sub["srch"]; + $a_repl[] = $a_sub["repl"]; + } + } + return (preg_replace($a_srch,$a_repl,$s_str)); + } + + /** + * Computes the array separation string. + * $s_sep is subject to + * substitutions specified in $TEXT_SUBS, and then returned. + * + * @param string $s_sep the string specified for array separations + * + * @return string the string to use for array separations + */ + private function _GetArraySep($s_sep) + { + // + // check for cached (previously calculated) value + // + if ($s_sep !== $this->_sArraySep) { + $this->_sArraySep = $s_sep; + $this->_sArraySepValue = FieldManager::Substitute($this->_sArraySep); + } + return ($this->_sArraySepValue); + } + + /** + * Return the info for the uploaded file, or false on error. + * + * @param string $s_fld field name + * + * @return bool + */ + public function GetFileInfo($s_fld) + { + if (Settings::get('FILEUPLOADS')) { + // + // Must look at new file uploads first. + // + if (isset($this->_aFileFields[$s_fld]) && !empty($this->_aFileFields[$s_fld])) { + $a_upload = $this->_aFileFields[$s_fld]; + } elseif (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + if (isset($a_saved_files[$s_fld])) { + $a_upload = $a_saved_files[$s_fld]; + } + } + } + if (isset($a_upload)) { + if (isset($a_upload["tmp_name"]) && !empty($a_upload["tmp_name"]) && + isset($a_upload["name"]) && !empty($a_upload["name"]) && + $this->_IsUploadedFile($a_upload) + ) { + return ($a_upload); + } + } + return (false); + } + + /** + * Return the original name of the uploaded file or false on error. + * + * @param string $s_fld field name + * + * @return bool + * @see \FormMail\UnitTests\GetFileNameTest + */ + public function GetFileName($s_fld) + { + if (($a_upload = $this->GetFileInfo($s_fld)) !== false) { + return ($a_upload["name"]); + } + return (false); + } + + /** + * Check if a file is a valid uploaded file. + * + * @param array $a_file_spec file specification + * + * @return bool + */ + public static function IsUploadedFile($a_file_spec) + { + // + // $a_file_spec["moved"] is our own internal flag to say we've + // saved the file + // + if (isset($a_file_spec["moved"]) && $a_file_spec["moved"]) { + return (true); + } + return (is_uploaded_file($a_file_spec["tmp_name"])); + } + + /** + * Internal access to static method. This allows us to mock the operation in unit tests. + * + * @param $a_file_spec + * + * @return bool + */ + protected function _IsUploadedFile($a_file_spec) + { + return self::IsUploadedFile($a_file_spec); + } + +} + +// +// Perform general line folding. +// This function can be used for RFC 2822 line folding, as well +// Quoted Printable soft line breaks (RFC 2045). +// $s_before lists the characters before which we should fold the line. +// $s_after lists the characters after which we should fold the line. +// $s_fold is the string to insert to fold the line. +// +function LineFolding($s_str,$i_max_line,$s_before,$s_after,$s_fold) +{ + $i_str_len = strlen($s_str); + $ii = $i_start = 0; + $i_line_len = 0; + while ($ii < $i_str_len) { + if ($i_line_len == $i_max_line) { + // + // fold this line: + // search backwards for a character at which we can + // fold the line + // + $b_done = false; + for ($jj = $ii ; !$b_done && $jj > $i_start ; $jj--) { + $b_found = false; + if (strpos($s_before,$s_str[$jj]) !== false) { + // + // fold before this character + // + $b_found = true; + } elseif (strpos($s_after,$s_str[$jj]) !== false) { + // + // fold after this character + // + $jj++; + $b_found = true; + } + if ($b_found) { + $s_str = substr($s_str,0,$jj) . $s_fold . substr($s_str,$jj); + $i_fold_len = strlen($s_fold); + $i_str_len += $i_fold_len; // the additional chars we inserted + $i_start = $jj + $i_fold_len; // start of the next line + $b_done = true; + } + } + // + // if we cannot fold and shorten the line, + // ignore this and try for the next line + // + if ($b_done) { + $ii = $i_start; + } else { + $i_start = $ii; + } + $i_line_len = 0; + } elseif (substr($s_str,$ii,2) == "\r\n") { + // + // end of line found - reset counters + // + $i_line_len = 0; + $ii += 2; + $i_start = $ii; + } else { + $ii++; + $i_line_len++; + } + } + return ($s_str); +} + +// +// Quoted Printable Encoding with soft line breaks. +// +// Process a string to fit the requirements of RFC2045 section 6.7. Note that +// this works, but replaces more characters than the minimum set. +// Prior to version 8.34, for readability the spaces were not encoded, which was +// WRONG (see http://tools.ietf.org/html/rfc2047#section-2). Spaces must +// be encoded. +// +// Adapted from: +// http://www.php.net/manual/en/function.quoted-printable-decode.php +// Note that we *must* split long lines because a QP string might not +// contain any Folding White Space (FWS). In this case, it would +// not be possible to fold the line according to RFC 2822. +// Therefore, we need to use Soft Line Breaks as defined by the +// Quoted Printable definition in RFC 2045. +// +// Set $i_max_line to -ve to skip the line folding. +// +function QPEncode($s_str,$i_max_line) +{ + // + // According to RFC2045 section 6.7 point (4), we need to keep any + // actual \r\n breaks encoded in the QP. The original code replaced + // them with CRLF pairs. + // + $s_str = str_replace('%','=',rawurlencode($s_str)); + if ($i_max_line < 0) { + return ($s_str); + } else { + $s_before = "="; // characters before which we can fold the line + return (LineFolding($s_str,$i_max_line,$s_before,"","=\r\n")); + } +} + +// +// Peform header line folding according to RFC 2822. +// $s_before lists the characters before which we should fold the line. +// $s_after lists the characters after which we should fold the line. +// Characters left out of folding: +// [] are part of no-fold-literal +// () are part of comments, and should work, but don't +// +function HeaderFolding($s_str,$i_max_line = RFCLINELEN,$s_before = "<",$s_after = ">;, ") +{ + return (LineFolding($s_str,$i_max_line,$s_before,$s_after,"\r\n ")); +} + +// +// Access the www.tectite.com website to get the current version. +// +function CheckVersion() +{ + global $FM_VERS,$php_errormsg; + + $http_get = new HTTPGet("http://www.tectite.com/fmversion.txt"); + $php_errormsg = ""; // clear this out in case we get an error that doesn't set it + FMDebug("CheckVersion"); + if (($a_lines = $http_get->Read()) !== false) { + // + // version file looks like this: + // Version=versionumber + // Message=a message to send in the alert + // + $s_version = ""; + $s_message = ""; + $s_line = ""; + $b_in_mesg = false; + foreach ($a_lines as $s_line) { + if ($b_in_mesg) { + $s_message .= $s_line; + } else { + $s_prefix = substr($s_line,0,8); + if ($s_prefix == "Message=") { + $s_message .= substr($s_line,8); + $b_in_mesg = true; + } elseif ($s_prefix == "Version=") { + $s_version = substr($s_line,8); + } + } + } + $s_version = str_replace("\r","",$s_version); + $s_version = str_replace("\n","",$s_version); + $s_stop_mesg = GetMessage(MSG_END_VERS_CHK); + FMDebug("CheckVersion: vers=$s_version"); + if ((float)$s_version > (float)$FM_VERS) { + SendAlert(GetMessage(MSG_VERS_CHK,array( + "TECTITE" => "www.tectite.com", + "FM_VERS" => "$FM_VERS", + "NEWVERS" => $s_version, + )) . + "\n$s_message\n$s_stop_mesg",true,true); + } + } +} + +// +// Check for new FormMail version +// +function Check4Update($s_chk_file,$s_id = "") +{ + global $lNow,$php_errormsg; + + @ $l_last_chk = filemtime($s_chk_file); + if ($l_last_chk === false || $lNow - $l_last_chk >= (Settings::get('CHECK_DAYS') * 24 * 60 * 60)) { + CheckVersion(); + // + // update the check file's time stamp + // + @ $fp = fopen($s_chk_file,"w"); + if ($fp !== false) { + fwrite($fp,"FormMail version check " . + (empty($s_id) ? "" : "for identifier '$s_id' ") . + "at " . date("H:i:s d-M-Y",$lNow) . "\n"); + fclose($fp); + } else { + SendAlert(GetMessage(MSG_CHK_FILE_ERROR,array("FILE" => $s_chk_file, + "ERROR" => CheckString($php_errormsg) + ))); + } + } +} + +// +// Perform various processing at the end of the script's execution. +// +function OnExit() +{ + FMDebug("OnExit"); + + // + // Check the www.tectite.com website for a new version, but only + // do this check once every CHECK_DAYS days (or on server reboot). + // + if (Settings::get('CHECK_FOR_NEW_VERSION')) { + global $SERVER; + + $a_targets = Settings::get('TARGET_EMAIL'); + if (isset($a_targets[0])) { + // + // use the first few characters of the MD5 of first email + // address pattern from $TARGET_EMAIL to get a unique file + // for the server + // + $s_id = ""; + if (isset($SERVER) && !empty($SERVER)) { + $s_id = $SERVER; + } + $s_dir = GetTempDir(); + $s_md5 = md5($a_targets[0]); + $s_uniq = substr($s_md5,0,6); + $s_chk_file = "fm" . "$s_uniq" . ".txt"; + Check4Update($s_dir . "/" . $s_chk_file,$s_id); + } + } +} + +register_shutdown_function('OnExit'); + +// +// Return the array with each string processed by htmlentities +// +function HTMLEntitiesArray($a_array,$b_equals_processing = false,$s_charset = NULL) +{ + foreach ($a_array as $m_key => $s_str) { + // + // only encode the value after the '=' + // + if ($b_equals_processing && ($i_pos = strpos($s_str,'=')) !== false) { + $a_array[$m_key] = substr($s_str,0,$i_pos + 1) . + FixedHTMLEntities(substr($s_str,$i_pos + 1),$s_charset); + } else { + $a_array[$m_key] = FixedHTMLEntities($s_str,$s_charset); + } + } + return ($a_array); +} + +// +// Unfortunately, htmlentities (in some versions of PHP) gets +// some characters wrong and converts them even when the +// charset is provided. +// This function overcomes this problem. +// +function FixedHTMLEntities($s_str,$s_charset = NULL) +{ + global $sHTMLCharSet; + + if (isset($s_charset) && $s_charset != "") { + return (htmlspecialchars($s_str,ENT_COMPAT,$s_charset)); + } + if (isset($sHTMLCharSet) && $sHTMLCharSet != "") { + return (htmlspecialchars($s_str,ENT_COMPAT,$sHTMLCharSet)); + } + return (htmlentities($s_str)); +} + +// +// Return the array with each string urlencode'd. +// +function URLEncodeArray($a_array) +{ + foreach ($a_array as $m_key => $s_str) { + // + // only encode the value after the '=' + // + if (($i_pos = strpos($s_str,'=')) !== false) { + $a_array[$m_key] = substr($s_str,0,$i_pos + 1) . + urlencode(substr($s_str,$i_pos + 1)); + } else { + $a_array[$m_key] = urlencode($s_str); + } + } + return ($a_array); +} + +// +// Performs charset encoding for header line text. +// This operates according to RFC 2047, but without +// imposing the 75 character limit on an encoding. +// I haven't implemented that because of all the dramas +// with *trying* to obey the header line length rules that +// don't seem to work with PHP, the MTA, and email clients. +// +function EncodeHeaderText($s_text,$i_max_line = -1) +{ + global $sHTMLCharSet; + + // + // RFCLINELEN is the RFC recommended maximum line length, but we don't know + // what the front part of the line will be at this point. + // So, we'll be conservative and reduce it. + // + if ($i_max_line == 0) { + $i_max_line = RFCLINELEN - 15; + } + $s_charset = ""; + if (isset($sHTMLCharSet) && $sHTMLCharSet != "") { + $s_charset = $sHTMLCharSet; + } else { + if (IsMailOptionSet("CharSet")) { + $s_charset = GetMailOption("CharSet"); + } + } + if ($s_charset != "") { + // + // this is the (unused) code for base64 encoding. + // quoted printable is a better choice for human readability + // + //return ("=?".$s_charset."?B?".base64_encode($s_text)."?="); + $s_prefix = "=?" . $s_charset . "?Q?"; + $s_suffix = "?="; + // + // pick a line length that allows a line split with the prefix or suffix added + // to be within the RFC maximum recommended line length + // + return ($s_prefix . QPEncode($s_text,$i_max_line - strlen($s_prefix)) . $s_suffix); + } else { + return ($s_text); + } +} + +// +// Add a parameter or list of parameters to a URL. +// +function AddURLParams($s_url,$m_params,$b_encode = true) +{ + if (!empty($m_params)) { + if (!is_array($m_params)) { + $m_params = array($m_params); + } + $s_anchor = ""; + if (($i_pos = strpos($s_url,'#')) !== false) { + // + // extract the anchor + // + $s_anchor = substr($s_url,$i_pos); + $s_url = substr($s_url,0,$i_pos); + } + if (strpos($s_url,'?') === false) { + $s_url .= '?'; + } else { + $s_url .= '&'; + } + $s_url .= implode('&',($b_encode) ? URLEncodeArray($m_params) : $m_params); + if ($s_anchor !== "") { + $s_url .= "$s_anchor"; + } + } + return ($s_url); +} + +// +// Recursively trim an array of strings (non string values are converted +// to a string first). +// +function TrimArray($a_list) +{ + foreach ($a_list as $m_key => $m_item) { + if (is_array($m_item)) { + $a_list[$m_key] = TrimArray($m_item); + } elseif (is_scalar($m_item)) { + $a_list[$m_key] = trim("$m_item"); + } else { + $a_list[$m_key] = ""; + } + } + return ($a_list); +} + +// +// Parse a derivation specification and return an array of +// field names and operators. +// +function ParseDerivation($s_fld_spec,$s_name,&$a_errors) +{ + $a_deriv = array(); + while (($i_len = strlen($s_fld_spec)) > 0) { + // + // we support the following operators: + // + concatenate with a single space between, but skip the space + // if the next field is empty + // * concatenate with a single space between + // . concatenate with no space between + // + $i_span = strcspn($s_fld_spec,'+*.'); + if ($i_span == 0) { + $a_errors[] = $s_name; + return (false); + } + $a_deriv[] = trim(substr($s_fld_spec,0,$i_span)); + if ($i_span < $i_len) { + $a_deriv[] = substr($s_fld_spec,$i_span,1); + $s_fld_spec = substr($s_fld_spec,$i_span + 1); + } else { + $s_fld_spec = ""; + } + } + return ($a_deriv); +} + +// +// Test if a character is an alphabetic. +// +function IsAlpha($ch) +{ + return (strpos("abcdefghijklmnopqrstuvwxyz",strtolower($ch)) !== false); +} + +// +// Test if a character is a digit. +// +function IsNumeric($ch) +{ + return (strpos("0123456789",$ch) !== false); +} + +// +// Test if a character is an alphanumeric +// +function IsAlnum($ch) +{ + return (IsAlpha($ch) || IsNumeric($ch)); +} + +/** + * Test if there is a number at the current position in a string. + * (I had to write this because Badoo SoftMocks was crashing on the original + * complex expression.) + * + * @param string $s_str the string + * @param int $i_pos the current position in the string + * @param int $i_len the length of the string + * + * @return bool + */ +function IsANumber($s_str,$i_pos,$i_len) +{ + $ch = $s_str[$i_pos]; + if (IsNumeric($ch)) { + return true; + } + if ($ch == ".") { + if (($i_pos + 1) <= ($i_len - 1)) { + $ch = $s_str[$i_pos + 1]; + return IsNumeric($ch); + } + } + return false; +} + +// +// Return an array of tokens extracted from the given string. +// A token is: +// - a word (begins with alpha or _, and is followed by any number +// of alphanumerics or _ chars) +// - a number (any number of consecutive digits with up to one period) +// - a string enclosed in specified quotes (this can be disabled) +// - any punctuation character +// +// Note that no string escapes (e.g. backslashes) are supported +// Anything not matching the above is silently ignored! +// +function GetTokens($s_str,$s_quotes = "'\"") +{ + $b_allow_strings = $s_quotes !== ""; + $ii = 0; + $i_len = strlen($s_str); + $a_toks = array(); + + while ($ii < $i_len) { + switch ($ch = $s_str[$ii]) { + case " ": + case "\t": + case "\n": + case "\r": + $ii++; + continue 2; + } + // + // start of a token + // + $i_start = $ii; + if ($ch == "_" || IsAlpha($ch)) { + // + // a word + // + $i_count = 1; + while (++$ii < $i_len && + (($ch = $s_str[$ii]) == "_" || IsAlnum($ch))) { + ++$i_count; + } + $a_toks[] = substr($s_str,$i_start,$i_count); + } elseif (IsANumber($s_str,$ii,$i_len)) { + // note: $ch == $s_str[$ii] + // + // a number + // + $b_had_dot = ($ch == "."); + $i_count = 1; + while (++$ii < $i_len) { + $c_check = $s_str[$ii]; + if (IsNumeric($c_check)) { + ++$i_count; + } elseif ($c_check == "." && !$b_had_dot) { + ++$i_count; + $b_had_dot = true; + } else { + break; + } + } + $a_toks[] = substr($s_str,$i_start,$i_count); + } elseif ($b_allow_strings && strpos($s_quotes,$ch) !== false) { + $c_quote = $ch; + // + // a quoted string + // + while (++$ii < $i_len) { + if ($s_str[$ii] == $c_quote) { + ++$ii; // include the terminating quote + break; + } + } + $a_toks[] = substr($s_str,$i_start,$ii - $i_start); + } else { + $s_punct = "~!@#$%^&*()-+={}[]|:;<>,.?/`\\"; + if (!$b_allow_strings) { + $s_punct .= "'\""; + } + if (strpos($s_punct,$ch) !== false) { + $a_toks[] = $ch; + } + ++$ii; + } + } + return ($a_toks); +} + +/** + * Return the value from a derive_fields specification. + * Specifications are in this format: + * %info% + * where info is a predefined word or a literal in quotes + * (e.g. 'the time is ') + * + * @param string $s_spec the specification + * @param FieldManager $field_mgr form fields manager + * @param array $a_errors returns the list of errors + * + * @return string + * @see \FormMail\UnitTests\ValueSpecTest + */ +function ValueSpec($s_spec,$field_mgr,&$a_errors) +{ + global $lNow; + + $s_value = ""; + switch (trim($s_spec)) { + case 'date': // "standard" date format: DD-MMM-YYYY + $s_value = date('d-M-Y',$lNow); + break; + case 'time': // "standard" time format: HH:MM:SS + $s_value = date('H:i:s',$lNow); + break; + case 'ampm': // am or pm + $s_value = date('a',$lNow); + break; + case 'AMPM': // AM or PM + $s_value = date('A',$lNow); + break; + case 'dom0': // day of month with possible leading zero + $s_value = date('d',$lNow); + break; + case 'dom': // day of month with no leading zero + $s_value = date('j',$lNow); + break; + case 'day': // day name (abbreviated) + $s_value = date('D',$lNow); + break; + case 'dayname': // day name (full) + $s_value = date('l',$lNow); + break; + case 'daysuffix': // day number suffix for English (st for 1st, nd for 2nd, etc.) + $s_value = date('S',$lNow); + break; + case 'moy0': // month of year with possible leading zero + $s_value = date('m',$lNow); + break; + case 'moy': // month of year with no leading zero + $s_value = date('n',$lNow); + break; + case 'month': // month name (abbreviated) + $s_value = date('M',$lNow); + break; + case 'monthname': // month name (full) + $s_value = date('F',$lNow); + break; + case 'year': // year (two digits) + $s_value = date('y',$lNow); + break; + case 'fullyear': // year (full) + $s_value = date('Y',$lNow); + break; + case 'rfcdate': // date formatted according to RFC 822 + $s_value = date('r',$lNow); + break; + case 'tzname': // timezone name + $s_value = date('T',$lNow); + break; + case 'tz': // timezone difference from Greenwich +NNNN or -NNNN + $s_value = date('O',$lNow); + break; + case 'hour120': // hour of day (01-12) with possible leading zero + $s_value = date('h',$lNow); + break; + case 'hour240': // hour of day (00-23) with possible leading zero + $s_value = date('H',$lNow); + break; + case 'hour12': // hour of day (1-12) with no leading zero + $s_value = date('g',$lNow); + break; + case 'hour24': // hour of day (0-23) with no leading zero + $s_value = date('G',$lNow); + break; + case 'min': // minute of hour (00-59) + $s_value = date('i',$lNow); + break; + case 'sec': // seconds of minute (00-59) + $s_value = date('s',$lNow); + break; + default: + if ($s_spec[0] == "'") { + // + // to get a quote, use 3 quotes: + // ''' + // + if ($s_spec == "'''") { + $s_value = "'"; + } elseif (substr($s_spec,-1,1) == "'") { + $s_value = substr($s_spec,1,-1); + } else + // + // missing final quote is OK + // + { + $s_value = substr($s_spec,1); + } + } elseif (strspn($s_spec,"0123456789ABCDEF") == 2) { + // + // insert the ASCII character corresponding to + // the hexadecimal value + // + $i_val = intval(substr($s_spec,0,2),16); + $s_value = chr($i_val); + } else { + // + // look for supported functions, start by getting all + // the tokens + // + $a_toks = GetTokens($s_spec); + if (count($a_toks) > 0) { + switch ($a_toks[0]) { + case "if": + // + // "if" function: test first field + // if not empty, then use second field + // else, use third field + // + // Example: if(fld1 ; fld2 ; fld3) + // + // tokens are: + // 1 ( + // 2 the field name to test (first) + // 3 ; + // 4 the "then" spec (can be missing) + // 5 ; + // 6 the "else" spec (can be missing) + // 7 ) + // + if (($n_tok = count($a_toks)) < 6 || + $a_toks[1] != "(" || + $a_toks[3] != ";" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_IF_FMT) + ))); + } else { + $b_ok = true; + $s_fld_name = $a_toks[2]; + $s_then_spec = $s_else_spec = ""; + for ($ii = 4 ; $ii < $n_tok && $a_toks[$ii] != ';' ; $ii++) { + $s_then_spec .= $a_toks[$ii]; + } + if ($ii == $n_tok) { + $b_ok = false; + } else { + // + // Concatenate tokens until the ')'. + // This provides the "else" spec. + // + for (; ++$ii < $n_tok && $a_toks[$ii] != ')' ;) { + $s_else_spec .= $a_toks[$ii]; + } + if ($ii == $n_tok) { + $b_ok = false; + } + } + $s_mesg = ""; + if ($b_ok) { + if (!$field_mgr->TestFieldEmpty($s_fld_name,$s_mesg)) { + $s_fld_spec = $s_then_spec; + } else { + $s_fld_spec = $s_else_spec; + } + $s_value = GetDerivedValue($field_mgr,$s_fld_spec,$a_errors); + } else { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_IF_FMT) + ))); + } + } + break; + case "size": + // + // "size" function: return size of uploaded file + // + // Example: size(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name for the file upload + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SIZE_FMT) + ))); + } elseif (($i_size = GetFileSize($a_toks[2])) !== false) { + $s_value = "$i_size"; + } + break; + case "ext": + // + // "ext" function: return filename extension of uploaded file + // + // Example: ext(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name for the file upload + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_EXT_FMT) + ))); + } elseif (($s_name = GetFileName($a_toks[2])) !== false) { + if (($i_pos = strrpos($s_name,".")) !== false) { + $s_value = substr($s_name,$i_pos + 1); + } + } + break; + case "ucase": + case "lcase": + // + // "ucase" and "lcase" functions: return field + // converted to upper or lower case + // + // Example: lcase(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name to convert + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } elseif ($a_toks[0] == "ucase") { + $s_value = strtoupper($field_mgr->GetFieldValue($a_toks[2])); + } else { + $s_value = strtolower($field_mgr->GetFieldValue($a_toks[2])); + } + break; + case "ltrim": + case "rtrim": + case "trim": + // + // trim functions: return field with whitespace removed + // from left (ltrim), right (rtrim), or both (trim) + // ends. + // + // Example: ltrim(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name to trim + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } else { + $s_value = $a_toks[0]($field_mgr->GetFieldValue($a_toks[2])); + } + break; + case "ltrim0": + // + // ltrim0 function: return field with blanks and + // leading 0's removed from the left. + // + // Example: ltrim0(fieldname) + // + // tokens are: + // 1 ( + // 2 the field name to trim + // 3 ) + // + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } else { + $s_value = $field_mgr->GetFieldValue($a_toks[2]); + $s_value = ltrim($s_value); // trim blanks on left + $i_len = strspn($s_value,"0"); + // + // if the whole string is zeroes, make sure we leave + // one of them! + // + if ($i_len == strlen($s_value)) { + if (--$i_len < 0) { + $i_len = 0; + } + } + $s_value = substr($s_value,$i_len); + } + break; + case "nextnum": + // + // "nextnum" function: return a unique number (next number) + // + // Usage: nextnum[(pad[,base])] + // + // Examples: + // %nextnum% + // %nextnum(8)% + // %nextnum(5;16)% + // + // You can provide a padding amount. In this case, the + // number is padded on the left with zeroes to the number + // of digits specified. + // + // You can also provide a base for your numbers. Valid + // values for base are 2 to 36, inclusive. + // + // tokens are: + // 1 ( + // 2 the padding amount + // 3 ; + // 4 the base + // 5 ) + // + $i_pad = 0; // no padding + $i_base = 10; // base 10 + if (($n_tok = count($a_toks)) > 1) { + if (($n_tok != 4 && $n_tok != 6) || + $a_toks[1] != "(" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T1)" + ))); + } + if ($n_tok == 6 && $a_toks[3] != ";") { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T2)" + ))); + } + if (!is_numeric($a_toks[2]) || + ($n_tok == 6 && !is_numeric($a_toks[4])) + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T3)" + ))); + } + $i_pad = intval($a_toks[2]); + if ($n_tok == 6) { + $i_base = intval($a_toks[4]); + if ($i_base < 2 || $i_base > 36) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => + GetMessage(MSG_DER_FUNC_NEXTNUM_FMT) . " (T4)" + ))); + $i_base = 10; + } + } + $s_value = GetNextNum($i_pad,$i_base); + } else { + $s_value = GetNextNum($i_pad,$i_base); + } + break; + case "substr": + // + // "substr" function: return part of a string + // + // Usage: substr(fieldname;start;length) + // + // Examples: + // %substr(field1;0;5)% + // %substr(field1;4)% + // %substr(field1;-4;-1)% + // + // The start is the number of characters to skip + // at the beginning of the string, if positive. + // If negative, the start is calculated from the + // end of the string, and says how many characters + // to go backward from the end. + // + // The length is the number of characters to return, + // if positive. If not specified, then the remainder + // of the string is returned. If negative, it + // specifies the number of characters to be omitted + // from the end of the string. + // + // Examples: + // Assume "f1" has the value "abcdef": + // %substr(f1;0;5)% returns "abcde" + // %substr(f1;4)% returns "ef" + // %substr(f1;1;-1)% returns "bcde" + // %substr(f1;-4;-1)% returns "cde" + // + // tokens are: + // 1 ( + // 2 the field name + // 3 ; + // 4 the start + // 5 ; + // 6 the length + // 7 ) + // + $i_start = 0; // default start + $i_len = null; // no length + if (($n_tok = count($a_toks)) > 1) { + if (($n_tok != 6 && $n_tok != 8) || + $a_toks[1] != "(" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T1)" + ))); + } + if ($n_tok == 8 && + ($a_toks[3] != ";" || $a_toks[5] != ";") + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T2)" + ))); + } + if ($n_tok == 6 && $a_toks[3] != ";") { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T3)" + ))); + } + if (!is_numeric($a_toks[4]) || + ($n_tok == 8 && !is_numeric($a_toks[6])) + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T4)" + ))); + } + $i_start = intval($a_toks[4]); + $s_value = $field_mgr->GetFieldValue($a_toks[2]); + if ($n_tok == 8) { + $i_len = intval($a_toks[6]); + } + if (isset($i_len)) { + $s_value = substr($s_value,$i_start,$i_len); + } else { + $s_value = substr($s_value,$i_start); + } + if ($s_value === FALSE) { + $s_value = ""; + } + } else { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC_SUBSTR_FMT) . " (T5)" + ))); + } + break; + case "call": + // + // "call" function: calls a builtin function + // + // Example: call(name ; p1 ; p2 ; ...) + // + // tokens are: + // 1 ( + // 2 the function name + // 3 ; + // 4 first parameter + // 5 ; + // 6 second parameter + // ... ... + // n ) + // + if (($n_tok = count($a_toks)) < 3 || + $a_toks[1] != "(" || + $a_toks[$n_tok - 1] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => 'Incorrect format for call function' + ))); + } else { + $b_ok = true; + $s_func_name = $a_toks[2]; + $a_params = array(); + if (3 < $n_tok && $a_toks[3] == ';') { + $a_params = CollectParams($a_toks,$n_tok,3); + } + for ($ii = 0 ; $ii < count($a_params) ; $ii++) { + $a_params[$ii] = GetDerivedValue($field_mgr,$a_params[$ii],$a_errors); + } + global $BuiltinFunctions; + + if (!$BuiltinFunctions->Call($s_func_name,$a_params,$s_result)) { + SendAlert($s_result); + } else { + $s_value = $s_result; + } + } + break; + case "urlencode": + // code supplied by Jeff Shields + if (count($a_toks) != 4 || + $a_toks[1] != "(" || + $a_toks[3] != ")" + ) { + SendAlert(GetMessage(MSG_DER_FUNC_ERROR, + array("SPEC" => $s_spec, + "MSG" => GetMessage(MSG_DER_FUNC1_FMT, + array("FUNC" => $a_toks[0])) + ))); + } else { + $s_value = urlencode($field_mgr->GetFieldValue($a_toks[2])); + } + break; + default: + SendAlertIgnoreSpam(GetMessage(MSG_UNK_VALUE_SPEC, + array("SPEC" => $s_spec,"MSG" => ""))); + break; + } + } else { + SendAlertIgnoreSpam(GetMessage(MSG_UNK_VALUE_SPEC,array("SPEC" => $s_spec, + "MSG" => "" + ))); + } + } + break; + } + return ($s_value); +} + +// +// Collect parameters for a builtin function call +// +function CollectParams($a_toks,$n_tok,$i_tok) +{ + $a_params = array(); + $i_param = 0; + do { + $i_tok++; + $a_params[$i_param] = ''; + for (; $i_tok < $n_tok && $a_toks[$i_tok] != ';' && $a_toks[$i_tok] != ')' ; $i_tok++) { + $a_params[$i_param] .= $a_toks[$i_tok]; + } + $i_param++; + } while ($a_toks[$i_tok] != ')'); + return ($a_params); +} + +// +// Return the next number or fail on error +// +function GetNextNum($i_pad,$i_base) +{ + global $php_errormsg; + + if (Settings::isEmpty('NEXT_NUM_FILE') || Settings::get('NEXT_NUM_FILE') === "") { + ErrorWithIgnore("next_num_config",GetMessage(MSG_NO_NEXT_NUM_FILE)); + FormMailExit(); + } + if (($fp = @fopen(Settings::get('NEXT_NUM_FILE'),"r+")) === false) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "open", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + if (!flock($fp,defined("LOCK_EX") ? LOCK_EX : 2)) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "flock", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + // + // read the first line only + // + if (!feof($fp)) { + if (($s_line = fread($fp,1024)) === false) { + $i_next = 1; + } elseif (($i_next = intval($s_line)) <= 0) { + $i_next = 1; + } + } else { + $i_next = 1; + } + if (rewind($fp) == 0) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "rewind", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + $s_ret = strval($i_next++); + if (fputs($fp,"$i_next\r\n") <= 0) { + Error("next_num_file",GetMessage(MSG_NEXT_NUM_FILE, + array("FILE" => Settings::get('NEXT_NUM_FILE'), + "ACT" => "fputs", + "ERR" => $php_errormsg + ))); + FormMailExit(); + } + fclose($fp); + if ($i_base != 10) { + $s_ret = base_convert($s_ret,10,$i_base); + $s_ret = strtoupper($s_ret); // always upper case if alphas are used + } + if ($i_pad != 0) { + $s_ret = str_pad($s_ret,$i_pad,"0",STR_PAD_LEFT); + } + return ($s_ret); +} + +// +// Return the value of an object or array as a string. +// +function GetObjectAsString($m_value) +{ + ob_start(); + print_r($m_value); + $s_ret = ob_get_contents(); + ob_end_clean(); + return ($s_ret); +} + +// +// Return a Server or Environment variable value. Returns false if +// not found, otherwise a string value. +// +function GetEnvValue($s_name) +{ + global $aServerVars,$aEnvVars; + + if (isset($aEnvVars[$s_name])) { + $m_value = $aEnvVars[$s_name]; + } elseif (isset($aServerVars[$s_name])) { + $m_value = $aServerVars[$s_name]; + } + // + // some values might not be strings - so convert + // + if (isset($m_value) && !is_scalar($m_value)) { + $m_value = GetObjectAsString($m_value); + } + return (isset($m_value) ? ((string)$m_value) : false); +} + +/** + * Test if a field is set in the given vars array or in the uploaded + * files. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld the field name + * @param array $a_main_vars the field list array + * + * @return bool + */ +function IsFieldSet($s_fld,$a_main_vars) +{ + global $aFileVars; + + $mgr = new FieldManager($a_main_vars,$aFileVars); + return ($mgr->IsFieldSet($s_fld)); +} + +/* + * Function: IsFileField + * Parameters: $s_fld the field name + * Returns: bool true if this is a file upload field + * Description: + * Checks if a field is a file upload field (regardless of whether + * file uploads are being allowed, or whether the actual upload + * is valid in any way). + */ +/** @noinspection PhpUnused */ +function IsFileField($s_fld) +{ + global $aFileVars; + + return (isset($aFileVars[$s_fld])); +} + +// +// Delete the info for an uploaded file +// +function DeleteFileInfo($s_fld) +{ + global $aFileVars; + global $aCleanedValues,$aRawDataValues,$aAllRawValues; + + if (Settings::get('FILEUPLOADS')) { + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + unset($a_saved_files[$s_fld]); + SetSession("FormSavedFiles",$a_saved_files); + } + if (isset($aFileVars[$s_fld])) { + unset($aFileVars[$s_fld]); + } + // + // zap any "name_of" field that has been created + // + $s_name = "name_of_$s_fld"; + unset($aCleanedValues[$s_name]); + unset($aRawDataValues[$s_name]); + unset($aAllRawValues[$s_name]); + } +} + +/** + * Return the info for the uploaded file, or false on error. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * + * @return bool + * @see \FormMail\UnitTests\GetFieldValueTest + */ +function GetFileInfo($s_fld) +{ + global $aFileVars; + + $mgr = new FieldManager(array(),$aFileVars); + return ($mgr->GetFileInfo($s_fld)); +} + +/** + * Return the original name of the uploaded file or false on error. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * + * @return bool + * @see \FormMail\UnitTests\GetFileNameTest + */ +function GetFileName($s_fld) +{ + global $aFileVars; + + $mgr = new FieldManager(array(),$aFileVars); + return ($mgr->GetFileName($s_fld)); +} + +// +// Return the size of the uploaded file or false on error. +// +function GetFileSize($s_fld) +{ + if (($a_upload = GetFileInfo($s_fld)) !== false) { + return ($a_upload["size"]); + } + return (false); +} + +/** + * Return a field value. Empty string is returned if the field is + * not found. File fields return the original name of the uploaded file. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * @param array $a_main_vars the array of fields + * @param string $s_array_sep a separator for joining array values + * + * @return bool|string + * @see \FormMail\UnitTests\GetFieldValueTest + */ +function GetFieldValue($s_fld,$a_main_vars,$s_array_sep = ";") +{ + global $aFileVars; + + $mgr = new FieldManager($a_main_vars,$aFileVars); + return ($mgr->GetFieldValue($s_fld,$s_array_sep)); +} + +/** + * Tests a field against an array of vars for emptiness. + * If the var isn't found there, then the POSTed files array is checked. + * Returns true if the field is empty (a specific error may + * be returned in the $s_mesg parameter). + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param string $s_fld field name + * @param array $a_main_vars the array of fields + * @param string $s_mesg returned error message + * + * @return bool + * @see \FormMail\UnitTests\TestFieldEmptyTest + */ +function TestFieldEmpty($s_fld,$a_main_vars,&$s_mesg) +{ + global $aFileVars; + + $mgr = new FieldManager($a_main_vars,$aFileVars); + return ($mgr->TestFieldEmpty($s_fld,$s_mesg)); +} + +// +// Return a derived field value or value specification. +// +function GetDerivedValue($field_mgr,$s_word,&$a_errors) +{ + $s_value = ""; + // + // a field name or a value specification + // value specifications have the following format: + // %spec% + // + if (substr($s_word,0,1) == '%') { + if (substr($s_word,-1,1) != '%') { + SendAlert(GetMessage(MSG_INV_VALUE_SPEC,array("SPEC" => $s_word))); + $s_value = $s_word; + } else { + $s_spec = substr($s_word,1,-1); + $s_value = ValueSpec($s_spec,$field_mgr,$a_errors); + } + } else { + $s_fld_name = $s_word; + // + // try form data first, then the environment/server data + // + if ($field_mgr->IsFieldSet($s_fld_name)) { + $s_value = $field_mgr->GetFieldValue($s_fld_name); + } elseif (($s_value = GetEnvValue($s_fld_name)) === false) { + $s_value = ""; + } + $s_value = trim($s_value); + } + return ($s_value); +} + +// +// Derive a value from the form data using the specification returned +// from ParseDerivation. +// +function DeriveValue($field_mgr,$a_value_spec,$s_name,&$a_errors) +{ + $s_value = ""; + for ($ii = 0 ; $ii < count($a_value_spec) ; $ii++) { + switch ($a_value_spec[$ii]) { + case '+': + // + // concatenate with a single space between, but skip the space + // if the next field is empty + // + if ($ii < count($a_value_spec) - 1) { + $s_temp = GetDerivedValue($field_mgr,$a_value_spec[$ii + 1],$a_errors); + if (!FieldManager::IsEmpty($s_temp)) { + $s_value .= ' '; + } + } + break; + case '.': + // + // concatenate with no space between + // + break; + case '*': + // + // concatenate with a single space between + // + $s_value .= ' '; + break; + default: + // + // a field name or a value specification + // value specifications have the following format: + // %name% + // + $s_value .= GetDerivedValue($field_mgr,$a_value_spec[$ii],$a_errors); + break; + } + } + return ($s_value); +} + +// +// Create derived fields specified by the "derive_fields" value. +// +function CreateDerived($a_form_data) +{ + global $aFileVars; + + if (isset($a_form_data["derive_fields"])) { + $a_errors = array(); + // + // get the list of derived field specifications + // + $a_list = TrimArray(explode(",",$a_form_data["derive_fields"])); + $field_mgr = new FieldManager($a_form_data,$aFileVars); + foreach ($a_list as $s_fld_spec) { + if ($s_fld_spec === "") + // + // silently ignore empty derivations + // + { + continue; + } + if (($i_pos = strpos($s_fld_spec,"=")) === false) { + $a_errors[] = $s_fld_spec; + continue; + } + $s_name = trim(substr($s_fld_spec,0,$i_pos)); + $s_fld_spec = substr($s_fld_spec,$i_pos + 1); + + if (($a_value_spec = ParseDerivation($s_fld_spec,$s_name,$a_errors)) === false + ) { + break; + } + $a_form_data[$s_name] = DeriveValue($field_mgr,$a_value_spec,$s_name,$a_errors); + // we've added a new field, so we need a new FieldManager object + $field_mgr = new FieldManager($a_form_data,$aFileVars); + } + if (count($a_errors) > 0) { + SendAlertIgnoreSpam(GetMessage(MSG_DERIVED_INVALID) . implode("\n",$a_errors)); + ErrorWithIgnore("derivation_failure",GetMessage(MSG_INT_FORM_ERROR)); + } + } + return ($a_form_data); +} + +// +// To process the name specification for files and update the +// array of file variables accordingly. +// +function SetFileNames($s_name_spec,$a_order,$a_fields,$a_raw_fields,$a_all_raw_values,$a_file_vars) +{ + $a_errors = array(); + // + // get the list of file name derivations + // + $a_list = TrimArray(explode(",",$s_name_spec)); + foreach ($a_list as $s_fld_spec) { + if ($s_fld_spec === "") + // + // silently ignore empty file name derivations + // + { + continue; + } + if (($i_pos = strpos($s_fld_spec,"=")) === false) { + $a_errors[] = $s_fld_spec; + continue; + } + $s_name = trim(substr($s_fld_spec,0,$i_pos)); + $s_fld_spec = substr($s_fld_spec,$i_pos + 1); + + if (($a_value_spec = ParseDerivation($s_fld_spec,$s_name,$a_errors)) === false + ) { + break; + } + if (isset($a_file_vars[$s_name]) && FieldManager::IsUploadedFile($a_file_vars[$s_name])) { + // + // we create our own special entry in the file variable's data + // + $a_file_vars[$s_name]["new_name"] = DeriveValue(new FieldManager($a_raw_fields,$a_file_vars), + $a_value_spec,$s_name,$a_errors); + // + // we also create (derive) a new field called 'name_of_X' + // where X is the file fields's name + // + ProcessField("name_of_$s_name",$a_file_vars[$s_name]["new_name"], + $a_order,$a_fields,$a_raw_fields); + $a_all_raw_values["name_of_$s_name"] = $a_file_vars[$s_name]["new_name"]; + } + /* This is annoying if a file upload is optional. Just ignore missing + file upload fields. + else + SendAlert(GetMessage(MSG_FILE_NAMES_NOT_FILE, + array("NAME"=>$s_name)));*/ + } + if (count($a_errors) > 0) { + SendAlertIgnoreSpam(GetMessage(MSG_FILE_NAMES_INVALID) . implode("\n",$a_errors)); + ErrorWithIgnore("file_names_derivation_failure",GetMessage(MSG_INT_FORM_ERROR)); + } + return (array($a_order,$a_fields,$a_raw_fields,$a_all_raw_values,$a_file_vars)); +} + +$aProcessSpecsFormData = array(); +$sProcessSpecsFieldName = ""; + +// +// Callback function for ProcessSpecs +// +function ProcessSpecsMatch($a_matches) +{ + global $aProcessSpecsFormData,$sProcessSpecsFieldName,$aFileVars; + + // + // strip % at either end + // + $s_spec = substr($a_matches[0],1,-1); + $a_errors = array(); + $s_value = ValueSpec($s_spec,new FieldManager($aProcessSpecsFormData,$aFileVars),$a_errors); + return ($s_value); +} + +// +// Process %...% specifications in a string. +// This function is used for processing options values, such as in "autorespond" +// and "mail_options". +// +function ProcessSpecs($s_fld_name,$a_form_data,$s_value) +{ + global $aProcessSpecsFormData,$sProcessSpecsFieldName; + + $aProcessSpecsFormData = $a_form_data; + $sProcessSpecsFieldName = $s_fld_name; + // + // un-greedy pattern match + // Note that this means we can't use %..% within a %if(..)%, for example. + // + $s_value = preg_replace_callback('/%.+?%/',"ProcessSpecsMatch",$s_value); + $aProcessSpecsFormData = array(); + $sProcessSpecsFieldName = ""; + return ($s_value); +} + +// +// Process a list of attributes or options. +// Format for each attribute/option: +// name +// or +// name=value +// +// Values can be simple values or semicolon (;) separated lists: +// avalue +// value1;value2;value3;... +// +// Returns attribute/options in the associative array $a_attribs. +// Optionally, valid attributes can be provided in $a_valid_attribs +// (if empty, all attributes found are considered valid). +// Errors are returned in $a_errors. +// +function ProcessAttributeList($s_fld_name,$a_form_data,$a_list,&$a_attribs,&$a_errors, + $a_valid_attribs = array()) +{ + $b_got_valid_list = (count($a_valid_attribs) > 0); + foreach ($a_list as $s_attrib) { + // + // if the name begins with '.' then silently ignore it; + // this allows you to temporarily disable an option without + // getting an alert message + // + if (($i_pos = strpos($s_attrib,"=")) === false) { + $s_name = trim($s_attrib); + if (empty($s_name) || $s_name[0] == '.') { + continue; + } + // + // option is a simple "present" value + // + $a_attribs[$s_name] = true; + } else { + $s_name = trim(substr($s_attrib,0,$i_pos)); + if (empty($s_name) || $s_name[0] == '.') { + continue; + } + $s_value_list = substr($s_attrib,$i_pos + 1); + if (($i_pos = strpos($s_value_list,";")) === false) + // + // single value + // + { + $a_attribs[$s_name] = ProcessSpecs($s_fld_name,$a_form_data,trim($s_value_list)); + } else + // + // list of values + // + { + $a_attribs[$s_name] = TrimArray(explode(";",$s_value_list)); + } + } + if ($b_got_valid_list && !isset($a_valid_attribs[$s_name])) { + $a_errors[] = $s_name; + } + } +} + +// +// Process the options specified in the form. +// Options can be specified in this format: +// option1,option2,option3,... +// Each option can be a simple word or a word and value: +// name +// name=value +// No name or value can contain a comma. +// Values can be simple values or semicolon (;) separated lists: +// avalue +// value1;value2;value3;... +// No value can contain a semicolon. +// Be careful of values beginning and ending with whitespace characters; +// they will be trimmed. +// +function ProcessOptions($s_name,$a_form_data,&$a_options,$a_valid_options) +{ + $a_errors = array(); + $a_options = array(); + if (isset($a_form_data[$s_name])) { + // + // get the options list and trim each one + // + $a_list = TrimArray(explode(",",$a_form_data[$s_name])); + ProcessAttributeList($s_name,$a_form_data,$a_list,$a_options,$a_errors,$a_valid_options); + } + if (count($a_errors) > 0) { + SendAlertIgnoreSpam(GetMessage(MSG_OPTIONS_INVALID,array("OPT" => $s_name)) . + implode("\n",$a_errors)); + } +} + +// +// Process the mail_options specified in the form. +// +function ProcessMailOptions($a_form_data) +{ + global $MAIL_OPTS,$VALID_MAIL_OPTIONS; + + ProcessOptions("mail_options",$a_form_data,$MAIL_OPTS,$VALID_MAIL_OPTIONS); +} + +// +// Check if an option is set +// +function IsMailOptionSet($s_name) +{ + global $MAIL_OPTS; + + return (isset($MAIL_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +function GetMailOption($s_name) +{ + global $MAIL_OPTS; + + return (isset($MAIL_OPTS[$s_name]) ? $MAIL_OPTS[$s_name] : NULL); +} + +// +// Process the crm_options specified in the form. +// +function ProcessCRMOptions($a_form_data) +{ + global $CRM_OPTS,$VALID_CRM_OPTIONS; + + ProcessOptions("crm_options",$a_form_data,$CRM_OPTS,$VALID_CRM_OPTIONS); +} + +// +// Check if an option is set +// +function IsCRMOptionSet($s_name) +{ + global $CRM_OPTS; + + return (isset($CRM_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +/** @noinspection PhpUnused */ +function GetCRMOption($s_name) +{ + global $CRM_OPTS; + + return (isset($CRM_OPTS[$s_name]) ? $CRM_OPTS[$s_name] : NULL); +} + +// +// Check if a field is in the mail exclusion list. +// +function IsMailExcluded($s_name) +{ + $a_list = GetMailOption("Exclude"); + if (!isset($a_list)) { + return (false); + } + if (is_array($a_list)) { + return (in_array($s_name,$a_list)); + } else { + return ($s_name === $a_list); + } +} + +// +// Process the autorespond specified in the form. +// +function ProcessAROptions($a_form_data) +{ + global $AR_OPTS,$VALID_AR_OPTIONS; + + ProcessOptions("autorespond",$a_form_data,$AR_OPTS,$VALID_AR_OPTIONS); +} + +// +// Check if an option is set +// +function IsAROptionSet($s_name) +{ + global $AR_OPTS; + + return (isset($AR_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +function GetAROption($s_name) +{ + global $AR_OPTS; + + return (isset($AR_OPTS[$s_name]) ? $AR_OPTS[$s_name] : NULL); +} + +// +// Process the mail_options specified in the form. +// +function ProcessFilterOptions($a_form_data) +{ + global $FILTER_OPTS,$VALID_FILTER_OPTIONS; + + ProcessOptions("filter_options",$a_form_data,$FILTER_OPTS,$VALID_FILTER_OPTIONS); +} + +// +// Check if an option is set +// +function IsFilterOptionSet($s_name) +{ + global $FILTER_OPTS; + + return (isset($FILTER_OPTS[$s_name])); +} + +// +// Return an option's value or NULL if not set. +// +function GetFilterOption($s_name) +{ + global $FILTER_OPTS; + + return (isset($FILTER_OPTS[$s_name]) ? $FILTER_OPTS[$s_name] : NULL); +} + +// +// Lookup a filter attribute for the given filter. +// Return it's value or false if not set. +// +function GetFilterAttrib($s_filter,$s_attrib) +{ + global $FILTER_ATTRIBS_LOOKUP; + + $a_attribs = Settings::get('FILTER_ATTRIBS'); + if (!isset($a_attribs[$s_filter])) + // + // no attributes for the filter + // + { + return (false); + } + if (!isset($FILTER_ATTRIBS_LOOKUP[$s_filter])) { + // + // the attributes have not yet been parsed - create the lookup table + // + $a_list = TrimArray(explode(",",$a_attribs[$s_filter])); + $FILTER_ATTRIBS_LOOKUP[$s_filter] = array(); + $a_errors = array(); + + ProcessAttributeList('FILTER_ATTRIBS',array(),$a_list,$FILTER_ATTRIBS_LOOKUP[$s_filter],$a_errors); + } + // + // perform the lookup and return the value + // + if (!isset($FILTER_ATTRIBS_LOOKUP[$s_filter][$s_attrib])) { + return (false); + } + return ($FILTER_ATTRIBS_LOOKUP[$s_filter][$s_attrib]); +} + +// +// Check the filter attributes for the given filter. +// Return true if the given attribute is set otherwise false. +// +function IsFilterAttribSet($s_filter,$s_attrib) +{ + return (GetFilterAttrib($s_filter,$s_attrib)); +} + +// +// Process the given .ini file. +// +function ProcessFormIniFile($s_file) +{ + global $EMAIL_ADDRS,$ValidEmails; + + $a_sections = parse_ini_file($s_file,TRUE); + // + // from PHP 5.2.7, parse_ini_file returns false on syntax problems + // prior to that, an empty array. So, on previous versions of PHP + // we cannot detect an actual error (an empty array is perfectly valid). + // + if ($a_sections === false) { + Error("bad_ini",GetMessage(MSG_INI_PARSE_ERROR,array("FILE" => $s_file))); + } elseif (empty($a_sections)) { + SendAlert(GetMessage(MSG_INI_PARSE_WARN,array("FILE" => $s_file)),false,true); + } + if (Settings::get('DB_SEE_INI')) { + // + // just display the ini file + // + $s_text = "

    The following settings were found in the file '$s_file':

    "; + foreach ($a_sections as $s_sect => $a_settings) { + $s_text .= "

    [$s_sect]\n"; + foreach ($a_settings as $s_name => $s_value) { + $s_text .= "$s_name = \"$s_value\"\n"; + } + $s_text .= "

    "; + } + CreatePage($s_text,"Debug Output - INI File Display"); + FormMailExit(); + } + // + // Load the email_addresses section. + // + if (isset($a_sections["email_addresses"])) { + $a_addr_list = $a_sections["email_addresses"]; + // + // make these addresses valid + // + foreach ($a_addr_list as $s_alias => $s_list) { + $EMAIL_ADDRS[$s_alias] = $s_list; + $ValidEmails->AddAddresses($s_list); + } + } + // + // Process special fields + // + if (isset($a_sections["special_fields"])) { + foreach ($a_sections["special_fields"] as $s_name => $m_value) { + if (IsSpecialField($s_name)) { + ValidateSpecialField($s_name,$s_value,false); + SetSpecialField($s_name,$m_value); + // + // if this is the recipients, cc, or bcc field, + // make the addresses valid + // + if ($s_name === "recipients" || $s_name === "cc" || $s_name === "bcc") + // + // coming from the INI file, the values can only be strings + // + { + if (is_string($m_value)) { + $ValidEmails->AddAddresses($m_value); + } + } + } + // + // check for multiple valued special fields + // + if (($a_multi_fld = IsSpecialMultiField($s_name)) !== false) { + SetSpecialMultiField($a_multi_fld[0],$a_multi_fld[1],$m_value); + } + } + } +} + +/** + * UnMangle an email address. This means replacing AT_MANGLE in the given + * string with the @ symbol. + * It can also lookup an email alias and return the corresponding email address. + * Email aliases are defined in the EMAIL_ADDRS configuration setting or in an INI file. + * + * @param string $s_email the email address to unmangle + * + * @return string the actual email address + */ +function UnMangle($s_email) +{ + $email_addrs = Settings::get('EMAIL_ADDRS'); + + // + // map from a name to the real email address; if it exists + // + if (isset($email_addrs[$s_email])) { + $s_email = $email_addrs[$s_email]; + } + // + // unmangle + // + if (Settings::get('AT_MANGLE') != "") { + $s_email = str_replace(Settings::get('AT_MANGLE'),"@",$s_email); + } + return ($s_email); +} + +// +// Check a list of email addresses (comma separated); returns a list +// of valid email addresses (comma separated). +// The list can be an array of comma separated lists. +// The return value is true if there is at least one valid email address. +// +function CheckEmailAddress($m_addr,&$s_valid,&$s_invalid,$b_check = true) +{ + global $ValidEmails; + + $s_invalid = $s_valid = ""; + if (is_array($m_addr)) { + $a_list = array(); + foreach ($m_addr as $s_addr_list) { + $a_list = array_merge($a_list,TrimArray(explode(",",$s_addr_list))); + } + } else { + $a_list = TrimArray(explode(",",$m_addr)); + } + $a_invalid = array(); + $n_empty = 0; + for ($ii = 0 ; $ii < count($a_list) ; $ii++) { + if ($a_list[$ii] === "") { + // + // ignore, but count empty addresses + // + $n_empty++; + continue; + } + $s_email = UnMangle($a_list[$ii]); + // + // UnMangle works with INI files too, and a single + // word can expand to a list of email addresses. + // + $a_this_list = TrimArray(explode(",",$s_email)); + foreach ($a_this_list as $s_email) { + if ($s_email === "") { + // + // ignore, but count empty addresses + // + $n_empty++; + continue; + } + if ($b_check) { + $b_is_valid = $ValidEmails->CheckAddress($s_email); + } else { + $b_is_valid = true; + } + if ($b_is_valid) { + if (empty($s_valid)) { + $s_valid = $s_email; + } else { + $s_valid .= "," . $s_email; + } + } else { + $a_invalid[] = $s_email; + } + } + } + // + // just ignore empty recipients unless there are *no* valid recipients + // + if (empty($s_valid) && $n_empty > 0) { + $a_invalid[] = GetMessage(MSG_EMPTY_ADDRESSES,array("COUNT" => $n_empty)); + } + if (count($a_invalid) > 0) { + $s_invalid = implode(",",$a_invalid); + } + return (!empty($s_valid)); +} + +// +// Redirect to another URL +// +function Redirect($url,$title) +{ + global $ExecEnv; + + // + // for browsers without cookies enabled, append the Session ID + // + if ($ExecEnv->allowSessionURL()) { + if (session_id() !== "") { + $url = AddURLParams($url,session_name() . "=" . urlencode(session_id())); + } elseif (defined("SID")) { + $url = AddURLParams($url,SID); + } + } + + //FMDebug("Before redirecting, FormData = ".(isset($_SESSION["FormData"]) ? var_export($_SESSION["FormData"],true) : "NULL")); + + // + // this is probably a good idea to ensure the session data + // is written away + // + if (function_exists('session_write_close')) { + session_write_close(); + } + + header("Location: $url"); + + // + // avoid XSS by sanitizing the URL + // + $url = stripJS(filter_var($url,FILTER_SANITIZE_STRING)); + + // + // if the header doesn't work, try JavaScript. + // if that doesn't work, provide a manual link + // + $s_text = GetMessage(MSG_PLSWAIT_REDIR) . "\n\n"; + $s_text .= ""; + $s_text .= "\n\n" . GetMessage(MSG_IFNOT_REDIR,array("URL" => $url)); + CreatePage($s_text,$title); + FormMailExit(); +} + +/** + * Remove 'javascript:' from the given text. + * + * @param string $s_text the text to be modified + * + * @return string|string[] + */ +function stripJS($s_text) +{ + return str_ireplace('javascript:','',$s_text); +} + +class JSON +{ + function _Format($m_val) + { + if (is_bool($m_val)) { + $s_value = ($m_val) ? "true" : "false"; + } elseif (is_string($m_val)) { + // + // convert literal line breaks into JavaScript escape sequences + // + $s_value = '"' . str_replace(array("\r","\n"),array('\\r','\\n'),addslashes($m_val)) . '"'; + } elseif (is_numeric($m_val)) { + $s_value = $m_val; + } elseif (is_array($m_val)) { + $s_value = $this->_FormatArray($m_val); + } else { + $s_value = "null"; + } + return ($s_value); + } + + function _FormatArray($a_array) + { + if ($this->_IsNumericArray($a_array)) { + $a_values = array(); + foreach ($a_array as $m_val) { + $a_values[] = $this->_Format($m_val); + } + $s_value = "[" . implode(",",$a_values) . "]"; + } else { + // + // associative arrays are objects + // + $s_value = $this->MakeObject($a_array); + } + return ($s_value); + } + + // + // check if we have a numeric array or an associative array + // numeric arrays may have holes; numeric array indexes must + // be integers + // + function _IsNumericArray($a_data) + { + if (empty($a_data)) { + return (true); + } // empty array - treat as numeric + // + // check all the keys for numeric + // + $a_keys = array_keys($a_data); + foreach ($a_keys as $m_index) { + if (!is_int($m_index)) { + return (false); + } + } + return (true); + } + + function MakeObject($a_data) + { + $a_members = array(); + foreach ($a_data as $s_key => $m_val) { + $a_members[] = '"' . $s_key . '":' . $this->_Format($m_val); + } + return ("{" . implode(",",$a_members) . "}"); + } +} + +function CORS_Response() +{ + header('Access-Control-Allow-Origin: *'); + header('Access-Control-Max-Age: 36000'); + header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); + header('Access-Control-Allow-Headers: X-Requested-With'); +} + +function JSON_Result($s_result,$a_data = array()) +{ + global $aGetVars; + + FMDebug("Sending JSON_Result: $s_result"); + $a_data["Result"] = $s_result; + $json = new JSON(); + $s_ret = $json->MakeObject($a_data); + CORS_Response(); + // + // handle JSONP request + // + if (isset($aGetVars['callback']) && $aGetVars['callback'] != '') { + header('Content-Type: text/javascript; charset=utf-8'); + $s_ret = $aGetVars['callback'] . "($s_ret);"; + FMDebug('JSONP request callback=' . $aGetVars['callback']); + } else { + header('Content-Encoding: utf-8'); + header('Content-Type: application/json; charset=utf-8'); + } + FMDebug("JSON_Result output: " . $s_ret); + echo $s_ret; +} + +// +// JoinLines is just like "implode" except that it checks +// the end of each array for the separator already being +// there. This allows us to join a mixture of mail +// header lines (already terminated) with body lines. +// This logic works if HEAD_CRLF, for example, is the same +// as BODY_LF (i.e. both "\r\n") or if BODY_LF is the +// same as the last character in HEAD_CRLF (i.e. +// HEAD_CRLF = "\r\n" and BODY_LF = "\n"). +// Other value combinations may break things. +// +function JoinLines($s_sep,$a_lines) +{ + $s_str = ""; + if (($i_sep_len = strlen($s_sep)) == 0) + // + // no separator + // + { + return (implode("",$a_lines)); + } + $n_lines = count($a_lines); + for ($ii = 0 ; $ii < $n_lines ; $ii++) { + $s_line = $a_lines[$ii]; + if (substr($s_line,-$i_sep_len) == $s_sep) { + $s_str .= $s_line; + } else { + $s_str .= $s_line; + // + // don't append a separator to the last line + // + if ($ii < $n_lines - 1) { + $s_str .= $s_sep; + } + } + } + return ($s_str); +} + +// +// Re-orders an array of email headers into the +// order recommended by RFC822, section 4.1: +// It is recommended that, if present, +// headers be sent in the order "Return- +// Path", "Received", "Date", "From", "Subject", +// "Sender", "To", "cc", etc. +// +// Note that RFC822 is obsoleted by RFC2822 and +// the latter states that field order doesn't +// matter (except for some tracing fields). +// However, a FormMail user reported that Yahoo doesn't like +// email where the CC header appears before the From +// header. So, as always, we try to work with broken +// servers too... +// +// Returns an array indexed by the require numerical +// order. Each element is an array containing the +// header value (name,value pair). +// +function OrderHeaders($a_headers) +{ + // + // we list the headers we're responsible for + // in the order suggested + // + $a_ordering = array("From","Subject","To","Cc","Bcc","Reply-To"); + $a_ordered_headers = array(); + foreach ($a_ordering as $s_name) { + if (isset($a_headers[$s_name])) { + $a_ordered_headers[] = array($s_name => $a_headers[$s_name]); + unset($a_headers[$s_name]); + } + } + // + // now add in the remaining headers + // + foreach ($a_headers as $s_name => $s_value) { + $a_ordered_headers[] = array($s_name => $a_headers[$s_name]); + } + return ($a_ordered_headers); +} + +// +// Makes a mail header field body "safe". +// This simply places a backslash in front of every double-quote. +// There's probably more we could do if required, but this +// attempts to provide the same protection that was in the first +// version of FormMail. In that version, every incoming +// field had double-quotes replaced with single quotes. +// That processing is no longer performed, and this +// function is used to protect against potential attacks in +// header fields - not by replacing double quotes with single quotes, +// but by using the backslash "quoting" feature of RFC2822. +// +// This code could be improved by parsing the header and rewriting +// it to be valid, possibly removing junk. +// +// That's a lot of code, though! +// +function SafeHeader($s_str) +{ + return (str_replace('"','\\"',$s_str)); +} + +// +// makes a string safe to put as words in a header +// +function SafeHeaderWords($s_str) +{ + // + // We zap various characters and replace them with a question mark. + // Also, we don't handle quoted strings, which are valid words. + // + $s_specials = '()<>@,;:\\".[]'; // special characters defined by RFC822 + $s_str = preg_replace('/[[:cntrl:]]+/',"?",$s_str); // zap all control chars + $s_str = preg_replace("/[" . preg_quote($s_specials,"/") . "]/","?",$s_str); // zap all specials + return ($s_str); +} + +// +// makes a string safe to put as a quoted string in a header +// +function SafeHeaderQString($s_str) +{ + return (str_replace('"','\\"', + str_replace("\\","\\\\", + str_replace("\r"," ", + str_replace("\r\n"," ",$s_str))))); +} + +// +// makes a string safe to put in a header comment +// +function SafeHeaderComment($s_str) +{ + return (str_replace("(","\\(", + str_replace(")","\\)", + str_replace("\\","\\\\", + str_replace("\r"," ", + str_replace("\r\n"," ",$s_str)))))); +} + +// +// makes a string safe to put in a header as an email address +// +function SafeHeaderEmail($s_str) +{ + // + // An email address is made up of local and domain parts + // each of these is made up of "words" separated by "." + // each "word" can be a sequence of characters excluding + // specials, space and control characters OR it can be + // a quoted string. + // + // The correct processing would be to completely + // parse the address, strip junk, double-quote + // words that need to be turned into quote strings, + // and return a well-formed email address. + // + // That's a lot of code! + // + // So, instead, we opt for stripping out control characters. + // + $s_str = preg_replace('/[[:cntrl:]]+/',"",$s_str); // zap all control chars + return ($s_str); +} + +// +// Expands an array of mail headers into mail header lines. +// +function ExpandMailHeaders($a_headers,$b_fold = false) +{ + $s_hdrs = ""; + $a_ordered_headers = OrderHeaders($a_headers); + for ($ii = 0 ; $ii < count($a_ordered_headers) ; $ii++) { + foreach ($a_ordered_headers[$ii] as $s_name => $s_value) { + if ($s_name != "") { + if ($s_hdrs != "") { + $s_hdrs .= Settings::get('HEAD_CRLF'); + } + if ($b_fold) { + $s_hdrs .= HeaderFolding($s_name . ": " . $s_value); + } else { + $s_hdrs .= $s_name . ": " . $s_value; + } + } + } + } + //FMDebug("Headers are: $s_hdrs"); + return ($s_hdrs); +} + +// +// Expands an array of mail headers into an array containing header lines. +// +function ExpandMailHeadersArray($a_headers) +{ + $a_hdrs = array(); + $a_ordered_headers = OrderHeaders($a_headers); + for ($ii = 0 ; $ii < count($a_ordered_headers) ; $ii++) { + foreach ($a_ordered_headers[$ii] as $s_name => $s_value) { + if ($s_name != "") { + $a_hdrs[] = $s_name . ": " . $s_value . Settings::get('HEAD_CRLF'); + } + } + } + return ($a_hdrs); +} + +// +// Low-level email send function; either calls PHP's mail function +// or uses the PEAR Mail object. +// NOTE: for some errors, there's no point trying to email +// an alert message! So, in these cases, we just display the error to +// the user. +// $s_options are ignored for PEAR sending. +// +function DoMail($s_to,$s_subject,$s_mesg,$a_headers,$s_options) +{ + global $ALT_MAIL_FUNCTION; + + if ($ALT_MAIL_FUNCTION !== '') { + return ($ALT_MAIL_FUNCTION($s_to,$s_subject,$s_mesg,$a_headers,$s_options)); + } else { + + // + // Encode the subject line. + // Ideally, we want to encode the relevant parts of To, From, Cc, + // Reply-To, and this is the right place to do it. + // However, it's another 1000 lines of code! + // So, we must compromise the code quality because of this cost. + // We encode subject here, and we encode the From line where it's + // created. The rest remain for a future version where code size + // can be controlled. + // + $s_subject = EncodeHeaderText($s_subject); + if (!Settings::isEmpty('PEAR_SMTP_HOST')) { + // + // Note that PEAR Mail seems to take responsibility for header line folding + // + require_once("Mail.php"); + + $a_params = array("host" => Settings::get('PEAR_SMTP_HOST'), + "port" => Settings::get('PEAR_SMTP_PORT') + ); + if (!Settings::isEmpty('PEAR_SMTP_USER')) { + $a_params["auth"] = TRUE; + $a_params["username"] = Settings::get('PEAR_SMTP_USER'); + $a_params["password"] = Settings::get('PEAR_SMTP_PWD'); + } + $mailer = Mail::factory("smtp",$a_params); + if (!is_object($mailer)) { + ShowError("pear_error",GetMessage(MSG_PEAR_OBJ),FALSE,FALSE); + FormMailExit(); + } + if (strtolower(get_class($mailer)) === 'pear_error') { + ShowError("pear_error",$mailer->getMessage(),FALSE,FALSE); + FormMailExit(); + } + if (!isset($a_headers['To']) && !isset($a_headers['to'])) { + $a_headers['To'] = SafeHeader($s_to); + } + if (!isset($a_headers['Subject']) && !isset($a_headers['subject'])) { + $a_headers['Subject'] = SafeHeader($s_subject); + } + $res = $mailer->send($s_to,$a_headers,$s_mesg); + if ($res === TRUE) { + return (TRUE); + } + + global $aAlertInfo; + + $aAlertInfo[] = GetMessage(MSG_PEAR_ERROR,array("MSG" => $res->getMessage())); + return (FALSE); + } else { + //$s_subject = HeaderFolding($s_subject,RFCLINELEN-10); // "Subject: " is about 10 chars + // + // Notes from Feb 2010.... + // + // PHP's mail function (tested in version 5.2.6) does folding of the + // To line and the Subject line. + // If we do it, then things break. + // + // This area is quite confusing. It's not clear whether the script + // should be folding header lines or whether the MTA should do it. + // We *do know* (as stated above) that folding To and Subject breaks things. + // + // But folding other header lines properly, seems to be OK. + // + // However, for years FormMail never did header line folding (except for the + // soft line breaks inserted by the quoted_printable_encode function we had used), + // and we didn't seem to get any reports of breakage (except for problems + // with the quoted_printable_encode soft line breaks!). + // + // So, even though we've implemented all the code for header line folding, + // we'll not use it. + // No header line folding will be performed in version 8.22 onwards. + // + if ($s_options !== "") { + return (mail($s_to,$s_subject,$s_mesg,ExpandMailHeaders($a_headers),$s_options)); + } else { + return (mail($s_to,$s_subject,$s_mesg,ExpandMailHeaders($a_headers))); + } + } + } +} + +// +// Send an email +// +function SendCheckedMail($to,$subject,$mesg,$sender,$a_headers = array()) +{ + + $b_f_option = false; + $b_form_option = IsMailOptionSet("SendMailFOption"); // this is superseded, but still supported + if (Settings::get('SENDMAIL_F_OPTION') || $b_form_option) { + if (empty($sender)) { + // + // SENDMAIL_F_OPTION with no sender is silently ignored + // + if ($b_form_option) { + // + // form has specified SendMailFOption, but there's no + // sender address + // + static $b_in_here = false; + global $SERVER; + + if (!$b_in_here) // prevent infinite recursion + { + $b_in_here = true; + SendAlert(GetMessage(MSG_NO_FOPT_ADDR)); + $b_in_here = false; + } + // + // if there's no from address, create a dummy one + // + $sender = "dummy@" . (isset($SERVER) ? $SERVER : "UnknownServer"); + $a_headers['From'] = $sender; + $b_f_option = true; + } + } else { + $b_f_option = true; + } + } + if (Settings::get('INI_SET_FROM') && !empty($sender)) { + ini_set('sendmail_from',$sender); + } + + return (DoMail($to,$subject,$mesg,$a_headers,($b_f_option ? "-f$sender" : ""))); +} + +// +// Send an alert email, but not if ATTACK_DETECTION_IGNORE_ERRORS is true. +// +function SendAlertIgnoreSpam($s_error,$b_filter = true,$b_non_error = false) +{ + if (!Settings::get('ATTACK_DETECTION_IGNORE_ERRORS')) { + SendAlert($s_error,$b_filter,$b_non_error); + } +} + +// +// Send an alert email +// +function SendAlert($s_error,$b_filter = true,$b_non_error = false) +{ + global $SPECIAL_VALUES,$FORMATTED_INPUT,$aServerVars,$aStrippedFormVars; + global $aAlertInfo,$aCleanedValues,$aFieldOrder,$sHTMLCharSet; + + // + // The following initialisations are so that ShowError can run from fmhookpreinit scripts + // + $aSpecialValues = isset($SPECIAL_VALUES) ? $SPECIAL_VALUES : array(); + $aFormattedInputValues = isset($FORMATTED_INPUT) ? $FORMATTED_INPUT : array(); + $aServerVarValues = isset($aServerVars) ? $aServerVars : array(); + $aStrippedFormVarValues = isset($aStrippedFormVars) ? $aStrippedFormVars : array(); + $aAlertInfoValues = isset($aAlertInfo) ? $aAlertInfo : array(); + $aCleaned = isset($aCleanedValues) ? $aCleanedValues : array(); + $aFieldOrderValues = isset($aFieldOrder) ? $aFieldOrder : array(); + + $s_error = str_replace("\n",Settings::get('BODY_LF'),$s_error); + $b_got_filter = GetFilterSpec($s_filter_name,$a_filter_list); + + // + // if there is a filter specified and we're not sending the alert + // through the filter, don't show the user's data. This is + // on the assumption that the filter is an encryption program; so, + // we don't want to send the user's data in clear text inside the + // alerts. + // + $b_show_data = true; + if ($b_got_filter && !$b_filter) { + $b_show_data = false; + } + + $s_form_subject = $s_alert_to = ""; + $b_check = true; + // + // might be too early to have $aSpecialValues set, so + // look in the form vars too + // + if (isset($aSpecialValues["alert_to"])) { + $s_alert_to = trim($aSpecialValues["alert_to"]); + } + if (empty($s_alert_to) && isset($aStrippedFormVarValues["alert_to"])) { + $s_alert_to = trim($aStrippedFormVarValues["alert_to"]); + } + + if (isset($aSpecialValues["subject"])) { + $s_form_subject = trim($aSpecialValues["subject"]); + } + if (empty($s_form_subject) && isset($aStrippedFormVarValues["subject"])) { + $s_form_subject = trim($aStrippedFormVarValues["subject"]); + } + + if (empty($s_alert_to)) { + $s_alert_to = Settings::get('DEF_ALERT'); + $b_check = false; + } + if (!empty($s_alert_to)) { + $s_from_addr = $s_from = ""; + $a_headers = array(); + if (!Settings::isEmpty('FROM_USER')) { + if (Settings::get('FROM_USER') != "NONE") { + $a_headers['From'] = Settings::get('FROM_USER'); + $s_from_addr = Settings::get('FROM_USER'); + $s_from = "From: $s_from_addr"; + } + } else { + global $SERVER; + + $s_from_addr = "FormMail@" . $SERVER; + $a_headers['From'] = $s_from_addr; + $s_from = "From: $s_from_addr"; + } + $s_mesg = "To: " . UnMangle($s_alert_to) . Settings::get('BODY_LF'); + // + // if a language pack has been included, a lot of error messages + // may need the character set to be provided. + // If that's available from the language pack, use it, + // otherwise, if it's a mail_option, use it from there. + // + $s_charset = ""; + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + $s_charset = $sHTMLCharSet; + } else { + if (IsMailOptionSet("CharSet")) { + $s_charset = GetMailOption("CharSet"); + } + } + + // + // Alerts are plain text emails, so convert any HTML entities + // back to their original characters. Note, this will only work on PHP + // version 4.3.0 and above. + // + if (function_exists("html_entity_decode")) { + $s_error = @html_entity_decode($s_error,ENT_COMPAT,$s_charset); + } + + if ($s_charset !== "") { + $a_headers['Content-Type'] = SafeHeader("text/plain; charset=$s_charset"); + } + + if (!empty($s_from)) { + $s_mesg .= $s_from . Settings::get('BODY_LF'); + } + $s_mesg .= Settings::get('BODY_LF'); + if (count($aAlertInfoValues) > 0) { + if ($b_show_data) { + $s_error .= Settings::get('BODY_LF') . GetMessage(MSG_MORE_INFO) . Settings::get('BODY_LF'); + $s_error .= implode(Settings::get('BODY_LF'),$aAlertInfoValues); + } else { + $s_error .= Settings::get('BODY_LF') . GetMessage(MSG_INFO_STOPPED) . Settings::get('BODY_LF'); + } + } + // + // some fields aren't security issues - show those in the alert + // + $a_safe_fields = array( + "email: " . isset($aSpecialValues["email"]) ? $aSpecialValues["email"] : '', + "realname: " . isset($aSpecialValues["realname"]) ? $aSpecialValues["realname"] : '', + ); + $s_safe_data = implode(Settings::get('BODY_LF'),$a_safe_fields); + + if ($b_non_error) { + $s_preamble = $s_error . Settings::get('BODY_LF') . Settings::get('BODY_LF'); + $s_mesg .= $s_preamble; + $s_subj = GetMessage(MSG_FM_ALERT); + if (!empty($s_form_subject)) { + $s_subj .= " ($s_form_subject)"; + } + } else { + $s_preamble = GetMessage(MSG_FM_ERROR_LINE) . Settings::get('BODY_LF') . + $s_error . Settings::get('BODY_LF') . Settings::get('BODY_LF'); + $s_mesg .= $s_preamble; + $s_subj = GetMessage(MSG_FM_ERROR); + if (!empty($s_form_subject)) { + $s_subj .= " ($s_form_subject)"; + } + $s_mesg .= $s_safe_data; + $s_mesg .= Settings::get('BODY_LF') . Settings::get('BODY_LF'); + if ($b_show_data) { + $s_mesg .= implode(Settings::get('BODY_LF'),$aFormattedInputValues); + } else { + $s_mesg .= GetMessage(MSG_USERDATA_STOPPED); + } + } + + /* + * We only need to filter the form fields if the filter that + * is specified is an encrypting filter. + */ + if ($b_filter && $b_got_filter && + IsFilterAttribSet($aSpecialValues["filter"],"Encrypts") + ) { + $s_new_mesg = $s_preamble . $s_safe_data; + $s_new_mesg .= Settings::get('BODY_LF') . Settings::get('BODY_LF'); + + if ($a_filter_list !== false) { + // + // just filter the critical fields + // + list($s_unfiltered,$s_filtered_results) = + GetFilteredOutput($aFieldOrderValues,$aCleaned, + $s_filter_name,$a_filter_list); + $s_new_mesg .= $s_unfiltered; + } else { + // + // filter everything + // + $s_filtered_results = Filter($s_filter_name,$s_mesg); + } + $s_new_mesg .= GetMessage(MSG_FILTERED,array("FILTER" => $s_filter_name)) . + Settings::get('BODY_LF') . Settings::get('BODY_LF') . + $s_filtered_results; + $s_mesg = $s_new_mesg; + } + $s_mesg .= Settings::get('BODY_LF'); + + if (isset($aServerVarValues['HTTP_REFERER'])) { + $s_mesg .= "Referring page was " . $aServerVarValues['HTTP_REFERER']; + } elseif (isset($aSpecialValues['this_form']) && $aSpecialValues['this_form'] !== "") { + $s_mesg .= "Referring form was " . $aSpecialValues['this_form']; + } + + $s_mesg .= Settings::get('BODY_LF'); + + if (isset($aServerVarValues['SERVER_NAME'])) { + $s_mesg .= "SERVER_NAME was " . $aServerVarValues['SERVER_NAME'] . Settings::get('BODY_LF'); + } + if (isset($aServerVarValues['REQUEST_URI'])) { + $s_mesg .= "REQUEST_URI was " . $aServerVarValues['REQUEST_URI'] . Settings::get('BODY_LF'); + } + + $s_mesg .= Settings::get('BODY_LF'); + + if (isset($aServerVarValues['REMOTE_ADDR'])) { + $s_mesg .= "User IP address was " . $aServerVarValues['REMOTE_ADDR'] . Settings::get('BODY_LF'); + } + if (isset($aServerVarValues['HTTP_USER_AGENT'])) { + $s_mesg .= "User agent was " . $aServerVarValues['HTTP_USER_AGENT'] . Settings::get('BODY_LF'); + } + + if ($b_check) { + if (CheckEmailAddress($s_alert_to,$s_valid,$s_invalid)) { + return (SendCheckedMail($s_valid,$s_subj,$s_mesg,$s_from_addr,$a_headers)); + } + } else { + return (SendCheckedMail($s_alert_to,$s_subj,$s_mesg,$s_from_addr,$a_headers)); + } + } + return (false); +} + +// +// Read the lines in a file and return an array. +// Each line is stripped of line termination characters. +// +function ReadLines($fp) +{ + $a_lines = array(); + while (!feof($fp)) { + $s_line = fgets($fp,4096); + // + // strip carriage returns and line feeds + // + $s_line = str_replace("\r","",$s_line); + $s_line = str_replace("\n","",$s_line); + $a_lines[] = $s_line; + } + return ($a_lines); +} + +// +// Open a URL and return the data from it as a string or array of lines. +// Returns false on failure ($s_error has the error string) +// +function GetURL($s_url,&$s_error,$b_ret_lines = false,$n_depth = 0) +{ + global $php_errormsg,$aServerVars,$sUserAgent,$ExecEnv; + + // + // open the URL with the same session as we have + // + if ($ExecEnv->allowSessionURL()) { + if (session_id() !== "") { + $s_url = AddURLParams($s_url,session_name() . "=" . urlencode(session_id())); + } + if (defined("SID")) { + $s_url = AddURLParams($s_url,SID); + } + } + + $http_get = new HTTPGet($s_url); + + // + // Determine authentication requirements + // + if (Settings::get('AUTHENTICATE') !== "" || Settings::get('AUTH_USER') !== "" || Settings::get('AUTH_PW') !== "") { + if (Settings::get('AUTHENTICATE') === "") { + $http_get->SetAuthentication("Basic",Settings::get('AUTH_USER'),Settings::get('AUTH_PW')); + } else { + $http_get->SetAuthenticationLine(Settings::get('AUTHENTICATE')); + } + } else { + $a_parts = $http_get->GetURLSplit(); + if (isset($a_parts["user"]) || isset($a_parts["pass"])) { + $s_auth_user = isset($a_parts["user"]) ? $a_parts["user"] : ""; + $s_auth_pass = isset($a_parts["pass"]) ? $a_parts["pass"] : ""; + } else { + $s_auth_type = isset($aServerVars["PHP_AUTH_TYPE"]) ? $aServerVars["PHP_AUTH_TYPE"] : ""; + $s_auth_user = isset($aServerVars["PHP_AUTH_USER"]) ? $aServerVars["PHP_AUTH_USER"] : ""; + $s_auth_pass = isset($aServerVars["PHP_AUTH_PW"]) ? $aServerVars["PHP_AUTH_PW"] : ""; + } + if (!isset($s_auth_type) || $s_auth_type === "") { + $s_auth_type = "Basic"; + } + if ($s_auth_user !== "" || $s_auth_pass !== "") { + $http_get->SetAuthentication($s_auth_type,$s_auth_user,$s_auth_pass); + } + } + // + // set the user agent + // + $http_get->SetAgent($sUserAgent); + // + // resolve the name now so the DNS cache can be written to the session + // + $http_get->Resolve(); + + // + // Since we might be opening a URL within the same session, we can + // get locks. So, close the session for writing to prevent this. + // + $b_closed = false; + if (function_exists('session_write_close')) { + session_write_close(); + $b_closed = true; + //ob_flush(); // this prevents automatic redirects if $TEMPLATEURL + // is in use and JavaScript is switched off + } + + $m_buf = FALSE; + + //FMDebug("Begin read"); + if (($a_lines = $http_get->Read()) === FALSE) { + $http_get->Close(); + // + // get the error code and send the appropriate alert + // + list($i_error,$i_sys_err,$s_sys_msg) = $http_get->GetError(); + switch ($i_error) { + case $http_get->nErrParse: + $s_error = GetMessage(MSG_URL_PARSE); + break; + case $http_get->nErrScheme: + $a_parts = $http_get->GetURLSplit(); + $s_error = GetMessage(MSG_URL_SCHEME,array("SCHEME" => $a_parts["scheme"])); + break; + default: + $s_error = GetMessage(MSG_SOCKET, + array("ERRNO" => $i_sys_err, + "ERRSTR" => $s_sys_msg, + "PHPERR" => isset($php_errormsg) ? $php_errormsg : "" + )); + break; + } + } else { + $http_get->Close(); + // + // check the HTTP response for actual status. Anything outside + // 200-299 is a failure, but we also handle redirects. + // + list($i_http_code,$s_http_status) = $http_get->GetHTTPStatus(); + + if ($i_http_code < 200 || $i_http_code > 299) { + switch ($i_http_code) { + case 300: // multiple choices (we'll take the first) + case 301: // moved permanently + case 302: // found + case 303: // see other + /** @noinspection PhpMissingBreakStatementInspection */ + case 307: // temporary redirect + // + // a "location" header must be present for us to continue + // In the case of infinite redirects, we need to stop. + // So, we limit to a maximum of 10 redirects. + // + if ($n_depth < 10) { + if (($s_location = $http_get->FindHeader("location")) !== false) { + FMDebug("Redirect from '$s_url' to '$s_location'"); + $m_buf = GetURL($s_location,$s_error,$b_ret_lines,$n_depth + 1); + $b_closed = false; + break; + } + FMDebug("Redirect FAILED - no location header"); + } else { + FMDebug("Redirect FAILED depth=$n_depth"); + } + // FALL THRU + default: + $s_error = GetMessage(MSG_GETURL_OPEN,array("STATUS" => $s_http_status,"URL" => $s_url)); + break; + } + } elseif ($b_ret_lines) { + $m_buf = $a_lines; + } else + // + // return lines as one big string buffer + // + { + $m_buf = implode("",$a_lines); + } + } + // + // re-open our session + // + if ($b_closed) { + session_start(); + } + + return ($m_buf); +} + +// +// Write to the debug log if it exists and is writable. +// +function FMDebug($s_mesg) +{ + static $fDebug = NULL; + + if (!isset($fDebug)) { + $fDebug = false; // only initialize once + $s_db_file = "fmdebug.log"; // look for debug file in current directory + // + // we only open an existing file - we don't create one + // + if (file_exists($s_db_file)) { + if (($fDebug = fopen($s_db_file,"a")) === false) { + return; + } + } + } + if ($fDebug !== false) { + fwrite($fDebug,date('r') . ": " . $s_mesg . "\n"); + fflush($fDebug); + } +} + +/* + * Class: NetIO + * Description: + * A class to provide internet input/output capabilities. + * Use as a base class for more specific functions. + */ + +class NetIO +{ + var $_sHost; + var $_iPort; + var $_sPrefix; + + var $_iConnTimeout; + var $_fSock; + + var $_aIPs; + + var $_iError = 0; + var $_iSysErr; + var $_sSysMesg; + + var $nErrInit = -1; // not initialized + var $nErrRead = -2; // read error + var $nErrWrite = -3; // write error + var $nErrWriteShort = -4; // failed to write all bytes + + var $nErrSocket = -100; // error in socket open + + function __construct($s_host = NULL,$i_port = NULL,$s_prefix = "") + { + if (isset($s_host)) { + $this->_sHost = $s_host; + } + if (isset($i_port)) { + $this->_iPort = $i_port; + } + $this->_sPrefix = $s_prefix; + $this->_iConnTimeout = 30; + $this->_iSysErr = 0; + $this->_sSysMesg = ""; + } + + function _SetError($i_error,$i_sys_err = 0,$s_sys_mesg = "") + { + $this->_iError = $i_error; + $this->_iSysErr = $i_sys_err; + $this->_sSysMesg = $s_sys_mesg; + return (FALSE); + } + + function IsError() + { + return $this->_iError !== 0; + } + + function ClearError() + { + $this->_SetError(0); + } + + function GetError() + { + return (array($this->_iError,$this->_iSysErr,$this->_sSysMesg)); + } + + function SetHost($s_host) + { + $this->_sHost = $s_host; + } + + function SetPort($i_port) + { + $this->_iPort = $i_port; + } + + function SetConnectionTimeout($i_secs) + { + $this->_iConnTimeout = $i_secs; + } + + function SetPrefix($s_prefix) + { + $this->_sPrefix = $s_prefix; + } + + function GetHost() + { + return (isset($this->_sHost) ? $this->_sHost : ""); + } + + function GetPort() + { + return (isset($this->_iPort) ? $this->_iPort : 0); + } + + function GetPrefix() + { + return ($this->_sPrefix); + } + + function GetConnectionTimeout() + { + return ($this->_iConnTimeout); + } + + function _CacheIt() + { + FMDebug("Caching " . implode(",",$this->_aIPs)); + if (IsSetSession("FormNetIODNSCache")) { + $a_cache = GetSession("FormNetIODNSCache"); + } else { + $a_cache = array(); + } + $a_cache[$this->_sHost] = $this->_aIPs; + SetSession("FormNetIODNSCache",$a_cache); + } + + /* + * Some versions of PHP seem to have a major slowdown when resolving + * names with gethostbyname (5 seconds with PHP 4.3.9). + * So, in the case of multi-page forms using MULTIFORMURL, we get a big speed up + * by caching the IP address of the server. + */ + function _CheckCache() + { + if (!IsSetSession("FormNetIODNSCache")) { + return (FALSE); + } + $a_cache = GetSession("FormNetIODNSCache"); + if (!is_array($a_cache) || !isset($a_cache[$this->_sHost]) || !is_array($a_cache[$this->_sHost])) { + return (FALSE); + } + $this->_aIPs = $a_cache[$this->_sHost]; + return (TRUE); + } + + function Resolve() + { + $this->ClearError(); + if (!isset($this->_sHost)) { + return ($this->_SetError($this->nErrInit)); + } + if ($this->_CheckCache()) { + return (TRUE); + } + FMDebug("Start resolve of " . $this->_sHost); + // + // if host is an actual IP address, then it is returned unchanged, which is good! + // + if (($a_ip_list = gethostbynamel($this->_sHost)) === FALSE) { + FMDebug("Resolve failed"); + return ($this->_SetError($this->nErrInit,0, + GetMessage(MSG_RESOLVE,array("NAME" => $this->_sHost)))); + } + FMDebug("Done resolve: " . implode(",",$a_ip_list)); + $this->_aIPs = $a_ip_list; + $this->_CacheIt(); + return (TRUE); + } + + function _SSLOpen($s_ip,&$errno,&$errstr,$i_timeout) + { + global $ExecEnv; + + FMDebug("Using _SSLOpen (stream_socket_client), SNI, host=" . $this->GetHost()); + $context = stream_context_create(); + $result = stream_context_set_option($context,'ssl','verify_host',true); + $result = stream_context_set_option($context,'ssl','verify_peer',false); + $result = stream_context_set_option($context,'ssl','allow_self_signed',true); + $result = stream_context_set_option($context,'ssl','SNI_enabled',true); + if ($ExecEnv->IsPHPAtLeast("5.6.0")) { + $result = stream_context_set_option($context,'ssl','peer_name',$this->GetHost()); + } else { + $result = stream_context_set_option($context,'ssl','SNI_server_name',$this->GetHost()); + } + // + // Note that even if SNI fails, the socket will still open, but the + // web server should send a 400 error. + // + return (stream_socket_client($this->GetPrefix() . $s_ip . ":" . $this->GetPort(), + $errno,$errstr,$i_timeout,STREAM_CLIENT_CONNECT,$context)); + } + + /** @noinspection PhpUndefinedVariableInspection */ + function Open() + { + $this->ClearError(); + if (!isset($this->_sHost) || !isset($this->_iPort)) { + return ($this->_SetError($this->nErrInit)); + } + if (!$this->Resolve()) { + return (FALSE); + } + FMDebug("Starting socket open"); + $f_sock = FALSE; + // + // Now, run through the list of IPs until we find one that connects. + // However, this can cause problems with SNI in SSL/TLS connections. + // If there is only one IP address, use the host name. + // Otherwise, if we can specify SNI and it's an SSL connection + // use streams, otherwise try each IP individually. + // + if (count($this->_aIPs) == 1) { + FMDebug("Trying host " . $this->_sHost . ", timeout " . $this->GetConnectionTimeout()); + $f_sock = @fsockopen($this->GetPrefix() . $this->_sHost,$this->GetPort(), + $errno,$errstr,$this->GetConnectionTimeout()); + } else { + foreach ($this->_aIPs as $s_ip) { + global $ExecEnv; + + FMDebug("Trying IP $s_ip, timeout " . $this->GetConnectionTimeout()); + if ($ExecEnv->IsPHPAtLeast("5.3.2") && substr($this->GetPrefix(),0,3) == "ssl") { + if (($f_sock = $this->_SSLOpen($s_ip,$errno,$errstr, + $this->GetConnectionTimeout())) !== FALSE + ) { + break; + } + } elseif (($f_sock = @fsockopen($this->GetPrefix() . $s_ip,$this->GetPort(), + $errno,$errstr,$this->GetConnectionTimeout())) !== FALSE + ) { + break; + } + } + } + if ($f_sock === FALSE) { + FMDebug("open failed: $errno $errstr"); + return ($this->_SetError($this->nErrSocket,$errno,$errstr)); + } + $this->_fSock = $f_sock; + FMDebug("Done socket open"); + return (TRUE); + } + + function Read() + { + $this->ClearError(); + $a_lines = array(); + while (($s_line = fgets($this->_fSock)) !== FALSE) { + $a_lines[] = $s_line; + } + FMDebug("Read " . count($a_lines) . " lines"); + return ($a_lines); + } + + function Write($s_str,$b_flush = TRUE) + { + $this->ClearError(); + if (!isset($this->_fSock)) { + return ($this->_SetError($this->nErrInit)); + } + if (($n_write = fwrite($this->_fSock,$s_str)) === FALSE) { + return ($this->_SetError($this->nErrWrite)); + } + if ($n_write != strlen($s_str)) { + return ($this->_SetError($this->nErrWriteShort)); + } + if ($b_flush) { + if (fflush($this->_fSock) === FALSE) { + return ($this->_SetError($this->nErrWriteShort)); + } + } + return (TRUE); + } + + function Close() + { + if (isset($this->_fSock)) { + fclose($this->_fSock); + unset($this->_fSock); + } + } +} + +/* + * Class: HTTPGet + * Description: + * A class that implements HTTP GET method. + */ + +class HTTPGet extends NetIO +{ + var $_sURL; + var $_aURLSplit; + + var $_sRequest; + var $_aResponse; + var $_aRespHeaders; + + var $_sAuthLine; + var $_sAuthType; + var $_sAuthUser; + var $_sAuthPass; + + var $_sAgent; + + var $nErrParse = -1000; // failed to parse URL + var $nErrScheme = -1001; // unsupported URL scheme + + function __construct($s_url = "") + { + parent::__construct(); + $this->_aURLSplit = array(); + if (($this->_sURL = $s_url) !== "") { + $this->_SplitURL(); + } + } + + function _SplitURL() + { + FMDebug("URL: " . $this->_sURL); + if (($this->_aURLSplit = parse_url($this->_sURL)) === FALSE) { + $this->_aURLSplit = array(); + return ($this->_SetError($this->nErrParse)); + } + return (TRUE); + } + + function GetURLSplit() + { + return ($this->_aURLSplit); + } + + function SetURL($s_url) + { + $this->_aURLSplit = array(); + $this->_sURL = $s_url; + return ($this->_SplitURL()); + } + + function _Init() + { + if (!isset($this->_aURLSplit["host"])) { + return ($this->_SetError($this->nErrInit)); + } + $this->SetHost($this->_aURLSplit["host"]); + $i_port = 80; + $b_use_ssl = false; + if (isset($this->_aURLSplit["scheme"])) { + switch (strtolower($this->_aURLSplit["scheme"])) { + case "http": + break; + case "https": + $b_use_ssl = true; + $i_port = 443; + break; + default: + return ($this->_SetError($this->nErrScheme)); + } + } + if (isset($this->_aURLSplit["port"])) { + $i_port = $this->_aURLSplit["port"]; + } + if ($b_use_ssl) + // + // we require ssl:// for port 443 + // + { + $this->SetPrefix("ssl://"); + } + $this->SetPort($i_port); + return (TRUE); + } + + function _SendRequest() + { + $this->_PrepareRequest(); + return (parent::Write($this->_sRequest)); + } + + function _PrepareRequest($s_method = 'GET') + { + FMDebug("Path: " . $this->_aURLSplit["path"]); + if (!isset($this->_aURLSplit["path"]) || $this->_aURLSplit["path"] === "") { + $s_path = "/"; + } // default path + else { + $s_path = $this->_aURLSplit["path"]; + } + if (isset($this->_aURLSplit["query"])) { + // + // add the query to the path + // Note that parse_url decodes the query string (urldecode), so + // we need to split it into its component parameters + // are re-encode their values. Calling urlencode($this->_aURLSplit["query"]) + // encodes the '=' between parameters and this breaks things. + // + $a_params = explode('&',$this->_aURLSplit["query"]); + foreach ($a_params as $i_idx => $s_param) { + if (($i_pos = strpos($s_param,"=")) === false) { + $a_params[$i_idx] = urlencode($s_param); + } else { + $a_params[$i_idx] = substr($s_param,0,$i_pos) . '=' . + urlencode(substr($s_param,$i_pos + 1)); + } + } + $s_path .= "?" . implode('&',$a_params); + } + // + // add the fragment to the path. + // + if (isset($this->_aURLSplit["fragment"])) { + $s_path .= '#' . urlencode($this->_aURLSplit["fragment"]); + } + // + // build the request + // + $s_req = $s_method . " $s_path HTTP/1.0\r\n"; + // + // Add authentication + // + if (isset($this->_sAuthLine)) { + $s_req .= "Authorization: $this->_sAuthLine\r\n"; + } elseif (isset($this->_sAuthType)) { + $s_req .= "Authorization: " . $this->_sAuthType . " " . + base64_encode($this->_sAuthUser . ":" . $this->_sAuthPass) . "\r\n"; + } + // + // Specify the host name + // + $s_req .= "Host: " . $this->GetHost() . "\r\n"; + // + // Specify the user agent + // + if (isset($this->_sAgent)) { + $s_req .= "User-Agent: " . $this->_sAgent . "\r\n"; + } + // + // Accept any output + // + $s_req .= "Accept: */*\r\n"; + $s_req .= $this->_AdditionalHeaders(); + // + // End of request headers + // + $s_req .= "\r\n"; + $this->_sRequest = $s_req; + } + + function _AdditionalHeaders() + { + return (''); + } + + function _GetResponse() + { + FMDebug("Reading"); + if (($a_lines = parent::Read()) === FALSE) { + return (FALSE); + } + + $this->_aRespHeaders = $this->_aResponse = array(); + $b_body = FALSE; + for ($ii = 0 ; $ii < count($a_lines) ; $ii++) { + if ($b_body) { + //FMDebug("Body line: ".rtrim($a_lines[$ii])); + $this->_aResponse[] = $a_lines[$ii]; + } elseif ($a_lines[$ii] == "\r\n" || $a_lines[$ii] == "\n") { + $b_body = TRUE; + } else { + //FMDebug("Header line: ".rtrim($a_lines[$ii])); + $this->_aRespHeaders[] = $a_lines[$ii]; + } + } + return (TRUE); + } + + function GetResponseHeaders() + { + return ($this->_aRespHeaders); + } + + function FindHeader($s_name) + { + $s_name = strtolower($s_name); + $i_len = strlen($s_name); + for ($ii = 0 ; $ii < count($this->_aRespHeaders) ; $ii++) { + $s_line = $this->_aRespHeaders[$ii]; + if (($s_hdr = substr($s_line,0,$i_len)) !== false) { + $s_hdr = strtolower($s_hdr); + if ($s_hdr === $s_name && substr($s_line,$i_len,1) === ":") { + return (trim(substr($s_line,$i_len + 1))); + } + } + } + return (false); + } + + function GetHTTPStatus() + { + $i_http_code = 0; + $s_status = ""; + for ($ii = 0 ; $ii < count($this->_aRespHeaders) ; $ii++) { + $s_line = $this->_aRespHeaders[$ii]; + if (substr($s_line,0,4) == "HTTP") { + $i_pos = strpos($s_line," "); + $s_status = substr($s_line,$i_pos + 1); + $i_end_pos = strpos($s_status," "); + if ($i_end_pos === false) { + $i_end_pos = strlen($s_status); + } + $i_http_code = (int)substr($s_status,0,$i_end_pos); + } + } + return (array($i_http_code,$s_status)); + } + + function Resolve() + { + if (!$this->_Init()) { + return (FALSE); + } + return (parent::Resolve()); + } + + function Read() + { + if (!$this->_Init()) { + return (FALSE); + } + FMDebug("Init done"); + if (!$this->Open()) { + return (FALSE); + } + FMDebug("Open done"); + if (!$this->_SendRequest()) { + return (FALSE); + } + FMDebug("Send done"); + if (!$this->_GetResponse()) { + return (FALSE); + } + FMDebug("Get done"); + $this->Close(); + return ($this->_aResponse); + } + + function SetAuthenticationLine($s_auth) + { + $this->_sAuthLine = $s_auth; + } + + function SetAuthentication($s_type,$s_user,$s_pass) + { + $this->_sAuthType = $s_type; + $this->_sAuthUser = $s_user; + $this->_sAuthPass = $s_pass; + } + + function SetAgent($s_agent) + { + $this->_sAgent = $s_agent; + } +} + +/* + * Class: HTTPPost + * Description: + * A class that implements HTTP POST method. + */ + +class HTTPPost extends HTTPGet +{ + var $_sPostData; /* data to POST */ + + function __construct($s_url = "") + { + $this->_sPostData = ''; + parent::__construct($s_url); + } + + function _SendRequest() + { + $this->_PrepareRequest(); + return (NetIO::Write($this->_sRequest)); + } + + function _PrepareRequest($s_method = 'POST') + { + parent::_PrepareRequest($s_method); + $this->_AddData(); + } + + function _AdditionalHeaders() + { + // + // we don't handle file uploads yet + // + $a_hdrs = array( + 'Content-Type: application/x-www-form-urlencoded', + 'Content-Length: ' . strlen($this->_sPostData), + ); + return (implode("\r\n",$a_hdrs)); + } + + function _AddData() + { + $this->_sRequest .= "\r\n"; // blank line after headers + $this->_sRequest .= $this->_sPostData; + } + + function _EncodeData($a_fields) + { + $s_data = ''; + foreach ($a_fields as $s_name => $s_value) { + if ($s_data != '') { + $s_data .= '&'; + } + if (is_string($s_value)) { + $s_data .= urlencode($s_name) . '=' . urlencode($s_value); + } else { + $s_data .= urlencode($s_name) . '=' . urlencode(serialize($s_value)); + } + } + return ($s_data); + } + + function Post($a_fields) + { + // + // we don't handle file uploads yet + // + $this->_sPostData = $this->_EncodeData($a_fields); + return ($this->Read()); + } +} + +// +// Load a template file into a string. +// +function LoadTemplate($s_name,$s_dir,$s_url,$b_ret_lines = false) +{ + global $php_errormsg; + + $s_buf = ""; + $a_lines = array(); + if (!empty($s_dir)) { + $s_name = "$s_dir/" . basename($s_name); + @ $fp = fopen($s_name,"r"); + if ($fp === false) { + SendAlert(GetMessage(MSG_OPEN_TEMPLATE,array("NAME" => $s_name, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + if ($b_ret_lines) { + $a_lines = ReadLines($fp); + } else + // + // load the whole template into a string + // + { + $s_buf = fread($fp,filesize($s_name)); + } + fclose($fp); + } else { + if (substr($s_url,-1) == '/') { + $s_name = "$s_url" . basename($s_name); + } else { + $s_name = "$s_url/" . basename($s_name); + } + if (($m_data = GetURL($s_name,$s_error,$b_ret_lines)) === false) { + SendAlert($s_error); + return (false); + } + if ($b_ret_lines) { + $a_lines = $m_data; + // + // strip line terminations from each line + // + for ($ii = count($a_lines) ; --$ii >= 0 ;) { + $s_line = $a_lines[$ii]; + $s_line = str_replace("\r","",$s_line); + $s_line = str_replace("\n","",$s_line); + $a_lines[$ii] = $s_line; + } + } else { + $s_buf = $m_data; + } + } + return ($b_ret_lines ? $a_lines : $s_buf); +} + +// +// To show an error template. The template must be HTML and, for security +// reasons, must be a file on the server in the directory specified +// by $TEMPLATEDIR or $TEMPLATEURL. +// $a_specs is an array of substitutions to perform, as follows: +// tag-name replacement string +// +// For example: +// "fmerror"=>"An error message" +// +function ShowErrorTemplate($s_name,$a_specs,$b_user_error) +{ + if (function_exists('FMHookShowErrorTemplate')) { + if (FMHookShowErrorTemplate($s_name,$a_specs,$b_user_error)) { + return (true); + } + } + if (Settings::isEmpty('TEMPLATEDIR') && Settings::isEmpty('TEMPLATEURL')) { + SendAlert(GetMessage(MSG_TEMPLATES)); + return (false); + } + if (($s_buf = LoadTemplate($s_name,Settings::get('TEMPLATEDIR'),Settings::get('TEMPLATEURL'))) === false) { + return (false); + } + + // + // now look for the tags to replace + // + foreach ($a_specs as $s_tag => $s_value) + // + // search for + // + // or + // [tagname/] + // with optional whitespace + // + { + $s_buf = preg_replace('/[<\[]\s*' . preg_quote($s_tag,"/") . '\s*\/\s*[>\]]/ims', + nl2br($s_value),$s_buf); + } + if ($b_user_error) { + // strip any and tags + // or [fmusererrors] and [/fmusererror] tags + // + // You can show information that's specific to user + // errors between these special tags. + // + $s_buf = preg_replace('/[<\[]\s*\/?\s*fmusererror\s*[>\]]/ims','',$s_buf); + // + // since this isn't a system error, strip anything between + // and + // or [fmsyserrors] and [/fmsyserror] tags + // + $s_buf = preg_replace('/[<\[]\s*fmsyserror\s*[>\]].*[<\[]\s*\/\s*fmsyserror\s*[>\]]/ims','',$s_buf); + } else { + // strip any and tags + // or [fmsyserrors] and [/fmsyserror] tags + // + // You can show information that's specific to system + // errors between these special tags. + // + $s_buf = preg_replace('/[<\[]\s*\/?\s*fmsyserror\s*[>\]]/ims','',$s_buf); + // + // since this isn't a user error, strip anything between + // and + // or [fmusererrors] and [/fmusererror] tags + // + $s_buf = preg_replace('/[<\[]\s*fmusererror\s*[>\]].*[<\[]\s*\/\s*fmusererror\s*[>\]]/ims','',$s_buf); + } + // + // just output the page + // + echo $s_buf; + return (true); +} + +// +// To show an error to the user. +// +function ShowError($error_code,$error_mesg,$b_user_error, + $b_alerted = false,$a_item_list = array(),$s_extra_info = "") +{ + global $SPECIAL_FIELDS,$SPECIAL_MULTI,$SPECIAL_VALUES; + global $aServerVars,$aStrippedFormVars; + + // + // The following initialisations are so that ShowError can run from fmhookpreinit scripts + // + $aSpecialFieldValues = isset($SPECIAL_FIELDS) ? $SPECIAL_FIELDS : array(); + $aSpecialValues = isset($SPECIAL_VALUES) ? $SPECIAL_VALUES : array(); + $aSpecialMultiValues = isset($SPECIAL_MULTI) ? $SPECIAL_MULTI : array(); + $aServerVarValues = isset($aServerVars) ? $aServerVars : array(); + $aStrippedFormVarValues = isset($aStrippedFormVars) ? $aStrippedFormVars : array(); + + // + // Testing with PHP 4.0.6 indicates that sessions don't always work. + // So, we'll also add the error to the URL, unless + // PUT_DATA_IN_URL is false. + // + SetSession("FormError",$error_mesg); + SetSession("FormErrorInfo",$s_extra_info); + SetSession("FormErrorCode",$error_code); + SetSession("FormErrorItems",$a_item_list); + SetSession("FormIsUserError",$b_user_error); + SetSession("FormAlerted",$b_alerted); + SetSession("FormData",array()); + + $bad_url = isset($aSpecialValues["bad_url"]) ? $aSpecialValues["bad_url"] : ''; + $bad_template = isset($aSpecialValues["bad_template"]) ? $aSpecialValues["bad_template"] : ''; + $this_form = isset($aSpecialValues["this_form"]) ? $aSpecialValues["this_form"] : ''; + if (IsAjax()) { + JSON_Result("ERROR",array("ErrorCode" => $error_code, + "UserError" => $b_user_error, + "ErrorMesg" => $error_mesg, + "Alerted" => $b_alerted, + "ErrorItems" => $a_item_list + )); + ZapSession(); + } elseif (!empty($bad_url)) { + $a_params = array(); + if (Settings::get('PUT_DATA_IN_URL')) { + $a_params[] = "this_form=" . urlencode("$this_form"); + $a_params[] = "bad_template=" . urlencode("$bad_template"); + $a_params[] = "error=" . urlencode("$error_mesg"); + $a_params[] = "extra=" . urlencode("$s_extra_info"); + $a_params[] = "errcode=" . urlencode("$error_code"); + $a_params[] = "isusererror=" . ($b_user_error ? "1" : "0"); + $a_params[] = "alerted=" . ($b_alerted ? "1" : "0"); + $i_count = 1; + foreach ($a_item_list as $s_item) { + $a_params[] = "erroritem$i_count=" . urlencode("$s_item"); + $i_count++; + } + } else { + $a_sess_data = GetSession("FormData"); + $a_sess_data["this_form"] = "$this_form"; + $a_sess_data["bad_template"] = "$bad_template"; + SetSession("FormData",$a_sess_data); + // + // tell the bad_url to look in the session only + // + $a_params[] = "insession=1"; + } + // + // Add the posted data to the URL so that an intelligent + // $bad_url can call the form again + // + foreach ($aStrippedFormVarValues as $s_name => $m_value) { + // + // skip special fields + // + $b_special = false; + if (in_array($s_name,$aSpecialFieldValues)) { + $b_special = true; + } else { + foreach ($aSpecialMultiValues as $s_multi_fld) { + $i_len = strlen($s_multi_fld); + if (substr($s_name,0,$i_len) == $s_multi_fld) { + $i_index = (int)substr($s_name,$i_len); + if ($i_index > 0) { + $b_special = true; + break; + } + } + } + } + if (!$b_special) { + if (Settings::get('PUT_DATA_IN_URL')) { + if (is_array($m_value)) { + foreach ($m_value as $s_value) { + $a_params[] = "$s_name" . '[]=' . + urlencode(substr($s_value,0,Settings::get('MAXSTRING'))); + } + } else { + $a_params[] = "$s_name=" . urlencode(substr($m_value,0,Settings::get('MAXSTRING'))); + } + } else { + $a_sess_data = GetSession("FormData"); + if (is_array($m_value)) { + $a_sess_data["$s_name"] = $m_value; + } else { + $a_sess_data["$s_name"] = substr($m_value,0,Settings::get('MAXSTRING')); + } + SetSession("FormData",$a_sess_data); + } + } + } + // + // Now add the authentication data, if any + // + if ((isset($aServerVarValues["PHP_AUTH_USER"]) && + $aServerVarValues["PHP_AUTH_USER"] !== "") || + (isset($aServerVarValues["PHP_AUTH_PW"]) && + $aServerVarValues["PHP_AUTH_PW"] !== "") + ) { + if (Settings::get('PUT_DATA_IN_URL')) { + if (isset($aServerVarValues["PHP_AUTH_USER"])) { + $a_params[] = "PHP_AUTH_USER=" . urlencode($aServerVarValues["PHP_AUTH_USER"]); + } + + if (isset($aServerVarValues["PHP_AUTH_PW"])) { + $a_params[] = "PHP_AUTH_PW=" . urlencode($aServerVarValues["PHP_AUTH_PW"]); + } + + if (isset($aServerVarValues["PHP_AUTH_TYPE"])) { + $a_params[] = "PHP_AUTH_TYPE=" . urlencode($aServerVarValues["PHP_AUTH_TYPE"]); + } + } else { + $a_sess_data = GetSession("FormData"); + if (isset($aServerVarValues["PHP_AUTH_USER"])) { + $a_sess_data["PHP_AUTH_USER"] = $aServerVarValues["PHP_AUTH_USER"]; + } + + if (isset($aServerVarValues["PHP_AUTH_PW"])) { + $a_sess_data["PHP_AUTH_PW"] = $aServerVarValues["PHP_AUTH_PW"]; + } + + if (isset($aServerVarValues["PHP_AUTH_TYPE"])) { + $a_sess_data["PHP_AUTH_TYPE"] = $aServerVarValues["PHP_AUTH_TYPE"]; + } + SetSession("FormData",$a_sess_data); + } + } + $bad_url = AddURLParams($bad_url,$a_params,false); + Redirect($bad_url,GetMessage(MSG_FORM_ERROR)); + } else { + if (!empty($bad_template)) { + $a_specs = array("fmerror" => htmlspecialchars("$error_mesg"), + "fmerrorcode" => htmlspecialchars("$error_code"), + "fmfullerror" => htmlspecialchars("$error_mesg") . "\n" . + htmlspecialchars("$s_extra_info"), + "fmerrorextra" => htmlspecialchars("$s_extra_info"), + ); + for ($i_count = 1 ; $i_count <= 20 ; $i_count++) { + $a_specs["fmerroritem$i_count"] = ""; + } + $i_count = 1; + foreach ($a_item_list as $s_item) { + $a_specs["fmerroritem$i_count"] = htmlspecialchars($s_item); + $i_count++; + } + $s_list = ""; + foreach ($a_item_list as $s_item) { + $s_list .= "
  • " . htmlspecialchars($s_item) . "
  • "; + } + $a_specs["fmerroritemlist"] = $s_list; + if (ShowErrorTemplate($bad_template,$a_specs,$b_user_error)) { + return; + } + } + $s_text = GetMessage(MSG_ERROR_PROC); + if ($b_user_error) { + $s_text .= $error_mesg . "\n" . FixedHTMLEntities($s_extra_info); + } else { + global $SERVER; + + if ($b_alerted) { + $s_text .= GetMessage(MSG_ALERT_DONE,array("SERVER" => $SERVER)); + } else { + $s_text .= GetMessage(MSG_PLS_CONTACT,array("SERVER" => $SERVER)); + } + $s_text .= GetMessage(MSG_APOLOGY,array("SERVER" => $SERVER)); + } + CreatePage($s_text,GetMessage(MSG_FORM_ERROR),false); + // + // the session data is not needed now + // + ZapSession(); + } +} + +// +// Report an error. Same as Error, but implements +// ATTACK_DETECTION_IGNORE_ERRORS. +// +function ErrorWithIgnore($error_code,$error_mesg,$b_filter = true,$show = true,$int_mesg = "") +{ + if (function_exists('FMHookErrorWithIgnore')) { + FMHookErrorWithIgnore($error_code,$error_mesg,$b_filter,$show,$int_mesg); + } + + $b_alerted = false; + if (!Settings::get('ATTACK_DETECTION_IGNORE_ERRORS')) { + if (SendAlert("$error_code\n *****$int_mesg*****\nError=$error_mesg\n",$b_filter)) { + $b_alerted = true; + } + } + if ($show) { + ShowError($error_code,$error_mesg,false,$b_alerted); + } else + // + // show something to the user + // + { + ShowError($error_code,GetMessage(MSG_SUBM_FAILED),false,$b_alerted); + } + FormMailExit(); +} + +// +// Report an error +// +function Error($error_code,$error_mesg,$b_filter = true,$show = true,$int_mesg = "") +{ + if (function_exists('FMHookError')) { + FMHookError($error_code,$error_mesg,$b_filter,$show,$int_mesg); + } + + $b_alerted = false; + if (SendAlert("$error_code\n *****$int_mesg*****\nError=$error_mesg\n",$b_filter)) { + $b_alerted = true; + } + if ($show) { + ShowError($error_code,$error_mesg,false,$b_alerted); + } else + // + // show something to the user + // + { + ShowError($error_code,GetMessage(MSG_SUBM_FAILED),false,$b_alerted); + } + FormMailExit(); +} + +// +// Report a user error +// +function UserError($s_error_code,$s_error_mesg, + $s_extra_info = "",$a_item_list = array()) +{ + if (function_exists('FMHookUserError')) { + FMHookUserError($s_error_code,$s_error_mesg,$s_extra_info,$a_item_list); + } + $b_alerted = false; + if (Settings::get('ALERT_ON_USER_ERROR') && + SendAlert("$s_error_code\nError=$s_error_mesg\n$s_extra_info\n") + ) { + $b_alerted = true; + } + ShowError($s_error_code,$s_error_mesg,true,$b_alerted,$a_item_list,$s_extra_info); + FormMailExit(); +} + +// +// Create a simple page with the given text. +// +function CreatePage($text,$title = "",$b_show_about = true) +{ + global $FM_VERS,$sHTMLCharSet; + + if (IsAjax()) { + // + // CreatePage should not be called in Ajax mode. + // If it is, it must be an error or debugging state. + // + JSON_Result("ERROR",array("ErrorCode" => $title, + "ErrorMesg" => $text + )); + } else { + echo + '' . + "\n"; + echo '' . "\n"; + echo "\n"; + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + echo "\n"; + } + if ($title != "") { + echo "" . FixedHTMLEntities($title) . "\n"; + } + echo "\n"; + echo "\n"; + echo nl2br($text); + echo "

    "; + if ($b_show_about) { + echo "

    \n"; + echo GetMessage(MSG_ABOUT_FORMMAIL,array("FM_VERS" => $FM_VERS, + "TECTITE" => "www.tectite.com" + )); + echo "

    \n"; + } + echo "\n"; + echo "\n"; + } +} + +// +// Strip slashes if magic_quotes_gpc is set. +// +function StripGPC($s_value) +{ + global $ExecEnv; + + if (!$ExecEnv->IsPHPAtLeast("5.4.0")) { // the magic_quotes_gpc setting was removed in PHP 5.4.0 + if (get_magic_quotes_gpc() != 0) { + $s_value = stripslashes($s_value); + } + } + return ($s_value); +} + +// +// return an array, stripped of slashes if magic_quotes_gpc is set +// +function StripGPCArray($a_values) +{ + global $ExecEnv; + + if (!$ExecEnv->IsPHPAtLeast("5.4.0")) { // the magic_quotes_gpc setting was removed in PHP 5.4.0 + if (get_magic_quotes_gpc() != 0) { + foreach ($a_values as $m_key => $m_value) { + if (is_array($m_value)) + // + // strip arrays recursively + // + { + $a_values[$m_key] = StripGPCArray($m_value); + } else + // + // convert scalar to string and strip + // + { + $a_values[$m_key] = stripslashes("$m_value"); + } + } + } + } + return ($a_values); +} + +// +// Strip a value of unwanted characters, which might be hacks. +// The stripping of \r and \n is a *critical* security feature. +// +function Strip($value) +{ + // + // When working with character sets such as UTF-8, stripping + // control characters is a *really bad idea* and breaks things. + // From version 8.22, FormMail only strips \r and \n as these + // are really the only characters that can cause header hacks + // to be inserted. (Strip means replace with a single space). + // We also handle multiple spaces. + // + $value = preg_replace('/[ \r\n]+/'," ",$value); // zap all CRLF and multiple blanks + return ($value); +} + +// +// Clean a value. This means: +// 1. convert to string +// 2. truncate to maximum length +// 3. strip the value of unwanted or dangerous characters (hacks) +// 4. trim both ends of whitespace +// Each element of an array is cleaned as above. This process occurs +// recursively, so arrays of arrays work OK too (though there's no +// need for that in this program). +// +// Non-scalar values are changed to the string "" where X is the type. +// In general, FormMail won't receive non-scalar non-array values, so this +// is more a future-proofing measure. +// +function CleanValue($m_value) +{ + if (is_array($m_value)) { + foreach ($m_value as $m_key => $m_item) { + $m_value[$m_key] = CleanValue($m_item); + } + } elseif (!is_scalar($m_value)) { + $m_value = "<" . gettype($m_value) . ">"; + } else { + // + // convert to string and truncate + // + $m_value = substr("$m_value",0,Settings::get('MAXSTRING')); + // + // strip unwanted chars and trim + // + $m_value = trim(Strip($m_value)); + } + return ($m_value); +} + +// +// Clean a special value. Special values listed in $SPECIAL_NOSTRIP +// will not be cleaned. +// +function SpecialCleanValue($s_name,$m_value) +{ + global $SPECIAL_NOSTRIP; + + if (!in_array($s_name,$SPECIAL_NOSTRIP)) { + $m_value = CleanValue($m_value); + } + return ($m_value); +} + +// +// Return the fields and their values in a string containing one +// field per line. +// +function MakeFieldOutput($a_order,$a_fields,$s_line_feed = null) +{ + if ($s_line_feed === null) { + $s_line_feed = Settings::get('BODY_LF'); + } + $n_order = count($a_order); + $s_output = ""; + for ($ii = 0 ; $ii < $n_order ; $ii++) { + $s_name = $a_order[$ii]; + if (isset($a_fields[$s_name])) { + $s_output .= "$s_name: " . $a_fields[$s_name] . $s_line_feed; + } + } + return ($s_output); +} + +// +// Check if a field name is special. Returns true if it is. +// +function IsSpecialField($s_name) +{ + global $SPECIAL_FIELDS; + + return (in_array($s_name,$SPECIAL_FIELDS)); +} + +// +// Set a special field value. +// +function SetSpecialField($s_name,$m_value) +{ + global $SPECIAL_VALUES; + + // + // most special values cannot be arrays; ignore them if they are + // + if (is_array($m_value)) { + global $SPECIAL_ARRAYS; + + if (!in_array($s_name,$SPECIAL_ARRAYS)) { + return; + } + } + $SPECIAL_VALUES[$s_name] = SpecialCleanValue($s_name,$m_value); +} + +// +// Check if a field name is a special "multi" field. +// A multi field is the name plus a sequence number. For example, +// conditions1 +// conditions2 +// Returns a list (array) if it is, otherwise false if not. +// The list contains: +// 1. the name of the special multi field +// 2. the index number for multi field +// +function IsSpecialMultiField($s_name) +{ + global $SPECIAL_MULTI; + + foreach ($SPECIAL_MULTI as $s_multi_fld) { + $i_len = strlen($s_multi_fld); + // + // look for nameN where N is a number starting from 1 + // + if (substr($s_name,0,$i_len) == $s_multi_fld) { + $i_index = (int)substr($s_name,$i_len); + if ($i_index > 0) { + // + // re-index to zero + // + --$i_index; + return (array($s_multi_fld,$i_index)); + } + } + } + return (false); +} + +// +// Set a multi field value. +// +function SetSpecialMultiField($s_name,$i_index,$m_value) +{ + global $SPECIAL_VALUES; + + // + // these special fields cannot be arrays - ignore if it is + // + if (!is_array($m_value)) { + // + // Convert the special field itself into an array so it can be correctly + // indexed. + // + if (!is_array($SPECIAL_VALUES[$s_name])) { + $SPECIAL_VALUES[$s_name] = array(); + } + $SPECIAL_VALUES[$s_name][$i_index] = SpecialCleanValue($s_name,$m_value); + } +} + +// +// Check if a field is part of Reverse Captcha processing. +// +function IsReverseCaptchaField($s_name) +{ + $a_rev_captcha = Settings::get('ATTACK_DETECTION_REVERSE_CAPTCHA'); + return (isset($a_rev_captcha[$s_name])); +} + +/** + * Validate an email address. + * Generate a UserError if $b_user_error is true. + * + * @param $s_name + * @param $s_value + * @param $b_user_error + */ +function ValidateEmailAddress($s_name,$s_value,$b_user_error) +{ + $b_valid = true; + $s_reason = ''; + $a_components = explode('@',$s_value,2); + if (count($a_components) !== 2) { + $b_valid = false; + $s_reason = "missing '@'"; + } else { + if ($a_components[0] === '' || $a_components[1] === '') { + $b_valid = false; + $s_reason = "missing name or domain name"; + } else { + if (Settings::get('VALIDATE_EMAIL_DOMAIN') && !checkdnsrr($a_components[1])) { + $b_valid = false; + $s_reason = "invalid domain name '" . $a_components[1] . "'"; + } + } + } + if (!$b_valid) { + $s_error_mesg = GetMessage(MSG_INVALID_EMAIL, + array("EMAIL" => $s_value, + "REASON" => $s_reason + )); + if ($b_user_error) { + UserError("invalid_email",$s_error_mesg,'',array($s_name => $s_error_mesg)); + } else { + SendAlert($s_error_mesg); + } + } +} + +/** + * Perform some basic validation on a special field before setting it. + * Generate a UserError if $b_user_error is true. + * + * @param $s_name + * @param $s_value + * @param $b_user_error + */ +function ValidateSpecialField($s_name,$s_value,$b_user_error) +{ + switch ($s_name) { + case "email": + if ($s_value !== '') { + ValidateEmailAddress($s_name,$s_value,$b_user_error); + } + break; + } +} + +// +// Process a field +// +function ProcessField($s_name,$raw_value,&$a_order,&$a_fields,&$a_raw_fields) +{ + global $FORMATTED_INPUT; + + // + // fields go into an array of special values or an array of other values + // or get completely ignored. + // + $b_ignore = $b_special = false; + if (IsSpecialField($s_name)) { + ValidateSpecialField($s_name,$raw_value,true); + SetSpecialField($s_name,$raw_value); + $b_special = true; + } + // + // check for multiple valued special fields + // + if (($a_multi_fld = IsSpecialMultiField($s_name)) !== false) { + SetSpecialMultiField($a_multi_fld[0],$a_multi_fld[1],$raw_value); + $b_special = true; + } + if (!$b_special) { + if (IsReverseCaptchaField($s_name)) { + $b_ignore = true; + } + } + if (!$b_special && !$b_ignore) { + // + // return the raw value unchanged in the $a_raw_fields array + // + $a_raw_fields[$s_name] = $raw_value; + // + // handle checkboxes and multiple-selection lists + // Thanks go to Theodore Boardman for the suggestion + // and initial working code. + // + if (is_array($raw_value)) { + if (empty($raw_value)) { + $s_cleaned_value = ""; + } else { + $a_cleaned_values = CleanValue($raw_value); + // + // the output is a comma separated list of values for the + // checkbox. For example, + // events: Diving,Cycling,Running + // + // Set the clean value to the list of cleaned checkbox + // values. + // First, remove any commas in the values themselves. + // + $a_cleaned_values = str_replace(",","",$a_cleaned_values); + $s_cleaned_value = implode(",",$a_cleaned_values); + } + } else { + // + // NOTE: there is a minor bug here now that we support + // $FORM_INI_FILE. The INI file is processed at the end + // so if you set the mail_options below in the INI file they + // won't get processed here. This means you must set + // the following mail_options in the HTML form for now. + // (To be fixed at a later date. RJR 17-Feb-06). + // + + // + // if the form specifies the "KeepLines" option, + // don't strip new lines + // + if (IsMailOptionSet("KeepLines") && strpos($raw_value,"\n") !== false) { + // + // truncate first + // + $s_truncated = substr("$raw_value",0,Settings::get('MAXSTRING')); + // + // split into lines, clean each individual line, + // then put it back together again + // + $a_lines = explode("\n",$s_truncated); + $a_lines = CleanValue($a_lines); + $s_cleaned_value = implode(Settings::get('BODY_LF'),$a_lines); + // + // and, for this special case, prepend a new line + // so that the value is shown on a fresh line + // + $s_cleaned_value = Settings::get('BODY_LF') . $s_cleaned_value; + } else { + $s_cleaned_value = CleanValue($raw_value); + } + } + // + // if the form specifies the "NoEmpty" option, skip + // empty values. + // + if (!IsMailOptionSet("NoEmpty") || !FieldManager::IsEmpty($s_cleaned_value)) { + if (!IsMailExcluded($s_name)) { + // + // by default, we maintain the order as passed in + // the HTTP request + // + $a_order[] = $s_name; + $a_fields[$s_name] = $s_cleaned_value; + } + } + + // + // add to the $FORMATTED_INPUT array for debugging and + // error reporting + // + array_push($FORMATTED_INPUT,"$s_name: '$s_cleaned_value'"); + } +} + +// +// Parse the input variables and return: +// 1. an array that specifies the required field order in the output +// 2. an array containing the non-special cleaned field values indexed +// by field name. +// 3. an array containing the non-special raw field values indexed by +// field name. +// +function ParseInput($a_vars) +{ + $a_order = array(); + $a_fields = array(); + $a_raw_fields = array(); + // + // scan the array of values passed in (name-value pairs) and + // produce slightly formatted (not HTML) textual output + // and extract any special values found. + // + foreach ($a_vars as $s_name => $raw_value) { + ProcessField($s_name,$raw_value,$a_order,$a_fields,$a_raw_fields); + } + + return (array($a_order,$a_fields,$a_raw_fields)); +} + +// +// Get the URL for sending to the CRM. +// +function GetCRMURL($spec,$vars,$url) +{ + $bad = false; + $list = TrimArray(explode(",",$spec)); + $map = array(); + for ($ii = 0 ; $ii < count($list) ; $ii++) { + $name = $list[$ii]; + if ($name) { + // + // the specification must be in this format: + // form-field-name:CRM-field-name + // + if (($i_crm_name_pos = strpos($name,":")) > 0) { + $s_crm_name = substr($name,$i_crm_name_pos + 1); + $name = substr($name,0,$i_crm_name_pos); + if (isset($vars[$name])) { + $map[] = $s_crm_name . "=" . urlencode($vars[$name]); + $map[] = "Orig_" . $s_crm_name . "=" . urlencode($name); + } + } else { + // + // not the right format, so just include as a parameter + // check for name=value format to choose encoding + // + $a_values = explode("=",$name); + if (count($a_values) > 1) { + $map[] = urlencode($a_values[0]) . "=" . urlencode($a_values[1]); + } else { + $map[] = urlencode($a_values[0]); + } + } + } + } + if (count($map) == 0) { + return (""); + } + return (AddURLParams($url,$map,false)); +} + +// +// strip the HTML from a string or array of strings +// +function StripHTML($m_value,$s_line_feed = "\n") +{ + if (is_array($m_value)) { + foreach ($m_value as $m_key => $s_str) { + $m_value[$m_key] = StripHTML($s_str); + } + return ($m_value); + } + $s_str = $m_value; + // + // strip HTML comments (s option means include new lines in matches) + // + $s_str = preg_replace('//s','',$s_str); + // + // strip any scripts (i option means case-insensitive) + // + $s_str = preg_replace('/]*?>.*?<\/script[^>]*?>/si','',$s_str); + // + // replace paragraphs with new lines (line feeds) + // + $s_str = preg_replace('/]*?>/i',$s_line_feed,$s_str); + // + // replace breaks with new lines (line feeds) + // + $s_str = preg_replace('//i',$s_line_feed,$s_str); + // + // overcome this bug: http://bugs.php.net/bug.php?id=21311 + // + $s_str = preg_replace('/]*>/s','',$s_str); + // + // get rid of all HTML tags + // + $s_str = strip_tags($s_str); + return ($s_str); +} + +// +// Check for valid URL in TARGET_URLS +// +function CheckValidURL($s_url) +{ + + foreach (Settings::get('TARGET_URLS') as $s_prefix) { + if (!empty($s_prefix) && + strtolower(substr($s_url,0,strlen($s_prefix))) == + strtolower($s_prefix) + ) { + return (true); + } + } + return (false); +} + +// +// Scan the given data for fields returned from the CRM. +// A field has this following format: +// __FIELDNAME__=value +// terminated by a line feed. +// +function FindCRMFields($s_data) +{ + $a_ret = array(); + if (preg_match_all('/^__([A-Za-z][A-Za-z0-9_]*)__=(.*)$/m',$s_data,$a_matches) === false) { + SendAlert(GetMessage(MSG_PREG_FAILED)); + } else { + $n_matches = count($a_matches[0]); + // SendAlert("$n_matches on '$s_data'"); + for ($ii = 0 ; $ii < $n_matches ; $ii++) { + if (isset($a_matches[1][$ii]) && isset($a_matches[2][$ii])) { + $a_ret[$a_matches[1][$ii]] = $a_matches[2][$ii]; + } + } + } + return ($a_ret); +} + +// +// open the given URL to send data to it, we expect the response +// to contain at least '__OK__=' followed by true or false +// +function SendToCRM($s_url,&$a_data) +{ + global $php_errormsg; + + if (!CheckValidURL($s_url)) { + SendAlert(GetMessage(MSG_URL_INVALID,array("URL" => $s_url))); + return (false); + } + @ $fp = fopen($s_url,"r"); // RJR: TO DO: re-implement using NetIO + if ($fp === false) { + SendAlert(GetMessage(MSG_URL_OPEN,array("URL" => $s_url, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + $s_mesg = ""; + while (!feof($fp)) { + $s_line = fgets($fp,4096); + $s_mesg .= $s_line; + } + fclose($fp); + $s_mesg = StripHTML($s_mesg); + $s_result = preg_match('/__OK__=(.*)/',$s_mesg,$a_matches); + if (count($a_matches) < 2 || $a_matches[1] === "") { + // + // no agreed __OK__ value returned - assume system error + // + SendAlert(GetMessage(MSG_CRM_FAILED,array("URL" => $s_url, + "MSG" => $s_mesg + ))); + return (false); + } + // + // look for fields to return + // + $a_data = FindCRMFields($s_mesg); + // + // check for success or user error + // + switch (strtolower($a_matches[1])) { + case "true": + break; + case "false": + // + // check for user error + // + if (isset($a_data["USERERRORCODE"])) { + $s_error_code = "crm_error"; + $s_error_mesg = GetMessage(MSG_CRM_FORM_ERROR); + $s_error_code .= $a_data["USERERRORCODE"]; + if (isset($a_data["USERERRORMESG"])) { + $s_error_mesg = $a_data["USERERRORMESG"]; + } + UserError($s_error_code,$s_error_mesg); + // no return + } + return (false); + } + return (true); +} + +// +// Split into field name and friendly name; returns an array with +// two elements. +// Format is: +// fieldname:Nice printable name for displaying +// +function GetFriendlyName($s_name) +{ + if (($i_pos = strpos($s_name,':')) === false) { + return (array(trim($s_name),trim($s_name))); + } + return (array(trim(substr($s_name,0,$i_pos)),trim(substr($s_name,$i_pos + 1)))); +} + +define("REQUIREDOPS","|^!="); // operand characters for advanced required processing + +// +// Perform a field comparison test. +// +/** @noinspection PhpStatementHasEmptyBodyInspection */ +function FieldTest($s_oper,$s_fld1,$s_fld2,$a_vars,&$s_error_mesg, + $s_friendly1 = "",$s_friendly2 = "") +{ + $b_ok = true; + $s_empty1 = $s_empty2 = ""; + // + // perform the test + // + switch ($s_oper) { + case '&': // both fields must be present + if (!TestFieldEmpty($s_fld1,$a_vars,$s_empty1) && + !TestFieldEmpty($s_fld2,$a_vars,$s_empty2) + ) { + } // OK + else { + // + // failed + // + $s_error_mesg = GetMessage(MSG_AND,array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + break; + case '|': // either field or both must be present + if (!TestFieldEmpty($s_fld1,$a_vars,$s_empty1) || + !TestFieldEmpty($s_fld2,$a_vars,$s_empty2) + ) { + } // OK + else { + // + // failed + // + $s_error_mesg = GetMessage(MSG_OR,array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + break; + case '^': // either field but not both must be present + $b_got1 = !TestFieldEmpty($s_fld1,$a_vars,$s_empty1); + $b_got2 = !TestFieldEmpty($s_fld2,$a_vars,$s_empty2); + if ($b_got1 || $b_got2) { + if ($b_got1 && $b_got2) { + // + // failed + // + $s_error_mesg = GetMessage(MSG_NOT_BOTH, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + } else { + // + // failed + // + $s_error_mesg = GetMessage(MSG_XOR, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + $b_ok = false; + } + break; + case '!=': + case '=': + $b_got1 = !TestFieldEmpty($s_fld1,$a_vars,$s_empty1); + $b_got2 = !TestFieldEmpty($s_fld2,$a_vars,$s_empty2); + if ($b_got1 && $b_got2) { + $b_match = (GetFieldValue($s_fld1,$a_vars) == + GetFieldValue($s_fld2,$a_vars)); + } elseif (!$b_got1 && !$b_got2) + // + // haven't got either value - they match + // + { + $b_match = true; + } else + // + // got one value, but not the other - they don't match + // + { + $b_match = false; + } + if ($s_oper != '=') { + // + // != operator + // + $b_match = !$b_match; + $s_desc = GetMessage(MSG_IS_SAME_AS, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + } else { + $s_desc = GetMessage(MSG_IS_NOT_SAME_AS, + array("ITEM1" => $s_friendly1, + "ITEM2" => $s_friendly2 + )); + } + if (!$b_match) { + // + // failed + // + $s_error_mesg = $s_desc; + $b_ok = false; + } + break; + } + return ($b_ok); +} + +// +// Process advanced "required" conditionals +// +function AdvancedRequired($s_cond,$i_span,$a_vars,&$s_missing,&$a_missing_list) +{ + $b_ok = true; + // + // get first field name + // + list($s_fld1,$s_friendly1) = GetFriendlyName(substr($s_cond,0,$i_span)); + // + // get the operator + // + $s_rem = substr($s_cond,$i_span); + $i_span = strspn($s_rem,REQUIREDOPS); + $s_oper = substr($s_rem,0,$i_span); + switch ($s_oper) { + case '|': + case '^': + case '=': + case '!=': + // + // second component is a field name + // + list($s_fld2,$s_friendly2) = GetFriendlyName(substr($s_rem,$i_span)); + if (!FieldTest($s_oper,$s_fld1,$s_fld2,$a_vars,$s_error_mesg, + $s_friendly1,$s_friendly2) + ) { + // + // failed + // + $s_missing .= "$s_error_mesg\n"; + $a_missing_list[$s_fld1] = "$s_error_mesg"; + $b_ok = false; + } + break; + default: + SendAlert(GetMessage(MSG_REQD_OPER,array("OPER" => $s_oper))); + break; + } + return ($b_ok); +} + +// +// Check the input for required values. The list of required fields +// is a comma-separated list of field names or conditionals +// +function CheckRequired($s_reqd,$a_vars,&$s_missing,&$a_missing_list) +{ + global $reCaptchaProcessor; + + $b_bad = false; + $a_list = TrimArray(explode(",",$s_reqd)); + $s_missing = ""; + $a_missing_list = array(); + $s_mesg = ""; + for ($ii = 0 ; $ii < count($a_list) ; $ii++) { + $s_cond = $a_list[$ii]; + $i_len = strlen($s_cond); + if ($i_len <= 0) { + continue; + } + if (($i_span = strcspn($s_cond,REQUIREDOPS)) >= $i_len) { + // + // no advanced operator; just a field name + // + list($s_fld,$s_friendly) = GetFriendlyName($s_cond); + if (TestFieldEmpty($s_fld,$a_vars,$s_mesg)) { + if ($s_mesg === "") { + $s_mesg = "$s_friendly"; + } else { + $s_mesg = "$s_friendly ($s_mesg)"; + } + $b_bad = true; + $s_missing .= "$s_mesg\n"; + $a_missing_list[$s_fld] = "$s_mesg"; + } + } elseif (!AdvancedRequired($s_cond,$i_span,$a_vars, + $s_missing,$a_missing_list) + ) { + $b_bad = true; + } + } + + global $SPECIAL_VALUES; + + // + // implement REQUIRE_CAPTCHA feature + // + if (!Settings::isEmpty('REQUIRE_CAPTCHA')) { + if ($SPECIAL_VALUES["imgverify"] === "") { + $s_missing .= Settings::get('REQUIRE_CAPTCHA') . "\n"; + $a_missing_list['imgverify'] = Settings::get('REQUIRE_CAPTCHA'); + $b_bad = true; + } + } + return (!$b_bad); +} + +/** + * Class Conditions + * Implements "conditions" processing. + */ +class Conditions +{ + /** @var array|string the conditions to process */ + private $_mConditions; // + /** @var string the "conditions" field being processed */ + private $_sField; + /** @var string */ + private $_sMissing; + /** @var array */ + private $_aMissingList; + /** @var FieldManager */ + private $_FldManager; + + /** + * @param array|string $m_conditions the conditions to process + * @param string $s_missing returns the message from the condition's failure + * @param array $a_missing_list appended with the field name(s) that failed + */ + function __construct($m_conditions,&$s_missing,&$a_missing_list) + { + $this->_mConditions = $m_conditions; + $this->_sMissing = &$s_missing; + $this->_aMissingList = &$a_missing_list; + $this->_FldManager = new FieldManager(); + } + + /** + * Run the given field logic. + * + * @param string $s_test a string containing the field logic to run + * + * @return string|bool true if the logic evaluates to true, otherwise name of a field if the logic evaluates to false + */ + private function _runLogic($s_test) + { + global $aAlertInfo; + + $s_op_chars = "&|^!=~#<>"; // these are the characters for the operators + $i_len = strlen($s_test); + $b_ok = true; + $s_mesg = ""; + $s_fld_name = ""; + /** @noinspection PhpStatementHasEmptyBodyInspection */ + if ($i_len <= 0) + // + // empty test - true + // + { + } elseif ($s_test == "!") + // + // test asserts false + // + { + $b_ok = false; + } elseif (($i_span = strcspn($s_test,$s_op_chars)) >= $i_len) + // + // no operator - just check field presence + // + { + $s_fld_name = $s_test; + $b_ok = !$this->_FldManager->TestFieldEmpty($s_test,$s_mesg); + } else { + // + // get first field name + // + $s_fld_name = $s_fld1 = trim(substr($s_test,0,$i_span)); + // + // get the operator + // + $s_rem = substr($s_test,$i_span); + $i_span = strspn($s_rem,$s_op_chars); + $s_oper = substr($s_rem,0,$i_span); + switch ($s_oper) { + case '&': + case '|': + case '^': + case '=': + case '!=': + // + // get the second field name + // + $s_fld2 = trim(substr($s_rem,$i_span)); + $b_ok = FieldTest($s_oper,$s_fld1,$s_fld2,$this->_FldManager->GetFields(),$s_error_mesg); + break; + case '~': + case '!~': + // + // get the regular expression + // + $s_pat = trim(substr($s_rem,$i_span)); + if (!$this->_FldManager->TestFieldEmpty($s_fld1,$s_mesg)) { + $s_value = $this->_FldManager->GetFieldValue($s_fld1); + } else { + $s_value = ""; + } + //echo "

    Pattern: '".htmlspecialchars($s_pat)."': count=".preg_match($s_pat,$s_value)."

    "; + // + // match the regular expression + // + if (preg_match($s_pat,$s_value) > 0) { + $b_ok = ($s_oper == '~'); + } else { + $b_ok = ($s_oper == '!~'); + } + if (!$b_ok) { + $aAlertInfo[] = GetMessage(MSG_PAT_FAILED,array("OPER" => $s_oper, + "PAT" => $s_pat, + "VALUE" => $s_value + )); + } + break; + case '#=': + case '#!=': + case '#<': + case '#>': + case '#<=': + case '#>=': + // + // numeric tests + // + $s_num = trim(substr($s_rem,$i_span)); + // + // if this is a file field, get the size of the file for + // numeric tests + // + if (($s_value = GetFileSize($s_fld1)) === false) { + $s_value = $this->_FldManager->GetFieldValue($s_fld1); + } + if (strpos($s_num,'.') === false) { + // + // treat as integer + // + $m_num = (int)$s_num; + $m_fld = (int)$s_value; + } else { + // + // treat as floating point + // + $m_num = (float)$s_num; + $m_fld = (float)$s_value; + } + switch ($s_oper) { + case '#=': + $b_ok = ($m_fld == $m_num); + break; + case '#!=': + $b_ok = ($m_fld != $m_num); + break; + case '#<': + $b_ok = ($m_fld < $m_num); + break; + case '#>': + $b_ok = ($m_fld > $m_num); + break; + case '#<=': + $b_ok = ($m_fld <= $m_num); + break; + case '#>=': + $b_ok = ($m_fld >= $m_num); + break; + } + break; + default: + SendAlert(GetMessage(MSG_COND_OPER,array("OPER" => $s_oper))); + break; + } + } + return $b_ok ? true : $s_fld_name; + } + + // + // Check the input for condition tests. + // + public function Check($a_vars,$a_file_vars = array()) + { + $this->_FldManager->Init($a_vars,$a_file_vars); + // + // handle a list of conditions in an array + // + if (is_array($this->_mConditions)) { + // + // Sort the conditions by their numeric value. This ensures + // conditions are executed in the right order. + // + ksort($this->_mConditions,SORT_NUMERIC); + foreach ($this->_mConditions as $m_key => $s_cond) { + if (!$this->_checkString($s_cond,$m_key)) { + return (false); + } + } + return (true); + } else { + // + // handle one set of conditions in a string + // + return $this->_checkString($this->_mConditions); + } + } + + /** + * Test a condition represented in a string. + * + * @param string $s_cond the condition + * @param bool|int $m_id ID of the condition being processed + * + * @return bool true if the condition passed, otherwise false + */ + private function _checkString($s_cond,$m_id = false) + { + $this->_sField = "conditions" . ($m_id === false ? "" : ($m_id + 1)); + if (!is_string($s_cond)) { + SendAlert(GetMessage(MSG_INV_COND,array("FLD" => $this->_sField))); + // + // invalid conditions are simple "true" + // + return (true); + } + // + // empty conditions are simply "true" + // + if ($s_cond == "") { + return (true); + } + // + // extract the separator characters + // + if (strlen($s_cond) < 2) { + SendAlert(GetMessage(MSG_COND_CHARS, + array("FLD" => $this->_sField,"COND" => $s_cond))); + // + // invalid conditions are simple "true" + // + return (true); + } + return $this->_checkString2($s_cond); + } + + /** + * Test a condition represented in a string. This method is called by _checkString to do the real + * work after some initial sanity checks. + * + * @param string $s_cond the condition + * + * @return bool true if the condition passed, otherwise false + */ + private function _checkString2($s_cond) + { + $s_list_sep = $s_cond[0]; + $s_int_sep = $s_cond[1]; + $s_full_cond = $s_cond = substr($s_cond,2); + $b_bad = false; + $a_list = TrimArray(explode($s_list_sep,$s_cond)); + for ($ii = 0 ; $ii < count($a_list) ; $ii++) { + $s_curr_cond = $a_list[$ii]; + $i_len = strlen($s_curr_cond); + if ($i_len <= 0) { + continue; + } + // + // split the condition into its internal components + // + $a_components = TrimArray(explode($s_int_sep,$s_curr_cond)); + if (count($a_components) < 5) { + SendAlert(GetMessage(MSG_COND_INVALID, + array("FLD" => $this->_sField,"COND" => $s_curr_cond, + "SEP" => $s_int_sep + ))); + // + // the smallest condition has 5 components + // + continue; + } + // + // first component is ignored (it's blank) + // + $a_components = array_slice($a_components,1); + switch ($a_components[0]) { + case "TEST": + if (!$this->_doTest($s_curr_cond,$a_components,$s_list_sep)) { + $b_bad = true; + } + break; + case "IF": + if (!$this->_doIf($s_curr_cond,$a_components,$s_int_sep,$s_list_sep)) { + $b_bad = true; + } + break; + default: + SendAlert(GetMessage(MSG_COND_UNK, + array("FLD" => $this->_sField,"COND" => $s_curr_cond, + "CMD" => $a_components[0] + ))); + break; + } + } + return (!$b_bad); + } + + /** + * Process a TEST condition. + * + * @param string $s_cond the condition + * @param array $a_components components of the TEST condition + * @param string $s_list_sep the separator for lists in the condition + * + * @return bool true if the condition passed, otherwise false + */ + private function _doTest($s_cond,$a_components,$s_list_sep) + { + // + // sanity check - if failed, just pass the TEST + // + if (count($a_components) > 5) { + SendAlert(GetMessage(MSG_COND_TEST_LONG, + array("FLD" => $this->_sField,"COND" => $s_cond, + "SEP" => $s_list_sep + ))); + return true; + } elseif (($m_test_result = $this->_runLogic($a_components[1])) === true) { + return true; + } else { + $this->_recordField($m_test_result,$a_components[2]); + return false; + } + } + + /** + * Process an IF condition. + * + * @param string $s_cond the condition + * @param array $a_components components of the TEST condition + * @param string $s_int_sep the internal separator for the condition + * @param string $s_list_sep the separator for lists in the condition + * + * @return bool true if the condition passed, otherwise false + */ + private function _doIf($s_cond,$a_components,$s_int_sep,$s_list_sep) + { + // + // sanity checks - if failed, just pass the IF + // + if (count($a_components) < 6) { + SendAlert(GetMessage(MSG_COND_IF_SHORT, + array("FLD" => $this->_sField,"COND" => $s_cond, + "SEP" => $s_int_sep + ))); + return true; + } + if (count($a_components) > 7) { + SendAlert(GetMessage(MSG_COND_IF_LONG, + array("FLD" => $this->_sField,"COND" => $s_cond, + "SEP" => $s_list_sep + ))); + return true; + } + if (($m_test_result = $this->_runLogic($a_components[1])) === true) { + $m_test_result = $this->_runLogic($a_components[2]); + } else { + $m_test_result = $this->_runLogic($a_components[3]); + } + if ($m_test_result !== true) { + $this->_recordField($m_test_result,$a_components[4]); + return false; + } else { + return true; + } + } + + private function _recordField($s_fld_name,$s_mesg) + { + $this->_sMissing .= $s_mesg . "\n"; + $this->_aMissingList[$s_fld_name] = $s_mesg; + } + +} + +/** + * Original interface to processing conditions. + * This function is only kept for backwards compatibility with any existing hook code. + * + * @param mixed $m_conditions a single condition or an array of them + * @param array $a_vars field values + * @param string $s_missing returns the message from the condition's failure + * @param array $a_missing_list appended with the field name(s) that failed + * @param bool|int $m_id was never used - deprecated + * + * @return bool true if the condition passed, otherwise false + * @noinspection PhpUnused + */ +function CheckConditions($m_conditions,$a_vars,&$s_missing,&$a_missing_list,$m_id = false) +{ + global $aFileVars; + + $cond = new Conditions($m_conditions,$s_missing,$a_missing_list); + + return $cond->Check($a_vars,$aFileVars); +} + +// +// Return a formatted list of the given environment variables. +// +function GetEnvVars($list,$s_line_feed) +{ + global $aServerVars; + + $output = ""; + for ($ii = 0 ; $ii < count($list) ; $ii++) { + $name = $list[$ii]; + if ($name && array_search($name,Settings::get('VALID_ENV'),true) !== false) { + // + // if the environment variable is empty or non-existent, try + // looking for the value in the server vars. + // + if (($s_value = getenv($name)) === "" || $s_value === false) { + if (isset($aServerVars[$name])) { + $s_value = $aServerVars[$name]; + } else { + $s_value = ""; + } + } + $output .= $name . "=" . $s_value . $s_line_feed; + } + } + return ($output); +} + +// +// open a socket connection to a filter and post the data there +// RJR: TO DO: re-implement using NetIO +// +function SocketFilter($filter,$a_filter_info,$m_data) +{ + static $b_in_here = false; + global $php_errormsg; + + // + // prevent recursive errors + // + if ($b_in_here) { + return (""); + } + $b_in_here = true; + + $a_errors = array(); + if (!isset($a_filter_info["site"])) { + $a_errors[] = GetMessage(MSG_MISSING,array("ITEM" => "site")); + } else { + $s_site = $a_filter_info["site"]; + } + + if (!isset($a_filter_info["port"])) { + $a_errors[] = GetMessage(MSG_MISSING,array("ITEM" => "port")); + } else { + $i_port = (int)$a_filter_info["port"]; + } + + if (!isset($a_filter_info["path"])) { + $a_errors[] = GetMessage(MSG_MISSING,array("ITEM" => "path")); + } else { + $s_path = $a_filter_info["path"]; + } + + if (!isset($a_filter_info["params"])) { + $a_params = array(); + } elseif (!is_array($a_filter_info["params"])) { + $a_errors[] = GetMessage(MSG_NEED_ARRAY,array("ITEM" => "params")); + } else { + $a_params = $a_filter_info["params"]; + } + + if (!empty($a_errors)) { + Error("bad_filter",GetMessage(MSG_FILTER_WRONG,array( + "FILTER" => $filter, + "ERRORS" => implode(', ',$a_errors) + )), false,false); + FormMailExit(); + } + + // + // ready to build the socket - we need a longer time limit for the + // script if we're doing this; we allow 30 seconds for the connection + // (should be instantaneous, especially if it's the same domain) + // + set_time_limit(60); + /** @noinspection PhpUndefinedVariableInspection */ + /** @noinspection PhpUndefinedVariableInspection */ + @ $f_sock = fsockopen($s_site,$i_port,$i_errno,$s_errstr,30); + if ($f_sock === false) { + Error("filter_connect",GetMessage(MSG_FILTER_CONNECT,array( + "FILTER" => $filter, + "SITE" => $s_site, + "ERRNUM" => $i_errno, + "ERRSTR" => "$s_errstr (" . CheckString($php_errormsg) . ")" + )), + false,false); + FormMailExit(); + } + // + // build the data to send + // + $m_request_data = array(); + $i_count = 0; + /** @noinspection PhpUndefinedVariableInspection */ + foreach ($a_params as $m_var) { + $i_count++; + // + // if the parameter spec is an array, process it specially; + // it must have "name" and "file" elements + // + if (is_array($m_var)) { + if (!isset($m_var["name"])) { + Error("bad_filter",GetMessage(MSG_FILTER_PARAM, + array("FILTER" => $filter, + "NUM" => $i_count, + "NAME" => "name" + )),false,false); + fclose($f_sock); + FormMailExit(); + } + $s_name = $m_var["name"]; + if (!isset($m_var["file"])) { + Error("bad_filter",GetMessage(MSG_FILTER_PARAM, + array("FILTER" => $filter, + "NUM" => $i_count, + "NAME" => "file" + )),false,false); + fclose($f_sock); + FormMailExit(); + } + // + // open the file and read its contents + // + @ $fp = fopen($m_var["file"],"r"); + if ($fp === false) { + Error("filter_error",GetMessage(MSG_FILTER_OPEN_FILE, + array("FILTER" => $filter, + "FILE" => $m_var["file"], + "ERROR" => CheckString($php_errormsg) + )),false,false); + fclose($f_sock); + FormMailExit(); + } + $s_data = ""; + $n_lines = 0; + while (!feof($fp)) { + if (($s_line = fgets($fp,2048)) === false) { + if (feof($fp)) { + break; + } else { + Error("filter_error",GetMessage(MSG_FILTER_FILE_ERROR, + array("FILTER" => $filter, + "FILE" => $m_var["file"], + "ERROR" => CheckString($php_errormsg), + "NLINES" => $n_lines + )),false,false); + fclose($f_sock); + FormMailExit(); + } + } + $s_data .= $s_line; + $n_lines++; + } + + fclose($fp); + $m_request_data[] = "$s_name=" . urlencode($s_data); + } else { + $m_request_data[] = (string)$m_var; + } + } + // + // add the data + // + if (is_array($m_data)) { + $m_request_data[] = "data=" . urlencode(implode(Settings::get('BODY_LF'),$m_data)); + } else { + $m_request_data[] = "data=" . urlencode($m_data); + } + $s_request = implode("&",$m_request_data); + + if (($i_pos = strpos($s_site,"://")) !== false) { + $s_site_name = substr($s_site,$i_pos + 3); + } else { + $s_site_name = $s_site; + } + + /** @noinspection PhpUndefinedVariableInspection */ + fputs($f_sock,"POST $s_path HTTP/1.0\r\n"); + fputs($f_sock,"Host: $s_site_name\r\n"); + fputs($f_sock,"Content-Type: application/x-www-form-urlencoded\r\n"); + fputs($f_sock,"Content-Length: " . strlen($s_request) . "\r\n"); + fputs($f_sock,"\r\n"); + fputs($f_sock,"$s_request\r\n"); + + // + // now read the response + // + $m_hdr = ""; + $m_data = ""; + $b_in_hdr = true; + $b_ok = false; + while (!feof($f_sock)) { + if (($s_line = fgets($f_sock,2048)) === false) { + if (feof($f_sock)) { + break; + } else { + Error("filter_failed",GetMessage(MSG_FILTER_READ_ERROR, + array("FILTER" => $filter, + "ERROR" => CheckString($php_errormsg) + )),false,false); + fclose($f_sock); + FormMailExit(); + } + } + // + // look for an "__OK__" line + // + if (trim($s_line) == "__OK__") { + $b_ok = true; + } elseif ($b_in_hdr) { + // + // blank line signals end of header + // + if (trim($s_line) == "") { + $b_in_hdr = false; + } else { + $m_hdr .= $s_line; + } + } else { + $m_data .= $s_line; + } + } + // + // if not OK, then report error + // + if (!$b_ok) { + Error("filter_failed",GetMessage(MSG_FILTER_NOT_OK, + array("FILTER" => $filter, + "DATA" => $m_data + )),false,false); + fclose($f_sock); + FormMailExit(); + } + fclose($f_sock); + $b_in_here = false; + return ($m_data); +} + +// +// run data through a supported filter +// +/** @noinspection PhpStatementHasEmptyBodyInspection */ +function Filter($filter,$m_data) +{ + + global $php_errormsg; + static $b_in_here = false; + + // + // prevent recursive errors + // + if ($b_in_here) { + return (""); + } + $b_in_here = true; + + // + // Any errors sent in an alert are flagged to not run through the + // filter - this also means the user's data won't be included in the + // alert. + // The reason for this is that the Filter is typically an encryption + // program. If the filter fails, then sending the user's data in + // clear text in an alert breaks the security of having encryption + // in the first place! + // + + // + // find the filter + // + $a_filters = Settings::get('FILTERS'); + if (!isset($a_filters[$filter]) || $a_filters[$filter] == "") { + // + // check for SOCKET_FILTERS + // + $a_filters = Settings::get('SOCKET_FILTERS'); + if (!isset($a_filters[$filter]) || $a_filters[$filter] == "") { + ErrorWithIgnore("bad_filter",GetMessage(MSG_FILTER_UNK, + array("FILTER" => $filter)),false,false); + FormMailExit(); + } + $m_data = SocketFilter($filter,$a_filters[$filter],$m_data); + } elseif ($a_filters[$filter] == "null") + // + // do nothing - just return the original data unchanged + // + { + } elseif ($a_filters[$filter] == "csv") { + $m_data = BuiltinFilterCSV(); + } else { + $cmd = $a_filters[$filter]; + // + // get the program name - assumed to be the first blank-separated word + // + $a_words = preg_split('/\s+/',$cmd); + $prog = $a_words[0]; + + $s_cwd = getcwd(); + // + // change to the directory that contains the filter program + // + $dirname = dirname($prog); + if ($dirname != "" && $dirname != "." && !chdir($dirname)) { + Error( "chdir_filter", + GetMessage(MSG_FILTER_CHDIR, + array("DIR" => $dirname, + "FILTER" => $filter, + "ERROR" => CheckString($php_errormsg) + )), + false,false); + FormMailExit(); + } + + // + // the output of the filter goes to a temporary file; this works + // OK on Windows too, even with the Unix shell syntax. + // + $temp_file = GetTempName("FMF"); + $temp_error_file = GetTempName("FME"); + $cmd = "$cmd >$temp_file 2>$temp_error_file"; + // + // start the filter + // + $pipe = popen($cmd,"w"); + if ($pipe === false) { + $s_sv_err = CheckString($php_errormsg); + $err = join('',file($temp_error_file)); + unlink($temp_file); + unlink($temp_error_file); + Error( "filter_not_found", + GetMessage(MSG_FILTER_NOTFOUND, + array("CMD" => $cmd, + "FILTER" => $filter, + "ERROR" => $s_sv_err + )), + false, + false, + $err); + FormMailExit(); + } + // + // write the data to the filter + // + if (is_array($m_data)) { + fwrite($pipe,implode(Settings::get('BODY_LF'),$m_data)); + } else { + fwrite($pipe,$m_data); + } + if (($i_st = pclose($pipe)) != 0) { + $s_sv_err = CheckString($php_errormsg); + $err = join('',file($temp_error_file)); + unlink($temp_file); + unlink($temp_error_file); + Error("filter_failed",GetMessage(MSG_FILTER_ERROR, + array("FILTER" => $filter, + "ERROR" => $s_sv_err, + "STATUS" => $i_st + )),false,false,$err); + FormMailExit(); + } + // + // read in the filter's output and return as the data to be sent + // + $m_data = join('',file($temp_file)); + unlink($temp_error_file); + unlink($temp_file); + + // + // return to previous directory + // + chdir($s_cwd); + } + $b_in_here = false; + return ($m_data); +} + +/* + * Function: FilterFiles + * Parameters: $a_files list of file uploads to filter + * Returns: void + * Description: + * Run the given files through any filter for which they are specified. + */ +function FilterFiles(&$a_files) +{ + global $SPECIAL_VALUES; + + FMDebug("FilterFiles " . count($a_files)); + if (!GetFilterSpec($s_filter,$a_filter_list,true) || $a_filter_list === false) + // + // no filter or file fields to filter + // + { + return; + } + if (($s_mime = GetFilterAttrib($s_filter,"MIME")) === false) { + $s_mime = ""; + } + // + // now, for each file, check if it is specified in the filter list + // + foreach ($a_files as $s_fld => $a_upload) { + FMDebug("Checking $s_fld"); + if (!FieldManager::IsUploadedFile($a_upload)) { + FMDebug("Not uploaded"); + // + // failed security check + // + continue; + } + if (!in_array($s_fld,$a_filter_list,true)) { + FMDebug("Not to be filtered"); + continue; + } + /*** not sure what to do with this.... + * if (isset($a_upload["error"])) + * // + * // there was an upload error + * // + * continue; + ***/ + // + // this file upload has been specified for filtering + // + $s_file_name = $a_upload["tmp_name"]; + // + // check if the file has been saved elsewhere + // + if (isset($a_upload["saved_as"]) && !empty($a_upload["saved_as"])) { + $s_file_name = $a_upload["saved_as"]; + } + FMDebug("File name is $s_file_name"); + // + // read in the file + // + if (($s_data = ReadInFile($s_file_name,"upload")) === false) { + Error("filter_files",GetMessage(MSG_FILE_UPLOAD_ERR_UNK,array("ERRNO" => "reading $s_fld")),false, + false); + } + // + // filter and write it back out to the same file + // + $s_data = Filter($s_filter,$s_data); + if (!WriteOutFile($s_file_name,$s_data,"upload")) { + Error("filter_files",GetMessage(MSG_FILE_UPLOAD_ERR_UNK,array("ERRNO" => "writing $s_fld")),false, + false); + } + // + // update size and MIME type for this upload + // + $a_upload["size"] = strlen($s_data); + if ($s_mime !== "") { + $a_upload["type"] = $s_mime; + } + $a_files[$s_fld] = $a_upload; + } +} + +/* + * Function: ReadInFile + * Parameters: $s_file_name the name of the file + * $s_file_error_type type of file for any error message + * $b_text if true, read file as text + * Returns: mixed the entire contents of the file + * as a string, or false on error + * Description: + * Reads the contents of a file into a string. + */ +function ReadInFile($s_file_name,$s_file_error_type,$b_text = false) +{ + global $php_errormsg; + + if (($fp = @fopen($s_file_name,"r" . ($b_text ? "t" : "b"))) === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_file_name, + "TYPE" => "read " . $s_file_error_type, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + $s_data = ""; + while (!feof($fp)) { + $s_data .= fread($fp,8192); + } + @fclose($fp); + return ($s_data); +} + +/* + * Function: WriteOutFile + * Parameters: $s_file_name the name of the file + * $s_data the data to write + * $s_file_error_type type of file for any error message + * $b_text if true, read file as text + * Returns: bool true on success, otherwise false + * Description: + * Writes the contents of a file from a string. + */ +function WriteOutFile($s_file_name,$s_data,$s_file_error_type,$b_text = false) +{ + global $php_errormsg; + + if (($fp = @fopen($s_file_name,"w" . ($b_text ? "t" : "b"))) === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_file_name, + "TYPE" => "write " . $s_file_error_type, + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + if (fwrite($fp,$s_data) < strlen($s_data)) { + @fclose($fp); + return (false); + } + @fclose($fp); + return (true); +} + +/* + * Class: CSVFormat + * Description: + * Manages formatting of CSV content. + */ + +class CSVFormat +{ + var $_cSep; /* field separator character */ + var $_cQuote; /* field quote character */ + var $_cIntSep; /* internal separator character (for lists) */ + var $_sEscPolicy; /* escape processing policy */ + var $_sCleanFunc; /* cleaning function for fields */ + + /* + * Method: CSVFormat ctor + * Parameters: $c_sep the field separator + * $c_quote the quote character to use + * $c_int_sep the internal field separator to use + * $s_esc_policy escape processing policy to use + * $s_clean_func a cleaning function + * Returns: n/a + * Description: + * Constructs the object. + */ + function __construct($c_sep = ',',$c_quote = '"',$c_int_sep = ';', + $s_esc_policy = "backslash",$s_clean_func = NULL) + { + $this->SetSep($c_sep); + $this->SetQuote($c_quote); + $this->SetIntSep($c_int_sep); + $this->SetEscPolicy($s_esc_policy); + $this->SetCleanFunc($s_clean_func); + } + + /* + * Method: SetEscPolicy + * Parameters: $s_esc_policy a string specifying the escape processing + * policy to use + * Returns: void + * Description: + * Set the escape processing policy. + */ + function SetEscPolicy($s_esc_policy) + { + switch ($s_esc_policy) { + default: /* should generate a warning */ + case "backslash": + $this->_sEscPolicy = "b"; + break; + case "double": + $this->_sEscPolicy = "d"; + break; + case "strip": + $this->_sEscPolicy = "s"; + break; + case "conv": + $this->_sEscPolicy = "c"; + break; + } + } + + /* + * Method: SetSep + * Parameters: $c_sep the separator character to use + * Returns: void + * Description: + * Set the separator character for between fields. + */ + function SetSep($c_sep) + { + $this->_cSep = $c_sep; + } + + /* + * Method: SetQuote + * Parameters: $c_quote the quote character to use + * Returns: void + * Description: + * Set the quote character for quoting fields. + */ + function SetQuote($c_quote) + { + $this->_cQuote = $c_quote; + } + + /* + * Method: SetIntSep + * Parameters: $c_int_sep the internal separator character to use + * Returns: void + * Description: + * Set the internal separator character for inside fields. + */ + function SetIntSep($c_int_sep) + { + $this->_cIntSep = $c_int_sep; + } + + /* + * Method: SetCleanFunc + * Parameters: $s_clean_func the name of a cleaning function (can be NULL) + * Returns: void + * Description: + * Set the cleaning function for fields. + */ + function SetCleanFunc($s_clean_func) + { + $this->_sCleanFunc = $s_clean_func; + } + + /* + * Method: _Escape + * Parameters: $m_value the field value; string or array of strings + * Returns: mixed the field value escaped according to the + * escape processing policy + * Description: + * Escapes a field value according to the configured requirements. + */ + function _Escape($m_value) + { + switch ($this->_sEscPolicy) { + default: /* should generate an error */ + case "b": + /* + * 'backslash' escape policy: replace \ with \\ and + * " with \" + */ + $m_value = str_replace("\\","\\\\",$m_value); + $m_value = str_replace($this->_cQuote,"\\" . $this->_cQuote, + $m_value); + break; + case "d": + /* + * 'double' escape policy: replace " with "" + * This is suitable for Microsoft apps such as Excel + * and Access. It also meets the specification of + * RFC4180, though this RFC only specified double + * quotes whereas we handle any quote character. + */ + $m_value = str_replace($this->_cQuote, + $this->_cQuote . $this->_cQuote,$m_value); + break; + case "s": + /* + * 'strip' escape policy: strip quotes + */ + $m_value = str_replace($this->_cQuote,"",$m_value); + break; + case "c": + /* + * 'conv' escape policy: convert quotes to the other quotes + */ + switch ($this->_cQuote) { + case '"': + /* + * convert double quotes in the data to single quotes + */ + $m_value = str_replace("\"","'",$m_value); + break; + case '\'': + /* + * convert single quotes in the data to double quotes + */ + $m_value = str_replace("'","\"",$m_value); + break; + default: + /* + * otherwise, leave the data unchanged + */ + break; + } + break; + } + return ($m_value); + } + + /* + * Method: _Format + * Parameters: $s_value the string value to format + * $s_format a format specification + * a list of characters: + * c CleanValue + * s force to be a string + * r remove carriage returns + * Returns: string the formatted value + * Description: + * Formats a value. + */ + function _Format($s_value,$s_format = "") + { + $s_value = $this->_Escape($s_value); + $s_prefix = ""; + /* + * now implement any special formatting to overcome + * problems with importing + */ + $i_len = strlen($s_format); + for ($ii = 0 ; $ii < $i_len ; $ii++) { + switch ($s_format[$ii]) { + case "c": + /* + * implement "c" formatting - CleanValue + */ + $s_value = CleanValue($s_value); + break; + case "r": + /* + * implement "r" formatting - remove + * carriage returns. Useful for Microsoft Excel + */ + $s_value = str_replace("\r","",$s_value); + break; + case "s": + /* + * implement "s" formatting - force + * a value to be a string (by making it a string + * formula). Useful for Microsoft Excel and OpenOffice + * spreadsheet, which don't understand numeric phone + * numbers, for example. + */ + if (strlen($s_value) > 0) { + $s_prefix = "="; + } + break; + } + } + + return ($s_prefix . $this->_cQuote . $s_value . $this->_cQuote); + } + + /* + * Method: _GetColumn + * Parameters: $s_col_spec a column specification + * Returns: array the column name and the format specifier, if + * any + * Description: + * Returns the column name and any format specifier. + */ + function _GetColumn($s_col_spec) + { + $s_format = ""; + if (($i_pos = strpos($s_col_spec,":")) !== false) { + $s_col_name = trim(substr($s_col_spec,0,$i_pos)); + $s_format = trim(substr($s_col_spec,$i_pos + 1)); + } else { + $s_col_name = $s_col_spec; + } + return (array($s_col_name,$s_format)); + } + + /* + * Method: MakeCSVRecord + * Parameters: $a_column_list a list of column names (field names) to + * include; can include format specifiers + * $a_vars raw data array indexed by column name + * (field name). + * A data value can be a string or an array + * of strings. + * Returns: string the comma-separated value + * Description: + * Creates a single CSV record for a list of columns. + */ + function MakeCSVRecord($a_column_list,$a_vars) + { + $s_rec = ""; + $n_columns = count($a_column_list); + for ($ii = 0 ; $ii < $n_columns ; $ii++) { + list($s_col_name,$s_format) = $this->_GetColumn($a_column_list[$ii]); + /* + * if a column is specified it must be included, even if there + * is no data for it. + */ + $s_value = GetFieldValue($s_col_name,$a_vars,$this->_cIntSep); + if (isset($this->_sCleanFunc)) { + $s_func = $this->_sCleanFunc; + $s_value = $s_func($s_value); + } + + $s_value = $this->_Format($s_value,$s_format); + if ($ii > 0) /* + * prepend the separator from the second field onwards + */ { + $s_rec .= $this->_cSep; + } + $s_rec .= $s_value; + } + return ($s_rec); + } + + /* + * Method: MakeHeading + * Parameters: $a_column_list a list of column names (field names) to + * include + * Returns: string the comma-separated heading record + * Description: + * Creates a heading record for the CSV data. + */ + function MakeHeading($a_column_list) + { + $s_rec = ""; + $n_columns = count($a_column_list); + for ($ii = 0 ; $ii < $n_columns ; $ii++) { + list($s_col_name,$s_format) = $this->_GetColumn($a_column_list[$ii]); + $s_value = $this->_Format($s_col_name); + if ($ii > 0) /* + * prepend the separator from the second field onwards + */ { + $s_rec .= $this->_cSep; + } + $s_rec .= $s_value; + } + return ($s_rec); + } +} + +/* + * Built-in filter. Generates CSV (comma separated values) content from + * the submitted fields. The special field "filter_fields" determines + * which fields to include in the CSV content. + * The following options are support in "filter_options": + * CSVHeading if set, includes a heading line first with the field names + * CSVSep specifies a separator character instead of comma + * CSVIntSep specifies an internal separator character for lists + * CSVQuote specifies the character to use to quote each column; default + * is double quotes + * CSVEscPolicy controls the way quotes are escaped in the data. Supported + * values are: backslash (the default),double,strip + * CSVRaw if set, then the fields are recorded as raw values and + * are *not* cleaned according to FormMail's normal field + * cleaning process. + * If the "filter_fields" field does not exist, then the "csvcolumns" field is + * used instead. If neither exist, then all fields are included along with + * a Heading line. + */ +function BuiltinFilterCSV() +{ + global $aAllRawValues,$aRawDataValues,$SPECIAL_VALUES; + + $b_heading = false; + $a_column_list = array(); + $s_cols = $SPECIAL_VALUES["filter_fields"]; + if (!isset($s_cols) || empty($s_cols) || !is_string($s_cols)) { + $s_cols = $SPECIAL_VALUES["csvcolumns"]; + if (!isset($s_cols) || empty($s_cols) || !is_string($s_cols)) { + /* + * neither filter_fields nor csvcolumns defined - get all columns + */ + $s_cols = ""; + /* + * special case - include these two special fields + */ + $a_column_list = array("email","realname"); + /* + * now include all the data fields + */ + $a_column_list = array_merge($a_column_list, + array_keys($aRawDataValues)); + $b_heading = true; + } + } + if (empty($a_column_list)) { + $a_column_list = TrimArray(explode(",",$s_cols)); + } + + $csv_format = new CSVFormat(); + + /* + * get the various options and set them + */ + $m_temp = GetFilterOption("CSVQuote"); + if (isset($m_temp)) { + $csv_format->SetQuote($m_temp); + } + $m_temp = GetFilterOption("CSVSep"); + if (isset($m_temp)) { + $csv_format->SetSep($m_temp); + } + $m_temp = GetFilterOption("CSVIntSep"); + if (isset($m_temp)) { + $csv_format->SetIntSep($m_temp); + } + $m_temp = GetFilterOption("CSVEscPolicy"); + if (isset($m_temp)) { + $csv_format->SetEscPolicy($m_temp); + } + $m_temp = GetFilterOption("CSVHeading"); + if (isset($m_temp)) { + $b_heading = true; + } + + /* + * clean fields unless CSVRaw is specified + */ + $m_temp = GetFilterOption("CSVRaw"); + if (!isset($m_temp)) { + $csv_format->SetCleanFunc(function ($m_value) { + return CleanValue($m_value); + }); + } + + $s_csv = $csv_format->MakeCSVRecord($a_column_list,$aAllRawValues); + + if ($b_heading) { + $s_head = $csv_format->MakeHeading($a_column_list); + /* + * return the heading and the record with $CSVLINE as record separator + */ + return ($s_head . Settings::get('CSVLINE') . $s_csv . Settings::get('CSVLINE')); + } else { + /* + * return this record with $CSVLINE appended + */ + return ($s_csv . Settings::get('CSVLINE')); + } +} + +$aSubstituteErrors = array(); +$SubstituteFields = NULL; +$sSubstituteMissing = NULL; + +// +// Run htmlspecialchars on every value in an array. +// +function ArrayHTMLSpecialChars($a_list) +{ + $a_new = array(); + foreach ($a_list as $m_key => $m_value) { + if (is_array($m_value)) { + $a_new[$m_key] = ArrayHTMLSpecialChars($m_value); + } else { + $a_new[$m_key] = htmlspecialchars($m_value); + } + } + return ($a_new); +} + +// +// Truncate a value based on the specified maximums. +// +function Truncate($s_value,$n_max_chars,$n_max_lines) +{ + if ($n_max_lines > 0) { + $a_lines = explode("\n",$s_value); + if (count($a_lines) > $n_max_lines) { + $a_lines = array_slice($a_lines,0,$n_max_lines); + $s_value = implode("\n",$a_lines); + $s_value .= "..."; + } + } + if ($n_max_chars > 0) { + $a_lines = explode("\n",$s_value); + for ($ii = 0 ; $ii < count($a_lines) ; $ii++) { + $n_len = strlen($a_lines[$ii]); + $s_eol = ""; + if (substr($a_lines[$ii],-1) == "\n") { + $n_len--; + $s_eol = "\n"; + } + if ($n_len > $n_max_chars) { + $a_lines[$ii] = substr($a_lines[$ii],0,$n_max_chars) . "..." . $s_eol; + } + } + $s_value = implode("\n",$a_lines); + } + return ($s_value); +} + +// +// Worker function for SubstituteValue and SubstituteValueForPage. +// Returns the value of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, an error is reported or the given +// replacement string is used. +// Errors are stored in the global $aSubstituteErrors. +// +function SubstituteValueWorker($a_matches,$s_repl,$b_html = true) +{ + /** + * @global FieldManager $SubstituteFields + */ + global $aSubstituteErrors,$SubstituteFields,$SPECIAL_VALUES; + + $b_insert_br = true; // option to put "
    " tags before newlines in HTML templates + $n_max_chars = 0; + $n_max_lines = 0; + $s_list_sep = $SPECIAL_VALUES['template_list_sep']; + $b_text_subs = false; + + $s_name = $a_matches[0]; + assert(strlen($s_name) > 1 && $s_name[0] == '$'); + $s_name = substr($s_name,1); + if (($i_len = strlen($s_name)) > 0 && $s_name[0] == '{') { + assert($s_name[$i_len - 1] == '}'); + $s_name = substr($s_name,1,-1); + // + // grab any processing options + // + $a_args = explode(":",$s_name); + $s_name = $a_args[0]; + if (($n_args = count($a_args)) > 1) { + for ($ii = 1 ; $ii < $n_args ; $ii++) { + // + // some options are followed by =X + // where X is a value + // + $s_param = ""; + if (($i_pos = strpos($a_args[$ii],'=')) !== false) { + $s_param = substr($a_args[$ii],$i_pos + 1); + $s_opt = substr($a_args[$ii],0,$i_pos); + } else { + $s_opt = $a_args[$ii]; + } + switch ($s_opt) { + case "nobr": + $b_insert_br = false; + break; + case "chars": + if ($s_param !== "") { + $n_max_chars = (int)$s_param; + } + break; + case "lines": + if ($s_param !== "") { + $n_max_lines = (int)$s_param; + } + break; + case "sep": + if ($s_param !== "") { + $s_list_sep = $s_param; + } + break; + case "subs": + $b_text_subs = true; + break; + } + } + } + } + $s_value = ""; + $s_mesg = ""; + if ($SubstituteFields->IsFieldSet($s_name) && + !$SubstituteFields->TestFieldEmpty($s_name,$s_mesg) + ) { + if ($b_html) + // + // Up to and including version 8.24, the code used + // htmlspecialchars. Version 8.28 caused UTF-8 template + // processing to break, because it started using htmlentities + // without specifying the charset. + // + { + $s_value = $SubstituteFields->GetSafeFieldValue($s_name,$b_text_subs,$s_list_sep); + } else { + $s_value = $SubstituteFields->GetFieldValue($s_name,$s_list_sep); + } + $s_value = Truncate($s_value,$n_max_chars,$n_max_lines); + if ($b_html && $b_insert_br) + // + // Insert HTML line breaks before newlines. + // + { + $s_value = nl2br($s_value); + } + } elseif (isset($SPECIAL_VALUES[$s_name])) { + $s_value = $b_html ? + htmlspecialchars((string)$SPECIAL_VALUES[$s_name]) : + (string)$SPECIAL_VALUES[$s_name]; + $s_value = Truncate($s_value,$n_max_chars,$n_max_lines); + } elseif (isset($s_repl)) + // + // If a replacement value has been specified use it, and + // don't call htmlspecialchars. This allows the use + // of HTML tags in a replacement string. + // + { + $s_value = $s_repl; + } else { + $s_value = ""; + } + return ($s_value); +} + +// +// Callback function for preg_replace_callback. Returns the value +// of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, an error is reported or an special +// replacement string is used. +// Errors are stored in the global $aSubstituteErrors. +// +/** @noinspection PhpUnused */ +function SubstituteValue($a_matches) +{ + global $sSubstituteMissing; + + return (SubstituteValueWorker($a_matches,$sSubstituteMissing)); +} + +// +// Callback function for preg_replace_callback. Returns the value +// of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, an error is reported or an special +// replacement string is used. +// Errors are stored in the global $aSubstituteErrors. +// +/** @noinspection PhpUnused */ +function SubstituteValuePlain($a_matches) +{ + global $sSubstituteMissing; + + return (SubstituteValueWorker($a_matches,$sSubstituteMissing,false)); +} + +// +// Callback function for preg_replace_callback. Returns the value +// of the matched variable name. +// Variables are searched for in the global $SubstituteFields. +// If no such variable exists, the empty string is substituted. +// Errors are stored in the global $aSubstituteErrors. +// +/** @noinspection PhpUnused */ +function SubstituteValueForPage($a_matches) +{ + return (SubstituteValueWorker($a_matches,"")); +} + +// +// Callback function for preg_replace_callback. Returns +// exactly what was matched. +// +/** @noinspection PhpUnused */ +function SubstituteValueDummy($a_matches) +{ + return ($a_matches[0]); +} + +// +// Process the given HTML template and fill the fields. +// +function DoProcessTemplate($s_dir,$s_url,$s_template,&$a_lines, + $a_values,$s_missing,$s_subs_func) +{ + global $aSubstituteErrors,$SubstituteFields,$sSubstituteMissing,$aFileVars; + + if (($a_template_lines = LoadTemplate($s_template,$s_dir, + $s_url,true)) === false + ) { + return (false); + } + FMDebug("Template '$s_template' contains " . count($a_template_lines) . " lines"); + + $b_ok = true; + // + // initialize the errors list + // + $aSubstituteErrors = array(); + // + // initialize the values + // + $SubstituteFields = new FieldManager($a_values,$aFileVars); + $sSubstituteMissing = $s_missing; + + foreach ($a_template_lines as $s_line) { + // + // search for words in these forms: + // $word + // ${word:options} + // where word begins with an alphabetic character and + // consists of alphanumeric and underscore + // + $a_lines[] = preg_replace_callback('/\$[a-z][a-z0-9_]*|\$\{[a-z][a-z0-9_]*(:[^\}]*)*\}/i', + $s_subs_func,$s_line); + } + + FMDebug("DoProcessTemplate error count=" . count($aSubstituteErrors)); + if (count($aSubstituteErrors) != 0) { + SendAlert(GetMessage(MSG_TEMPLATE_ERRORS,array("NAME" => $s_template)) . + implode("\n",$aSubstituteErrors)); + $b_ok = false; + } + global $FMCTemplProc; + + // + // note that it's possible for an old version of FormMail Computation + // module to get loaded which doesn't provide FMCTemplProc + // + if ($b_ok && Settings::get('ADVANCED_TEMPLATES') && isset($FMCTemplProc)) { + $s_buf = implode("\n",$a_lines); + /* + * Look for a string that means we can skip advanced template + * processing on this template. The string is "FormMail-Basic-Template". + */ + if (strpos($s_buf,"FormMail-Basic-Template") === FALSE) { + $a_mesgs = array(); + /*foreach ($a_lines as $i_lno=>$s_line) + if (strpos($s_line,"\n") !== false) + SendAlert("Line $i_lno has a newline");*/ + set_time_limit(60); + if (($m_result = $FMCTemplProc->Process($s_buf,$a_mesgs)) === false) { + $s_msgs = "\n"; + foreach ($a_mesgs as $a_msg) { + $s_msgs .= "Line " . $a_msg["LINE"]; + $s_msgs .= ", position " . $a_msg["CHAR"] . ": "; + $s_msgs .= $a_msg["MSG"] . "\n"; + } + Error("fmadvtemplates",GetMessage(MSG_TEMPL_PROC, + array("ERRORS" => $s_msgs)),false,false); + $b_ok = false; + } else { + /*foreach ($m_result as $i_lno=>$s_line) + if (($nn = substr_count($s_line,"\n")) > 1) + SendAlert("Result line $i_lno has $nn newlines");*/ + // + // strip the new lines + // + $a_lines = explode("\n",implode("",$m_result)); + } + $a_alerts = $FMCTemplProc->GetAlerts(); + if (count($a_alerts) > 0) { + SendAlert(GetMessage(MSG_TEMPL_ALERT, + array("ALERTS" => implode("\n",$a_alerts)))); + } + $a_debug = $FMCTemplProc->GetDebug(); + if (count($a_debug) > 0) { + SendAlert(GetMessage(MSG_TEMPL_DEBUG, + array("DEBUG" => implode("\n",$a_debug)))); + } + } + } + + return ($b_ok); +} + +// +// Process the given HTML template and fill the fields. +// +function ProcessTemplate($s_template,&$a_lines,$a_values,$s_missing = NULL, + $s_subs_func = 'SubstituteValue') +{ + + if (Settings::isEmpty('TEMPLATEDIR') && Settings::isEmpty('TEMPLATEURL')) { + SendAlert(GetMessage(MSG_TEMPLATES)); + return (false); + } + return (DoProcessTemplate(Settings::get('TEMPLATEDIR'),Settings::get('TEMPLATEURL'),$s_template,$a_lines, + $a_values,$s_missing,$s_subs_func)); +} + +// +// Output the given HTML template after filling in the fields. +// +function OutputTemplate($s_template,$a_values) +{ + $a_lines = array(); + if (!ProcessTemplate($s_template,$a_lines,$a_values,"",'SubstituteValueForPage')) { + Error("template_failed",GetMessage(MSG_TEMPLATE_FAILED, + array("NAME" => $s_template)),false,false); + } else { + for ($ii = 0 ; $ii < count($a_lines) ; $ii++) { + echo $a_lines[$ii] . "\n"; + } + } +} + +// +// This function handles input type fields. +// +function RemoveFieldValue($s_name,$s_buf) +{ + // + // we search for: + // + // and change it to: + // + // + + // handle name attribute first + $s_pat = '/<(\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*)>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'',$s_buf); + + return ($s_buf); +} + +// +// Quote special characters in a replacement expression +// for preg_replace. +// +function RegReplaceQuote($s_value) +{ + return (str_replace('$','\\$',str_replace('\\','\\\\',$s_value))); +} + +// +// This function handles input type "text" and "password" +// +function FixInputText($s_name,$s_value,$s_buf) +{ + // + // we search for: + // ',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:text|password|email|tel|search|number|date|month|datetime|datetime-local|time|week|range|url|color)"[^>]*)(value="[^"]*")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // + // now add in the new value + // + $s_repl = '$1 value="' . htmlspecialchars(RegReplaceQuote($s_value)) . '" $2>'; + + // handle type attribute first + $s_pat = '/(<\s*input[^>]*type="(?:text|password|email|tel|search|number|date|month|datetime|datetime-local|time|week|range|url|color)"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:text|password|email|tel|search|number|date|month|datetime|datetime-local|time|week|range|url|color)"[^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + return ($s_buf); +} + +// +// This function handles textareas. +// +function FixTextArea($s_name,$s_value,$s_buf) +{ + // + // we search for: + // + // and change it to: + // + // + + $s_pat = '/(<\s*textarea[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*)>.*?<\s*\/\s*textarea\s*>'; + $s_pat .= '/ims'; + // + // we exclude the closing '>' from the match above so that + // we can put it below. We need to do this so that the replacement + // string is not faulty if the value begins with a digit: + // $19 Some Street + // + $s_repl = '$1>' . htmlspecialchars(RegReplaceQuote($s_value)) . ''; + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + return ($s_buf); +} + +// +// This function handles radio buttons and non-array checkboxes. +// +function FixButton($s_name,$s_value,$s_buf) +{ + // + // we search for: + // + // [^>]*?[^"\w] matches up to a word boundary starting with + // 'checked' but not '"checked' + // (="checked"|(?=[^"\w]))? this matches: + // nothing + // ="checked" + // any character except a word character or " (without + // consuming it) + // + $s_pat = '/(<\s*input[^>]*type="(?:radio|checkbox)"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:radio|checkbox)"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // handle type attribute first + $s_pat = '/(<\s*input[^>]*type="(?:radio|checkbox)"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked" $3>',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '"[^>]*type="(?:radio|checkbox)"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked" $3>',$s_buf); + + return ($s_buf); +} + +// +// This function handles checkboxes as an array of values. +// +function FixCheckboxes($s_name,$a_values,$s_buf) +{ + //global $aDebug; + + // + // we search for: + // + $s_pat = '/(<\s*input[^>]*type="checkbox"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[]"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[]"[^>]*type="checkbox"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + foreach ($a_values as $s_value) { + // handle type attribute first + $s_pat = '/(<\s*input[^>]*type="checkbox"[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[\]"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked"$3>',$s_buf); + //$aDebug[] = "Name='$s_name', pat='$s_pat'"; + + // handle name attribute first + $s_pat = '/(<\s*input[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[\]"[^>]*type="checkbox"[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '")([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$2 checked="checked">',$s_buf); + } + return ($s_buf); +} + +// +// This function handles selects. +// +function FixSelect($s_name,$s_value,$s_buf) +{ + // + // we search for: + // + // + + $s_pat = '/(<\s*select[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '".*?<\s*option[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '"[^>]*)>'; + $s_pat .= '/ims'; + $s_repl = '$1 selected="selected">'; + // echo "

    pat: ".htmlspecialchars($s_pat); + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + + return ($s_buf); +} + +// +// This function handles multiple selects. +// +function FixMultiSelect($s_name,$a_values,$s_buf) +{ + // + // we search for: + // + // + + foreach ($a_values as $s_value) { + $s_pat = '/(<\s*select[^>]*name="'; + $s_pat .= preg_quote($s_name,"/"); + $s_pat .= '\[\]".*?<\s*option[^>]*value="'; + $s_pat .= preg_quote($s_value,"/"); + $s_pat .= '"[^>]*)>'; + $s_pat .= '/ims'; + $s_repl = '$1 selected="selected">'; + // echo "

    pat: ".htmlspecialchars($s_pat); + $s_buf = preg_replace($s_pat,$s_repl,$s_buf); + } + return ($s_buf); +} + +// +// This function unchecks all checkboxes and select options. +// +function UnCheckStuff($s_buf) +{ + global $php_errormsg; + + // + // we search for: + // + // + + $s_pat = '/(<\s*input[^>]*type="checkbox"[^>]*?[^"\w])checked(="checked"|(?=[^"\w]))?([^>]*?)(\s*\/\s*)?>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3$4>',$s_buf); + + // + // we search for: + // + // + + $s_pat = '/(<\s*option[^>]*?[^"\w])selected(="selected"|(?=[^"\w]))?([^>]*)>'; + $s_pat .= '/ims'; + $s_buf = preg_replace($s_pat,'$1$3>',$s_buf); + + return ($s_buf); +} + +// +// Add the user agent to the url as a parameter called USER_AGENT. +// This allows dynamic web sites to know what the user's browser is. +// +function AddUserAgent($s_url) +{ + global $aServerVars,$aGetVars; + + // + // check if the USER_AGENT has been passed as a URL parameter, + // if so, use it + // + $s_agent = ""; + if (isset($aGetVars['USER_AGENT']) && $aGetVars['USER_AGENT'] !== "") { + $s_agent = $aGetVars['USER_AGENT']; + // + // check for URL encoding, and if not, then encode it + // + if (!IsURLEncoded($s_agent)) { + $s_agent = urlencode($s_agent); + } + } elseif (isset($aServerVars['HTTP_USER_AGENT'])) { + $s_agent = urlencode($aServerVars['HTTP_USER_AGENT']); + } + + if ($s_agent !== "") { + return (AddURLParams($s_url,"USER_AGENT=$s_agent",false)); + } else { + return ($s_url); + } +} + +// +// Try to determine if the given string is already URL-encoded +// +function IsURLEncoded($s_str) +{ + // + // the only non-alphanumeric characters we'd expect + // to see are defined as safe or extra in RFC 1738: + // safe = "$" | "-" | "_" | "." | "+" + // extra = "!" | "*" | "'" | "(" | ")" | "," + // plus the encoding character % + // + if (preg_match('/[^a-z0-9$_.+!*\'(),%-]/i',$s_str,$a_matches)) { + FMDebug("IsURLEncoded: '$s_str' matched '" . $a_matches[0] . "' and is therefore not URL-encoded"); + return (false); + } + return (true); +} + +// +// Sets previous values in a form. +// +function SetPreviousValues($s_form_buf,$a_values,$a_strip = array()) +{ + // + // Uncheck any checkboxes and select options + // + $s_form_buf = UnCheckStuff($s_form_buf); + foreach ($a_values as $s_name => $m_value) { + if (is_array($m_value)) { + // + // note that if no values are selected for a field, + // then we will never get here for that field + // + $s_form_buf = FixCheckboxes($s_name,$m_value,$s_form_buf); + $s_form_buf = FixMultiSelect($s_name,$m_value,$s_form_buf); + } else { + // + // Fix the field if it's an input type "text" or "password". + // + $s_form_buf = FixInputText($s_name,$m_value,$s_form_buf); + // + // Fix the field if it's radio button. + // + $s_form_buf = FixButton($s_name,$m_value,$s_form_buf); + // + // Fix the field if it's a "textarea". + // + $s_form_buf = FixTextArea($s_name,$m_value,$s_form_buf); + // + // Fix the field if it's a "select". + // + $s_form_buf = FixSelect($s_name,$m_value,$s_form_buf); + } + } + // + // Now strip particular field values. + // + foreach ($a_strip as $s_name) { + $s_form_buf = RemoveFieldValue($s_name,$s_form_buf); + } + return ($s_form_buf); +} + +// +// Open a URL, do value substitutions, and send to browser. +// The a_strip array provides a list of fields (usually +// hidden fields) to remove from the form (their values are +// set to empty). +// +function ProcessReturnToForm($s_url,$a_values,$a_strip = array()) +{ + global $php_errormsg; + + // + // read the original form, and modify it to provide values + // for the fields + // + if (!CheckValidURL($s_url)) { + Error("invalid_url",GetMessage(MSG_RETURN_URL_INVALID, + array("URL" => $s_url)),false,false); + } + + $s_form_url = AddUserAgent($s_url); + $s_error = ""; + $s_form_buf = GetURL($s_form_url,$s_error); + if ($s_form_buf === false) { + Error( "invalid_url", + GetMessage(MSG_OPEN_URL, + array("URL" => $s_form_url, + "ERROR" => $s_error . + ": " . + (isset($php_errormsg) ? + $php_errormsg : "") + )), + false, + false); + } + + // + // Next, we replace or set actual field values. + // + echo SetPreviousValues($s_form_buf,$a_values,$a_strip); +} + +// +// To return the URL for returning to a particular multi-page form URL. +// +function GetReturnLink($s_this_script,$i_form_index) +{ + global $aServerVars; + + if (!CheckValidURL($s_this_script)) { + Error("not_valid_url",GetMessage(MSG_RETURN_URL_INVALID, + array("URL" => $s_this_script)),false,false); + } + + $a_params = array(); + $a_params[] = "return=$i_form_index"; + if (isset($aServerVars["QUERY_STRING"])) { + $a_params[] = $aServerVars["QUERY_STRING"]; + } + $a_params[] = session_name() . "=" . session_id(); + return (AddURLParams($s_this_script,$a_params)); +} + +// +// Process a multi-page form template. +// +function ProcessMultiFormTemplate($s_template,$a_values,&$a_lines) +{ + global $SPECIAL_VALUES; + + if (Settings::isEmpty('MULTIFORMDIR') && Settings::isEmpty('MULTIFORMURL')) { + SendAlert(GetMessage(MSG_MULTIFORM)); + return (false); + } + // + // create the "this_form_url" field + // + + $i_index = GetSession("FormIndex"); + $a_list = GetSession("FormList"); + $a_values["this_form_url"] = $a_list[$i_index]["URL"]; + // + // get the persistent file fields + // + $a_values = GetSavedFileNames($a_values); + //$a_values["prev_form"] = GetReturnLink($SPECIAL_VALUES["this_form"]); + return (DoProcessTemplate(Settings::get('MULTIFORMDIR'),Settings::get('MULTIFORMURL'),$s_template,$a_lines, + $a_values,"",'SubstituteValueForPage')); +} + +// +// Output the multi-form template after filling in the fields. +// +function OutputMultiFormTemplate($s_template,$a_values) +{ + $a_lines = array(); + if (!ProcessMultiFormTemplate($s_template,$a_values,$a_lines)) { + Error("multi_form_failed",GetMessage(MSG_MULTIFORM_FAILED, + array("NAME" => $s_template)),false,false); + } else { + $n_lines = count($a_lines); + $s_buf = ""; + for ($ii = 0 ; $ii < $n_lines ; $ii++) { + $s_buf .= $a_lines[$ii] . "\n"; + unset($a_lines[$ii]); // free memory (hopefully) + } + unset($a_lines); // free memory (hopefully) + + if (IsSetSession("FormKeep")) + // + // put in any values that are being forward-remembered + // + { + echo SetPreviousValues($s_buf,GetSession("FormKeep")); + } else { + echo $s_buf; + } + } +} + +// +// Insert a preamble into a MIME message. +// +function MimePreamble(&$a_lines,$a_mesg = array()) +{ + $a_preamble = explode("\n",GetMessage(MSG_MIME_PREAMBLE)); + foreach ($a_preamble as $s_line) { + $a_lines[] = $s_line . Settings::get('HEAD_CRLF'); + } + + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + $b_need_blank = false; + foreach ($a_mesg as $s_line) { + $a_lines[] = $s_line . Settings::get('HEAD_CRLF'); + if (!empty($s_line)) { + $b_need_blank = true; + } + } + if ($b_need_blank) { + $a_lines[] = Settings::get('HEAD_CRLF'); + } // blank line +} + +// +// Create the HTML mail +// +function HTMLMail(&$a_lines,&$a_headers,$s_body,$s_template,$s_missing,$s_filter, + $s_boundary,$a_raw_fields,$b_no_plain,$b_process_template) +{ + $s_charset = GetMailOption("CharSet"); + if (!isset($s_charset)) { + $s_charset = "ISO-8859-1"; + } + if ($b_no_plain) { + $b_multi = false; + // + // don't provide a plain text version - just the HTML + // + $a_headers['Content-Type'] = SafeHeader("text/html; charset=$s_charset"); + } else { + $b_multi = true; + $a_headers['Content-Type'] = "multipart/alternative; boundary=\"$s_boundary\""; + + $a_pre_lines = explode("\n",GetMessage(MSG_MIME_HTML, + array("NAME" => $s_template))); + + MimePreamble($a_lines,$a_pre_lines); + + // + // first part - the text version only + // + $a_lines[] = "--$s_boundary" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Type: text/plain; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + // + // treat the body like one line, even though it isn't + // + $a_lines[] = $s_body; + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + // + // second part - the HTML version + // + $a_lines[] = "--$s_boundary" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Type: text/html; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + } + + $a_html_lines = array(); + if (!$b_process_template) { + if (!ProcessTemplate($s_template,$a_html_lines,$a_raw_fields,NULL,'SubstituteValueDummy')) { + return (false); + } + } elseif (!ProcessTemplate($s_template,$a_html_lines,$a_raw_fields,$s_missing)) { + return (false); + } + + if (!empty($s_filter)) + // + // treat the data like one line, even though it isn't + // + { + $a_lines[] = Filter($s_filter,$a_html_lines); + } else { + foreach ($a_html_lines as $s_line) { + $a_lines[] = $s_line; + } + } + + if ($b_multi) { + // + // end + // + $a_lines[] = "--$s_boundary--" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + } + return (true); +} + +// +// Add the contents of a file in base64 encoding. +// +function AddFile(&$a_lines,$s_file_name,$i_file_size,$b_remove = true) +{ + global $php_errormsg; + + @ $fp = fopen($s_file_name,"rb"); + if ($fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_file_name, + "TYPE" => "attachment", + "ERROR" => CheckString($php_errormsg) + ))); + return (false); + } + // + // PHP under IIS has problems with the filesize function when + // the file is on another drive. So, we replaced a call + // to filesize with the $i_file_size parameter (this occurred + // in version 3.01). + // + $s_contents = fread($fp,$i_file_size); + // + // treat as a single line, even though it isn't + // + $a_lines[] = chunk_split(base64_encode($s_contents)); + fclose($fp); + if ($b_remove) { + @unlink($s_file_name); + } + return (true); +} + +// +// Add the contents of a string in base64 encoding. +// +function AddData(&$a_lines,$s_data) +{ + // + // treat as a single line, even though it isn't + // + $a_lines[] = chunk_split(base64_encode($s_data)); + return (true); +} + +/** + * Check if a file is a valid uploaded file. + * + * This function is obsolete and is only kept for use by + * existing hook files. Do not use this function in new code. + * + * @param array $a_file_spec file specification + * + * @return bool + */ +function IsUploadedFile($a_file_spec) +{ + return FieldManager::IsUploadedFile($a_file_spec); +} + +// +// Save an uploaded file to the repository directory. +// +function SaveFileInRepository(&$a_file_spec) +{ + global $php_errormsg; + + // + // if a replacement name has been specified, use that, otherwise + // use the original name + // + if (isset($a_file_spec["new_name"])) { + $s_file_name = basename($a_file_spec["new_name"]); + } else { + $s_file_name = basename($a_file_spec["name"]); + } + $s_dest = Settings::get('FILE_REPOSITORY') . "/" . $s_file_name; + + $b_ok = true; + $s_error = ""; + + if (isset($a_file_spec["saved_as"]) && !empty($a_file_spec["saved_as"])) { + FMDebug("SaveFileInRepository: saved_as"); + $s_srce = $a_file_spec["saved_as"]; + } else { + $s_srce = $a_file_spec["tmp_name"]; + } + + FMDebug("SaveFileInRepository: $s_srce"); + if (!Settings::get('FILE_OVERWRITE')) { + clearstatcache(); + if (@file_exists($s_dest)) { + $b_ok = false; + $s_error = GetMessage(MSG_SAVE_FILE_EXISTS,array("FILE" => $s_dest)); + } + } + if (Settings::get('MAX_FILE_UPLOAD_SIZE') != 0 && + $a_file_spec["size"] > Settings::get('MAX_FILE_UPLOAD_SIZE') * 1024 + ) + // + // this exits + // + { + UserError("upload_size",GetMessage(MSG_FILE_UPLOAD_SIZE, + array("NAME" => $a_file_spec["name"], + "SIZE" => $a_file_spec["size"], + "MAX" => Settings::get('MAX_FILE_UPLOAD_SIZE') + ))); + } + if ($b_ok) { + if (isset($a_file_spec["saved_as"]) && !empty($a_file_spec["saved_as"])) { + if (!copy($s_srce,$s_dest) || !@unlink($s_srce)) { + $b_ok = false; + } + } else { + if (!move_uploaded_file($s_srce,$s_dest)) { + $b_ok = false; + } + } + if ($b_ok) { + // + // Flag to say it's been put in the repository. + // + $a_file_spec["in_repository"] = true; + // + // Its new location + // + $a_file_spec["saved_as"] = $s_dest; + // + // Now that the file has been saved, "is_uploaded_file" + // will return false. So, we create a flag to say it was + // valid. + // + $a_file_spec["moved"] = true; + } else { + $s_error = $php_errormsg; + } + } + if (!$b_ok) { + SendAlert(GetMessage(MSG_SAVE_FILE,array( + "FILE" => $s_srce, + "DEST" => $s_dest, + "ERR" => $s_error + ))); + return (false); + } + // + // ignore chmod fails (other than reporting them) + // + if (Settings::get('FILE_MODE') != 0 && !chmod($s_dest,Settings::get('FILE_MODE'))) { + SendAlert(GetMessage(MSG_CHMOD,array( + "FILE" => $s_dest, + "MODE" => Settings::get('FILE_MODE'), + "ERR" => $s_error + ))); + } + return (true); +} + +// +// Save all uploaded files to the repository directory. +// +function SaveAllFilesToRepository() +{ + global $aFileVars; + + if (!Settings::get('FILEUPLOADS') || Settings::get('FILE_REPOSITORY') === "") + // + // nothing to do + // + { + return (true); + } + + foreach ($aFileVars as $m_file_key => $a_upload) { + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (!isset($a_upload["tmp_name"]) || empty($a_upload["tmp_name"]) || + !isset($a_upload["name"]) || empty($a_upload["name"]) + ) { + continue; + } + if (isset($a_upload["in_repository"]) && $a_upload["in_repository"]) + // + // already saved + // + { + continue; + } + if (!FieldManager::IsUploadedFile($a_upload)) { + SendAlert(GetMessage(MSG_FILE_UPLOAD_ATTACK, + array("NAME" => $a_upload["name"], + "TEMP" => $a_upload["tmp_name"], + "FLD" => $m_file_key + ))); + continue; + } + if (!SaveFileInRepository($aFileVars[$m_file_key])) { + return (false); + } + // + // Now the file has been saved in the repository, make + // the field persistent through all further processing + // (e.g. all movements in a multi-page form) + // + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + } else { + $a_saved_files = array(); + } + $a_saved_files["repository_" . $m_file_key] = $aFileVars[$m_file_key]; + SetSession("FormSavedFiles",$a_saved_files); + } + return (true); +} + +// +// Delete an uploaded file from the repository directory. +// For security reasons, only the field name can be used. This +// uniquely identifies an uploaded file by this form process. +// +function DeleteFileFromRepository($s_fld) +{ + global $aFileVars; + + if (!Settings::get('FILEUPLOADS') || Settings::get('FILE_REPOSITORY') === "") + // + // nothing to do + // + { + return (false); + } + + if (($a_upload = GetFileInfo($s_fld)) === false) { + return (false); + } + + if (isset($a_upload["in_repository"]) && $a_upload["in_repository"]) { + if (isset($a_upload["saved_as"]) && !empty($a_upload["saved_as"])) { + @unlink($a_upload["saved_as"]); + } + } + DeleteFileInfo($s_fld); + return (true); +} + +// +// Save an uploaded file for later processing. +// +function SaveUploadedFile(&$a_file_spec,$s_prefix) +{ + global $php_errormsg; + + FMDebug("SaveUploadedFile"); + $s_dest = GetScratchPadFile($s_prefix); + if (!move_uploaded_file($a_file_spec["tmp_name"],$s_dest)) { + SendAlert(GetMessage(MSG_SAVE_FILE,array( + "FILE" => $a_file_spec["tmp_name"], + "DEST" => $s_dest, + "ERR" => $php_errormsg + ))); + return (false); + } + $a_file_spec["saved_as"] = $s_dest; + $a_file_spec["moved"] = true; + return (true); +} + +// +// Remove old files from the scratchpad directory. +// +function CleanScratchPad($s_prefix = "") +{ + global $lNow; + global $php_errormsg; + + if (Settings::isEmpty('SCRATCH_PAD')) + // + // no scratchpad to cleanup! + // + { + return; + } + if (Settings::get('CLEANUP_TIME') <= 0) + // + // cleanup disabled + // + { + return; + } + // + // compute chance of cleanup + // + if (Settings::get('CLEANUP_CHANCE') < 100) { + $i_rand = mt_rand(1,100); + if ($i_rand > Settings::get('CLEANUP_CHANCE')) { + return; + } + } + if (($f_dir = @opendir(Settings::get('SCRATCH_PAD'))) === false) { + Error("open_scratch_pad",GetMessage(MSG_OPEN_SCRATCH_PAD,array( + "DIR" => Settings::get('SCRATCH_PAD'), + "ERR" => $php_errormsg + )), false,false); + return; + } + $i_len = strlen($s_prefix); + while (($s_file = readdir($f_dir)) !== false) { + $s_path = Settings::get('SCRATCH_PAD') . "/" . $s_file; + if (is_file($s_path) && ($i_len == 0 || substr($s_file,0,$i_len) == $s_prefix)) { + if (($a_stat = @stat($s_path)) !== false) { + if (isset($a_stat['mtime'])) { + $l_time = $a_stat['mtime']; + } else { + $l_time = $a_stat[9]; + } + if (($lNow - $l_time) / 60 >= Settings::get('CLEANUP_TIME')) { + @unlink($s_path); + } + } + } + } + closedir($f_dir); +} + +// +// Save all uploaded files for later processing. +// +function SaveAllUploadedFiles(&$a_file_vars) +{ + global $php_errormsg; + + $s_prefix = "UPLD"; + if (Settings::isEmpty('SCRATCH_PAD')) { + Error("need_scratch_pad",GetMessage(MSG_NEED_SCRATCH_PAD),false,false); + return (false); + } + + // + // remove old uploaded files that have not been moved out. + // + CleanScratchPad($s_prefix); + + foreach (array_keys($a_file_vars) as $m_file_key) { + $a_upload = &$a_file_vars[$m_file_key]; + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (!isset($a_upload["tmp_name"]) || empty($a_upload["tmp_name"]) || + !isset($a_upload["name"]) || empty($a_upload["name"]) + ) { + continue; + } + // + // ensure we don't move the file more than once + // + if (!isset($a_upload["saved_as"]) || empty($a_upload["saved_as"])) { + if (!FieldManager::IsUploadedFile($a_upload)) { + SendAlert(GetMessage(MSG_FILE_UPLOAD_ATTACK, + array("NAME" => $a_upload["name"], + "TEMP" => $a_upload["tmp_name"], + "FLD" => $m_file_key + ))); + } elseif (!SaveUploadedFile($a_upload,$s_prefix)) { + return (false); + } + } + } + return (true); +} + +// +// Attach a file to the body of a MIME formatted email. $a_lines is the +// current body, and is modified to include the file. +// $a_file_spec must have the following values (just like an uploaded +// file specification): +// name the name of the file +// type the mime type +// tmp_name the name of the temporary file +// size the size of the temporary file +// +// Alternatively, you supply the following instead of tmp_name and size: +// data the data to attach +// +function AttachFile(&$a_lines,$s_att_boundary,$a_file_spec,$s_charset,$b_remove = true) +{ + $a_lines[] = "--$s_att_boundary" . Settings::get('HEAD_CRLF'); + // + // if a replacement name has been specified, use that, otherwise + // use the original name + // + if (isset($a_file_spec["new_name"])) { + $s_file_name = $a_file_spec["new_name"]; + } else { + $s_file_name = $a_file_spec["name"]; + } + $s_file_name = str_replace('"','',$s_file_name); + $s_mime_type = $a_file_spec["type"]; + // + // The following says that the data is encoded in + // base64 and is an attachment and that once decoded the + // character set of the decoded data is $s_charset. + // (See RFC 1521 Section 5.) + // + $a_lines[] = "Content-Type: $s_mime_type; name=\"$s_file_name\"; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Transfer-Encoding: base64" . Settings::get('HEAD_CRLF'); + $a_lines[] = "Content-Disposition: attachment; filename=\"$s_file_name\"" . Settings::get('HEAD_CRLF'); + $a_lines[] = Settings::get('HEAD_CRLF'); // blank line + if (isset($a_file_spec["tmp_name"]) && isset($a_file_spec["size"])) { + $s_srce = $a_file_spec["tmp_name"]; + // + // check if the file has been saved elsewhere + // + if (isset($a_file_spec["saved_as"]) && !empty($a_file_spec["saved_as"])) { + $s_srce = $a_file_spec["saved_as"]; + } + FMDebug("AttachFile: $s_srce"); + return (AddFile($a_lines,$s_srce,$a_file_spec["size"],$b_remove)); + } + if (!isset($a_file_spec["data"])) { + SendAlert(GetMessage(MSG_ATTACH_DATA)); + return (false); + } + return (AddData($a_lines,$a_file_spec["data"])); +} + +// +// Reformat the email to be in MIME format. +// Process file attachments and and fill out any +// specified HTML template. +// +function MakeMimeMail(&$s_body,&$a_headers,$a_raw_fields,$s_template = "", + $s_missing = NULL,$b_no_plain = false, + $s_filter = "",$a_file_vars = array(), + $a_attach_spec = array(),$b_process_template = true) +{ + global $FM_VERS; + global $SPECIAL_VALUES; + + $s_charset = GetMailOption("CharSet"); + if (!isset($s_charset)) { + $s_charset = "ISO-8859-1"; + } + $b_att = $b_html = false; + $b_got_filter = (isset($s_filter) && !empty($s_filter)); + if (isset($s_template) && !empty($s_template)) { + $b_html = true; + } + if (count($a_file_vars) > 0) { + if (!Settings::get('FILEUPLOADS')) { + SendAlert(GetMessage(MSG_FILE_UPLOAD)); + // + // if storing files in the server repository, don't attach + // unless the mail_options insist + // + } elseif (Settings::get('FILE_REPOSITORY') === "" || IsMailOptionSet("AlwaysEmailFiles")) { + foreach ($a_file_vars as $a_upload) { + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (isset($a_upload["tmp_name"]) && !empty($a_upload["tmp_name"]) && + isset($a_upload["name"]) && !empty($a_upload["name"]) + ) { + $b_att = true; + break; + } + } + } + } + // + // check for an internally-generated attachment + // + if (isset($a_attach_spec["Data"])) { + $b_att = true; + } + + $s_uniq = md5($s_body); + $s_body_boundary = "BODY$s_uniq"; + $s_att_boundary = "PART$s_uniq"; + $a_headers['MIME-Version'] = "1.0 (produced by FormMail $FM_VERS from www.tectite.com)"; + + // + // if the filter strips formatting, then we'll only have plain text + // to send, even after the template has been used + // + if ($b_got_filter && IsFilterAttribSet($s_filter,"Strips")) + // + // no HTML if the filter strips the formatting + // + { + $b_html = false; + } + $a_new = array(); + if ($b_att) { + $a_headers['Content-Type'] = "multipart/mixed; boundary=\"$s_att_boundary\""; + + MimePreamble($a_new); + // + // add the body of the email + // + $a_new[] = "--$s_att_boundary" . Settings::get('HEAD_CRLF'); + if ($b_html) { + $a_lines = $a_local_headers = array(); + if (!HTMLMail($a_lines,$a_local_headers,$s_body,$s_template, + $s_missing,($b_got_filter) ? $s_filter : "", + $s_body_boundary,$a_raw_fields,$b_no_plain, + $b_process_template) + ) { + return (false); + } + $a_new = array_merge($a_new,ExpandMailHeadersArray($a_local_headers)); + $a_new[] = Settings::get('HEAD_CRLF'); // blank line after header + $a_new = array_merge($a_new,$a_lines); + } else { + $a_new[] = "Content-Type: text/plain; charset=$s_charset" . Settings::get('HEAD_CRLF'); + $a_new[] = Settings::get('HEAD_CRLF'); // blank line + // + // treat the body like one line, even though it isn't + // + $a_new[] = $s_body; + } + // + // now add the attachments or save to the $FILE_REPOSITORY + // + if (Settings::get('FILEUPLOADS') && + (Settings::get('FILE_REPOSITORY') === "" || IsMailOptionSet("AlwaysEmailFiles")) + ) { + foreach ($a_file_vars as $m_file_key => $a_upload) { + // + // One customer reported: + // Possible file upload attack detected: name='' temp name='none' + // on PHP 4.1.2 on RAQ4. + // So, we now also test for "name". + // + if (!isset($a_upload["tmp_name"]) || empty($a_upload["tmp_name"]) || + !isset($a_upload["name"]) || empty($a_upload["name"]) + ) { + continue; + } + if (!FieldManager::IsUploadedFile($a_upload)) { + SendAlert(GetMessage(MSG_FILE_UPLOAD_ATTACK, + array("NAME" => $a_upload["name"], + "TEMP" => $a_upload["tmp_name"], + "FLD" => $m_file_key + ))); + continue; + } + if (Settings::get('MAX_FILE_UPLOAD_SIZE') != 0 && + $a_upload["size"] > Settings::get('MAX_FILE_UPLOAD_SIZE') * 1024 + ) { + UserError("upload_size",GetMessage(MSG_FILE_UPLOAD_SIZE, + array("NAME" => $a_upload["name"], + "SIZE" => $a_upload["size"], + "MAX" => Settings::get('MAX_FILE_UPLOAD_SIZE') + ))); + } + if (!AttachFile($a_new,$s_att_boundary,$a_upload,$s_charset, + Settings::get('FILE_REPOSITORY') === "") + ) { + return (false); + } + } + } + if (isset($a_attach_spec["Data"])) { + // + // build a specification similar to a file upload + // + $a_file_spec["name"] = isset($a_attach_spec["Name"]) ? + $a_attach_spec["Name"] : + "attachment.dat"; + $a_file_spec["type"] = isset($a_attach_spec["MIME"]) ? + $a_attach_spec["MIME"] : + "text/plain"; + $a_file_spec["data"] = $a_attach_spec["Data"]; + if (!AttachFile($a_new,$s_att_boundary,$a_file_spec, + isset($a_attach_spec["CharSet"]) ? + $a_attach_spec["CharSet"] : + $s_charset) + ) { + return (false); + } + } + $a_new[] = "--$s_att_boundary--" . Settings::get('HEAD_CRLF'); // the end + $a_new[] = Settings::get('HEAD_CRLF'); // blank line + } elseif ($b_html) { + if (!HTMLMail($a_new,$a_headers,$s_body,$s_template, + $s_missing,($b_got_filter) ? $s_filter : "", + $s_body_boundary,$a_raw_fields,$b_no_plain, + $b_process_template) + ) { + return (false); + } + } else { + $a_headers['Content-Type'] = SafeHeader("text/plain; charset=$s_charset"); + // + // treat the body like one line, even though it isn't + // + $a_new[] = $s_body; + } + + $s_body = JoinLines(Settings::get('BODY_LF'),$a_new); + return (true); +} + +// +// to make a From line for the email +// +function MakeFromLine($s_email,$s_name) +{ + $s_style = GetMailOption("FromLineStyle"); + $s_line = ""; + if (!isset($s_style)) { + $s_style = ""; + } + // + // the following From line styles are in accordance with RFC 822 + // + switch ($s_style) { + default: + case "": + case "default": + case "AddrSpecName": + // + // this is the original From line style that FormMail produced + // e.g. + // jack@nowhere.com (Jack Smith) + // this is an addr-spec with a trailing comment with the name + // + if (!empty($s_email)) { + $s_line .= SafeHeaderEmail($s_email) . " "; + } + if (!empty($s_name)) { + $s_line .= "(" . SafeHeaderComment(EncodeHeaderText($s_name)) . ")"; + } + break; + case "NameAddrSpec": + // + // email address as an addr-spec preceded by a comment with the name + // e.g. + // (Jack Smith) jack@nowhere.com + // + if (!empty($s_name)) { + $s_line .= "(" . SafeHeaderComment(EncodeHeaderText($s_name)) . ") "; + } + if (!empty($s_email)) { + $s_line .= SafeHeaderEmail($s_email); + } + break; + case "RouteAddr": + // + // just the email address as a route-addr + // e.g. + // + // + if (!empty($s_email)) { + $s_line .= "<" . SafeHeaderEmail($s_email) . ">"; + } + break; + case "QuotedNameRouteAddr": + // + // email address as a route-addr preceded + // by the name of the user as a quoted string + // e.g. + // "Jack Smith" + // + if (!empty($s_name)) { + $s_line .= '"' . SafeHeaderQString(EncodeHeaderText($s_name)) . '" '; + } + if (!empty($s_email)) { + $s_line .= "<" . SafeHeaderEmail($s_email) . ">"; + } + break; + case "NameRouteAddr": + // + // email address as a route-addr preceded + // by the name of the user as words + // e.g. + // Jack Smith + // + if (!empty($s_name)) { + $s_line .= SafeHeaderWords(EncodeHeaderText($s_name)) . ' '; + } + if (!empty($s_email)) { + $s_line .= "<" . SafeHeaderEmail($s_email) . ">"; + } + break; + } + return ($s_line); +} + +// +// Return two sets of plain text output: the filtered fields and the +// non-filtered fields. +// +function GetFilteredOutput($a_fld_order,$a_clean_fields,$s_filter,$a_filter_list) +{ + // + // find the non-filtered fields and make unfiltered text from them + // + $a_unfiltered_list = array(); + $n_flds = count($a_fld_order); + for ($ii = 0 ; $ii < $n_flds ; $ii++) { + if (!in_array($a_fld_order[$ii],$a_filter_list)) { + $a_unfiltered_list[] = $a_fld_order[$ii]; + } + } + $s_unfiltered_results = MakeFieldOutput($a_unfiltered_list,$a_clean_fields); + // + // filter the specified fields only + // + $s_filtered_results = MakeFieldOutput($a_filter_list,$a_clean_fields); + $s_filtered_results = Filter($s_filter,$s_filtered_results); + return (array($s_unfiltered_results,$s_filtered_results)); +} + +// +// Make a plain text email body +// +function MakePlainEmail($a_fld_order,$a_clean_fields, + $s_to,$s_cc,$s_bcc,$a_raw_fields,$s_filter,$a_filter_list) +{ + global $SPECIAL_VALUES; + + $s_unfiltered_results = $s_filtered_results = ""; + $b_got_filter = (isset($s_filter) && !empty($s_filter)); + if ($b_got_filter) { + if (isset($a_filter_list) && count($a_filter_list) > 0) { + $b_limited_filter = true; + } else { + $b_limited_filter = false; + } + } + $b_used_template = false; + if (IsMailOptionSet("PlainTemplate")) { + $s_template = GetMailOption("PlainTemplate"); + if (ProcessTemplate($s_template,$a_lines,$a_raw_fields,GetMailOption('TemplateMissing'), + 'SubstituteValuePlain') + ) { + $b_used_template = true; + $s_unfiltered_results = implode(Settings::get('BODY_LF'),$a_lines); + if ($b_got_filter) { + // + // with a limited filter, the template goes unfiltered + // and the named fields get filtered + // + if ($b_limited_filter) { + list ($s_discard,$s_filtered_results) = GetFilteredOutput($a_fld_order, + $a_clean_fields, + $s_filter,$a_filter_list); + } else { + $s_filtered_results = Filter($s_filter,$s_unfiltered_results); + $s_unfiltered_results = ""; + } + } + } + } + if (!$b_used_template) { + $res_hdr = ""; + + if (IsMailOptionSet("DupHeader")) { + // + // write some standard mail headers + // + $res_hdr = "To: $s_to" . Settings::get('BODY_LF'); + if (!empty($s_cc)) { + $res_hdr .= "Cc: $s_cc" . Settings::get('BODY_LF'); + } + if (!empty($SPECIAL_VALUES["email"])) { + $res_hdr .= "From: " . MakeFromLine($SPECIAL_VALUES["email"], + $SPECIAL_VALUES["realname"]) . Settings::get('BODY_LF'); + } + $res_hdr .= Settings::get('BODY_LF'); + if (IsMailOptionSet("StartLine")) { + $res_hdr .= "--START--" . Settings::get('BODY_LF'); + } // signals the beginning of the text to filter + } + + // + // put the realname and the email address at the top of the results + // (if not excluded) + // + if (!IsMailExcluded("realname")) { + array_unshift($a_fld_order,"realname"); + $a_clean_fields["realname"] = $SPECIAL_VALUES["realname"]; + } + if (!IsMailExcluded("email")) { + array_unshift($a_fld_order,"email"); + $a_clean_fields["email"] = $SPECIAL_VALUES["email"]; + } + if ($b_got_filter) { + if ($b_limited_filter) { + list($s_unfiltered_results,$s_filtered_results) = + GetFilteredOutput($a_fld_order,$a_clean_fields, + $s_filter,$a_filter_list); + } else { + // + // make text output and filter it (filter all fields) + // + $s_filtered_results = MakeFieldOutput($a_fld_order,$a_clean_fields); + $s_filtered_results = Filter($s_filter,$s_filtered_results); + } + } else { + //SendAlert("There are ".count($a_fld_order)." fields in the order array"); + //SendAlert("Here is the clean fields array:\r\n".var_export($a_clean_fields,true)); + $s_unfiltered_results = MakeFieldOutput($a_fld_order,$a_clean_fields); + } + $s_unfiltered_results = $res_hdr . $s_unfiltered_results; + } + $s_results = $s_unfiltered_results; + if ($b_got_filter && !empty($s_filtered_results)) { + if (!empty($s_results)) { + $s_results .= Settings::get('BODY_LF'); + } + $s_results .= $s_filtered_results; + } + // + // append the environment variables report + // + if (isset($SPECIAL_VALUES["env_report"]) && !empty($SPECIAL_VALUES["env_report"])) { + $s_results .= Settings::get('BODY_LF') . "==================================" . Settings::get('BODY_LF'); + $s_results .= Settings::get('BODY_LF') . GetEnvVars(TrimArray(explode(",",$SPECIAL_VALUES["env_report"])), + Settings::get('BODY_LF')); + } + return (array($s_results,$s_unfiltered_results,$s_filtered_results)); +} + +// +// Return the list of fields to be filtered, FALSE if no list provided. +// +function GetFilterList($b_file_fields) +{ + global $SPECIAL_VALUES; + + // + // no filter means no list of fields + // + if (!empty($SPECIAL_VALUES["filter"])) { + if ($b_file_fields) { + if (isset($SPECIAL_VALUES["filter_files"]) && !empty($SPECIAL_VALUES["filter_files"])) { + return (TrimArray(explode(",",$SPECIAL_VALUES["filter_files"]))); + } + } else { + if (isset($SPECIAL_VALUES["filter_fields"]) && !empty($SPECIAL_VALUES["filter_fields"])) { + return (TrimArray(explode(",",$SPECIAL_VALUES["filter_fields"]))); + } + } + } + return (false); +} + +/* + * Function: GetFilterSpec + * Parameters: $s_filter returns the filter name + * $m_filter_list returns the list of fields to filter (an array) + * or is set to false if there is no filter list + * $b_file_fields if true, return file fields, otherwise return non-file fields + * Returns: bool true if filtering a list of fields of the specified type + * Description: + * Checks whether the form has specified to filter a list of + * fields of the specified type (file fields or non-file fields). + */ +function GetFilterSpec(&$s_filter,&$m_filter_list,$b_file_fields = false) +{ + global $SPECIAL_VALUES; + + if (isset($SPECIAL_VALUES["filter"]) && !empty($SPECIAL_VALUES["filter"])) { + $s_filter = $SPECIAL_VALUES["filter"]; + $m_filter_list = GetFilterList($b_file_fields); + return (true); + } + return (false); +} + +// +// send the given results to the given email addresses +// +function SendResults($a_fld_order,$a_clean_fields,$s_to,$s_cc,$s_bcc,$a_raw_fields) +{ + global $SPECIAL_VALUES,$aFileVars,$ValidEmails; + + // + // check for a filter and how to use it + // + $b_filter_attach = false; + $a_attach_spec = array(); + $s_filter = ""; + $a_filter_list = array(); + if ($b_got_filter = GetFilterSpec($s_filter,$a_filter_list)) { + if ($a_filter_list === false) { + // + // not a limited filter, so filter all fields + // + $b_limited_filter = false; + $a_filter_list = array(); + } else { + $b_limited_filter = true; + } + FMDebug("SendResults: got filter '$s_filter', limited=$b_limited_filter"); + $s_filter_attach_name = GetFilterOption("Attach"); + if (isset($s_filter_attach_name)) { + if (!is_string($s_filter_attach_name) || empty($s_filter_attach_name)) { + SendAlert(GetMessage(MSG_ATTACH_NAME)); + } else { + $b_filter_attach = true; + $a_attach_spec = array("Name" => $s_filter_attach_name); + if (($s_mime = GetFilterAttrib($s_filter,"MIME")) !== false) { + $a_attach_spec["MIME"] = $s_mime; + } + // + // Regarding the character set... + // A filter will not generally change the character set + // of the message, however, if it does, then we + // provide that information to the MIME encoder. + // Remember: this character set specification refers + // to the data *after* the effect of the filter + // has been reversed (e.g. an encrypted message + // in UTF-8 is in UTF-8 when it is decrypted). + // + if (($s_cset = GetFilterAttrib($s_filter,"CharSet")) !== false) { + $a_attach_spec["CharSet"] = $s_cset; + } + } + } + } + + // + // check the need for MIME formatted mail + // + $b_mime_mail = (IsMailOptionSet("HTMLTemplate") || count($aFileVars) > 0 || + $b_filter_attach); + + // + // create the email header lines - CC, BCC, From, and Reply-To + // + $a_headers = array(); + if (!empty($s_cc)) { + $a_headers['Cc'] = SafeHeader($s_cc); + } + if (!empty($SPECIAL_VALUES["replyto"])) { + // + // expand replyto list + // + CheckEmailAddress($SPECIAL_VALUES["replyto"],$s_list,$s_invalid,false); + if (!empty($s_list)) { + $a_headers['Reply-To'] = SafeHeader($s_list); + } + } + if (!empty($s_bcc)) { + $a_headers['Bcc'] = SafeHeader($s_bcc); + } + // + // create the From address + // + // Some servers won't let you set the email address to the + // submitter of the form. Therefore, use FromAddr if it's been + // specified to set the sender and the "From" address. + // + $s_sender = GetMailOption("FromAddr"); + if (!isset($s_sender)) { + $s_sender = ""; + if (!empty($SPECIAL_VALUES["email"])) { + $a_headers['From'] = MakeFromLine($SPECIAL_VALUES["email"], + $SPECIAL_VALUES["realname"]); + } + } elseif ($s_sender !== "") { + $s_sender = UnMangle($s_sender); + if ($ValidEmails->CheckAddress($s_sender)) { + $s_sender = $a_headers['From'] = SafeHeader($s_sender); + } else { + SendAlert(GetMessage(MSG_INVALID_SENDER,array("LOC" => "FromAddr in mail_options","EMAIL" => $s_sender))); + $s_sender = ""; + } + } + + /* + * Override sender if $FIXED_SENDER is set. + */ + if (Settings::get('FIXED_SENDER') !== "") { + $s_sender = Settings::get('FIXED_SENDER'); + } + + // + // special case: if there is only one non-special string value, then + // format it as an email (unless an option says not to) + // + $a_keys = array_keys($a_raw_fields); + if (count($a_keys) == 1 && is_string($a_raw_fields[$a_keys[0]]) && + !IsMailOptionSet("AlwaysList") && !IsMailOptionSet("DupHeader") + ) { + if (IsMailExcluded($a_keys[0])) { + SendAlert("Exclusion of single field '" . $a_keys[0] . "' ignored"); + } + $s_value = $a_raw_fields[$a_keys[0]]; + // + // replace carriage return/linefeeds with
    + // + $s_value = str_replace("\r\n",'
    ',$s_value); + // + // replace lone linefeeds with
    + // + $s_value = str_replace("\n",'
    ',$s_value); + // + // remove lone carriage returns + // + $s_value = str_replace("\r","",$s_value); + // + // replace all control chars with
    + // + $s_value = preg_replace('/[[:cntrl:]]+/','
    ',$s_value); + // + // strip HTML (note that all the
    above will now be + // replaced with BODY_LF) + // + $s_value = StripHTML($s_value,Settings::get('BODY_LF')); + + if ($b_mime_mail) { + if ($b_got_filter) { + // + // filter the whole value (ignore filter_fields for this + // special case) if a filter has been specified + // + $s_results = Filter($s_filter,$s_value); + if ($b_filter_attach) { + $a_attach_spec["Data"] = $s_results; + // + // KeepInLine keeps the filtered version inline as well + // as an attachment + // + if (!IsFilterOptionSet("KeepInLine")) { + $s_results = ""; + } + $s_filter = ""; // no more filtering + } + } else { + $s_results = $s_value; + } + + // + // send this single value off to get formatted in a MIME + // email + // + if (!MakeMimeMail($s_results,$a_headers,$a_raw_fields, + GetMailOption('HTMLTemplate'), + GetMailOption('TemplateMissing'), + IsMailOptionSet("NoPlain"), + $s_filter,$aFileVars,$a_attach_spec) + ) { + return (false); + } + } elseif ($b_got_filter) + // + // filter the whole value (ignore filter_fields for this special case) + // if a filter has been specified + // + { + $s_results = Filter($s_filter,$s_value); + } else { + $s_results = $s_value; + if (IsMailOptionSet("CharSet")) + // + // sending plain text email, and the CharSet has been + // specified; include a header + // + { + $a_headers['Content-Type'] = "text/plain; charset=" . SafeHeader(GetMailOption("CharSet")); + } + } + } else { + if ($b_mime_mail) { + // + // get the plain text version of the email then send it + // to get MIME formatted + // + list($s_results,$s_unfiltered_results,$s_filtered_results) = + MakePlainEmail($a_fld_order,$a_clean_fields, + $s_to,$s_cc,$s_bcc,$a_raw_fields,$s_filter, + $a_filter_list); + if ($b_filter_attach) { + // + // attached the filtered results + // + $a_attach_spec["Data"] = $s_filtered_results; + // + // KeepInLine keeps the filtered version inline as well + // as an attachment + // + if (!IsFilterOptionSet("KeepInLine")) + // + // put the unfiltered results in the body of the message + // + { + $s_results = $s_unfiltered_results; + } + $s_filter = ""; // no more filtering + } + if (!MakeMimeMail($s_results,$a_headers,$a_raw_fields, + GetMailOption('HTMLTemplate'), + GetMailOption('TemplateMissing'), + IsMailOptionSet("NoPlain"), + $s_filter,$aFileVars,$a_attach_spec) + ) { + return (false); + } + } else { + list($s_results,$s_unfiltered_results,$s_filtered_results) = + MakePlainEmail($a_fld_order,$a_clean_fields, + $s_to,$s_cc,$s_bcc,$a_raw_fields,$s_filter, + $a_filter_list); + if (!$b_got_filter && IsMailOptionSet("CharSet")) + // + // sending plain text email, and the CharSet has been + // specified; include a header + // + { + $a_headers['Content-Type'] = "text/plain; charset=" . SafeHeader(GetMailOption("CharSet")); + } + } + } + + // + // now save uploaded files to the repository + // + if (Settings::get('FILEUPLOADS') && Settings::get('FILE_REPOSITORY') !== "") { + if (!SaveAllFilesToRepository()) { + return (false); + } + } + + // + // send the mail - assumes the email addresses have already been checked + // + return (SendCheckedMail($s_to,$SPECIAL_VALUES["subject"],$s_results, + $s_sender,$a_headers)); +} + +// +// append an entry to a log file +// +function WriteLog($log_file) +{ + global $SPECIAL_VALUES,$php_errormsg; + + @ $log_fp = fopen($log_file,"a"); + if ($log_fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $log_file, + "TYPE" => "log", + "ERROR" => CheckString($php_errormsg) + ))); + return; + } + $date = gmdate("H:i:s d-M-y T"); + $entry = $date . ":" . $SPECIAL_VALUES["email"] . "," . + $SPECIAL_VALUES["realname"] . "," . $SPECIAL_VALUES["subject"] . "\n"; + fwrite($log_fp,$entry); + fclose($log_fp); +} + +// +// write the data to a comma-separated-values file +// +function WriteCSVFile($s_csv_file,$a_vars) +{ + global $SPECIAL_VALUES; + + // + // create an array of column values in the order specified + // in $SPECIAL_VALUES["csvcolumns"] + // + $a_column_list = $SPECIAL_VALUES["csvcolumns"]; + if (!isset($a_column_list) || empty($a_column_list) || !is_string($a_column_list)) { + SendAlert(GetMessage(MSG_CSVCOLUMNS,array("VALUE" => $a_column_list))); + return; + } + if (!isset($s_csv_file) || empty($s_csv_file) || !is_string($s_csv_file)) { + SendAlert(GetMessage(MSG_CSVFILE,array("VALUE" => $s_csv_file))); + return; + } + + @ $fp = fopen($s_csv_file,"a" . Settings::get('CSVOPEN')); + if ($fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $s_csv_file, + "TYPE" => "CSV", + "ERROR" => CheckString($php_errormsg) + ))); + return; + } + + // + // convert the column list to an array, trim the names too + // + $a_column_list = TrimArray(explode(",",$a_column_list)); + $n_columns = count($a_column_list); + + // + // if the file is currently empty, put the column names in the first line + // + $b_heading = false; + if (filesize($s_csv_file) == 0) { + $b_heading = true; + } + + $csv_format = new CSVFormat(); + + // + // now configure the CSVFormat object + // according to FormMail's configuration settings + // + $csv_format->SetQuote(Settings::get('CSVQUOTE')); + $csv_format->SetEscPolicy("conv"); + $csv_format->SetSep(Settings::get('CSVSEP')); + $csv_format->SetIntSep(Settings::get('CSVINTSEP')); + if (Settings::get('LIMITED_IMPORT')) { + $csv_format->SetCleanFunc(function ($m_value) { + return CleanValue($m_value); + }); + } + + $s_csv = $csv_format->MakeCSVRecord($a_column_list,$a_vars); + + if ($b_heading) { + fwrite($fp,$csv_format->MakeHeading($a_column_list) . Settings::get('CSVLINE')); + } + + fwrite($fp,$s_csv . Settings::get('CSVLINE')); + fclose($fp); + // CreatePage($debug); + // FormMailExit(); +} + +function CheckConfig() +{ + $a_mesgs = array(); + if (in_array("TARGET_EMAIL",Settings::get('CONFIG_CHECK'))) { + // + // $TARGET_EMAIL values should begin with ^ and end with $ + // + $a_target_email = Settings::get('TARGET_EMAIL'); + for ($ii = 0 ; $ii < count($a_target_email) ; $ii++) { + $s_pattern = $a_target_email[$ii]; + if (substr($s_pattern,0,1) != '^') { + $a_mesgs[] = GetMessage(MSG_TARG_EMAIL_PAT_START, + array("PAT" => $s_pattern)); + } + if (substr($s_pattern,-1) != '$') { + $a_mesgs[] = GetMessage(MSG_TARG_EMAIL_PAT_END, + array("PAT" => $s_pattern)); + } + } + } + if (Settings::get('SET_SENDER_FROM_EMAIL')) { + $a_mesgs[] = GetMessage(MSG_SET_SENDER_FROM_EMAIL); + } + if (count($a_mesgs) > 0) { + SendAlert(GetMessage(MSG_CONFIG_WARN, + array("MESGS" => implode("\n",$a_mesgs))),false,true); + } +} + +// +// append an entry to the Auto Responder log file +// +function WriteARLog($s_to,$s_subj,$s_info) +{ + global $aServerVars,$php_errormsg; + + if (Settings::isEmpty('LOGDIR') || Settings::isEmpty('AUTORESPONDLOG')) { + return; + } + + $log_file = Settings::get('LOGDIR') . "/" . Settings::get('AUTORESPONDLOG'); + @ $log_fp = fopen($log_file,"a"); + if ($log_fp === false) { + SendAlert(GetMessage(MSG_FILE_OPEN_ERROR,array("NAME" => $log_file, + "TYPE" => "log", + "ERROR" => CheckString($php_errormsg) + ))); + return; + } + $a_entry = array(); + $a_entry[] = gmdate("H:i:s d-M-y T"); // date/time in GMT + $a_entry[] = $aServerVars['REMOTE_ADDR']; // remote IP address + $a_entry[] = $s_to; // target email address + $a_entry[] = $s_subj; // subject line + $a_entry[] = $s_info; // information + + $s_log_entry = implode(",",$a_entry) . "\n"; + fwrite($log_fp,$s_log_entry); + fclose($log_fp); +} + +/* + * The main logic starts here.... + */ + +// +// First, a special case; if formmail.php is called like this: +// http://.../formmail.php?testalert=1 +// it sends a test message to the default alert address with some +// information about your PHP version and the DOCUMENT_ROOT. +// +if (isset($aGetVars["testalert"])) { + if ($aGetVars["testalert"] == Settings::get('TEST_PASSWORD')) { + function ShowServerVar($s_name) + { + global $aServerVars; + + return (isset($aServerVars[$s_name]) ? $aServerVars[$s_name] : "-not set-"); + } + + $sAlert = GetMessage(MSG_ALERT, + array("LANG" => $sLangID, + "PHPVERS" => $ExecEnv->getPHPVersionString(), + "FM_VERS" => $FM_VERS, + "SERVER" => (IsServerWindows() ? "Windows" : "non-Windows"), + "DOCUMENT_ROOT" => ShowServerVar('DOCUMENT_ROOT'), + "SCRIPT_FILENAME" => ShowServerVar('SCRIPT_FILENAME'), + "PATH_TRANSLATED" => ShowServerVar('PATH_TRANSLATED'), + "REAL_DOCUMENT_ROOT" => CheckString($REAL_DOCUMENT_ROOT), + )); + + if (Settings::get('DEF_ALERT') == "") { + echo "

    " . GetMessage(MSG_NO_DEF_ALERT) . "

    "; + } elseif (SendAlert($sAlert,false,true)) { + echo "

    " . GetMessage(MSG_TEST_SENT) . "

    "; + } else { + echo "

    " . GetMessage(MSG_TEST_FAILED) . "

    "; + } + FormMailExit(); + } else { + echo "

    Wrong password for testalert!

    "; + FormMailExit(); + } +} + +if (isset($aGetVars["testlang"]) && $aGetVars["testlang"] == 1) { + + function ShowMessages() + { + global $aMessages,$sLangID,$aGetVars,$sHTMLCharSet; + + // + // force message numbers on unless "mnums=no" + // + if (isset($aGetVars["mnums"]) && $aGetVars["mnums"] == "no") { + Settings::set('bShowMesgNumbers',false); + } else { + Settings::set('bShowMesgNumbers',true); + } + LoadBuiltinLanguage(); + + $s_def_lang = $sLangID; + $a_def_mesgs = $aMessages; + + LoadLanguageFile(); + + $s_active_lang = $sLangID; + $a_active_mesgs = $aMessages; + + $a_list = get_defined_constants(); + + echo "\n"; + echo "\n"; + if (isset($sHTMLCharSet) && $sHTMLCharSet !== "") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($a_list as $s_name => $i_value) { + if (substr($s_name,0,4) == "MSG_") { + // + // some PHP constants begin with MSG_, so we try to skip them + // too + // + switch ($s_name) { + case "MSG_IPC_NOWAIT": + case "MSG_EAGAIN": + case "MSG_ENOMSG": + case "MSG_NOERROR": + case "MSG_EXCEPT": + case "MSG_OOB": + case "MSG_PEEK": + case "MSG_DONTROUTE": + case "MSG_EOR": + continue 2; + } + if ($i_value >= 256) { + continue; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + echo "
    \n"; + echo "Message Number"; + echo "\n"; + echo "$s_def_lang"; + echo "\n"; + echo "$s_active_lang"; + echo "
    \n"; + echo "$s_name ($i_value)"; + echo "\n"; + $aMessages = $a_def_mesgs; + $s_def_msg = GetMessage((int)$i_value,array(),true,true); + echo nl2br(htmlentities($s_def_msg)); // English - don't need + // FixedHTMLEntities + echo "\n"; + $aMessages = $a_active_mesgs; + $s_act_msg = GetMessage((int)$i_value,array(),true,true); + if ($s_def_msg == $s_act_msg) { + echo "identical\n"; + } else { + echo nl2br(FixedHTMLEntities($s_act_msg)); + } + echo "
    \n"; + + echo "\n"; + echo "\n"; + } + + ShowMessages(); + FormMailExit(); +} + +// +// For saved files, add in the "new_name" values to the given +// array. +// +function GetSavedFileNames($a_values) +{ + if (IsSetSession("FormSavedFiles")) { + $a_saved_files = GetSession("FormSavedFiles"); + foreach ($a_saved_files as $s_fld => $a_upload) { + if (isset($a_upload["name"])) { + $a_values[$s_fld] = $a_upload["name"]; + } + if (isset($a_upload["new_name"])) { + $a_values["name_of_$s_fld"] = $a_upload["new_name"]; + } + } + } + return ($a_values); +} + +// +// Scan the Multi form sequence values and build up the values that +// were submitted to the given form index. +// +function GetMultiValues($a_form_list,$i_form_index,$a_order = array(), + $a_clean = array(), + $a_raw_data = array(), + $a_all_data = array(), + $a_file_data = array()) +{ + $a_ret_clean = $a_ret_raw = $a_ret_all = $a_ret_files = array(); + for ($ii = 0 ; $ii < $i_form_index ; $ii++) { + // + // only add a field to the order if it's not already there + // + $a_form_order = $a_form_list[$ii]["ORDER"]; + $n_order = count($a_form_order); + for ($jj = 0 ; $jj < $n_order ; $jj++) { + if (array_search($a_form_order[$jj],$a_order) === false) { + $a_order[] = $a_form_order[$jj]; + } + } + $a_ret_clean = array_merge($a_ret_clean,$a_form_list[$ii]["CLEAN"]); + $a_ret_raw = array_merge($a_ret_raw,$a_form_list[$ii]["RAWDATA"]); + $a_ret_all = array_merge($a_ret_all,$a_form_list[$ii]["ALLDATA"]); + $a_ret_files = array_merge($a_ret_files,$a_form_list[$ii]["FILES"]); + } + // + // later values must take precedence to earlier values, + // so merge in the passed-in data last + // + $a_ret_clean = array_merge($a_ret_clean,$a_clean); + $a_ret_raw = array_merge($a_ret_raw,$a_raw_data); + $a_ret_all = array_merge($a_ret_all,$a_all_data); + $a_ret_files = array_merge($a_ret_files,$a_file_data); + return (array($a_order,$a_ret_clean,$a_ret_raw,$a_ret_all,$a_ret_files)); +} + +$bMultiForm = false; + +// +// Multi-page form sequencing is complicated.... +// Requirements: +// 1. The first page in a multi-page form sequence must provide: +// - multi_start field set to 1 +// - this_form field (it's own URL) +// - next_form field (multi-page form template name) +// 2. Subsequent pages must provide either: +// next_form (the next template name in the sequence) +// OR +// good_url or good_template or neither; this terminates +// the multi-page processing and provides the final URL. +// Logic: +// 1. We create session variables to contain information about +// the sequence. +// 2. On the first submission from the starting form, we record +// its "this_form" URL and the data submitted. +// We also create a URL (to FormMail) that will allow return +// to the *next* form in the sequence. +// 3. On submission from other forms in the sequence, we record +// the data that was submitted so we can return to that +// form with the user's data re-filled into the form. +// We also create a URL (to FormMail) that will allow return +// to the *next* form in the sequence. +// 4. A return URL contains "return=index" where index is the +// form sequence index number. This is a URL to FormMail. +// FormMail gets the template name or URL (URL only for the +// starting form) and outputs the requested HTML form. It also +// truncates the session data for forms after the returned-to +// one. +// + +// +// Return to a previous form in a sequence. +// +function MultiFormReturn($i_return_to) +{ + global $iFormIndex; + global $SessionAccessor; + + if (!IsSetSession("FormList") || + !IsSetSession("FormIndex") || + $i_return_to < 0 || + $i_return_to > GetSession("FormIndex") + ) { + Error("cannot_return",GetMessage(MSG_CANNOT_RETURN, + array("TO" => $i_return_to, + "TOPINDEX" => ( + IsSetSession("FormIndex") ? + GetSession("FormIndex") : + "") + )), + false,false); + } + $a_list = GetSession("FormList"); + assert($i_return_to < count($a_list)); + $a_form_def = $a_list[$i_return_to]; + SetSession("FormList",$a_list = array_slice($a_list,0,$i_return_to + 1)); + SetSession("FormIndex",$iFormIndex = $i_return_to); + if (isset($a_form_def["FORM"])) { + // + // get the values that were originally submitted to this form + // + list(,,$a_values,,) = GetMultiValues($a_list,$i_return_to); + // + // get the session values + // + $SessionAccessor->CopyIn($a_values,true); + $a_lines = array(); + // + // process the page as a template + // + if (ProcessMultiFormTemplate($a_form_def["FORM"],$a_values,$a_lines)) { + $n_lines = count($a_lines); + $s_buf = ""; + for ($ii = 0 ; $ii < $n_lines ; $ii++) { + $s_buf .= $a_lines[$ii] . "\n"; + unset($a_lines[$ii]); // free memory (hopefully) + } + unset($a_lines); // free memory (hopefully) + // + // put in the values that the user previously submitted + // to this form + // + echo SetPreviousValues($s_buf,$a_form_def["RAWDATA"]); + } else { + Error("multi_form_failed",GetMessage(MSG_MULTIFORM_FAILED, + array("NAME" => $a_form_def["FORM"])),false,false); + } + } else + // + // we probably should include + // $SessionAccessor->CopyIn(...,true); + // at some stage in the future to get the session values....need to think about this + // and run some case studies. + // + { + ProcessReturnToForm($a_form_def["URL"],$a_form_def["RAWDATA"],array("multi_start")); + } + //echo "Returned to $i_return_to"; +} + +// +// Store any data just submitted and specified as "multi_keep". +// +function MultiKeep() +{ + global $SPECIAL_VALUES,$aRawDataValues; + + if (isset($SPECIAL_VALUES["multi_keep"]) && + !empty($SPECIAL_VALUES["multi_keep"]) + ) { + $a_list = TrimArray(explode(",",$SPECIAL_VALUES["multi_keep"])); + if (IsSetSession("FormKeep")) { + $a_keep = GetSession("FormKeep"); + } else { + $a_keep = array(); + } + // + // For each data field specified in "multi_keep" store its + // value in the FormKeep session variable. + // If a field is specified and does not exist in the + // recent submission, its value is discarded. + // + foreach ($a_list as $s_fld_name) { + if (!empty($s_fld_name)) { + if (isset($aRawDataValues[$s_fld_name])) { + $a_keep[$s_fld_name] = $aRawDataValues[$s_fld_name]; + } else { + unset($a_keep[$s_fld_name]); + } + } + } + SetSession("FormKeep",$a_keep); + } +} + +// +// Perform Logic for Multi-Page form sequences +// +function MultiFormLogic() +{ + global $bMultiForm,$SPECIAL_VALUES,$aServerVars,$aFileVars,$ExecEnv; + global $sFormMailScript,$bGotGoBack,$bGotNextForm,$iFormIndex; + global $aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues; + + if ($SPECIAL_VALUES["multi_start"] == 1) { + if (empty($SPECIAL_VALUES["this_form"])) { + ErrorWithIgnore("need_this_form",GetMessage(MSG_NEED_THIS_FORM),false,false); + } + + $bMultiForm = true; + // + // Start of multi-page form sequence + // + $a_list = array(); + $a_list[0] = array("URL" => $SPECIAL_VALUES["this_form"], + "ORDER" => $aFieldOrder, + "CLEAN" => $aCleanedValues, + "RAWDATA" => $aRawDataValues, + "ALLDATA" => $aAllRawValues, + "FILES" => $aFileVars + ); + $iFormIndex = 0; // zero is the first form, which was just submitted + SetSession("FormList",$a_list); + SetSession("FormIndex",$iFormIndex); + // + // this is a fresh session, so remove any remembered values + // + UnsetSession("FormSavedFiles"); + UnsetSession("FormKeep"); + } elseif (IsSetSession("FormList")) { + $bMultiForm = true; + } + + if ($bMultiForm) { + $sFormMailScript = $ExecEnv->GetScript(); + $iFormIndex = GetSession("FormIndex"); + } + + // + // If we're going forward in a multi-page form sequence, + // compute a URL to return to the form we're about to display. + // + if ($bMultiForm && !$bGotGoBack) { + // + // record the data that was just submitted by the previous form + // + $iFormIndex = GetSession("FormIndex"); + $a_list = GetSession("FormList"); + $a_list[$iFormIndex]["ORDER"] = $aFieldOrder; + $a_list[$iFormIndex]["CLEAN"] = $aCleanedValues; + $a_list[$iFormIndex]["RAWDATA"] = $aRawDataValues; + $a_list[$iFormIndex]["ALLDATA"] = $aAllRawValues; + if (count($aFileVars) > 0 && !Settings::get('FILEUPLOADS')) { + SendAlert(GetMessage(MSG_FILE_UPLOAD)); + } elseif (count($aFileVars) > 0 && !SaveAllUploadedFiles($aFileVars)) { + Error("upload_save_failed",GetMessage(MSG_MULTI_UPLOAD),false,false); + } + $a_list[$iFormIndex]["FILES"] = $aFileVars; + $iFormIndex++; + $s_url = GetReturnLink($sFormMailScript,$iFormIndex); + $a_list[$iFormIndex] = array("URL" => $s_url, + "FORM" => $SPECIAL_VALUES["next_form"], + "ORDER" => $aFieldOrder, + "CLEAN" => $aCleanedValues, + "RAWDATA" => $aRawDataValues, + "ALLDATA" => $aAllRawValues, + "FILES" => $aFileVars + ); + SetSession("FormList",$a_list); + SetSession("FormIndex",$iFormIndex); + MultiKeep(); + } +} + +// +// Check for the MIME Attack +// +function DetectMimeAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // if any of the recipient fields contain "MIME-Version" or + // "Content-Type" then this is the MIME attack + // Now also checks the subject field. + // + $a_rec_flds = array("recipients","cc","bcc","replyto","subject"); + foreach ($a_rec_flds as $s_fld) { + if (isset($a_fields[$s_fld])) { + // + // some of the fields can be arrays + // + if (is_array($a_fields[$s_fld])) { + $s_data = implode(",",$a_fields[$s_fld]); + } else { + $s_data = $a_fields[$s_fld]; + } + $s_data = strtolower($s_data); + if (($i_mime = strpos($s_data,"mime-version")) !== false || + ($i_cont = strpos($s_data,"content-type")) !== false + ) { + $s_attack = "MIME"; + $s_info = GetMessage( MSG_ATTACK_MIME_INFO, + array("FLD" => $s_fld, + "CONTENT" => ($i_mime !== + false) ? + "mime-version" : + "content-type" + ), + false); + return (true); + } + } + } + return (false); +} + +// +// Strip common language sequences from the data +// that might otherwise look like a junk attack. +// We replace them with a space so that the stripping +// cannot create more junk accidentally. +// +function AttackDetectionStripLang($s_data) +{ + + foreach (Settings::get('ATTACK_DETECTION_JUNK_LANG_STRIP') as $s_seq) { + $s_data = str_replace($s_seq," ",$s_data); + } + return ($s_data); +} + +// +// Find strings of $n_consec characters from the alphabet of $s_alpha +// in $s_data. Return the count of instances found. +// +function AttackDetectionFindJunk($s_data,$s_alpha,$n_consec,&$a_matches) +{ + $s_pat = "/[" . preg_quote($s_alpha,"/") . "]{" . "$n_consec,$n_consec" . "}/"; + if (($n_count = preg_match_all($s_pat,$s_data,$a_matches)) === false) { + $n_count = 0; + $a_matches = array(); + } else { + $a_matches = $a_matches[0]; + } + return ($n_count); +} + +// +// Test if a field name is a technical field. +// This means a field that is likely to contain junk values. +// Any special field and certain other field names are counted as technical. +// +function IsTechnicalField($s_fld) +{ + $b_is_technical = false; + if (IsSpecialField($s_fld) || IsSpecialMultiField($s_fld)) { + $b_is_technical = true; + } else { + // case doesn't matter + $s_lower_fld = strtolower($s_fld); + + $a_prefix_list = array('email'); + $a_prefix_found = array_filter($a_prefix_list,function ($s_prefix) use ($s_lower_fld) { + return substr($s_lower_fld,strlen($s_prefix)) === $s_prefix; + }); + $a_suffix_list = array('check','url','email'); + $a_suffix_found = array_filter($a_suffix_list,function ($s_suffix) use ($s_lower_fld) { + return substr($s_lower_fld,-strlen($s_suffix)) === $s_suffix; + }); + $a_fullname_list = array('tectiteformid'); + $b_fullname_match = array_search($s_lower_fld,$a_fullname_list) !== false; + $b_is_technical = $b_fullname_match || count($a_prefix_found) > 0 || count($a_suffix_found) > 0; + } + return $b_is_technical; +} + +// +// Check for the Junk Attack +// +function DetectJunkAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // If any field contains junk data, trigger detection. + // + $n_count = 0; + $a_matches = array(); + $a_user_matches = array(); + foreach ($a_fields as $s_fld => $m_value) { + if (IsTechnicalField($s_fld)) { + // + // Skip special fields because they don't contain + // normal user input. + // But, some special fields do contain normal user + // input, so we don't skip them. + // + $b_skip = true; + switch ($s_fld) { + case "realname": + case "subject": + $b_skip = false; + break; + } + if ($b_skip) { + continue; + } + } + // + // Ignore fields that are specified to contain + // technical information. + // + if (in_array($s_fld,Settings::get('ATTACK_DETECTION_JUNK_IGNORE_FIELDS'),true)) { + continue; + } + if (isset($m_value) && !FieldManager::IsEmpty($m_value)) { + if (!is_array($m_value)) { + $m_value = array($m_value); + } + foreach ($m_value as $s_data) { + $s_orig_data = $s_data = strtolower($s_data); + // + // Strip out sequences that might be common to + // the user's language. + // For example, in English, there are a lot of common + // words that can easily be protected from our + // tests. For example, "thousandths" has 5 consecutive consonants + // but is a reasonable word. + // Similarly, "queue" has 4 consecutive vowels. + // + $s_data = AttackDetectionStripLang($s_data); + // + // Look for strings of too many vowels or too many consonants. + // For safety, we must detect more than one instance, because there + // are a lot of normal words that may be caught by this test. + // The number of instances is controlled by configuration. + // + $n_match = AttackDetectionFindJunk($s_data,Settings::get('ATTACK_DETECTION_JUNK_CONSONANTS'), + Settings::get('ATTACK_DETECTION_JUNK_CONSEC_CONSONANTS'), + $a_match_cons); + if ($n_match > 0) { + $a_user_matches[] = $s_orig_data; + } + $n_count += $n_match; + $n_match = AttackDetectionFindJunk($s_data,Settings::get('ATTACK_DETECTION_JUNK_VOWELS'), + Settings::get('ATTACK_DETECTION_JUNK_CONSEC_VOWELS'), + $a_match_vow); + if ($n_match > 0) { + $a_user_matches[] = $s_orig_data; + } + $n_count += $n_match; + if ($n_count >= Settings::get('ATTACK_DETECTION_JUNK_TRIGGER')) { + $a_matches = array_merge($a_matches,$a_match_cons,$a_match_vow); + $s_user_info = GetMessage(MSG_USER_ATTACK_JUNK, + array("INPUT" => implode(", ",$a_user_matches)),false); + $s_attack = "JUNK"; + $s_info = GetMessage( MSG_ATTACK_JUNK_INFO, + array("FLD" => $s_fld, + "JUNK" => implode(" ", + $a_matches) + ), + false); + return (true); + } + } + } + } + return (false); +} + +// +// Check for the duplicate data attack +// +function DetectDupAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // if any of the configured fields contain duplicate data, + // then this lame attack has been detected + // + + $a_data_map = array(); + foreach (Settings::get('ATTACK_DETECTION_DUPS') as $s_fld) { + if (isset($a_fields[$s_fld]) && + is_scalar($a_fields[$s_fld]) && // can only work with string data + !empty($a_fields[$s_fld]) + ) { + $s_data = (string)$a_fields[$s_fld]; + if (isset($a_data_map[$s_data])) { + // + // duplicate found! + // + $s_attack = "Duplicate Fields"; + $s_info = GetMessage(MSG_ATTACK_DUP_INFO, + array("FLD1" => $a_data_map[$s_data], + "FLD2" => $s_fld + ),false); + $s_user_info = GetMessage(MSG_USER_ATTACK_DUP,array(),false); + return (true); + } + $a_data_map[$s_data] = $s_fld; + } + } + return (false); +} + +// +// Check for the email addresses in specials attack +// +function DetectSpecialsAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + // + // look for email addresses in whole fields + // + foreach (Settings::get('ATTACK_DETECTION_SPECIALS_ONLY_EMAIL') as $s_fld) { + if (isset($a_fields[$s_fld]) && + is_scalar($a_fields[$s_fld]) && // can only work with string data + !empty($a_fields[$s_fld]) + ) { + $s_data = $a_fields[$s_fld]; + if (preg_match("/^\b[-a-z0-9._%]+@[-.%_a-z0-9]+\.[a-z]{2,9}\b$/i", + $s_data) === 1 + ) { + // + // email address found in wrong field + // + $s_attack = "Special Fields Only"; + $s_info = GetMessage(MSG_ATTACK_SPEC_INFO, + array("FLD" => $s_fld),false); + return (true); + } + } + } + // + // look for email addresses in any part of fields + // + foreach (Settings::get('ATTACK_DETECTION_SPECIALS_ANY_EMAIL') as $s_fld) { + if (isset($a_fields[$s_fld]) && + is_scalar($a_fields[$s_fld]) && // can only work with string data + !empty($a_fields[$s_fld]) + ) { + $s_data = $a_fields[$s_fld]; + if (preg_match("/\b[-a-z0-9._%]+@[-.%_a-z0-9]+\.[a-z]{2,9}\b/i", + $s_data) > 0 + ) { + // + // email address found in wrong field + // + $s_attack = "Special Fields Any"; + $s_info = GetMessage(MSG_ATTACK_SPEC_INFO, + array("FLD" => $s_fld),false); + return (true); + } + } + } + return (false); +} + +// +// Check for "many URLs in a field" and "many fields with URLs" attacks +// +function DetectManyURLsAttack($a_fields,&$s_attack,&$s_info,&$s_user_info) +{ + + $a_fld_names = array(); + // + // actual URL link patterns + // 21-Jul-18: We've removed looking for alphanumerics here because it doesn't + // detect non-English chars. The UTF-8 options for preg_match did not help. + // + $s_srch = '(\bhttps{0,1}:\/\/|<\s*a\s+href=)'; + + // + // now add configurable patterns + // + if (!Settings::isEmpty('ATTACK_DETECTION_URL_PATTERNS') && + is_array(Settings::get('ATTACK_DETECTION_URL_PATTERNS')) + ) { + // + // escape / characters and build up a string + // of alternate patterns + // + foreach (Settings::get('ATTACK_DETECTION_URL_PATTERNS') as $s_pat) { + if ($s_pat == "") { + continue; + } + $s_srch .= "|" . str_replace('/','\/',$s_pat); + } + } + if (Settings::get('SITE_DOMAIN')) { + if (strpos(Settings::get('SITE_DOMAIN'),'://') !== false) { + $a_url_parts = parse_url(Settings::get('SITE_DOMAIN')); + $own_domain = $a_url_parts['host']; + } else { + $own_domain = Settings::get('SITE_DOMAIN'); + } + $own_domain = str_ireplace('www.','',$own_domain); + } else { + $own_domain = ''; + } + foreach ($a_fields as $s_fld => $s_data) { + if (IsSpecialField($s_fld) || IsSpecialMultiField($s_fld)) + // + // skip special fields because some are supposed to + // have URLs in them + // + { + continue; + } + if (isset($s_data) && + is_scalar($s_data) && // can only work with string data + !empty($s_data) + ) { + $n_match = preg_match_all("/$s_srch/msi",$s_data,$a_matches); + if (!is_int($n_match)) { + $n_match = 0; + } + // allow links to SITE_DOMAIN + if ($own_domain) { + $n_site_match = preg_match('/\b' . $own_domain . '\b/msi',$s_data); + if (is_int($n_site_match) && $n_site_match > 0) { + $n_match -= $n_site_match; + } + } + /* + * debugging code.... + if ($n_match > 0) + echo "Pattern is '".htmlentities($s_srch)."' with '". + htmlentities($s_data)."' field '$s_fld', matched=$n_match
    "; + */ + if (Settings::get('ATTACK_DETECTION_MANY_URLS') > 0) { + if ($n_match >= Settings::get('ATTACK_DETECTION_MANY_URLS')) { + $s_attack = "Many URLS in a field"; + $s_info = GetMessage(MSG_ATTACK_MANYURL_INFO, + array("FLD" => $s_fld,"NUM" => ($n_match)),false); + $s_user_info = GetMessage(MSG_USER_ATTACK_MANY_URLS,array(),false); + return (true); + } + } + if ($n_match > 0) { + $a_fld_names[] = $s_fld; + } + } + } + if (Settings::get('ATTACK_DETECTION_MANY_URL_FIELDS') > 0) { + if (count($a_fld_names) >= Settings::get('ATTACK_DETECTION_MANY_URL_FIELDS')) { + $s_attack = "Many fields with URLs"; + $s_info = GetMessage(MSG_ATTACK_MANYFIELDS_INFO, + array("FLDS" => implode(",",$a_fld_names), + "NUM" => (count($a_fld_names)) + ),false); + $s_user_info = GetMessage(MSG_USER_ATTACK_MANY_URL_FIELDS,array(),false); + return (true); + } + } + return (false); +} + +function IsAjax() +{ + global $SPECIAL_VALUES,$aFormVars,$aGetVars; + + // + // this may be called too early to have SPECIAL_VALUES loaded, + // so we check the submitted form vars too. + // + if (isset($SPECIAL_VALUES) && $SPECIAL_VALUES["fmmode"] == "ajax") { + return (true); + } + if (isset($aFormVars["fmmode"])) { + return ($aFormVars["fmmode"] == "ajax"); + } + if (isset($aGetVars["fmmode"])) { + return ($aGetVars["fmmode"] == "ajax"); + } + return (false); +} + +// +// Detect annoying attacks and prevent them from sending spurious +// alert messages. +// +function DetectAttacks($a_fields) +{ + + $s_info = $s_attack = ""; + $b_attacked = false; + $s_user_info = ""; + if (Settings::get('ATTACK_DETECTION_MIME')) { + if (DetectMimeAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (!$b_attacked && !Settings::isEmpty('ATTACK_DETECTION_DUPS')) { + if (DetectDupAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (!$b_attacked && Settings::get('ATTACK_DETECTION_SPECIALS')) { + if (DetectSpecialsAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (!$b_attacked && (Settings::get('ATTACK_DETECTION_MANY_URLS') || + Settings::get('ATTACK_DETECTION_MANY_URL_FIELDS')) + ) { + if (DetectManyURLsAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + if (Settings::get('ATTACK_DETECTION_JUNK')) { + if (DetectJunkAttack($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + + if (!$b_attacked && !Settings::isEmpty('ATTACK_DETECTION_REVERSE_CAPTCHA')) { + if (DetectRevCaptchaAttack(Settings::get('ATTACK_DETECTION_REVERSE_CAPTCHA'),$a_fields,$s_attack,$s_info, + $s_user_info) + ) { + $b_attacked = true; + } + } + if (function_exists('FMHookDetectAttacks')) { + if (FMHookDetectAttacks($a_fields,$s_attack,$s_info,$s_user_info)) { + $b_attacked = true; + } + } + + if ($b_attacked) { + if (function_exists('FMHookAttacked')) { + FMHookAttacked($s_attack); + } + if (Settings::get('ALERT_ON_ATTACK_DETECTION')) { + SendAlert(GetMessage(MSG_ATTACK_DETECTED, + array("ATTACK" => $s_attack, + "INFO" => $s_info, + )), + false); + } + if (!IsAjax() && Settings::get('ATTACK_DETECTION_URL') !== "") { + Redirect(Settings::get('ATTACK_DETECTION_URL'),GetMessage(MSG_FORM_ERROR)); + } else { + global $SERVER; + + CreatePage(GetMessage(MSG_ATTACK_PAGE,array("SERVER" => $SERVER,"USERINFO" => $s_user_info)), + GetMessage(MSG_FORM_ERROR)); + } + FormMailExit(); + } +} + +// +// Implement reverse captcha. At least two fields must be provided. +// At least one of the fields should have a non-empty value. +// +function DetectRevCaptchaAttack($a_revcap_spec,$a_form_data,&$s_attack,&$s_info,&$s_user_info) +{ + global $bReverseCaptchaCompleted; + + if (count($a_revcap_spec) < 2) { + SendAlert(GetMessage(MSG_REV_CAP)); + return (false); + } + // + // check the reverse captcha fields + // + $n_empty = $n_non_empty = 0; + $b_attacked = false; + $s_info = ""; + foreach ($a_revcap_spec as $s_fld_name => $s_value) { + if ($s_value === "") { + $n_empty++; + if (isset($a_form_data[$s_fld_name]) && + $a_form_data[$s_fld_name] !== "" + ) { + $b_attacked = true; + $s_info .= "\n" . GetMessage( MSG_ATTACK_REV_CAP_INFO, + array("FLD" => $s_fld_name, + "CONTENT" => $a_form_data[$s_fld_name] + ), + false); + } + } else { + $n_non_empty++; + if (!isset($a_form_data[$s_fld_name]) || + $a_form_data[$s_fld_name] !== $s_value + ) { + $b_attacked = true; + $s_info .= "\n" . GetMessage( MSG_ATTACK_REV_CAP_INFO, + array("FLD" => $s_fld_name, + "CONTENT" => + isset($a_form_data[$s_fld_name]) ? + $a_form_data[$s_fld_name] : + "" + ), + false); + } + } + } + // + // check that the rev captcha specification is correct: + // at least two fields, at least one empty + // and at least one non-empty + // + if ($n_empty + $n_non_empty < 2 || + $n_empty == 0 || $n_non_empty == 0 + ) { + SendAlert(GetMessage(MSG_REV_CAP)); + return (false); + } + if ($b_attacked) { + $s_attack = "Reverse Captcha"; + $s_user_info = GetMessage(MSG_USER_ATTACK_REV_CAP,array(),false); + } + $bReverseCaptchaCompleted = !$b_attacked; + FMDebug('RevCaptcha: ' . $s_info); + //FMDebug("RevCaptcha done: ".($bReverseCaptchaCompleted ? "success" : "failure")); + return ($b_attacked); +} + +// +// Check whether a form submission is allowed based on any Captcha provided +// +function CheckCaptchaSubmit() +{ + global $SPECIAL_VALUES,$reCaptchaProcessor; + + if ($SPECIAL_VALUES["imgverify"] !== "") { + // + // implement reCaptcha + // + if (isset($reCaptchaProcessor)) { + $s_error = ''; + if (!$reCaptchaProcessor->Check($SPECIAL_VALUES["imgverify"],$SPECIAL_VALUES,$s_error)) { + $s_error_mesg = GetMessage(MSG_RECAPTCHA_MATCH,array("ERR" => $s_error)); + UserError("recaptcha",$s_error_mesg,'',array('imgverify' => $s_error_mesg)); + } + } + // + // implement other CAPTCHA + // + else { + // + // VerifyImgString is from Tectite's simple verifyimg.php CAPTCHA + // turing_string is from Captcha Creator + // + if (!IsSetSession("VerifyImgString") && + !IsSetSession("turing_string") + ) { + ErrorWithIgnore("verify_failed",GetMessage(MSG_VERIFY_MISSING),false); + } + // + // the user's entry must match the value in the session; allow + // spaces in the user's input + // + if (IsSetSession("VerifyImgString")) { + if (strtoupper(str_replace(" ","",$SPECIAL_VALUES["imgverify"])) !== + strtoupper(GetSession("VerifyImgString")) + ) { + $s_error_mesg = GetMessage(MSG_VERIFY_MATCH); + UserError("img_verify",$s_error_mesg,'',array('imgverify' => $s_error_mesg)); + } + } else { + if (strtoupper(str_replace(" ","",$SPECIAL_VALUES["imgverify"])) !== + strtoupper(GetSession("turing_string")) + ) { + $s_error_mesg = GetMessage(MSG_VERIFY_MATCH); + UserError("img_verify",$s_error_mesg,'',array('imgverify' => $s_error_mesg)); + } + } + } + } +} + +/* + * Class: AutoResponder + * Description: + * Implements the auto responding feature of FormMail. + * The object must only be created after special fields have been + * processed. + */ + +class AutoResponder +{ + var $_bRequested; // true if requested by the form + var $_sTo; // to-address for auto response + var $_sSubject; // subject for auto response + + var $_iNone = 0; // must be zero - initializes iType and iCaptchaType + + var $_iCaptchaType; // type of CAPTCHA that's been successfully processed + var $_bCaptchaOK; // true if CAPTCHA processing is OK, otherwise false + + // + // values of _iCaptchaType + // + var $_iFull = 1; // full captcha + var $_iRev = 2; // reverse captcha + + var $_iType; // type of autoresponse (template or plain) + + // + // values of _iType + // + var $_iSendTemplate = 1; // send a template + var $_iSendPlain = 2; // send a plain file + + /* + * Method: AutoResponder ctor + * Parameters: void + * Returns: n/a + * Description: + * Constructs the object. + */ + function __construct() + { + global $SPECIAL_VALUES; + + $this->_bCaptchaOK = $this->_bRequested = false; + $this->_sTo = ""; + $this->_sSubject = ""; + $this->_iType = $this->_iNone; + $this->_iCaptchaType = $this->_iNone; + + // + // An autoreponse is sometimes optional in the sense the user + // can choose whether they want it. + // It can also be mandatory, and enforced by the form owner. + // Here are the rules: + // 1. If there is no return email address (email field), no autoresponse. + // In this case, if autoresponse has been requested by the form, send + // an alert message to the form owner, but otherwise ignore the problem + // (it's optional). + // 2. If no autoresponse has been requested by the form, skip. + // 3. If HTMLTemplate or PlainTemplate is set: + // 3a. If full CAPTCHA has been performed, send autoresponse. + // 3b If no full CAPTCHA has been performed, no autoresponse. + // 4. If HTMLTemplate and PlainTemplate are *not* set and either + // PlainFile or HTMLFile is set: + // 4a. If full CAPTCHA has been performed, send autoresponse. + // 4b. If Reverse CAPTCHA has been performed, send autoresponse. + // 4c. Otherwise, no autoresponse. + // 5. If full CAPTCHA is attempted but fails (e.g. wrong input), display + // error. + // + // The form owner can enforce autoresponse by making "email" required, + // and making "arverify" or "recaptcha_response_field" required (for templates) + // or by ensuring Reverse CAPTCHA is performed (for PlainFile or HTMLFile). + // + if (IsAROptionSet('HTMLTemplate') || + IsAROptionSet('PlainTemplate') + ) { + $this->_iType = $this->_iSendTemplate; + } + if (IsAROptionSet('PlainFile') || + IsAROptionSet('HTMLFile') + ) { + $this->_iType = $this->_iSendPlain; + } + if ($this->_iType) { + // + // the form has requested autoresponse.... + // we need an email address to send to + // + if (!isset($SPECIAL_VALUES["email"]) || empty($SPECIAL_VALUES["email"])) { + SendAlert(GetMessage(MSG_ARESP_EMAIL)); + } else { + $this->_bRequested = true; + $this->_sTo = $SPECIAL_VALUES["email"]; + if (IsAROptionSet('Subject')) { + $this->_sSubject = GetAROption('Subject'); + } else { + $this->_sSubject = GetMessage(MSG_ARESP_SUBJ,array(),false); + } + } + } + } + + /* + * Method: AutoResponder::IsRequested + * Parameters: void + * Returns: bool true if autoresponding has been requested + * Description: + * Determines if autoresponding has been requested by the HTML. + */ + function IsRequested() + { + return ($this->_bRequested); + } + + /* + * Method: AutoResponder::Process + * Parameters: $b_check_only if true, perform checks but do not send + * Returns: void + * Description: + * Processes the autorespond. + */ + function Process($b_check_only = false) + { + global $SPECIAL_VALUES; + + FMDebug("AutoResponder::Process: check=" . ($b_check_only ? "Y" : "N")); + if ($this->IsRequested()) { + FMDebug("AutoResponder::Process: requested"); + $b_done = false; + // + // You can create a function called SpecialAutoResponderProcess in a hook script. + // It gets passed the AutoResponder object and the $b_check_only flag. + // If the function returns true, then the standard process is not performed. + // Otherwise the standard process continues as-is. + // Your special function can call any of the public methods of this class including: + // StandarProcess + // Send + // + if (function_exists('SpecialAutoResponderProcess')) { + $b_done = SpecialAutoResponderProcess($this,$b_check_only); + } + if (!$b_done) { + $this->StandardProcess($b_check_only); + } + } + } + + function StandardProcess($b_check_only) + { + // + // verify CAPTCHA or that Reverse CAPTCHA has been completed + // (unless we've already done that) + // + $this->_CheckCaptcha(); + if (!$b_check_only && $this->_bCaptchaOK) { + FMDebug("AutoResponder::Process: proceeding, type=" . $this->_iType); + // + // for a template, full CAPTCHA must have been processed + // + if ($this->_iType == $this->_iSendTemplate) { + if ($this->_iCaptchaType == $this->_iFull) { + $this->Send(true); + } + } + // + // for a plain file, reverse CAPTCHA is sufficient, any CAPTCHA is OK + // + elseif ($this->_iType == $this->_iSendPlain) { + if ($this->_iCaptchaType) { + $this->Send(false); + } + } + } + } + + /* + * Method: AutoResponder::_CheckCaptcha + * Parameters: void + * Returns: void + * Description: + * Checks the type of CAPTCHA that has been processed. + * This method should only be called if autoresponse has been requested + * by the form (i.e. IsRequested returns true). + */ + function _CheckCaptcha() + { + global $SPECIAL_VALUES,$bReverseCaptchaCompleted; + global $reCaptchaProcessor; + + // + // only check for CAPTCHA once + // + if (!$this->_iCaptchaType) { + // + // check for full CAPTCHA attempt + // first, check for reCaptcha + // + if (isset($reCaptchaProcessor) && $SPECIAL_VALUES["arverify"] !== "") { + $this->_iCaptchaType = $this->_iFull; + $s_error = ''; + if ($reCaptchaProcessor->Check($SPECIAL_VALUES["arverify"],$SPECIAL_VALUES,$s_error)) { + $this->_bCaptchaOK = true; + } else { + $this->_bCaptchaOK = false; + // + // report the error + // + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_RECAPTCHA,array("ERR" => $s_error),false)); + UserError("recaptcha",GetMessage(MSG_RECAPTCHA_MATCH,array("ERR" => $s_error))); + } + } + // + // now check for our verifyimg or Captcha Creator + // + elseif ($SPECIAL_VALUES["arverify"] !== "") { + // + // allow spaces in the user's input, except for reCaptcha + // + $s_arverify = str_replace(" ","",$SPECIAL_VALUES["arverify"]); + $this->_iCaptchaType = $this->_iFull; + // + // full CAPTCHA has been attempted + // VerifyImgString is from Tectite's simple verifyimg.php CAPTCHA. + // turing_string is from Captcha Creator + // + if (IsSetSession("VerifyImgString") || IsSetSession("turing_string")) { + $b_match = false; + // + // the user's entry must match the value in the session + // + if (IsSetSession("VerifyImgString")) { + if (strtoupper($s_arverify) === strtoupper(GetSession("VerifyImgString"))) { + $b_match = true; + } + } else { + if (strtoupper($s_arverify) === strtoupper(GetSession("turing_string"))) { + $b_match = true; + } + } + if ($b_match) { + $this->_bCaptchaOK = true; + } else { + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_NO_MATCH,array(),false)); + UserError("ar_verify",GetMessage(MSG_ARESP_NO_MATCH)); + } + } else { + // + // ...and it has failed because there's no session data + // + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_NO_VERIMG,array(),false)); + ErrorWithIgnore("verify_failed",GetMessage(MSG_ARESP_NO_AUTH),true); + } + } elseif (Settings::get('ENABLE_ATTACK_DETECTION') && + !Settings::isEmpty('ATTACK_DETECTION_REVERSE_CAPTCHA') + ) { + // + // Reverse CAPTCHA has been configured + // + $this->_iCaptchaType = $this->_iRev; + $this->_bCaptchaOK = $bReverseCaptchaCompleted; + } + } + } + + /* + * Method: AutoResponder::_Send + * Parameters: $b_use_template if true, allow template, otherwise file + * Returns: void + * Description: + * Sends an autoreponse using a template. + */ + function Send($b_use_template) + { + global $SPECIAL_VALUES; + // + // declare some global vars for the hook system calls below + // + global $aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues,$aFileVars; + + FMDebug("Sending auto response: " . ($b_use_template ? "template" : "plain")); + + // + // Hook system: before sending auto response + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprearesp.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprearesp.inc"); + } + } + if (!$this->_SendEmail($this->_sTo,$this->_sSubject,$aRawDataValues,$b_use_template)) { + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_FAILED,array(),false)); + SendAlert(GetMessage(MSG_ARESP_FAILED)); + } else { + WriteARLog($this->_sTo,$this->_sSubject, + GetMessage(MSG_LOG_OK,array(),false)); + // + // Hook system: after sending auto response + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostaresp.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostaresp.inc"); + } + } + } + } + + /* + * Method: AutoResponder::_SendEmail + * Parameters: $s_to the email address to send to + * $s_subj the subject line + * $a_values field values to access + * $b_use_template if true, use a template, otherwise plain file + * Returns: bool true on success, otherwise false + * Description: + * Sends an autoresponse email to the user. + */ + function _SendEmail($s_to,$s_subj,$a_values,$b_use_template) + { + global $ValidEmails; + + $a_headers = array(); + $s_mail_text = ""; + $s_from_addr = GetAROption("FromAddr"); + + if (isset($s_from_addr)) { + $s_from_addr = UnMangle($s_from_addr); + if (!$ValidEmails->CheckAddress($s_from_addr)) { + SendAlert(GetMessage(MSG_INVALID_SENDER, + array("LOC" => "FromAddr in autorespond","EMAIL" => $s_from_addr))); + unset($s_from_addr); + } + } + if (!isset($s_from_addr)) { + $s_from_addr = ""; + if (!Settings::isEmpty('FROM_USER')) { + if (Settings::get('FROM_USER') != "NONE") { + $s_from_addr = Settings::get('FROM_USER'); + } + } else { + global $SERVER; + + $s_from_addr = "FormMail@" . $SERVER; + } + } + + if (!empty($s_from_addr)) { + $s_from_name = GetAROption('FromName'); + $a_headers['From'] = MakeFromLine($s_from_addr,$s_from_name); + } + if (Settings::get('FIXED_SENDER') !== "") { + $s_sender = Settings::get('FIXED_SENDER'); + } else { + $s_sender = $s_from_addr; + } + $s_type = ""; + if ($b_use_template) { + if (IsAROptionSet('PlainTemplate')) { + $s_type .= "PlainTemplate "; + $s_template = GetAROption("PlainTemplate"); + if (!ProcessTemplate($s_template,$a_lines,$a_values, + GetAROption('TemplateMissing'), + 'SubstituteValuePlain') + ) { + return (false); + } + FMDebug("AutoRespond: PlainTemplate " . count($a_lines) . " lines"); + $s_mail_text = implode(Settings::get('BODY_LF'),$a_lines); + } + if (IsAROptionSet("HTMLTemplate")) { + $s_type .= "HTMLTemplate "; + if (!MakeMimeMail($s_mail_text,$a_headers,$a_values, + GetAROption("HTMLTemplate"), + GetAROption('TemplateMissing')) + ) { + return (false); + } + FMDebug("AutoRespond: HTMLTemplate " . strlen($s_mail_text) . " bytes"); + } + } else { + + if (IsAROptionSet('PlainFile')) { + $s_type .= "PlainFile "; + // + // load the plain text file from the templates area + // + if (Settings::isEmpty('TEMPLATEDIR') && Settings::isEmpty('TEMPLATEURL')) { + SendAlert(GetMessage(MSG_TEMPLATES)); + return (false); + } + $s_file = GetAROption("PlainFile"); + if (($a_lines = LoadTemplate($s_file,Settings::get('TEMPLATEDIR'),Settings::get('TEMPLATEURL'), + true)) === false + ) { + return (false); + } + $s_mail_text = implode(Settings::get('BODY_LF'),$a_lines); + FMDebug("AutoRespond: PlainFile " . count($a_lines) . " lines"); + } + if (IsAROptionSet("HTMLFile")) { + $s_type .= "HTMLFile "; + if (!MakeMimeMail($s_mail_text,$a_headers,$a_values, + GetAROption("HTMLFile"),"", + false,"",array(),array(),false) + ) { + return (false); + } + FMDebug("AutoRespond: HTMLTemplate " . strlen($s_mail_text) . " bytes"); + } + } + if (strlen($s_mail_text) == 0) { + SendAlert(GetMessage(MSG_ARESP_EMPTY),array("TYPE" => $s_type)); + } + FMDebug("AutoRespond: message is " . strlen($s_mail_text) . " bytes"); + return (SendCheckedMail($s_to,$s_subj,$s_mail_text,$s_sender,$a_headers)); + } +} + +/* + * Class: SessionAccess + * Description: + * Implements access to the general PHP session. + * This provides a secure way of copy data to and from the + * user's PHP session. + */ + +class SessionAccess +{ + var $_aAccessList; + + /* + * Method: SessionAccess ctor + * Parameters: $a_access_list list of variables that can be accessed + * Returns: n/a + * Description: + * Constructs the object. + */ + function __construct($a_access_list) + { + $this->_aAccessList = $a_access_list; + } + + /* + * Method: SessionAccess::CopyIn + * Parameters: $a_vars reference to an array of values (keyed on name) + * $b_overwrite_empty if true, the session value will overwrite + * an empty array variable + * Returns: int number of values copied + * Description: + * Copies in the list of variables from the session to the given array. + */ + function CopyIn(&$a_vars,$b_overwrite_empty) + { + //$s_db = "Session CopyIn:\n"; + $n_copied = 0; + foreach ($this->_aAccessList as $s_var_name) { + if (IsSetSession($s_var_name)) { + if (!isset($a_vars[$s_var_name]) || + ($b_overwrite_empty && + FieldManager::IsEmpty($a_vars[$s_var_name])) + ) { + $a_vars[$s_var_name] = GetSession($s_var_name); + //$s_db .= "$s_var_name='".$a_vars[$s_var_name]."'\n"; + $n_copied++; + } + } + } + //SendAlert($s_db); + return ($n_copied); + } + + /* + * Method: SessionAccess::CopyOut + * Parameters: $a_vars reference to an array of values (keyed on name) + * $a_fields an array of fields to copy + * Returns: int number of values copied + * Description: + * Copies the variables from the given array into the session. + * The list of fields to copy is specified in _aAccessList. + * If $a_fields is provided, it contains a list of fields to copy, which + * limits the fields selected from _aAccessList, otherwise all fields + * listed in _aAccessList are copied. + */ + function CopyOut($a_vars,$a_fields = array()) + { + //$s_db = "Session CopyOut:\n"; + + $n_copied = 0; + foreach ($this->_aAccessList as $s_var_name) { + if (isset($a_vars[$s_var_name])) { + if (empty($a_fields) || in_array($s_var_name,$a_fields)) { + SetSession($s_var_name,$a_vars[$s_var_name]); + //$s_db .= "$s_var_name='".GetSession($s_var_name)."'\n"; + $n_copied++; + } + } + } + //SendAlert($s_db); + return ($n_copied); + } +} + +$SessionAccessor = new SessionAccess(Settings::get('SESSION_ACCESS')); + +$bAdvTemplates = false; +if (Settings::get('ADVANCED_TEMPLATES') && ( + !Settings::isEmpty('TEMPLATEDIR') + || !Settings::isEmpty('TEMPLATEURL') + || !Settings::isEmpty('MULTIFORMDIR') + || !Settings::isEmpty('MULTIFORMURL') + )) { + $bAdvTemplates = true; +} + +// +// Hook system: after configuring Advanced Templates +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostadvtemplates.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostadvtemplates.inc"); + } +} + +// +// Hook system: before return check and processing +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprereturnform.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprereturnform.inc"); + } +} + +if (isset($aGetVars["return"]) && is_numeric($aGetVars["return"])) { + // + // if advanced templates are in use, we will need them for + // performing a multi-page form return + // + if ($bAdvTemplates) { + $FMCTEMPLATE_PROC = true; + if (!include_once("$MODULEDIR/$FMCOMPUTE")) { + Error( "load_fmcompute", + GetMessage(MSG_LOAD_FMCOMPUTE, + array("FILE" => "$MODULEDIR/$FMCOMPUTE", + "ERROR" => $php_errormsg + )), + false, + false); + } + } + MultiFormReturn($aGetVars["return"]); + // + // Hook system: after multi-page return to form output + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostreturnform.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostreturnform.inc"); + } + } + FormMailExit(); +} + +// +// Hook system: after initialization +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostinit.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostinit.inc"); + } +} + +$ExecEnv->checkUploadSize(); +$ExecEnv->checkFileUploadSize($aFileVars); +// +// check configuration values for potential security problems +// +CheckConfig(); + +// +// otherwise, do the real processing of FormMail +// +$aStrippedFormVars = $aAllRawValues = StripGPCArray($aFormVars); + +if (Settings::get('ENABLE_ATTACK_DETECTION')) { + DetectAttacks($aAllRawValues); +} + +// +// Copy in configured session variables, overwriting any +// fields that are empty. +// +$SessionAccessor->CopyIn($aAllRawValues,true); +$SessionAccessor->CopyIn($aStrippedFormVars,true); + +// +// process the options +// +ProcessMailOptions($aAllRawValues); +ProcessCRMOptions($aAllRawValues); +ProcessAROptions($aAllRawValues); +ProcessFilterOptions($aAllRawValues); + +// +// create any derived fields +// NOTE: it's important that derivation occurs before cleaned values +// are created. If derivation occurred after cleaning or it created +// fields that were assumed to be clean, then an attack could create +// forged email headers using derive_fields. The code is safe with +// the logic sequence below. +// +$aAllRawValues = CreateDerived($aAllRawValues); + +list($aFieldOrder,$aCleanedValues,$aRawDataValues) = ParseInput($aAllRawValues); + +FilterFiles($aFileVars); + +// +// if we're processing multi-forms, then merge in the raw data from previous +// forms unless this is the first page of the form sequence +// +if (IsSetSession("FormList") && $SPECIAL_VALUES["multi_start"] != 1) { + list($aFieldOrder,$aCleanedValues, + $aRawDataValues,$aAllRawValues,$aFileVars) = GetMultiValues( + GetSession("FormList"), + GetSession("FormIndex"), + $aFieldOrder,$aCleanedValues, + $aRawDataValues,$aAllRawValues, + $aFileVars); +} + +if ($SPECIAL_VALUES["file_names"] !== "") { + list($aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues,$aFileVars) = + SetFileNames($SPECIAL_VALUES["file_names"],$aFieldOrder, + $aCleanedValues,$aRawDataValues,$aAllRawValues,$aFileVars); +} + +// +// Hook system: after loading and processing data +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookload.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookload.inc"); + } +} + +if (Settings::get('FORM_INI_FILE') !== "") { + ProcessFormIniFile(Settings::get('FORM_INI_FILE')); + // + // Hook system: after processing INI file + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookinifile.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookinifile.inc"); + } + } +} + +$bDoneSomething = false; +if (Settings::get('DB_SEE_INPUT')) { + /*** + * echo "
    ";
    +	 * print_r($aFormVars);
    +	 * print_r($aServerVars);
    +	 * echo "
    "; + * exit; + ****/ + CreatePage(implode("\n",$FORMATTED_INPUT),"Debug Output - Fields Submitted"); + ZapSession(); + FormMailExit(); +} + +if (!empty($SPECIAL_VALUES["fmcompute"]) || $bAdvTemplates) { + $FM_UserErrors = array(); + // + // Generalized interface between FMCompute and FormMail functions + // + /** @noinspection PhpUnused */ + function FM_CallFunction($s_func,$a_params,&$m_return, + &$s_mesg,&$a_debug,&$a_alerts) + { + switch ($s_func) { + case "FMFatalError": + SendComputeAlerts(); + if (count($a_params) < 3) { + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + Error("fmcompute_error",$a_params[0],$a_params[1],$a_params[2]); + } + break; + + case "FMFatalUserError": + SendComputeAlerts(); + if (count($a_params) < 1) { + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + UserError("fmcompute_usererror",$a_params[0]); + } + break; + + case "FMUserError": + if (count($a_params) < 1) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + global $FM_UserErrors; + + $FM_UserErrors[] = $a_params[0]; + } + break; + + case "FMSaveAllFilesToRepository": + if (count($a_params) != 0) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + $m_return = SaveAllFilesToRepository(); + } + break; + + case "FMDeleteFileFromRepository": + if (count($a_params) != 1) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + $m_return = DeleteFileFromRepository($a_params[0]); + } + break; + + case "FMNextNum": + if (count($a_params) != 2) { + SendComputeAlerts(); + Error("fmcompute_call",GetMessage(MSG_CALL_PARAM_COUNT, + array("FUNC" => $s_func, + "COUNT" => count($a_params) + )), + false,false); + } else { + $i_pad = $a_params[0]; + $i_base = $a_params[1]; + if ($i_base < 2 || $i_base > 36) { + Error("fmcompute_call",GetMessage(MSG_CALL_INVALID_PARAM, + array("FUNC" => $s_func, + "PARAM" => 2, + "CORRECT" => 2. . .36 + )), + false,false); + } + $m_return = GetNextNum($i_pad,$i_base); + } + break; + + default: + $s_mesg = GetMessage(MSG_CALL_UNK_FUNC,array("FUNC" => $s_func)); + return (false); + } + return (true); + } + + // + // register useful FormMail functions with FMCompute module + // + function RegisterFormMailFunctions($fmc) + { + // + // Allows the user to call "Error" from within a computation + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","void", + "FMFatalError", + array("string","bool","bool"), + "FM_CallFunction")) !== true + ) { + Error( "fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMFatalError", + "ERROR" => $s_msg + )), + false,false); + } + // + // Allows the user to call "UserError" from within a computation + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","void", + "FMFatalUserError", + array("string"), + "FM_CallFunction")) !== true + ) { + Error( "fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMFatalUserError", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Allows the user to record an error to be displayed + // from within a computation. + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","void", + "FMUserError", + array("string"), + "FM_CallFunction")) !== true + ) { + Error( "fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMUserError", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Saves files to the repository. + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","bool", + "FMSaveAllFilesToRepository", + array(), + "FM_CallFunction")) !== true + ) { + Error( "fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMSaveAllFilesToRepository", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Delete a file from the repository. + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","bool", + "FMDeleteFileFromRepository", + array("string"), + "FM_CallFunction")) !== true + ) { + Error( "fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMDeleteFileFromRepository", + "ERROR" => $s_msg + )), + false,false); + } + + // + // Generate a Next Number + // + if (($s_msg = $fmc->RegisterExternalFunction("PHP","string", + "FMNextNum", + array("int","int"), + "FM_CallFunction")) !== true + ) { + Error( "fmcompute_reg", + GetMessage(MSG_REG_FMCOMPUTE, + array("FUNC" => "FMNextNum", + "ERROR" => $s_msg + )), + false,false); + } + } + + // + // load the fmcompute module + // + if (!empty($SPECIAL_VALUES["fmcompute"])) { + $FMCOMPUTE_CLASS = true; + $FMCOMPUTE_NODEBUG = true; + } + if ($bAdvTemplates) { + $FMCTEMPLATE_PROC = true; + } + if (!include_once("$MODULEDIR/$FMCOMPUTE")) { + Error( "load_fmcompute", + GetMessage(MSG_LOAD_FMCOMPUTE, + array("FILE" => "$MODULEDIR/$FMCOMPUTE", + "ERROR" => $php_errormsg + )), + false,false); + } + if (!empty($SPECIAL_VALUES["fmcompute"])) { + /** @noinspection PhpUndefinedVariableInspection */ + RegisterFormMailFunctions($FMCalc); + + // + // if GeoIP support is specified, load that module now + // + if (!Settings::isEmpty('GEOIP_LIC')) { + $FMMODULE_LOAD = true; // signal module load + if (!include_once("$MODULEDIR/$FMGEOIP")) { + Error( "load_module", + GetMessage(MSG_LOAD_MODULE, + array("FILE" => "$MODULEDIR/$FMGEOIP", + "ERROR" => $php_errormsg + )), + false,false); + } + // + // load the license and register the module + // + /** @noinspection PhpUndefinedClassInspection */ + $GeoIP = new FMGeoIP(Settings::get('GEOIP_LIC')); + /** @noinspection PhpUndefinedMethodInspection */ + if (!$GeoIP->RegisterModule($FMCalc)) { + /** @noinspection PhpUndefinedMethodInspection */ + Error( "reg_module", + GetMessage(MSG_REGISTER_MODULE, + array("NAME" => "FMGeoIP", + "ERROR" => $GeoIP->GetError() + )), + false,false); + } + } + } +} + +if (isset($SPECIAL_VALUES["multi_go_back"]) && !empty($SPECIAL_VALUES["multi_go_back"])) { + if (!IsSetSession("FormList") || GetSession("FormIndex") == 0) { + ErrorWithIgnore("go_back",GetMessage(MSG_GO_BACK),false,false); + } + MultiKeep(); // store any "multi_keep" data just submitted + // + // save back to the session any variables that have been specified in + // multi_keep + // + if (isset($SPECIAL_VALUES["multi_keep"]) && !empty($SPECIAL_VALUES["multi_keep"])) { + $SessionAccessor->CopyOut($aAllRawValues,$SPECIAL_VALUES["multi_keep"]); + } + MultiFormReturn(GetSession("FormIndex") - 1); + // echo "Form index = ".GetSession("FormIndex"); + // + // Hook system: after multi-page return to form output + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostreturnform.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostreturnform.inc"); + } + } + FormMailExit(); +} + +// +// This is the check for spiders; I can't imagine a spider will +// ever use the POST method. +// +if ($bIsGetMethod && count($aFormVars) == 0) { + if (!Settings::get('ALLOW_GET_METHOD') && $bHasGetData) { + CreatePage(GetMessage(MSG_GET_DISALLOWED),GetMessage(MSG_FORM_ERROR)); + } else { + CreatePage(GetMessage(MSG_NO_DATA_PAGE),GetMessage(MSG_FORM_ERROR)); + } + ZapSession(); + FormMailExit(); +} + +// +// Hook system: before performing required and conditions etc. +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprechecks.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprechecks.inc"); + } +} + +// +// check for required fields +// +if (!CheckRequired($SPECIAL_VALUES["required"],$aAllRawValues,$sMissing,$aMissingList)) { + UserError("missing_fields",GetMessage(MSG_REQD_ERROR),$sMissing,$aMissingList); +} + +// +// check complex conditions +// +$fmConditions = new Conditions($SPECIAL_VALUES["conditions"],$sMissing,$aMissingList); +if (!$fmConditions->Check($aAllRawValues,$aFileVars)) { + UserError("failed_conditions",GetMessage(MSG_COND_ERROR),$sMissing,$aMissingList); +} + +// +// check CAPTCHA +// +CheckCaptchaSubmit(); + +// +// Hook system: after performing required and conditions etc. +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookchecks.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookchecks.inc"); + } +} + +if (!empty($SPECIAL_VALUES["fmmodules"])) { + $aModuleList = TrimArray(explode(",",$SPECIAL_VALUES["fmmodules"])); + $FMMODULE_LOAD = true; // signal module load + foreach ($aModuleList as $sModule) { + if (!include_once("$MODULEDIR/$sModule")) { + Error( "load_module", + GetMessage(MSG_LOAD_MODULE, + array("FILE" => "$MODULEDIR/$sModule", + "ERROR" => $php_errormsg + )), + false,false); + } + } +} + +if (!empty($SPECIAL_VALUES["fmcompute"])) { + // + // Callback function for preg_replace_callback to add line + // numbers on each match + // + function AddLineNumbersCallback($a_matches) + { + global $iAddLineNumbersCounter; + + return (sprintf("%d:",++$iAddLineNumbersCounter) . $a_matches[0]); + } + + // + // Add line numbers to some code + // + function AddLineNumbers($s_code) + { + global $iAddLineNumbersCounter; + + $iAddLineNumbersCounter = 0; + return (preg_replace_callback('/^/m','AddLineNumbersCallback',$s_code)); + } + + // + // Load some more code into FMCalc + // + function Load($s_code) + { + global $FMCalc; + + $a_mesgs = array(); + // echo "Loading '$s_code'"; + if ($FMCalc->Parse($s_code,$a_mesgs) === false) { + $s_msgs = ""; + foreach ($a_mesgs as $a_msg) { + $s_msgs .= "Line " . $a_msg["LINE"]; + $s_msgs .= ", position " . $a_msg["CHAR"] . ": "; + $s_msgs .= $a_msg["MSG"] . "\n"; + } + Error( "fmcompute_parse", + GetMessage(MSG_COMP_PARSE, + array("CODE" => AddLineNumbers($s_code), + "ERRORS" => $s_msgs + )), + false, + false); + } + } + + // + // Send any alerts found in FMCalc + // + function SendComputeAlerts() + { + global $FMCalc; + + $a_alerts = $FMCalc->GetAlerts(); + if (count($a_alerts) > 0) { + SendAlert(GetMessage(MSG_COMP_ALERT, + array("ALERTS" => implode("\n",StripHTML($a_alerts))))); + } + $a_debug = $FMCalc->GetDebug(); + if (count($a_debug) > 0) { + SendAlert(GetMessage(MSG_COMP_DEBUG, + array("DEBUG" => implode("\n",StripHTML($a_debug))))); + } + } + + // + // Perform the computations in FMCalc + // + function Compute(&$a_field_order,&$a_cleaned_values,&$a_raw_data_values, + &$a_values) + { + global $FMCalc,$FM_UserErrors; + + $a_mesgs = array(); + $FM_UserErrors = array(); + if (($a_flds = $FMCalc->Execute($a_mesgs)) !== false) { + SendComputeAlerts(); + foreach ($a_flds as $s_name => $s_value) { + $a_values[$s_name] = $s_value; + ProcessField($s_name,$s_value,$a_field_order, + $a_cleaned_values,$a_raw_data_values); + } + if (count($FM_UserErrors) > 0) { + UserError("fmcompute_usererrors",GetMessage(MSG_USER_ERRORS), + "",$FM_UserErrors); + } + } else { + SendComputeAlerts(); + Error("fmcompute_exec",GetMessage(MSG_COMP_EXEC, + array("ERRORS" => implode("\n",$a_mesgs))),false,false); + } + } + + // + // Register all fields; a future improvement should use a call-back + // function so as not to copy all the data into the FMCompute object + // + function RegisterData($a_form_data,$a_file_vars) + { + global $FMCalc; + + foreach ($a_form_data as $s_name => $s_value) { + if (isset($s_name) && isset($s_value)) { + if (($s_msg = $FMCalc->RegisterExternalData("PHP","string", + $s_name,"c",$s_value)) !== true + ) { + Error("fmcompute_regdata",GetMessage(MSG_COMP_REG_DATA, + array("NAME" => $s_name,"ERROR" => $s_msg)),false,false); + } + } + } + + foreach ($a_file_vars as $s_fld_name => $a_file_spec) { + if (FieldManager::IsUploadedFile($a_file_spec)) { + if (isset($a_file_spec["new_name"])) { + // + // we ignore errors here, because name_of_ field often already + // exists from the above loop + // + $FMCalc->RegisterExternalData("PHP","string", + "name_of_" . $s_fld_name,"c",$a_file_spec["new_name"]); + } + $s_value = $a_file_spec["name"]; + } else { + $s_value = ""; + } + if (($s_msg = $FMCalc->RegisterExternalData("PHP","string", + $s_fld_name,"c",$s_value)) !== true + ) { + Error("fmcompute_regdata",GetMessage(MSG_COMP_REG_DATA, + array("NAME" => $s_fld_name,"ERROR" => $s_msg)),false,false); + } + } + } + + /* + * Function: MergeFileArrays + * Parameters: $a_new_files the list of files just submitted by the form + * $a_saved_files the list of files that have been previously saved (can be NULL) + * Returns: array a merged array + * Description: + * Intelligently merges two arrays of file definitions. + * If a file has been newly uploaded, its definition takes precedence. + */ + function MergeFileArrays($a_new_files,$a_saved_files) + { + if (isset($a_saved_files)) { + foreach ($a_saved_files as $s_key => $a_def) { + if (isset($a_new_files[$s_key])) { + if (!FieldManager::IsUploadedFile($a_new_files[$s_key])) { + $a_new_files[$s_key] = $a_def; + } + } else { + $a_new_files[$s_key] = $a_def; + } + } + } + return ($a_new_files); + } + + RegisterData($aAllRawValues,MergeFileArrays($aFileVars,IsSetSession("FormSavedFiles") ? + GetSession("FormSavedFiles") : array())); + // + // parse all fmcompute fields + // + if (is_array($SPECIAL_VALUES["fmcompute"])) { + $nCompute = count($SPECIAL_VALUES["fmcompute"]); + for ($iCompute = 0 ; $iCompute < $nCompute ; $iCompute++) { + Load($SPECIAL_VALUES["fmcompute"][$iCompute]); + } + } else { + Load($SPECIAL_VALUES["fmcompute"]); + } + + // + // run computations + // + Compute($aFieldOrder,$aCleanedValues,$aRawDataValues,$aAllRawValues); + // + // Hook system: after computations + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookcompute.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookcompute.inc"); + } + } +} + +$bGotGoBack = $bGotNextForm = $bGotGoodTemplate = $bGotGoodUrl = false; +if (isset($SPECIAL_VALUES["good_url"]) && + !empty($SPECIAL_VALUES["good_url"]) +) { + $bGotGoodUrl = true; +} + +if (isset($SPECIAL_VALUES["good_template"]) && + !empty($SPECIAL_VALUES["good_template"]) +) { + $bGotGoodTemplate = true; +} + +if (isset($SPECIAL_VALUES["next_form"]) && + !empty($SPECIAL_VALUES["next_form"]) +) { + $bGotNextForm = true; +} + +if (isset($SPECIAL_VALUES["multi_go_back"]) && + !empty($SPECIAL_VALUES["multi_go_back"]) +) { + $bGotGoBack = true; +} + +// +// it's not valid to specify "next_form" as well as "good_url" or +// "good_template"; this is because it's ambiguous - do we go to the +// next form or the final 'thank you' page? +// +if ($bGotNextForm && ($bGotGoodTemplate || $bGotGoodUrl)) { + ErrorWithIgnore("next_plus_good",GetMessage(MSG_NEXT_PLUS_GOOD,array("WHICH" => + ($bGotGoodUrl ? "good_url" : + "good_template") + )), false,false); +} + +MultiFormLogic(); + +// +// Hook system: after multi-page form logic +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookmulti.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookmulti.inc"); + } +} + +// +// write to the CSV database +// +if (!Settings::isEmpty('CSVDIR') && isset($SPECIAL_VALUES["csvfile"]) && + !empty($SPECIAL_VALUES["csvfile"]) +) { + // + // Hook system: before writing CSV file + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprecsv.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprecsv.inc"); + } + } + WriteCSVFile(Settings::get('CSVDIR') . "/" . basename($SPECIAL_VALUES["csvfile"]),$aAllRawValues); + // + // Hook system: after writing CSV file + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostcsv.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostcsv.inc"); + } + } + $bDoneSomething = true; +} + +// +// write to the log file +// +if (!Settings::isEmpty('LOGDIR') && isset($SPECIAL_VALUES["logfile"]) && !empty($SPECIAL_VALUES["logfile"])) { + // + // Hook system: before writing log file + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprelog.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprelog.inc"); + } + } + WriteLog(Settings::get('LOGDIR') . "/" . basename($SPECIAL_VALUES["logfile"])); + // + // Hook system: after writing log file + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostlog.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostlog.inc"); + } + } + $bDoneSomething = true; +} + +// +// send to the CRM +// +if (isset($SPECIAL_VALUES["crm_url"]) && isset($SPECIAL_VALUES["crm_spec"]) && + !empty($SPECIAL_VALUES["crm_url"]) && !empty($SPECIAL_VALUES["crm_spec"]) +) { + $sCRM = GetCRMURL($SPECIAL_VALUES["crm_spec"],$aAllRawValues,$SPECIAL_VALUES["crm_url"]); + if (!empty($sCRM)) { + $aCRMReturnData = array(); + // + // Hook system: before sending to CRM + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprecrm.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprecrm.inc"); + } + } + if (!SendToCRM($sCRM,$aCRMReturnData)) { + // + // CRM interface failed, check if the form wants an error + // displayed + // + if (IsCRMOptionSet("ErrorOnFail")) { + Error("crm_failed",GetMessage(MSG_CRM_FAILURE, + array("URL" => $sCRM, + "DATA" => GetObjectAsString($aCRMReturnData) + )), + false,false); + } + } else + // + // append the returned data to the raw data values of the form + // + { + $aRawDataValues = array_merge($aRawDataValues,$aCRMReturnData); + } + // + // Hook system: after sending to CRM + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostcrm.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostcrm.inc"); + } + } + $bDoneSomething = true; + } +} + +// +// Check obsolete SendMailFOption +// +if (IsMailOptionSet("SendMailFOption")) { + SendAlert(GetMessage(MSG_FOPTION_WARN,array("LINE" => Settings::get('SENDMAIL_F_OPTION_LINE'))), + false,true); +} + +$AutoResp = new AutoResponder(); +// +// check for autoresponse problems +// +$AutoResp->Process(true); + +// +// Hook system: before completion +// +if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprecomplete.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprecomplete.inc"); + } +} + +// +// send email +// +if (!isset($SPECIAL_VALUES["recipients"]) || empty($SPECIAL_VALUES["recipients"])) { + // + // No recipients - don't email anyone... + // If nothing has been done above (CSV, logging, or CRM), + // then report an error. + // + if (!$bDoneSomething) { + if (!$bGotGoBack && !$bGotNextForm) { + ErrorWithIgnore("no_recipients",GetMessage(MSG_NO_ACTIONS)); + } + } +} else { + // + // Hook system: before sending emails + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpreemail.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpreemail.inc"); + } + } + $s_invalid = $s_invalid_cc = $s_invalid_bcc = ""; + if (!CheckEmailAddress($SPECIAL_VALUES["recipients"],$s_valid_recipients,$s_invalid)) { + ErrorWithIgnore("no_valid_recipients",GetMessage(MSG_NO_RECIP)); + } else { + $s_valid_cc = $s_valid_bcc = ""; + + // + // check CC and BCC addresses + // + if (isset($SPECIAL_VALUES["cc"]) && !empty($SPECIAL_VALUES["cc"])) { + CheckEmailAddress($SPECIAL_VALUES["cc"],$s_valid_cc,$s_invalid_cc); + } + if (isset($SPECIAL_VALUES["bcc"]) && !empty($SPECIAL_VALUES["bcc"])) { + CheckEmailAddress($SPECIAL_VALUES["bcc"],$s_valid_bcc,$s_invalid_bcc); + } + + // + // send an alert for invalid addresses + // + $s_error = ""; + if (!empty($s_invalid)) { + $s_error .= "recipients: $s_invalid\r\n"; + } + if (!empty($s_invalid_cc)) { + $s_error .= "cc: $s_invalid_cc\r\n"; + } + if (!empty($s_invalid_bcc)) { + $s_error .= "bcc: $s_invalid_bcc\r\n"; + } + if (!empty($s_error)) { + SendAlert(GetMessage(MSG_INV_EMAIL,array("ERRORS" => $s_error))); + } + + // + // send the actual results + // + if (!SendResults($aFieldOrder,$aCleanedValues,$s_valid_recipients,$s_valid_cc, + $s_valid_bcc,$aRawDataValues) + ) { + Error("mail_failed",GetMessage(MSG_FAILED_SEND)); + } + // + // Hook system: after sending emails + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostemail.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostemail.inc"); + } + } + } +} + +// +// Process autoresponse +// +$AutoResp->Process(); + +$SessionAccessor->CopyOut($aAllRawValues); +// +// multi-form processing +// +if ($bGotNextForm) { + OutputMultiFormTemplate($SPECIAL_VALUES["next_form"],$aRawDataValues); + // echo "Form index = ".GetSession("FormIndex"); + // + // Hook system: after multi-page next form output + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostnextform.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostnextform.inc"); + } + } +} else { + // + // Hook system: before finishing + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookprefinish.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookprefinish.inc"); + } + } + // + // redirect to the good URL page, or create a default page; + // we're no longer processing a multi-page form sequence + // + UnsetSession("FormList"); + UnsetSession("FormIndex"); + UnsetSession("FormKeep"); + if (!$bGotGoodUrl) { + if (IsAjax()) { + JSON_Result("OK"); + } else { + if ($bGotGoodTemplate) { + OutputTemplate($SPECIAL_VALUES["good_template"],$aRawDataValues); + } else { + CreatePage(GetMessage(MSG_THANKS_PAGE),GetMessage(MSG_FORM_OK)); + } + } + // + // Hook system: after finishing (before session is cleared) + // + if (!Settings::isEmpty('HOOK_DIR')) { + if (!@include(Settings::get('HOOK_DIR') . "/fmhookpostfinish.inc.php")) { + @include(Settings::get('HOOK_DIR') . "/fmhookpostfinish.inc"); + } + } + // + // everything's good, so we don't need the session any more + // + ZapSession(); + } elseif (IsAjax()) { + JSON_Result("OK"); + } else + + // + // Note that a redirect terminates the script and prevents + // the processing of fmhookpostfinish.inc. Also, the session + // is left intact (which the good_url can use). + // + { + Redirect($SPECIAL_VALUES["good_url"],GetMessage(MSG_FORM_OK)); + } +} diff --git a/formmail/sampleform.htm b/formmail/sampleform.htm new file mode 100644 index 0000000..854ed48 --- /dev/null +++ b/formmail/sampleform.htm @@ -0,0 +1,121 @@ + + + + +Sample form for use with formmail.php + + +

    This form demonstrates the use of formmail.php. +
    Note that formmail.php requires a one line change +to work (two lines recommended). Use a text editor to read the information +at the top of formmail.php. +

    +

    Also, you need to change this form using a text editor; +follow the 4 simple steps shown in the comments. +

    +

    We've included sample fields to show you how to +submit Checkboxes, Radio Buttons, Multi-selection +List Boxes, normal Text fields, and Text Areas. +

    +

    +For full information and support, visit +www.tectite.com +

    +

    +You can save time and effort by using our +Form Designer and FormMail Configuration Wizard +to design your own forms and get a configured copy of FormMail. +

    +

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

    Please enter your name:

    +
    +
    +

    Please enter your email address:

    +
    +

    May we contact you?

    +
    + Yes + No +

    What are your favourite colours?

    +
    + Red + Blue + Yellow +

    What vehicles do you have a license to operate?

    +
    +

    +  (Select all that apply; use CTRL-click to select) +

    +
    +

    Please enter your message:

    +
    +
    Powered by Tectite contact form processor (FormMail). +
    +
    + + diff --git a/hosting.html b/hosting.html new file mode 100644 index 0000000..97f77e8 --- /dev/null +++ b/hosting.html @@ -0,0 +1,370 @@ + + + + + + GreenHost - Web Hosting HTML Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + Loading... +
    +
    + + + + +
    + + +
    +
    +
    +
    +

    Hosting Plans

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

    Our Hosting Plans

    +

    Vero justo sed sed vero clita amet. Et justo vero sea diam elitr amet ipsum eos ipsum clita duo sed. Sed vero sea diam erat vero elitr sit clita.

    +
    +
    +
    +
    +
    + +
    +
    +

    Share Hosting

    +

    Eirmod erat dolor amet est clita lorem erat justo rebum elitr eos

    +
    +
    +

    Latest Offer - Save 30%

    +

    + $2.49/ Month +

    + Buy Now +
    +
    +

    100 GB Disk Space

    +

    Unlimited Bandwith

    +

    Upgrade to Positive SSL

    +

    Automatic Malware Removal

    +

    30 Days Money Back Guarantee

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    VPS Hosting

    +

    Eirmod erat dolor amet est clita lorem erat justo rebum elitr eos

    +
    +
    +

    Latest Offer - Save 30%

    +

    + $5.49/ Month +

    + Buy Now +
    +
    +

    100 GB Disk Space

    +

    Unlimited Bandwith

    +

    Upgrade to Positive SSL

    +

    Automatic Malware Removal

    +

    30 Days Money Back Guarantee

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Dedi Hosting

    +

    Eirmod erat dolor amet est clita lorem erat justo rebum elitr eos

    +
    +
    +

    Latest Offer - Save 30%

    +

    + $11.49/ Month +

    + Buy Now +
    +
    +

    100 GB Disk Space

    +

    Unlimited Bandwith

    +

    Upgrade to Positive SSL

    +

    Automatic Malware Removal

    +

    30 Days Money Back Guarantee

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

    Shared VS Dedicated Server

    +

    Vero justo sed sed vero clita amet. Et justo vero sea diam elitr amet ipsum eos + ipsum clita duo sed. Sed vero sea diam erat vero elitr sit clita.

    +
    +
    +
    +
    +

    Shared Server

    +
    +
    +
    + +
    99.99% Uptime
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    + +
    100% Secured
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    + +
    Control Panel
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    + +
    24/7 Support
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    +
    +
    +
    +

    Dedicated Server

    +
    +
    +
    + +
    99.99% Uptime
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    + +
    100% Secured
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    + +
    Control Panel
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    + +
    24/7 Support
    +

    Ipsum dolor diam stet stet kasd diam sea stet sed rebum dolor ipsum

    +
    +
    +
    +
    +
    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/about.png b/img/about.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9a5b42e46ead469d76cc11b5c37b971d9e4394 GIT binary patch literal 34894 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 literal 0 HcmV?d00001 diff --git a/img/anon_img.webp b/img/anon_img.webp new file mode 100644 index 0000000000000000000000000000000000000000..83d70038694842b6b9a72eaa41c104ff894fa7fc GIT binary patch literal 5670 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 N|D_8@Ak_b!{{V%!`I`U$ literal 0 HcmV?d00001 diff --git a/img/bg-bottom-footer.png b/img/bg-bottom-footer.png new file mode 100644 index 0000000000000000000000000000000000000000..953a9496e4d109a51b30f21b0cd4a52b141b22af GIT binary patch literal 19113 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 W_(ga4;i3P#f#AUKfck|=h5rle80t{~ literal 0 HcmV?d00001 diff --git a/img/bg-domain.png b/img/bg-domain.png new file mode 100644 index 0000000000000000000000000000000000000000..284c553c08b0deb1b71554fc79640db7f95bdf76 GIT binary patch literal 45717 zcmeFZ1yEhf()f$JyF0<%-6goYZ`@_$1PSgEAi*sJ4ess^0g^y)cXx-!Ip-evxc8>M zSMUGo)vL;?VzYaCx_jm~Jw0o0Y7wraAcY8r2L}QIg7{imTm=LK%pC*-lpY5Bxh1*Q z>;?pcuh>dW3#cV8#|v<C8(Ffn8FuycIYgMjc0c{myaY|MZpCT12^_5x%_&Fy3) zR;B`EnjG@X@{VF=mR8bU&St7!3Tgl^8vu_fnUEkHzX$KL13NRIF^Pwrt-TAchXC2{ zetDnY|JKYzM)G?Xpp5{T$Zr8jwB(gY#2lQ>NH`cd7y!(yEF@e!j4T`+TwJX5B&^IV z>`croOe|~+EIhpI?7Ym(B>%d|1mT|F@jIKE^QwqT{wv(GBtT{f1Um9EF}b_DGrF@e zIyhS}vGDNlFfp?-v9dBe_h4}GvB?odISNZqHL8|4*|ATABa7IRC@bZ<_x)b~6vF|6=x=<`1*qQ{j&l;(wki zub8u$G0?$T&B4J|@Q*B0`V%3EnAq=GMMAA?n1-Q^wQ+-_5RzNnYb~~Oz=4$ zIT@H)8CW^gSXp>kn0eVb7?`=9v+^HK{^q$-h!X$@5X=h z{41+?#T;xMoS%nfCdkIm^q-plVfA~a@xHcq0UFx_%wCHNJ~uF0S();(aC368Gn+Cq zu&|n$GH@BQb1`rO*i9G!rYy$X0Ao{A76A9}5as3nY5s4n#T@{yzwMT1*MAfiQwPAa z`@e_9#lgnI%47Z<$efdffrZ5kz+h~~&BI{I#bpd&Wn%_#8?*iy=pWAhEs&zK)pOl5 zw*5z+-{xZa9E_WrjhUT?)trHaosE-$orBq&!I*=anZeBXd6K4_%m6lK<3B_E2RHu~ zO4`chIa@vdk;Tus{Cj0nHFNr(t$!+Pt$wdij>gU|X20z}0kS_g;9n)}uZs1X&F}k| z*BJ0yZ4(6iwmr;D`I-Jl>)*rr%kp1lR{y@7|2qVK`2UCbe~;mAX=eYk?e&MN-+TRc zCoT@=KzCzjGZBmD4EZlRpM!*2-WXtI|64_U-ur*}{hx*}1MoBbb{g1P{lBmjF2-*E z&lZBkl+A>hjTOMaZpzNaz{c~urFeK)xfx81%~$};0F&o~nf=dM{@+=M|5~H|k1YiI zKTGicW*Pp@V}PZxy@i>nAk&{S`?KNyS1b3ws)&Dp`L%L?)TBRl;{U9Qe^%OmucG|F z-B|EGSK#MrVElXKW8r7|x3<4?=8yhbzg1FO*Wdedu`)kjOf0{>{>${A>X)Y4KR5lS z`ladLmg@FaK*8rD>i2=ZX#R)QZ+Aa`9L=iFH|l1BoE#i%9Q;f#n_pTeS$UY*YKdDt zpP??loduk1&rE(dda3!3mfC+?vi*kSZ_9sZ{$=^cV*TT$`uFkRro`R4B_{h##u!q=}LFM#}9{Dtf1d|qgO;d%k&=i)D1Kj-s8`wQ0#AU_v> z;rcnB7usLAUI6*I_zTz1`Ml8n!u0~k&&6N3e$MBG_7|=fKz=U%!u4}LFSNgKy#Vra z@fWV2^Le5Dh3f^7pNqe6{hZGW?Jry}fc#wih3n^hUTA;edI99;;xAl3=kr4Q3)c%E zKNo-D`Z=E$+F!U{0QtH23)j#2ywLu_^#aJx#b3C7&gX^p7p@mTelGsP^>aQiw7+n@ z0P=J37p|Z4d7=G<>jjXXi@$LFoX-pGFI+Ex{9OEn>*su4Xn)~)0p#c6FI+$8^FsRz z*9#y&7k}aUIiDBWU$|ZX`MLO0TyTFsfNN&|{M4=c^W(LV@J+SPkLJQUN^84-fWV{w z_5%u%nvV0_7@#DlCL!f0H}e1K1sSta{5%*spo)Sj2!S5B85%68r8NSwAto*vk32P{ zjDQ9mBeMyovWS#6vA7zWEhMzvReh*a!BY|li0kNUaS=6-*?s&-=R9sXqd>ckkYl7+ zVGoL@r%)=;9k;JLoCgNg-Y%A(2qlsUhq1hJK<+Js#T!B2S#(r&3NL+U&cff)WHa!% zwTFmD^b*;uo2ckULVjCxjXPP~WT~BD1k+$cq2dcF-z%^_XgO8NLndz~CY?y==7G{8 ziKTQL(g@C!os4+aM0@i+N}02I`UFBUX_Y=j__M+?x>+b8(KP@4+0K_)l+8ykuoIXg zq8rO8BtDYu*^Yc_ob4V+^I+TWo#J0ZaR~^_UweYK*9lYPH><2VKX$HB;y|Y!S1F;~ z6tCXofx^fh;SyDLtX;|}l7XEjmYZ=?F|6{40ZwuLLHIBC zfm@NgEV*e&k;CmwrW5Bz9F!w7gG=T2J~1`J6$^EPrZTm+p8o}lL@EfDr24@@?*7EsZ1rx~?TC+7xcKY#jd-L(X4%G;OBd z6M^GoJ&fdwDrR|NOQ^XFaV1|al0w(cK1$W{$argrk|qOpqn(I`nIUr(;`@g(k|hXe zbrz{&n7~J)H}b}3ASQ6b$SPj4L-CCK=qEoEYeDibZFo)H@ofxX z?VMdaI2al?L^bmkgO1Ybvfjcl=q4FszoPrBrfduyrWyLc*ALjqXJR|)H-BfWz*6B< zX?9|LEUQ;7)lFE6v;yrN3i<^z zdM=wy9tmq~Exba=RBMz{T`9DCDU*@TI?rlc(gL*0D*>>`alOl(r`mm6)3|E%a-vi2 zrlzU5A|p4V?Fa4wT_36gjm*PhdXN_1wG5$Btl!Z{PgOr%PNO7}XUMP#pp_gJf0aW~G2C!@r1 zvu~=O7SWiO;F@IRC!AnW!$xctl((@>OT<}4@AD}zuQwI^U z+_1$*=AcRk@Dp=f9M>6p1irqwpqc+p|no(Sly(TtVPH zWs`NrP~(e>lT#0m1IJZRT%}6IE{$7v?v9;B%-27+n(OE zS{B85N$~usP=ME7o%gqN=c}K}p>KmTLN>i#^_U-$x%&@&D#d!gw8%vS|0#|f?GfXYWi5Yp&{Rwq)ScM27A=McW%&;B|nW; zOzVGoYp>#{0_su-&8_~eyDaAI?L2zK7saYm_I!eYv*yPAs%8J8NC{BCF*;O3^-(30 z5#vv%c{}}9aGe^Xr|hf2$R35o7Q;KmaAy%5>PGb~CY+~~<-)y#8*?pPpD2P(BUUKO zQ79h}IyNKkStNbt&vq;=3HeiV+q;x3H)5Ee^V7N~k+W7sHW=$3YrcSshgU2qqQ{Q0I9 zn~gmSaz2yQB)C0gK1Cvgd8DI?l&I2whYm!_H(fR*tuQGPJa5;B!DA_|NT!wi)M?71 z7nTsWJ#lUP?J(Md_TfOSFlKeSq5I?IiN`VhyIB!X%Vw$KJT1ChKT#QRA5%%I@cw0n zL^gZKe1<;PDLD+f$!$US#C9Z2bHWRfFpGx>C;em55ug?u%h$Ku3;LhD$yII#Jd4NP z(88D<38Aqy8;-n*Zb9^zN!vSX(XG9Stplz6ay)WG?xz>W6vmjTeujL2@T0N%(Rgbp znc}-sVWVD)*PWIyy^45StaaB|D9AUfwste%sweesAefp*}r@529S8f%&`S-m+ zw`Q{w4X@Hz=j3l2gOe~FHaMcA&Y|=T!=`bSF1re>h+5gbCI#D&{U*GV;?JkH{bVLeAx{p1BJbh{N0yqn5!SZo%(3VtjKLaU%{UsA@5 zat~@$$Y}8^CU_5?3N@KMU~Wn-yib9Qg1d!(E4(;zTZ!^Wor~7=1Kyxn1B;B^)Wo$p zBns70sc0;>O8Q$+T*~t+U>aHQSQ#Wx8SGm^`SoEIw{m< zq=7gzpTC8(Q>J2#-<~B@8YBa$pyn?$vAzvhc&~$(5o(8tKq7A{$+<&A4mMEe4a#W2 zt>6Z%y@To5RfRc-dtW7`G*JS?yH}P13Nx#0!*RL>UM4|v=;-hS2zMN^!qNmY!qv*j zmlKgAg$ElPv6k8O>*Sc%R$(kcW$|7kqC=YhFqPYXv;)V*;(2i|UgC?2{kxSoGnE1dg(2gVD7X6g|o;QKxpz zqTA$mLJEeXY?U)Wm?G~fYw=e_F+bIApt$?&>DwMfgt_rII0xazmLvJ-kdP*&vHqmxpZk;UzYe zgRg0h<9W9>iLS@mS^lb!57uTc#N&AKI^)=Ia}eFHl{h#wnoDH&3xCw{?DogC%<7iu zXjpU5NiExs$d4yU!#20R#7BNC19I%QrVL?RDS8PAu(DKw<}G~1@1xo4Jyy0A?_A>F z%&PjNQ8tV859n-erp@%LW-GPeA6q+ZU+_NR#19d-^ex4>+y&l&CBT&TOk^Qzf`Wg3 z?9eM#R`j^i6|V6aU;f&-aFtXf36ERh3;|faGLmZ|8xFyah(PKK+9oTkmgBMO(oy@y zupyj<>}s2&#s$?;BnLW!!^tW*qpC)k351!sO-K>YYXx{uyVxz5(`&?(agraSd}1)- z0#oo|V`)>e!W&zt_s342hzp}Od__yrz0j|JDkG`5;8^NIb&1i@wJRkh=PD<>+}~80 zx7WwT**jEVFd4tNchnUkP>miW^xKaFzt~h zL12N9-JzWP^JdaCNuKz1#+yt*UeEyKv-wJvFO;}-y{mihd^KH{%8C^9tN}*p%oFdL zabVTMi|i2uW}`#SZ9i#c7$NaP*yclShPV621Z=2xbX79^}aF`p+!qr7F zo)z>%v1cNygyDM#`#%GD(G&tsOkldN7e6TUK_p*MDwcU^N( zJlJsUe_Ms1t;_YP<@oF35=csE;L85h5(XKSdkOx%f?@-Fdm08yF;?H)<2bqC-4y*m z?rTzh9h5dLzPHB8%x*m$J+LCRv_Z_hrlZqwy{LEPk<^vhii668nS%cE{E-Az{b1kvSe}r6JmFMJB0EkE( z_;L_Rr~D6VEP)lixfF?lfW|;On%=w$J62><=LWiIEbzEW(W4qPtM8P*znd z@5OBAIzCGGyk@$xvi;(uUY8menU6&=bgv2kIp#b)xef*yGFqI3wvNDs4`G=M69lKP zFZQv%lV$|20)GrT1IvmP>0AfIY+R6vy(qz4tlzxzoVa1DQgFGanTAd|*De}ditF3$ z9t4U7{O7NacifjZ7N>&zzBhZ>IIrY9|@ zDC(T}v<#@Ltrs4`GD4C^Lh{ye@d>fn4HDyk?ahM4c5_*~HKo~Go)VmX@FKcG@?LZv9%cw=fgMifsskmJbVJEj>rlfjZxX9G%r5QwR4pt8 zZo)1W0@RWs^Z!6R6%g|P;jcdpyS9Ke+&$FsX7*h@m@wNhqU0{^Mm(^J34zAG5LLHq z%WQaSw-?~LngySAjC2@wsMt@ubiy8?%jzY`(Zl9ugq!B47lQVYN|U+S;r^W}YPqQT z;*EvxrsADC@6t^%9&0&3HEf9A+vW9?$?TT%K}(7_UQK38+!#t?a>EB^v^=R#W@r<* zmw}%WC1&;zWT;RB%j6X7?UF?0-fxtU&AxAw>emH{T?UjL*F=~MR?(26G+#oabs5< zgMwUN;aO3yXB)EFRUTu7v1{-Tp=0(%F~nRS%2hwz^21dTsuRPtmv1CXH9j3jtMY_Z zF!Mav&6kiavYJ zMUqdwid4Pay2hJ%@jW#E*={DGE_BbDT#&gD#DIDbcSjn10UjzyTVzfpSzk|8+l!L zemG~<-o<-jW9(*oWUuw(!HWRDD`&GYwv^WFv|$DbQv;iLL)l<>oD8%EkWEr>H>0=> zS)?oG)PQ8}Mg?)H5BST|(>0#|4O*5sG8cJW>&c;9z!ai>|=)Pw{@x+#MIiUh}Ld z8rl7yRd}OKHP$C#gpp&sV^zuL>92n9He*5pz{6d1p>}3v#wk6X0^W61dy4bl zSt3Uz%_{d+PhfqKd_|%%jY^%22))64MD}nfjbrEq3HLRFU|}%Tb~Kf&${@(b=3stTM)D~u50NN6{|KVPJqqB0pu+^g zBAXNV4*@u;C&5fm&!~y`Ygl;u$Z3>;^x9VS4TrA4F$?d6b-(d^wib@jJK$Y^Xf2nq z0pv&X_ZS2N6xqasMydY58Hkz#a@4dj(YH*(ZSo~2NEdw!&~LI*m%gQJwNus}XbMdN zR4~Fl_Jlxdeq^ur1%f0t;x%@TwpwJ&!8mtK&ABr#&p$*YLZ1fQ!x^gFlM^raVM++C z?eLT8cP1Ph$ZLG&fRb0G1RcBx1Tvt_xBL1TmN&p&wi)CQF*QCRewkAxw;+m7BXN7% z${$PbhrZvB3MjC()%Dp_V0$`k?HH5a%nlpap%%B^736tkDu=HIu%cbN#H-@v%8=W^ zST3qCKUPam4?I8T`r0DaL64*N>Kny)LV11sn>UO_t_D_MWbSJ94j%d~?USR5~pbXxYs_Uw2KNNMVtS zqCBJ1e%lO=8yrC=Z0XoUMzy~=(oP~WLzLJ;((=WlcfoWah2F=e~palL0B>W89|0yOn~7BV)60>I^hdx%OtP_i05a%M!t` zP=v8EG@9H=9leA49K2C%4+dqGmLn5_wk%?fk#uq{Q=E%!FgrU=#NPX>a98L~!Mbei zXR3O}sl;Y*=C;ZXTDykch*a{|svMEm7^2ML2!arCR7OK3v6uQ5+@JNJD^t6g$xt() zDkxf9Be!b1X3iwxB@NOb!B?WZ`P5>0yrQ0yEvZ?w$3ZL z`sv-g1KuFY&75(v3hm89*qkxeywMx}raQX`p28)S5qW|?F%{e1GCF7+8m8T`sehMS zslV}=or9dP*W-eh*Cy+(!LT{u;j;Z3FgmWLya-2H_~ET2y9YO z4K8azlxR}#Z3yfAhE5Vc(CC~DgOAA+r*n<}xuV>U{FqmB-LM0*ES6C} zSYpwRdU8qHmkn5Q_BK@lR8~q1FTU@K!<+Elmydnv!KyCfbK7Qbv;_ZZo*G))r3m(B z91ikM7}~g3=U#DUt$7U$FBpED*a?(T7%d7O$9BsMtyeZsl}4$CYda%&JOJKNeZrtu zL(4>^5S*9leOVerN+X>yq+tNB&v$<+9FKX<7>7;~J1&2ax&gg+_1UhL>nkN5_e({s zZE2aSdE1f`BiZ^Oej0H@{`!5xF0r_l_hJr_0N8!uav**FyOXf=p${{*n`LG?X?Iy8 z;O+8mk`_4V3#Qf+saP8{7;TMK`z40TgCEF~2q4{NJce(*h5^W;4 zbp^ADj${@4`L*8}t0>m4`F6u>3REsni^UqE)ZB;b`g7)_V)afTk zE;swZ?B=t87?Uc>4Jovnq zg`AZMIA2$!6CejBzU(-f5!lBh#11ysS5d662msR(+A4Mh&gqrKno8Ls%HmMhUT zki?~f-=lo}p*6?wp1wxEBB%F9g~1i0k`~1l~pp@rI8Ct%E@cll>|2PLeq~pB%{`T=; zZoBdxZAXjyBK)0m`lv44n3MZAo@0#u<_)!Z#Dd(Or0yOM?~-pm#J~nBDTfx^>*Mg1 z?pHgnoC>eL_^b_omNNgafqxVi`;|QTjrs%rlE+@~=MDV4tP{z!IeliL8)u=({+j46 zQcHuAHuwUn`Kn`OiY$6z!I{_NGzp5E6q|5)qX%+=u6vATj#Ir0$I4?@R5WiG6OmmA zV>r2rT>;OYy(Nb-5+qlt` z)WS$Ov0!w8EPRBX@$05{xahsvu(QN{ydZ>u8L0ja^C9u%gAv=%(DmOn$&Dn1FcllV z1)w{1ZOSfs$Q2ZDxrk?Bk4n}W(SFB<5J)sPmasEArnRcp0VroCB2K9YT_3>5Fo{T% z-`Q9@T{f1JsoBW~w1jdqKY$y8F8uIrEPk_r^-8>9id*IuDD&N)?sPfM$ISCSJDp>x zy_xoPT(en&woQ|?6Ky?6fr-Hk;MjaOr3eFAp;vC{oGuxdWF&X_N+0VAwbfLuv=PIP3qbZMt7|AqM1>kFSM!=+Ougus?9QuTA^35Nx_ zlnP7)Q)5zaC1WKg5E~Q}F^Lj{uucK8nA0e8X)1gvQUGCW<Jq9xUVKCA^fimO2_2WlDMrm>{oZTTXcoIY@;7Q!=UJtP)->c%PC zt5q`G%MZ$QX;a$nTh!9rNypYu5Z;E}rabs~PYzq9m6-G0)@-P|&Q%k4ez+Qtr$cu| zVIhkWW#|nr(=!x%PdKq5@>xkwlwRbAXC`mcH4Mr7YU#S_D&b8@(P;RfjPl}CI3Xga zm>H5Y#mrQokgdVNjFh0Z#n~Xzu?j(GrOp7=+?)?9lD=U5iceL>D3uMz8IfgS2PCOa zpr29=mY*=JbLsdBK$Gp78?(K8R2Uwl58Ho?b%j zxUEjXXuXsfx~|X#xpo%_n4H|09D86|6i#!cBF*{w^DY~4if%|?u_ed? zg*5?JmZfY5d)*{}iQ#G=&J6b}qt>PR8vMn|wJjBriX@o;DO5aQOXS`t?sqrh(&;qn zlm{d+k^6{+R`1F?dja_751GoRKIIIPv{n!p4xU~JJmn)?eL*uMb|Ab{1C_NiDH6k4FgJMXm&EAR1ORlcr@Z6}nE#MrK~EXXpG7LybpHlr54s zC7`FS4^ZE;jd1WH|4PZXZAOakQfE^Dmsb=oJy|aTX6Hu1yhGH7@(W5$H*G@a?Y+d#+u; zg}dt&K5tl*c9$w4cYAyUgg$(=ruz)Yn!x$cfD^zN}4l> zm@b5k19b{Co~q-79>uZv^p2y8sInuOD{&bX*+!S|f)fu*Pj(}ow(*>!K8Ll7x3#M1 zMkD$pgHOF&Qgh~O%TI#1jj6iA!`To5xq>sg8P&RWvUJ2s__v=0Q^Jn{yvvu?oq*}% zBZN7Hn8X|R4>~x^=_rr-4>_ap&^UBoG?!KQE^~8&7L1IYJ{jq5d`%|q!!#Q{!}J?p z`5X*462=onN0O8CM7_RgJVTZhwXvyLLKA9mfBs2cFgc1l?YdFvL z8hL1Pln0DRFwgJ~Fof|H%mo$j<3W^iU~~C?`R<0`?F~*g68xSU?1#ce&JiNcoJdaw zviort!!9ptWg5|ul+_0O1K)sj(bl`6j5p#;v8WO$hW2%~s>=c+B44zE@68$Ya>R|k z&vHaseU-+yPuBsLWj-rnIm3k~;$DZ@nRH}mri)5yy5{zP^m7)tAEcF7yg{(ED#Pla zE|z_pe)iq8n?xTLs@XRSA$kO#3#~iw(cWbcWR)T|BZd#6iwycTdIJ|@juBzRM)dlT z03TuaH-=-sirpEOcrd8S3sa&JB|-nkuOuPu6565AlYx_pt87?I2q*AP>Mj2Gg9d zHFpDop;_py#~Y(?gfcvt{B7rbbN#T!X@@fb4UZxBgj;ya ze@!W&baJvisVW=m;0L>tFL}hLR?Y8-lelQFuboDPAIqKiV2Li97V-W%lm^{Zs94Ed zEVKpGYxHDz1!t~4C~}v7`+PV{sC{lNTDR#|XkULXHFp4wp88M|GAXh!Z1wW+PH1^> z;3LYxVakldm(qnTzQ>^uaf#wRG)!ElY@&Lp8B3P^hq;_;HJ(y&>{7f`t2L|Tql4l; z+tu%%_`%R8=SIc+{AY_YU56YVGEIr#di52~Bna zlE)JonE1{!s}zki&ttdZ3rpl&e?PcUR%>}ZP+g(GevTZ{riB!eGVvHWQLpR!TEoMn z`UARmv}NQ)jLtTSJ0@`3iJPi|i64Z90;JD?6kz$& zv^A$F=lP$=PmWf&AH2F*4s#-T7!cszzIAi0_=VZ5*hYB(!a<%LZyQIig^3U}uy3HAJP)4%7!e*u!TPe<`T` zzK2UA#G&+bgH=QG@ThOcZ)LEw5lL`>Lls#}BLQUehtmaY2v}U=2d(hq-aRFKN*>HD z=IUh1xEQ>uYbSip(iGEhrp5KH;|NWkk1REU;qc#o1dn9xxAqthRDK}Y7_`r`m|ah* zW%D06q}YDD5=ba-laP3P7nGk{XEf5sn7(ru0)%Sk3$nSzq0+=pWhw|)U2@S_aT#M- z1_>kD2ghmWt4;%FyrKf|b#p=az6WVX4}DANi|s#&a36Dli>2X?m$mq$k^ZPTt1l)0 zG264i+z_$Q>YyyHAe+;St;i!G(a7sA#vY!+b!?^1D$oSKYH&!0xTDn7k`+Fh8(xD{ ztU|RtxciZ=9Da1=`!YBG`)_GW-wYlGI@LBZ zy3*P<4c_8?qH*y2@DRah`Q96KI`)b#)5W8G)jHd~h3}Hiy4p~g;gYU{%Pm*S2gc4U zR~k;I-Id$%=3U-_oK`ez2Q!=u00J_$+`3H{ThO(Zfp9a`bivx1dKnNKp@J0-d!pS1RJSYkJum34wM}!bZna=>pcGj;1Gix`CLfyxXes zBf-E+<|cnnDBg|?+52kJWfAdixuZT`)_84UHbcjvb339@QW`aTF)#jr8&T{cJKe7k z=ASRJ9Q=wra7+Y~4*hXRn0aQb4sPZ?ZkC*L7TxDA&^p+GBL}O3Gk-O`XbN4m4>91N zx}^mdm+iI^dU~KE#!~o5e*sxpskYwHlORUi6_}oiKi6xpOntJMZ6V#wXKMn7$3YZR zNx(x4IoV)`D`*8_vcqH1W<3_OH7MU!P$JfE*#q8p;cOTC_9hlb5Eta)`hkF^9p#0KZ;i8-5DR3-|ssriTT*H`@87Uv)ek9QAu3n-Wj$FK@0{b+AqcD&8koTR~hf1k*s% zEQ3cNnI0Z#z^>EqUSF^m>V@U%>rN8m6K0_$<6Y8h)1br(@b)%q_X=#0@!S9uBFJTB zg_FV?&T&QhoWJ7A9Wfo?-I+GdQ0W5u<}SC-HcBi!V;n#(rk?Z^SG)_|^VbTfPs&LK z??Y#jETmemro7m0X46x5emrgk`1;*=x6BzrUFoJK0Bl&Az%PH8n75q za-U3TNEH5_(cy6(8s208F+@J#j9poNr~Dn#n`WuL8rM!7*2 zT>8t9_pcFvYn?^l@!UXY?cp{i7cArTRWpfOxJ^Y>LqdC<=4I(DZ{@x{soHw1H}pi= z%#=Sf^FZ8I1p$REuz)n_j4nsFZ-M6>7w}H3y~Cv2R2^fpAJNQ@?~G=CT#$;6Z0)0Tmra7yqSr_x(U27(l#uXr@99hR24dUKyq!P= zyEMmCN*uXX`q10wYWM_160&9o%lwJjb|D)LkjbcZt-0|Mdf(!UO>y_c?-6oIHnTOH zB&xc^NV73N54l&t!}uXs5XMl8O*3?QvFo0I+6tHP(~M`v-)3D@x$qsQ) zEPH-=mAV`cJKRTl1c^6o>lg`atI~C$`%H)^&X}!=PA6(D`OU=!+G4DSnt5Oea3Jc~ z7xIlI?&4by&X-oBe08#g5?gtdK161T00C;cg38L=*U-Y}L<9CL(bYflrf{h9crlsr z0uUPb@0QcgNke1U&C`=I?6S;RaV!di`)2x*R5CKn5m48eC)HmgThcb4?>&4qot--p zqI8m4QsTVA&v|F940U~_ftS@x@WpT85gGR>5VUAGv3bTu-Oce~-dY`)9Kpq&RJQ#M zF&~zDBcpx|fCP;RxroY{n<%GwWBp`yZdirR48K)~Q+(ao1mrONBBcY4U5(5l&Pf<% zJ9~^H2(#{FkL-)g4UVGXw%g~_{We24t8o~E+Cg6Adl?3?NJ?!zk9I<}xuWuV_97n7 z9t{=N?io>(g{J;26c{e!yPVcFRQu9#V}Yf_@A`?0UC_Y7oe~uz#Av)Pds$_;WG!E0 zvk-fz#}wjrIE};g2e^RyR{XEVpfJrFvudcovFCgN&Zat45xTe~LP`o)Dbbfq$4su6 z(wJw>#G|>@mor!HHM&mMktDQwCXAF4fa&>f^Xed zXPLL_@wY;p)z)5k{S=}1- z$H~EYxz_Rh&|V#HU-1zfhiJ?ebbIG7m zLCS(Bm++=*WBW>tw;(+wnimMNN^1=^5 z+>ru7q?RM9YOJfrf)B@c%h0YS?Vf~%SYyQX&_^v=0(Ywq`<3lJX9$KotXTFXlLRbR zTdiz1X@TBj4cxiy+cM!i3Z6W)$cOxINQZ}r8N!98^yn0F*%S_TFxtD6ErJ3OL}(bHPMKJ~)@xs8R9t8)}0t7bldBhD(= zq4h_8Xy1&$#p%9(mAYSRYv*U1(-z%O@7*6(=@R{!c>t+#KDQwro~jVgxR~lC+0w5JoDzw?0SD`4&QpfMHC}A=3h-R7k-fKOKT_>`CFU8A^w~6xfC0p>LNSTNwB1Ky0d6xTZ(~;<^=z05a=LrGU@EQdDR&nvC~Gx zrNlGOLrIT7!Tns;{m1<`oG#6x>80R9vBW};65;d*biD4vSX8|6!45LvQ5sG$eEmS^ zy)@^Lh~99$tA?SyvF-T_SL|`u>HC7cGH0P7HB6mr$-1`hgZ5itZ^fTPhS)KtFX_(9 zNwwUKy-~L{mvfa~ecJNvCHqwQ0Ovno^DSBy%q!1J@gV}u;nB725X^gFVY?|1?B@Qv ztJG3Jj_gH^(hk%!T?7KOn5i!nBooC$tY7R1(WP)KCP3t8kqJLZw3xh zS&QXzRk`vyuei(AMQ9@pI$$VnBwK9wyOTXd1XLN6bIYRzt!&PMucXXEYGslmRH{s% zU1%?1Z+<8~jE-Jl4Z*%J=qa4*@Quah4SBWbomv4+P_sC=1N`2O0e-gLpn1g1d{p|_ zASM!VrMu;5_ajJ8r=_JS9H z(Zf@CVYtAjILLXe&7MY|XvCIs9iFE-@L;kFNT$PKQFT+yIMUj8T3t-*19M-8yA%t1 zlcv=JxFSe-u6Mf%9L2N9*6JZxIQl^(@)%pf)+uu=J{Ngl8z+NyK&9$|AZ5J54iWV` zKq1JzCXDl$-&;rUMFVdnh*eR;4qXJVE0m2%5I90JIrQnGAt}IlOTvC~{lHNt(CFi|<*0J&IJ#THpKLehzeQ?JhBqDKa;QfN1K*h6??_LM(;jp z&`b1Mi66mXQ7kCFeB^%n!ILEkB_}%5*K1I!Fp8;2T=Bd2+Ep&Sh_fK8*^)4gYSSS} zxWm3%%Gi6R5C;OSwo2Iog6BWpu~7DJ8(}}19-7Jb5GI-{=RsD8#A9IBnS!_U$M_VB zRKh315TY|0VR*ZRNDIzVi0y?BKI`o3Vl~X5a;NH-$=dMV+p&)ai}=FjLlr5Pv*IXdVXlBX#TaoUqTc zLOpK4(4xHeJb@ZLA->hL@A2C`;&ps9&pEu_!a!=WCuN=AHCgg9r$TuNZU?qMgkp5{hGi# zURSQ;$C_q$MSPI-LmVf_`;Pyvo>JS=!E`nAsHFXH-8YD(bOql6K!4AvxqkR+;v>X6 zkGChf=2m^Cko~}0wfS%dAH5_Zl8}$s@;`nI`3j)jXuNAHnSHda4%42ueB;u7o4cHn zYiK?9G4B0sbT`+L-vC#e-xyb4QP_H1FG=q3A!C&t9Ywf(M2H1DTPulFP}Mb*cjUCK zB2IpXyRQ$z?VB=upGJU9bSm__R+qB1pJb3ShRh`z__Zc#=SI{8k8);&a_kQEHK8@O0OOrCe>`7_@*yyXgo$_*x& z7?r?$Wxhc@Q9ZtQ+gH-`P5{wwGWM#;V@K@?*Jzz74Q67(WD>m%;M z-LArr!P>UyXhmJ9T{Q~BE~X9?fE62SQu-QG+AbCIjkn+%x7PfwLGMZmSw`ZH6sqF8 zfX<9{YU`X$$s9ef2(7QC-f%Oltb2wgx8#dQeX(+ks=9Xf|L`S_J(z_A8DD{4Rlf&Y4{mIaC@BBH%pjwelX)Idx zFHStZ+EV=C{Zee+{Fu_wiG5R)UCc)$K!2;>TFf zBVsl@zl&JsK&k{y0*hv3!*kK7sg^gG6&_Us+x4e*hW9BZZJ*%E%1^rTw7&-!t69uRIEN|lp$-~PY zPcf4YO4uX=!2`z-ebU1oVq>4kB%zb%k*X0Ia!GSLT$q{ z=niO^+xlH_RvD3st?m&06w^}GmZrIC_pC@`c@5cD%>$65BBL^$PCP-uAKgFWp59mJ#Q6Z6cGyJ|_7zk&PQGTS?bfrexV+aYBRE88`xUpVO5uW6 zyc?Z6{@6BV@_^Mi-D-~6attv|6l>GNgBk#%DBc;S5}(7Zl@A+E#o_$~XA^o4B&C;WviFc&i94pNvRLoXPk`mNzNk)LjXlF0ZY_0`iOBl;KR_IPF#CO? z_zwoCPpp0PXDNo@{kgC`+y#%HPBDhx7i!4Bfj0lgbYnRcrQuXWmA+NmTGHb_3k!wW zoB)ksdIeOc-V@7WMp&2;BN#706|JC(_FCdp$OWfDpYmqklnZ=Qw!M%$fF2}AquG!MHAQAePWmxD|b*Ko)ZGIH303;=fVRn9Rn#~e&dNHOq% zIH=4H?>JCGoZihi58WU-k{O?Ph`qR7#IzZe8jp)ls?NY-31mcm-V5*i#ujywNvQ|_ z4!K;}?RajRSr+=pp60f}spxtU)3~;~XUa5=NVa87#T{+S7&xA0!!E0;?Eyq01J;l1 zR@c43AZKar`A=O}V1u#$KCfRL^bR2>8;Q=HbY3=dD)yxGpbGGTdgmN-PlKOgu&7-s z7mvd5?@A!p7%I&BFP(v*ZrmaV#3}e!WGELe-pin*p)q0?>#c%H-V)&x5E@X6z&!#q zf!$9}@QWr~aw_Tvr=n&~g?>6}+3c4=uj$FZVu0A&`d7%e;QEc^dJb^CC<{cpy-?sU zkQwGTy3KA&A$$F`lj)RI;`_(JqSwjSu+0sy^VGb?(6jU@hhzBEeM8S0gb#CLEbcp# z#QD(Zp>7-r88bm0TWc+EnMP^0i2R7dViWF?nOjDHg6E58d6lD7?#7w z9M2$MlzUClEkZHq%Dc$)$f;a-7v(+g;soGv1Omo_&uB`o$2_4TU0Cy(6(1wtf35PH zc{k4rC|s#sSCbjVH{7895ywO!4SnPQYQeSW4B!IXmO{45j$9T1o_EumrJoEwk^8_0 z0D%f3$tMvQ{0CER8cP?wX2utE&fHH1L~!gFzF*PV(y2TXXl4rOG%FY%F}=o2P2qM{ za_OYcf^OIP-R_2G_DlV)R1JR|siq6h>>S_CxB$erGh@RUOvHGxqMK!XOVK0VyOH*4+h(MT@2}R_*wgmuhR*r%SB_gs0`A70_ z*8rQsQ;jxAEU%}tGM4>Wu`O-2Kg&DB0CHo0)=y>~f%PAY-cw=;EPBgE!A0%mi6qDP z6JzD)BkpU^%1ut@&n<0Uk98!Ob2=g3x5D{BzlY5AQfRx(vh!Ub!sZdpPT94;j68p% z7eML$zM_$x=%t-P1#ffIActqq2AG47p*VG@P>_*!t-bnKnKG0Qoc+x);xi_`dfnCZ z3^u-i3Z6QnE4uzEGiE+0(4m5)NTN^NBx3@(hdDgId2wx z!Ec#{bmKT}Q187^n59?Fv{iUxLuxEo$5arb!W(aApK~;_Hga|6Gvke6RAg{Af?yu1 z!**qKJRmIa-?8p-N5R>i`Hd->8z|6YyfJF?FaamzW`M4%P_eG|J~(~P^Nsldx< zDk!?dCL*5YF^t&N_j%5I^2LcYt#SKsqAxADY2DAk#hK1c1$ zQvu!MzKy^==~+8UXi~1_Qby7TK{y?sD(3i&uKFvijSisqgZ_%^e7E*jc-g%UXd-3X zJkSCCbNs&?;M%pB8c)u88O+f8ym~u%uOqU%LBxOShX>DLL0Q=r8txFJ=_z^Y%bUk% zmA$ai*9A!}`3(h2NY1YU^Dt~}J1OmXdj$Nj25vP;7*&N zm78(lnFa21_5tqms}C7&2O(h=ze6E5=JG9s1jTVw0MPT%X=DzdY{yv5!1GZ`D~!N1 zDHSVmPbCjjiS)9+ZZVGVq$Sc@L=zr0Zd-)*nQA`CWff)FeA0>J4y8v=uFkr~I z;!(7pGvS4`C#Eu{>7IFX(?{!U^7{Ll#c$Y^_EU-vun20j8hUJi>nR24Q#>0zGem{T z2hNHQijAv}x?QT37t1TwS^DdC->Wm~IiZg0pOtinKP1vVwY1U?wPb9ImFJV#4=-T= zXdklE+TzY4S?tgBMZedTY;=s%w<0C-&4f5hd^KTS9DP>(p{@90YfuC&odV z;5V*~!S=gA6S>ifP!CX{$W)hlQXQnHd=APdQ9ihRAVZ(;3iMFqPOffm4Rmwq{ajc( zo+&D9x$#rhZAf#_Niw9xOOn5YJjD$(r?QX?CL=Y$O8V>tFW`gzisIT|0YG0CzI-a~ z@L||CvvM-@NohW6!j0irzT*yJK(zCY`4Aws8wcMHmVykD~ zn@-QM(6UmTlfe}6VKK4-6rR4=W*{FTLp$unwD?SSKC$vqmpq(F>5Sh}xVFu<%NZCm z5HD;|N1=FYYXrUr{7Yfzo~H*f<+Fb+JqLbct08CR0b+jRDu1#r${cO89kYcbH1)Fd zUZ(nIUmX46<6^)wk_QMh*nh;C|2nIo;KSz7519rtEqtSfxdJKV!*cO2&SGw4TloT} zyIX(cA!B-s{&o@*jF3_$`$EhCg6HV48qi^dZi+zz{rV$;Czv|Dgl zP!idq`6^e=>=P=V`OK+Scb!4n9t{zoO=o4CZZb~$)WvGQ0-AT+DiHmhC!+`$CuMx= zr$Bl74(Bf8r!#~3QH^C^kK74Nxuf{*bUYjJqhAuGd3U113#dW9JrZCM#HrA@c`pZ3J88T zCJ;0kWIm$r6(WcZ(+rnj4z?*n+KR)t0bNAQq{89iV=ABH?BlXe%52<=C=U%}LlfEM zfQ^KnRq$ft28B(7y+-~Oh1efKUcnp`-#tBki>myq;NCqUrIaJ0CWda`E-dt-;M&KmjoN0sghz0*uGnv7JOsp>%kB zs{*pjos%p9{XGWUEG^0C$!LYQ3nGy?xuT0Gjf3sM=VU;xiG0XVKDF}E_%3$Nja-Ca zIL#dtFSvjVw67l82cx8z>}X9*6^lOjr+gkPVzq5j;Q^)mjl)i}7<}$%GvBX#?yrWu zm+wD%tu-r(pj%KM2Sx*wpBi)#HX9&^NC6N4T}0uq_VbbTgJl)427+yUl($0hT>QE-Q^3!czd-S;97jA z^ec!%=FS{4?W0mxYX4Q=)YrdSkQk#<=1!2z3$*&Ls_X5&NWLckgRzMMZN}}~LTn^+ zzp;US4_W7yoHLVcb4CUh7cNym})FK=NnHaeB-oN zK42j86Ta~@^Nsfh)tB_jH!c+4m=}aK_L*4_o5RQjB zyu9uG$0{Oyo&WR0&IRN*yxMgbp%6>=Y2CN^6Mdi4Kzw8S$TzMQzHzbieX6?gYVjey z@r942_{M?a8>8>jQhlE>`aVH3&MiCUn$@z(7JnjglJ9$9eOcaw1aUgCQzI;~O2-xI zCZV|ZQPFV9#J|=caAi{4jVUXxKCke*Qbj55PTcheHq~Rx(-+ixZPHqt6yMke-xwX_ zBiO|j;ELVMH9Kgrb#8Ibf>*9CqI`|ez2@k57Ai|p)_gH#+t zu+CBB22!M5$=Qjc6?q+>`OI{O!(z}SI2$?m#()^3g&K{=I7658h%+AlnMXE#60<42 zQP;^`+P^1|lW_x11>Qye;ke?#KR?~QJLP~+?dUU>+R)|qqBcx%rr!x?Mv?a6G~_-z zGc7sM>!s^H=f=`_JWVGCb?KlBzy&%5&omB*()7P4hS!hj#@cwEQ5JZYb(GZJ&2p;N z1~K3sEMe#to?EIPUI+2s*vfv9>&bf<(VkG z%MWhVMr;Zjm-R5J#RzFLLJUAL*u^>HAvGSq#!6uZBR*ZV(A>qB9>y`oyzOGyC9@QOPrXgWbZ_#CkLyAJ0^k!J@{Ox3vXs z(ZznUi3P)NXSaY~-1NcsU;R^oe7jNeBw?OgijE=vk#W)h-mc<#VSAL1jZR>G^)E77 zPb|yvZTq`}yxJxp7Xmba{bUrofnB^kU^W_0#$bM^Vv%sU`IR?T<<$47D%@qp!{}Q=jAO9()<6Zx`S#M5 z*~>p;U^T~1En{Kd;tcN(bDyxjXqcTF&ZXfjuLGE@dECvl7!yICU9U%3$mJ5lB(^0oZ>o$%XsXS{(?oOgO$=Tw;2ITfE6 z)AADhtU3ATxYMCy_wh+5uUu#AGG;|7&(vPb@-mso*jfp9GEjl-?t8Kf{~D*_*flLea4LMBh%M2PGmU@B^fn+7;{DJx~y980H~_&p@hlI&-UU`cMqKl^~gwfMa4%3@1Z;l>mm* zp7|8YC)nip@9GAeW>`2CjlrT#j6$qDvx#6hY@e){--g@_TWlCl4=mr@jS11C-*_)R zeEb!O`UmvzbNu0GLT8_9?EMcK!i_Z1Sr4puLx!C1AON(gLCV_rFw804C?Ec6)DP_5 z@JS>XREmZ;6|=Fglra&fqCvTM&)KS3gj|9V>x7c!uxI6qP7>c%3S-K zQ_*9Cv!T!;PkzMMmz9*|v_{+OuGE;1ZB}(z^4^x0Hl^kIkorx;;^UR*s7xRBmM0n3 zDfNhRP6aAsJ27)AI-w~}#jJZgb1G~*;($0;w&lCR4j~kMuQm3Nh#6@YirtlUwjxF_ zdKE_R=?9+QiCBL42@0_?o3vYI?5v#at&QnqB9cZukp>-nq|u{g$)q!nI`|b%#kg=P z?9VtAJip1$+SF$JDW}4?;8Yk3r^1!X9f$0!yGG;j-BL$0PFG8yaIM9dKq4!MLF7-K&gT03 zEMj$-B^!X%a!?n>mvmtqeGZ@MJKSZtWfy#7^Nn$=37c;W{)qS;f0WAe{8v(mD18p` z0iN2~MA{AEOU-ppu1@L8hB@6>fd6ainq0~%J2RwDK|U_|jJ2tI_JcRq=^1eb8t;)r(oC;5IDo{5zlbKU-sLQ(|H6i}TN!F^+E(*iE>LRw@4U?I6JzHhh zWD3_ph7M0L?slbcWPIMR)|zvMS|G1LHwY=tA>|OrE999IpVC}CGOtiSe#q0+r7-9{ zkuIKX&$@UpJdYZWb9o86cy?rZWhR4EJLjd?LFL%j?|c(bB{WESFB9TCukbCI(1q5x zo-DC>2PEQaR`V3|-O|wJu=NnX8mwq^<_{6Do38TNEVx?C2)-VYzKV2w^;j2AvY|208g3-Jp5@RFPHOo>>_RpTS-_&K z0Un2pS057Jl)qX=XSQAXn8La~P~CW9dIKtQHOX07W`NsjMj!7hsI0G{jbqB`*@s%r zfvp>o&EYH{k%|Y!r~1|TPUf{VYdSOOZsH9 zPn-ElY?xGsyYM0N9dGRpdW;2YMi{6YztpO3oczb$nXWmi;{a4(gE4E^352i(>iyqv zBpa%dT6(6t?~tT!@k^gAcNgH;l8}$&#;K6Rso*`tFBz=B3dO1DSx0Q~OMM^4v#0!7 z|J{0L`RMCR(xJHV0EbKM&L30TgYpODbzd_nQBVums_DG~E0_jW^gV4{F0jbZ0#IGN zRiLeG*55+!v&(#Hqy?3y!^K8vgG==y6CGeKWvaKg`3-+uB|xwEmOykDt{n>O6KL@ zQMo2Mm}HG;4IHQ@Q#X1jG+-57poCy7EHU_Zj(Lkr7DUW_n|NNwGpL-}V&)oCoLfH; zjh}z=J&k4S*){tlTSz#6vVu}9Q}Yfzg!W>xz)|zA(DUw$^Dd+Sa_iLYn~t7$)J5e> zaNeQibc9$Id(OKV9U9^rU&oDWbK@IR+?e>rD6D+rZsi--1vJ<)*Y$Yc6+*O56H?#5pB(Ork{ zwXDN;jm(Ftux4w4k(HW?V`K@4X$Y{34qBjKP|eL|&^oM9R2&kprANW0QR#Ul=kz!n z2kfznF{MT=*Y}oqGt{ zFLi<}U!XcgV4Vk7efl%v_nc&#Qpg|Bz8m?HeD@W(aG~vt8;bO;ouTu+y z&Te&_FX;=Kexu_N8fr*Z!WpF0^dYX4W+opy!~KlQ&ncb592 zD~5Uk!|c2{_K#@ep5Co)!D#mIh?j?(&g`zjq6D#J7qcs2z7@nKz?ERztB$vivzVgE zZ6C?SLHpc2S|nVxc$0^FaRf>bY08uUBs{=QL&)O)QeK&DG>xy`oxSR4ZTO5VXFq6M zRVCiua4J+zuKlI(s`G{-{xDn(2*3S-_kZpU{N+V3WEE`=C^LNfU0KnUd-7oWER`#A zyE;*MyB^gMIB?u&sg6LyW8oFJ1yB66yw}OVQ~PY4;Xdor&O3l*s;WuD(oi|7wjTDl z->EySF_Nx<00ohE6&PcNmbPk%J($c1tkWsLmWg!2hk66%;cs_`gx7&xI0t+|rX@}* zQq<}+!VCY0>e1#ME8hGH{=u){tbgZM@EgD40A1~9zk=u%(VJi4c;It?2P2OW?JiX? z3f{p%z9b9f?V_cfLS5G)*}6)3**F!~;EVf*N=$D4?eDXZm(X?42^rAS5VbR^d1vs8 zaw%+|7Z11fP_SfH0L_7b!35c)q~aNp!M!(9{=_^%?WO;M&)gF ztyhz7A$)`JGg?EzPSsH5VWD5M?X zDMkbO;sA3?pyT4eP|!N_pmZ8gEom_c9A!a?i;R6nTPo>}EGilXWwFbzjPg3b=!H)3 z=nZsZQybkE^41bWJes1_MOi?I?c6* zeMecI1_kNj3&n(;el{HxBsaGBUBAWeq6doKeY^t4@BXj^bK}U+<<6N-p@o7N9Jzb~ z+<-Nj5ghp-bm8>6g(XJswW^74>=S@7V>YoFNe2beQC$%<^&qT*V26~2RCH9&H)qHC z%+S@%cUV_gEDNgQsEaOEQbsuMNT4XO`d&d@m#rS-!+fv! z3)~iOEk(f^p1*MDug&7GTlcYLy($2vV!}uI2pcg7j#OhW!rv3Mq^Ur`(>iO*g9aA2 znrZ)%&!VnZ;Z{cp1RNnlmW0p%RaQ@R&*>u{xqGhH>-~0G zC%qH(avt~!YqZPq7pjXV6Bu4j;Q5ycZG=JuRN^(4o$b}~T89e5*0Ln_5|xTA6^#jn z2#3dR?i4n}GT!61t6~B-Lx-j+ju4zOPc&l*;pyzc5xcB7!>+CZFN-ahiV7@J&d2nb z)`j1$OxXLJzM01lo$eKB28BO|j!GeZt&2ystrfyTu`IMspmey8#=Imaq+TM*?WIxu z`Z3-^|HCCX#18Y0b-eyX+!)^C#+SFaam6?vpJ?7i4$ppX#3VInaR7|=nLZiwaRJfSp#+eH#4)2R;KVUHVFyzoIWJMc9 zVoYZceV|)}ZdsikErevKKeyi~4t0rZ`E_bu0GO#+A@MpC%j`9#f=qLTW(x!`P}?Mmh&To=6K~dB>Uu@{a*|Qg)F`i z#0TM)Z|q$w&s!#FzuyzEN;*l2+a?Kf8qE-t9@t4QP_SUpT^8xgZ$el;dsPzp*|^`} ztQiXkYmC1i5#a2x1E!N3?5%~mZgpHspfGP;l-}-r!MNvCvD00?{t#9-E6KU{Wu>@V*vo}qC_ zdtSETixp8Qh{(GYsm*O4u_jl)F)EUn@EemkF_`9+Z|oa^oFo0lc8kE2i{IGPp}NZ~ z!e_4jM(Io1oq|!crkz@*E`^Nwx_{+Vl#){+e1Cy9UKxMkRFI;+9NQeM;jmYlI9W)g zlYBYc*})BT+BbXd!X#w|B8P(k&fys`4d5I1o)nCx$56(^dKDTP3Tg7*78aX^3Bp{3x!@{M!S-8L`yxblrJ zcnUEgjZ8l|=k$YAKWxuOn<|_9EEh%K+xebf{db+SKnIG>zTJ`T4ISv_zq|2`olm~8 zxN}|F+5?5@K$a|W#TsX;_LDgxupwglrNZBxg6^Q)$RVi|e_Zbpu-f&Qod?o?QblhE z=omcrQd7*YybKlCJzq3dkA;xGY5@OIb!g&e-9Iw6=Y8H}ocko>+{ud2_K|LqigW+u z8z-0jiY-_B72`cQxPpP$edLFI?t+mlx9DU}Mn`XdX8Qr1ZBLKmeLcU}Sx|84Ekglr zey}&Oh1xT7CC&KCH;&-iLitvdx^rvrjVC409773ds($%-)*0qh2R?7f0^o3yYP3uT zo=O^1^^wCax83xiqpo(YcRe_02DgfOS78sRo8MgJ z-#!cE-o0)iIXU1Pk6-x4#g%V7T=~YiJ>K}nEVS(mc;u%p9IeC}mz=GNX3RzJgOJp@ zpM2xiY#CoJeB)mi_~Nv(aHPqFc}%}?FzWo=ov<70hsIzQEb>c_&2&nWKYB)D)+{|O zoYiJ7+~xF5Z;;j5!z-V=Ev83FIwA{t08cKr$%>diz(C$=mVj?;lNHg~{yw3SO6QbJ zvw;KKp6oY1`O0sspGFqb5m>gaBeO4Mz7D>z^DE!@*9GB>p#~|AzIjZ)aYcp^2itCS zoO(BXd2Sig%@V;6nq`y5H<(Vu5)xB++pxo-DQmDy~XM!B4Iv@w$oSu%%|3^Y%lWfDtKCP_>Jl}Y>#!9|Bhz# z)4tu#J<3CsF$v&QEQPVpB!E+KmYj<6BBbRiT*axVnU%}Hto%WhcWq^rvUY?%ES%grU<_+j|~z8*C2I0QO&Li8=Y6Rva@BUK4KA-@iB43VJGWTDZSc%dMT z;`a^(@4%sZBDirXrn{6ancwwh?La1lg?*I&z32U)kDdkwMFALv zZ?Ck1kCx}(vn+ZV;+QilP6g-|38F>8spy{0Md1jktH%qcA}%kSiWQs+>R}By6-n~o zV=7j_kblXKdF_QC=}-#4rDIAg(VuGgyZN3Yq_8XlA%|p6Iy}ka;u?dWvPg$P=g-3J zbPaU@|KLG2*7BGH&Q9?;*BNC!WZF%Q?W;|G$f}2`g!M!Pv7WlB#gq= z6{o^EN#Vjb{`kNUI29icLcl>6RzE*RE1Zv-j@xIg;{>uMO1fNeB0M4c$N=v~py z6Z49m7Ih5ug++5B#z_$Cps{d{U8W5UJI8atvZ4Ni;$X!3`s1$rY1h{W`W-YcydbV| z>DjO8qUZD1AvxK*{E>eN_cF)&{hM@99sJx&PDQMo!&4axNv?RnHy&3e`Nl6+i~b?s z_@)SWZti?>}1`UQ)niHLRj@o(PR15}31)tYyqgPIagDE%CGq+aE{QooH=k)JgRO3fc$_fVqSY@x)Hmoq zYwqQbxRu_$)g8O_?DunCdduJw=1stM)Rqk!&MaAWmU_-8DH1etpYxG_CyY6Loqs|w z4$>k#PZHQg7OXM37a^kOjgtyxU|b0ozVT1{zLFXTYO7yv{;!$pk#PZ0>oMaN7qFrl z61^`Tyb4pxSrF45@ZfC7q}M^CUp419yacP`hhTYmp6{$I-bTySA$%+b^`xx-SOoVK z=veWMU#k}6xho@Lcp}}!@>@jTs}k;F8p4O`__~d6N=1QmH+vDyW^$oBxvbahnWU{D zdu+!XsY8rTA`0hpwocmxD0|@rtbjSdr}~bGWdkq|q{s$=^c$O|%TZh9lYxB4sjwoj zbYI$(-`G@sW9va(JbOGouEtwPY0i-TMz)TqoD&zz)}y$y=J|AmGt-WC%t>veziqRK z9eua-ZKeA%dMXJ4dq}xm?wV<@Z}{AKJuU85(F%q{V9<;uutMP}?)k={q9VW8`5oNz zjg5zV<2T?MAfrvCwjmELg_46DH{{9%h-ru-K|_~ZIV8>PRX{`4&Mc(K$$y2U&C0|& zEn`3Jr~R~lwt(dE&Vr<6BF+P*B`Y%^OdZh2IVYh}JrVU-#qjEYE?7Xj zd}CR;(f>IHyzIc?Qf7eS#??VH*VV2@38`T%@#bUuDm0nT*L%Bz>n7wJ$H!h@~ zWN~Ui@uNTfb>zkyO9!oKY87s6SIbCvcW)!HV$mNGR-jl7FhnSd3 z@CbF-Zpc63e>a?0)2;#&VNe)KoHGH|HIn{!&LEbCiwaTJqy;goWO3PMr~v${hA#O& zM0Uko@gbeNbNQg9#`c=mpjvaN+X=RbXR9Bp4Dv}%`yfCc?yJ7Bnl^n%gf)$UDMKYT zIH~~$DugF@%y}T|5MHlf@&nnkAP5fK^G!Ph6C}v5vmlO+*lsc?>50W*lgo`8`v^1_ z=|`N1JYI7(6b$m2jvl4;8Y!C+EPIGZ-=vU)vjbhzvDmIOk*W!>Qor`NbPIUP&d3`N zOAjOW#-NcNbS)jdy|=Cf6?W_Jc&whOv3RLlY!ah(NXu<8BDt!ee}^f=GYyG!k5Y^) zf;Fz-4cXI-*;>%p(1T3teV~JKuw5DstM46#AiBbmUago72EnSF;8px%0)F~8P8s8rkTWy zNUp}?EH|1 za9$Rap0Kf2EQQuXL*2oL?6&;KAf)y|jxq5o{%+8ymN&v$v75K3dNTI2o@~`2YvJl) zJz2QrJSf2m&l?#&bHzDP^<)cA!4A33s-I$#k;E8=BXoR%$ZoK4cn_)z-Zm6NPmj`! zP5iPSqek5vNQv9rdUJ<6-!*`_KE?t^cf2Gu9O!VzP=iR;se(^U$B(gys&OzyDZ8#NKyf zr^JPcnEu<9rbJMbc=m7KEZa{|f=1wfG5}i?x{mg*L3DJ&n?DOW+JQ45fsE(u(BLPN zJZJ6kNVB%*-?1(KPB$ONZ{Hx?|*Ypx&`gljj-n>B#j-(hf`@tm*>V?EU~I} zUw7_DTrpr=v3RA7E5a{v#gVAVyG@5xr((-DzG(Ko9qfs6S(ZNqYYwHhIz?R@n>#Pd z$U^UgaYd$c-;{4WN{?ho=|WN5Q?wDawfE(Sln3K+ZJ z7E0y)cE;pWyw;mN<&baY{*{xn^~IC^9apKyIr?|b zJNz_J&=ba23G_0IjY671DSx9h5|Bf8Gx;x_92L)EgS^$S;Hni%{wD-vqlg@`w#ib4 z8!#Y|@u6Pq%VC72oO@ACG0l#HT}gOXFmLGj+ad#^!gu19@A+y*oKj&u3;P z|CKn;BkD5W*ShWg->~E)Ir^EUz8`~6jI3F8n(vnfcF?oojLj!~NUAfqxXoGf)x@#y z0B1gKm7O1kA)GfgV_~7<@kFV)r+AA~`oQI8qU0UKp^TKSyeGl13LTqp;w|>Oc0O>L z7^WYpyie5`0X>4)@OJM3aq#P=dy?R#g|q${9Lp0*AMCr~mlsX^bH(4)w26X{*Jh>< zHaVCi`Uuj6YoZdBag`3>jjAu6!J&}T@Ubv2qqZ*D|EQ#SzupMDcE-0m+~hpEiY&dH zB}3Y29=^&gLugg!6k|p3*-n{~r!dg-JZ@&66wO(quU!6EZctH5ti|ih4C;x_TP(r( zNu#eEoeBr)>I#lcGc$vFA}UG(*OQ)CO~M?r2G5Hqu$^IWi8h@I1D$|9eXyO6hB$j1 z8(!HYK*eJNtxl-cE2Du=Ov`oWp#p-93J4~y&}`jR-eiURq~p3Ham>IS9dK`kN6`&d z>Zs1OIs!}O)-EcBJT`b5MpU?(yb^p=l8pPryb^;aApNK(Te#98GkKo|Pk=vlE@Y<> zf})MF3!W*PHF$oMF&Yxj;AzO)GeCATfrY^{!RCgFi1XCE3WH|?>&arOOMf|ow*eNG z#fCyLcmafAPz+wM<%RTHzN-6Z6`g^><1y{uIwL4b*}&lcJ!VnQ{R?VJbMsydo{n)e z@4(WYq=rjU)3W-Wq=a6B=~M+k~xH P00000NkvXXu0mjfMTf7e literal 0 HcmV?d00001 diff --git a/img/bg-line.png b/img/bg-line.png new file mode 100644 index 0000000000000000000000000000000000000000..65a7acec78717affa76e1d69b5f216fbbcd4e58e GIT binary patch literal 16004 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 A;Q#;t literal 0 HcmV?d00001 diff --git a/img/bg-round-2.png b/img/bg-round-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d54e4f9767418c1c58e8ef5480b5d1e9bb9a9da GIT binary patch literal 17336 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 T=1n8?z=Lvg@uHQ^TM_>sa_XAS literal 0 HcmV?d00001 diff --git a/img/bg-round.png b/img/bg-round.png new file mode 100644 index 0000000000000000000000000000000000000000..634af538644cdef556deb49ee2adb95340f83239 GIT binary patch literal 16400 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 literal 0 HcmV?d00001 diff --git a/img/team-1.jpg b/img/team-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2f5774c2f48aba0f3ed3d3be59461bdf8786a4de GIT binary patch literal 35525 zcmbSyV|-@8v*sJy_QbX^v2DGvZB8<=ZM+lPwkF9W6Wg|JXEy(Pckgfa>()8nx=(eT ze!A;CT~+7b^1p2Ws;s1pBmfKy008^C0RPqiAppq#5ol;AXlPiNFM&mb`;Q=EAR;4v z-56+?s3@qIXv8>JSUALFLj#SA5rp)BzXa6(3o1HkZrd8uA^9U=556p_M;CWP$3f~-ygkevX4?QHe2!MGA2TwMjk@SdB@Yh( zBGmfu!h;$j?%n}dxWQl$_@W3%dY0>HokC_T7Rv-WOS66(03INm2BQ=^x0N<;snDkZW+JVJpG z8LSsTC`Qy}ni3O5OradV)C#*+T@h(=&(&(Y1Fw2bB}xS{QTAOAEU zCV_dfDoEhGX4as6kcRz@YsS(+JfF>w@9F1FnGRh!wXyuJLtGM-gT~) zPqn~#7xTTmU?xYXQyC=p`-y63lj>{gB8!W^CWKqSd^nlAxdtPbYyCxZ z)+LFsIdNaTF>b=s3NbHqmFAq@r%&;=x_yDC8Qz6Qt~Y*4qx*K9B=vSR&!SXG;-nl# z001(^)aUo2Y4wZ3xpV}|gdC|y&#Z3QmnCQZ7PWLsZ~NR0{Fu`sQgj(MOc2f2uEH1+ zFw8ybvh=)Hd~i)0xpNfmo96KGFnTnd>>wf;&B=T;Yn2wCm0?3Inh^#dW5(L#@-@P#P{E>E+Fd? z@nKagj(a9#r(&obnf^kO0}^DmgoGt-OBMRxZR+o9D$&bNxx!O5>Jf>sned`iIl+DX z$)U9HqBvP{y?&PPqo~{Iv>YzUC!U(mlqz*5K~JLA1}jfl;Dd z`@6g80#lS*k#xwH*He>^G>rN(I*LMuV~)a&AMp-<-uWLukj1GWB3by}V*)Ab)qed? z5Nc$?mkkOWS7r(n=n@o(5>n?2L0*5xKx#tYcM^|#S}$Iy!mY|?D66#y5Kh1ozH}?F zQG3f!C`&-18f<(Eq4G3#*Sm9wx0J1lISTHI-(Zsto{T$vB`kX5z&&%y>-Z_GGE zDXiiD`HuH(63nG{$b0v}Nsgj|{ET4|0;I|!->ncJaoWh1*~B<;YNkMjMgT&Z7J=b9 zoc{!FH8=}*YT2mMwy!RL^A_FjMaO_~nceyjhOARswcw~hE3i?;Hg_N;=_*1c;Zs^z zjaep1>(@0MD&@%jQOxIEymT9XHUF*Un@W+!jd6vcKv8wfrIW3zn{H*!vGB($Wh8Ia z^%dUX^adMt3EPYkxK1CpmlHByQq3@phG)!4yq}k@`>2@hpU`9j|Xc<%QE3C#xdHnqJ z9U&nvIx~peC$o1NnWsCaG&>FHK8&_mO4$ePuQo-uX1+l)!H#n2oKYOvG)^b7zv?j= zx3S0N)RALk|5eAETBJ55C)T4+efhZ^Z@co)s_mk^Y(;|y;`IJ*UF_gUpOW2F|I=V= z_pTE2AhydLFIzN|RKKfR{_E2Kc9z7Kue#y*Qof})v1kLj)9zIJ@u8V6?a5XgwUM=9 zTv#>9QPy?vOB>EC&npG0ITpG89F973(UAAMR=qAm0v0H{RNgCCN(HTXSQ~Fc#cJ)- zYjF%@n5%m?R82-^(}z5~$bRA|v$AE5>a>c3CqwoMAY5A*~qY!Fr!XSxMf{ukPAu}J6kweOI7SmI{T|(&fqzQP&TaV;R;uJ?)@m@5>cPH zcX~kiHx7?8q(p4RykO7TZ_rOKj-9V@c?Y9YjH+KJwC1lD&>n-W(N*3PC4GxjPe*!( zYc$pBHPr*_rxr)GK#h-UotFT(4_Lv;)wvUTQ#G;dAMxsrY?XG5#?@`USFBYzD0Gnl z4_$Jtt^;L!bDUN4FN%W?1^|cne;5t`0u20%b-aV1$sy>^yDbOqc^FVpTja%@8aeX8q z6@ZKGn)0ZDd`zzSD2)J)5!ZB}^J<&c&DyzQgbj${(gbQ08R}^jdnf4iQbScIJ!m*| z-k¨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 literal 0 HcmV?d00001 diff --git a/img/testimonial-1.jpg b/img/testimonial-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ba0d9a54e2a22914bd354d5d6acc6d85e2b1eb3 GIT binary patch literal 3451 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 Y!DltegEGI;!sXlBdNs+QRf@sC02p=Xk^lez literal 0 HcmV?d00001 diff --git a/img/testimonial-4.jpg b/img/testimonial-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00e8eb353bb939f18c023cea089058317cc0b394 GIT binary patch literal 3268 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..91ac37d --- /dev/null +++ b/index.html @@ -0,0 +1,607 @@ + + + + + + IO Cloud Solutions - Shared Hosting, VPS, Dedicated Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + +
    +
    + Loading... +
    +
    + + + + +
    + + +
    +
    +
    +
    +

    Shared Hosting

    +

    We provide everything you'll need to build your website, no matter what kind of website for FREE!

    +

    + Starting: + $0.00 + / Mo +

    + Get Started Now +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +

    Welcome to IO Cloud Solutions

    +
    +

    We are a small hosting business for small businesses established in 2023. Providing afforable prices. Lowering the berrier for small businesses to enter the web sphere.

    +
    +
    +
    + +

    2

    +

    Experts

    +
    +
    +
    +
    + +

    22

    +

    Clients

    +
    +
    +
    +
    + +

    14

    +

    Projects

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

    Our Hosting Plans

    +

    View our affordable hosting packages below. We strive to provide the best quality of service possible. Customer satisfaction is what drives us.

    +
    +
    +
    +
    +
    + +
    +
    +

    Share Hosting

    +

    Shared Hosting starting at very low cost!

    +
    +
    + +

    + $0.00/ Month +

    + Buy Now +
    +
    +

    300 MB Disk Space

    +

    3 GB Bandwith

    +

    No E-Mail accounts

    +

    1 Database

    +

    1 FTP Account

    +

    1 Cronjob

    +

    PHP 8.x

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    VPS Hosting

    +

    Coming Soon

    +
    +
    +

    Latest Offer - Save 30%

    +

    + $5.49/ Month +

    + Buy Now +
    +
    +

    100 GB Disk Space

    +

    Unlimited Bandwith

    +

    Upgrade to Positive SSL

    +

    Automatic Malware Removal

    +

    30 Days Money Back Guarantee

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Dedi Servers

    +

    Coming Soon

    +
    +
    +

    Latest Offer - Save 30%

    +

    + $11.49/ Month +

    + Buy Now +
    +
    +

    100 GB Disk Space

    +

    Unlimited Bandwith

    +

    Upgrade to Positive SSL

    +

    Automatic Malware Removal

    +

    30 Days Money Back Guarantee

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

    Our hosting services come with...

    + +
    +
    +
    +
    +

    +
    +
    +
    + +
    99.99% Uptime
    +

    Uptime is our top priority for us, which is why we stay diligent in maintaining our services uptime.

    +
    +
    + +
    30-Day Money-Back
    +

    Money-back guarantee in case you change your mind.

    +
    +
    + +
    Control Panel
    +

    Our simple-to-use control panel removes all the fuss and lets you do what's best. Running your site.

    +
    +
    + +
    24/7 Support
    +

    Our friendly support team is available anytime to support you if you ever get stuck.

    +
    +
    +
    + +
    +
    +

    +
    +
    +
    + +
    Dedicated Server
    +

    Dedicated Servers allow businesses to leverage existing data centers to maximize reliability and lower cost.

    +
    +
    + +
    Wordpress
    +

    Get up and running with Wordpress. With our one-click installer now!

    +
    +
    + +
    Shared Hosting
    +

    Shared Website hosting with fast SSD storage and E-Mail hosting (paid accounts only!).

    +
    +
    + +
    VPS Hosting
    +

    Virtual Private Servers with ultra-fast SSD with the flexibility to run your software. Ubuntu, Nginx, Nodejs, and more

    +
    +
    +
    +
    +
    +
    + + + + +
    +
    + +
    +
    + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..f0f4cef --- /dev/null +++ b/js/main.js @@ -0,0 +1,103 @@ +(function ($) { + "use strict"; + + // Spinner + var spinner = function () { + setTimeout(function () { + if ($('#spinner').length > 0) { + $('#spinner').removeClass('show'); + } + }, 1); + }; + spinner(); + + + // Initiate the wowjs + new WOW().init(); + + + // Sticky Navbar + $(window).scroll(function () { + if ($(this).scrollTop() > 45) { + $('.navbar').addClass('sticky-top shadow-sm'); + } else { + $('.navbar').removeClass('sticky-top shadow-sm'); + } + }); + + + // Dropdown on mouse hover + const $dropdown = $(".dropdown"); + const $dropdownToggle = $(".dropdown-toggle"); + const $dropdownMenu = $(".dropdown-menu"); + const showClass = "show"; + + $(window).on("load resize", function() { + if (this.matchMedia("(min-width: 992px)").matches) { + $dropdown.hover( + function() { + const $this = $(this); + $this.addClass(showClass); + $this.find($dropdownToggle).attr("aria-expanded", "true"); + $this.find($dropdownMenu).addClass(showClass); + }, + function() { + const $this = $(this); + $this.removeClass(showClass); + $this.find($dropdownToggle).attr("aria-expanded", "false"); + $this.find($dropdownMenu).removeClass(showClass); + } + ); + } else { + $dropdown.off("mouseenter mouseleave"); + } + }); + + + // Back to top button + $(window).scroll(function () { + if ($(this).scrollTop() > 300) { + $('.back-to-top').fadeIn('slow'); + } else { + $('.back-to-top').fadeOut('slow'); + } + }); + $('.back-to-top').click(function () { + $('html, body').animate({scrollTop: 0}, 1500, 'easeInOutExpo'); + return false; + }); + + + // Facts counter + $('[data-toggle="counter-up"]').counterUp({ + delay: 10, + time: 2000 + }); + + + // Testimonials carousel + $(".testimonial-carousel").owlCarousel({ + autoplay: true, + smartSpeed: 1000, + margin: 25, + dots: true, + loop: true, + center: true, + responsive: { + 0:{ + items:1 + }, + 576:{ + items:1 + }, + 768:{ + items:2 + }, + 992:{ + items:3 + } + } + }); + +})(jQuery); + diff --git a/jzgiluz7w2u.png b/jzgiluz7w2u.png new file mode 100644 index 0000000000000000000000000000000000000000..e2aeefba7faff7d5ebc1ad89a4fb5c6e68d7f4d6 GIT binary patch literal 127789 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≷_f{peuiwaA|b-zRSM;88ht_Qaj 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

    6ZlbE|enCw_RHc0Hf=E@LpC_5K6 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.beginAt=num;var isTime=/[0-9]+:[0-9]+:[0-9]+/.test(num);if(isTime){var times=num.split(":"),m=1;s=0;while(times.length>0){s+=m*parseInt(times.pop(),10);m*=60}}for(var i=divisions;i>=counter.beginAt/num*divisions;i--){var newNum=parseFloat(num/divisions*i).toFixed(decimalPlaces);if(isTime){newNum=parseInt(s/divisions*i);var hours=parseInt(newNum/3600)%24;var minutes=parseInt(newNum/60)%60;var seconds=parseInt(newNum%60,10);newNum=(hours<10?"0"+hours:hours)+":"+(minutes<10?"0"+minutes:minutes)+":"+(seconds<10?"0"+seconds:seconds)}if(isComma){while(/(\d+)(\d{3})/.test(newNum.toString())){newNum=newNum.toString().replace(/(\d+)(\d{3})/,"$1"+","+"$2")}}if(settings.formatter){newNum=settings.formatter.call(this,newNum)}nums.unshift(newNum)}$this.data("counterup-nums",nums);$this.text(counter.beginAt);var f=function(){if(!$this.data("counterup-nums")){settings.callback.call(this);return}$this.html($this.data("counterup-nums").shift());if($this.data("counterup-nums").length){setTimeout($this.data("counterup-func"),counter.delay)}else{$this.data("counterup-nums",null);$this.data("counterup-func",null);settings.callback.call(this)}};$this.data("counterup-func",f);setTimeout($this.data("counterup-func"),counter.delay)};$this.waypoint(function(direction){counterUpper();this.destroy()},{offset:counter.offset+"%",context:counter.context})})}})(jQuery); diff --git a/lib/easing/easing.js b/lib/easing/easing.js new file mode 100644 index 0000000..3b9c776 --- /dev/null +++ b/lib/easing/easing.js @@ -0,0 +1,168 @@ +/* + * jQuery Easing v1.4.1 - http://gsgd.co.uk/sandbox/jquery/easing/ + * Open source under the BSD License. + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE +*/ + +(function (factory) { + if (typeof define === "function" && define.amd) { + define(['jquery'], function ($) { + return factory($); + }); + } else if (typeof module === "object" && typeof module.exports === "object") { + exports = factory(require('jquery')); + } else { + factory(jQuery); + } +})(function($){ + +// Preserve the original jQuery "swing" easing as "jswing" +if (typeof $.easing !== 'undefined') { + $.easing['jswing'] = $.easing['swing']; +} + +var pow = Math.pow, + sqrt = Math.sqrt, + sin = Math.sin, + cos = Math.cos, + PI = Math.PI, + c1 = 1.70158, + c2 = c1 * 1.525, + c3 = c1 + 1, + c4 = ( 2 * PI ) / 3, + c5 = ( 2 * PI ) / 4.5; + +// x is the fraction of animation progress, in the range 0..1 +function bounceOut(x) { + var n1 = 7.5625, + d1 = 2.75; + if ( x < 1/d1 ) { + return n1*x*x; + } else if ( x < 2/d1 ) { + return n1*(x-=(1.5/d1))*x + .75; + } else if ( x < 2.5/d1 ) { + return n1*(x-=(2.25/d1))*x + .9375; + } else { + return n1*(x-=(2.625/d1))*x + .984375; + } +} + +$.extend( $.easing, +{ + def: 'easeOutQuad', + swing: function (x) { + return $.easing[$.easing.def](x); + }, + easeInQuad: function (x) { + return x * x; + }, + easeOutQuad: function (x) { + return 1 - ( 1 - x ) * ( 1 - x ); + }, + easeInOutQuad: function (x) { + return x < 0.5 ? + 2 * x * x : + 1 - pow( -2 * x + 2, 2 ) / 2; + }, + easeInCubic: function (x) { + return x * x * x; + }, + easeOutCubic: function (x) { + return 1 - pow( 1 - x, 3 ); + }, + easeInOutCubic: function (x) { + return x < 0.5 ? + 4 * x * x * x : + 1 - pow( -2 * x + 2, 3 ) / 2; + }, + easeInQuart: function (x) { + return x * x * x * x; + }, + easeOutQuart: function (x) { + return 1 - pow( 1 - x, 4 ); + }, + easeInOutQuart: function (x) { + return x < 0.5 ? + 8 * x * x * x * x : + 1 - pow( -2 * x + 2, 4 ) / 2; + }, + easeInQuint: function (x) { + return x * x * x * x * x; + }, + easeOutQuint: function (x) { + return 1 - pow( 1 - x, 5 ); + }, + easeInOutQuint: function (x) { + return x < 0.5 ? + 16 * x * x * x * x * x : + 1 - pow( -2 * x + 2, 5 ) / 2; + }, + easeInSine: function (x) { + return 1 - cos( x * PI/2 ); + }, + easeOutSine: function (x) { + return sin( x * PI/2 ); + }, + easeInOutSine: function (x) { + return -( cos( PI * x ) - 1 ) / 2; + }, + easeInExpo: function (x) { + return x === 0 ? 0 : pow( 2, 10 * x - 10 ); + }, + easeOutExpo: function (x) { + return x === 1 ? 1 : 1 - pow( 2, -10 * x ); + }, + easeInOutExpo: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? + pow( 2, 20 * x - 10 ) / 2 : + ( 2 - pow( 2, -20 * x + 10 ) ) / 2; + }, + easeInCirc: function (x) { + return 1 - sqrt( 1 - pow( x, 2 ) ); + }, + easeOutCirc: function (x) { + return sqrt( 1 - pow( x - 1, 2 ) ); + }, + easeInOutCirc: function (x) { + return x < 0.5 ? + ( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 : + ( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2; + }, + easeInElastic: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : + -pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 ); + }, + easeOutElastic: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : + pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1; + }, + easeInOutElastic: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? + -( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 : + pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1; + }, + easeInBack: function (x) { + return c3 * x * x * x - c1 * x * x; + }, + easeOutBack: function (x) { + return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 ); + }, + easeInOutBack: function (x) { + return x < 0.5 ? + ( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 : + ( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2; + }, + easeInBounce: function (x) { + return 1 - bounceOut( 1 - x ); + }, + easeOutBounce: bounceOut, + easeInOutBounce: function (x) { + return x < 0.5 ? + ( 1 - bounceOut( 1 - 2 * x ) ) / 2 : + ( 1 + bounceOut( 2 * x - 1 ) ) / 2; + } +}); + +}); diff --git a/lib/easing/easing.min.js b/lib/easing/easing.min.js new file mode 100644 index 0000000..3176905 --- /dev/null +++ b/lib/easing/easing.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof module&&"object"==typeof module.exports?exports=n(require("jquery")):n(jQuery)}(function(n){function e(n){var e=7.5625,t=2.75;return n<1/t?e*n*n:n<2/t?e*(n-=1.5/t)*n+.75:n<2.5/t?e*(n-=2.25/t)*n+.9375:e*(n-=2.625/t)*n+.984375}void 0!==n.easing&&(n.easing.jswing=n.easing.swing);var t=Math.pow,u=Math.sqrt,r=Math.sin,i=Math.cos,a=Math.PI,c=1.70158,o=1.525*c,s=2*a/3,f=2*a/4.5;n.extend(n.easing,{def:"easeOutQuad",swing:function(e){return n.easing[n.easing.def](e)},easeInQuad:function(n){return n*n},easeOutQuad:function(n){return 1-(1-n)*(1-n)},easeInOutQuad:function(n){return n<.5?2*n*n:1-t(-2*n+2,2)/2},easeInCubic:function(n){return n*n*n},easeOutCubic:function(n){return 1-t(1-n,3)},easeInOutCubic:function(n){return n<.5?4*n*n*n:1-t(-2*n+2,3)/2},easeInQuart:function(n){return n*n*n*n},easeOutQuart:function(n){return 1-t(1-n,4)},easeInOutQuart:function(n){return n<.5?8*n*n*n*n:1-t(-2*n+2,4)/2},easeInQuint:function(n){return n*n*n*n*n},easeOutQuint:function(n){return 1-t(1-n,5)},easeInOutQuint:function(n){return n<.5?16*n*n*n*n*n:1-t(-2*n+2,5)/2},easeInSine:function(n){return 1-i(n*a/2)},easeOutSine:function(n){return r(n*a/2)},easeInOutSine:function(n){return-(i(a*n)-1)/2},easeInExpo:function(n){return 0===n?0:t(2,10*n-10)},easeOutExpo:function(n){return 1===n?1:1-t(2,-10*n)},easeInOutExpo:function(n){return 0===n?0:1===n?1:n<.5?t(2,20*n-10)/2:(2-t(2,-20*n+10))/2},easeInCirc:function(n){return 1-u(1-t(n,2))},easeOutCirc:function(n){return u(1-t(n-1,2))},easeInOutCirc:function(n){return n<.5?(1-u(1-t(2*n,2)))/2:(u(1-t(-2*n+2,2))+1)/2},easeInElastic:function(n){return 0===n?0:1===n?1:-t(2,10*n-10)*r((10*n-10.75)*s)},easeOutElastic:function(n){return 0===n?0:1===n?1:t(2,-10*n)*r((10*n-.75)*s)+1},easeInOutElastic:function(n){return 0===n?0:1===n?1:n<.5?-(t(2,20*n-10)*r((20*n-11.125)*f))/2:t(2,-20*n+10)*r((20*n-11.125)*f)/2+1},easeInBack:function(n){return(c+1)*n*n*n-c*n*n},easeOutBack:function(n){return 1+(c+1)*t(n-1,3)+c*t(n-1,2)},easeInOutBack:function(n){return n<.5?t(2*n,2)*(7.189819*n-o)/2:(t(2*n-2,2)*((o+1)*(2*n-2)+o)+2)/2},easeInBounce:function(n){return 1-e(1-n)},easeOutBounce:e,easeInOutBounce:function(n){return n<.5?(1-e(1-2*n))/2:(1+e(2*n-1))/2}})}); diff --git a/lib/owlcarousel/LICENSE b/lib/owlcarousel/LICENSE new file mode 100644 index 0000000..699398c --- /dev/null +++ b/lib/owlcarousel/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2014 Owl +Modified work Copyright 2016 David Deutsch + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/owlcarousel/assets/ajax-loader.gif b/lib/owlcarousel/assets/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3962f969930b0a5cb13fa079f273167082abf68 GIT binary patch literal 3208 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%0A;2lG!!z>8L*~z#POx} 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 literal 0 HcmV?d00001 diff --git a/lib/owlcarousel/owl.carousel.js b/lib/owlcarousel/owl.carousel.js new file mode 100644 index 0000000..c1d3ea7 --- /dev/null +++ b/lib/owlcarousel/owl.carousel.js @@ -0,0 +1,3275 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +/** + * Owl carousel + * @version 2.1.6 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + * @todo Lazy Load Icon + * @todo prevent animationend bubling + * @todo itemsScaleUp + * @todo Test Zepto + * @todo stagePadding calculate wrong active classes + */ +;(function($, window, document, undefined) { + + /** + * Creates a carousel. + * @class The Owl Carousel. + * @public + * @param {HTMLElement|jQuery} element - The element to create the carousel for. + * @param {Object} [options] - The options + */ + function Owl(element, options) { + + /** + * Current settings for the carousel. + * @public + */ + this.settings = null; + + /** + * Current options set by the caller including defaults. + * @public + */ + this.options = $.extend({}, Owl.Defaults, options); + + /** + * Plugin element. + * @public + */ + this.$element = $(element); + + /** + * Proxied event handlers. + * @protected + */ + this._handlers = {}; + + /** + * References to the running plugins of this carousel. + * @protected + */ + this._plugins = {}; + + /** + * Currently suppressed events to prevent them from beeing retriggered. + * @protected + */ + this._supress = {}; + + /** + * Absolute current position. + * @protected + */ + this._current = null; + + /** + * Animation speed in milliseconds. + * @protected + */ + this._speed = null; + + /** + * Coordinates of all items in pixel. + * @todo The name of this member is missleading. + * @protected + */ + this._coordinates = []; + + /** + * Current breakpoint. + * @todo Real media queries would be nice. + * @protected + */ + this._breakpoint = null; + + /** + * Current width of the plugin element. + */ + this._width = null; + + /** + * All real items. + * @protected + */ + this._items = []; + + /** + * All cloned items. + * @protected + */ + this._clones = []; + + /** + * Merge values of all items. + * @todo Maybe this could be part of a plugin. + * @protected + */ + this._mergers = []; + + /** + * Widths of all items. + */ + this._widths = []; + + /** + * Invalidated parts within the update process. + * @protected + */ + this._invalidated = {}; + + /** + * Ordered list of workers for the update process. + * @protected + */ + this._pipe = []; + + /** + * Current state information for the drag operation. + * @todo #261 + * @protected + */ + this._drag = { + time: null, + target: null, + pointer: null, + stage: { + start: null, + current: null + }, + direction: null + }; + + /** + * Current state information and their tags. + * @type {Object} + * @protected + */ + this._states = { + current: {}, + tags: { + 'initializing': [ 'busy' ], + 'animating': [ 'busy' ], + 'dragging': [ 'interacting' ] + } + }; + + $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) { + this._handlers[handler] = $.proxy(this[handler], this); + }, this)); + + $.each(Owl.Plugins, $.proxy(function(key, plugin) { + this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] + = new plugin(this); + }, this)); + + $.each(Owl.Workers, $.proxy(function(priority, worker) { + this._pipe.push({ + 'filter': worker.filter, + 'run': $.proxy(worker.run, this) + }); + }, this)); + + this.setup(); + this.initialize(); + } + + /** + * Default options for the carousel. + * @public + */ + Owl.Defaults = { + items: 3, + loop: false, + center: false, + rewind: false, + + mouseDrag: true, + touchDrag: true, + pullDrag: true, + freeDrag: false, + + margin: 0, + stagePadding: 0, + + merge: false, + mergeFit: true, + autoWidth: false, + + startPosition: 0, + rtl: false, + + smartSpeed: 250, + fluidSpeed: false, + dragEndSpeed: false, + + responsive: {}, + responsiveRefreshRate: 200, + responsiveBaseElement: window, + + fallbackEasing: 'swing', + + info: false, + + nestedItemSelector: false, + itemElement: 'div', + stageElement: 'div', + + refreshClass: 'owl-refresh', + loadedClass: 'owl-loaded', + loadingClass: 'owl-loading', + rtlClass: 'owl-rtl', + responsiveClass: 'owl-responsive', + dragClass: 'owl-drag', + itemClass: 'owl-item', + stageClass: 'owl-stage', + stageOuterClass: 'owl-stage-outer', + grabClass: 'owl-grab' + }; + + /** + * Enumeration for width. + * @public + * @readonly + * @enum {String} + */ + Owl.Width = { + Default: 'default', + Inner: 'inner', + Outer: 'outer' + }; + + /** + * Enumeration for types. + * @public + * @readonly + * @enum {String} + */ + Owl.Type = { + Event: 'event', + State: 'state' + }; + + /** + * Contains all registered plugins. + * @public + */ + Owl.Plugins = {}; + + /** + * List of workers involved in the update process. + */ + Owl.Workers = [ { + filter: [ 'width', 'settings' ], + run: function() { + this._width = this.$element.width(); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + cache.current = this._items && this._items[this.relative(this._current)]; + } + }, { + filter: [ 'items', 'settings' ], + run: function() { + this.$stage.children('.cloned').remove(); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var margin = this.settings.margin || '', + grid = !this.settings.autoWidth, + rtl = this.settings.rtl, + css = { + 'width': 'auto', + 'margin-left': rtl ? margin : '', + 'margin-right': rtl ? '' : margin + }; + + !grid && this.$stage.children().css(css); + + cache.css = css; + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin, + merge = null, + iterator = this._items.length, + grid = !this.settings.autoWidth, + widths = []; + + cache.items = { + merge: false, + width: width + }; + + while (iterator--) { + merge = this._mergers[iterator]; + merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge; + + cache.items.merge = merge > 1 || cache.items.merge; + + widths[iterator] = !grid ? this._items[iterator].width() : width * merge; + } + + this._widths = widths; + } + }, { + filter: [ 'items', 'settings' ], + run: function() { + var clones = [], + items = this._items, + settings = this.settings, + // TODO: Should be computed from number of min width items in stage + view = Math.max(settings.items * 2, 4), + size = Math.ceil(items.length / 2) * 2, + repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0, + append = '', + prepend = ''; + + repeat /= 2; + + while (repeat--) { + // Switch to only using appended clones + clones.push(this.normalize(clones.length / 2, true)); + append = append + items[clones[clones.length - 1]][0].outerHTML; + clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true)); + prepend = items[clones[clones.length - 1]][0].outerHTML + prepend; + } + + this._clones = clones; + + $(append).addClass('cloned').appendTo(this.$stage); + $(prepend).addClass('cloned').prependTo(this.$stage); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function() { + var rtl = this.settings.rtl ? 1 : -1, + size = this._clones.length + this._items.length, + iterator = -1, + previous = 0, + current = 0, + coordinates = []; + + while (++iterator < size) { + previous = coordinates[iterator - 1] || 0; + current = this._widths[this.relative(iterator)] + this.settings.margin; + coordinates.push(previous + current * rtl); + } + + this._coordinates = coordinates; + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function() { + var padding = this.settings.stagePadding, + coordinates = this._coordinates, + css = { + 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2, + 'padding-left': padding || '', + 'padding-right': padding || '' + }; + + this.$stage.css(css); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var iterator = this._coordinates.length, + grid = !this.settings.autoWidth, + items = this.$stage.children(); + + if (grid && cache.items.merge) { + while (iterator--) { + cache.css.width = this._widths[this.relative(iterator)]; + items.eq(iterator).css(cache.css); + } + } else if (grid) { + cache.css.width = cache.items.width; + items.css(cache.css); + } + } + }, { + filter: [ 'items' ], + run: function() { + this._coordinates.length < 1 && this.$stage.removeAttr('style'); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + cache.current = cache.current ? this.$stage.children().index(cache.current) : 0; + cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current)); + this.reset(cache.current); + } + }, { + filter: [ 'position' ], + run: function() { + this.animate(this.coordinates(this._current)); + } + }, { + filter: [ 'width', 'position', 'items', 'settings' ], + run: function() { + var rtl = this.settings.rtl ? 1 : -1, + padding = this.settings.stagePadding * 2, + begin = this.coordinates(this.current()) + padding, + end = begin + this.width() * rtl, + inner, outer, matches = [], i, n; + + for (i = 0, n = this._coordinates.length; i < n; i++) { + inner = this._coordinates[i - 1] || 0; + outer = Math.abs(this._coordinates[i]) + padding * rtl; + + if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end))) + || (this.op(outer, '<', begin) && this.op(outer, '>', end))) { + matches.push(i); + } + } + + this.$stage.children('.active').removeClass('active'); + this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active'); + + if (this.settings.center) { + this.$stage.children('.center').removeClass('center'); + this.$stage.children().eq(this.current()).addClass('center'); + } + } + } ]; + + /** + * Initializes the carousel. + * @protected + */ + Owl.prototype.initialize = function() { + this.enter('initializing'); + this.trigger('initialize'); + + this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl); + + if (this.settings.autoWidth && !this.is('pre-loading')) { + var imgs, nestedSelector, width; + imgs = this.$element.find('img'); + nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined; + width = this.$element.children(nestedSelector).width(); + + if (imgs.length && width <= 0) { + this.preloadAutoWidthImages(imgs); + } + } + + this.$element.addClass(this.options.loadingClass); + + // create stage + this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>') + .wrap('

    '); + + // append stage + this.$element.append(this.$stage.parent()); + + // append content + this.replace(this.$element.children().not(this.$stage.parent())); + + // check visibility + if (this.$element.is(':visible')) { + // update view + this.refresh(); + } else { + // invalidate width + this.invalidate('width'); + } + + this.$element + .removeClass(this.options.loadingClass) + .addClass(this.options.loadedClass); + + // register event handlers + this.registerEventHandlers(); + + this.leave('initializing'); + this.trigger('initialized'); + }; + + /** + * Setups the current settings. + * @todo Remove responsive classes. Why should adaptive designs be brought into IE8? + * @todo Support for media queries by using `matchMedia` would be nice. + * @public + */ + Owl.prototype.setup = function() { + var viewport = this.viewport(), + overwrites = this.options.responsive, + match = -1, + settings = null; + + if (!overwrites) { + settings = $.extend({}, this.options); + } else { + $.each(overwrites, function(breakpoint) { + if (breakpoint <= viewport && breakpoint > match) { + match = Number(breakpoint); + } + }); + + settings = $.extend({}, this.options, overwrites[match]); + if (typeof settings.stagePadding === 'function') { + settings.stagePadding = settings.stagePadding(); + } + delete settings.responsive; + + // responsive class + if (settings.responsiveClass) { + this.$element.attr('class', + this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match) + ); + } + } + + this.trigger('change', { property: { name: 'settings', value: settings } }); + this._breakpoint = match; + this.settings = settings; + this.invalidate('settings'); + this.trigger('changed', { property: { name: 'settings', value: this.settings } }); + }; + + /** + * Updates option logic if necessery. + * @protected + */ + Owl.prototype.optionsLogic = function() { + if (this.settings.autoWidth) { + this.settings.stagePadding = false; + this.settings.merge = false; + } + }; + + /** + * Prepares an item before add. + * @todo Rename event parameter `content` to `item`. + * @protected + * @returns {jQuery|HTMLElement} - The item container. + */ + Owl.prototype.prepare = function(item) { + var event = this.trigger('prepare', { content: item }); + + if (!event.data) { + event.data = $('<' + this.settings.itemElement + '/>') + .addClass(this.options.itemClass).append(item) + } + + this.trigger('prepared', { content: event.data }); + + return event.data; + }; + + /** + * Updates the view. + * @public + */ + Owl.prototype.update = function() { + var i = 0, + n = this._pipe.length, + filter = $.proxy(function(p) { return this[p] }, this._invalidated), + cache = {}; + + while (i < n) { + if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) { + this._pipe[i].run(cache); + } + i++; + } + + this._invalidated = {}; + + !this.is('valid') && this.enter('valid'); + }; + + /** + * Gets the width of the view. + * @public + * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return. + * @returns {Number} - The width of the view in pixel. + */ + Owl.prototype.width = function(dimension) { + dimension = dimension || Owl.Width.Default; + switch (dimension) { + case Owl.Width.Inner: + case Owl.Width.Outer: + return this._width; + default: + return this._width - this.settings.stagePadding * 2 + this.settings.margin; + } + }; + + /** + * Refreshes the carousel primarily for adaptive purposes. + * @public + */ + Owl.prototype.refresh = function() { + this.enter('refreshing'); + this.trigger('refresh'); + + this.setup(); + + this.optionsLogic(); + + this.$element.addClass(this.options.refreshClass); + + this.update(); + + this.$element.removeClass(this.options.refreshClass); + + this.leave('refreshing'); + this.trigger('refreshed'); + }; + + /** + * Checks window `resize` event. + * @protected + */ + Owl.prototype.onThrottledResize = function() { + window.clearTimeout(this.resizeTimer); + this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate); + }; + + /** + * Checks window `resize` event. + * @protected + */ + Owl.prototype.onResize = function() { + if (!this._items.length) { + return false; + } + + if (this._width === this.$element.width()) { + return false; + } + + if (!this.$element.is(':visible')) { + return false; + } + + this.enter('resizing'); + + if (this.trigger('resize').isDefaultPrevented()) { + this.leave('resizing'); + return false; + } + + this.invalidate('width'); + + this.refresh(); + + this.leave('resizing'); + this.trigger('resized'); + }; + + /** + * Registers event handlers. + * @todo Check `msPointerEnabled` + * @todo #261 + * @protected + */ + Owl.prototype.registerEventHandlers = function() { + if ($.support.transition) { + this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this)); + } + + if (this.settings.responsive !== false) { + this.on(window, 'resize', this._handlers.onThrottledResize); + } + + if (this.settings.mouseDrag) { + this.$element.addClass(this.options.dragClass); + this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this)); + this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false }); + } + + if (this.settings.touchDrag){ + this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this)); + this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this)); + } + }; + + /** + * Handles `touchstart` and `mousedown` events. + * @todo Horizontal swipe threshold as option + * @todo #261 + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragStart = function(event) { + var stage = null; + + if (event.which === 3) { + return; + } + + if ($.support.transform) { + stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(','); + stage = { + x: stage[stage.length === 16 ? 12 : 4], + y: stage[stage.length === 16 ? 13 : 5] + }; + } else { + stage = this.$stage.position(); + stage = { + x: this.settings.rtl ? + stage.left + this.$stage.width() - this.width() + this.settings.margin : + stage.left, + y: stage.top + }; + } + + if (this.is('animating')) { + $.support.transform ? this.animate(stage.x) : this.$stage.stop() + this.invalidate('position'); + } + + this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown'); + + this.speed(0); + + this._drag.time = new Date().getTime(); + this._drag.target = $(event.target); + this._drag.stage.start = stage; + this._drag.stage.current = stage; + this._drag.pointer = this.pointer(event); + + $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this)); + + $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) { + var delta = this.difference(this._drag.pointer, this.pointer(event)); + + $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this)); + + if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) { + return; + } + + event.preventDefault(); + + this.enter('dragging'); + this.trigger('drag'); + }, this)); + }; + + /** + * Handles the `touchmove` and `mousemove` events. + * @todo #261 + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragMove = function(event) { + var minimum = null, + maximum = null, + pull = null, + delta = this.difference(this._drag.pointer, this.pointer(event)), + stage = this.difference(this._drag.stage.start, delta); + + if (!this.is('dragging')) { + return; + } + + event.preventDefault(); + + if (this.settings.loop) { + minimum = this.coordinates(this.minimum()); + maximum = this.coordinates(this.maximum() + 1) - minimum; + stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum; + } else { + minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum()); + maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum()); + pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0; + stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull); + } + + this._drag.stage.current = stage; + + this.animate(stage.x); + }; + + /** + * Handles the `touchend` and `mouseup` events. + * @todo #261 + * @todo Threshold for click event + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragEnd = function(event) { + var delta = this.difference(this._drag.pointer, this.pointer(event)), + stage = this._drag.stage.current, + direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right'; + + $(document).off('.owl.core'); + + this.$element.removeClass(this.options.grabClass); + + if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) { + this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed); + this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction)); + this.invalidate('position'); + this.update(); + + this._drag.direction = direction; + + if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) { + this._drag.target.one('click.owl.core', function() { return false; }); + } + } + + if (!this.is('dragging')) { + return; + } + + this.leave('dragging'); + this.trigger('dragged'); + }; + + /** + * Gets absolute position of the closest item for a coordinate. + * @todo Setting `freeDrag` makes `closest` not reusable. See #165. + * @protected + * @param {Number} coordinate - The coordinate in pixel. + * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`. + * @return {Number} - The absolute position of the closest item. + */ + Owl.prototype.closest = function(coordinate, direction) { + var position = -1, + pull = 30, + width = this.width(), + coordinates = this.coordinates(); + + if (!this.settings.freeDrag) { + // check closest item + $.each(coordinates, $.proxy(function(index, value) { + // on a left pull, check on current index + if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) { + position = index; + // on a right pull, check on previous index + // to do so, subtract width from value and set position = index + 1 + } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) { + position = index + 1; + } else if (this.op(coordinate, '<', value) + && this.op(coordinate, '>', coordinates[index + 1] || value - width)) { + position = direction === 'left' ? index + 1 : index; + } + return position === -1; + }, this)); + } + + if (!this.settings.loop) { + // non loop boundries + if (this.op(coordinate, '>', coordinates[this.minimum()])) { + position = coordinate = this.minimum(); + } else if (this.op(coordinate, '<', coordinates[this.maximum()])) { + position = coordinate = this.maximum(); + } + } + + return position; + }; + + /** + * Animates the stage. + * @todo #270 + * @public + * @param {Number} coordinate - The coordinate in pixels. + */ + Owl.prototype.animate = function(coordinate) { + var animate = this.speed() > 0; + + this.is('animating') && this.onTransitionEnd(); + + if (animate) { + this.enter('animating'); + this.trigger('translate'); + } + + if ($.support.transform3d && $.support.transition) { + this.$stage.css({ + transform: 'translate3d(' + coordinate + 'px,0px,0px)', + transition: (this.speed() / 1000) + 's' + }); + } else if (animate) { + this.$stage.animate({ + left: coordinate + 'px' + }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this)); + } else { + this.$stage.css({ + left: coordinate + 'px' + }); + } + }; + + /** + * Checks whether the carousel is in a specific state or not. + * @param {String} state - The state to check. + * @returns {Boolean} - The flag which indicates if the carousel is busy. + */ + Owl.prototype.is = function(state) { + return this._states.current[state] && this._states.current[state] > 0; + }; + + /** + * Sets the absolute position of the current item. + * @public + * @param {Number} [position] - The new absolute position or nothing to leave it unchanged. + * @returns {Number} - The absolute position of the current item. + */ + Owl.prototype.current = function(position) { + if (position === undefined) { + return this._current; + } + + if (this._items.length === 0) { + return undefined; + } + + position = this.normalize(position); + + if (this._current !== position) { + var event = this.trigger('change', { property: { name: 'position', value: position } }); + + if (event.data !== undefined) { + position = this.normalize(event.data); + } + + this._current = position; + + this.invalidate('position'); + + this.trigger('changed', { property: { name: 'position', value: this._current } }); + } + + return this._current; + }; + + /** + * Invalidates the given part of the update routine. + * @param {String} [part] - The part to invalidate. + * @returns {Array.} - The invalidated parts. + */ + Owl.prototype.invalidate = function(part) { + if ($.type(part) === 'string') { + this._invalidated[part] = true; + this.is('valid') && this.leave('valid'); + } + return $.map(this._invalidated, function(v, i) { return i }); + }; + + /** + * Resets the absolute position of the current item. + * @public + * @param {Number} position - The absolute position of the new item. + */ + Owl.prototype.reset = function(position) { + position = this.normalize(position); + + if (position === undefined) { + return; + } + + this._speed = 0; + this._current = position; + + this.suppress([ 'translate', 'translated' ]); + + this.animate(this.coordinates(position)); + + this.release([ 'translate', 'translated' ]); + }; + + /** + * Normalizes an absolute or a relative position of an item. + * @public + * @param {Number} position - The absolute or relative position to normalize. + * @param {Boolean} [relative=false] - Whether the given position is relative or not. + * @returns {Number} - The normalized position. + */ + Owl.prototype.normalize = function(position, relative) { + var n = this._items.length, + m = relative ? 0 : this._clones.length; + + if (!this.isNumeric(position) || n < 1) { + position = undefined; + } else if (position < 0 || position >= n + m) { + position = ((position - m / 2) % n + n) % n + m / 2; + } + + return position; + }; + + /** + * Converts an absolute position of an item into a relative one. + * @public + * @param {Number} position - The absolute position to convert. + * @returns {Number} - The converted position. + */ + Owl.prototype.relative = function(position) { + position -= this._clones.length / 2; + return this.normalize(position, true); + }; + + /** + * Gets the maximum position for the current item. + * @public + * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. + * @returns {Number} + */ + Owl.prototype.maximum = function(relative) { + var settings = this.settings, + maximum = this._coordinates.length, + iterator, + reciprocalItemsWidth, + elementWidth; + + if (settings.loop) { + maximum = this._clones.length / 2 + this._items.length - 1; + } else if (settings.autoWidth || settings.merge) { + iterator = this._items.length; + reciprocalItemsWidth = this._items[--iterator].width(); + elementWidth = this.$element.width(); + while (iterator--) { + reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin; + if (reciprocalItemsWidth > elementWidth) { + break; + } + } + maximum = iterator + 1; + } else if (settings.center) { + maximum = this._items.length - 1; + } else { + maximum = this._items.length - settings.items; + } + + if (relative) { + maximum -= this._clones.length / 2; + } + + return Math.max(maximum, 0); + }; + + /** + * Gets the minimum position for the current item. + * @public + * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. + * @returns {Number} + */ + Owl.prototype.minimum = function(relative) { + return relative ? 0 : this._clones.length / 2; + }; + + /** + * Gets an item at the specified relative position. + * @public + * @param {Number} [position] - The relative position of the item. + * @return {jQuery|Array.} - The item at the given position or all items if no position was given. + */ + Owl.prototype.items = function(position) { + if (position === undefined) { + return this._items.slice(); + } + + position = this.normalize(position, true); + return this._items[position]; + }; + + /** + * Gets an item at the specified relative position. + * @public + * @param {Number} [position] - The relative position of the item. + * @return {jQuery|Array.} - The item at the given position or all items if no position was given. + */ + Owl.prototype.mergers = function(position) { + if (position === undefined) { + return this._mergers.slice(); + } + + position = this.normalize(position, true); + return this._mergers[position]; + }; + + /** + * Gets the absolute positions of clones for an item. + * @public + * @param {Number} [position] - The relative position of the item. + * @returns {Array.} - The absolute positions of clones for the item or all if no position was given. + */ + Owl.prototype.clones = function(position) { + var odd = this._clones.length / 2, + even = odd + this._items.length, + map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 }; + + if (position === undefined) { + return $.map(this._clones, function(v, i) { return map(i) }); + } + + return $.map(this._clones, function(v, i) { return v === position ? map(i) : null }); + }; + + /** + * Sets the current animation speed. + * @public + * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged. + * @returns {Number} - The current animation speed in milliseconds. + */ + Owl.prototype.speed = function(speed) { + if (speed !== undefined) { + this._speed = speed; + } + + return this._speed; + }; + + /** + * Gets the coordinate of an item. + * @todo The name of this method is missleanding. + * @public + * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`. + * @returns {Number|Array.} - The coordinate of the item in pixel or all coordinates. + */ + Owl.prototype.coordinates = function(position) { + var multiplier = 1, + newPosition = position - 1, + coordinate; + + if (position === undefined) { + return $.map(this._coordinates, $.proxy(function(coordinate, index) { + return this.coordinates(index); + }, this)); + } + + if (this.settings.center) { + if (this.settings.rtl) { + multiplier = -1; + newPosition = position + 1; + } + + coordinate = this._coordinates[position]; + coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier; + } else { + coordinate = this._coordinates[newPosition] || 0; + } + + coordinate = Math.ceil(coordinate); + + return coordinate; + }; + + /** + * Calculates the speed for a translation. + * @protected + * @param {Number} from - The absolute position of the start item. + * @param {Number} to - The absolute position of the target item. + * @param {Number} [factor=undefined] - The time factor in milliseconds. + * @returns {Number} - The time in milliseconds for the translation. + */ + Owl.prototype.duration = function(from, to, factor) { + if (factor === 0) { + return 0; + } + + return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed)); + }; + + /** + * Slides to the specified item. + * @public + * @param {Number} position - The position of the item. + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.to = function(position, speed) { + var current = this.current(), + revert = null, + distance = position - this.relative(current), + direction = (distance > 0) - (distance < 0), + items = this._items.length, + minimum = this.minimum(), + maximum = this.maximum(); + + if (this.settings.loop) { + if (!this.settings.rewind && Math.abs(distance) > items / 2) { + distance += direction * -1 * items; + } + + position = current + distance; + revert = ((position - minimum) % items + items) % items + minimum; + + if (revert !== position && revert - distance <= maximum && revert - distance > 0) { + current = revert - distance; + position = revert; + this.reset(current); + } + } else if (this.settings.rewind) { + maximum += 1; + position = (position % maximum + maximum) % maximum; + } else { + position = Math.max(minimum, Math.min(maximum, position)); + } + + this.speed(this.duration(current, position, speed)); + this.current(position); + + if (this.$element.is(':visible')) { + this.update(); + } + }; + + /** + * Slides to the next item. + * @public + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.next = function(speed) { + speed = speed || false; + this.to(this.relative(this.current()) + 1, speed); + }; + + /** + * Slides to the previous item. + * @public + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.prev = function(speed) { + speed = speed || false; + this.to(this.relative(this.current()) - 1, speed); + }; + + /** + * Handles the end of an animation. + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onTransitionEnd = function(event) { + + // if css2 animation then event object is undefined + if (event !== undefined) { + event.stopPropagation(); + + // Catch only owl-stage transitionEnd event + if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) { + return false; + } + } + + this.leave('animating'); + this.trigger('translated'); + }; + + /** + * Gets viewport width. + * @protected + * @return {Number} - The width in pixel. + */ + Owl.prototype.viewport = function() { + var width; + if (this.options.responsiveBaseElement !== window) { + width = $(this.options.responsiveBaseElement).width(); + } else if (window.innerWidth) { + width = window.innerWidth; + } else if (document.documentElement && document.documentElement.clientWidth) { + width = document.documentElement.clientWidth; + } else { + console.warn('Can not detect viewport width.'); + } + return width; + }; + + /** + * Replaces the current content. + * @public + * @param {HTMLElement|jQuery|String} content - The new content. + */ + Owl.prototype.replace = function(content) { + this.$stage.empty(); + this._items = []; + + if (content) { + content = (content instanceof jQuery) ? content : $(content); + } + + if (this.settings.nestedItemSelector) { + content = content.find('.' + this.settings.nestedItemSelector); + } + + content.filter(function() { + return this.nodeType === 1; + }).each($.proxy(function(index, item) { + item = this.prepare(item); + this.$stage.append(item); + this._items.push(item); + this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + }, this)); + + this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0); + + this.invalidate('items'); + }; + + /** + * Adds an item. + * @todo Use `item` instead of `content` for the event arguments. + * @public + * @param {HTMLElement|jQuery|String} content - The item content to add. + * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end. + */ + Owl.prototype.add = function(content, position) { + var current = this.relative(this._current); + + position = position === undefined ? this._items.length : this.normalize(position, true); + content = content instanceof jQuery ? content : $(content); + + this.trigger('add', { content: content, position: position }); + + content = this.prepare(content); + + if (this._items.length === 0 || position === this._items.length) { + this._items.length === 0 && this.$stage.append(content); + this._items.length !== 0 && this._items[position - 1].after(content); + this._items.push(content); + this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + } else { + this._items[position].before(content); + this._items.splice(position, 0, content); + this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + } + + this._items[current] && this.reset(this._items[current].index()); + + this.invalidate('items'); + + this.trigger('added', { content: content, position: position }); + }; + + /** + * Removes an item by its position. + * @todo Use `item` instead of `content` for the event arguments. + * @public + * @param {Number} position - The relative position of the item to remove. + */ + Owl.prototype.remove = function(position) { + position = this.normalize(position, true); + + if (position === undefined) { + return; + } + + this.trigger('remove', { content: this._items[position], position: position }); + + this._items[position].remove(); + this._items.splice(position, 1); + this._mergers.splice(position, 1); + + this.invalidate('items'); + + this.trigger('removed', { content: null, position: position }); + }; + + /** + * Preloads images with auto width. + * @todo Replace by a more generic approach + * @protected + */ + Owl.prototype.preloadAutoWidthImages = function(images) { + images.each($.proxy(function(i, element) { + this.enter('pre-loading'); + element = $(element); + $(new Image()).one('load', $.proxy(function(e) { + element.attr('src', e.target.src); + element.css('opacity', 1); + this.leave('pre-loading'); + !this.is('pre-loading') && !this.is('initializing') && this.refresh(); + }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina')); + }, this)); + }; + + /** + * Destroys the carousel. + * @public + */ + Owl.prototype.destroy = function() { + + this.$element.off('.owl.core'); + this.$stage.off('.owl.core'); + $(document).off('.owl.core'); + + if (this.settings.responsive !== false) { + window.clearTimeout(this.resizeTimer); + this.off(window, 'resize', this._handlers.onThrottledResize); + } + + for (var i in this._plugins) { + this._plugins[i].destroy(); + } + + this.$stage.children('.cloned').remove(); + + this.$stage.unwrap(); + this.$stage.children().contents().unwrap(); + this.$stage.children().unwrap(); + + this.$element + .removeClass(this.options.refreshClass) + .removeClass(this.options.loadingClass) + .removeClass(this.options.loadedClass) + .removeClass(this.options.rtlClass) + .removeClass(this.options.dragClass) + .removeClass(this.options.grabClass) + .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')) + .removeData('owl.carousel'); + }; + + /** + * Operators to calculate right-to-left and left-to-right. + * @protected + * @param {Number} [a] - The left side operand. + * @param {String} [o] - The operator. + * @param {Number} [b] - The right side operand. + */ + Owl.prototype.op = function(a, o, b) { + var rtl = this.settings.rtl; + switch (o) { + case '<': + return rtl ? a > b : a < b; + case '>': + return rtl ? a < b : a > b; + case '>=': + return rtl ? a <= b : a >= b; + case '<=': + return rtl ? a >= b : a <= b; + default: + break; + } + }; + + /** + * Attaches to an internal event. + * @protected + * @param {HTMLElement} element - The event source. + * @param {String} event - The event name. + * @param {Function} listener - The event handler to attach. + * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not. + */ + Owl.prototype.on = function(element, event, listener, capture) { + if (element.addEventListener) { + element.addEventListener(event, listener, capture); + } else if (element.attachEvent) { + element.attachEvent('on' + event, listener); + } + }; + + /** + * Detaches from an internal event. + * @protected + * @param {HTMLElement} element - The event source. + * @param {String} event - The event name. + * @param {Function} listener - The attached event handler to detach. + * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not. + */ + Owl.prototype.off = function(element, event, listener, capture) { + if (element.removeEventListener) { + element.removeEventListener(event, listener, capture); + } else if (element.detachEvent) { + element.detachEvent('on' + event, listener); + } + }; + + /** + * Triggers a public event. + * @todo Remove `status`, `relatedTarget` should be used instead. + * @protected + * @param {String} name - The event name. + * @param {*} [data=null] - The event data. + * @param {String} [namespace=carousel] - The event namespace. + * @param {String} [state] - The state which is associated with the event. + * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not. + * @returns {Event} - The event arguments. + */ + Owl.prototype.trigger = function(name, data, namespace, state, enter) { + var status = { + item: { count: this._items.length, index: this.current() } + }, handler = $.camelCase( + $.grep([ 'on', name, namespace ], function(v) { return v }) + .join('-').toLowerCase() + ), event = $.Event( + [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(), + $.extend({ relatedTarget: this }, status, data) + ); + + if (!this._supress[name]) { + $.each(this._plugins, function(name, plugin) { + if (plugin.onTrigger) { + plugin.onTrigger(event); + } + }); + + this.register({ type: Owl.Type.Event, name: name }); + this.$element.trigger(event); + + if (this.settings && typeof this.settings[handler] === 'function') { + this.settings[handler].call(this, event); + } + } + + return event; + }; + + /** + * Enters a state. + * @param name - The state name. + */ + Owl.prototype.enter = function(name) { + $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { + if (this._states.current[name] === undefined) { + this._states.current[name] = 0; + } + + this._states.current[name]++; + }, this)); + }; + + /** + * Leaves a state. + * @param name - The state name. + */ + Owl.prototype.leave = function(name) { + $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { + this._states.current[name]--; + }, this)); + }; + + /** + * Registers an event or state. + * @public + * @param {Object} object - The event or state to register. + */ + Owl.prototype.register = function(object) { + if (object.type === Owl.Type.Event) { + if (!$.event.special[object.name]) { + $.event.special[object.name] = {}; + } + + if (!$.event.special[object.name].owl) { + var _default = $.event.special[object.name]._default; + $.event.special[object.name]._default = function(e) { + if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) { + return _default.apply(this, arguments); + } + return e.namespace && e.namespace.indexOf('owl') > -1; + }; + $.event.special[object.name].owl = true; + } + } else if (object.type === Owl.Type.State) { + if (!this._states.tags[object.name]) { + this._states.tags[object.name] = object.tags; + } else { + this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags); + } + + this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) { + return $.inArray(tag, this._states.tags[object.name]) === i; + }, this)); + } + }; + + /** + * Suppresses events. + * @protected + * @param {Array.} events - The events to suppress. + */ + Owl.prototype.suppress = function(events) { + $.each(events, $.proxy(function(index, event) { + this._supress[event] = true; + }, this)); + }; + + /** + * Releases suppressed events. + * @protected + * @param {Array.} events - The events to release. + */ + Owl.prototype.release = function(events) { + $.each(events, $.proxy(function(index, event) { + delete this._supress[event]; + }, this)); + }; + + /** + * Gets unified pointer coordinates from event. + * @todo #261 + * @protected + * @param {Event} - The `mousedown` or `touchstart` event. + * @returns {Object} - Contains `x` and `y` coordinates of current pointer position. + */ + Owl.prototype.pointer = function(event) { + var result = { x: null, y: null }; + + event = event.originalEvent || event || window.event; + + event = event.touches && event.touches.length ? + event.touches[0] : event.changedTouches && event.changedTouches.length ? + event.changedTouches[0] : event; + + if (event.pageX) { + result.x = event.pageX; + result.y = event.pageY; + } else { + result.x = event.clientX; + result.y = event.clientY; + } + + return result; + }; + + /** + * Determines if the input is a Number or something that can be coerced to a Number + * @protected + * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested + * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number + */ + Owl.prototype.isNumeric = function(number) { + return !isNaN(parseFloat(number)); + }; + + /** + * Gets the difference of two vectors. + * @todo #261 + * @protected + * @param {Object} - The first vector. + * @param {Object} - The second vector. + * @returns {Object} - The difference. + */ + Owl.prototype.difference = function(first, second) { + return { + x: first.x - second.x, + y: first.y - second.y + }; + }; + + /** + * The jQuery Plugin for the Owl Carousel + * @todo Navigation plugin `next` and `prev` + * @public + */ + $.fn.owlCarousel = function(option) { + var args = Array.prototype.slice.call(arguments, 1); + + return this.each(function() { + var $this = $(this), + data = $this.data('owl.carousel'); + + if (!data) { + data = new Owl(this, typeof option == 'object' && option); + $this.data('owl.carousel', data); + + $.each([ + 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove' + ], function(i, event) { + data.register({ type: Owl.Type.Event, name: event }); + data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) { + if (e.namespace && e.relatedTarget !== this) { + this.suppress([ event ]); + data[event].apply(this, [].slice.call(arguments, 1)); + this.release([ event ]); + } + }, data)); + }); + } + + if (typeof option == 'string' && option.charAt(0) !== '_') { + data[option].apply(data, args); + } + }); + }; + + /** + * The constructor for the jQuery Plugin + * @public + */ + $.fn.owlCarousel.Constructor = Owl; + +})(window.Zepto || window.jQuery, window, document); + +/** + * AutoRefresh Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the auto refresh plugin. + * @class The Auto Refresh Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var AutoRefresh = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Refresh interval. + * @protected + * @type {number} + */ + this._interval = null; + + /** + * Whether the element is currently visible or not. + * @protected + * @type {Boolean} + */ + this._visible = null; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoRefresh) { + this.watch(); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + AutoRefresh.Defaults = { + autoRefresh: true, + autoRefreshInterval: 500 + }; + + /** + * Watches the element. + */ + AutoRefresh.prototype.watch = function() { + if (this._interval) { + return; + } + + this._visible = this._core.$element.is(':visible'); + this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval); + }; + + /** + * Refreshes the element. + */ + AutoRefresh.prototype.refresh = function() { + if (this._core.$element.is(':visible') === this._visible) { + return; + } + + this._visible = !this._visible; + + this._core.$element.toggleClass('owl-hidden', !this._visible); + + this._visible && (this._core.invalidate('width') && this._core.refresh()); + }; + + /** + * Destroys the plugin. + */ + AutoRefresh.prototype.destroy = function() { + var handler, property; + + window.clearInterval(this._interval); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Lazy Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the lazy plugin. + * @class The Lazy Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Lazy = function(carousel) { + + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Already loaded items. + * @protected + * @type {Array.} + */ + this._loaded = []; + + /** + * Event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) { + if (!e.namespace) { + return; + } + + if (!this._core.settings || !this._core.settings.lazyLoad) { + return; + } + + if ((e.property && e.property.name == 'position') || e.type == 'initialized') { + var settings = this._core.settings, + n = (settings.center && Math.ceil(settings.items / 2) || settings.items), + i = ((settings.center && n * -1) || 0), + position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i, + clones = this._core.clones().length, + load = $.proxy(function(i, v) { this.load(v) }, this); + + while (i++ < n) { + this.load(clones / 2 + this._core.relative(position)); + clones && $.each(this._core.clones(this._core.relative(position)), load); + position++; + } + } + }, this) + }; + + // set the default options + this._core.options = $.extend({}, Lazy.Defaults, this._core.options); + + // register event handler + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + Lazy.Defaults = { + lazyLoad: false + }; + + /** + * Loads all resources of an item at the specified position. + * @param {Number} position - The absolute position of the item. + * @protected + */ + Lazy.prototype.load = function(position) { + var $item = this._core.$stage.children().eq(position), + $elements = $item && $item.find('.owl-lazy'); + + if (!$elements || $.inArray($item.get(0), this._loaded) > -1) { + return; + } + + $elements.each($.proxy(function(index, element) { + var $element = $(element), image, + url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src'); + + this._core.trigger('load', { element: $element, url: url }, 'lazy'); + + if ($element.is('img')) { + $element.one('load.owl.lazy', $.proxy(function() { + $element.css('opacity', 1); + this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); + }, this)).attr('src', url); + } else { + image = new Image(); + image.onload = $.proxy(function() { + $element.css({ + 'background-image': 'url("' + url + '")', + 'opacity': '1' + }); + this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); + }, this); + image.src = url; + } + }, this)); + + this._loaded.push($item.get(0)); + }; + + /** + * Destroys the plugin. + * @public + */ + Lazy.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this._core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy; + +})(window.Zepto || window.jQuery, window, document); + +/** + * AutoHeight Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the auto height plugin. + * @class The Auto Height Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var AutoHeight = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight) { + this.update(); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position'){ + this.update(); + } + }, this), + 'loaded.owl.lazy': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight + && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) { + this.update(); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + AutoHeight.Defaults = { + autoHeight: false, + autoHeightClass: 'owl-height' + }; + + /** + * Updates the view. + */ + AutoHeight.prototype.update = function() { + var start = this._core._current, + end = start + this._core.settings.items, + visible = this._core.$stage.children().toArray().slice(start, end), + heights = [], + maxheight = 0; + + $.each(visible, function(index, item) { + heights.push($(item).height()); + }); + + maxheight = Math.max.apply(null, heights); + + this._core.$stage.parent() + .height(maxheight) + .addClass(this._core.settings.autoHeightClass); + }; + + AutoHeight.prototype.destroy = function() { + var handler, property; + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Video Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the video plugin. + * @class The Video Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Video = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Cache all video URLs. + * @protected + * @type {Object} + */ + this._videos = {}; + + /** + * Current playing item. + * @protected + * @type {jQuery} + */ + this._playing = null; + + /** + * All event handlers. + * @todo The cloned content removale is too late + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] }); + } + }, this), + 'resize.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.video && this.isInFullScreen()) { + e.preventDefault(); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.is('resizing')) { + this._core.$stage.find('.cloned .owl-video-frame').remove(); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'position' && this._playing) { + this.stop(); + } + }, this), + 'prepared.owl.carousel': $.proxy(function(e) { + if (!e.namespace) { + return; + } + + var $element = $(e.content).find('.owl-video'); + + if ($element.length) { + $element.css('display', 'none'); + this.fetch($element, $(e.content)); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Video.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + + this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) { + this.play(e); + }, this)); + }; + + /** + * Default options. + * @public + */ + Video.Defaults = { + video: false, + videoHeight: false, + videoWidth: false + }; + + /** + * Gets the video ID and the type (YouTube/Vimeo/vzaar only). + * @protected + * @param {jQuery} target - The target containing the video data. + * @param {jQuery} item - The item containing the video. + */ + Video.prototype.fetch = function(target, item) { + var type = (function() { + if (target.attr('data-vimeo-id')) { + return 'vimeo'; + } else if (target.attr('data-vzaar-id')) { + return 'vzaar' + } else { + return 'youtube'; + } + })(), + id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'), + width = target.attr('data-width') || this._core.settings.videoWidth, + height = target.attr('data-height') || this._core.settings.videoHeight, + url = target.attr('href'); + + if (url) { + + /* + Parses the id's out of the following urls (and probably more): + https://www.youtube.com/watch?v=:id + https://youtu.be/:id + https://vimeo.com/:id + https://vimeo.com/channels/:channel/:id + https://vimeo.com/groups/:group/videos/:id + https://app.vzaar.com/videos/:id + + Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F + */ + + id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/); + + if (id[3].indexOf('youtu') > -1) { + type = 'youtube'; + } else if (id[3].indexOf('vimeo') > -1) { + type = 'vimeo'; + } else if (id[3].indexOf('vzaar') > -1) { + type = 'vzaar'; + } else { + throw new Error('Video URL not supported.'); + } + id = id[6]; + } else { + throw new Error('Missing video URL.'); + } + + this._videos[url] = { + type: type, + id: id, + width: width, + height: height + }; + + item.attr('data-video', url); + + this.thumbnail(target, this._videos[url]); + }; + + /** + * Creates video thumbnail. + * @protected + * @param {jQuery} target - The target containing the video data. + * @param {Object} info - The video info object. + * @see `fetch` + */ + Video.prototype.thumbnail = function(target, video) { + var tnLink, + icon, + path, + dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '', + customTn = target.find('img'), + srcType = 'src', + lazyClass = '', + settings = this._core.settings, + create = function(path) { + icon = '
    '; + + if (settings.lazyLoad) { + tnLink = '
    '; + } else { + tnLink = '
    '; + } + target.after(tnLink); + target.after(icon); + }; + + // wrap video content into owl-video-wrapper div + target.wrap('
    '); + + if (this._core.settings.lazyLoad) { + srcType = 'data-src'; + lazyClass = 'owl-lazy'; + } + + // custom thumbnail + if (customTn.length) { + create(customTn.attr(srcType)); + customTn.remove(); + return false; + } + + if (video.type === 'youtube') { + path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg"; + create(path); + } else if (video.type === 'vimeo') { + $.ajax({ + type: 'GET', + url: '//vimeo.com/api/v2/video/' + video.id + '.json', + jsonp: 'callback', + dataType: 'jsonp', + success: function(data) { + path = data[0].thumbnail_large; + create(path); + } + }); + } else if (video.type === 'vzaar') { + $.ajax({ + type: 'GET', + url: '//vzaar.com/api/videos/' + video.id + '.json', + jsonp: 'callback', + dataType: 'jsonp', + success: function(data) { + path = data.framegrab_url; + create(path); + } + }); + } + }; + + /** + * Stops the current video. + * @public + */ + Video.prototype.stop = function() { + this._core.trigger('stop', null, 'video'); + this._playing.find('.owl-video-frame').remove(); + this._playing.removeClass('owl-video-playing'); + this._playing = null; + this._core.leave('playing'); + this._core.trigger('stopped', null, 'video'); + }; + + /** + * Starts the current video. + * @public + * @param {Event} event - The event arguments. + */ + Video.prototype.play = function(event) { + var target = $(event.target), + item = target.closest('.' + this._core.settings.itemClass), + video = this._videos[item.attr('data-video')], + width = video.width || '100%', + height = video.height || this._core.$stage.height(), + html; + + if (this._playing) { + return; + } + + this._core.enter('playing'); + this._core.trigger('play', null, 'video'); + + item = this._core.items(this._core.relative(item.index())); + + this._core.reset(item.index()); + + if (video.type === 'youtube') { + html = ''; + } else if (video.type === 'vimeo') { + html = ''; + } else if (video.type === 'vzaar') { + html = ''; + } + + $('
    ' + html + '
    ').insertAfter(item.find('.owl-video')); + + this._playing = item.addClass('owl-video-playing'); + }; + + /** + * Checks whether an video is currently in full screen mode or not. + * @todo Bad style because looks like a readonly method but changes members. + * @protected + * @returns {Boolean} + */ + Video.prototype.isInFullScreen = function() { + var element = document.fullscreenElement || document.mozFullScreenElement || + document.webkitFullscreenElement; + + return element && $(element).parent().hasClass('owl-video-frame'); + }; + + /** + * Destroys the plugin. + */ + Video.prototype.destroy = function() { + var handler, property; + + this._core.$element.off('click.owl.video'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Video = Video; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Animate Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the animate plugin. + * @class The Navigation Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Animate = function(scope) { + this.core = scope; + this.core.options = $.extend({}, Animate.Defaults, this.core.options); + this.swapping = true; + this.previous = undefined; + this.next = undefined; + + this.handlers = { + 'change.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.previous = this.core.current(); + this.next = e.property.value; + } + }, this), + 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this.swapping = e.type == 'translated'; + } + }, this), + 'translate.owl.carousel': $.proxy(function(e) { + if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) { + this.swap(); + } + }, this) + }; + + this.core.$element.on(this.handlers); + }; + + /** + * Default options. + * @public + */ + Animate.Defaults = { + animateOut: false, + animateIn: false + }; + + /** + * Toggles the animation classes whenever an translations starts. + * @protected + * @returns {Boolean|undefined} + */ + Animate.prototype.swap = function() { + + if (this.core.settings.items !== 1) { + return; + } + + if (!$.support.animation || !$.support.transition) { + return; + } + + this.core.speed(0); + + var left, + clear = $.proxy(this.clear, this), + previous = this.core.$stage.children().eq(this.previous), + next = this.core.$stage.children().eq(this.next), + incoming = this.core.settings.animateIn, + outgoing = this.core.settings.animateOut; + + if (this.core.current() === this.previous) { + return; + } + + if (outgoing) { + left = this.core.coordinates(this.previous) - this.core.coordinates(this.next); + previous.one($.support.animation.end, clear) + .css( { 'left': left + 'px' } ) + .addClass('animated owl-animated-out') + .addClass(outgoing); + } + + if (incoming) { + next.one($.support.animation.end, clear) + .addClass('animated owl-animated-in') + .addClass(incoming); + } + }; + + Animate.prototype.clear = function(e) { + $(e.target).css( { 'left': '' } ) + .removeClass('animated owl-animated-out owl-animated-in') + .removeClass(this.core.settings.animateIn) + .removeClass(this.core.settings.animateOut); + this.core.onTransitionEnd(); + }; + + /** + * Destroys the plugin. + * @public + */ + Animate.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this.core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Animate = Animate; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Autoplay Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the autoplay plugin. + * @class The Autoplay Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Autoplay = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * The autoplay timeout. + * @type {Timeout} + */ + this._timeout = null; + + /** + * Indicates whenever the autoplay is paused. + * @type {Boolean} + */ + this._paused = false; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'settings') { + if (this._core.settings.autoplay) { + this.play(); + } else { + this.stop(); + } + } else if (e.namespace && e.property.name === 'position') { + //console.log('play?', e); + if (this._core.settings.autoplay) { + this._setAutoPlayInterval(); + } + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoplay) { + this.play(); + } + }, this), + 'play.owl.autoplay': $.proxy(function(e, t, s) { + if (e.namespace) { + this.play(t, s); + } + }, this), + 'stop.owl.autoplay': $.proxy(function(e) { + if (e.namespace) { + this.stop(); + } + }, this), + 'mouseover.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'mouseleave.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.play(); + } + }, this), + 'touchstart.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'touchend.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause) { + this.play(); + } + }, this) + }; + + // register event handlers + this._core.$element.on(this._handlers); + + // set default options + this._core.options = $.extend({}, Autoplay.Defaults, this._core.options); + }; + + /** + * Default options. + * @public + */ + Autoplay.Defaults = { + autoplay: false, + autoplayTimeout: 5000, + autoplayHoverPause: false, + autoplaySpeed: false + }; + + /** + * Starts the autoplay. + * @public + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + */ + Autoplay.prototype.play = function(timeout, speed) { + this._paused = false; + + if (this._core.is('rotating')) { + return; + } + + this._core.enter('rotating'); + + this._setAutoPlayInterval(); + }; + + /** + * Gets a new timeout + * @private + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + * @return {Timeout} + */ + Autoplay.prototype._getNextTimeout = function(timeout, speed) { + if ( this._timeout ) { + window.clearTimeout(this._timeout); + } + return window.setTimeout($.proxy(function() { + if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) { + return; + } + this._core.next(speed || this._core.settings.autoplaySpeed); + }, this), timeout || this._core.settings.autoplayTimeout); + }; + + /** + * Sets autoplay in motion. + * @private + */ + Autoplay.prototype._setAutoPlayInterval = function() { + this._timeout = this._getNextTimeout(); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.stop = function() { + if (!this._core.is('rotating')) { + return; + } + + window.clearTimeout(this._timeout); + this._core.leave('rotating'); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.pause = function() { + if (!this._core.is('rotating')) { + return; + } + + this._paused = true; + }; + + /** + * Destroys the plugin. + */ + Autoplay.prototype.destroy = function() { + var handler, property; + + this.stop(); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Navigation Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the navigation plugin. + * @class The Navigation Plugin + * @param {Owl} carousel - The Owl Carousel. + */ + var Navigation = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Indicates whether the plugin is initialized or not. + * @protected + * @type {Boolean} + */ + this._initialized = false; + + /** + * The current paging indexes. + * @protected + * @type {Array} + */ + this._pages = []; + + /** + * All DOM elements of the user interface. + * @protected + * @type {Object} + */ + this._controls = {}; + + /** + * Markup for an indicator. + * @protected + * @type {Array.} + */ + this._templates = []; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * Overridden methods of the carousel. + * @protected + * @type {Object} + */ + this._overrides = { + next: this._core.next, + prev: this._core.prev, + to: this._core.to + }; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.push('
    ' + + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '
    '); + } + }, this), + 'added.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 0, this._templates.pop()); + } + }, this), + 'remove.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 1); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.draw(); + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && !this._initialized) { + this._core.trigger('initialize', null, 'navigation'); + this.initialize(); + this.update(); + this.draw(); + this._initialized = true; + this._core.trigger('initialized', null, 'navigation'); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._initialized) { + this._core.trigger('refresh', null, 'navigation'); + this.update(); + this.draw(); + this._core.trigger('refreshed', null, 'navigation'); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Navigation.Defaults, this._core.options); + + // register event handlers + this.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + * @todo Rename `slideBy` to `navBy` + */ + Navigation.Defaults = { + nav: false, + navText: [ 'prev', 'next' ], + navSpeed: false, + navElement: 'div', + navContainer: false, + navContainerClass: 'owl-nav', + navClass: [ 'owl-prev', 'owl-next' ], + slideBy: 1, + dotClass: 'owl-dot', + dotsClass: 'owl-dots', + dots: true, + dotsEach: false, + dotsData: false, + dotsSpeed: false, + dotsContainer: false + }; + + /** + * Initializes the layout of the plugin and extends the carousel. + * @protected + */ + Navigation.prototype.initialize = function() { + var override, + settings = this._core.settings; + + // create DOM structure for relative navigation + this._controls.$relative = (settings.navContainer ? $(settings.navContainer) + : $('
    ').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$previous = $('<' + settings.navElement + '>') + .addClass(settings.navClass[0]) + .html(settings.navText[0]) + .prependTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.prev(settings.navSpeed); + }, this)); + this._controls.$next = $('<' + settings.navElement + '>') + .addClass(settings.navClass[1]) + .html(settings.navText[1]) + .appendTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.next(settings.navSpeed); + }, this)); + + // create DOM structure for absolute navigation + if (!settings.dotsData) { + this._templates = [ $('
    ') + .addClass(settings.dotClass) + .append($('')) + .prop('outerHTML') ]; + } + + this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) + : $('
    ').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$absolute.on('click', 'div', $.proxy(function(e) { + var index = $(e.target).parent().is(this._controls.$absolute) + ? $(e.target).index() : $(e.target).parent().index(); + + e.preventDefault(); + + this.to(index, settings.dotsSpeed); + }, this)); + + // override public methods of the carousel + for (override in this._overrides) { + this._core[override] = $.proxy(this[override], this); + } + }; + + /** + * Destroys the plugin. + * @protected + */ + Navigation.prototype.destroy = function() { + var handler, control, property, override; + + for (handler in this._handlers) { + this.$element.off(handler, this._handlers[handler]); + } + for (control in this._controls) { + this._controls[control].remove(); + } + for (override in this.overides) { + this._core[override] = this._overrides[override]; + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + /** + * Updates the internal state. + * @protected + */ + Navigation.prototype.update = function() { + var i, j, k, + lower = this._core.clones().length / 2, + upper = lower + this._core.items().length, + maximum = this._core.maximum(true), + settings = this._core.settings, + size = settings.center || settings.autoWidth || settings.dotsData + ? 1 : settings.dotsEach || settings.items; + + if (settings.slideBy !== 'page') { + settings.slideBy = Math.min(settings.slideBy, settings.items); + } + + if (settings.dots || settings.slideBy == 'page') { + this._pages = []; + + for (i = lower, j = 0, k = 0; i < upper; i++) { + if (j >= size || j === 0) { + this._pages.push({ + start: Math.min(maximum, i - lower), + end: i - lower + size - 1 + }); + if (Math.min(maximum, i - lower) === maximum) { + break; + } + j = 0, ++k; + } + j += this._core.mergers(this._core.relative(i)); + } + } + }; + + /** + * Draws the user interface. + * @todo The option `dotsData` wont work. + * @protected + */ + Navigation.prototype.draw = function() { + var difference, + settings = this._core.settings, + disabled = this._core.items().length <= settings.items, + index = this._core.relative(this._core.current()), + loop = settings.loop || settings.rewind; + + this._controls.$relative.toggleClass('disabled', !settings.nav || disabled); + + if (settings.nav) { + this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true)); + this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true)); + } + + this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled); + + if (settings.dots) { + difference = this._pages.length - this._controls.$absolute.children().length; + + if (settings.dotsData && difference !== 0) { + this._controls.$absolute.html(this._templates.join('')); + } else if (difference > 0) { + this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0])); + } else if (difference < 0) { + this._controls.$absolute.children().slice(difference).remove(); + } + + this._controls.$absolute.find('.active').removeClass('active'); + this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active'); + } + }; + + /** + * Extends event data. + * @protected + * @param {Event} event - The event object which gets thrown. + */ + Navigation.prototype.onTrigger = function(event) { + var settings = this._core.settings; + + event.page = { + index: $.inArray(this.current(), this._pages), + count: this._pages.length, + size: settings && (settings.center || settings.autoWidth || settings.dotsData + ? 1 : settings.dotsEach || settings.items) + }; + }; + + /** + * Gets the current page position of the carousel. + * @protected + * @returns {Number} + */ + Navigation.prototype.current = function() { + var current = this._core.relative(this._core.current()); + return $.grep(this._pages, $.proxy(function(page, index) { + return page.start <= current && page.end >= current; + }, this)).pop(); + }; + + /** + * Gets the current succesor/predecessor position. + * @protected + * @returns {Number} + */ + Navigation.prototype.getPosition = function(successor) { + var position, length, + settings = this._core.settings; + + if (settings.slideBy == 'page') { + position = $.inArray(this.current(), this._pages); + length = this._pages.length; + successor ? ++position : --position; + position = this._pages[((position % length) + length) % length].start; + } else { + position = this._core.relative(this._core.current()); + length = this._core.items().length; + successor ? position += settings.slideBy : position -= settings.slideBy; + } + + return position; + }; + + /** + * Slides to the next item or page. + * @public + * @param {Number} [speed=false] - The time in milliseconds for the transition. + */ + Navigation.prototype.next = function(speed) { + $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed); + }; + + /** + * Slides to the previous item or page. + * @public + * @param {Number} [speed=false] - The time in milliseconds for the transition. + */ + Navigation.prototype.prev = function(speed) { + $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed); + }; + + /** + * Slides to the specified item or page. + * @public + * @param {Number} position - The position of the item or page. + * @param {Number} [speed] - The time in milliseconds for the transition. + * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not. + */ + Navigation.prototype.to = function(position, speed, standard) { + var length; + + if (!standard && this._pages.length) { + length = this._pages.length; + $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed); + } else { + $.proxy(this._overrides.to, this._core)(position, speed); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Hash Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the hash plugin. + * @class The Hash Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Hash = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Hash index for the items. + * @protected + * @type {Object} + */ + this._hashes = {}; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.startPosition === 'URLHash') { + $(window).trigger('hashchange.owl.navigation'); + } + }, this), + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash'); + + if (!hash) { + return; + } + + this._hashes[hash] = e.content; + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'position') { + var current = this._core.items(this._core.relative(this._core.current())), + hash = $.map(this._hashes, function(item, hash) { + return item === current ? hash : null; + }).join(); + + if (!hash || window.location.hash.slice(1) === hash) { + return; + } + + window.location.hash = hash; + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Hash.Defaults, this._core.options); + + // register the event handlers + this.$element.on(this._handlers); + + // register event listener for hash navigation + $(window).on('hashchange.owl.navigation', $.proxy(function(e) { + var hash = window.location.hash.substring(1), + items = this._core.$stage.children(), + position = this._hashes[hash] && items.index(this._hashes[hash]); + + if (position === undefined || position === this._core.current()) { + return; + } + + this._core.to(this._core.relative(position), false, true); + }, this)); + }; + + /** + * Default options. + * @public + */ + Hash.Defaults = { + URLhashListener: false + }; + + /** + * Destroys the plugin. + * @public + */ + Hash.prototype.destroy = function() { + var handler, property; + + $(window).off('hashchange.owl.navigation'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Hash = Hash; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Support Plugin + * + * @version 2.1.0 + * @author Vivid Planet Software GmbH + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + var style = $('').get(0).style, + prefixes = 'Webkit Moz O ms'.split(' '), + events = { + transition: { + end: { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'oTransitionEnd', + transition: 'transitionend' + } + }, + animation: { + end: { + WebkitAnimation: 'webkitAnimationEnd', + MozAnimation: 'animationend', + OAnimation: 'oAnimationEnd', + animation: 'animationend' + } + } + }, + tests = { + csstransforms: function() { + return !!test('transform'); + }, + csstransforms3d: function() { + return !!test('perspective'); + }, + csstransitions: function() { + return !!test('transition'); + }, + cssanimations: function() { + return !!test('animation'); + } + }; + + function test(property, prefixed) { + var result = false, + upper = property.charAt(0).toUpperCase() + property.slice(1); + + $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) { + if (style[property] !== undefined) { + result = prefixed ? property : true; + return false; + } + }); + + return result; + } + + function prefixed(property) { + return test(property, true); + } + + if (tests.csstransitions()) { + /* jshint -W053 */ + $.support.transition = new String(prefixed('transition')) + $.support.transition.end = events.transition.end[ $.support.transition ]; + } + + if (tests.cssanimations()) { + /* jshint -W053 */ + $.support.animation = new String(prefixed('animation')) + $.support.animation.end = events.animation.end[ $.support.animation ]; + } + + if (tests.csstransforms()) { + /* jshint -W053 */ + $.support.transform = new String(prefixed('transform')); + $.support.transform3d = tests.csstransforms3d(); + } + +})(window.Zepto || window.jQuery, window, document); diff --git a/lib/owlcarousel/owl.carousel.min.js b/lib/owlcarousel/owl.carousel.min.js new file mode 100644 index 0000000..9b9566f --- /dev/null +++ b/lib/owlcarousel/owl.carousel.min.js @@ -0,0 +1,7 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g--;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.settings.center&&(this.$stage.children(".center").removeClass("center"),this.$stage.children().eq(this.current()).addClass("center"))}}],e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var b,c,e;b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&e<=0&&this.preloadAutoWidthImages(b)}this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+' class="'+this.settings.stageClass+'"/>').wrap('
    '),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this.$element.is(":visible")?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){a<=b&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};b0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return!!this._items.length&&(this._width!==this.$element.width()&&(!!this.$element.is(":visible")&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))))},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),this.settings.responsive!==!1&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var d=-1,e=30,f=this.width(),g=this.coordinates();return this.settings.freeDrag||a.each(g,a.proxy(function(a,h){return"left"===c&&b>h-e&&bh-f-e&&b",g[a+1]||h-f)&&(d="left"===c?a+1:a),d===-1},this)),this.settings.loop||(this.op(b,">",g[this.minimum()])?d=b=this.minimum():this.op(b,"<",g[this.maximum()])&&(d=b=this.maximum())),d},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||c<1?a=d:(a<0||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){for(b=this._items.length,c=this._items[--b].width(),d=this.$element.width();b--&&(c+=this._items[b].width()+this.settings.margin,!(c>d)););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(e<0),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=f*-1*g),a=c+e,d=((a-h)%g+g)%g+h,d!==a&&d-e<=i&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.$element.is(":visible")&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){if(a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),this.settings.responsive!==!1&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:a":return d?ac;case">=":return d?a<=c:a>=c;case"<=":return d?a>=c:a<=c}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&a.namespace.indexOf("owl")!==-1?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.$element.is(":visible"),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.$element.is(":visible")!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&e*-1||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);f++-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.$stage.children().toArray().slice(b,c),e=[],f=0;a.each(d,function(b,c){e.push(a(c).height())}),f=Math.max.apply(null,e),this._core.$stage.parent().height(f).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='
    ',d=k.lazyLoad?'
    ':'
    ',b.after(d),b.after(e)};if(b.wrap('
    "),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length)return l(h.attr(i)),h.remove(),!1;"youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}})},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),"youtube"===f.type?c='':"vimeo"===f.type?c='':"vzaar"===f.type&&(c=''),a('
    '+c+"
    ").insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)}, +a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._timeout=null,this._paused=!1,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._core.settings.autoplay&&this._setAutoPlayInterval()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype.play=function(a,b){this._paused=!1,this._core.is("rotating")||(this._core.enter("rotating"),this._setAutoPlayInterval())},e.prototype._getNextTimeout=function(d,e){return this._timeout&&b.clearTimeout(this._timeout),b.setTimeout(a.proxy(function(){this._paused||this._core.is("busy")||this._core.is("interacting")||c.hidden||this._core.next(e||this._core.settings.autoplaySpeed)},this),d||this._core.settings.autoplayTimeout)},e.prototype._setAutoPlayInterval=function(){this._timeout=this._getNextTimeout()},e.prototype.stop=function(){this._core.is("rotating")&&(b.clearTimeout(this._timeout),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&(this._paused=!0)},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push('
    '+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"
    ")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("
    ").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a("
    ").addClass(c.dotClass).append(a("")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("
    ").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","div",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;a=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):b<0&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){if(g[b]!==d)return e=!c||b,!1}),e}function f(a){return e(a,!0)}var g=a("").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document); \ No newline at end of file diff --git a/lib/waypoints/links.php b/lib/waypoints/links.php new file mode 100644 index 0000000..3b37c8f --- /dev/null +++ b/lib/waypoints/links.php @@ -0,0 +1,5 @@ + 'lib/waypoints/waypoints.min.js' + ); +?> diff --git a/lib/waypoints/waypoints.min.js b/lib/waypoints/waypoints.min.js new file mode 100644 index 0000000..609ece0 --- /dev/null +++ b/lib/waypoints/waypoints.min.js @@ -0,0 +1,7 @@ +/*! +Waypoints - 4.0.1 +Copyright © 2011-2016 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +!function(){"use strict";function t(o){if(!o)throw new Error("No options passed to Waypoint constructor");if(!o.element)throw new Error("No element option passed to Waypoint constructor");if(!o.handler)throw new Error("No handler option passed to Waypoint constructor");this.key="waypoint-"+e,this.options=t.Adapter.extend({},t.defaults,o),this.element=this.options.element,this.adapter=new t.Adapter(this.element),this.callback=o.handler,this.axis=this.options.horizontal?"horizontal":"vertical",this.enabled=this.options.enabled,this.triggerPoint=null,this.group=t.Group.findOrCreate({name:this.options.group,axis:this.axis}),this.context=t.Context.findOrCreateByElement(this.options.context),t.offsetAliases[this.options.offset]&&(this.options.offset=t.offsetAliases[this.options.offset]),this.group.add(this),this.context.add(this),i[this.key]=this,e+=1}var e=0,i={};t.prototype.queueTrigger=function(t){this.group.queueTrigger(this,t)},t.prototype.trigger=function(t){this.enabled&&this.callback&&this.callback.apply(this,t)},t.prototype.destroy=function(){this.context.remove(this),this.group.remove(this),delete i[this.key]},t.prototype.disable=function(){return this.enabled=!1,this},t.prototype.enable=function(){return this.context.refresh(),this.enabled=!0,this},t.prototype.next=function(){return this.group.next(this)},t.prototype.previous=function(){return this.group.previous(this)},t.invokeAll=function(t){var e=[];for(var o in i)e.push(i[o]);for(var n=0,r=e.length;r>n;n++)e[n][t]()},t.destroyAll=function(){t.invokeAll("destroy")},t.disableAll=function(){t.invokeAll("disable")},t.enableAll=function(){t.Context.refreshAll();for(var e in i)i[e].enabled=!0;return this},t.refreshAll=function(){t.Context.refreshAll()},t.viewportHeight=function(){return window.innerHeight||document.documentElement.clientHeight},t.viewportWidth=function(){return document.documentElement.clientWidth},t.adapters=[],t.defaults={context:window,continuous:!0,enabled:!0,group:"default",horizontal:!1,offset:0},t.offsetAliases={"bottom-in-view":function(){return this.context.innerHeight()-this.adapter.outerHeight()},"right-in-view":function(){return this.context.innerWidth()-this.adapter.outerWidth()}},window.Waypoint=t}(),function(){"use strict";function t(t){window.setTimeout(t,1e3/60)}function e(t){this.element=t,this.Adapter=n.Adapter,this.adapter=new this.Adapter(t),this.key="waypoint-context-"+i,this.didScroll=!1,this.didResize=!1,this.oldScroll={x:this.adapter.scrollLeft(),y:this.adapter.scrollTop()},this.waypoints={vertical:{},horizontal:{}},t.waypointContextKey=this.key,o[t.waypointContextKey]=this,i+=1,n.windowContext||(n.windowContext=!0,n.windowContext=new e(window)),this.createThrottledScrollHandler(),this.createThrottledResizeHandler()}var i=0,o={},n=window.Waypoint,r=window.onload;e.prototype.add=function(t){var e=t.options.horizontal?"horizontal":"vertical";this.waypoints[e][t.key]=t,this.refresh()},e.prototype.checkEmpty=function(){var t=this.Adapter.isEmptyObject(this.waypoints.horizontal),e=this.Adapter.isEmptyObject(this.waypoints.vertical),i=this.element==this.element.window;t&&e&&!i&&(this.adapter.off(".waypoints"),delete o[this.key])},e.prototype.createThrottledResizeHandler=function(){function t(){e.handleResize(),e.didResize=!1}var e=this;this.adapter.on("resize.waypoints",function(){e.didResize||(e.didResize=!0,n.requestAnimationFrame(t))})},e.prototype.createThrottledScrollHandler=function(){function t(){e.handleScroll(),e.didScroll=!1}var e=this;this.adapter.on("scroll.waypoints",function(){(!e.didScroll||n.isTouch)&&(e.didScroll=!0,n.requestAnimationFrame(t))})},e.prototype.handleResize=function(){n.Context.refreshAll()},e.prototype.handleScroll=function(){var t={},e={horizontal:{newScroll:this.adapter.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.adapter.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};for(var i in e){var o=e[i],n=o.newScroll>o.oldScroll,r=n?o.forward:o.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s];if(null!==a.triggerPoint){var l=o.oldScroll=a.triggerPoint,p=l&&h,u=!l&&!h;(p||u)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}}for(var c in t)t[c].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?n.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?n.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var o=0,n=t.length;n>o;o++)t[o].destroy()},e.prototype.refresh=function(){var t,e=this.element==this.element.window,i=e?void 0:this.adapter.offset(),o={};this.handleScroll(),t={horizontal:{contextOffset:e?0:i.left,contextScroll:e?0:this.oldScroll.x,contextDimension:this.innerWidth(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:e?0:i.top,contextScroll:e?0:this.oldScroll.y,contextDimension:this.innerHeight(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};for(var r in t){var s=t[r];for(var a in this.waypoints[r]){var l,h,p,u,c,d=this.waypoints[r][a],f=d.options.offset,w=d.triggerPoint,y=0,g=null==w;d.element!==d.element.window&&(y=d.adapter.offset()[s.offsetProp]),"function"==typeof f?f=f.apply(d):"string"==typeof f&&(f=parseFloat(f),d.options.offset.indexOf("%")>-1&&(f=Math.ceil(s.contextDimension*f/100))),l=s.contextScroll-s.contextOffset,d.triggerPoint=Math.floor(y+l-f),h=w=s.oldScroll,u=h&&p,c=!h&&!p,!g&&u?(d.queueTrigger(s.backward),o[d.group.id]=d.group):!g&&c?(d.queueTrigger(s.forward),o[d.group.id]=d.group):g&&s.oldScroll>=d.triggerPoint&&(d.queueTrigger(s.forward),o[d.group.id]=d.group)}}return n.requestAnimationFrame(function(){for(var t in o)o[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in o)o[t].refresh()},e.findByElement=function(t){return o[t.waypointContextKey]},window.onload=function(){r&&r(),e.refreshAll()},n.requestAnimationFrame=function(e){var i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||t;i.call(window,e)},n.Context=e}(),function(){"use strict";function t(t,e){return t.triggerPoint-e.triggerPoint}function e(t,e){return e.triggerPoint-t.triggerPoint}function i(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),o[this.axis][this.name]=this}var o={vertical:{},horizontal:{}},n=window.Waypoint;i.prototype.add=function(t){this.waypoints.push(t)},i.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},i.prototype.flushTriggers=function(){for(var i in this.triggerQueues){var o=this.triggerQueues[i],n="up"===i||"left"===i;o.sort(n?e:t);for(var r=0,s=o.length;s>r;r+=1){var a=o[r];(a.options.continuous||r===o.length-1)&&a.trigger([i])}}this.clearTriggerQueues()},i.prototype.next=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints),o=i===this.waypoints.length-1;return o?null:this.waypoints[i+1]},i.prototype.previous=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints);return i?this.waypoints[i-1]:null},i.prototype.queueTrigger=function(t,e){this.triggerQueues[e].push(t)},i.prototype.remove=function(t){var e=n.Adapter.inArray(t,this.waypoints);e>-1&&this.waypoints.splice(e,1)},i.prototype.first=function(){return this.waypoints[0]},i.prototype.last=function(){return this.waypoints[this.waypoints.length-1]},i.findOrCreate=function(t){return o[t.axis][t.name]||new i(t)},n.Group=i}(),function(){"use strict";function t(t){this.$element=e(t)}var e=window.jQuery,i=window.Waypoint;e.each(["innerHeight","innerWidth","off","offset","on","outerHeight","outerWidth","scrollLeft","scrollTop"],function(e,i){t.prototype[i]=function(){var t=Array.prototype.slice.call(arguments);return this.$element[i].apply(this.$element,t)}}),e.each(["extend","inArray","isEmptyObject"],function(i,o){t[o]=e[o]}),i.adapters.push({name:"jquery",Adapter:t}),i.Adapter=t}(),function(){"use strict";function t(t){return function(){var i=[],o=arguments[0];return t.isFunction(arguments[0])&&(o=t.extend({},arguments[1]),o.handler=arguments[0]),this.each(function(){var n=t.extend({},o,{element:this});"string"==typeof n.context&&(n.context=t(this).closest(n.context)[0]),i.push(new e(n))}),i}}var e=window.Waypoint;window.jQuery&&(window.jQuery.fn.waypoint=t(window.jQuery)),window.Zepto&&(window.Zepto.fn.waypoint=t(window.Zepto))}(); \ No newline at end of file diff --git a/lib/wow/wow.js b/lib/wow/wow.js new file mode 100644 index 0000000..33fa4a1 --- /dev/null +++ b/lib/wow/wow.js @@ -0,0 +1,542 @@ +/* +* WOW wow.js - v1.3.0 - 2016-10-04 +* https://wowjs.uk +* Copyright (c) 2016 Thomas Grainger; Licensed MIT +*/ + +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', 'exports'], factory); + } else if (typeof exports !== "undefined") { + factory(module, exports); + } else { + var mod = { + exports: {} + }; + factory(mod, mod.exports); + global.WOW = mod.exports; + } +})(this, function (module, exports) { + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _class, _temp; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function isIn(needle, haystack) { + return haystack.indexOf(needle) >= 0; + } + + function extend(custom, defaults) { + for (var key in defaults) { + if (custom[key] == null) { + var value = defaults[key]; + custom[key] = value; + } + } + return custom; + } + + function isMobile(agent) { + return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent) + ); + } + + function createEvent(event) { + var bubble = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + var cancel = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + var detail = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; + + var customEvent = void 0; + if (document.createEvent != null) { + // W3C DOM + customEvent = document.createEvent('CustomEvent'); + customEvent.initCustomEvent(event, bubble, cancel, detail); + } else if (document.createEventObject != null) { + // IE DOM < 9 + customEvent = document.createEventObject(); + customEvent.eventType = event; + } else { + customEvent.eventName = event; + } + + return customEvent; + } + + function emitEvent(elem, event) { + if (elem.dispatchEvent != null) { + // W3C DOM + elem.dispatchEvent(event); + } else if (event in (elem != null)) { + elem[event](); + } else if ('on' + event in (elem != null)) { + elem['on' + event](); + } + } + + function addEvent(elem, event, fn) { + if (elem.addEventListener != null) { + // W3C DOM + elem.addEventListener(event, fn, false); + } else if (elem.attachEvent != null) { + // IE DOM + elem.attachEvent('on' + event, fn); + } else { + // fallback + elem[event] = fn; + } + } + + function removeEvent(elem, event, fn) { + if (elem.removeEventListener != null) { + // W3C DOM + elem.removeEventListener(event, fn, false); + } else if (elem.detachEvent != null) { + // IE DOM + elem.detachEvent('on' + event, fn); + } else { + // fallback + delete elem[event]; + } + } + + function getInnerHeight() { + if ('innerHeight' in window) { + return window.innerHeight; + } + + return document.documentElement.clientHeight; + } + + // Minimalistic WeakMap shim, just in case. + var WeakMap = window.WeakMap || window.MozWeakMap || function () { + function WeakMap() { + _classCallCheck(this, WeakMap); + + this.keys = []; + this.values = []; + } + + _createClass(WeakMap, [{ + key: 'get', + value: function get(key) { + for (var i = 0; i < this.keys.length; i++) { + var item = this.keys[i]; + if (item === key) { + return this.values[i]; + } + } + return undefined; + } + }, { + key: 'set', + value: function set(key, value) { + for (var i = 0; i < this.keys.length; i++) { + var item = this.keys[i]; + if (item === key) { + this.values[i] = value; + return this; + } + } + this.keys.push(key); + this.values.push(value); + return this; + } + }]); + + return WeakMap; + }(); + + // Dummy MutationObserver, to avoid raising exceptions. + var MutationObserver = window.MutationObserver || window.WebkitMutationObserver || window.MozMutationObserver || (_temp = _class = function () { + function MutationObserver() { + _classCallCheck(this, MutationObserver); + + if (typeof console !== 'undefined' && console !== null) { + console.warn('MutationObserver is not supported by your browser.'); + console.warn('WOW.js cannot detect dom mutations, please call .sync() after loading new content.'); + } + } + + _createClass(MutationObserver, [{ + key: 'observe', + value: function observe() {} + }]); + + return MutationObserver; + }(), _class.notSupported = true, _temp); + + // getComputedStyle shim, from http://stackoverflow.com/a/21797294 + var getComputedStyle = window.getComputedStyle || function getComputedStyle(el) { + var getComputedStyleRX = /(\-([a-z]){1})/g; + return { + getPropertyValue: function getPropertyValue(prop) { + if (prop === 'float') { + prop = 'styleFloat'; + } + if (getComputedStyleRX.test(prop)) { + prop.replace(getComputedStyleRX, function (_, _char) { + return _char.toUpperCase(); + }); + } + var currentStyle = el.currentStyle; + + return (currentStyle != null ? currentStyle[prop] : void 0) || null; + } + }; + }; + + var WOW = function () { + function WOW() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + _classCallCheck(this, WOW); + + this.defaults = { + boxClass: 'wow', + animateClass: 'animated', + offset: 0, + mobile: true, + live: true, + callback: null, + scrollContainer: null, + resetAnimation: true + }; + + this.animate = function animateFactory() { + if ('requestAnimationFrame' in window) { + return function (callback) { + return window.requestAnimationFrame(callback); + }; + } + return function (callback) { + return callback(); + }; + }(); + + this.vendors = ['moz', 'webkit']; + + this.start = this.start.bind(this); + this.resetAnimation = this.resetAnimation.bind(this); + this.scrollHandler = this.scrollHandler.bind(this); + this.scrollCallback = this.scrollCallback.bind(this); + this.scrolled = true; + this.config = extend(options, this.defaults); + if (options.scrollContainer != null) { + this.config.scrollContainer = document.querySelector(options.scrollContainer); + } + // Map of elements to animation names: + this.animationNameCache = new WeakMap(); + this.wowEvent = createEvent(this.config.boxClass); + } + + _createClass(WOW, [{ + key: 'init', + value: function init() { + this.element = window.document.documentElement; + if (isIn(document.readyState, ['interactive', 'complete'])) { + this.start(); + } else { + addEvent(document, 'DOMContentLoaded', this.start); + } + this.finished = []; + } + }, { + key: 'start', + value: function start() { + var _this = this; + + this.stopped = false; + this.boxes = [].slice.call(this.element.querySelectorAll('.' + this.config.boxClass)); + this.all = this.boxes.slice(0); + if (this.boxes.length) { + if (this.disabled()) { + this.resetStyle(); + } else { + for (var i = 0; i < this.boxes.length; i++) { + var box = this.boxes[i]; + this.applyStyle(box, true); + } + } + } + if (!this.disabled()) { + addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler); + addEvent(window, 'resize', this.scrollHandler); + this.interval = setInterval(this.scrollCallback, 50); + } + if (this.config.live) { + var mut = new MutationObserver(function (records) { + for (var j = 0; j < records.length; j++) { + var record = records[j]; + for (var k = 0; k < record.addedNodes.length; k++) { + var node = record.addedNodes[k]; + _this.doSync(node); + } + } + return undefined; + }); + mut.observe(document.body, { + childList: true, + subtree: true + }); + } + } + }, { + key: 'stop', + value: function stop() { + this.stopped = true; + removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler); + removeEvent(window, 'resize', this.scrollHandler); + if (this.interval != null) { + clearInterval(this.interval); + } + } + }, { + key: 'sync', + value: function sync() { + if (MutationObserver.notSupported) { + this.doSync(this.element); + } + } + }, { + key: 'doSync', + value: function doSync(element) { + if (typeof element === 'undefined' || element === null) { + element = this.element; + } + if (element.nodeType !== 1) { + return; + } + element = element.parentNode || element; + var iterable = element.querySelectorAll('.' + this.config.boxClass); + for (var i = 0; i < iterable.length; i++) { + var box = iterable[i]; + if (!isIn(box, this.all)) { + this.boxes.push(box); + this.all.push(box); + if (this.stopped || this.disabled()) { + this.resetStyle(); + } else { + this.applyStyle(box, true); + } + this.scrolled = true; + } + } + } + }, { + key: 'show', + value: function show(box) { + this.applyStyle(box); + box.className = box.className + ' ' + this.config.animateClass; + if (this.config.callback != null) { + this.config.callback(box); + } + emitEvent(box, this.wowEvent); + + if (this.config.resetAnimation) { + addEvent(box, 'animationend', this.resetAnimation); + addEvent(box, 'oanimationend', this.resetAnimation); + addEvent(box, 'webkitAnimationEnd', this.resetAnimation); + addEvent(box, 'MSAnimationEnd', this.resetAnimation); + } + + return box; + } + }, { + key: 'applyStyle', + value: function applyStyle(box, hidden) { + var _this2 = this; + + var duration = box.getAttribute('data-wow-duration'); + var delay = box.getAttribute('data-wow-delay'); + var iteration = box.getAttribute('data-wow-iteration'); + + return this.animate(function () { + return _this2.customStyle(box, hidden, duration, delay, iteration); + }); + } + }, { + key: 'resetStyle', + value: function resetStyle() { + for (var i = 0; i < this.boxes.length; i++) { + var box = this.boxes[i]; + box.style.visibility = 'visible'; + } + return undefined; + } + }, { + key: 'resetAnimation', + value: function resetAnimation(event) { + if (event.type.toLowerCase().indexOf('animationend') >= 0) { + var target = event.target || event.srcElement; + target.className = target.className.replace(this.config.animateClass, '').trim(); + } + } + }, { + key: 'customStyle', + value: function customStyle(box, hidden, duration, delay, iteration) { + if (hidden) { + this.cacheAnimationName(box); + } + box.style.visibility = hidden ? 'hidden' : 'visible'; + + if (duration) { + this.vendorSet(box.style, { animationDuration: duration }); + } + if (delay) { + this.vendorSet(box.style, { animationDelay: delay }); + } + if (iteration) { + this.vendorSet(box.style, { animationIterationCount: iteration }); + } + this.vendorSet(box.style, { animationName: hidden ? 'none' : this.cachedAnimationName(box) }); + + return box; + } + }, { + key: 'vendorSet', + value: function vendorSet(elem, properties) { + for (var name in properties) { + if (properties.hasOwnProperty(name)) { + var value = properties[name]; + elem['' + name] = value; + for (var i = 0; i < this.vendors.length; i++) { + var vendor = this.vendors[i]; + elem['' + vendor + name.charAt(0).toUpperCase() + name.substr(1)] = value; + } + } + } + } + }, { + key: 'vendorCSS', + value: function vendorCSS(elem, property) { + var style = getComputedStyle(elem); + var result = style.getPropertyCSSValue(property); + for (var i = 0; i < this.vendors.length; i++) { + var vendor = this.vendors[i]; + result = result || style.getPropertyCSSValue('-' + vendor + '-' + property); + } + return result; + } + }, { + key: 'animationName', + value: function animationName(box) { + var aName = void 0; + try { + aName = this.vendorCSS(box, 'animation-name').cssText; + } catch (error) { + // Opera, fall back to plain property value + aName = getComputedStyle(box).getPropertyValue('animation-name'); + } + + if (aName === 'none') { + return ''; // SVG/Firefox, unable to get animation name? + } + + return aName; + } + }, { + key: 'cacheAnimationName', + value: function cacheAnimationName(box) { + // https://bugzilla.mozilla.org/show_bug.cgi?id=921834 + // box.dataset is not supported for SVG elements in Firefox + return this.animationNameCache.set(box, this.animationName(box)); + } + }, { + key: 'cachedAnimationName', + value: function cachedAnimationName(box) { + return this.animationNameCache.get(box); + } + }, { + key: 'scrollHandler', + value: function scrollHandler() { + this.scrolled = true; + } + }, { + key: 'scrollCallback', + value: function scrollCallback() { + if (this.scrolled) { + this.scrolled = false; + var results = []; + for (var i = 0; i < this.boxes.length; i++) { + var box = this.boxes[i]; + if (box) { + if (this.isVisible(box)) { + this.show(box); + continue; + } + results.push(box); + } + } + this.boxes = results; + if (!this.boxes.length && !this.config.live) { + this.stop(); + } + } + } + }, { + key: 'offsetTop', + value: function offsetTop(element) { + // SVG elements don't have an offsetTop in Firefox. + // This will use their nearest parent that has an offsetTop. + // Also, using ('offsetTop' of element) causes an exception in Firefox. + while (element.offsetTop === undefined) { + element = element.parentNode; + } + var top = element.offsetTop; + while (element.offsetParent) { + element = element.offsetParent; + top += element.offsetTop; + } + return top; + } + }, { + key: 'isVisible', + value: function isVisible(box) { + var offset = box.getAttribute('data-wow-offset') || this.config.offset; + var viewTop = this.config.scrollContainer && this.config.scrollContainer.scrollTop || window.pageYOffset; + var viewBottom = viewTop + Math.min(this.element.clientHeight, getInnerHeight()) - offset; + var top = this.offsetTop(box); + var bottom = top + box.clientHeight; + + return top <= viewBottom && bottom >= viewTop; + } + }, { + key: 'disabled', + value: function disabled() { + return !this.config.mobile && isMobile(navigator.userAgent); + } + }]); + + return WOW; + }(); + + exports.default = WOW; + module.exports = exports['default']; +}); diff --git a/lib/wow/wow.min.js b/lib/wow/wow.min.js new file mode 100644 index 0000000..3e994f3 --- /dev/null +++ b/lib/wow/wow.min.js @@ -0,0 +1,3 @@ +/*! WOW wow.js - v1.3.0 - 2016-10-04 +* https://wowjs.uk +* Copyright (c) 2016 Thomas Grainger; Licensed MIT */!function(a,b){if("function"==typeof define&&define.amd)define(["module","exports"],b);else if("undefined"!=typeof exports)b(module,exports);else{var c={exports:{}};b(c,c.exports),a.WOW=c.exports}}(this,function(a,b){"use strict";function c(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function d(a,b){return b.indexOf(a)>=0}function e(a,b){for(var c in b)if(null==a[c]){var d=b[c];a[c]=d}return a}function f(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)}function g(a){var b=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],c=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],d=arguments.length<=3||void 0===arguments[3]?null:arguments[3],e=void 0;return null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e}function h(a,b){null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)&&a["on"+b]()}function i(a,b,c){null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c}function j(a,b,c){null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]}function k(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight}Object.defineProperty(b,"__esModule",{value:!0});var l,m,n=function(){function a(a,b){for(var c=0;c=0){var b=a.target||a.srcElement;b.className=b.className.replace(this.config.animateClass,"").trim()}}},{key:"customStyle",value:function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a}},{key:"vendorSet",value:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];a[""+c]=d;for(var e=0;e=e&&f>=c}},{key:"disabled",value:function(){return!this.config.mobile&&f(navigator.userAgent)}}]),a}();b["default"]=r,a.exports=b["default"]}); diff --git a/mc7aymybu0o.png b/mc7aymybu0o.png new file mode 100644 index 0000000000000000000000000000000000000000..523ecf88ec067a98340bf91c9bb6abc8032107ac GIT binary patch literal 69634 zcmV(*K;FNJP)O009>W1^@s6htmMm001BWNklfe9<@A>gR z|M|Z^@BH`w{(Q;Le_s9b+VkH(ul>2{KlAfk{d_lHcd$RN&3p6mbHiNm=f&rLf4=|o z{-1Ah$)5@T{FL|Ro9D)7zKKP{Jg@Uk#+;F#`!n5)q{!!{=e9rJc%jetUV~#%bXr4a zW9Cx;S|zj3BAzj4B#r;P>uDzR=MG|b+%w-3F6-_2GRO12=ACFL$jSYa&&=&q)%8;g z#pWDleGH^@C}6!*>vP%2Iaex_zOR0s+)T0Z;%1UHC~cc-E(R+>(PGfGGrm&Oo#)AY z*6JCljWHOMR?f5xz_my(%u{XF>xwv`!w>5C1OU|Fh60&e!Q0>7zx)$!7FYfmZg>!) z)Y_HL`F`0EPKs3f-h(akQ8=Ua!G*?Ds+`+rd=pGL`|qE%Kd&vdz!LX~=TNcum4t{h zOmqlg&{E`yLnLc*S|pfgg<@`FSp>RB6o5T9_zzhPNYAIWEWwp&le+<;H=MXXvMRBg zCAy$OgoW<`&t&K?1r$CthYGB?1Edm|%>{y0`9kg_l8m;+6|fX2SGxGmdPW!~3jou? zuYi<$t6qr+g6MpSw^cvqH0vw*Vax?5IeccCI43cK9SJ`RAdIao7qhO2O%q~64@6{6 zCa=fdbt?wVJw%x6`C7z?nUE)&R0!zTNz#l!9fUdR4GFcH#dRaWd6@gboQ86ZxVqj~ z{V<{!FoH76BMHyijDwT^#V&-hpM)dJf4GrGK$sHt8fT2j>l2+7#&sNgN`4p6xyW@y zxlpZ9>Ij$y4X_JL@#QIOB`ppgWR&6;@P`*xWnC-6GhY-J5t*3CZUHqIhxlHV1t0y~LKBMr6j{%G^X=qqM9lrB*x7Bj!F#)m>6~g!WwFZ?NfiWHh5}AQADtDDT zP

    (Bp5fv+JySBPv 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 + + + + + IO Cloud Solutions - Shared Hosting, VPS, Dedicated Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + +
    +
    + Loading... +
    +
    + + + + +
    + + + + + + + + + +
    +
    +

    IO Cloud Solutions cares about and respects your privacy. For this reason, we collect and use personal data only as it might be needed for us to deliver to you our products, services and websites (collectively, our “Services”). Your personal data includes information such as:

    +
      +
    • Name
    • +
    • Email address
    • +
    • IP address
    • +
    • Online identifiers, such as usernames (which may be provided by you or by us).
    • +
    • Other data collected that could directly or indirectly identify you
    • +
    +

    Our Privacy Policy is intended to describe to you how and what data we collect, and how and why we use your personal data. It also describes options we provide for you to access, update or otherwise take control of your personal data that we process.

    +

    If at any time you have questions about our practices or any of your rights described below, you may reach us by contacting us at . This inbox is actively monitored and managed so that we can provide you with information you can confidently trust.

    +

    What information do we collect

    +

    We collect information to provide the best possible experience when you use our Services. Much of what you consider personal data is collected directly from you when you:

    +
      +
    • Create an account or purchase any of our Services (e.g. billing information, including name, address, and credit card number).
    • +
    • Request assistance from our Customer Services team (e.g. telephone number).
    • +
    • Complete contact forms or request newsletters or other information from us (e.g. email courses, e-books, or emails).
    • +
    • Participate in contests and surveys, apply for a job, or otherwise participate in activities we promote that might require information about you.
    • +
    +

    However, we also collect additional information when delivering our Services to you to ensure necessary and optimal performance. These methods of collection may not be as obvious, so we wanted to explain what these might be (as they vary from time to time) and how they work:

    +

    Account related information is collected in association with your use of our Services, such as account number, products you have purchased, when products renew or expire, information requests, support requests, and notes or details on our interactions.

    +

    Cookies and similar technologies on our websites allow us to track your browsing behavior, links clicked, items purchased, and your device types. They also allow us to collect data (including analytics) about how you use and interact with our Services. This allows us to provide you with more relevant product offerings, a better experience on our sites and mobile applications, and to collect, analyse, and improve the performance of our Services. We may also collect your location via Internet Protocol (IP) address, so that we can personalize our Services.

    +

    Data about Usage of Services is automatically collected when you use and interact with our Services, including metadata, log files, cookie/device IDs, and location information. This information includes specific data about your interactions with the features, content, and links (including third-parties, such as social media plugins) contained within the Services, IP address, browser type and settings (including configuration and plug-ins), the date and time the Services were used, language preferences and cookie data, and information about devices accessing the Services, including type of device, what operating system is used, device settings, application IDs, unique device identifiers, and error data. Some of this data collected might be capable of and be used to approximate your location.

    +

    Supplemented Data may be received about you from other sources, including publicly available databases or third parties from whom we have purchased data, in which case we may combine this data with information we already have about you so that we can update, expand, and analyse the accuracy of our records, identify new customers, and provide products and services that may be of interest to you. If you provide us personal information about others, or if others give us your information, we will only use that information for the specific reason for which it was provided to us.

    +

    How we use information

    +

    We strongly believe in both reducing the amount of data we collect and limiting the use and purpose of that data to only:

    +
      +
    • Data for which we have been given permission
    • +
    • Data necessary to deliver the Services you purchase or interact with
    • +
    • Data we might be required or permitted to keep for legal compliance or other lawful purposes.
    • +
    +

    We utilise this information to:

    +
      +
    • Improve and optimise the operation and performance of our Services (again, including our websites and mobile applications)
    • +
    • Diagnose problems with and identify any security risks, errors, or needed enhancements to the Services
    • +
    • Detect and prevent fraud and abuse of our Services and systems
    • +
    • Collecting aggregate statistics about use of the Services
    • +
    • Understand and analyse how you use our Services and what products and services are most relevant to you.
    • +
    +

    Often, much of the data we collect is aggregated or statistical data about how individuals use our Services, and is not linked to any personal data. But as it is itself personal data, or it can be linked or linkable to personal data, we treat it accordingly.

    +

    Sharing with trusted third parties

    +

    We may share your personal data with affiliated companies within our corporate family, with third parties with which we have partnered to allow you to integrate their services into our own Services, and with trusted third-party service providers as necessary for them to perform services on our behalf, such as:

    +
      +
    • Fulfilling of the Services provided to you
    • +
    • Processing payments
    • +
    • Serving advertisements
    • +
    • Conducting contests or surveys
    • +
    • Performing analysis of our Services and customer demographics
    • +
    • Communicating with you, such as by way email or survey delivery
    • +
    • Customer relationship management
    • +
    +

    We only share your personal data as necessary for any third party to provide the services as requested or as needed on our behalf. These third parties (and any subcontractors) are subject to strict data processing terms and conditions and are prohibited from utilizing, sharing or retaining your personal data for any purpose other than as they have been specifically contracted for (or without your consent).

    +

    Communicating with you

    +

    We may contact you directly, or through a third-party service provider, regarding products or services you have signed up or purchased from us, such as necessary to deliver transactional or service related communications. We may also contact you with offers for additional services we think you’ll find valuable if you give us consent, or where allowed based upon legitimate interests. You don’t need to provide consent as a condition to purchase our goods or services. These contacts may include:

    +
      +
    • Email
    • +
    • Text (SMS) messages
    • +
    +

    If you make use of a service that allows you to import contacts (e.g. using email marketing services to send emails on your behalf), we will only use the contacts and any other personal information needed for the requested service. If you believe that anyone has provided us with your personal information and you would like to request that it be removed from our database, please contact us at

    +

    Transfer of personal data abroad

    +

    If you utilise our Services from a country other than the country where our servers are located, your communications with us may result in transferring your personal data across international borders. Also, when you call us or initiate a chat, we may provide you with support from one of our global locations outside your country of origin. Your personal data will be transferred and processed outside of the EEA. In these cases, your personal data is handled according to this Privacy Policy.

    + +

    We cooperate with government and law enforcement officials and private parties to enforce and comply with the law. We will disclose any information about you to government or law enforcement officials or private parties as we, in our sole discretion, believe necessary or appropriate to respond to claims and legal process (such as subpoena requests), to protect our property and rights or the property and rights of a third party, to protect the safety of the public or any person, or to prevent or stop activity we consider to be illegal or unethical.

    +

    To the extent we are legally permitted to do so, we will take reasonable steps to notify you in the event that we are required to provide your personal information to third parties as part of legal process.

    +

    Website analytics

    +

    We use multiple web analytics tools provided by service partners such as Google Analytics and Statcounter.com to collect information about how you interact with our website or mobile applications, including what pages you visit, what site you visited prior to visiting our website, how much time you spend on each page, what operating system and web browser you use, and network and IP information. We use the information provided by these tools to improve our Services.

    +

    These tools place persistent cookies in your browser to identify you as a unique user the next time you visit our website. Each cookie cannot be used by anyone other than the service provider (eg: Facebook and Google for Google Analytics). The information collected from the cookie may be transmitted to and stored by these service partners on servers in a country other than the country in which you reside. Though information collected does not include personal data such as name, address, billing information, etc., the information collected is used and shared by these service providers in accordance with their individual privacy policies.

    +

    You can control the technologies we use by utilizing settings in your browser or third-party tools, such as Disconnect, Ghostery and others.

    +

    Targeted advertisements

    +

    Targeted ads or interest-based offers may be presented to you based on your activities on our webpages and other websites, and based on the products you currently own. These offers will display as varying product banners presented to you while browsing. We also partner with third parties to manage our advertising on our webpages and other websites such as Facebook, Twitter, Google, and Microsoft. Our third-party partners may use technologies such as cookies to gather information about such activities in order to provide you with advertising based upon your browsing activities and interests, and to measure advertising effectiveness. If you wish to opt out of interest-based advertising in the European Union, please visit https://youronlinechoices.eu . Please note, you will continue to receive generic ads.

    +

    Third-party websites

    +

    Our website and our mobile applications contain links to third-party websites. We are not responsible for the privacy practices or the content of third-party sites. Please read the privacy policy of any website you visit.

    +

    How you can access, update or delete your data

    +

    To easily access, view, update, delete, or port your personal data (where available), or to update your subscription preferences, please sign into your Account and visit “Edit Account Details.” Please contact us at for additional information and guidance for accessing, updating, or deleting data.

    +

    If you make a request to delete your personal data and that data is necessary for the products or services you have purchased, the request will be honoured only to the extent it is no longer necessary for any Services purchased or required for our legitimate business purposes or legal or contractual record keeping requirements.

    +

    If you are unable for any reason to access your Account Settings, you may also contact us by one of the methods described in the “Contact Us” section below.

    +

    How we secure, store, and retain your data

    +

    We follow generally accepted standards to store and protect the personal data we collect, both during transmission and once received and stored, including utilization of encryption where appropriate.

    +

    We retain personal data only for as long as necessary to provide the Services you have requested and thereafter for a variety of legitimate legal or business purposes. These might include retention periods:

    +
      +
    • mandated by law, contract, or similar obligations applicable to our business operations;
    • +
    • for preserving, resolving, defending, or enforcing our legal/contractual rights; or
    • +
    • needed to maintain adequate and accurate business and financial records.
    • +
    +

    If you have any questions about the security or retention of your personal data, you can contact us at

    +

    ‘Do Not Track’ notifications

    +

    Some browsers allow you to automatically notify websites you visit not to track you using a “Do Not Track” signal. There is no consensus among industry participants as to what “Do Not Track” means in this context. Like many websites and online services, we currently do not alter our practices when we receive a “Do Not Track” signal from a visitor’s browser. To find out more about “Do Not Track,” you may wish to visit https://www.allaboutdnt.com.

    +

    Age restrictions

    +

    Our Services are available for purchase only for those over the age of 16. Our Services are not targeted to, intended to be consumed by or designed to entice individuals under the age of 16. If you know of or have reason to believe anyone under the age of 16 has provided us with any personal data, please contact us.

    +

    Changes in our Privacy Policy

    +

    We reserve the right to modify this Privacy Policy at any time. If we decide to change our Privacy Policy, we will post those changes to this Privacy Policy and any other places we deem appropriate, so that you are aware of what information we collect, how we use it, and under what circumstances, if any, we disclose it. If we make material changes to this Privacy Policy, we will notify you here, by email, or by means of a notice on our home page, at least thirty (30) days prior to the implementation of the changes.

    +

    Contact us

    +

    If you have any questions, concerns or complaints about our Privacy Policy, our practices, or our Services, you may contact us at

    + +
    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/scss/bootstrap.scss b/scss/bootstrap.scss new file mode 100644 index 0000000..e449c21 --- /dev/null +++ b/scss/bootstrap.scss @@ -0,0 +1,28 @@ +/******* Customized Bootstrap ********/ + +$primary: #7EBC12; +$secondary: #FF0F10; +$light: #F2F2F2; +$dark: #1D2833; + +$font-family-base: 'Open Sans', sans-serif; + +$headings-font-family: 'Montserrat', sans-serif; + +$body-bg: $light; + +$body-color: #5A5A5A; + +$headings-color: $dark; + +$display-font-weight: 700; + +$enable-responsive-font-sizes: true; + +$border-radius: 8px; + +$link-decoration: none; + +$enable-negative-margins: true; + +@import "bootstrap/scss/bootstrap"; \ No newline at end of file diff --git a/scss/bootstrap/scss/_accordion.scss b/scss/bootstrap/scss/_accordion.scss new file mode 100644 index 0000000..fc62ceb --- /dev/null +++ b/scss/bootstrap/scss/_accordion.scss @@ -0,0 +1,118 @@ +// +// Base styles +// + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: $accordion-button-padding-y $accordion-button-padding-x; + @include font-size($font-size-base); + color: $accordion-button-color; + text-align: left; // Reset button style + background-color: $accordion-button-bg; + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition($accordion-transition); + + &:not(.collapsed) { + color: $accordion-button-active-color; + background-color: $accordion-button-active-bg; + box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color; + + &::after { + background-image: escape-svg($accordion-button-active-icon); + transform: $accordion-icon-transform; + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: $accordion-icon-width; + height: $accordion-icon-width; + margin-left: auto; + content: ""; + background-image: escape-svg($accordion-button-icon); + background-repeat: no-repeat; + background-size: $accordion-icon-width; + @include transition($accordion-icon-transition); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + border-color: $accordion-button-focus-border-color; + outline: 0; + box-shadow: $accordion-button-focus-box-shadow; + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + background-color: $accordion-bg; + border: $accordion-border-width solid $accordion-border-color; + + &:first-of-type { + @include border-top-radius($accordion-border-radius); + + .accordion-button { + @include border-top-radius($accordion-inner-border-radius); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius($accordion-border-radius); + + .accordion-button { + &.collapsed { + @include border-bottom-radius($accordion-inner-border-radius); + } + } + + .accordion-collapse { + @include border-bottom-radius($accordion-border-radius); + } + } +} + +.accordion-body { + padding: $accordion-body-padding-y $accordion-body-padding-x; +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + .accordion-collapse { + border-width: 0; + } + + .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + .accordion-button { + @include border-radius(0); + } + } +} diff --git a/scss/bootstrap/scss/_alert.scss b/scss/bootstrap/scss/_alert.scss new file mode 100644 index 0000000..34f1e84 --- /dev/null +++ b/scss/bootstrap/scss/_alert.scss @@ -0,0 +1,57 @@ +// +// Base styles +// + +.alert { + position: relative; + padding: $alert-padding-y $alert-padding-x; + margin-bottom: $alert-margin-bottom; + border: $alert-border-width solid transparent; + @include border-radius($alert-border-radius); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert. + +@each $state, $value in $theme-colors { + $alert-background: shift-color($value, $alert-bg-scale); + $alert-border: shift-color($value, $alert-border-scale); + $alert-color: shift-color($value, $alert-color-scale); + @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) { + $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale)); + } + .alert-#{$state} { + @include alert-variant($alert-background, $alert-border, $alert-color); + } +} +// scss-docs-end alert-modifiers diff --git a/scss/bootstrap/scss/_badge.scss b/scss/bootstrap/scss/_badge.scss new file mode 100644 index 0000000..08df1b8 --- /dev/null +++ b/scss/bootstrap/scss/_badge.scss @@ -0,0 +1,29 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + display: inline-block; + padding: $badge-padding-y $badge-padding-x; + @include font-size($badge-font-size); + font-weight: $badge-font-weight; + line-height: 1; + color: $badge-color; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius($badge-border-radius); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/scss/bootstrap/scss/_breadcrumb.scss b/scss/bootstrap/scss/_breadcrumb.scss new file mode 100644 index 0000000..f7fafe7 --- /dev/null +++ b/scss/bootstrap/scss/_breadcrumb.scss @@ -0,0 +1,28 @@ +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: $breadcrumb-padding-y $breadcrumb-padding-x; + margin-bottom: $breadcrumb-margin-bottom; + @include font-size($breadcrumb-font-size); + list-style: none; + background-color: $breadcrumb-bg; + @include border-radius($breadcrumb-border-radius); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: $breadcrumb-item-padding-x; + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: $breadcrumb-item-padding-x; + color: $breadcrumb-divider-color; + content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: $breadcrumb-active-color; + } +} diff --git a/scss/bootstrap/scss/_button-group.scss b/scss/bootstrap/scss/_button-group.scss new file mode 100644 index 0000000..13aa056 --- /dev/null +++ b/scss/bootstrap/scss/_button-group.scss @@ -0,0 +1,139 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + // Prevent double borders when buttons are next to each other + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-left: -$btn-border-width; + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: -$btn-border-width; + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + > .btn ~ .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/scss/bootstrap/scss/_buttons.scss b/scss/bootstrap/scss/_buttons.scss new file mode 100644 index 0000000..ee4287c --- /dev/null +++ b/scss/bootstrap/scss/_buttons.scss @@ -0,0 +1,111 @@ +// +// Base styles +// + +.btn { + display: inline-block; + font-family: $btn-font-family; + font-weight: $btn-font-weight; + line-height: $btn-line-height; + color: $body-color; + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + background-color: transparent; + border: $btn-border-width solid transparent; + @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius); + @include transition($btn-transition); + + &:hover { + color: $body-color; + text-decoration: if($link-hover-decoration == underline, none, null); + } + + .btn-check:focus + &, + &:focus { + outline: 0; + box-shadow: $btn-focus-box-shadow; + } + + .btn-check:checked + &, + .btn-check:active + &, + &:active, + &.active { + @include box-shadow($btn-active-box-shadow); + + &:focus { + @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow); + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + pointer-events: none; + opacity: $btn-disabled-opacity; + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @include button-variant($value, $value); + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + font-weight: $font-weight-normal; + color: $btn-link-color; + text-decoration: $link-decoration; + + &:hover { + color: $btn-link-hover-color; + text-decoration: $link-hover-decoration; + } + + &:focus { + text-decoration: $link-hover-decoration; + } + + &:disabled, + &.disabled { + color: $btn-link-disabled-color; + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/scss/bootstrap/scss/_card.scss b/scss/bootstrap/scss/_card.scss new file mode 100644 index 0000000..e331421 --- /dev/null +++ b/scss/bootstrap/scss/_card.scss @@ -0,0 +1,215 @@ +// +// Base styles +// + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 + height: $card-height; + word-wrap: break-word; + background-color: $card-bg; + background-clip: border-box; + border: $card-border-width solid $card-border-color; + @include border-radius($card-border-radius); + + > hr { + margin-right: 0; + margin-left: 0; + } + + > .list-group { + border-top: inherit; + border-bottom: inherit; + + &:first-child { + border-top-width: 0; + @include border-top-radius($card-inner-border-radius); + } + + &:last-child { + border-bottom-width: 0; + @include border-bottom-radius($card-inner-border-radius); + } + } + + // Due to specificity of the above selector (`.card > .list-group`), we must + // use a child selector here to prevent double borders. + > .card-header + .list-group, + > .list-group + .card-footer { + border-top: 0; + } +} + +.card-body { + // Enable `flex-grow: 1` for decks and groups so that card blocks take up + // as much space as possible, ensuring footers are aligned to the bottom. + flex: 1 1 auto; + padding: $card-spacer-y $card-spacer-x; + color: $card-color; +} + +.card-title { + margin-bottom: $card-title-spacer-y; +} + +.card-subtitle { + margin-top: -$card-title-spacer-y / 2; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link { + &:hover { + text-decoration: none; + } + + + .card-link { + margin-left: $card-spacer-x; + } +} + +// +// Optional textual caps +// + +.card-header { + padding: $card-cap-padding-y $card-cap-padding-x; + margin-bottom: 0; // Removes the default margin-bottom of + color: $card-cap-color; + background-color: $card-cap-bg; + border-bottom: $card-border-width solid $card-border-color; + + &:first-child { + @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0); + } +} + +.card-footer { + padding: $card-cap-padding-y $card-cap-padding-x; + color: $card-cap-color; + background-color: $card-cap-bg; + border-top: $card-border-width solid $card-border-color; + + &:last-child { + @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius); + } +} + + +// +// Header navs +// + +.card-header-tabs { + margin-right: -$card-cap-padding-x / 2; + margin-bottom: -$card-cap-padding-y; + margin-left: -$card-cap-padding-x / 2; + border-bottom: 0; + + @if $nav-tabs-link-active-bg != $card-bg { + .nav-link.active { + background-color: $card-bg; + border-bottom-color: $card-bg; + } + } +} + +.card-header-pills { + margin-right: -$card-cap-padding-x / 2; + margin-left: -$card-cap-padding-x / 2; +} + +// Card image +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: $card-img-overlay-padding; + @include border-radius($card-inner-border-radius); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch +} + +.card-img, +.card-img-top { + @include border-top-radius($card-inner-border-radius); +} + +.card-img, +.card-img-bottom { + @include border-bottom-radius($card-inner-border-radius); +} + + +// +// Card groups +// + +.card-group { + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + margin-bottom: $card-group-margin; + } + + @include media-breakpoint-up(sm) { + display: flex; + flex-flow: row wrap; + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 + flex: 1 0 0%; + margin-bottom: 0; + + + .card { + margin-left: 0; + border-left: 0; + } + + // Handle rounded corners + @if $enable-rounded { + &:not(:last-child) { + @include border-end-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-right-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-right-radius: 0; + } + } + + &:not(:first-child) { + @include border-start-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-left-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-left-radius: 0; + } + } + } + } + } +} diff --git a/scss/bootstrap/scss/_carousel.scss b/scss/bootstrap/scss/_carousel.scss new file mode 100644 index 0000000..d389c30 --- /dev/null +++ b/scss/bootstrap/scss/_carousel.scss @@ -0,0 +1,229 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +/* rtl:begin:ignore */ +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +/* rtl:end:ignore */ + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg); +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg); +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + list-style: none; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: $carousel-indicator-active-bg; + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) / 2; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) / 2; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: $carousel-caption-color; + text-align: center; +} + +// Dark mode carousel + +.carousel-dark { + .carousel-control-prev-icon, + .carousel-control-next-icon { + filter: $carousel-dark-control-icon-filter; + } + + .carousel-indicators [data-bs-target] { + background-color: $carousel-dark-indicator-active-bg; + } + + .carousel-caption { + color: $carousel-dark-caption-color; + } +} diff --git a/scss/bootstrap/scss/_close.scss b/scss/bootstrap/scss/_close.scss new file mode 100644 index 0000000..32a0f68 --- /dev/null +++ b/scss/bootstrap/scss/_close.scss @@ -0,0 +1,40 @@ +// transparent background and border properties included for button version. +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +.btn-close { + box-sizing: content-box; + width: $btn-close-width; + height: $btn-close-height; + padding: $btn-close-padding-y $btn-close-padding-x; + color: $btn-close-color; + background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + border: 0; // for button elements + @include border-radius(); + opacity: $btn-close-opacity; + + // Override 's hover style + &:hover { + color: $btn-close-color; + text-decoration: none; + opacity: $btn-close-hover-opacity; + } + + &:focus { + outline: 0; + box-shadow: $btn-close-focus-shadow; + opacity: $btn-close-focus-opacity; + } + + &:disabled, + &.disabled { + pointer-events: none; + user-select: none; + opacity: $btn-close-disabled-opacity; + } +} + +.btn-close-white { + filter: $btn-close-white-filter; +} diff --git a/scss/bootstrap/scss/_containers.scss b/scss/bootstrap/scss/_containers.scss new file mode 100644 index 0000000..f88f1e5 --- /dev/null +++ b/scss/bootstrap/scss/_containers.scss @@ -0,0 +1,41 @@ +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +@if $enable-grid-classes { + // Single container class with breakpoint max-widths + .container, + // 100% wide container at all breakpoints + .container-fluid { + @include make-container(); + } + + // Responsive containers that are 100% wide until a breakpoint + @each $breakpoint, $container-max-width in $container-max-widths { + .container-#{$breakpoint} { + @extend .container-fluid; + } + + @include media-breakpoint-up($breakpoint, $grid-breakpoints) { + %responsive-container-#{$breakpoint} { + max-width: $container-max-width; + } + + // Extend each breakpoint which is smaller or equal to the current breakpoint + $extend-breakpoint: true; + + @each $name, $width in $grid-breakpoints { + @if ($extend-breakpoint) { + .container#{breakpoint-infix($name, $grid-breakpoints)} { + @extend %responsive-container-#{$breakpoint}; + } + + // Once the current breakpoint is reached, stop extending + @if ($breakpoint == $name) { + $extend-breakpoint: false; + } + } + } + } + } +} diff --git a/scss/bootstrap/scss/_dropdown.scss b/scss/bootstrap/scss/_dropdown.scss new file mode 100644 index 0000000..06e70f7 --- /dev/null +++ b/scss/bootstrap/scss/_dropdown.scss @@ -0,0 +1,240 @@ +// The dropdown wrapper (`
    `) +.dropup, +.dropend, +.dropdown, +.dropstart { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; + + // Generate the caret automatically + @include caret(); +} + +// The dropdown menu +.dropdown-menu { + position: absolute; + z-index: $zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + min-width: $dropdown-min-width; + padding: $dropdown-padding-y $dropdown-padding-x; + margin: 0; // Override default margin of ul + @include font-size($dropdown-font-size); + color: $dropdown-color; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + list-style: none; + background-color: $dropdown-bg; + background-clip: padding-box; + border: $dropdown-border-width solid $dropdown-border-color; + @include border-radius($dropdown-border-radius); + @include box-shadow($dropdown-box-shadow); + + &[data-bs-popper] { + top: 100%; + left: 0; + margin-top: $dropdown-spacer; + } +} + +// scss-docs-start responsive-breakpoints +// We deliberately hardcode the `bs-` prefix because we check +// this custom property in JS to determine Popper's positioning + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .dropdown-menu#{$infix}-start { + --bs-position: start; + + &[data-bs-popper] { + right: auto #{"/* rtl:ignore */"}; + left: 0 #{"/* rtl:ignore */"}; + } + } + + .dropdown-menu#{$infix}-end { + --bs-position: end; + + &[data-bs-popper] { + right: 0 #{"/* rtl:ignore */"}; + left: auto #{"/* rtl:ignore */"}; + } + } + } +} +// scss-docs-end responsive-breakpoints + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// Just add .dropup after the standard .dropdown class and you're set. +.dropup { + .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: $dropdown-spacer; + } + + .dropdown-toggle { + @include caret(up); + } +} + +.dropend { + .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: $dropdown-spacer; + } + + .dropdown-toggle { + @include caret(end); + &::after { + vertical-align: 0; + } + } +} + +.dropstart { + .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: $dropdown-spacer; + } + + .dropdown-toggle { + @include caret(start); + &::before { + vertical-align: 0; + } + } +} + + +// Dividers (basically an `
    `) within the dropdown +.dropdown-divider { + height: 0; + margin: $dropdown-divider-margin-y 0; + overflow: hidden; + border-top: 1px solid $dropdown-divider-bg; +} + +// Links, buttons, and more within the dropdown menu +// +// `
    + + + +
    +
    +
    +
    +

    Our Team

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

    Our Team Members

    +

    Vero justo sed sed vero clita amet. Et justo vero sea diam elitr amet ipsum eos + ipsum clita duo sed. Sed vero sea diam erat vero elitr sit clita.

    +
    +
    +
    +
    +
    + +
    Full Name
    + Designation +
    +
    + + + +
    +
    +
    +
    +
    +
    + +
    Full Name
    + Designation +
    +
    + + + +
    +
    +
    +
    +
    +
    + +
    Full Name
    + Designation +
    +
    + + + +
    +
    +
    +
    +
    +
    + +
    Full Name
    + Designation +
    +
    + + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testimonial.html b/testimonial.html new file mode 100644 index 0000000..d1f84ed --- /dev/null +++ b/testimonial.html @@ -0,0 +1,275 @@ + + + + + + GreenHost - Web Hosting HTML Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + Loading... +
    +
    + + + + +
    + + +
    +
    +
    +
    +

    Testimonial

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

    What Say Our Clients!!!

    +

    Vero justo sed sed vero clita amet. Et justo vero sea diam elitr amet ipsum eos ipsum clita duo sed. Sed vero sea diam erat vero elitr sit clita.

    +
    + +
    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tos.html b/tos.html new file mode 100644 index 0000000..ce17d04 --- /dev/null +++ b/tos.html @@ -0,0 +1,422 @@ + + + + + + IO Cloud Solutions - Shared Hosting, VPS, Dedicated Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + Loading... +
    +
    + + + + +
    + + +
    +
    +
    +
    +

    Terms of Service

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

    Last Revised: 01/01/2024

    +

    PLEASE READ THIS TERMS OF SERVICE AGREEMENT CAREFULLY, AS IT CONTAINS IMPORTANT INFORMATION REGARDING YOUR LEGAL RIGHTS AND REMEDIES.

    +

    1. OVERVIEW

    +

    This Universal Terms of Service Agreement (this “Agreement”) is entered into by and between IO Cloud Solutions and you, and is made effective as of the date of your use of this website (“Site”) or the date of electronic acceptance. This Agreement sets forth the general terms and conditions of your use of the Site and the products and services accessed through this Site (individually and collectively, the “Service” or “Services”), and is in addition to (not in lieu of) any specific terms and conditions that apply to the particular Services. Whether you are simply browsing or using this Site, your use of this Site and your electronic acceptance of this Agreement signifies that you have read, understand, acknowledge and agree to be bound by this Agreement, along with the following policies and the applicable product agreements, which are incorporated herein by reference:

    +

    The terms “we”, “us” or “our” shall refer to IO Cloud Solutions. The terms “you”, “your”, “User” or “customer” shall refer to any individual or entity who accepts this Agreement, has access to your account or uses the Services. Nothing in this Agreement shall be deemed to confer any third-party rights or benefits. IO Cloud Solutions may, in its sole and absolute discretion, change or modify this Agreement, and any policies or agreements which are incorporated herein, at any time, and such changes or modifications shall be effective immediately upon posting to this Site. Your use of this Site or the Services after such changes or modifications have been made shall constitute your acceptance of this Agreement as last revised. If you do not agree to be bound by this Agreement as last revised, do not use (or continue to use) this Site or the Services. In addition, IO Cloud Solutions may occasionally notify you of changes or modifications to this Agreement by email. It is therefore very important that you keep your “Account” information current. IO Cloud Solutions assumes no liability or responsibility for your failure to receive an email notification if such failure results from an inaccurate email address.

    +

    2. ELIGIBILITY; AUTHORITY

    +

    This Site and the Services are available only to Users who can form legally binding contracts under applicable law. By using this Site or the Services, you represent and warrant that you are

    +
      +
    1. at least eighteen (18) years of age,
    2. +
    3. otherwise recognized as being able to form legally binding contracts under applicable law, and
    4. +
    5. are not a person barred from purchasing or receiving the Services found under the laws of applicable jurisdiction.
    6. +
    +

    If you are entering into this Agreement on behalf of a corporate entity, you represent and warrant that you have the legal authority to bind such corporate entity to the terms and conditions contained in this Agreement, in which case the terms “you”, “your”, “User” or “customer” shall refer to such corporate entity. If, after your electronic acceptance of this Agreement, IO Cloud Solutions finds that you do not have the legal authority to bind such corporate entity, you will be personally responsible for the obligations contained in this Agreement. IO Cloud Solutions shall not be liable for any loss or damage resulting from IO Cloud Solutions’s reliance on any instruction, notice, document or communication reasonably believed by IO Cloud Solutions to be genuine and originating from an authorized representative of your corporate entity. If there is reasonable doubt about the authenticity of any such instruction, notice, document or communication, IO Cloud Solutions reserves the right (but undertakes no duty) to require additional authentication from you.

    +

    You further agree to be bound by the terms of this Agreement for transactions entered into by you, anyone acting as your agent and anyone who uses your account or the Services, whether or not authorized by you.

    +

    IO Cloud Solutions is concerned about the safety and privacy of all its users, particularly children. Please remember that the Service is designed to appeal to a broad audience. Accordingly, as the legal guardian, it is your responsibility to determine whether any of the Service areas and/or Content are appropriate for your child.

    +

    3. ACCOUNTS; TRANSFER OF DATA ABROAD

    +

    Accounts

    +

    In order to access some features of this Site or use some Services, you will have to create an Account. You represent and warrant to IO Cloud Solutions that all information you submit when you create your Account is accurate, current and complete, and that you will keep your Account information accurate, current and complete. If IO Cloud Solutions has reason to believe that your Account information is untrue, inaccurate, out-of-date or incomplete, IO Cloud Solutions reserves the right, in its sole and absolute discretion, to suspend or terminate your Account.

    +

    You are solely responsible for the activity that occurs on your Account, whether authorized by you or not, and you must keep your Account information secure, including without limitation your customer number/login, password. You must notify IO Cloud Solutions immediately of any breach of security or unauthorized use of your Account. IO Cloud Solutions will not be liable for any loss you incur due to any unauthorized use of your Account. You, however, may be liable for any loss IO Cloud Solutions or others incur caused by your Account, whether caused by you, or by an authorized person, or by an unauthorized person.

    +

    Transfer of Data Abroad

    +

    If you are visiting this Site from a country other than the country in which our servers are located, your communications with us may result in the transfer of information (including your Account information) across international boundaries. By visiting this Site and communicating electronically with us, you consent to such transfers.

    +

    4. AVAILABILITY OF WEBSITE/SERVICES

    +

    Subject to the terms and conditions of this Agreement and our other policies and procedures, we shall use commercially reasonable efforts to attempt to provide this Site and the Services on a twenty-four (24) hours a day, seven (7) days a week basis. You acknowledge and agree that from time to time this Site may be inaccessible or inoperable for any reason including, but not limited to, equipment malfunctions; periodic maintenance, repairs or replacements that we undertake from time to time; or causes beyond our reasonable control or that are not reasonably foreseeable including, but not limited to, interruption or failure of telecommunication or digital transmission links, hostile network attacks, network congestion or other failures. You acknowledge and agree that we have no control over the availability of this Site or the Service on a continuous or uninterrupted basis and that we assume no liability to you or any other party with regard thereto.

    +

    From time to time, IO Cloud Solutions may offer new Services (limited preview services or new features to existing Services) in a pre-release version. New Services, new features to existing Services or limited preview services shall be known, individually and collectively, as “Trial Services”. If you elect to use any Trial Services, then your use of the Trial Services is subject to the following terms and conditions:

    +
      +
    1. You acknowledge and agree that the Trial Services are pre-release versions and may not work properly;
    2. +
    3. You acknowledge and agree that your use of the Trial Services may expose you to unusual risks of operational failures;
    4. +
    5. The Trial Services are provided as-is, so we do not recommend using them in production or mission critical environments;
    6. +
    7. IO Cloud Solutions reserves the right to modify, change, or discontinue any aspect of the Trial Services at any time;
    8. +
    9. Commercially released versions of the Trial Services may change substantially, and programs that use or run with the Trial Services may not work with the commercially released versions or subsequent releases;
    10. +
    11. IO Cloud Solutions may limit availability of customer service support time dedicated to support of the Trial Services;
    12. +
    13. You acknowledge and agree to provide prompt feedback regarding your experience with the Trial Services in a form reasonably requested by us, including information necessary to enable us to duplicate errors or problems you experience. You acknowledge and agree that we may use your feedback for any purpose, including product development purposes. At our request, you will provide us with comments that we may use publicly for press materials and marketing collateral. Any intellectual property inherent in your feedback or arising from your use of the Trial Services shall be owned exclusively by IO Cloud Solutions;
    14. +
    15. You acknowledge and agree that all information regarding your use of the Trial Services, including your experience with and opinions regarding the Trial Services, is confidential, and may not be disclosed to a third party or used for any purpose other than providing feedback to IO Cloud Solutions;
    16. +
    17. The Trial Services are provided “as-is”, “as available”, and “with all faults”. To the fullest extent permitted by law, IO Cloud Solutions disclaims any and all warranties, statutory, express or implied, with respect to the Trial Services including, but not limited to, any implied warranties of title, merchantability, fitness for a particular purpose and non-infringement.
    18. +
    +

    You acknowledge and agree that you have the necessary rights and permissions to share all information necessary to provide the Services with IO Cloud Solutions. You acknowledge and agree that the Services may be provided by independent contractors or third party service providers.

    +

    5. GENERAL RULES OF CONDUCT

    +

    You acknowledge and agree that:

    +
      +
    • Your use of this Site and the Services, including any content you submit, will comply with this Agreement and all applicable local, state, national and international laws, rules and regulations.
    • +
    • You will not collect or harvest (or permit anyone else to collect or harvest) any User Content (as defined below) or any non-public or personally identifiable information about another User or any other person or entity without their express prior written consent.
    • +
    • You will not use this Site or the Services in a manner (as determined by IO Cloud Solutions in its sole and absolute discretion) that: +
        +
      • Is illegal, or promotes or encourages illegal activity;
      • +
      • Promotes, encourages or engages in pornography;
      • +
      • Promotes, encourages or engages in harm or exploitation of children;
      • +
      • Promotes, encourages or engages in terrorism, violence against people, animals, or property;
      • +
      • Promotes, encourages or engages in any spam or other unsolicited bulk emails, or computer or network hacking or cracking, cloaking or sneaky redirects;
      • +
      • Promotes, encourages or engages in the sale or distribution of prescription medication without a valid prescription;
      • +
      • Infringes on the intellectual property rights of another User or any other person or entity (or links to content on third party sites/servers that infringes intellectual property rights);
      • +
      • Violates the privacy or publicity rights of another User or any other person or entity, or breaches any duty of confidentiality that you owe to another User or any other person or entity;
      • +
      • Interferes with the operation of this Site or the Services found at this Site;
      • +
      • Contains or installs any viruses, worms, bugs, Trojan horses or other code, files or programs designed to, or capable of, disrupting, damaging or limiting the functionality of any software or hardware; or
      • +
      • Contains false or deceptive language, or unsubstantiated or comparative claims, regarding IO Cloud Solutions or IO Cloud Solutions’s Services.
      • +
      • You will not copy or distribute in any medium any part of this Site or the Services, except where expressly authorized by IO Cloud Solutions.
      • +
      • You will not modify or alter any part of this Site or the Services found at this Site or any of its related technologies.
      • +
      • You will not access IO Cloud Solutions Content (as defined below) or User Content through any technology or means other than through this Site itself, or as IO Cloud Solutions may designate.
      • +
      • You will not impersonate any person or entity, including, but not limited to, an IO Cloud Solutions official, forum leader, guide or host, or falsely state or otherwise misrepresent your affiliation with a person or entity.
      • +
      • You agree to back-up all of your User Content so that you can access and use it when needed. IO Cloud Solutions does not warrant that it backs-up any Account or User Content, and you agree to accept as a risk the loss of any and all of your User Content.
      • +
      • You will not re-sell or provide the Services for a commercial purpose, including any of IO Cloud Solutions’s related technologies, without IO Cloud Solutions’s express prior written consent.
      • +
      • You agree to provide government-issued photo identification and/or government-issued business identification as required for verification of identity when requested.
      • +
      +
    • +
    • You agree to not use the Services to: +
        +
      • forge headers or otherwise manipulate identifiers in order to disguise the origin of any Content transmitted through the Service;
      • +
      • upload, post, email, transmit or otherwise make available any material that is of keylogging / proxy service / irc / shell(s) if any type / file hosting / file sharing types.
      • +
      • “stalk” or otherwise harass another; and/or
      • +
      • upload, post, email, transmit or otherwise material for the purposes of file distribution, relay, or streaming reasons.
      • +
      +
    • +
    +

    IO Cloud Solutions reserves the right to modify, change, or discontinue any aspect of this Site or the Services, including without limitation prices and fees for the same, at any time.

    +

    6. ACCEPTABLE SERVER RESOURCE USE

    +

    Sites must not use excessive amounts of server resources. These include bandwidth, processor utilization and/or disk space.

    +

    You acknowledge that IO Cloud Solutions may establish general practices and limits concerning use of the Service, including without limitation the maximum number of days that idle hosting accounts, message board postings or other uploaded Content will be retained by the Service, the maximum number of email messages that may be sent from or received by an account on the Service, the maximum size of any email message that may be sent from or received by an account on the Service, the maximum disk space that will be allotted on IO Cloud Solutions’s servers on your behalf, and the maximum number of times (and the maximum duration for which) you may access the Service in a given period of time. You agree that IO Cloud Solutions has no responsibility or liability for the deletion or failure to store any messages and other communications or other Content maintained or transmitted by the Service. You acknowledge that IO Cloud Solutions may, in its sole and absolute discretion, suspend or terminate your Account if we consider it to be inactive for an extended period of time. You further acknowledge that IO Cloud Solutions reserves the right to modify these general practices and limits from time to time.

    +

    Script Usage Terms

    +

    Scripts on the site must be designed to produce web-based content, and not to use the server as an application server. Using the server to generate large volumes of email from a database is an example of activity that is not allowed. Scripts should not attempt to manipulate the timeouts on servers. These are set at the present values to ensure the reliability of the server. Sites that reset these do so because they are resource intensive, and adversely affect server performance and are therefore not allowed. Scripts that are designed to provide proxy services, anonymous or otherwise, are not allowed.

    +

    The primary purpose of any script must be to produce a web page. Scripts that send a single email based upon user entered information, or update a database are acceptable. Scripts that send bulk email or perform processor intensive database processes are not allowed. All outgoing mail is monitored and filtered and must be sent to or from a IO Cloud Solutions-hosted domain.

    +

    Sites must not contain scripts that attempt to access privileged server resources, or other sites on the same server.

    +

    Disk Space Usage Terms

    +

    IO Cloud Solutions offers large web space and bandwidth with hosting accounts. By this, we mean space for legitimate web site content and bandwidth for visitors to view it. All files on a domain must be part of the active website and linked to the site. Sites should not contain any backups, downloads, or other non-web based content. We will treat all password protected archive (e.g. zip and rar) files as unacceptable. Multimedia content such as audio and video is acceptable provided it is streamed to the user, links to HTTP download of this content is not acceptable.

    +

    Archives of movie files, audio files, zips, rars or any large volumes of files used for downloading/sharing is not allowed.

    +

    Maximum Free Hosting Accounts per Person

    +

    One free hosting accounts are allowed per person. Registering more than one account is considered abuse and will result in all accounts being terminated without notice.

    +

    7. YOUR USE OF IO Cloud Solutions CONTENT AND USER CONTENT

    +

    In addition to the general rules above, the provisions in this Section apply specifically to your use of IO Cloud Solutions Content and User Content posted to IO Cloud Solutions’s corporate websites (i.e., those sites which IO Cloud Solutions directly controls or maintains). The applicable provisions are not intended to and do not have the effect of transferring any ownership or licensed rights (including intellectual property rights) you may have in content posted to your hosted websites.

    +

    IO Cloud Solutions Content

    +

    Except for User Content, the content on this Site and the Services, including without limitation the text, software, scripts, source code, API, graphics, photos, sounds, music, videos and interactive features and the trademarks, service marks and logos contained therein (“IO Cloud Solutions Content”), are owned by or licensed to IO Cloud Solutions in perpetuity, and are subject to copyright, trademark, and/or patent protection in the United States of America and foreign countries, and other intellectual property rights under United States of America and foreign laws.

    +

    IO Cloud Solutions Content is provided to you “as-is”, “as available” and “with all faults” for your information and personal, non-commercial use only and may not be downloaded, copied, reproduced, distributed, transmitted, broadcast, displayed, sold, licensed, or otherwise exploited for any purposes whatsoever without the express prior written consent of IO Cloud Solutions.

    +

    No right or license under any copyright, trademark, patent, or other proprietary right or license is granted by this Agreement.

    +

    IO Cloud Solutions reserves all rights not expressly granted in and to the IO Cloud Solutions Content, this Site and the Services, and this Agreement does not transfer ownership of any of these rights.

    +

    User Content

    +

    Some features of this Site or the Services may allow Users to view, post, publish, share, store, or manage (a) ideas, opinions, recommendations, or advice (“User Submissions”), or (b) literary, artistic, musical, or other content, including but not limited to photos and videos (together with User Submissions, “User Content”). User Content includes all content submitted through your Account.

    +

    By posting or publishing User Content to this Site or to the Services, you represent and warrant to IO Cloud Solutions that (i) you have all necessary rights to distribute User Content via this Site or via the Services, either because you are the author of the User Content and have the right to distribute the same, or because you have the appropriate distribution rights, licenses, consents, and/or permissions to use, in writing, from the copyright or other owner of the User Content, and (ii) the User Content does not violate the rights of any third party.

    +

    Security

    +

    You agree not to circumvent, disable or otherwise interfere with the security-related features of this Site or the Services found at this Site (including without limitation those features that prevent or restrict use or copying of any IO Cloud Solutions Content or User Content) or enforce limitations on the use of this Site or the Services found at this Site, the IO Cloud Solutions Content or the User Content therein.

    +

    8. IO Cloud Solutions’S USE OF USER CONTENT

    +

    The provisions of this Section apply specifically to IO Cloud Solutions’s use of User Content posted to IO Cloud Solutions’s corporate websites (i.e., those sites which IO Cloud Solutions directly controls or maintains). The applicable provisions are not intended to and do not have the effect of transferring any ownership or licensed rights (including intellectual property rights) you may have in content posted to your hosted websites.

    +

    Generally. You shall be solely responsible for any and all of your User Content or User Content that is submitted through your Account, and the consequences of, and requirements for, distributing it.

    +

    With Respect to User Submissions. You acknowledge and agree that:

    +
      +
    • Your User Submissions are entirely voluntary.
    • +
    • Your User Submissions do not establish a confidential relationship or obligate IO Cloud Solutions to treat your User Submissions as confidential or secret.
    • +
    • IO Cloud Solutions has no obligation, either express or implied, to develop or use your User Submissions, and no compensation is due to you or to anyone else for any intentional or unintentional use of your User Submissions.
    • +
    • IO Cloud Solutions may be working on the same or similar content, it may already know of such content from other sources, it may simply wish to develop this (or similar) content on its own, or it may have taken / will take some other action.
    • +
    • IO Cloud Solutions shall own exclusive rights (including all intellectual property and other proprietary rights) to any User Submissions posted to this Site, and shall be entitled to the unrestricted use and dissemination of any User Submissions posted to this Site for any purpose, commercial or otherwise, without acknowledgment or compensation to you or to anyone else.
    • +
    +

    With Respect to User Content (Other Than User Submissions)

    +

    If you have a website or other content hosted by IO Cloud Solutions, you shall retain all of your ownership or licensed rights in User Content.

    +

    By posting or publishing User Content to this Site or through the Services, you authorize IO Cloud Solutions to use the intellectual property and other proprietary rights in and to your User Content to enable inclusion and use of the User Content in the manner contemplated by this Site and this Agreement.

    +

    You hereby grant IO Cloud Solutions a worldwide, non-exclusive, royalty-free, sublicensable (through multiple tiers), and transferable license to use, reproduce, distribute, prepare derivative works of, combine with other works, display, and perform your User Content in connection with this Site, the Services and IO Cloud Solutions’s (and IO Cloud Solutions’s affiliates’) business(es), including without limitation for promoting and redistributing all or part of this Site in any media formats and through any media channels without restrictions of any kind and without payment or other consideration of any kind, or permission or notification, to you or any third party.

    +

    You also hereby grant each User of this Site a non-exclusive license to access your User Content (except User Content that you designate “private” or “password protected”) through this Site, and to use, reproduce, distribute, prepare derivative works of, combine with other works, display, and perform your User Content as permitted through the functionality of this Site and under this Agreement. The above licenses granted by you in your User Content terminate within a commercially reasonable time after you remove or delete your User Content from this Site. You understand and agree, however, that IO Cloud Solutions may retain (but not distribute, display, or perform) server copies of your User Content that have been removed or deleted. The above licenses granted by you in your User Content are perpetual and irrevocable. Notwithstanding anything to the contrary contained herein, IO Cloud Solutions shall not use any User Content that has been designated “private” or “password protected” by you for the purpose of promoting this Site or IO Cloud Solutions’s (or IO Cloud Solutions’s affiliates’) business(es).

    +

    9. MONITORING OF CONTENT; ACCOUNT TERMINATION POLICY

    +

    You acknowledge that IO Cloud Solutions may or may not pre-screen User Content (whether posted to a website hosted by IO Cloud Solutions or posted to this Site), but that IO Cloud Solutions and its designees shall have the right (but not the obligation) in their sole discretion to pre-screen, refuse, or remove any User Content that is available via the Service.

    +

    Without limiting the foregoing, IO Cloud Solutions and its designees shall have the right to decide whether any User Content violates the Agreement or is otherwise objectionable. IO Cloud Solutions may remove any item of User Content (whether posted to a website hosted by IO Cloud Solutions or posted to this Site) and/or terminate a User’s access to this Site or the Services found at this Site for posting or publishing any material in violation of this Agreement, or for otherwise violating this Agreement (as determined by IO Cloud Solutions in its sole and absolute discretion), at any time and without prior notice. IO Cloud Solutions may also terminate a User’s access to this Site or the Services found at this Site if IO Cloud Solutions has reason to believe the User is a repeat offender. If IO Cloud Solutions terminates your access to this Site or the Services found at this Site, IO Cloud Solutions may, in its sole and absolute discretion, remove and destroy any data and files stored by you on its servers.

    +

    10. ADDITIONAL RESERVATION OF RIGHTS

    +

    IO Cloud Solutions expressly reserves the right to deny, cancel, terminate, suspend, lock, or modify access to (or control of) any Account or Services (including the right to cancel or transfer any domain name registration) for any reason (as determined by IO Cloud Solutions in its sole and absolute discretion), including but not limited to the following:

    +
      +
    1. to correct mistakes made by IO Cloud Solutions in offering or delivering any Services,
    2. +
    3. to assist with our fraud and abuse detection and prevention efforts,
    4. +
    5. to comply with court orders against you and/or your domain name or website and applicable local, state, national and international laws, rules and regulations,
    6. +
    7. to comply with requests of law enforcement, including subpoena requests,
    8. +
    9. to comply with any dispute resolution process,
    10. +
    11. to defend any legal action or threatened legal action without consideration for whether such legal action or threatened legal action is eventually determined to be with or without merit, or
    12. +
    13. to avoid any civil or criminal liability on the part of IO Cloud Solutions, its officers, directors, employees and agents, as well as IO Cloud Solutions’s affiliates, including, but not limited to, instances where you have sued or threatened to sue IO Cloud Solutions.
    14. +
    +

    IO Cloud Solutions expressly reserves the right to terminate, without notice to you, any and all Services where, in IO Cloud Solutions’s sole discretion, you are harassing or threatening IO Cloud Solutions and/or any of IO Cloud Solutions’s employees.

    +

    11. NO SPAM; LIQUIDATED DAMAGES

    +

    No Spam

    +

    We do not tolerate the transmission of spam. We monitor all traffic to and from our web servers for indications of spamming. Customers suspected to be using our products and services for the purpose of sending spam are fully investigated. If we determine there is a problem with spam, we will take the appropriate action to resolve the situation.

    +

    We define spam as the sending of Unsolicited Commercial Email (UCE), Unsolicited Bulk Email (UBE) or Unsolicited Facsimiles (Fax), which is email or facsimile sent to recipients as an advertisement or otherwise, without first obtaining prior confirmed consent to receive these communications. This can include, but is not limited to, the following:

    +
      +
    • Email Messages
    • +
    • Newsgroup postings
    • +
    • Windows system messages
    • +
    • Pop-up messages (aka “adware” or “spyware” messages)
    • +
    • Instant messages (using AOL, MSN, Yahoo or other instant messenger programs)
    • +
    • Online chat room advertisements
    • +
    • Guestbook or Website Forum postings
    • +
    • Facsimile Solicitations
    • +
    • Text/SMS Messages
    • +
    +

    We will not allow our servers and services to be used for the purposes described above. In order to use our products and services, you must not only abide by all applicable laws and regulations, but you must also abide by this no spam policy. Commercial advertising and/or bulk emails or faxes may only be sent to recipients who have “opted-in” to receive messages. They must include a legitimate return address and reply-to address, the sender’s physical address, and an opt-out method in the footer of the email or fax. Upon request by us, conclusive proof of opt-in may be required for an email address or fax number.

    +

    If we determine the services in question are being used in association with spam, we will re-direct, suspend, or cancel any website hosting, domain registration, email boxes or other applicable services until customer responds. The registrant or customer will be required to respond by email to us stating that they will cease to send spam and/or have spam sent on their behalf. In the event we determine the abuse has not stopped after services have been restored the first time, we may terminate the hosting and email boxes associated with the domain name in question.

    +

    We encourage all customers and recipients of email generated from our products and services to report suspected spam. Suspected abuse can be reported by email .

    +

    Liquidated Damages

    +

    You agree that we may immediately terminate any Account which we believe, in our sole and absolute discretion, is transmitting or is otherwise connected with any spam or other unsolicited bulk emails.

    + +

    IO Cloud Solutions supports the protection of intellectual property. If you would like to submit a trademark claim for violation of a mark on which you hold a valid, registered trademark or service mark or a copyright claim for material on which you hold a bona fide copyright, please send them at .

    + +

    This Site and the Services found at this Site may contain links to third-party websites that are not owned or controlled by IO Cloud Solutions. IO Cloud Solutions assumes no responsibility for the content, terms and conditions, privacy policies, or practices of any third-party websites. In addition, IO Cloud Solutions does not censor or edit the content of any third-party websites. By using this Site or the Services found at this Site, you expressly release IO Cloud Solutions from any and all liability arising from your use of any third-party website. Accordingly, IO Cloud Solutions encourages you to be aware when you leave this Site or the Services found at this Site and to review the terms and conditions, privacy policies, and other governing documents of each other website that you may visit.

    +

    Dealings with Advertisers

    +

    Your correspondence or business dealings with, or participation in promotions of, advertisers found on or through the Service, including payment and delivery of related goods or services, and any other terms, conditions, warranties or representations associated with such dealings, are solely between you and such advertiser. You agree that IO Cloud Solutions shall not be responsible or liable for any loss or damage of any sort incurred as the result of any such dealings or as the result of the presence of such advertisers on the Service.

    +

    14. DISCLAIMER OF REPRESENTATIONS AND WARRANTIES

    +

    YOU SPECIFICALLY ACKNOWLEDGE AND AGREE THAT YOUR USE OF THIS SITE AND THE SERVICES FOUND AT THIS SITE SHALL BE AT YOUR OWN RISK AND THAT THIS SITE AND THE SERVICES FOUND AT THIS SITE ARE PROVIDED “AS-IS”, “AS AVAILABLE” AND “WITH ALL FAULTS”. IO Cloud Solutions, ITS OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, AND ALL THIRD PARTY SERVICE PROVIDERS DISCLAIM ALL WARRANTIES, STATUTORY, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IO Cloud Solutions, ITS OFFICERS, DIRECTORS, EMPLOYEES, AND AGENTS MAKE NO REPRESENTATIONS OR WARRANTIES ABOUT:

    +
      +
    1. THE ACCURACY, COMPLETENESS, OR CONTENT OF THIS SITE,
    2. +
    3. THE ACCURACY, COMPLETENESS, OR CONTENT OF ANY SITES LINKED (THROUGH HYPERLINKS, BANNER ADVERTISING OR OTHERWISE) TO THIS SITE, AND/OR
    4. +
    5. THE SERVICES FOUND AT THIS SITE OR ANY SITES LINKED (THROUGH HYPERLINKS, BANNER ADVERTISING OR OTHERWISE) TO THIS SITE, AND IO Cloud Solutions ASSUMES NO LIABILITY OR RESPONSIBILITY FOR THE SAME.
    6. +
    +

    IN ADDITION, YOU SPECIFICALLY ACKNOWLEDGE AND AGREE THAT NO ORAL OR WRITTEN INFORMATION OR ADVICE PROVIDED BY IO Cloud Solutions, ITS OFFICERS, DIRECTORS, EMPLOYEES, OR AGENTS (INCLUDING WITHOUT LIMITATION ITS CALL CENTER OR CUSTOMER SERVICE REPRESENTATIVES), AND THIRD PARTY SERVICE PROVIDERS WILL:

    +
      +
    1. CONSTITUTE LEGAL OR FINANCIAL ADVICE OR
    2. +
    3. CREATE A WARRANTY OF ANY KIND WITH RESPECT TO THIS SITE OR THE SERVICES FOUND AT THIS SITE, AND USERS SHOULD NOT RELY ON ANY SUCH INFORMATION OR ADVICE.
    4. +
    +

    THE FOREGOING DISCLAIMER OF REPRESENTATIONS AND WARRANTIES SHALL APPLY TO THE FULLEST EXTENT PERMITTED BY LAW, AND shall survive any termination or expiration of this Agreement or your use of this Site or the Services found at this Site.

    +

    15. LIMITATION OF LIABILITY

    +

    IN NO EVENT SHALL IO Cloud Solutions, ITS OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, AND ALL THIRD PARTY SERVICE PROVIDERS, BE LIABLE TO YOU OR ANY OTHER PERSON OR ENTITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING ANY THAT MAY RESULT FROM

    +
      +
    1. THE ACCURACY, COMPLETENESS, OR CONTENT OF THIS SITE,
    2. +
    3. THE ACCURACY, COMPLETENESS, OR CONTENT OF ANY SITES LINKED (THROUGH HYPERLINKS, BANNER ADVERTISING OR OTHERWISE) TO THIS SITE,
    4. +
    5. THE SERVICES FOUND AT THIS SITE OR ANY SITES LINKED (THROUGH HYPERLINKS, BANNER ADVERTISING OR OTHERWISE) TO THIS SITE,
    6. +
    7. PERSONAL INJURY OR PROPERTY DAMAGE OF ANY NATURE WHATSOEVER,
    8. +
    9. THIRD-PARTY CONDUCT OF ANY NATURE WHATSOEVER,
    10. +
    11. ANY UNAUTHORIZED ACCESS TO OR USE OF OUR SERVERS AND/OR ANY AND ALL CONTENT, PERSONAL INFORMATION, FINANCIAL INFORMATION OR OTHER INFORMATION AND DATA STORED THEREIN,
    12. +
    13. ANY INTERRUPTION OR CESSATION OF SERVICES TO OR FROM THIS SITE OR ANY SITES LINKED (THROUGH HYPERLINKS, BANNER ADVERTISING OR OTHERWISE) TO THIS SITE,
    14. +
    15. ANY VIRUSES, WORMS, BUGS, TROJAN HORSES, OR THE LIKE, WHICH MAY BE TRANSMITTED TO OR FROM THIS SITE OR ANY SITES LINKED (THROUGH HYPERLINKS, BANNER ADVERTISING OR OTHERWISE) TO THIS SITE,
    16. +
    17. ANY USER CONTENT OR CONTENT THAT IS DEFAMATORY, HARASSING, ABUSIVE, HARMFUL TO MINORS OR ANY PROTECTED CLASS, PORNOGRAPHIC, “X-RATED”, OBSCENE OR OTHERWISE OBJECTIONABLE, AND/OR
    18. +
    19. ANY LOSS OR DAMAGE OF ANY KIND INCURRED AS A RESULT OF YOUR USE OF THIS SITE OR THE SERVICES FOUND AT THIS SITE, WHETHER BASED ON WARRANTY, CONTRACT, TORT, OR ANY OTHER LEGAL OR EQUITABLE THEORY, AND WHETHER OR NOT IO Cloud Solutions IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
    20. +
    +

    IN ADDITION, You SPECIFICALLY ACKNOWLEDGE AND agree that any cause of action arising out of or related to this Site or the Services found at this Site must be commenced within one (1) year after the cause of action accrues, otherwise such cause of action shall be permanently barred.

    +

    IN ADDITION, You SPECIFICALLY ACKNOWLEDGE AND agree that in no event shall IO Cloud Solutions’s total aggregate liability exceed $10,000.00 U.S. Dollars.

    +

    THE FOREGOING LIMITATION OF LIABILITY SHALL APPLY TO THE FULLEST EXTENT PERMITTED BY LAW, AND shall survive any termination or expiration of this Agreement or your use of this Site or the Services found at this Site.

    +

    16. INDEMNITY

    +

    You agree to protect, defend, indemnify and hold harmless IO Cloud Solutions and its officers, directors, employees, agents, and third party service providers from and against any and all claims, demands, costs, expenses, losses, liabilities and damages of every kind and nature (including, without limitation, reasonable attorneys’ fees) imposed upon or incurred by IO Cloud Solutions directly or indirectly arising from

    +
      +
    1. your use of and access to this Site or the Services found at this Site;
    2. +
    3. your violation of any provision of this Agreement or the policies or agreements which are incorporated herein; and/or
    4. +
    5. your violation of any third-party right, including without limitation any intellectual property or other proprietary right.
    6. +
    +

    The indemnification obligations under this section shall survive any termination or expiration of this Agreement or your use of this Site or the Services found at this Site.

    +

    17. DISCONTINUED SERVICES; END OF LIFE POLICY

    +

    IO Cloud Solutions reserves the right to cease offering or providing any of the Services at any time, for any or no reason, and without prior notice. Although IO Cloud Solutions makes great effort to maximize the lifespan of all its Services, there are times when a Service we offer will be discontinued or reach its End-of-Life (“EOL”). If that is the case, that product or service will no longer be supported by IO Cloud Solutions, in any way, effective on the EOL date.

    +

    Notice and Migration

    +

    In the event that any Service we offer has reached or will reach EOL, we will attempt to notify you thirty or more days in advance of the EOL date. It is your responsibility to take all necessary steps to replace the Service by migrating to a new Service before the EOL date, or by entirely ceasing reliance on said Service before the EOL date. IO Cloud Solutions may, with or without notice to you, migrate you to the most up-to-date version of the Service, if available. You agree to take full responsibility for any and all loss or damage arising from any such migration.

    +

    No Liability

    +

    IO Cloud Solutions will not be liable to you or any third party for any modification, suspension, or discontinuance of any of the Services we may offer or facilitate access to.

    +

    18. SUCCESSORS AND ASSIGNS

    +

    This Agreement shall be binding upon and inure to the benefit of the parties hereto and their respective heirs, successors and assigns.

    +

    19. NO THIRD-PARTY BENEFICIARIES

    +

    Nothing in this Agreement shall be deemed to confer any third-party rights or benefits.

    +

    20. COMPLIANCE WITH LOCAL LAWS

    +

    IO Cloud Solutions makes no representation or warranty that the content available on this Site or the Services found at this Site are appropriate in every country or jurisdiction, and access to this Site or the Services found at this Site from countries or jurisdictions where its content is illegal is prohibited. Users who choose to access this Site or the Services found at this Site are responsible for compliance with all local laws, rules and regulations.

    +

    21. GOVERNING LAW; JURISDICTION; VENUE; WAIVER OF TRIAL BY JURY

    +

    Except for disputes governed by the Uniform Domain Name Dispute Resolution Policy referenced above and available here, this Agreement shall be governed by and construed in accordance with the laws of the Netherlands. You agree to waive the right to trial by jury in any action or proceeding that takes place relating to or arising out of this Agreement.

    +

    22. TITLES AND HEADINGS; INDEPENDENT COVENANTS; SEVERABILITY

    +

    The titles and headings of this Agreement are for convenience and ease of reference only and shall not be utilized in any way to construe or interpret the agreement of the parties as otherwise set forth herein. Each covenant and agreement in this Agreement shall be construed for all purposes to be a separate and independent covenant or agreement. If a court of competent jurisdiction holds any provision (or portion of a provision) of this Agreement to be illegal, invalid, or otherwise unenforceable, the remaining provisions (or portions of provisions) of this Agreement shall not be affected thereby and shall be found to be valid and enforceable to the fullest extent permitted by law.

    +

    23. CONTACT INFORMATION

    +

    If you have any questions about this Agreement, please contact us by email:

    +

    + +
    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web-hosting-html-template.jpg b/web-hosting-html-template.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e57c366a6ae044f9bc17fc9426ce9b7ad712b7a0 GIT binary patch literal 71197 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

    uC1y0Q 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


    Fu2c+838Y&)^E+3-Bm4W3Quvmd7ZA;T~L2aTdA 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 vFzIcoJNWQXizs4K*~~5y2xeCrAWi~}vOq{e zcm*Ydrle53=F7hvd8~Zi%$q)Oyc^B#=CiD$?tpW%=gR}L{OdQb-Cm&r#v911nMSF zm#@dwQ>^`hXcq56&H@Fqe==gHus`Yiv(FGSqHA$cmjPwliPNeC@4Eal|lZ*UyJF>Xh?y!aB}w>bZAYR~hHFo|Q{KZ$$FBEsrhY3^U*J8JjO@LI!h zS*0`T{XEa>JZJCAi!ZDDc@6m+>X>;dcv-)TcmR||lFwOboyVkgESBxdi&eDBOZtAK zdA)4iGr9OO(#Q*KW}g%KTCFTIRvEEZ&*D0+Mexka#-zSxpReu9_4BHJd=}?;-9A?P zNtIVEUqb-zJU3G>gL=lguU4jI$NIgCi?#QozA9Z-@69xpvzEt<$kgr^>b`bWCv+a3 zUsBE)b-kgSRv9OCIdOl+DC;!yx6^k1%vaS3_o(Zl_MDX`+uM4c_sl3zbP1f0My;}1 z?I)H$f3#z?E$^Q^+C9g34YXp{30ZE6HX{cZ2dIgyLz+H)In7v?U?U7WilcWLgj+?BacKPP`~{`~wE`49BB_P6!-^pE}I_McQMj*6?|u9%fXB~?jR zS}LuT_DXl9r?R%PrLwKEy|SZnLFMAgC6%ixS66PROjO=jxw&#{WwLTd<=vG#EAOei zw{lld{AFfPSK34gY$~P)cRc0%{s61Esm&yy3LzQ1wUaVB-0&~&1#9VT&Wv*?m zeJ(rKH@A9jXl~owj=59jPMbS(Zui`|a~IEDId{k0-E&iO_s-ov_o=yW&3$L?nYka# z{c!GQbHAKBH23Sdm*##m@0&k${=Rj7cP3? z<1hTLgOP*12R9x(@!&}ZPd>Q);3)?$K6u-~PaS;r;ByND3&n-eg_9P}TexcBEem%o zJh<@jh0iWLu`sjn)rF@P7tzXHA}dylf;i#7P-{A0p*7DxtTo?y#MXQmt@%x>HGjE6 zYc{RenrF<7p*1g>yJGHk)tdLH*8Iv5TJw}zYo3GFd;?nZ%`3F#XAf)5ub?##G_>ZP z<7mw{FT8Ex{)LAZK2vYa#o5JwT>RnU|6criwCn%tzm89K3<(ig3s}R#L^^blB8f;m z;tT&ae2B;4pX;+o9SHwz_&edJ!`}>lJ^YvI+LJi@8I}5E_)n33B>bN6o#8jAGke3A ztNkTm=t$umDqRkr$UT4IRpI7v6ZXk)JRHN`7j}fyyF$>bLNlRHg+39Q=AEJYLsOyK zv41DvjiC~@!+=6)U1)8n6{)nk%S6h}6o0{4z>fj{0QiwQ^8=)w27E2}nczo)Zwc-S z8iD^E_(LHA6M^dj*9NW$TpidOI0wg0|1*3-|NNKu&+wn%U+-V%@AJ3%oBUCK#P3)9 z*SbSKbNqisx3Ss~M#hN9|055|=jC&TQy!8(mcKMcjg9zQYZQ!vd>lD{U(U-P$)|Aj zkQ_HWhFe}CUn|dq)^?xVZN!knXXRZiihLOG4#0DAKej)`e%dM`uYO40kL@-1Ym>lx z<4?Xzz6;m30WOuQrR0V7b-6`uWg1srulBeu2jqZCH$lJtzW6HBIEz+Mzt8C%$~lg+ z34MfApMQrN%N0`|GrSwL#K!h&Y(ue5;eN}3^{pF#uCfHsFNqM;r8 zt1Te^xyFJ{?60*TgZ*_DupZZ2Kq|Vy0@mq93wp4huz>X>KO*D+zh^-n`!`z9hy6_! ztiql)7=gIC#RB5!O%{;$_gO&B`DP2iNufV!Scg40qJmqo|1%5T2lV581hl`%zMugu zEwZ3#0&&ngtpOAxdjD1fXh!t@R)aeKGSUF1Sv3N2nM0cqKv^OO{1QNWB8Rpmfbv8R zZA$>%h#bm6U>S24YXBXI+$9=7T_Sg>2HM9t<_iG5i5%LR0J;}B-UnbgbIcc@(oZ4{ zAfECr4J=#Us{wsNLyUNc6X9P-)OpKY(@V2d)X|<>DtOD}nvyCulc< zKzS<;4Xjti2|(HTt_t2k;IkFpnsG!^gF^xU?7=eALlGY$but#4apwEj6%1J=a z7ZtQE0h~ls&>sk56nm7H08S(-pi2UHlBjIazSOCg3TYe+~At8dSUg0%?G%*KwCszId_NCSw&xugcj zA2A0WJxBW4gMFI@@}IeO4WyH~tOnw6u1^E|(cEec>^pOyU4j4|%%N=vq`f&l1Asge zbHFu0rGc+G0BLFN3;=LO8k<8K%mD|KCv&J90TNiuu}sLD^gnk60DHFe-0grnkOpnd z-K{}<9Q!E^kc49H9>Bf0=UVL1)&zws@ToZf@j3Suz_*YFZO(m11Nr*gGaAU(=YF6; zrGJPtK;iahNCU{n=FpA=^7}co8$rAkd$b)vrC&lC07)+9exm_eg_!qg5Vv6uJk5jF z#P4GdJQ2hs_Gf4iZ^s_EB2Y%m17`&B4(vgf^T3xnk2aVGKvxj+Zvfnc^j+AaJ_KkG zVjkt5M|o8mWt|5=R}k~e7eM--=koyQ8)BZ%162C`NCTjShd77N6dd& zgG$dJ4InR_NBhoy73mLQ|1}NJmc;x4z;|(;<@%lm%I5hWX`mdL|CI(YEyN3`4?%ns zd-Mf@_!#zk02d+s5cZ%yg7_2c|Ca{ws1OGu8kqmVUJb1K!HpUyPY;3*5-5KUo}_`Y z_29`GC|eJ1*Fd>^5OhMITt0ZQ2Fj*`w`m}MILK!JY}13!Y7mcO|C|PvVPQZ6bX>7e z)BtT)ER1TPzPEt#5ZI0j=V=h1!Tu@@;(&~5~Qc3OB!gZMikUuaf9y-2>WO9A=0eBq}G z*stXazfd562l>K51(bafxFrb4AbIc%1>`64;F$`jgUW+fC?NgFgLf-no63WKsDN@r z9{i93o&F=FK~w7dgGjT!yyv3|gg6`f#}u$F>pO3@UZX+q(S4X z7uuX4AW!AO=M_-K$%QW}pgt}a{!)Re`vUL)P<3BGy#T823x9(&Xh%K!_elRe(jUhD z`wG~v<-$KJpv;vEzf?e(D;IvFfP7CLf(8f>;tA}f0wKPIy`eye8SK$c03lG`Lrw)k zd;xox0wGZLLv95^Jc+$mfk0oAhkObIXj>i%DiE+><)MfI+EnsTS^@irJOum$g!m@* zpmTr_Xxl@r3WNYY4z(!|;%nHqD-f``<)MrMfxamZbt@3!Z?VrQ5aM&#_bU+WM~4O! zu%F69YZS0Q%0p`vu;0l;Lkifh<)Kjp?7#BRRt3}_6d_WfTF{fLP&?KbPLigNZ*cqR)G-ce=n_4AOvXeC6phapZyimze4(Q zz!;?MFXivaC*;fU+T36~X#ChQ=(xu51*hT6IUjNUt1IE!;=021SMJl?Z*f0swwbRr zr_Jwrx;^K3-r;$|^GmPKyVd)9-mm(czDs?d@DKa<`0w&R?*G?7Ca@!LOW<#U9l-~J zFNbajJrlk+{I8MKk-MYa(LauPVh_h(n`lcsksL_ACHXh0wW*(`d(z)-8g2SS^K~t2 zTMo8l&g}SH_PyEpo~=E1 z{zU(U{WAlwZ+Yx9BV0TAUx87)lJ?H|!gJ$H>6QEu)3e+0wcq~HeI*rnG@c-dE4ffx7>7M--$1lzkkyBNk7`UW9zq1-g5H&C%?Gu zhHXFEKC$D99bY}=ic=2me8;KAsqZ@VsZ(c9+r6u2*Uaf>p8mucg)<&KGjrwxXFmU$ zeXsfH*t^a$&idHyrrnR7z2oc~&RKoVch9}+ydCGK&i~w=cU_RX;M*7e*+oxWe9I+$ zm$qG68DBg8ua|%MwI6!j30Lg6^1j#4Ty^Q*EqnjZ)$hF~aLw$sQ`eQRAGrPKZK-i=(BkVk(`& zX}9S%yNbDdE*~wt5x@55o_p?%Z=7QCJe90|M+QR)nMs6#lBwz}Q!S6+SN-hjM;s)ZZrG1{!LjA5WrIrYr&*CFxSNH&u;Fa>>CPLZN81I>W6jR~KcvsVOb3 ztypsOnrJi>s?KmL%i-2=AP{cV+eOiMgjX;AW^q>D0eUWw($dKqou!Ltk9@wEM4!s# zM{2Z{F9Pf7bdl{blQQ0!2>PP$es|OtOuUo$TzV|0jns$F@qGZyKdlN2qj?u8UekJmU3wMkr(-*Y379N?UdZN?1Z{x_orFO zKAVJ>SHv~P0ESUpQXwg6q~tb>IO4nbHolMNg|TMMwry+H81{a;(3z1k(^;_hQrMR# zYl#WoFlpbR60D=bwU7_N6D{K46X@4$^HMQt*L6tOF#13s7}y*2hT_}CSgXBzxgC>t zhEUux5xJ`R8P<;=_o=*JLOZgK{m9$RoE1-C-)D_@M)M2B9q~@S3D~@Eb$bu#q^Ez2 zc|u>_kOPnW9rLYLB5s%e@7knnY0aB*Lbmmg@Us2V$oHMFdG&+p)uFKeuiER&t#}x5o&q_z-Tn{st?$iAnd@DDQAbmA zNP1#PzY*=as3+YdWmCH63U$-hfdX(;iL(3;-pgkq;TC7o?}<4()Q#!^UN=&zod1S$ zPRd8%{YN>`4i2`%&QjsRI#nO}Bcp@-`?jBUs*GC-n5eEluleZ-T-gvbV@CQ^o z?d9nQc*6r!K+x_sUP=ltb-r!4&CxLfoRvx$SNs68{8IYeHc~EYOQ!=a6G(A|+Ap(_ z^041DWk%i=mn_DeHbz3BW=}F;#yl-GjCehM7;;+PkaqqA@)rH0Hi5zuS3SVX5=g6EZD00X(~j2grqc~W7rkdGKLg7R4m|6Z$}EnA`Y_Z6iHX# zU_T@aGMgRg8_8y+v8pu^;n7YWMIx=Mj9Vj-NG6q(GMUQkv=foOK08@U$R0k!hd1^_ zTid$rqwcoWXwSx5`MmuM_l4yr>~{Tu;t8rB`&R{f#ujd}dZ>i&QX%CTfXzA+iN z_YeHZnCDSUCD;D>ZWo+F|;Xe?X)bgcM$g5 z3Dr*#(Wc86cc)oC@@JH+G@M5%O@}8Yd#gWW@#GkaSKXiVHx$ndh0RAz7LVlv?G-@7 z!}MHRGDr7!N*$nC$r{R;Va1I{N3_JTsdKaxKU|?K%T&5M)16L9**OdfL-|7^&5-iF zJ)@b?-X3*ke2KED@5W=UT&lZywZU2&QD1kgrKQ8gM`Ta$s6x=pGDVcS?u@}0tJCN` zm0CiQOxSlwHk$ZHOZuEGO>Gvz^MoWMIJM!yl3m9%9#vg1h0Z0#o=uw!W7DQREXB?Z z8@s!u?C##UVW*XDX~`E`vZF)#{Lnzg45o}=ARZ3{`P5FC?df4(QQIk=QW*j_OR`Z} zw&hz|q|w{UOG7Hh79Wr{)`rZGWgDM7uqv5IBvP4{c~m_8cWK&~8IT z=t|XPuQWeMvc0 z{l{mYC9Tx?R3}ECwkm4Yx`@_B8u=4(o=xLjRKM!tV>#OzS>F^1OBs$d-9^q3k9VS- z!A!2Z?xve=lIC?b@4(T0cKR+;%4t6G=%eak+}_*X5zdY>ho`1+)nYnzW@ApV{BrT7 z#b@NZAwS?_mAP!OXxl$%@kXs4jg3E04>e18Vc-ORnaii3tRSlqRDJ&~~Y#KECjD$&vP5DCnHgE}L-_6>X z-c~61KEOA8Ba8qGAP~D?!$w25jef)^MPlLL z0M$?n|D=U(Xfw$X2zgeX?3GNn%SvgpeWchW$CxRhI%}t7X6C7E#FV6!hIL)Po3$*6b~?GsWBT zv%AmsB3d2B0u5`RsXMyhMexGZcJJJmEZrXDlA#Ndn)R-+V&s7OCD0( z9$E=d(&`FD zyy|7^CnhEa^vehKNz=1$-@cPp_Zvq4>XRnOFBOU=P_zNw^^_?W1+VcQa@|?9xRHWE zOB{V(epBISJv@N6?rPhP`sL&>uEUrNumiUby8XFrIMPYFGB9X~buZqFr_4)lgH@ z74kr#g}lQhc~*%4qUnY=h2l~Fm22D4l=1Gx=-9Ao<^6?9ts4W!x|PkB%Xgzs z(!awy)E`Q!eQw?P034WMaJqR@373?Rgz&(5qxBnoUUj3>$y*Jl6Zs_^c(>8i zn>VlOLz^KzI=XxJ=qNc4SoQPjG%i2SH$1N{;07G=J<5l0yZpGeiESQ8Jrub+;FAj{ zefQq0G)^;2GbADZ*i2MEE-#|8S)HKzDW{S?mDkIQv&J?=oA#j07C$Ye4$G5ycdNW3 zN#C1Z=Z;3*uX_{T;F>a{5%=YnyCYHeJ+6fOh$~V3pYpVbl#%M^qKVtW_)AG&eaFNF! zj|9W9&wrks?=x0f)s22I>Y}s?b>0?hs!6eYKRQ<6A-2FnfoMGRfe*<0qk&NTr`o0X z(|9Nl{myrEznMj3?X;EymOo2Efgpp?el#9wkJVV%bo;8`m2GUj>V6){b=99iAcJBs z(h#UBT@5L}yt?k6fViKA&vQtW6&;e@lMb~ti%|vD=d#38HVYk=niX&aUlnN$s!X!0 ztBZygi!oAejm4yl#aiX0o%-YcWXHQAGW;%|xh4?(XjoRq?xFg>Tozdy-v!m%*d9(kl*cbxd*q5 zWV)nW_i0Bk8Vv@4-KM6NYzhW@=F^{s=Qx$hwlp;X$EFXapkWvftvSgt+L!nHv)-WT zb~&>?e_!9I~i{U zY(X)C?|Dx!5HMP9^f_JOKip=9M@B|m!CTJr$mBJC|J4b@d)_TU*9gX}g6~f`LLuJ` z4~Bdm^VCyKxD+0|!50cSQtuDS*Iakqb$&@x@(d~e`pw!u6HOx1vwIA5kXdtZ>jX2N)$Y8Z5vc%5AZP_mRoJZh_$@ld^ zfUE6+XtblFySt+!il3cY2Q}?u@={N>XYk^|Y>%gC3=ZwOc-PRN;q?Tow+204SzgnW zN;R#~+iZJ#EEi%M9Cww!V#TXxC4tNgFvyQa$XF#7bO7A-rwn?Hmm^%W+r{eo(L=J2r0Y>F(~?xN%24btis7v+R$>LmS>o zE{8gKXm1*2@USrA=ubeD$a(Oz-Xh+kxEVPats!!;E~{l$7^zLG#%0s8VcD!B&@byo zLh^_Q`EKeh#9ZxZ^YF~T%w$;3a9b^x6@RQTylR;YZ@kg<1^@jlt9OLW&PMlIrtv|H zl7y@3H5hf15u2wraMyCV@nOD%Fn(B~+?ef>XMl6)16E&Iqr64htfk%7AnBAewd4nS zxWX#-BT0;&;ugb4pv!=gkWN6pe zc0C^2SN%zG4~u<8BHY&967(izQ_SNvU9nh8DA{&qb91vVo|Hy(-WzZ3iN}70a#QDe z61vii8lxIj9XbiEOLL#7GR$r203FzzD<2gcsDDQ&^p5JR9=M0A?n58K5Sf%y9Gfpx z-*mCpd$D{^L5=9|yyJVK^+qx$w9ol#kOUA=DA zFAtZ)U1{`CbVYPS2oO?~>rOKeFwgGrU_0gll}%PB?RKvV;p*gATGSSoE=_RE~;S9wV4uJ$)wIb`M zVX3PNvuU}mVLM3bTr&#a^eA)d$OLMMjt+r3d`cY6Y$y>?cS&6Y_Rs8I2;#Q0N;vOBvnh zcKs8w3`MU9`Mi#HSMVFmFOW>;Y0^|HcD_0bot=ze&sU(im+{&2fTh87kuq_K*wEZI zs>#qYxY@9#Wr(L8ZZKIJc{aNR3Y8}WNHnFW^UHdw&M)h!vqGVD>*y+3w~k(sdRk7^ zxph5tWWFuWIy?`Z-(mGW<<-_(jfmDY^Hd2Q`g-;1se1M5sW-5aH>ygOqtVIZuAX}G zMunIK+b~ULQ zs<9W0hGAqH`kouM?Z^t!=y=8JC)}Y>d}C`Y3RNJZD1X2sLmS-&tS9$qBX2)u;d@ck z=aaE$D|jipPB3J)IK3h1G7@fY()ePdSYaPAZHA_U>m$eI*57;;8fE#c@;8H0i-NiySg%LMeiiu)Dji-(rxx2|sv9GVQJrVc& z;{i+WuB&17 z6j*IM*3sJDo=&&7w|2zha`|yrcbZW&>F%yGcwjNR_B*?G?>4Q9x`tM-UY%QO-xqAnb%#_-^kmUmJ4g3m=%zQio=+xX@{55; zJX|esySp>f+1!BCNVIj&EvpQ>4U(;`EvsAAz@_Zy`DnRZ4u*AGhJz1xb#=j|V6|R* zPy5=QdPYXaj)8#zZ`Xj+$stTPS5dHZq9JIZ+cC4}d@&9Qd6Re>qMNm6TSpYpuA|mL zY*RO-j-&?%$OUW}h!n@v_{d1oP7EEEU=Sh)a*|0X<@9LdAd6%}f?Q^(cAxSA^wl&3 zCFM!MDwJeu@0j(Q9LI0UJ{ptZ@)%A{K~ET);w4K7i+4kPM<;oLaPtJ3QW z@oXAFM{X0&W53e@|E}TK5b}f_>k3=86xKPoFZP9#t*M}ImDAbMJG_14x^-=>^f#_s zw^65Kp{UPoNLbizkHblRNS%4s(gAf84mp_irsy%jD7%pzJ6h6S7~6JX+!EEMtRR-( z)sgJ~V;kjK-9y7r_v7}X(ZCwh_bxfkJCgl;prL`vaK%_Af(T38iLxnQB>ZvHq73Gt zeCtZh$ag6Z1qUB2w@+HTeTEd7Dxsx|rHZaedPq(d3Wb<&!sGG95Dw$pCd0S5T`gVf zZnl)nn_J^8@z$H|3N&S8cqXDoi*J@LXtXWxQiL-ZUdN3rzcyf${;6@8f`_}vnSg3E zhyAGL5mO^N=|+Q%VY|GnhX(1dvTxQ7Q8+(IuGR5QxHJ&!W~2`A7@H=9k20w?a4uH# z=vlSGlWL$yJqh<(BGD;fMeXGU!cM(Q8EQn$QVbpNgU=Z6g#FP5?fE8BJ1k9-DtUn> z<{W5%^bR(vPm!~#Tb6VSIjEk&1;xXM^I96Fl6q_o8Z;i`pW^UPLb%s*cTYIgCHwnN zJ+;4Ia-WDXlBuZ$u4%bPB48?<^t;XQ)(xhaZn7gIxR?8z5W>4*YuJQ?6_h5|NMn8J zT=&*|PIjd*wBm3eSg#3IPb8LDm(3=cT3QB+Ti(~v(%nCp%Na&4H^{xy;c+++BxX7s zx0lyCjP@o!0!SRK@Q&L9t=v}+I2|}CgJFMD8{~kowtQ-_=t?(BcW>{y{_d6zhr{JE z4AbvGhE5rcwt5_E7zwC+QgXfgD*POXMpV|8n;I9iE9GATc9j=OMI`fz?S+aW^he6T zeT~j0FFY*mumY5~=@R*uu2}VLA@emg&ytaTf5h>&O`A4Zo~1#xMu7vXYdwQC7am1i z>qVR^D3$ZX^6a5?*v=|O8!-yxdfc)#xm7XTBPnGxsHRjzf#O>Y3DZH}s2?1{W!h4# zpUMTf%L$h=l!zw>)~?OxFgOTAxg-?7mCsU{aClsycw)_(O&d2gHTwb$r`B%Nr{3Jx z(Gl>Z63$32Ka}z~6HsoLuRk2l<=3tqNX8Q(rwf|k%4ZAIVFJG9CcI(InnXP0@;K_J zHmLt{FDc}cogH= z8YWl9dzeNr8c2^h$IWc+nJv;1umOltT#wH|9K=;q zBkCVdloFPbfr$$Z%L@T9XIt zD(^OoZYQp?t;)L zmS>&%PihPCpWGDMU#iC57(00`JZ#{}I*^Ltt*kw5VU14hKi25e7KcM?KbHBSdcg=} z2p=QGYx4zX}T3?@&wpwC>Yj)6Ap{2%@p6sSNyq84eJt?Ra$t6S-6+ z7fd|ex?m$f>n!T&D=5tOA~=fPfC}7yv3QT(YOxNxR@IN=Z?>*YWrS5ZiZW)YA?oEU z#L_pj^e7wq%_O2xR00WaJL4G6l@^Qp%|jFQs1;RdZ=c2Ej*^pdpC~)fvnLPpS@;Rb5FP zA_bABPusTx*E!|KSMD?Qgj|Iv3Ahl|q=b~qlZ=I(MTa*W_jo$$k$W8;Pdw~(6rJIC z(sW&|=H^nY!MI^HX*W&t;G3CM_UwjL8IP|u!{PdtX1~9GgB{Sfq2KS5%`F_m&$RkH zZ|3Nsod?lhon%Il2=fHpDF1={8gMg!6$;J()o4vYGZ4il8O5Z%ige7t^GEz(lmUbT zxlZJ9Dg@n1TAY#Y?5Pp6XtecND7yV&FB|}J3WmNX3@1TPc0DMBk-L4>0|;S2fG=En zlks>j z=P{rUIoCONn~#}Kne(devZ0ce6`;8~TX9G?rP|ih^;F{>ukP$CJ$3BY>v#TlYUOtM zZ@m0BUY7RiqfqRAe8GaD34K#dth>q`YqoV!EfxJ zoznZIN4&>AW2fw6dvBkw-)mp7_eZ|tcXj1>-hBAI|Cwj%7&!c`|Nd+B9O|i~y{CTH zf34Ijm1gDZukI{02=+bQ>*}e|lCo7eF@?QOD;vtJ#Zi>51ez?gh1o5+rP`slb`Rzq z&vW2q4>xKY1tSZ;`(LYPul>S3eCz%f_v}GDneyd;$+!gSf(uRa%K4&g z)87p?Kh1cpV77Z;pgS9KC6ZoGGS%6cN}8SjG1#2sT$$cvDus>DrPvPH&;Db@NAdsD_;jF(Eq?%pnr}v`2J4(;<$Jy)K}W=+MP)*3S!fN7}lxMVRxX%|ChK!b9d$BJ3{39 zehed01gOnUC4tl?f*;ST4aTwTgWt({j!Y~HC5f=DNs~su-Aug*J8R{NjMvYO|BlXD z@=E!~^(-wtexqIB952v5lB36xb#-;o$Eh5%uMh(!$E(v46;qzqM@iFt6s<>#^RjWL zb%i>w-T7+yEaVgXw~$0CY6D}x!=;rw|B*wLzZ48i`TbLf(hscI$LqYJp1R&`?!jzr z&mK3TSoVj^<+=|ex0Xg`9ZmO9y;65kH4Og>dd>q&qK%fgzH1cO=qHE1XfYi61{q&g z^TTgGo^rYvrB8RELOLS9peU48Ur^g4Xl3#&Ob3oe5haa?@EaLbehezv8}Ljhgve~f zjNiy7Rk>&Iost=>W_Ufv3b%J%lwO4%?6TC}l|)h*gTk z+d|6fQ3lT#)pp&ORagMfb=Br8SZgGMc1R_ALNT>&0uC>`EL?!p@!aN*MEtjUeZKG- zF21m)qXWyOIkBXmG$H{k$AN$;{v0lEs5KtL2m5F)?6=JY{Q|y4j@4<%$?@r$Uc8I5 zwO^fQG7wtLkI;k$uV@&Qg|6 zV{fM2GVAl~^}+RifRlIkdVG;O$7qmBdTdTxJ7v#=KTMZ<*gt`(a4VGgIQZ2dc`o{o z8eL(-4ZSiOSYG5~U;?jPX3V@~=&8anNGO_5DJzBo%no$2ux(lr0v-xlIFuO}jjCa} z0c(x8UQz-%e%$Q>JnK1d7`wpy{US^@QifVx5X_5`S(RPtAx0~BHo2ty9I&O5I;}XZ zz+fk2>?1Al3)L8|);!q$G-bw6qeqLFvE(Jn$3bvw1)<)mr+z{i|e77GCZvd(WnnuMQM3NITN%lO;(~)EICTd3RY*4 z!vRIEwefY?+lp#n=?zPQjoS%@*IDqOk7MlbT>^7()vz7e2f&(BSZ66X0}ii8{*Xqw z@u&A{YsF3D97lsGF=&7=TGo!3%j?032X0k6v)bT|S*pVRGk zdNF@HEd8r|SVUk|9Fucm8Pgr>@_BWbSR{f+o4p@K<8f@y+G*PTA#gmcaqM!daZpf! z=2^rQ0YRob$Cy%03o1MD$HXKs#GnYsWV^9>)Dk=B_B~+WP>KsTQnALRa+|?y&^PPNw4Ok zB9N{5YUl!x%WNJrr`+cV1bk=j#>_}Z?6pCc%iOR5BpQ5eOr1a5ci8!BPCDtNup@Hj z8n1WFnGr|$q)=%2aj2uEh0CR3nZJ6fyd?hQv1PCF?_S|mjYYd~&6*><&VGHhy6lze zh#dsGEE-r00O#Fq zm&<23F#8Nk)j+9}mkgh@YyE~M6&^pldR1zxXUmq0tVMwOsOGucP6u>BM#&>`epNP$ zC3^6%;STWJih4n*!GBA61&P6EiX~bMDb(yL4YOwh4JyunJYl48e2PhiGK2z;l6gfR z?{YQ5vJ2`y&{wI6_8w&_;BhWlAVo_GOKt~)sZ>inb<7IqI37$lH)ClbW?`io;}F~N zwUJX0^Kv!6{9|ct3l(tOj+0i|Lz}3*$9f;mG@P~ZSb;va z4*Jj8z~asPx)4W)IX1<W!bu} z%vShghR|a5L5_OL%B&1j6>LN*jjvEs1Sc|?j9S(aYmuRTtZar_RU|TwD>m9xe^Q%B zWX!^i4m!;6nMgyJ8nwj_OlkFvI^+Z#R!w|^db}_O9gVtILAAGTmoRRd#EieN9G_qT za4$Ei18K>oucdFMb6P6{UX{#K zd$Lz0((-QZ3k{lQgDS7r2tv(T9w|{1E4Z;TRC6=81x^^z$>wIk#SoULp_t;ak|H`s zHEWvdN1c5(x6_>5a?UwSo^#If`XYw&-%(#B?Je+FhZc zS$Aru#DKjt?6z%~Z95R~;1`G-i)nEHBc94I$=Hj=?p=>(kpt*g`8iY^K5e&c^m814 zU9ov8W~!GjUW*K&4vt^V5XTh^7MN9)HmOA$RC zF@~1ehy#;;MV!(4lj`<)n#SbG_pCq9OR$ zS8@Y5Mmf#}_Ne?TOT7RLl0c7uQblY~j#wXBNte`WANa={luTac zGMK@fEJgA3ay znwk=cpcl)i)@1@QHi8^simA35TNQWW)d*Q0>i0E!KjxN*C)~xHvoS{(bFH1z;(fWzCstFCZl(y?i zS_0Y<;aJ$j<@A{sLZJdZ=$)P8dS{=ssQu`aUj0Wtgba{PG}_tOt#|fG)>rWe_y=Y% z-*OYQsq^veIIep_{iUR$>eDcInAY-|<54t2SvPu)>>9D-TeZzwYe?X6^n3?619>GE z@x<*sf<20d!AhY!je=#s^2oz5ef#LHU87^E*4EV6whe}{0qg%nqk(OgUA7I&_Jl%# zmCkizon+^F18!Brawf*EMRlPL3Tt+xn}Pl-$av$#{JofNfj;afMZx?sfHYVshRE)Rl^kNK_iJyL{eI*tg}@ za4_g78<9w?S{|0?RX-um`;mOBd<{Mw_5H$^{PDPV<5eNAFL2th%S7z`bi(iVE{c|~ zeeG)ta_D{Aw{QQy)u++UkcF1Ne+2Uo%J|yT>G-Pb_55OJFJ4M_0h*F?C8$4VO>EKR zig;DSs_7M0bE~FzfU{?dLohMSG*$`0YOeVq%vmWRvsBt*gO)P_B!fTgj7Vc`64DH4 zMTrm6RbGDPf(tJ2m~LpN=`=J{*vJ>8U8kFvW!~Mndb``>ac^JU+3j!`=IO5VXJ7;y zSgzM_?7~v3G>KotCy#bvc|@G8kMGq}SmnJCbjID06C&=oGgvs^4XfMfIp5_v--Ayj z<<=FP9@BGncYLGEwK3j(HV&MHbve1=J_zKWAz!}3aQqBjHJ7vc^~Ml^CFvbrZ`L1K zPgQb##Ge%=$LW;sEsWTn?U28htC@h>;!9wF*0S*&xtcxB06X@j6>Rgkwlr$N0opdP zWh)mBsY_bDM*qs!FwEA*?t%9ims)#*qRGq@=2;;nh%~O!HOzKTTdjEj~ z2Y5km8q#tC`5y@SG3->py5kcnbHt@(cTLhVHdRB8{;j;T#;IXtNxiAg`{i zeUpbheLBBZymaLoMa()>QM-5b$RRiwFbp{jgwfVcr1No*E#1TV6I6<+rMoy?*q$)a zu&~V@XTwYhh>op2fAINmb8{z$?czWC+~&=j|2$)^!^{dSr5TnTsrvMZhQ(^O2mFom zCLq7!;nGd_G|>XX42r=uk5>=DbR68&8`!R=T4e006wCZ2sP(H`b1a`5!B{DrvvAF# zqmxP3Rw;m;LS}I6i*ap8r<*gG=4d1o$`1|o_4f7+4dubWBRqS&OLKh_4?*1vg<_E$ zmLFhtlmKZgvrBz`)+oc5$2n-HfrA~#JT$bns;Oc~Y ztunWAMz82dt+8?KfICwNSPKW+23EClt(ewT18p2l2&HVJeu^HKquw;pIIyK`{Ki2o z>cIPBuR&o$?y(SL)gcwCK5Cyi z!;?&Uv@@?hzx<4BN+7e}sEpm7r1kW;&SZR= zZA$&wI*|dc)Vfcc!vsI_E_^5V3Q*sz_%7&Qi)X|?18>74oI5;P;^JAv6{fux!OWHK zNZCdllA?=9FMC8sJ*@!!fh0;`<-1a`5HK!u9#FAr3?KInspenX2J)lD+b48L^GBjbij3%?uL+xpSva;WL3OP7#$$VAu^FZ;-yhA(Wt_;P=O3 zem}95h(ye9n;3{VcGA)s-53fn@#!*DE@#9NF!u8f;jW;wQJW}_Y_|F z4co(>3k<9Yif{;+ziwHbZ9I}#UfKu+9W1xJt@et5gJr&Ern#zFV=!qRC3Qd9guyHNF+yqf=R^$y)*tf$K;qBRw} zR@AcMzSHW86-}t@5rKuT>ZHod%7Jc?*R=Hrk`ZKK*T0r%uy=c;t9R{TFQu@xaO?g11HAq;q&;31G~>!!{h41F4M&A zFSK^Y7luaq8{C>A9!*^^AmF-v;a2c_Y>y=<_ zJg$F1OrrjlhDhun!eVF;f52>Mcx1SS-8z=7#Y%{LB9o%gMw=FsM>(4;sPK;NESHVJ ziy@itQoPE}O*N|&TpEXUcEnqn6Y=<-o^@-7u^bMpwH@mUZekoq*am#DKClDb7L9vn zPtOR3Pd(>tIp62=`v>52P|}H13R=ZlKY02PM?9WrZb9~mxVdiK4vy#U=W7jvTW7a1 zt`L~HleoQ;xLmIc85KPIDJe&KdYtlvJ$}E>*Y9_kk$>bZ`exEK`FaI>bP{&?-S8IZ z<>!YK#c3Iw1`-P@N1ey8Zi;DQlr*!HB~8OgqqTA{%8PeO2`c%!xcXF$&kwkeJKLr=lkMg zh+H%bH^y6AgCSSmvR^6snWkNHs<4Ea5abiX|B;67|Atx-XTBk$U<85ut zMsqL}gcbs=(iILFiPc6Z>|E`PO26sB;+^6{{p$AdK-v)5~v zt=5Zer#JZm5xTTR6ptXu=CeCV4Ua19p!9or^nmFu!y--@>+Z3w-@T-TNA08UW-;aC zH5uNLIx{o)T|Ht)B2@H-)6PCKsJO4cohG$7Z(w6sJ?-fTB9ONgb{)FyR?nDqF7VY>% zud~yYh`Bb(8~HB2^V%J)A*@=5&t&iuJ*n1z80H5QMo!_2k`8Ay_|BGelh1S{Lk?Hy zFA`o?d@|@XLtkjZF#e$F3;Is!M}%(n$6==hALWGv^^CvUPlrsm38> zOs5fw>?J7&gH2Zky{3O7Kbn@1LaB9s6>~U4;pUd~m0eha0z7B04kAE|9X>FuBJQdO z_@Z&O0i)Lm=y&zA=m&1mrrPH#=m)#SIBZ?c(V@?XSk`0FHlB%j)oS1cHntn^jm2jb zf#;J9MNi<5{8Xt>LzuD!Wht%Ms}fyW0<=rK^Q) z)PqV9BU?`Xwl$G(m{DIk%{4|mBTe;n;cRJ#$RhZRTmATMl{@MPhrD-{N~M(BJ>&?6 z+<$I2NG{d~0m-%K*p{>kh_F6#54CPEhEaW|**D9-WR9DQE$}dV@#_22+1d(tJ0lrO z6s||voDYT*1qk8r$3l+qg{OSzLm$E?N!`xSHOxJu8l`Yuw_*4c1>yBgFf{lYC3ZnW zc-Glgzc~|upThQEbDre6u)SZU*UN!XIJ-~SA5`Vo1iO+Nv4ka}y%frUaqJ#271z4C z*Po1=-Q5NkbAd;*V7V2_$Lj)4rOBID@l)n**kfJuCYjis)w zon806p+s05cv{VyQekd;m(1jWdDEx64?E%!rcuqdo-5`sO(%C=;kUiTkTCyce( zS{>xDlEStw4dw;y@ObKZ**g3_&u=*%F#7r*(6)?CpfaOG z>+#q86!b)U^3!E3_i@(uYCLaGgu09vgeX${>>rFWzWbShAA1mEukd55cmXz*^&PDd zI&oNFrKhD`2)!zSrcJDW9L*z1}qh8NnOb4*cRQOSk=ZR^*|KEPI zZ=YO0HC4cuG55&_J%Q@}h`a1CHg9&Co`4)v2U|9~%qy!umu=ObuaWI*t3Q<;ghKVF z15r+%(&lrJk^PdipIv%is6*~@Q03wpg8W7U4HuX$4Nvfxe{hH? zk;did>({&cVIBT zhxhbhA$Er&8gp15HJ+d}kf&q(n3G1QW%gyhuiJPlmo*Z zm6>itz%UF(--FqQ_?gbQqW70EUNMO;vOFR_E%1FRNnS{+4B9H?JEtNPY5Sw<_@n8e zX5urAbD9w;(?mPI_yiaARlWh_p>-yAUZEyWmR-=W7>kR$ z;95di7#X10TnflV3DQFtaiAHFQ4T6*Ov(t%o-{;iGLcF3n63B%lXL|GKEKx=fbNKi zzmae#bb1fI@`0PvJNh@SU)_<1It${-#J%UbJZ)Kgyr!+S32{xaRZMl5=4v!}q*@@xIu-p}P?&6Z+WHeAwmHNuGd>e}7jx>d^avw_M z^}>L1IJ{7fJ^qmCGJObJIlU_$OLufMZN*Z0J*_f)K)ulCZFc#+34E6Vu>z_vTtpG& zIe`3|dZk=MZ+3Sz%a*MkpC2FnI+?3#>{YEvX$@Bq*qt91uYONMk82Qki@Qy9X+v}njTwcQOc(sk43pWrsL_qz58yxFebiC zKVixPk-*akljCRTr&JVk>S@HBP2Fp_f?OXn=rZp8`OPKOcy+sq41+2?J2Umv1J>3>ya&Lt+ycqH@m*?oIww1Iek5&U15+yqj0$#-vCM60Et%Xb!qq9PpqOcipAMV04 zdF*h2Q#gGNC6&K z2CGBMqJ4!TV$eQ2ny}kghXhZ<%w5vOmab+zg<%cNGQkP8!pP30{X*3FChhFxBwm0n z%6Bot@y1@PX+!rNer@7JjO$~L1NCd$JEIAN)xk$25f({T5wTI9QYp@*n( zW$<8rzil0)M*>n~sW{M{FMQn=0-Jy7u7(dm>-MW5ygKP{gaQ$d8!J6De*F3M4##Az zWHah^!}Lb{!8>NyHZwpw^*R(Lf>>02iKVMEN%~c3~{s5mP=BbYD)LD%r>N<6fAQYSXL>n*~YZJPeZ$~ z(;T9kO&J)~423pqO(MR=>FH%4d2c4+@TAV%y7kPI=}dO^GRVBw<3vbLa_a`##c8(e z3eR;W;jKUVb2Q1~(#-~%ZSCJi}~xm?nL$wHn~0P*q3&XmWII5T%T zW?mzxY%R&kdiM0(nJnY+Jc~Bc^DOAQ2_lASC%#I21!Jh=(6!Ydo*HQ@LG!Xchhe#; z$WzEwG^-pMLW3!pV}koI>`>DxxK4VBfw|P&Tzd3LEVg`4+~K^`>A0__rzfl@=6N3;iToaIbjg=K)u;UGV*yFJ1)syFJ7swsv#O<|(y zEAzRHvaA@<48IL~05#V2#+ItfY*>ES?;pblG%r;LD@K?oem1)i0+Bf7mu6?_0k7o+ z+$i3rt z1d55<_Y9Gs#WT1q*UF5*Rmif!JY7-7*g8moQAO(MG8VGr{Y@VI9GskWeodbQ9)Ff!I^XUrJg#YMh+dR>9&7m?MKH6Xz%khhQkC6PEdU9N&xRDx1Pef7Dv#psy{G&31eKh;JA_SnXhxZU)N}tS@pF>_Ep4f zt)?9J%Z=cx@>E9^kpcm1O=XFr-Y$jhUcfNhY;Ny>19|YY0 z_P4+N)b;Z5=bwMx^!v@{{k{n^Pzjh5KEK>|34X0-;CI{Czg{@wj6SXVV(3zY!w>j; z4}`-YKgtt0s>|?qHKSx_VqQ3-JIF@rGJ!pbGT~_R>UI3hO1-p1&lgz@8VsFMvmtFn zsu)SdRmUkan5s_ez{#4{tE0vDue4|dM6Vi&Z&K^gztFECZ*}av9YIPhSo!ZQTXzM+EK7qz{V336)#aVt>*KP4!TRl^KG!GL^M)Ad9 z2v@|N#0tR>SFXhuj+?RA8@#cAc(cc|l?v)cL?+?$^}#|6K}<58!gruC-7B^JT9~w- zi+umUx4!kQgtx^N@W=i&<`1}9d@(AwF;^g*S+jPuE0qicTSKN93?x_g_I9*Km_J_; zY4`cIQls6NUxRy0Gt`QEQeC5K*JQ#07rx|OEg(`pGbSU$_*^U2fAPnBo?+N6TGycd zdJ>{tUke;+J<1|XOk&%U$~V9~?S#C{q1pM7DY3 z)n8kDbz5gZu1A2HHK{Qs_I^R28mO%8Y@qp!Eey) zN8K6Ge}i}vYL8|Hm(mMTf+Un$LH?!8E|3g#QxXQ4GxVzA67*7hw2<75L`9@z*;N!$ zIQy{+8f;fD9k0r*0xMc+Jh(-EuK zpu|#P!C?HBvC$F3kuEkHM!xTayFoH?6u6Nmw6rLasXngI;!Vg^aqlk>Q5Pe~DW%-H z0*Q+vK7{7?1fub9Pu>&g2Hnc$zKc53p>#YLG)6|pqS3d%HxN9bFK<*QNiLnk!;Kgt z24z%d8-uM*9exIkW?BR=a!oCs)RWV_4}u*60m!5>pT(p?B1W4#x;GMG?5F5eN@8Fr z5Pef4pF20e=A=0}C#U_>fBnuHojWsk zX71b>xRD5Vk_4ZB`}^PjKB(!HR$rI9LP@^1Z_&_jds|!ku>8J)J)GwmJ9>s~Pn6*v zKEG9uOt9bVe_^ZEfGa_f^?M#tIrs^1AKV6S!UwT!3a@XG3bPxwJoAfM#KOSAoX8}@ z?fLkc)B?LgBp8fz$?uEZ@cNC$BUtok@jo_wp$A)~`c9na3+?IXxiI~hza1%NK>0|?BXEdr@`*a&}2Wz2VTL%^{ z`V^%vrmVkMkEnQ0(JjndH=ql@&5CiuHbov-i#lxDk;zY`GbV&}j_A)*lWTnz5pq5Nn;K9Lb38B>99$wLqhRkKzJ#`g zBM@15aI%H>2o{k00@)O5rW{#iW@~9`aDq$$U z+0a%wKVK=~>h0dJKNQCfrJ->K>XT_P`qH8s@ZLtIHDM)2)}+iUm|7Wc!vI?cHgcB;Cq zB4h$Wfe^Nna9qi-0-xy6RdfbF1$Q{CCE5QIkp*ynV6k7rrnn@3xfN9+HS>-NFJc_N z6FB^Iv;HFk97UyQf#Gham)>0)nJ!5+uKKtST%PF5(GWwu%WZLmN@DR`n`oKtGh#-?; zU=*UiariKQ_9|A9Qjm6!QUm=T{$I;ELZM?BtylE{-ZI5Y&m z3GrQ*$uv&gAk+)KvzUVU&PDq}DtVS>B~0c4aqKD`MS#j|a&_KQB9y-?j5%Eq>oFB*RAl!}q#A4t_4e@!E{qf}qgZ z`ydJk$;6VF0W=$I2~;sQLr~;>r$SylDqM>oD;>oZp}dc`a};?d4ITp4J*4KbO=!ES zWM3^cM!WSF8P&YrA=aEO;U7WF#FZCs-n?nMzElbwTMk2g&R>_o}Ph$o}O03J&PPZa^&!L zwuEY3K2qi5)zX9lQoynX94kN=N+6JFjNH4+9~!|>Cf)%8v$bIwDBYeIU`|pw<&~2i z&yaOt_)e!xYb|WZ*KZzvWnmn(OrvZT6jnm#MSyV=EKJm^$q#0}iiQNJ0?IISHSweI@!c7Zr+Gt+hB!tL8DX(eJ@8bFz*G#onWo;@ zP^o$BO3kA-KVEOe_ExvX`37)Lh1~Ep?QU;Zl=k*+C}lX^srXIbW3%=5~e!wK!72 z37PBeZdiuiyW6xaRAy)w8f$Vw>6nr_2PUF~SgD%gK?h1$ZGbR*Wp~K*{V}z zDq2`~-30r2L(D+jj@*Kj7eT-iLIs z!UG3D7CKo4?P0I?VPxfL9?Z`}o^m5H%NT;dVKwv6A=RU!=y$vA;+V&4Rl}G0)gQh3 zvf`z0Vr_I367EGrTm7i(GtBqEV0aq^&(N^9iMd63Q3|mXOpO0z85oHwAwyy2VNM06 z#D6I3R!6cuz%0~=X%AMY08hqgR@x@n10Oaa{Ae0N0zfaULIULnFfQmTK?5@Q7up=b zUKad;&(dcjNJtS0hr0K+_!V6btlv0&;l8&hibuJ9W@dU)*N0;*UVYdfxQ*V26C7o| zTfKee&BtVY))&O4X}_b8J?SogNXhIMUfdS>Q!Jf8BF`!1Y*gFJ|8 zy)`;iseUvV#lTz7ICw%UN*$D%PnaYX|iD4AhCy)%(@D1&FMyt~k=$X4_XYV=_jp8J7Z2F%6h_tk@>=_P6+rmBt39BH4 z{tFD|0ZmtY3WX5cj%yLkCUVslUu=Dhb+qSdg_j-3uUFmfFa*#$1`zsVVBii2q}b(m zN}ipfxH2+&4sW1dJb6k{PMy4n5TNd}qa(`t4-tqf6lrb6MjVj0!dY@~g+D>~X23uS z4&>3pt*x9x-Myk?fI5ZIsc8-tV zR@J|&rSnc@v}Wn$mHz&IzJbq&SUh|BZC!FR{4c?d3OiF{_yd4UjoX92@DGAmX}Jgp zejuft{wX$p2+x5H@{YQb;plGx6Y`&Y^UO(Ph;z5}zs7KsA@evSAksM#p%8_H1oVb& zjYp#EAWzV|*@@@HgI$TnBQnQA5CkKyry>|(=Pk=f8wI2F|7tKqk~h1+n}-l(`#xmN zeH^|Qh?mmOOTQQmp2aG289QMx17_4^%3%runFtGOosBsvsZ^Qx>l|YmckdBUfA5)R#>~B zxyi=$GUA8+bJH-i^5BX2#4bYuw5%O$(!fs8$sL^%Kt?yXO~uA(P1wR9rB<&Y znm60W&`i;~+Wq?TwKG$*3mu)j3l|%j@PU80-wz-005W&MSAkSKp{7FXo1?#nYdZ zjkPJzpwbqb(1XJ%IW>x;<`PgP4;7jdCgv%s;Z&^lQ5k@G&Dv#l|?7p$H-(b$K zaafYP&-V1NmTPg-qu^8VS~)=o=nw@o7Vo5~gdZF#`XF5xNZE5OACWhuH5T4%Pn{g~ zs@kD?9LwfTTX8H6_F$XsX>_Gl(7v%zn3(mjO9?Dc34~L`(c_MUTiW0}Ys)2k>_zMe zMISo6*&yBK3+#D{IooS;vpQI%2bd2^o~Q@zb_(fjHNwWzG2~6~L?SH@g_RCZB-$d* z+c(M*=O6<%ElVUsOhd83Kw8ci+c4p6^pe_zndvFW=7E2N=BvV}G&0iLi+rt+$EqXM z>@0HvBjMEp2lpVTUFV*ISGSrjHq002kjDejJ(`R0QXh7L*X@0| z8JHWmO7q&u23Xecl});d@aM1W;hW)XU(I>v^lt`IJ?87Gy46%mTR7NU+mhGTw>Q`I znX$aD>q+BP+l2IgOap&DB>a?`@;e=@_}sz1fN6jrx@45p!4Q5?eKy&xuC6j1uO}#e zoeQgb2dYwO3aeU=Z_@(gN0^z4LFi$4s@b=x6r8!?;>d-^`6K5!f8?~aYrDo8*E0? z$x3ym_rzu)fGw4vevmbAb*EOrtrwogoX-B+HnKEcUOMlL!n6ri_W)AwZWdMm4B!B( zi3SW{1}D8{rlvV^_~vz`UG<{*!oKnGo_%od@V4|04D`aGLs#}4+%?htj=ie7cW<8; z>#p8N#EWHCZ{Oa}?Z}bF6{j#qgA$)k?4puo?1F?GCd&#|_s?2o)wLh1NAkMc(Z+*_ zUJ2{E=IVe4qHNk+E?wkz>=7$)UT@D0y18O0LQ#Cz4Ym zlOyB9_ZkZ;xpe7`h2mN%yRcYJ4$TcGoj-7vlT*pNN`{fNev}ejY|-GpMI(9Hm>o2e z%LTKXEEbAuM-NUV&%B3w64z@=&w z0!RVEco`ugFC$T{iL+%KN3cbSOAmo7nG_#QQKz8Hy&_ z^Lw!xl)jk|3655mj75iyw;W&ls@=a13-o$Rd8S>8e2i36;4?eH{5b-?feZB|6 zRY)Z_vfGA0D<0&8(GfP+N7&@fL2@aKm=xHqj<|MxgxqG-hMYBVLIfm2Y*p$a1mUH9 z)I&+yPrcMf2dJM0Xpn|zm=4k*I!q}Vp;1Kl9H%36lqP7Brf8au(Q!IKZ=jQOif*IZ zvH$%v-AQkxH_;ioi{4B#be7K1Tj*~3Il715O6TcqbT3_?`{;gpfZk3I(nItx{X9KF zkJ4jwkuFi1W@(NxWY9b<&?05&aay7rEmNKfh>-CFmB^$rtE zo%AlmWO_Hfhn}LR>AmzmdOv-Do}mxYhv=8+S^6-21QAGonLbLtLcdBMqhF(6r;pQh z`UHKFK1I*bZ_saIulDowTl8uAZTcO0fj&bo((lsm(P!!R>2vf4^m)Wb_yWB|e@K5s ze@tJbFVV~NC-i0dQ~C=18GV)h963+EMt?zHr*F_-(qGYE(>Li`^f&Zv`dj)t`VRel zz_>D(OE0I(;8^-%+FUHB7Xq0=4lE*NW*74H;Oom7rkN@)rt_Nd#7a761{X?3x@?rh zwPxTInlI!s`2Ae2U>X@MUnpmcdC#JeE|uM8IbCwEm`2Hi+PS50$(Spr^9wm6mCKrC z_k1qB;GHcLmX_0{B~NxaybBo5@QpBoxV#P4| z{Z(Vl@ZmpY<^YJ$TsmjuGk`-Ty=LlQ?8`>JtjQ-0SPxvlt$cHfc+S*py5zMQnLd8# z)M7d}@5vdoOjP*!U)Xg3dQ1DDw8#rH2KC}Bfo0ks^KZ7&9dRk@tiWdlACqU8o8Wzv0xUn z<#a9}Tc?V-6;qR-@Xx2`@cPTyoFR+zCEUj=t}Yvk-X&vgwt&a?+OP>&AS~w6YeB2O zAv%SK5Im#h-l77$fekxIZQ$;;`LOtv74tJ#cEkUh>7G6sfX-oQ}j7XrmJ z+5`6KyrIpnlxGV$U*5QEipzc;Cy9kV9%J#=F-aW2p&}zI`Un5JS;Ci(9|5SgWQ1%ANHKv1)0s?(Sr)U2$_dk=-4(MJ zZ#DxO&MX)@3S1evoXrD~Qp@Qp+2!n2qjH|ji}SEmkFLvwlHoJ+h0EYZONOsp0{=iC zc}-x5>6^=Ci-K_M8#030WyVPR1;t4FEc9F{std+)5d6bfOU-7166297_p|ufqIj{a zxmYOr0XMwm5~GGy%rog**NbVsr)UC>XXLHRB>=@{1@kMpT+m`-pvJNpsWOBVUUx}y z1+d@Jnk;6rSFf%GMXPy?@S>5CKM{;WLSIxalmLo3!)Kr5!<7;`&KQov0=NXYXuR4&UPzTOhgffcN63RBYR^Tzqn~mizp!E?s{P0d%(l>f z`=;v*6vwmkseH#JkdCb2QmXn=;*{H^#7jsp=F%$*ixP68DB8!w-Q>Bvzq3X4&fv_c zSum0%`GXQ>Z=gU5Gnpwz#!LgFOKTy~AD{4BJBOB^E?Swh0Hjg@L?oN9l!~RSY0U@a JEQs3W`hO%59=-qo literal 0 HcmV?d00001 diff --git a/webfonts/fa-regular-400.woff2 b/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b6cabbacb67f4ac88248ef235c5d7a5361f7003b GIT binary patch literal 25452 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 literal 0 HcmV?d00001 diff --git a/webfonts/fa-solid-900.ttf b/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ec24749db906da77229dcecd61d37b6489d02140 GIT binary patch literal 419720 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
  • cz79Gn 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

    eQe!f9^EZa-f?l`)yEPE++Aqekb=! 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 literal 0 HcmV?d00001 diff --git a/webfonts/fa-solid-900.woff2 b/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..824d518eb4cbbd1fc837dcac2ccad718119d1ac9 GIT binary patch literal 156496 zcmV)ZK&!uZPew8T0RR910%K4B3IG5A1{wtb0%HUN1p@#800000000000000000000 z00001HUcCBAO>Iqt2_XKkpjw=!XV45Km~_w2OuQ^4U^UZ&>B`J0064LjfW8_nms&4 zs;Z_X1RU44y{ZZT2!8aFpZ(%jzxmxC{^Za8;;;VZ@BZPR{^j5P37Avl9Rb#K>)5PiRvC@_pNc8vV4_K9Vj``!sF=UpB3el@eE}@8 zgQ}CO4(i#SBan#e`v^(*uemMy9qtIw*Wa?+7IP z%hOeVa`S2dc27;G7UqYIg~-DbUjLq%{Zz@V2qgQGf_EwsM0jA+Y+65IoE}7wV6}44 zLG4vcw*`kD#vjzYupoF4UH$D0|9tP%?vut=|+N6hTE&R9KT%v`j&fM^TnfnG!7$3emQFZ#ty6*D0SR2gw0@M4DP%J)x&3^n`@4 zzz#4A3^rgFvshquxeP;cnUuJu11UK{iKZ;sf?hl&IzU#UE>LigOlLS#;qKQb2RZy1 zPMOXp`2#M?y2J}nui4|ta`vxYcfZ%K!|RY{a?kXHosHc)JJYL`RvP6Ml3>-TZh5gN4Ze6y8OBF%5RY63MYkzPP-Q^ubcX<*8MEDR9 zp4JuOB0vEdK1Lw|wJdC95pWad~O!0LPF z9eMWPl7#1L?LW)E4>E-ArGuwxRs8?ELZ>{U-Fy4C7z#`XxO$b=Dz#NPXyh&<;+WHKTXq%r}JHxuO514u~&0I6F9 zrK@TpGhrkE8VP^~NXh_38M=*eZ&m%@1C*XVN$I{KDZNtrN2z(g(eGR6x72S{-m9|S z^Pc&}x4z%CmhnC3n`YOn%T#Iq(@em}g)#dK1jfvgm)%z-#Hi*| zu0vb72^P7X+xBfG{&hm%YwkDbd#zv0EhuGzx#3>x>G?_@=!PBvm&dExWr?p~4E3;l zoF@6ToU`|C-6YtPsmDdy;<}Wd6P?v>pnwAK+*SoS!wOJjSCvUQi0sO?kVFmd|;6&1W~o z0$0e7_&1ER@XtxbXa)Cd&*r=F6#X;oY4)4YdOrpo82G^oZ=*Wj3Wy{T^hczO=9DB78OWChsB(hV|6gnQzVv^|5;3vF2eaGxDsQA66=Jxxf!GP&AS?-H}&jQm!pSi}< z%9h#Z*DXII8wCHVWh2}AXclBv$d`roW)^+Y2XJua{`l-Iz;661z%dFY4z*Jec z9JAOr!7~DTKNF72w{?kiwx+A@hZ$q0kLuCgJ7;>|7l#e_gUX|83y>r4es7f%Fw}y0 z4@Pol$(%b2Sse|!Ssp(**_PY3&hOF6UJ&)%MP znXe~pt{T;QhC`Pv;l;I4>PzA8?U;|pNu4quTCS$PjrjH_RddJt&-f%Yuas{+PN=Ez zbD?TB&Z8N){Rv zj?W0|q+qV)g6W_2~hJ({o9-_MTx z$FnqFny(`tm4&|4zRLW5l0uIk+1E6e)IL2Q!Z@kR*3aeaIe}R>SB>Xco*jG2a#jop zoO?6*ZS$M@;*@OVXXQEDnS|mqe}D44yAyE^@1#- zm+IZDv-B;&t|W&BJKqM{1ZLcuo@hpI+2%bPIhU-b5xo15y>xUpDC{h}234kb8`Qm! z_tVMw-o-hv9`7oCO3vmOl#w9c`@gy76;f|DvOlI_EC`n2ZO)2 zH_9Ex zoQeJ}WBF(2QnKfCpLhS+V?2`>U*%A!T%Q;GA-%)`?qq%(@2$bw#~twUwK3Tb6YiA% zKjiiu%Dww-^etX5u_g7;Uz7f$ZO_-WtG$(osCr{{vv6%ld@gpbat+h5!W;jnl}Kri z(li_X|0`|E-~B49m!%p%Hs(Rown94P?!07N-okNOy6QGV{Z7xbRB6=0^;i46p`KRp z*PL|x9VDeHH|$60yn>%5ki-&MwS%%`Q5 zov@7-&M8Tcws#FlrR1n_6IHEXH9xCSW2aVKSy*DyCsNW?&{} zVK%BT2XiqG^RWO6u?UNC2uE-Nr*IZmaSPA!U1#eOU8-B^R{F3$u21Nb`n0~Ruj@M| zYSx<#W~13;Hk&PGo4ILjna9zrXqokGV2f>qt+cglZM(x(+n4s0eQV#@kM^_uVSn1+ z_FwEyxIeraR)^2R-{BvE9(@MPWG+jo8Kq^&TCBr*tj`u~$@X;Y$RQlcVI0m89Le#V zz$z~05-#UTuHtI0;aaZaCT`^p?&5wP;6WbZVIJX89^-MI;7Ok1Mc(0EKIRiX;_XTkp2JU2d7_nSP01?pOOQey87uFbIqAh=3S~i+G5S1W1e|NQz`gjua??QYeS=sDK)1ie_kz z7U+PE=!DMbfe{#m37CjUn2afyiW!)V`B;F3ScDZ=jWyVTJ-C6}cmaa|4j!-Y319II z-|++g8Ih3~mC+c3u^ET)7@x_QoGF-wX_=9kn3-9agZWv6C0KzKS%dXhpN-jq?Ky~J zIf*kki*q@j3%HPrxtu$=i@Uj(M|qhy_=u1BgirZ`ulRxA`GddsoBuUbBWhGlq1m;7 z7S_sIMQdm+ZLZyPpbpX@I#kE%RGp^Nb%xH?IXYjL=rUcQ>vWSI(1UtdkLXc7rpNV! zp3*aVR&VHC<-_OZz46T#^WFS1#)t_s|7;8!-=?=2ZEjoCmbUF|2iw_pvs3I;JIgM% zJM1NU#on-Y>?8Zcey~B-x4&$J{cHbIOiD~yDLdt$;#88#QhBOGRj3-(pjuRq8d76w zMy;s>b)v4+lLpXG8ct(q0!^Z+G>hiZLRwC%Xd`W*19Xhe(nY#T*Xbrbq-XSwK2a!r z<~W>>^K)S?!X>yQSLQ0bgg5Y3-o;1wIG^SVe1q@tLw?Gy_$|NZPaMnv{=z@_H~*C= z5?vBYGD#zuB#Y#byi!<7NqMOv)uooyl}6G;T1ac@C|#we^pgQHNQTQu86)Fml1!I5 zvQpN`7TG0xQ|MxsEilOCOdtJP)t#mKO;j0wXCTK>` zs(ptB7YQzNK&J;U3SK++ERzq$kMwG7GcquC>AM4m0>=U;0uKX0fv@-i zL08tbbZy;Ox6mzhJKb52&{OpcCYNlrUhkXps6MSP>j(Y!I!J&2V>%tKBaCOFo46*G z$zqC`(x$ShYZ{owritlqhM3W243mow`v$Yw>@vq!b;VpWx6EVn+`MBeZFsw=HqKV1 zZ0lav-puifQy?ig?dtN8cf4!6iuLsG=-+qJX%1DX(j#Bbb&7a zIuGa>y`+y6LZ2y|Q*eGRz(u$ym*i4hg{$&1-o)E^FCXKRe3mcqEq=g{nfh^Vk;k50 z@<>4`CFNGtOj=6^=_=i&4;vaS<7ARdky)}*R?B9_PtNVyRv#o}%b%k5CjSu+36Xrx z+{lN5DEDQWpe5R(Bl@5p24N`1V=|^;Cgx)q8@~x#u^oGG04Hz;7jOwzaUFMXpRHaY z&@;P*yQnTkKaor7Qp_6<#rso#&i*-XF310_=KqKPKluO7|2O`>hCeo83Y0ETv_Qf5 zE#8k8f}RaHfmR1r`Gl?PN# zWmQIraw^9W{GKx@BcKdQueAKdp8$XG3qSBJp8$Le@DU&K9@IMa4EpW0KnM*XL1IoaWue@07n2EzVv_g9|CXy`vdI3ZtTj= z?8tU(!&Yp@#%#cftbm8unSj_y{Fndq@BR${eA5?w*sHzD%e}-4y}(mF+2cLJeE|1# zXSZ@q*8p7FrCh?rUDQQf*o9os`JBhOozq#J$r+u&X`RNYoYKhwCw3wybUep(9LIJ{ zK>z4>{m?gk)fau%TfNkCJ=J4CXLSP5aX`la9R+kmhjmB?wO{+RS9`QuyR=g~v_+e= zQ5&>gYqeS{v`jNKO;a>d!!<~K)knS5U0u{pt<_vj)mRNxS9MfdHC0uWR8i$sPGwb6 zB~)C+R78bUP+65l8I)S7lw9!@N0t;6Ly;6w5d{9v|M)lm;BWlJ@BGSle9PB-$OpX5 zTfD-HJj2sG$s;_(1Ki6U+{(?|z;#^8C0xXXoXP2&#;KgdF&xcd9KyjI!~yKjp6t%9 z?846M#P)2*wrs-|tj}7k!D_6^Dy+mZECm1ni?Rp{vmgsF4>L186EYTKG8&_Vzr*k0 zb9fP+hbQ52xD~F3&0%GjALapJWaxzm0DuPo02mn=85tQF8UME-HCIawQW33EZx!GL zJ>)|bQXxrFLsd`}wN^2GO@K;h2s4?@bY^OS7H9=;a0PELD)J#8sxhB)3%BSPXK)pl za26MFin^;3r*I1U^0lUL4~H?61G$Bpc#o@ePKTJPL!75=+NT|wrg@s78JedF+`${X z&g-hGnyRTvs-h|kOywz_;4w8;Rn=5gRZ=-s;sj>;cU5O4Hs=u@;SuiQA@1M-9$;s7 zMM3Rb>&C;9FH!F@C2r5Uk6fJY2*@JjU02?kD`1AM+!8$&cQZE4a*eaDjLA z&R*Z^`Vw#KnM~z6uHr22;VyselK=p~pMOqX$A^7lw{Qbb1ng35UB>`#4EPB@19+(= zZnzEbVqR!_XQW&DzprizSpA=O^JGs3Y{DLPwp5!ji)HWi2EN1A*oO74sBd@d;TEoF z4cNKZ9h=((n*dnd{e93VAlwJS<&Eh2!y$dMSHS+;?|+}t7k_ML_iz(i09fY<9~m|S z2y37$IkxB<*fPMbhu47318fcu+J^Q($X%_rF~_(}8v)p`Fbgm}v==>{^!1ltU^gUd`9h6p2{<=1VlgOw+W17&E zW;CY-Eont-+R&DEw5J0dDN&}1oN6ir1)bvyx=z>YHr=j!^@yI-n|end>I;3P-}I;c*9^_nEX~#&&DA{3*8(lnB5l@I zm%C?P$Lo4MukX#hrML2m7v9M`dl&EKgM5e&^67$%`YL^weor&fg0v=W&gx~=S!CU_K3TtPAoT!xB>?cPKp7|l z2IN2m5YPqa3S>YpU@%Y<7zXSCGzRwn?OFf_xR$_yt`%^QYYiOi+5m^Rw!opT9dMXy z4;=0~07tlvz>%&59OcTu(XI+O#^u1Vt{OPbRe`$ob0AC8ZLsKA6&{W9V!UcIJXjjNP!@hvL3+zkCyCOA({C3!rkbevN z9P;_FPat0a`vCIAuumah0(&3wtG*2z8>~5_4th*8l0 z5M!Vj5PQH+hu9N-7Q|lgvmy3|p9--L{0xYF;b%e|47(iS5a>^c6QCy{&X9P1rZO)- zNBB~R^WZZe&WF#2xBxy2;zIcU5EsG!gSZ$z6XHhbScqGotq`}vZh^QH>0F5WU^5`@ zhk8Lg0L_7T5Sk0|5Ht_sVQ3b_BhY+^N1@pek3kC{9)}h}JOS+h@uYJCL6q~D>a3(uga2d@J~L-+(J8YArwMH8g`plAxa4vJ=C-dx!A zP_z*9_98t5MH%TsD0+hoigEBE=po(Z#C#QHyZLIOvjE+-VI19cB;@Nl|9|e)-Sw4_ zZzIx)bkBtWbk9TjnC|)Le8G(KptCtM&Wp}w%sd>OHJN!5bdF}`NyU6xk=J78HAYA$ zQT3-9fH|m!19MT0`Gw3)wK&z1n1^aZs{JrO)v;8^VO^^8sV>0!R2KmoQr!p}QQZO? zQ{4lbP~8ukQauctQN51-^HY5Qn^S$h99vNJQ8oRwx}MYJ*qVAl>P7l#b-jeJ1NB<4 zBlXs>6ZMX;Gxe^p3-!Uvu`Bg4)W`O}>iTq-V-M70o3opfz3O zIdB=xwO`TYG&j)PiYsVtr?~^y(cH~)+(2_L%`5%fpQw3_<}*A=Q_*~Zw`jhi`4%72 zd@p=T^MmYr6X!?T4nCtDNIM;VrtQ+sP8vfy7wzh#Nod!k-GHp(U0g)I*}Ma4AAa;g&0VTAe~H%BF2)=CdR$cS&SGD>3m}R5%LMd z1jIz73y6t9XDwn9bk-#%MY@=n40&H-@)6P{#8kv$q)Uk<7@@Nqu_Un!>0x47kPju6 z8!;b5EKjUPdYo8;*tjoS$0j1ZMr?}oII<^-E5IZ1!Ozij-^(S^B zb|Za4>_Hqxs)-{QAq8a*}!zm-i zsOu@CD5J@1QpSkRj+Aj8O8Sm6UPStyG9hJB^4gTikaPuQ@`$_vWlGA_qGY_OHh_0 z?@3wyRWk2SS%I<|`2flqly%65(?il)bQ7etN$VMV?~pbiZCua$m^LMCMRy`;FVenr zr;`pR9YJ?C=_t~%0Z(UW0(@@QPOjCw~$^Uy-ar>>0PCJ zfb^cl)AyC`LDC0ShWhg%>0`QwNS~6vrhAn1J?TffXGp&(-Sed1EfoJj`jhSj(qA4T z#v=Vq`j74?>Ey2l$ehEpqW0T#PsBc&Gb4`? zPx*`TH?afdU!*^i^1sAR)IkzEQ%9B9g*v&!uGA?dcB4*J5K~cSr_T9wF0XT25PMPQ zqt5>fF0TtJu`hKIiT$XHN$gKuLgE1GQW6JJmytM#x`M>P)RiR;p{^=%D0K~q!>H>P z#NpHpsT+-Z^SX%gL4J)U7EQ$5OYY?nE3%-IcmKaSC-$BI0!FKGgk)GpGkq z&@Dtgn0m;)#S--}>fyw>)FY|K5a&}*u#a&u^(5-a#3j^Isb>R4C zm)Y^9Hz{!)^^VB6o_a6!e&Pn|L)3?#6!)l)QXeO7r9P>|9n_~I;!f&I)R&37sBh56 zxQF^S^#kHw>c`Yih=-}4Q@4ygwbg;(PkySqs>Ny zF=(^X<|2Ng%}s>SX!Fn(B@%5h{;l-1#c8Jzf78yOT|~bE?GoDM^lQ_uq+LV5KJ9wi zZS)({?x5XCzcuY{+P(DK((b1{M85;=5!zGqyU?DYy+FS=?IqgF^as#hrM*sn5bYgE ze<0_KrPEXE2oJY<=&PrTB&PmQqTtqHJL|jTP zMlMcVMlOTI73A^~SCT79Tt%)baW%P?#5LqP5pgZK9=QQ=9l0?PaU;0}xg~KExh*B* z7IJ%XN8(m;7jie^4ss79?k4w=xQE*SLX zZ;($%#GB-EPF8R(S@g6DhKKX&f2joW*ACjMxjE~4K$S;YH$#2Q; zh)>BMk@%eaxnz7n{!acud`bRI{!4sKjz;1;a_n~TJvreKUX1vG>Pz(_exe3g5Wi5v zsNv5=@|sAA->E4j{-CCfh(D>Bsac4>sM#nP|4?&Ma}obii&0Au|5HmNQPgr0BdL`n zMp0`-#As?AYCU2MwIL;AJhdsc88Ly{lG=*aMeV{2w(it!)b6yP_M-Nt^`Q2p_M`Qp z4yTTw^`VZYj(PS|qK>1ErwyP^q)w&{qE0uW4W-Vb&ZiBdE=1Z0>hg#-5p@-HHEm+* zS`L9WDRn({BW*J37V0+Il++#6owRAF2dD>W(@~F5kJ4tKo*<&lL_I}4O`Dl|mdG|M z^*r?gZ8qu^>eXinJ?eGpP1;=4+e(|4dbgm>M}0(n`fRmFeNX*JTbTM?X^T;RMYP4K zf2sdyOHdu8Ek#vCTbde8jiD{W$ZkZm$EzUMhYL*JTFCExRPNL?5GY1Tn9oa3(QVqHr#;_n~k;u}e_6gy2`s{)xiP z#GQ}A9mIZ$!res2qVO28+faC%m{}-1L40Qvo+R!&6rLt-HVV%W{e{AF#2!T91>&}$ z@G>!8N2Bm2u}7is7I9yp@D6diQFx!Y%Tf4{xZ6?qjObhxz98lr6uu^=KMLOw zHx7j#i8ClfqRUV?M072Rj=0xREJfVQD3&JfZ4@gI_Zf=SiF*shhQxJ7aWK(mD2^xQ zG!!Qgb2^HXiTwn{>BN;oaT(ExC@v@VITZI2_W_EB5$91np4iJ!JcZc#D4s=p0~F6E zIv&Lf+;E|8xJaKDE|-{YC|*g-6DVFw^e~Fo6FUsWn~1$0#oLIVfZ`nli{hR3K4!A` zpu~(r@gZU=qxc9hbx?ei*pEKPGlOik}eui{humk45n_Vy;H< zbK+a0_ysW*#czl`4#nSyc^1XriCuzw1MX4&$|0q=>rY}m>iFpB~8bmjs zRFjx$DAgk7Vw9Q_eTq^`Vk)52intF^YDe5DD0L%d3QFBQgpm?=6-uLtyBno3#NLe3 zSmJI)X&iBPp){Vjr%;+e+(#%)B{~nKwU&Qb+Mtz>ENzy!A5hv(%*QD0BzZ>?NK_;%4?QRkl2wZok-jwlujb%6_m~1v6chthRK zH==YsG0&rPgVo6_-7fKKP`Zm4gVH^|ez;dF-&wj(tHW8kUt*3&=|N)dLg`Vf&sln0 zGfOXOX6Y4u{qVNL_CVhu>!t#5y-^{F zn}P~M++b8#;`*S%5!V+Lp16LfC_&r+RFo$6AykwhZVf8R6W1RVm57;+ikietKt(O$ zCZVD>aT8Hdm$)IQs7Kr|RMaPKC@LBeR}mFWh+Bz@7UV-r1KDkeIR)8miJ6J)cElWo z?DoVQk8FdOA!M7xw2)m)ygiX!O3ePqt|0y&$QH!=2iXgV)*yQ^@jgKIGGdNF_HyFQ zNA?=xJ&f$N#1zP0N4$rSy@7ar$lgTEAIRQLN;$H35brZ&?;+*}WFH{@kH|hq^e(aw z5&u?XA10=Z>|=xs*(ZqiKC(}d(%#5ELrjG1%cL}n?5o5dLUt|j8_2#!yuXosgP0AG zeT$eEk$s2gS7g5?-qFZ@OLRT5zY=op1mkYmY@ytb9+myLj51}UUCy?8K_$A~v zCjL{%^%1iGxvhvi?pxuwLPgWN8}KLNQtNof{xdy`TRaxGF? zjNB>2e+{|I2-hHYBQakhcMmZ?Aomn8%aMDQm{XB^op{$G_Z2ZKk^9=yBK#mRZRCC? z-VwPS^># zN#c*A(bI^3E*d?Zc(c&x<;1*!MsFm>N2AXW|7SG1_CG1+VoEU8)^fEe6OphX!;t4e zUe9{cMqi_z1$kOed$J(!YxJdAKG4jwteJ0~)zVtpla+&Vuz5CEAFTH*Y_(dg`jbyS z*&10sGBPsKc=E|7M_Q9VD2fwpmc)@1#mVGXNgQc*Q541Gf3u6CT@-~ni*`|TCvhZ2 zaWZ*G5=T-LC%O&5oBDU^D|XgxRM`Ti&!}hFVBZ!&x!RK@X{|AoH-~%tX5Oq1*2_UT zt)&aYFpk484C6QqH%mJ!mCiKntW-KvEsw)64C5){Fbu<3Odg`?NitoUo+Q)tAC1bx z)E8>&c8=o&m|jb>tQG`WBg?a9-b`!hlp{El)~ZQR?(54qg5{uGAFL1NdBzdkqCPl0 zBX2eu8T&Q!W|{_hFgN1qI0#fZxWlh>L~#&!;p{^mTvm;YnSI-q{3_*YwR&*%VBO|d zI-)tt;vi7WlPF#OYs{>dvMdg!c?+$$ZTa%$@4V_@ipo@5Gt}m6m_C$dS*=>lhV0=6 zeWQ#vN-N?Lw=7LT++10&v^EFjrZWGl6PIKrC2rm=i_ysR^S;TAF-7@jwNC35TGdtF zzFtw5#+d#xGg4Re$PDXhFcp+y3;LXR*b02H-(Oz^%f>;&SfF$xRf4&06gShxS^X~v zkTh2^=GczQ0v=^qXj)B-Ez55jOEns);+!~1(o8j_0%nwoP4KM17n~665za#CxI{8= zJdcT$R%b0qe9zhtlu{~kixBEE#+mIn#C0t<2;$Iji44H?2p21@&T5kQo|Owq5wZ|k zeg`IS56Vy%?IQ%$$e3YSF$b#@~T< zr_+W{9SEijz3g-DQ@WV_913H)nZ$9j`Ke=xUb9B9TrB5sD@@US^E$6hO?b3RNRBt< zYEDc&*r}>(Q<{7`M{5&36O>*JI3vWe*b815SeENC9$d|&!RN8LS9t-mEJDh_lu~i` zO~kTTz?pY=Ghv(smgU}bSLzSkb@As(?FBzDuP3b){19MPUqhVR(xfuaExb*tI?&SKE$>Hj(iq@tqn8UaYYwRMFw4&>k zRyzCCy(o)vRJ+6&mt^(C%lGs}S(FIx?HwNO?csl4b9$`R0%*044FX!EKKZ`O5wu#z zCQF+G2<2y21aC*j5K4-&Agz_vv`5t@N{yDm`S*^d5JurqfGy&2#*UBAH$OT$@0c-6 z5=#BC#~BN-McRvhObJhqo#6-}SpFalhV&6ix`dc=vS?V>Y0>Vssdi1V`9q4bDBsj= zte4uN_Rg7eTgNaQyXT{6-g}8MO2ij6fYx0&YP74u6zki7k8Pbhvvc=xOpzqv7aHBJ z){qXLI)*7aL?{{7##DoWY1RFBGMBW~3(L}!+XAJvQF>si`lvc`)1n__M5*{{Mv1&# zohnLzvN-ji&Pq#S$F><`j9|X@pmv%9q-p!<3vc(Uf>M|q-B-`#H7JWyr-~AyaLs0n z5y!Tf-CV_1{pv|3uTd%xg5?jFbC|$e&`E@ns%$ae2I3OSxFt9>?TMH8p7rM)+h&|G zcS5Ki&CBgEontx?A9xnLfHUSgw#^n_4W+!Y$emm%0Y)fVDdxP`1hZ~ z7~YI>bj|}2v%cxq#qEo-C~KX1s8GvYNAYi0SAzqsw95XI0{8)E^xhsW*q^h# zGd|zoT*zMYc*fa`Y1#oayUe*d$gj<}y%c{At#FB-M{XE=l@ zTF={~H|iGKXiYNmvjN4v=gmFF7_%(*w|+0>K2C<=V!|xTC7dz1l3DiBg_RoJzl#ph zlMsR;ze3)jtSS~~N>{-whGkJ!H5ufCiV4N~AyqvvebYC8%0_+A4*7~PJ0)fIQ$im$ zdsV0EZ35&CAz-stjjP@!2+_!45{6+bjsfDhHC|X8b~@{?f1ScvMs4=0(Pq5TS~Fdz zwGwZRCJ@K1<6f{8$1whx7|?)knmT*C7kl}~*mk}BJ|BQm#)JFi!i5XC6>iNy zW#tmbIE*XwZZGukIfGZ#Z~wm!F0*ZiFvb?M2q1znV~oIa8Dr$O+X!Qf*|szFlf<7o zw#{m!TZqQ+AsC|!?R4#`VIuX7&NBH%wk7TNiYfragp29AcA)2Nvmb_03l}hX#w>A1 zVu@oMoC-Zu2t8go(sFE@0a<+S5l@2gby>^~j8V9pLm#H-47!ZR-u?5;bb+Q`>Nu5G zBSiM9NILEPlS+29TuIHw>P`u4U~{m&D#KiNhR}XRl3bt6JKEi3b)^rn8VTHM#jC3u zc1l-5*f9gS(i0=JoM8krbOk*YAz%@!lvWx|jV~WlI{!{shcgdPX6t61S%x96Q--+?7Je-NT1H z?9lfq=RTPIeKQ`L{e6!1sTVHnojiH+eQj`X{_Upe(b3TnD^4L^wnt^}UE{a~)!C-;uI$f$*$k%W zRH8;&bLXOZpy0>vE`~yji*l|*Hk{tsVXu1d_q(170rcFtM~%~`JmRbmKz+vj-Scon zo*J;3p9se5385cx@)RDnS>c*;?)w0A3t}~!2~5!eLcMI11*wVlwr;FxjRM)Z0eIB0 zL~k|%n$2eMN(Qnz@sFyDKex~Frrn@r`#@8T!OlnJCK|yC^-cuU1c25JOkk|q7igK> zd~@D5wh;o2-V!NG)7#$R6KxqH4ZaCFg3`!W&Rh|eiP)|$#bqK868UMj>NRuDKf}eb zzQv=7Az^RI-uAi!A5IN5^?k0UHt9!mrRt`hr^5u*G3ubu7HnWt!BiJ)Gm=k-U|Hntn_@R*Hc-hdcB>c!=J<2 z`fzmm^k}%g1|NqUWvW+fZx_c^zRhNOb}(qKueS$-v#-Wzw-=hCHadgnn6WklcYyEw`zQJbd=fY5l|%UC@I6i`K&mqvp6mIBK*1@TQNqc_J<#(t6JT< zQ}ALgaf#C`H))q>(=xwJImUZ?hr9VD4c+UE4> z!vfB!2M|1TyS9NQ_^A!-36oCtg+U9vXEo0MVtBYv&XjZdK8Dj!4VvKuia;5?%?7GOMzS)Dg%(ynCpKl}BEi1~}5L1vR zt=pDk^R*KgnynSx5Zo1~>YI~BGj(hX+#LCm1e{QSG)ei%&N2U~bEhLt)i(#3Vw|{^ z9R%D@Q{Qn;cHrT>l~SL^0toeGxVFAIZYXAXgkS)N1)RH%jV*AAi#_qF)p5pJGjQxP zUy>8ovMd|7+n(ePk3WGa$}veGG7*KCf-uTOQ|#f9GEg)2HL}~Du;p7?nB&2r>5ib3 z%j0ym1fcdC&b5QkCD9yuer@tE<6Ge^K8UVV`b1)qIhjVwxTGkpN?e#S#@t(PBk?cU zlxCSXb!>;juQ;~D7rzT9xnnyHV{9==01}um#+>U+;*0Q>4r9MARM)#FpS6rjy4M|^ z@qjtceW<6k_t58#;}_d;?CVr%^5Z}5DMhc_j>F+sZO7q@zlTi)pcelK1$P|VVF6!E zGMs^4{8xrEnDBr(o^9iD`7iJj@MhoIajHzYwAs~K-+1t~^fJ$#x(cUv-9x$JVAcgMl`h(m7-&APf+(&;w*(N0c1e$%DEY`3U9GD2d6^ z5HklcMNB@UfpbS~fc7$i#@({%$s4CnZ*1;q#tiNnI-2sN(@8khM{vX#V{sm5w!IXv zbDQar8;)blw{|?-+rygf+V(Eh`W2qS*}LeO=+-$O@#l{%O=UFGv<_vqZpVDo8>u*%WrO+ zKE3f|K`DIP@;ocH60l^&Q+jD)H9Z%U#$*!j?Hyjwirm8S?-H`(5~pUIxI6lF#~Ho= zzm86zO9=I_bW3iunISKYjDjtVh8|sXFc${Tyg4)4DAJn(Di6$umK=|PQr?mF^~D!k zaZKC~?gI(}MxRBg=m<(j3>KeK7^^FPSTN(1!c>XwJOxU*@aGiB<9gAXd)e`TpFcvY zl&6;icouv!%+MOzLu2${^kgr9I}9{%xgJUH(Xu3VuFjryvM5K6_XM2*eK?aG)W#Tw zGPM+xd&$R}b_qPyXUxAL+>87D6uUL-c6$DxU(*+O*OtQ(jw!byd&l#r>?W z$wX0ujgYa=dG4?t4$HMb6xbngnb8lY> zvsLQ$E47-1D{sFFop%3i0Jt|edu$8itz%~gJq&N}w>z*n0xr@GHjn^vz&29BVGNT? zUxmdSk|Z2cIu4TrV){0I<*NYnK&dRJev#NNEn41?Zt8bBu^b~bn@?NTH~0L-JO5$; zkOxVI3-tOqbrA9pTF&tVrsx+a$%N@u3X^(Y&)b@^IzNm1@Oo{h4%O-e&fJQ(F81QpK>>uS&+Tf0PLy}h&3UMIf~ z=k=KS^Ae0Z5+Vum$n!u-@VqM^CCKQi1dtLyUR~Tl!s5nWL#f8z2gf2@6HI}Nbcs^I zVSA+o&|2BvA^7T;ym@&WWj`-r0?(HK^7)Y5cH3j?VKLv6oVPQO+&6+!aTwI58 zYpaCs(benSyr2}3QbG4+aOdHfm^huU_pfx-=a%LQL`YrLam} z8gnpEgZg0+T%C1EQ6`t|p}vH*-r8sXzNto4JseeLI2xLf8Fl3qILN!DG1?4AxANo* zLQFUBipN@Sf6i)A45^JVMPB5ZRA^Nfe%%~sm4OLehw;F7yiht$Gjn{&JvR+~5l|Lb z*mu3qvqb`^8HYCBPA+amOA0O4B}{P7%E*$X@<7)nViMrZ~;| z`m3|g?@%Ai%_?Qmqp+_H<#M%nJ{V)PDbr3!V6fi)7m})mciO4)Y$@Z&^|O>X8!aM| z$oE>Qh(i`i%M#Sjd^cg>U;ylr)e>ZCdx}RL+s-o2?ydPzBt#%Az&!Iw8i*WwDz$B& zr80;jA%f(%ofaP-4pY#LhK8lmM8#~sF|dL+E6+|P*tWw{;%7|6e&maUsb;{!IAo69 zP_~<7zJnoQ#0HE3uthxEQ>krtB7TzRn*>5ck*`{S2{|}s+xDTGkMHq(O zt<(qADDh?-@+ubyxJcU%!f1goqQ!m=GY}$4gaD5)$9eR4{CUgbo;M$ltqr-;Bd=af z1&5i_HGO=y_#({EG4xpUG;~|d4eGG4he9BMS&Cf(u^C}{O^{4~Rdd8Bqyl@4(eJl# za8TF1K|V01Yx-t>LSd{$92_Qr0HamXYUcLuc8mDjG-F(gB zUd2E0yH1=q51sM~i|c+E3T|Ql5g=tAva-5~c;l7FdH=WSvn*$L0yFeD^lJ2LXjU!J z8B%vLSKf8nt!RJ=Q_2mCiT%uz*Jd~xj-ulOE7H`2I#JaocGoo~I-)dXsmnoz`T@>O zyM1DV1Fhkc9&>u6(^mK2+{C5rHH_Ex$H`-FdOizS81gea-X_6>VA3R{*}A-YPf z*B99Huy{Ehm~Y!*Mya?V0py3Co&HdahUfUL{7o-yQ@`Ez3xM;_VqwTxa0&wega=%} z4MFMR(|3ZqJK>)Sam}Zo?|J>jeA{;eBB-F zjEI*|7|M%4`#>#xP*vTYF~*pjGF~Ymj}FmudIU>@i>XC^9#OQuvU21901m6obvrvs|B{hJDSERKTkMgXG*1TD~bS@gAXZ;)nfvH z;FStv^~wMs_+^E$`sDy1c%{Nv-Tm0(fn^bxP$~qalvbSaUS53FG~@N9f&S&om&?4{ zv@EYaetf;>;RmIh#&=Q2^`Dh78o&5{rjsx2eYUr^NeUPaQs&3w{r!FFZKa&XIv`8(2RGmS4~s;fx`Km)~1{8s7!Ki!PuiAe0ou)!>hti?TGtl$AeX zJc9`b#HsU~7+~diY3kM_0Kjtw>>}qb?)*j7Rb3{Mh4@M$S$G%bcj=V}u)qtl4{w9- z|L4{FJNBi<>PG94E4ReSS|fioymaw8c=6(Oaln9!^x2P*Ng}8f$s`eg;j=7EGQTZQ|etj@Vlr&k3~;K&qLP`>giJGG>N70z$l#?ResmSl!i19=1{MyoriN=+I$Kf(I!a! z+Y7VZ-CgeNL{141JGSr3GaN3FiC+Bup_c>JY(>ouIrJw}; zroX(~?OH(>%Qi$ph74}VBxGB=5`UHMQ%{-if)%IO?zZt~6;X%%b1JD?In(Rtzzn5m z7d-+!3!!>gYcuOY31OoyH8~ioL-h;r>!|)|(7eX6sw~N4f@zvdQ{)A47|;xrVx>30-ehS8z4>h5M&^i_24FZE zcQ~a0Y~)*pKGP3^V6pTm6&((uzQ9Zz>@4S9HCzRyyJN=0l$=SZSl4BJB$dIUmAH87<)tze*lJ%NMZ^mEl}&$>>sQ8q9m zlb2OKz@^H-Fja|I(NNU`Gy40I&a{7hJ+8Q9riGoUJ7=>#<*M9~(3JABG00BYrcMQ9 zMVY1~AtjIU&Ai3mUB7<)I(itNf{c?!B~1S{aPHsj#^~{AivAOQ4SgTu{mDh%CE)K< zg1b`H^bq3l!*%LzU^AoY(r9~f%xE~O27OcUh#I?Pw;Ya!L?|esa3RaYRWe~kmdoPZ z)U=;+T`4KgnONj%MF^=0NBd74nc>LdQUEP~)tCsmPBLI42Z(35c5DG8zU zDTTfzsQnB4|CcUZ3WB291UCw^G)-8RucZlyC}L7xwj#u*g;GW;?L6N^y!#U2%v=3R z#$G8X{VfidHrCPv)}r-xS?uoaVoZu=6Rg;4T9HyBO$3Gn5?6Dm{TT+Cq~gnzcA`zY zb_;HfY~rV(d#hkkmD00q3QbL*Y=VS&P*R$ClJ6Y|Wn_O6kfNe>5GNrF(P~V}3>3Jf zGBt&fG*t^!N0+vLfWlI`v%8~hdmM&+;3A#b{j@1#*oJq&tkY);ZM(6(+tJFhF=OfO zZ(=_T$I~Maf{le3Ga+Eb08HkeUiIDWECt-LtZ}SVynh)WJ?)D~9IJzOZ?gZdcDH49 zFr-=gK*ce6(cW*`<^5Qxc)Zo=bULBy2ID9i`;Hr~=_e8co_7=7j8Km|7?cKbRBMw0 zW)Rd&dQQ(JDF-LWYUH|(S+tu>d!uUj^ySN!*V=8%YPZ*3^c0$$h^?*P1ux%MUwGi+ zi*RA_MGDYv1MqFn*?F3=;*&AGIDsf$ZN)KsNP-o;;g=EKE&7>rKl;&+EFa_NJ{MyS z?y2`h7RVPMWTB1a45lzcJ#-$)@^c0U1LPb%tbt~8Hy4n~Dk}YE;0M9-qj3UnCPhEV zQlL86G@1Ah69Bu2*qBf})hN_=kxXui6>S?k*s&{LuhU_n_Cq~TEu!g< zhEii@K)Df^`M1~rOtZ9Aaa;h`sce-@6CMo1!>NT_uG9CA^yyHpC&8XGwY6g%4xgNA z@f8Q#jwUIJq&YTzJ@^mG+%R~#RH<-T=9NkbiOAUg2K*aGqy8#%8`_wuVH(LK_!hwH zqq^~O+=^qe*6(>b;<>sI&+_k;beRzO87Hu1tYJEcw|GaTox*jqQ zt@i(W(l-R5M-0PF4<6jRZ&uT0_w7A+Fm(-s^zLb?+i1zHUFfpeBxg`QRnv9o9)!T$ z5eAohhH`<#%*7`;6+iIur~5hyc&FAs+v#|nx;Z%jp$99JX3}2q`Qv!znG0IhQcZLSZx>g<(kbxA;NB z5R8z9if9hqpo-xnzvY60OqN|Qj6m(ds~NBFg3D)Bi)B{B$q6L3$Dki%3Fj^%hPjOn zAlE;nI#kM*eb90w6YBwF!&f0czUnsONrfZA)TR*nQLNmsQ_F4D>%!q|nH37P%{__f zav4gktoy=#0xEpt*UQ`H@m|W z-=n|b8ytWe{`BWj1I7RtgV$35h;50WH+_Qxk13wBF}8CXd$9-_&CCD15XBC&A;12+Qfnsba}+s4>7!(dL5 zuvX^^&%Cfjv>UCX8?j6nKGw8k>(t|<71wh@%Q2C{;nSog_WK%9lGNAON#eu{lD}+( z@>XQ|AfJUprpn~wyfl7&i7OGl`s%A+ZOBYDp*$LmVs?6qpOV|c8$ZX{AARtaW!zw@ z$>{4`09TuM@sv-Qsj|^ura&h8T zROkDZV!&l}XW_$1(uzH|cm7faaS+StAog+I%4=jyvY1kEB?;s@_y>#89(09p?{I$&jgxMtm36av zA`^sqO7>jhoFUn7GV5kp*1u%@Z}kJ;JGqDMZ50X)zz-?}s{-h}G5)JoX$P#0e+TBq zzatPriB1*O{uj$I6peqrsj?4z?zGbBoJg?!K{(b~Xw5Axr!j8NkKg*w|NPHhaJC#3tzg^b>-?Wwf)1jq(ai`S?beE;q(OX7CUKejC=6O&jq zU!M~n}z zv|50RaMU6%4XQ5gJm9d3}Ta2d5Wx$i6A2tFXaHIAjRI3XPo|xS+ zgjQ>%h=KpYh^gg?^FQ8W=soBI+AmP85!euEId)G@Jaf76&5}zLd89$*Kv~8$b!{p( z&N?Ah3r=oUj(B-tfcuIKFe8Mus*)Ews}yy;Mc=-<*3$K&LaC~2Dy@VyVU53NSW#46 zQ&si7G5gE0_{l5PS}1G)H>2zD2~NEh3cKTfmuBa4qaHh4fs5UH^(05om64^k>rqi- z-Sb!@anL1k)Laq=4q7KqsMD_fBKR;ijWRpz1_Aniq3ZO}FVVp##@hhnZNoo%_WIj^ z8}0=^@`fOTs-4T=YXb|%J}-mLT_R_H`|H2{>-wtddYCF02Dank0gPfx^*5rI(Qhl8 z5u%B!ThU?xUoznsZ~)o8Z~_Zjk#IX~&1WzO0)50H6+fa&Y!_aGwn`^-A7fvipsKAhgho9-xC5Lee_NUVmGQEoss-(n!)LFD+}r68LhWv` z+vv%c=RkrjhP;^0YJ8AQRGV*y2;?in6agrznF-NvoS<3Q3rh*_2uFLsZH;^)tUA>o% zTiI`|tgMt47fXkPxc3{av=z{~D?!B|hEXgU1~Doi&E98VXiQ}9YPZ{}%GktTeEdi4 zcAGI(-Sd@apMBQE*nEX3=OL&Af78&`G{ZV7yIcpsBt!;~2{E6%RX%ESZA~-2`Ap}t z{qwrkcyOz^_7h5Mi0X9byU>H^L+Do#a)LPcJnaT@g!hS^9(K59^r75N#fmucQ_I@P z(j0`;xJIKOwUudY(cbe2v=H?|ND8{?!!04&LwVYerc6rNMa5b@Gd>q$(klxhiawe6>2+eu=@-#*YZM6-P{?YY=iWint%hXE}qm zEtM1OG%Mof)Gl=5=%||hOVxFC@btlvW|}1q%Y&~LMF5VdT_^p|8Tcxt1IM#`^p$z# zSB@UX=wSTZ!U{1Ef+A0{){FjA&5Zih=z8?(e8@;X)&^T6)?|l#`)LfCI zQ5qysl8ve7DQnm5OIc5MYQ2J|T~qc8dt6ENUBBFQhjE_gVR+rSbLaF;UDGD`Y|Zd_ z?Xs+IlV4tF{%1dX;zS;X*wC{;4kL6KI*hJF*Q2{MFa!}pgDyFdj{S^o!cxM)8Pn5l4sL7b7*@t$srCkew8wEE>XCb9LY`61!e=cvg^ROY% zArP@w$e8)ijDOD7GzGlj5Z2n&V$qmrwrgQ5x-#hhB{@Qsy#G!LId_ukV~MFJ&f%+W#hXc!1n0?j@YSiHIhX9iIkd2%==GFbSG9Ub{TfLkzlrC4)! zkZnz4%v8+{x-f{tTQ)W}HtUI-oiLOK+!G6Gr4lzMjAF4`Mb0vNYMOn{pLxh+EF9HX ze?PCQcfia5Mrc-NSS88YlDZ>8k|%1(EZ(|Gr6QG{V~TaYH)gcXHJ(!-F+;_=^dMbSjz8x()LJ(}pCL%Dk#(KlIlSIas{dY+)d-msP#S zIHig%04Y`Jeh3LD-`>JG3{evu&PXnk%s}UaE|3w71xRzW$`H14bvffCMluArC`-Dj zA9xa*?2t=H;@^_~Vcd#Ie*1#X@2aYL3~Z>v0CxDj!egq|c&MTMBN!)C5DH$k>baK1 zxf?AdlLbLiVH?eVI(W2JtATBo0ay)>zE{<17}s7l08~jRc%I9-Ww{N2MnM4eL_QPg z+Fy!rdjvPZ2(6;SUjBN-clJy-KRxPX%oBn-O}vg5#uv@k`G@A_0p{mgnHRq}$uJPA z>C7z_U8ZZ40A`bm`AoS4P%6*dH@if7x_sowa;isVpC_eEb&WBM6@&atHVI(Hbd8pk z=$4=T>}RY|Us$L&80P+LTNuF*g(yQO&@Jd8?cI`P%m+J&x z$1DBVEd{=}0w|FNR6lFujYc49!{!3!xYSvX zo*%IYE+y5COQCe-s@$lDbKT4ssDPR+T?|p0s^6Fx*9f-;`||WO(!tjK&C~F={RLAHt*X z=pfJYz`A_^kHVvbvT1m9xOMMmwzSUbBN(C&Sc%*x5*|0{5;?+m;2dHO;_U!xb(TxN z(f53Z5%A8|An{W-bS7KQy6GH>ax-Gb_#7dli%25JjkwjBg9snq{TRi6=oCwq1=PWS zF<_x)+EU4~zy?VI8!W3N*=C3_1`OC%!Lmvv8)O;Q{W%PQ{ZZQ=OEqEk*8+AZSXQa% zfGh*NXS?{*_WqP>!rnStPQ5Pt&?|leBltE-(Jr)s-hhyVu2I?v&`;QHgad^gwo;!< zSSD4^VIi3&JW4q%fbHyfU*1cVrwz}hNk{N8BT8aw)q0B3)3^>ou;ae2r)3|b>po02 zyJkMuLpT1}DmOl55Q(l4#>g6#h%p7WU4E9jPEnxfQbot5&vu)WFa>1gRa#jw8gp)4 z|K2E^;wo~0F%B_^Ubk&nYeR6i!Fj+oh?VuKWI-uZ~VrE>E|Mx3#Cs z<(dpH9+#p^S7H58Q=#a%G;W;=<9fNkc)DDM!*k9)4CV6l@`|brH4Cmn_!)FNECs#b}kstr~$F=S+td9SF6~%|& z2MH+LehF@dZ=tKvjkcvn1)EfEbAiw5DRJy5BqL3>;&zl#on!Kj4ngjp3Z{kcSx2es{B&`C ztCdK$thrfLJWi>RMpR{+5XttdK=Y;X$QXuAS4}KoH0?xzOkabNG)X}T2QfT1v;n6O zLWHw4{JY3PvuFiff$m0c$kZy4EJRD7B!zHtU=0x@iEhCqwYx2O=xNg(6dpyLQJh*aFV=uNo?RHm=uQ$8qcR z_|cuMsw!j6CS$5PIr*go&vn7y66Y=Y;^N-vNepe(JhkNnKXjZ%qt$9O9Oq}3yS9OC zTl&Ov0~n%%_nII1^u*Hjk~*D(Yz}5gw0se)Rttfa-F1mi_2#K3SJhK<-Yg7Fv#h6D zx!dubl8U)4gMZXwp=pGqdL7ak>m>Cwn`x(BuSZpk?==)H#P?| zx%5S^+YIF!#qs14RF_CQs&@3;BeWA8LcM)Xg`~*78h_5fa*X9lK7oUBb?IfX@RP$uBp>3;*`D>PFeD^ z>#x7QQ7lls2ViOSz32qGZj6gDnRr;9rP)V5CSAwss^w`e;TTUXN;(9aCt$xhitF{d zA4opbx*0Z&S+4PGS4~QVDS=Y6Um&I19nR%)O;`Q>CuD!~x30hbdh-qsOFx0ZcmM-! z6q+i*<591dhf==5DFvpPLqpdfxLsAPV>F&+=92Lh!eQP#&XxiOYJ&Ix3?+ zdKf*95J)xUNho!MbmR6mQY{j-R$M>*<0+6y_u}wws!#A)1LFbo;?yl?!!RUFrxWvU zwX8QPl!72H-1C}Aw>y0c=a$uBjM5u8x2zi&qx62xE$jaBV_~K_-E>`!S8Y%j390^J z5-#L<7Sd1yz##2*Tc?D*JF3t58;K|~&*k&+;o0V7P$49~#j-f>P|Da1mc{uElrna| zWpRFg`E8G%@}W92)4myusr4J-x2fJ{lqzCxPm_i+N_{)@(_{4mMq0Jn1@bby8 zNiPU^79b6_k}#_MMhY1vl%-P!-1g@x4^54*pE?EwUW_}W|8#tmOmEC28xR}t0~oC& z6MBgSj5Hu3EFZ0|pa68pCrUKBX9y&fY^*G{Ndg!U~g~l|U zj%L;OIO>D5caF)nt(z_d_i)t@&cn7=+=`*$&8?_0_8zQa`#k2Na}{;lhDDp4Qbkde zeYwoc#DppkMc0`suxS6RCFU()m~3{V)&l4*v=%W`YfA$2V|9QL^RAS*(d2^8R6!tw z&sTIeCvOC}v04rtXzu9_pn|D$b&jnrEEE!L;CKMTaj_hZUqr@^k$7{y-m8lDO6Q){ zDQmUaOUcQX@FS_#(zTyA&yhLnn3$thY&(K2iridE;Mxv#sQ|M9dTtpF?M;Y3SPNG}$v+Vc+0Ux@4X>dM6HA=KTYn>#OC;^miJ(@-- zOyY8A33kDSsp|?k+`&@vh1KQhv9v##=jA+)Mg;xoAUE1`TjXJV3FE9c8Yyf_OzDl` z`zrk{Gk?Oi%MWN!6`gmjm3+88J$#n_jd_X6A?rTI{-w0hfXz?3ZtarZvi_5?C1&=c zqv&#lm7a-z00hbFDL8#rDR%0r6vt@_7Z5zmeINRvb#A$-{5p2L>nny~7!T~+xpOBx zWlKtsr6Hj!de4m{k07&n^xNZq@%{YtX`J@Ik&Pi73Hqpq7tmhxDt}C=;`639m6Hx930JEnylX-z%Y4@#w10Q@}6w-?m-YQ zi;|@28k1LSr|G=iZU?3s+JJh!o_O|#u-4{$D=q9&yKVek2cDYVJs&mffvz!GlqBt4 zm+km)YZT)t4g1@v*1}ZGBL+iG>5vm8_5m=7=wP;~ZG|h{7w@#?MZw;;-;>sw+(h=j z-eTKp%J$#;O8H)!e-RJh0#X#I`jMj@)0ZSkv1_FMvs>?3h+;1tcSNepfe=Pm!SRr4f$=IDo0?n$Zwv*Aa3` zYw%{=aBXdEZ7l!@93g8QVU$H^ z?CE#_!|XI+AR(&?3Eil9=iQ$_A}Pxd*b!Lpg@cgmBxorWOGx~?%XuKc*s4@0BTQFN*RRk?C9O);hX zJXxlXRo?~OLH(frq;o!W+(nlwu;%5MnhrQP*0dd`ar3Qv?8Fix3Fm_l4Vud^H(bwU znz^}U<|FHF9p}UO{JX@FyZQhP8NizN2+zG^SPsLW9F3fnA7|ioy)?4d(eJ+RzWWRS z<32rm8Zf|$_0#{*>nOAn?MG+PTVh$=Jq1-rElvuumk@@g(xnXM)3Etp=0GwMCs`6m z8+kYhfn{#*A6u=KB(*q}B+MV}@(s=-?m7lM^6}coZ-KAgamO8nI|}1SQC2)bQ3P)X zAv@lkdv=Pg%x?hvN+#GXuZDkZF)hGwLH@y@G^W4Y3Mk*4O6tdR86W@HCP0pN5OFOSu%d~ zh9pW@K2WKuWl1b3H=^$p$AqMyw)rXKBCpf;QDvHwdZp>s+_kwN;%H`?sif$J}xjY@|4fx<>PH?{wf}p9uP^G(BRWV5AS`SArz~F4$?OqWk zmB&`(ER4Q$d zOMh3Aphtb*HBtUc$J< zo$2ZBmFAn6aY{6BrTtQ6TVm+2dUbmQeZ3UjvzaZ1MJ%-96fAYmm%3RnB}`$}&}UZ! z(KO5*x5Q1Xo?i2@^fD)|b!TB-mchWd?7EWN@I9cEn^RY$AoBw-YBc7LA0vfKVK1=a zRooO45G=b~C#B+K$Ul~`Xw6MN=O=G3d=uTJnTQb)_}-mLm(nGT9P!-bj^^d?`JKtf zy`05Ks-sxfm}O$&y4kQ`F^xq2HLEeJP{$asX)z5T6j9vkAchT#X&SQ%A@ZP5Hf@UH z&|kx`-+OnWHl$AZ9wS*2EwweH?V~B$R)XC3)|#wdy^Bz)ozt|-TMuK6vgesU-(ia3 z4PVyi;VU(&kQ+38Ki+7D`bD3*z3@#Gqf>ht*7u3w_{c-(Apr+j7)+7iSE_v%1xE{jPM8YTd5n>`rJU1 zeRK5`4z%1hKLNypF=ax@+o%>{_{x4Lrf=Y?aR~~X`=|$gU(s4rDkZ*a_h6xrYb3oI zGLHDAT5v*k!A41bi(*FU7Rk%Jj&y9aHS8r${ zTwtO=$0J3dU_gGkplunTD9V;9jDOP-1k0Ey76FRI83W<%@%Gn2fbXFP(fbi{&c4mQ zM0`az^w5^NX*-ZfJ8{*~%0V(Vrn-voLLSPkX!J_T9SG7fWhas(jqqCA2R1m>%7WIb znm`dV-Ff4CkiCNKO(_N^zU2RYsG642om*reXqpSqP()34EZ4JzX-5G8W5=6TxnYPR z#yZnPQId5*1OUu!n?q-Akx8m*6^W#(uH|_)o_47qzzKk9k75C^?N3>hC|JNa(x7iC zOa?&&Q6{?1m?#J$P}}Q5wNTIj+!=sMA<&pYBw)HMiQJ%6!lEQ$08x^4ooOOqkYpKC z+gYv@ecfwSN=2?Kimd5Gmh}GzOqV55#k-saBEu4sc}sQjbK zwhag7=W#fM#vS`Yt^0T_kX%m%(G8?VB*3A3F}Lk&B$>#QP#e)3+SLk(ZD)`M&6$1l zF7!*vwA}5}HL3DkGM+Jz(8KK-Arwln3sY^3C{`N)_2U7ONUTd>lT+$gs!tVHR!tKJ zh6(lMhU)3g>>pUJ$2s6|x#7Ctdy`sXog%$9jwt1}s9f_}HBpo#1q>sI z43AeTO);)iG%r7=9a%S=jG1pT;M@~K&Q4XTx-a3@K8;rKLiC77Igz3hl)3k$819~^ z6of@l6IdCHp1}JoX%a?*m~c1I1c?$5VgN=c!3`l0gud; zd7Mbl-F{&ZQCy_llxz;8JdBI8NMb^w3bDwjh>hk!)*0?M$Zei)bJz%cXeHH`pan)R%=0|YAE*d+ZS#YMnKWBX z1M+A6fMV3*u{*=RU7+K2($q_$RI5Jl09Z&z!DLe0tW9Ifet?69eD*%)GaToe=5VWL zJlG*WXly<@D2L1|cOP{WQ2x&vU_2dB=AA@g%<-B1)z;V znAr>bAdZ8W6ob-V&XWIfo2&S@8DDV?QZ3~;L!F_~k2-%K5a!qgnM7rkWGvxV6Zizs zp`AM?8;!}GI}dIBdRdI)SXE7~>qI1yWJZD@X^z7rLDC5mWFn{{u_@JbPiI9@*z5Z~ z5d~JIWR?MDv1gRPFa=r;YQR?&MG-ld6+!2+8-^ics`}#2a;P_U?cTqC_pU}Awtw}1 zN!N8z6eU^GWz#ei3k!q;a9IMZ8X_q%8Zd)vhDA(_e?JHUg;Ee4nW-WXjq#reyBzFo zg+hVLf?nXV$a`TJsw!jeHZI*ixfHFU8_|OU-H!Ym8NX1Bj7gHn9#}775}wXWx*4Qb zKm2Z(NDTKa+6C zF+&hO?YpPhdE!IUXhaHOn7E|#nGcj&&jQe zq5hO+i1Bsosmt%Z=P#jLo)$GlQ4~$|*U91=oEf1RbdY}(rE_YuSclxe5A>UXPM48tviWASP>r7?4D!LCuY6G0i$xpLLbjiw2N=jZ?LsHeYY}ql^*WFx1Mo3mCkly{ zhKuV)30CJsC+TR+n}}&NMZAs&FJl*<$>q2eDHW3N+TQTX<@>ZTYKTaq?EVY&?dx|W(Mz} z0jG2nB{XQlEcf41FL~+&iEJyt@BO~TDb1^EIbKGNvbIW3d3Ar&kAJUK~ z3e2)NU$H zS-q9o%-k0WgISazc)@}`4GNH!Ib*DIM2M~-!SS-1f<8Y`NJ6wxHcUWG!Vtm5Ond}C zYDp>aOHscO?)=~X{a*}OC8rM5O8B5Bdt)_`x;TKM>!O5u}wl%zl$Lsgf?GrmOr@k(LP*4!?&`Y5P0z;FEn( z$pbXRxHpYqX)Aad1yY9!-G(GCrPHni&(9y|^)#*FI9!jDGMH_YUyl>2y2jX)sxnsD z%^14)cyD4E^18e{(YejP2<7s$Oo}?yxe}2bQyVWfds2jnoye7D8Cz4;DaKTFVwbAw zvN(D0Z-mFu`@Z(*@ZG|WY)Yonfc|WBvyABaOUZ+BS;fA9@$!FMcYGns6=x&f1fxIJ zJ+&f#efTN=SZ-{|NJhFf>9(xO@iXj`oH^<00@8b-0*wtCo++OpXWF`~X6M zpC*VkVP}Tp6^Mi61P^8lBc#NEC~DYjM9Hl}8l`~982Bn(rKTrTU03^{hT(MUUG7gq z?dSRd#2Xv+Hb(Ota%cqdO_QBDN$JdeWx0Ic3}j-D{i9XLhOP<-Nnv}u6$UUuSEF0d zedw*|JVHT6vSj+5)k&7KBqDJX?I0g{zPG1LyK2 z=RTs64_^0vX{Ioi_4{XjqBHlIB|p8lPzqU6X9k-q?v>t%Tm3H=@^|$I$cq zAcqQS%^zI4DEZbCSO_aR9qvPBF$gq=)b3&u>O;$-raf#KfC)ArR0=J#+zk+d&Ruiq zWKJ|HkW9&hy3QGm^un0mw}26vM?Uz4MdN3Cy&k2#8c;6Xms#ceO1TmNYNFnRbcxoc zf>1&j55q9B4Pf-Hm)kgYf6Vyzd%a5sy%G=VjK{bjX zn4&0(rT|4l6$sIF#sp$>t$?AZY5FHaz9wNwH$Zc@Jpb77&%xCIxGrJoYd*&zA2!~E zKIl0b^kKJni5nypJ4!W`E@fT+lmu_A-KI{cvZO22;mjl60%^%iNwVyv;F5aDa$T!Z z{T$1(WSTKC*T_kdM|SXSC+jo-g6fO4b4*ildhQ2~rn#;LhAv^OYIU^B(|M<#RzLfg zj<40U4BQ1F#1Pv4IzA+OtM_X*Ug}Qt0D3F>1@sJh9+v_AYeFrtdVqmQB3$Ij4#zHr zOW(+)=k?YM>PB*}W-fl`KBAodD4l{IHV0%g&13G}*^z5Y4fWOznjafja)0J7kSPY> zLNx9L3@DBTKWr&0KT2h4v*2PtEqjZBh+r9OEq`X`AJWCG@ewZ%ZgYHDAS+Cb; zjFx^vCiA}4qY>^MTvW3rs&)F1H1aFs5IqFBXz=SGDDc5_+PQ->xaXR9RDt*+#ozfv zI0IsBj}&@XI8;}4T}7)Xs;k>0e2$l*W3OT2FQ6Z{VOfs^Bow2<4(-mZ2KSOCr63N- zQBk)t34lg6aDl^r6eKJY6aUo~0g9=&r1Q0NQRi;0=Xg^#eH>U8=ecF&oLg3a{Xf8d z&t2Ft04v@(eoo^*D3{Bc>(EJz%armqr?iamBz0Wv?{Lj^XiIawf?ISOum6Gt&(#`k zG1m&e@%QumPWawhV1)g10p|zrAh#^egL6Lq!M)`AHS9HR>d-ow^n3O+4&ry1vKLbY1iI=(^?|{<;n7d43OaU+gOf>xRcZx*F$O@MuMx zfH75L-%D&aIAb!0rDj@VH!)v7(ug7YE+kzFnwDinDgd;q$UnjFQ#$iE(+=txh+SqBOF~1Px#dx{HKg1XfRZN)Ti!;s2qtlgJUE)tQh8 zlDc7ls*=X;)23-yZ>-nrM5O@6hAIi9(ZP7H01;ffckf;SqT^lvG@f;!ANUFO3aepw z$tPHyIcQk-(sdL`7U?Z6xeg&mj*_HkSOo^$SJ92J^y12`_}^582$O_QD@~SyPD1`G zhlz)dj3if69~Er7JhOWIs4@-HC9QA#&rZ&LnlRbymTep6)0?bM&dhOdqm6c>d(ja6 zF0#8Fb&5ENOEjs;2Z(eVqBIIbUiGjxkR#V)&ys8-mTP)RGD*V1&YNzz>4UaZ z<$@zFq!Z&UU?Fa5CrLE)~bAvzLJ$K%DC%v4)h2H4ESI;>Ok!0xt`TxSW!Ig^W%~JHDL0I5i58+R{jqbSP z{-%f|OEY_gS9odi}_3Pnw7 zbrQv10qeD@4hgl4#&Jxeljz9_$h8so{^}Wql=5rxJa=P?oSWMAL>PvCT(L6X8Zf;N z;esQ7u$#t*{_{)Y2S`o+w{Fkf*xxm$G#kmYD+!j#HNo~b@uToEDxp=hhHgfWpbsJM z9fe0}aW%){q@~dsW=hm7D$3e8B>L$L-veNjTG|p4aXAAgzhMnO@_7VxlE`sgl0n#{ zqGZD;=duZ>ZVep2u_Hh1yRxCA}Nz!bVin=7}d$wt^{B>l=W5BR1&iAyUcw8Uv z`M=TL3$!ep@7Z&uN3ksUeCXHXuS>P6?*sULwN}!!J-OpBQ>TT5^ZQ?CTz#T7_w2c& z0nY6*=&sFO%PRrzpaJMJR?UDOKYXU?Q8<-JdC6~RzU_fT!7D9%-zzgi0qGo~r%PHB zl*`jk&sdSk^*aDEB#WTr^DPZ3*4joPS(ib4>ZFlJ9U*c1zuJ)a0_s?Uir&_1pxz4& z&PofYQ~P_w9vq5U+7u!13J3l)XsWG1Xgc_L!#7xZ+Ki4fT_4~*5}7Zpcv_!(L+KeD zkIHfIY~tvmh89xVPdZv>8&Sig(V3bqmw{@LyDjqEs0T`(2TnWndVTg6)%k}3Q7$d^ zsR4c}O(@a#(}yJ5LJ<0Mgo3of@iY)(L@C}fU>a)qep+^~Craoja;~D z5a@Vb5B7RJ9}lp<4kg1c9WVJt3Ba}iJny4Cv%RwsaxnS^yfEhX7Y#-qM%bU4^6~ka zrE;!XwUTL1RBgLjwe4!o%D%Y?+bpf|w!;l{NJox&Vh$aXeT&;^TlT%W6j@)+^mg<1~~o+ zgK7Qw#e7y=4|t|kSCpS>^=rhv@$W{eb3Qfsc6Im-ldAeWPoppF8E}d6OpnC2xqb?* zqnof|9O`VvOUxh?1cW1DS0o%+qm!WMR_l^^vEpch$F7yBwN9=eY?x$Md2OnVZ5$&w z-|G$jV?gP5ARict6GQOMzHk7&>-+;+oDO+!U%7^8FFJ~@MAxGS&^yz>EYbcu_SCBf zaz?%6Y4mAR8ca`j_AVyQia#h)lr9B7O*~gF0mN$w_u$8ugowJ4wEca0fZqLeHJ9Xv zxZHFwfx9ZHQ0U7FEkgJlxRx$=il>$Vx?2*z4WS<^4=%M2 z9Ya^48_>PzDV(i*9aTzrl4Y3);9x>vVGY5*1feX1lG`_$Xar4rNgD4Bq>&=qHrx`o z0INV$zalb!hT%L<^ygg8x@jlmeS8V0ly)rygHFt~vU|dVy27%04)MdylIX^{E1JJ-#+0ZO^O6h*5z4!BmO+B>~o)r#eU z<5V<7fi#+7%l_ru`MnV+T=q!CaX?YD$?+fY zU(1^2QwP~y)OB5GuEPM~LwQkbZ7QB!NXg9*>L?+^9k>y&`zox-R$t(`K-DgE6Mo&H^Y z=wWz!ygkDE;k)Q+F7a4KGNEaupc+NnP^|AG33p0oL$z$c)6#MCX1Nh}I7(Wv6!U17 zEE^lM#j{}w!jT%*0sY@H5CO?-he`K;JjO{k{#3nQCyvKTCFVJ#VG>Iuz9%T66SfRN z0pFKo+itaNN0NLW6v1ePj-+7EmnDmsaD3mseJ111vh4Yy;ur>zT%YQaIiWR8HPTGS zDB5A8#tqr=R9|8fTG`Uex?!8#5EQuj$dMx+BhJp94q@IAW_z9>`%^Xqs%WnG5_nTm z4da?P<%8s}n4%hhJ>|=S=h^H_i;IhfW3lEQU-WyJDXvc?H@2DSGEtkiO=i}lNzbzN zmZ!>2$6#gGRP>r{>V~N}7D5P7gtq0Fo^2JKKsTV*phwX!pwFW3YtY!bet`#T;?!OU zK^9t)OCMUWvN%+Nd=%Ohp3mfcSg*NE4uVAL-pTp?78%kXS+y*j^1wVT2~uQx18y04 zZ!lov$Ope@OD84wM*l+ZR@I3!27qy9;=?&sRCR^1*}&7iP>iDK<4YE(v5-n@b$H<- z58D7!>d8Llp0n;Y8u$#`&sYTv11gN&)MH*zRa6#=Uq)X;vxE)|Q)J7Qn5o0!C{K6G zSvm{1sK4G&A6lFcPX~wO%CAQ&>zf0fV#}%`@1;L30c}oaesW7g>KV{aXu(LYAz}Gg_?s<889IW_pu5n+ z=-udi=@4@FPeREEGfI3pO%^(VLB*pj$E~OZkiB=wpZWz(X%3&FH_?!ivs6*?m-)}m zeMnvJ6TaEPv*K#R;$&W+5?(d=sEYU{cMtypDd3lyyu$74d{T-mTxb-Ex7e;6Y zI^u8Fg+GGci=IWFpQRllNfbGSQu5lX5Q6eqr{`=PpQD)o;tR6&ED%!bW?3N7v9+6Z zv-#L7G1CeS0ME~;+Crz8lV$pwDJEjys%I&EkOOF}QteXOtyY)@z#qK*#v5;3@;%Il z`Q6D!Eil4@0s!+XD|6x;EH~KUK{dB08++p<}oo^G`QQ4CtG>FK&Dw@FfRq?pSG8^;`Q`gJ?f{q zZM!gkDB7Kx4)SoGL0=vRlYn8EQ8RxM-aWb%aI*r;0E;@9kaK?!U8~wwW!5tQZ4C3T znJrZ{{>V^OD3#+|<8moaf5}Z}a-w4Px4yPFvhBYxkICNnn}({Ys&W0Npj3{LiN>(6 z-!td}`WE^f^w;RWKm;3VZK)ud{bW+QfK3kzDrABs@Cu^Zw@%`Hg*PY=DuMLVwoa5r z`_}e4!MGph?mp*vC!dQC`WN=uX6J-&s5Y8f;>v#zT{~?tmam(Tw-8gFkn74HZ(~VcxWy_N5uQqf> zI=7hs=A9)`W&ChMwk$dP1pFG+xb=xJq!Ytmq;Z%tRV>{ZpWQ%q&W07YNAR~WLJSpo z_wlRI>;50U*^nxL@iu|a&N_Aqng=yDJG7|256!Tn1rrARW90>LAIR2N%cO4hn;8NT z82i8atKRjlcQMhq=!ooCrBVqoj2c)sGGU1GN#(OS>G_IJQyzcx{nbxrlt(~4>L0}GqU{V1e--jKvi2A z7oed-=sn06LoN8o15P^%Q#M!;3Y(CzZ3|kVHK_HXnH=yE9eC~m$l9q4pJ6>yn)tGp z=v|%FNm}s*X?vsCr@nTb=$gg^fh<>+wdKk(5d@}bnxYHE)SzIRZI3Znye%deyDS{c z;enMqD$w0|O)$WKHH7tzhidNE@I{vi0#P(gyJ8Mt?g~v)P&Mva0S^jWU>I-C;6QC$N!ne+zJVfle;Nn4xXY1rDayQc4Fy$Am*@`6M+Jwh3Euidd?%dg2#jV~! z)0IjMi;`lCBXJ%Lz~gbS71wq$ZqNkz+9Bhx*Xt2kxuNMI%}`xqCl>$~PBKk5N-^8K zL6Hd&!t`EyOcsxi2mNJFwUwV?-=`nFHO`GPi8>kMlu7a$-X8P?i7~2qtvHjq9Y6dV zNemw^TNZZ5!g}E27yJga+O%yxC1NpL3$8cE|1G{C$xTY0f(G%tO3+cSe)Nnbjlc(G z!1Ne)o((P@RoPKV`YkLDd_N}IMtu@x=q7mr8Srw>fJg<3(qkM3k9_Wx+z;zO;#vqZy=3_o|ZXxc9v}mpyqh#rL{Q)_)ZzCo-22Q z!l(etK#q(@krPZQ8SGQB?!zhll%=X*Tjfc|cFXOxa8eQ}2MN0}_3(@La0nqJV;i(i zq9wEkoj})mNNbj)BR~s6N(eYDNl$Fgx|smNnQIy#_uzBpv%||Eq_O8#B?z>jQT03- zr-GdxH&iZ9U)gTAb=Owgx?@u~Y|}lt-#?hS?bB)}@*E3Brcn$aL*!;iO>Jno4C6oP z^?Ekt&WrK7?(XQNer&ZrA@V`ktgy4WlY%Zo>*!W=A9}m>d2*YH7e*spcUw+m@I&ehiE#f;G8k{P-{2{dM`JDF^m9dY~xnX+=d=QzhqU{OJ;`t3&|!Ct}jN1 zqGDYkgv;QO$)hajEjZd6xmIuSc|PBccDhFs1UV#{u4P+i=$e-OW|$LE%AF%B%3~QE z@DOXlz?-6?_g;anT3|#}FpRe_^vI|n3?sHI^_G3?dKo3?xCJ8=>Cneb20AeHL#D3X zYGS$F&+2;8ikCCeVDwBuIF3r=JIKP}I*{;0KmvQsfY8Lk!B@Cw@!e#g)P z|D>kPE>x-#1JEw=~6mcIxAjZ1RL4++^!azveJ2 z6vD7jPqB=K8(jJ8y=B)sLb3f{hOldMnbmV*MeoJh%`=S|Uuj!f7DEeOR+g#|$1XOF=KRi`i%JTt>}Cd(k?G=>{TiyG6ulO`6@37G2B9V(8L+q5E<2ol zCm)T146h8%P>bRBLdg;{mJX>pBo=PRE330&5%(lByh+Y5Cxt9QZZ>h>Mq^T;n!3PL zrm3^0xeUNd9+*uV-B94kcyPPzX#uCw*V+Tx^$Q zy1*#Vxn{F)V16ENOcV+lAzGm@QMMh&F0YB8FVAD}43_f!^}M>b;SPmqou@ z0r)i9fsU`1$-AB&5q=JRU!-`PmFZ%eJzCs~^>K*tsqct?OqO#FU_B_7NSc9BQTHdNeP_f81-Hn4i zcgu4W*lt&G=zwY@s5`rKlIT|r!n`M}GTTUj&tOvSZc{=kug=ELETDyL2< zbcpcw_Vx%KgAoeW;d*9+$bmDB8}20CxE0ldIEd3^l{2(Hg3G`*A|0i;wU*SftpBz2@SjWRzk)5>&@{ug6rU6Cwq^W#|L_n0@DH-_{xZt9IujGN zrr8q{PSLUeEUSoQM7F;VKZmcO8FV!opy$zVpnvZD$WxWFOuU)ua{~mxxSK8M$DXm= z>1LU6)v_PB90^O4;(!*pGk!$WAgvfcASVMqkb}Djf_mBW@pCq!RxEW>CurP6-UA`T z+icv;n#+q_0nOOLJ)+w%@nV&zx)*q`M?vc$_X&Qe%d#Lbrq?Gl?rYwpO-0#8**>x+ z2xZ#_#~o7M`JAqkl5rXb5QtIgF*B|~vs&5l>?IKZDO zY1Mgy=05vx;e9Yf%jhz6A9@6#tTjT5GB0sN&kSCqsJ4q8h=o-i-NY1{X(#O{Sk$t0 z0$_Q0O@XRm)DgQPNVWP(fuy>>XFF-9ii!pO(aCuS5@(z9(fmomGX$8vQoP{-Zkj5b z1NeIQ-Nx?(xWr9Uy`fAbFq1gmUwdE}u&!c3Z*OwbR9{sJlSA^S&t{`0>Y=;P`_bpo zchK+q#NhN|T?h$_cSC+nya=_-MMLrtQ_Nm19mzG89RlZ2oUH{vJD z1CWR7XtMHcvkCWMgznetv~7vXzZq9iNG(ZA+ywS4gE#PM9Js{PkYlz3sa5us5e+<; zO|%-4OlKVlkdcJ2d?~711L0MH#{9I%+Sh=RQ4vpj05bm|(@k|kabak7v6vSZ{TX{mQ?_%=o*VmMzrgbe4K~>2A`EMGvBHcob;y_8NmA4qVdEH~W#gICqNsw3`g}5l&5X;2=yyof=1#-(r13j>`b>fnxh1@30TPu?Z z$19hkMZU!Ij4{ubL`9T*ADH79x>>HaTGa_dH*9zOqQx{P<(3LSjSv#178=Enym+Af zCFhnhXw1TGi)m24#VPHlginS=BLt_pQfMjws>M@BV-}2nGYO9J`|6Wt&YbZjFN%DS z{4q>rWJaLNy zI(JVk)QjfLJ_}`xP%U-JQ@tsR+25zOb*_YNM4w#w3EETN#Q(onNEvq+S8B=Z4UQ|I81ed9+5R^9XJnom8|0cFoH|RpacB*Gv3B z>b623wNNqag!%p>v>UX)^rbIprm5iy;HBi)>?AdJfPeuq-G>z~WC zt0?lCBopPAwbnREpAYYK9n=qOKULPn<}>&JIy#UVT@TRl{MvbWF&!S+%h9X8rX1L$ z(Un`S;vswjA=)lixkzJF$Mg1fx%xvGF-3p=(!?(jnVgWjT%|!#biL30cDb_@JgCfD ztje;Li1p02VZ!BVDo%8<-Hwo=zH8H{O?|@UdP}PgxLgft8`viYk`Uhh7L4H~q@yyL zMj5&Tt=t9^uo88QU+WIpF_(?5EhImWG@Uh?{w|G@4t!(p-o4uH zU1xUB&al0E_wHpgv%Ami+O3VnBmF<7!~1-HM}6zeuH9N-ouBz=+U{LvcJuI;NxX&m zE*{%n3c(01q7`%+y`Byp$qmP}AEc=lyl@!0+)2D~_*bgsxD_QN4&p3H6HidFI2dfv z{rhg--|dDWK(Wx;FdidxYEV6mSML9dXL$1D$#5Z3rZ~V>f6pEaVc6~NUuhMJ@CIV2 zJ^0lm{b#{9j~qF&@)+z?n82Js@AZl5Vr%F+^csYkeqAzTVO>1EH8EF6)&m1svyE;5 zGc+khT|9z+f3qdfLgtvCe+=+Ksa7qNO5Vgo(NQ$7=xLf}n%Wf+<~$H&%1SJ{`%REd z6(_aPN+}=T;`ssgs`;hcT~?_*{-p&A3qd)G%AP3dnrkb}(M(g*w95-~CD);hNx11c zAl!LmdHf@|B38GD(K|QZVNy`9-<io@_FMQQ(MVEltZ%#B_% zsoSX=pHNY(mwlS?w?*-tZj;JzRk7V`%Zf9zaRA>$tLSt;h1Iu*dMUul(LrkP>0vKP zl0&-wJGd>95Ob^x`8eex2cNqB!TC9iUqsIFV9l5i%!}pm^LQh=`)iK@t1FG8#tsz9 ziZ4)wZC$z!2mkc+pp?zq^T99eI!#=zQc7zSpz{UR1`PmuNk4|mWb}IU+WZed^38bi z(Qylg zy%LU|s-7fKVg*N}a|=VS*9N6LfAYyEJ#Wh-iZ4r7rg^zyqc^ z;-0&vo#}7R!c7PX^1$`)p%}f&53KVnOMbBQB%Zax)SLP5gl-%QF3#A~O-Jv3TaY@= z1xr?ZQ^3BpzB1P)FaVgoB3l=lF3%p(*UdyOw|0fEYubSO9vlJeXX`5w02~3&=Y#P@ zNvro7`Xl;ID7xPQj`{ja_!jtHE(zwYM^B?4<=rI37?$ZqqL#_*=#R%qEB7AGc|PO^ ze(;rOhezD^g7fzC(2Bjgt_xu&A3kjv%dwVqo-aC1Xd9l^%A!ywKFN;La~zLqo%X?& zESjeGKV7}T@?k4l&HHDYlLd+SW~*@lUsZE{k!jk_=Ip0^u%Z5}>PFomw{14vw8t@Y zJsKb+xj{$nh&Xqwvj_8JLMEQ{bI0sgPQie}_?N!h|BQd7;kr=8o0cn27TO$ekf*c% zUG$?`WujTMn}bW%Dy=eW*@tdG8wfQOsY&u!#c^nt2ihP!3POhqTY?d&DNVXrx=czW z8mD7@%M3w`@eCk$-DvzDAIx)P)vEUaW&%gdka zOlfu9Ec#^O(n3_P-qvp_vEsnarXjX2*)!a77hZ1xjrssimSb<5cBeKrkwAY4Z`GVq{_9UZ`6P^A=9GrM zLd-4C>r@Yv93;1I(ij*p9zj0jlukYHzysrtQp!i*dVFM>=h>H@nrhnY6h*5YIYKw1 zH>0n~>t>cHtuPX-(*7K`w3N1##&HLD9&vsqdtS2S(dEjmY8W#W9sq}) zYrNcU)MtwU+SPq!Sq~@IS9f7(Hut+eMEcm)82ut0vus&VEH*t$(==I@M6DX_p7~!L zFrKJ6T>T2IC;(dDar!B#w;-##4k$81zY8$DvU2)Rr(??$-DQd((!j4ai$zdmDG@Zg zahP&c^9=ytx@7%|E{fu&sjg|-+W0FZAo$r7A583{cJ6q*61K4C%Ofz{+qlqsQYs^5 zLS|?$)^1llVT8j3kby)` zag8*oFc380aW!9ePA|Mp-G|OW@0S4SE>!w3+3XHn7_zXvCwC?J^RW+C3x5Yw->NN2 z-J0t?%c$uPSC7u)PFZ*kJ%v7kK7*>+$4`PV7zYg}fv<{yEu2+JTNsF9A)9VexlAS9 zj94$Q8W7A0$wOH!jt#lN+jx+g*pSETdPzWQZjQyR<@6dXS#HH_jr+H+1)O!e&)43i z0bc=x^G;v#Vs;4o8(R@&O<(Hu28#&BoDi_KOWia-c;P}^+_Z5rXqRNZ4u?st28mhN zRI4RMqjG)g1`|W^t``E-M1mLIXEEBqNPg{~!)(p5Slf{5xKG-pR;kVHVUV#G@K0&DB zjBj@oN+wQm_jZeM_jXgozRQ_)yJIlxb~wMexmmHzI1wdZoG`qu1W?K>&H*^LGO#SR z#$8igNMm#-m&xBqv0ghd#kDTK|oWhuu4B3$Btc}0Sc(v`_GKqWl%~~yK^_`_6BT%Drdn}b^2qOKNvrUYbgEdO zWA{xv%v%_Iul~~!;9%Z59>Jh)5y~tIvY_1W1N~gQg{`{pL4PapKI8)4a>J!BCaR^> z?_-+PLf&oS0en2iNnQ5mr-|G)}x6-uRPeR=sv#zXF)T8rbd%DGzTntH!z z$Mf5hdbJyyc5${^C5PwdFz$A*m|tDZR_dAt_Ziw)@dk>Gy0rcC?LYL#gxI#?*P@4P z?+AuB-BQ$#T6UL$);Xo96=dp`P4~pPH>#(V`-)mCj)IH|P^cg?QIaKr*7^~|4YDMP zjax(B0RHEudA!r*+{kBSoh#G6tn2iWW;({H*(uF(`0}x;YP!7Li*?tgMXlin0QLIH z%0V-=ENij4jxlc6t*;kM6ReXh_<#Xm7yt$gvF~F%zpy6Vq+?*&l8!+gUvv!3e6^K1 zT(b_%I0my09k8kH&Ve5^rVg&G)a!75YHDh#g)yFvF_>ndVBXYTBN9Jms8jI->gI*R z@z$7^hfdOa=o;AkpMfF7kBZ)nzo~O5V$L1bS6A_`S{COuhu!zo7OioRb6eh01Cxe z;~cQRaXTq-3;v(Tm{>W^h%8O*qgY@kB~Yodx+>FYaGm>ITI@GhnjUBO+^kxP zpZBX>%MGG{%WE?|4 z!XK&lg&hYrN15ay{x;*RpD|G#t;Xr(jNpLvaglG84{l z3$~Wv`e86>C=JF(;M1@=9(Z#$qfOWmr8%%JMujwX5S@%mKYPC(cEZFxojnqT^hyP) zz0&MxAase;I=i3=Z$UncDa(l})}58E9L+p#PBjDk0kwBR81y5yDjq%HN>`5d!R^BX z*>kz3ui*iFAC=J#bQiiGJ&Hbz5QuOnKi|%BmA_(@K+w4n! z@{^y)zzzR?*)=`SRJ2PtDiG{Z`0M6dGbcd#Ju@e&O5ih0jxPkkp63>C0PJA8Z*VC4 zhT;5P*|y=>Z*zYiAn*zC__}%6_rboS(1Wde&>3_V-Gd&8B9$~oC^a8wjZwo~TiB4S zps6mv{z?FISUo4F{jTp%%z2rwj)#q=WEP*Zy+~C?`+GCNbML&Er?Gi>l*4 zd>`taRfZeC^u}ZBjUV`!>rK8V5He_R%_)+DX6OLA65WhmgWiNbh(3-!i@t(J=r@sw z>!dLt;&u-oz{3^D1(u)%GwY19`i#|6gL_=D}X zb(ta94>vY8e2o1cM!90T?c+=LQ07_Xpy|c$L0jSAyE4%#*M9W2QH98j9xpUIJB6|Q z-TmD8Cvh(`v-ujx=aY3PXI}e24Qmv5jp%1*--VFWjqX2)m3+c%RtLvxUiWKa(~?(? z!{nA0p-1E%Qie?j4*q0dPB-&UQB$|V5bZ+vJ< zQ-T&VZKF*Ue+m0Q2>5u(S7_UC4Av?r+VqDSz7J3;N0ZgJ?UQFTZkuhnKq=>x7UZ^R z?=R2s@gXl7z)-I!ZimM>)(4y~~S!PM53F>iy*~3<>~_ zTN@^dz$>!ONhn}#{=9!a<~1yYimuBQE-1;c;few;l{ha&%v7gB@MI}MfYuO)iVoKp zpi&T+yhwYC6b;l5=UVqR6|?=%Z;W2M-EMP5-#tgfUBRtI0N-!c0$&Pdh&r>AE0Uhe zax)GJWL8mTNg-&pWI5Mm!gtQ7WTqgMM9D??)o>{Bs1OQ5iHq{=QZ0I>OX0LASis)taAgwSv1TRh;oJe^AX&`d^(kpRSB$)S6Z>* zLdOQaHSQ`G^mTlBvRl!V$*;cxYs%AkdzgDbTsw z4-J85hP$rO!{;%+xNFz0-RF%Cb}XaHbg1SYDY zP54!|JHkwV*LHt#-Jdvn_G~`=(3}Zij=yKw7Jy}2urp3~{bW4qdd`!&1wF^W?8yQO z2CLvkh#GJsZqFm0Zy76aaQq@>k@3A5ZzY;W+HYd6%l?3ZVHP0t2QYj*1j{N}#vd?t z>W9y3!L!^fm_`o9>igi^=*$W~gwSA5iQRYxaSlnaK9wpfSd(!=5<}sdWIAHBlQdBa z!}87NBaR^>S(*e%giSgzQ8#oV3&p#M;`<7JEB1YyAq9i6CA@@B?7ytMuXL<44VRY$ zjp;_+G?kh0HyC3Z?CtQD&@>fMWK6#<)c#T&NtXD{74vvp|8FDw(tPXBMsRoL6@UfN!DD@L+H)uQz(-KBnlH`CZ-Eqx5Ht_BP?=^ zgZ|Zuf6uyyn;V0R1zyMNc9!EN4|YcIgHFPin(B6z6J^-aiqEU5 z1q`*x-t|{38^T&UY?d$8056oAVY?QBZB-_NIpqM97 z`S#E>O*7ou@foXFw60p3*|!{fr?Ot=rE()Ai6PFPc%Bz8@0)SLlbC6gOT2u$L0Eg7 zi(GZpRaUWR{T{h?)c8`-y2>ifT;DX)D3|!`dwI`n9M;;lX>KW^V{<`H{bT__8i3nX(sO?RqKIKr3#`*^|2Kk*H@T~@9u2^Q?;-d2Q_Ed! zV!4Y?`e)(J1kMqyWyCMx{W1Grz~ktB=vR=X_>c@?SaHb)NrQ3%(;XF(Afba~b}L>^ z+Jf;-S<+6IGE&*OH;8ElQOlw{WD5x?-`oOUeC0b`z0Li9*0|WWjgQfK$pgIZ2jb_2GAja~~9NSC$1)l0hkH zBINbb$#q>OnZH_ky+*rx15@EC;d=$tX3ciEXf<|4G&ghUvdb=8Wq~(eM(E_cD8^Cp zY|8csFTuCa9&{X?K~H-^z#N8^6XGC9@)E|&Xjt8pBZ0+a4dTgXo;2w0^$L>p9>Mc? z)Ka-U%LvxgiX-?t#VYHr3Kf~kb(sj%$sr;eS{Yw;Xbgt~bRDl(evEBCqhv9SEwqg3 zsuh67Wvi{iY#rWKb8Gnu){!Dm4?6;+Dq%_ds46AIXxU zGcYQPBdl>@?NM&Q)CIacDem93buH`vl%dBf-j9ibOf+2^Um9Q1H7!Y9XF=UC&HgL6 zfIAE5vj$+LlYPYhx?Jubdnse;x*Yu4a5yBIrZZ8HKk$KotIng5p`v``J-f+z%uPMR ziEk$fqOG>O%5>Pd)Vjv}5z>%{uEb_sBmONkI>1*RD(KS+mbr60O zm$1_;^f+yD&OlXpc`*fxOSPLkUDI^$rsOO>nZ=i3@YA3E6t!LO(_(gHukYsati(ad z;XzU&w^{CwJ^vXf!{z&(Ka8Y@OH#_X5g}pw|F(ZEj^$WGr=#3;`WXuRk=+zvvM6F? zb6(7X<>l)R8}rx7xBy zRok|QfE9^gNyYo!S~z(;s@A+zz#^#kgXjAmY`LMLTxI;&sZ*y+j5WjlF}%8JS*AI0SdvuL($k`@X?pR4wf3vuoT~_Z)E84?ZF6fzTMbp+ zgGCinuk^w#RbQ4MIXFQKTU8DOVEQVCn;qBqZ`XNWFNLZgEfrU$B$=?|l{%LhIK}Dl z&uUxnX9ay6@Z&|^%MnpxriNp%*_Iwn!AB>y?bHV-P6`Acq z#v`29m+^zBpDheEd+*h8b7avseKMh9KpAlmUL8?Na&w-*W)q@HxEyMfoSQFb0#;$`?l)^T?uPomd_k2lP4_&kQ9WTJ-8kpU(rGMAdJ`sOQ zXtQtkL9Gh|wm8bn68C2ztd199iu#uVnEG8)2@8AgfHA8lwCA6i_q}z@wZUCddRslKu>`YD;d+OkDg$BQ{?;#Cci#BOR zElA&|p$38e2tE^65YXjRjFMriPSWIgOjw@aown@@k(?)1TMZI@uZ~$PR<&xeXm-+y z`l)HOuqY|t|MhcO?5XhPf((t)znLSla^K3F@GoNX z*t5G8_^G~GZQZN^^XhIOoSuxzPYHk>#&qc>EEe<>FIwQPRtu-X+z74q_skO9K1MsY zUxGh}5ju*l$t@6;sgT?}tTQ9Vh=C|Nl9wS`l9d^11LO?KVHA>b^Agvo@3^MG=fccs zZ1v%KBH(DTVKMDzz7{dr){pd^$ArXN7{42@MH(ua&NM8L>!H_*^ZTN6yl{9& z-F1?pH3l22t#;liRRCr0cTf917MxmO!=xZ2TWhIW4GPSeikHfBZ-f6#!vaw>oxL|r z5W&TF+RzK4Xj(cEy7Y*Cv?GfzDy^LPWQJKS6 z){ehl=H00J=g_R>B$hWUvLqI}M80ct!;$$JD5T{1`l>uxoVwR66iEQ9uOzCrs1sV$ zqYk&Wwx);|8GNS5Ic%dYFx)Znhu8Z3)OoIH7OtVI(Ie=c@%~sn(o8%ex%&%@Jk z!4(ID1?yw_IKkCWXE;Ix8RW@CCWHe-%akrRar|wS3N?z&lpKoz_|&k!(45vxQ)w>_ zEt$xi@`Pgp|DtvQj1}j^uZ#hpE3)3^MAqAk#uNX)cAImNip7!Jd#?AmeRXwphGD_z zryX|5O6Gv=Ox()tsKV52Vfd1)b5f9XT`3?5v)r%5@kj7^d*Rpn!B4pU9bb6< z`RAYOQp4niC@Lqc^0)Mxt~7!#h+crfs2QN&+%Ti^xhsmIY-r4~n0Dsl#C!hv=NGOu zM3GX%v<7Gg?&qxQwUcqjpOBHm5P+}VdDfhh$Wct$KkE>CA2cu+9|*Ahk&k=?m&i->SKV&+bH$0J zf`6kXE1YvpUcpQh$fSUeQ&BVw!=R^$KPjpu^f>pwEXf7Jy$&DpME&;}IM|^m-@l*6 zzj*Dn*WQcq&zbT`s%x^MD7+6u(^)P`k8#tWR1}S6O8LDddAMMX{}0Q`1NVpiHThnx zXPFS#O!b?5nA)|c6cNj1U8~H!^H>1~} zM`o=l#-oWy=&oCCYGrj@;;1F`38btdB)UnCFLrhI?9{i`LAYpH zocF5Z_TB=^f{VT0?T*v3W~S{i(l-p?%p4*U#_{BYe15%5S5j=J$y$%wiO!CV?pA}3W~}+S+U~I`DwaY3N#K!9l?2=YOT3+ z2l$Of2n{g6^p0N!)n3ekxd2%BncbK*QA#A80E#E2hQgZ>9QjqXLCEsr> zf4V;SmT4w*b|6U3qI-wmPdm$TeD2=$Lk7|NHh=m|z3Z!J)}Av{tbF;OtUiT4k6uDQ zIzPF1frgprbf_nC7<4u0P-|fD#VTtn4*G8JU48J=Z-%fjflOef^BA{CP z?Zn5fXstKddb+2MyzTBQm3GahFGC5Xhfud%g_RlvomFP>9@Il30)1rQveH5A5gj|Y zO6x_A8=JNKI*$cag_`|1x5^V@{^?WkSxZn}fFAHu6^HgdSM9W%qSbH?&q_+cZehO} z^%+H)J)8*kJ}TXD)l*PUNtfk0!x)ChMj={2tLPYd71}_Lp{LPTw2h%22nDQ;Y8u@o-Ss!WPdlhcH?UDQsv{u}T)rzn7znBmWexMNoaA{So`vQ|D&Z=g)n<*GU(yQk>RNd5m?M%N3NFs2|wpN!F z7yBZ|6d;OLAe$V?qevPDceGBF>#s#}%(}DT>g=qRm55>cMa8ssFU(t_kOJI9;hRKv zcM0YCwtD!jgI-WNS(@wOaQN|$?VT;fRk%3JvtG4RhWfSHRsYvPgVf9vB*5}lNonI2 zL2x(J#WZeJlIr76%l&VzAHD~?UlVPIe0N1Hl=G3)c7IylS@YWT-?#joVzMK@PB-Wj zU1BP?em~LW+n(2-;_x*nZFNHOFjB#|YsOh@EktvF8H zFA5s4chX(kn`G?jC4id?g@Qn2v9L@qmRb}fi7YM>Nun)Dz-0O6QWjFQVCxWNNysKs zzxD9WcDpUhZ3Sc^H9JHUgR#HCkm8t zh%l;>PR@X0l17;jZio_+keKsG*KJNBNzBX2U+xAkA%HM$=IW~{<#7MeqetaykIL81 z96fqey6&ia?NF8v){a7W_3f;CQMs5g?Y`qzJ`-|EbM|HS<?L1LVM7C=#2;g0-LNwIwP^tJq7%A*<>?1c#E0odDGnkF6S z1KLKRhDeK3SvgB!ot4M=oz|V2g3H}PDL>!q^?Hd>|VjckR4Mj#brp=L9f}LX=y(hPVn7mAM)* zP45)A@Y2kM!H-p-dQ=~Uz^^PzWd2ml%Kn^M+XE$!|%_>#g1LHiz`Tva!S>PExLpY`h zqWX(ZZe8SCmTAI2j{l>uvd9K$yc-?LvjO$%*1zjSk+rL|d(X69uUknyu_Vh{X)i$p zh5(QVhNP(<6vA+&5PCT1LD~9pT!-Pf55sXEn>QRD77C${VNh7__0~sIN+@X*Zcu(n zKaTML28FBT&bB|lttrIkpmagItd9JQn412J8~w&nzmNDWl~V#H$z5) z!C+AmMfE$XC`yZi!C)Yh>dbT)M#PAm6~5^>45w$RSP;eP;^HFbmbJKOS)A|R81xTQ zg#ZwR9u7s(ZbaG272!yH$*x$*qJ|Avz!w+qkH=NE-FE*j+KaA4uSO4|r_rapE+U2i z@n2j`5_`!y5uO6R9r2u3c8L#7kVHY0MM3a4#gbLAXAR57%r2r>shK|FkU*8`0=UAq zA3vw2SOPO(=q8XSokBC1^p<9`SOjBk)xp?#bnc#e{3mcY9cY}<*4`EO&UI?xmJ?wHFu6r>f(T5Bez^)lR2eNmTynL{A zR#jQF6JoE_bKd@q`VsWp*AB-}dRLyk_T8x6ZI|xjb;1-*fD_x@e-HZ78GJBV(4qYV zoy^pv)KA2DO-*e%d|kaeCi=&@8@&;|%V&vX$6FlWSQL>2B!JVdQ`x^@S&7mTX7^@| zyI2ZV;J&1y`mq{>8yf)vjGsDls}1b%0@hxYo~P2S*V<;V#i~ZO(dilwVPkKr0prc< zvV-67i4x^N2$lPhXagG|QDJUocr#`z%bD1RGaIeX+OYe>;T?1sok6#vhtQMgS8?iD zg>4lwQZftM13LA+2b5M^=*6T!i@hSwWpYCfM-yv?BYps@P&j;TFO`nKLSy2DlEhV< zmr`|nNfCei+~a>**3L%rrKM7#P+Iy7qn~tj)c`J05515&WDpAnxiA?m+D!vVHJ!VF zpJ3p+Uq27I!GY#AJTo^pgSRFhG)ihrqb_hT_+n)ZA0o>p3_f?g# zkAJanI2@`fW8267I2h#UQ}01JqP&}>`9RrX3` zzJ!8u4btosrLPy9|FB`uUdMbUN0sSe0Ej?$zjw2s5O%zqC}rD*IhT@rC3)92XaYXV zumMw30E@=K7`&d;B~c##wP1f8EDlDs-7D1qW+Y7%t8Ys5oN2TCsZ2f)uXN}6hmU^> z>48Ga4_#`u=lFF7kMuC4XJtZwKzqvVD;c}eN{#-bbw>%Y-#zaNRlUL~#+NSsWa=)@ zzi@;g5`LI6oWA5Vws4ygsvR}IO0gTXFBTeG!fbhzzTcjWwY7n)I)c;C1Xg2Oa(CHj$ zVxyTn7AKLnH&{|iQx*5)NxLKHeb`Oh#6xnm`e%FNlG0OxebZAD;?!Iy246fY05%MO z*b%3A5}bEk()S}UENMbFBU1}faI=WvG*#fEchwxcPm-hu58ZP4%{lQcvp_m7)imKd z0%PRZ$x?~jXuxJwVbf(K2B0gHDmnl=c)yZQ#$314BMX&rAAPSU)uq)6S}D@aH<&Id z=PK;_i#-r|BDHG=%RZd2Q;0CVqa2tcC|I3(It&{ptYy(q1!}AW5SqRPouo5VrNR!C z5W&w>HS+~R)Exy$U9yD&(C@CCnR6`~U=Z3f0H&IZnJR-oWb!FB1te!zMssW_+YGN=R?v^42 zl>$53t`T0ya6B3e27_qN`P#fx4&OyC+J*L`(?>}4Jyn9jIeI8ikd}ya@;L1d0%zeQ z34uZs)}1_l1~zQH{q1j83yN2(>}^%ok@2v|OGw;#L$Iu(<9FbpaKg5{2UgW(utGy8 zn8(B{;kYt?g!jVtP~5f(eY7}q6lhx%b&Hmw#@Lh`u$yI|JI)rvAyAd~CR}=pAOpVj zeQRFiDuocUE%>^o4HaX&#Z?B@4`iTU;gmAffRHOgUrAu6_B6*3a%g~JA(()6!J(Cd z#IFONZ?Wveb}4fZN}^*P_7mOcnP$(>O`BA_!<214>^SEcE?gGkUFFL-C}4Kp>GgWM z1(^c$Y;#T1)=b;bCm-@L_8*$mjezq3(N#7e=k}I{IvI?=|Bwvy9I_9%B!};#S#%}x zfikL>Q5-`qiJV0Bl8u7k2B zb$DuC@a06-uu2Vpjh`P-SvWx5U8X@P6fipvU)K%WtX56i(DA49ehxmC+&9!iwP`x z|EC(bZVij-r*-C9V0(o3*i1GZyj?9D*3yFrg>*gE7kA`*W`6t1lxuYz z=+9r-cDi%DPl?yBeC|2R0g01p$Ybz5R786b0`S94(7aQp>5)lVkd$GCpp z70FY-9-iZTI8nQN?V*Pr66nAzO&{T@>iY2TBf+*^Y@xZa?qCmlqvaSNVH?d@%pf9A zdR{B(BoQ&9Jc58DEiM!a>>GOPt3o&$;eVs>*pe5Fs9fWBreO@bKs_n9p2#;rOc?`fjhBKx52zfpU1O_MxN(llL@ zB*`=-Nz&k3)7CoGU(pl_{4!`yNTQ@^nkIXH;>nt(>7pb*QTh1CKhEFIFK@M4$6JpO z$76=UJclp_t=E|Uxxq`KBxy@KcP?p?B+5+FODqm$?i z>Z99G0;WPi``*;T^am9X{79aOl19>g1rACP)Ui<4nrPoy>LNbyi zaS+5ooRC=c;&rs*=qH>HHBppQhf*$uVDnAi2r%{w;R|;#lsKi1Dv6>tJhHmFy7T_~ zB}v+|M|wSHj4ed>&d<-Y#yNvfum^lYmU~3gG#jl*RR#RQj40(jThlbs8}Cn&BpFRi zOmsRESMJ}xzg4NUTCM$+OAQ&JPY;YxjP*bLpZO5Eabr4KgrtcH-e-cv?q@E95bNVD z9J;UdET&3zPN^CBKHwT1(~5iIZVR&h$cvN&(~*ye?b0Fmel#5r+GsWi2RG<2nVv_e z$y%$4-hc45QD{zVlasv_MMSdyQiJugXV31_M9JJn4%g+LWZC-Ovy9#7mnS^e?K8t* z|9JN7*}b}L$vsKuHXut9wS8xqVX(gIdJ|>;M#d0ANJM%P6t8RGu<1zK0%sDz*aHPD zM%TjxZsB)HrL!XGap4u&GAYC4nqK1d@PdCc&XB^oPT5JgmYXNr1;v}E9okaTfl9(SX5=jyy@gcYL1mTnxQu9T^?QQT= z#q}&rvpg5Ev%4l^uVWKzXTq=7eO>qKb$`OKXH6-+0MO8w>jnT{Uc=K=F4lVX)jOP9T3a54cY0s_xu@z{^`@FXJ@x^6=eGcT*Z?Q z0PUiO@Uq0?Rq*~i)o{?yNw!0Ye2Y(^_4rFBHqqy(_)a7n7B*zaMT-&xnv7^?7mlUL zR;S(3XJ2Z?ob5Vr{LkqGaLtcBP_fs1nSN%cx_V9c@y)gEvIre}df9GnK{z`*J9~P3 z>4V!huu6X!u248UGnqbmtZB{=b!EH)01r&!D(?6DcazH_@Id@9h9UTmHGcpjv}^c1`^(wQw|aqe3P&jPIi(cIjg8RS@j^x*Ci|FTJ$Tk6fc?M3j=ngkN^{Q zQ$HveCOodlM0t2gmWguRwYVaHVHVbL6@Vr^grNx$*6Qs+sMw_+%kXASD*rH zx#cjzl}hQZ%O#pCl8BpEOo>XUNRm*k5~Xf6#4FwdH^W0eF(!v}GkdfS9^i|4d^Mwa_X$B@3tD{4}iA6VM8C)(lrqweoJpELANiI8df> z^8G~5%`lFWSk>lPk998Fr0Wby4PhUHLZbiAYZ7ZZcO_+6r=vD=Jr1969pyBq6n?CD zZiU-@6>Ie?ZcA+mcE3B@;*?5uThseYog+@~{o470=N0A`3Z7S3fcRt@`{VZ10IU(# z38tFiR15qnr97+#0SnV*KBx3D-Zr4MJD+7Nasj{jy}8`73Dx(9ZQ%hthcr}29pCiz z?Gl}?B1(yPDeC%p1Fr|H!9vju)>4r$QYD#L;xx@?n{%55s^>ss5EDCJxDHEomZ^s^hv{aY57$A6kf7Nhb2 z^fPMdkW*Uq1C2fjC@z|(V?j{83=4cQiwE2M+r9c;M++kr`{^n}(muzoqgSH`&^ypC zMifN01%o;|mO(~p4Pj!IByvzUK6n};2Z5zJBR9H;e86Xe5NA$OK!{R?PH09_oJFSj z-M5sdEk7)d;(QG+tgWrNa4}_B|94^Hj5W@2Z_V=f?=MljD%~wQ8}s8N0+=mX?#VL1 z6rU_}UFYSpq3cGu>>CE);)-lpMaB=oMiGNy_=h+vT9&-hd033V*AC&(+S=OM;Z?`{ z7u4Hft=!KqqjHadtbB(I<46Gj+N`F&=^+?~U&JNHQRN;k`i23r>Nuqp^TWpCs!g=UcC9qCMJ6?z2j`A|oby}JQPuMQAY3t+r?7E#(ihUmsZlV*M zF{V#iZE-mQ@RH}!_C!;e!ev0+StZ(Jz-D;)qp)qimy=ZM;3KXX_1F!kE*6P%89)cupypfqr{ie0{J;`~ z*PRoxDp>f!hEwf0)q&;KANc)dI(jyi4HCDn(&PdZ3Z+n^Z1xb5p>SLIOJWeqiI>|~uR#D{X-XGDjgk(Nr7w@n zxa`P9AeMW*Wp|F|JKF&0NHA$UC3YL$vGaA;a%Pg1R8 zcL||25N+N8s0J)3mRhIH7sh=p=(#Yipu#RXzi`0|P%cj^*-zsQ5pUsl;1O^Ev*D-!T4nGHXTDVvc*7Fn>%+lcPbHjy_ZgS20~zbe4!UMmwMe+ zxLqXb*?{==2ws=gwN4?+jSMN5Auiu{#CUX&7&$t-ku+i$R=nxkn!W?kR@I$wQUb}2 z=PEYPw6B=1DYjKA)*K69um`5^(8KBw)6G<-z48C0RaD)~1MJV1HCraLsO}KPJ zo&QbkqXxeX`aJx8_<0!G9nEU#*(4A?VeT{9g+)1B9{mLCvD`y>G?Q##EC8P%s0EJ*tzh=(duuSJJLM8I4p z>7xD=FkHKN)6`7c3;{yZF*MUO+E6Y}4;Lr)$+8SI%R(24_f0Hf^Viqjh>&Nkko$P; z?khyT5o;;tT)ohDgmJ9OL_J2ilwli>LW)}^t|w%)kIe7)JBv!TH!J^rPN+A|x1N6b zX=ptSBXAt^_rAFE+x_D2nT`XmJpJ_3Py55T=-X%sA@DsGE!1S;@#e-(BGq_hKDmN& zo}?SVPxXG9(^$qfnzuLjkQ+LDT{YLnKT}+B(MI5d^wf!qADe%9El~O*y-&n1w3TE& zp`~>iDy0)>$tvm6d4HDdcd7XJ^R!zS!G};2`AaXII*ESLOJD%&e`zry0K|WA3eU~$ z4g7%om#n+nFXFj4g%Rsz8Wm&jiT{&962orlI%>Y@$TGjZhz-*oJZ71uP`F)}h_ji) z=PUs0t-fG8{I;hYjnM-KDASy$ZsU$E_-{oRhChWR)J7=NMnV=S(E0z?1thJ7nBL`jt2fXrTGm}-;Y5+{NWvf;VS3bII`_UM zwO)_pon7;^3|n7cUs+#YU%#}zKI1ml|89LfUteEezql}kAes$HLO7UI-+&E8FC_hG z@3Sx^!0Ni9y1se>y^2&hcPQ3Zcwgp1f#~Fv8Ei0Y=bA)n{H) zlDGttrwgiJA{l#$r2xK4={8bzgy&0l{5|4I;WfCLFn;r;JO2Utl^qbE5QWf({&<<$ zNd7pu{3KBNVCrTpgKPFAIKLF$IS;s@BrcVAyU))LX&1B#awmlnAW*ikQ+iQIYy{Bd zXHBJZpRj0sW!gXide(m^Q(?2~=2Tm8*ScxCA5Qc_~`3 zY`GRh38L{j-P6t6i33`8|3gbaxYNXSyQnf6+ zlpH&@lwixM@PwMJmph-Kx~?(+rLovvc|W#QTWK#gBHg(bU8jX8nm(2+VZ4+an~tIa zPfHwbk7D^b)<^SbKe`reSdw+d3@@`B>XCm@GCn^1hWB_ZB9N?;O>~Fh75BDahU@c3 zZ^NagQBNN-oXYLHnTwMXpY1x~@&B+_n_cV4`i(om>z_f$yZI zEi%JYEXz=1{o{Mp9q-$r4%p9m&tYQ|S#a&BqglMXBT*xmD(NMK8b0RsZO?o1LsH@s z=#eQLfKM1Ot`{64uLIIxG)y(4qG(db+i-k*fVXmN)dJ^G&)~X0P z64wQ!?oeruOz|sOpP{X1Q}Vd$=svUb+UaRdQ%{MT-X9r;L@?{s_=I25kSDn9vne;W zgCkF*?BFS$IpTJ+s&ef0>IJu0a^`P^4WB8C%c1b612VuHs#ALOr(+u;N;?a&B%U$v zIP)t{77ITXT_4TFcQnKa0xJ!{a_ONXC;7LV%Ju2o=Xyo?OJC>t2&@SUeqqcI7Z$hw5H7*9IL#}P zgWWJuCx%c*L|;|6(*A&rI?>u^yD% z13!>jZ^E>ubql<0baByob|W3}F7zlG=BT~d^b;EHhZQBs0@%@K$;2h@W1nJi;xtFu zoN8HeF=gKwX_17Rg!@ zuhN7xZIMVNQ<)qZZH_i!n7ilP#XRVe310FE5pBBNZnsD5txMYxZ>H@L&8Dd1kAZhQ z9Cep&#AT|07_^;`q@!%$hVp#%;E{$4z;%mGwpvlPdQfO-EF53F@NRHm8WW9@PQ9Pm z3MGw_fE92;O@5ARS(y9>Z`oOhQdQ3v`0T7Ls$_#~P_P0v1! z$-SQoFA(SxV7`B_-9DM5>qFCmJ${|^D;QU7UDZthQ&)8xK17}DAg=!I;?mNTYFGyI zeP&pOD%*AGU*G{eg$gJ}`_Sv_KUDOAVF&`OI&m=ae zZ0o8%o6F^Lv%0F=yDGMA+ZD@DjW)(@Lp7|O$?MwBgde)_k;dANjg1{^v#Mbkl~!wQ zt<|a+mZ4r=tVhjeR4=N!tH)QG zaXyQR8Eu7RHDjyjaM#Ghp0et;gWT8(`U$ZX5%#j`XCn+f40@K-Z7|YdnKOM>F6+ba-$2q&E$@}_ z|c@wOVqaN8pJHCClQIy*R0b{0_eHt|8JXWwT9M;wg_K-fwZwlUb@4ffVb-Q!7F=m># z6~nN2uW2&&)yE!tEbcgSA<5e=*o9Z67CaBs_n|}HaKDzeu+0$#4oo-?UI~HVDVa(I zAC!`NakhDugT!3~3YLdyWgsECk# zSquB2hYw*f!k#3)|NWvQAIol-UwxPzhG(+F9_DYkg~uK|a|1iF!i{58LJR1Xs8>rn z4xt>D{dkHmM-9E#wv3N}EmXsQ}E+Qc>PXD5m+9kX27sTQq^`^lh zEQb_3SW?DG_aog|)UZ21uUFc?zhIZ_Y!n1Rni_^wnmpCXHl94c^fg$cd9)%oAH=G9YH_aEwYz zIjW7S2~|zdeUK3!HJL~s=WI8M(zJ}@BNaJj^2|8X=T7N^FF@_(9nwS$apL1b8U#Tq zc?Sye4h9U`9EbcXH^%=9Gr*^ay11J!_s9KEJB;3y@pYAQiDf-_v&19UDMHeLwmQB+ zD#jom&d`{%wZ*a1W0Dfe5SL%Im%*PNew(-NlO!&?p{q0YP;;aq4MIKAxhiR#LQ*UW zYEl{&`a@u6V(26-TO)unh{$!)$>D$5pG}Nvkqs_%1H5ZcFu3k*^L%)fc5yE#z32n- zmUYaOR+rNzU3?nq=SGJb&C7X;c5xhR*H%AOAF_AH1qC zdoUOEQ2Uf-LkZWV_d30s)4ZREjO|Mp!4T=FhSud5_3d?4mw#nlzslXeTJDkr{59^& zj~f1Cms{r#S@bnngGHHYUbyvcwm^p&RT%!5@UW3bmMzDm&$;t{Y>%A9TPFGb{_TIg z7xMd2A-51~LQ&Ple@ypQ9ix#RNZDsP8sgEq*O921dz}=F3x+5d^;<42{Kep&s(O-2 z5`ZMplUE#)@6JfsuX=^2HSMU#^U8-6o)?eGoq6)*?R(3IAW@bNA_v)|TIQVDFgSVg z>qkLVzyIZr9)&ONU=*mQFhKd5TRIAPrbh0f*mX(G=NU=d^-+b~QtDd6O9l*U^%;!y z3{yXMw7u>P0h*%rHnJ&|Q`sDta!RH8F!SZ;c8eq3Q3ZldeDP;$MD#USy3*j#i|%8< zdGlaHQZ;hCASsHJN&?Y)mlzSrUB3|PO`#3_wcV^JZ?90gscIT%nzE%xgi<|Ne@#zy zG(``#M>g8#Q0ap~I2x_RD4H%~-0hCo>lmPBfEn{EtI7I$^Vrx$g#Bms87>rQG;YUdr|SVm}dF9vgLV}^}nfhf+;dz=IMp& zF8nbJoR@4X-+ONcs(4w%+q`j%?oBtIfbh^X$$1!?BP$WiP3Jx9bz(|SgiqLL-> z>)&AV8l|_(6Sb7mbmkvL<=gp7+v|R`;0qf_{z&&{{Y6OOfx9R4_!<4+FgZzmLannixtMEJ04Lb>bx4y z#?Dw>;FwNiqPbky!;Rh8k2-Fr(|nW5hDIqS{9#6nKK0ZO^W&WAShr31wZkKGbB|oz z>-7dft}N1Zd8A6z$@}JKVE~^-CjKa(FUojRe?E@nayfupE(d`J;AIndAJf=WHkx7@ z+hWCnzV)nnCls~ml#XE0@rCWBs`YFksncaV+Z&0Eh3uMlKJi<|2nNTM_UQ@39KMHS zipOFhI#1O^w3tNF6H{(Xl22^z5)|d8s2+7X#%cP>Vm$fe55TmIv7(HP51#9lMjAxg z_7+i~z+|3?h{|Qk@tS2DPacAExz?XFY!hB|@T2E`b#uZ&_%Lg7=S`59WW&H%xo1|W z+^&QPZajhS_^P32vG9N`QB#RkXj8Y%F$P;zk*~vv%eEXvo6bgMrZ`*7orsLhz{nW; zJ%WdFV?FCZlBZcp7v6Zi&_ZP0H9^YeMDm-0mZLfyG_TITeE)yCHuD!l=-PWt;OoZV*)k1{<>%l zLCyXZ)YhK%Y^A#R=~2V%-)_AG4XR5$@fZeZ_W5Vi?tIU}caBEi2<@a-vLE4CsYeg6 zcaHdnaB3yHm$G2=nL&+~#p&NTgP?Z5st>;Kq3_Lp^gd|c-^aO41Na!l2Hzj8El2M* zyRVk^P>vhkyG#DhP4bhj)uzjt{lTL#^j+Ujg`kGwC*`4OY;(|pJxLGU0gyhB)G2wrcpb>1L3GxuC z0fh>;$aSLewpCo$xP5i%5!%s~2~1o$U=*$jX|4c+cMyA&_$galW}v6ip}vPFZvl`g z651i!YXV3_EPvj?lUJtK3~J_VlG!~W5Lt=Y^sWR7(z9NO-0R& z`I{P!0l77|X$)u9*Vj2tJq|dwXVL2hR-Bt_b91xv0czgKRMd3`RK@)67PwkZx_6na z*hS|T3Y=aj1gD?})k;!8$omTm)GIG8t=-V&tsOHn08zAW@5}Zk zf>1OJMBg5N8wGI)54x=KP%|@KAJhNP2zA+BrVHTFg-o3^@ZVnBA7N~^X1I(MTu(PB zg;Ke_yk}2)xm*G~KYwU{Etr;wC2M(2)hvstYC+W?2x9oMqShCEM^*FF-K8K#yL)$n~&RRZ7lR;Egb^Mysjei)%TiZ2M`S!YDj4PpK# z1PydNaCx7MiMt9UvoFIpRHM3JLA0?6aDN@UTCJJT_Z2}oeINB)yy&9cd}pL2rui+A~RvDwd-*ANGuA^JT@In z=L@94FpDSNSu^2ru0CBZR}b`680x`GGH%T7lI6=5XG$=}rwdP6|(6a zY;*E_M2Uo!7}0bX#*$1&9*YH{D2#JvY0hiGpNBcK9KS)qH&0+QXI5=`<7ra=(J9OP zr}!xq(8fUD@&(%bF^th7+5=HP^8xfI`gBA9yh@4yfxB9Xk=$A66{)CU!{rhr=oGi- zdOi2IGGVQREoTPN&ZVJUoq30xG*IIpHz{sSw%DAJ0Wfc{#pth}U0M|OCs->e!C)mJ zJ+PCCxZqeK<2Qk^$wDHHe4Ji}%UsWp(O7`~O?!H-iq_CgvLLM?U&2@9$m#M3+a&QL z{|d7n)ziyKBD}}c5u=?4IeZr24k`D+d(g0MATZ>)#&mfp0Q*v-(U>kTJv8fvJO{R~ zSr09h-zSHcm}Z0lCf6W*7!&JC+G=O627ycetJCSs)o|isZS^a7TVqiBk^h^vLhVNy z7FURJD}i9cQ8xnMsKv=)CR0&8iT^dziCb~&X%Hq5O28(|7$rf#kkytQ))!=fBXLmP zYzj*xHrIY}$I{YN5iDk!Se6L@<_Rm*Rt_v%0L7`Lr5)o_z&p|bU5Sdnj69G;ew>i` zkZTO2l|;RT!ph7XiYmO42{Jwy3`FwuLpptepw|n`ze2dK_JWfoCk;Ft&fS9v^iauP zwlWlwi`-k=^|#}{>%j5RXS9bJ0~Ejng7NEwzNQU3Ox||4+21aWw_ijEAAkXBqF4Lf znM;poeW@*#k1znxuiWal?P@;-mi?u`-Xy4zXx>`sGf&KB(yR6r@< zs|I|)Q5Alc*mgdf2!ag(kL)|06m3UX0ddj8eoD@RaX2K-VOSY--F{z==_N}5=pC3w z9(01e?C|QYXc9FRaNZHBAmp1|C_dkCaL9wyuls@=a>U4xZ9AY~wo%%*X!$%)4#G~= zc!D?JCQlzDl#qm&F||de{pcDKi4VRZGGw$5_Din5`s%B}vWj;U?1EkNP}2djtr@#0 zTQIa_N$Sg1)}PpUa{l~z$Q3OM?1GIY9Za*ps~F>#bT6=fRD0Pq&XXGI?vDNBzTnYV zpL<%}`N~PMPeAEh_ME?ct5E+2f0$iTj37n35UTlu+u5z&D`*4GfLH)t+HU{T%SU>y z)^7KZ7;iO$<1=@6#Tw4I8fsaH9_@THRG$#ol*(inRN9IU$5v9@b1~7(mYv7*@`LcP!ybulfHhFE4-Q_R7LS<@SNj z{ts|ns((h;+5xTGIg6GB7qHeDuO1HN^ZA|+;HQLS6A0{8Ceo2I$=?+ehp_Cjnj9Xu z;lu)3^G$+4ajK5bK>!Usc}2eG&$m@Gufiq^n8wTFWh{M^z$`A_@Nh#WmBN(SI$>|s z#dtZse5&wKB7-+Bg1rW*NPz6!VcgoC$M`OI23?EZjDC!M6Vns$Kmqr0Vn7kb2IsI} zkqw~?D2eW|Fc%bxK{uvIsh%(i?Kn87kdOX1uS7}2h4QcprUNX8xNGlOL@Q%eq8FLR5ijQc33kIK3okR8R>KiKNSptSGW0>k<*9ufLom zL*T}wHD5(zDsB3oWn`Judci2>1eI<%+nm{ob@=_t9k8F)7 z%%I}=K^K5@1D0{1qxI(ER;L;ds-LeO)g#Zn$S>;06C#lkkplpU{wFRR8`?Q3c!hkiV@&$_vLWc{IaYs=rR>J0HVkMiYWT9^{UlXx)#m=_@bx) z$O-}A1gfxw^+Rz?q&z36JKJA|&+whnd8+sXK8_b=+RN<_0?v&WbPfXtV|I`=tvyB&#IWB=naFBa7H!llKImE(PE z)4)IRO|QSSJ%;=G<=u8+D3kKp&~FQv##B{^JYU6-8Sv9=z#!_nO3IoC0+o$yY{*mq zZ%r*TisBu!@Pzky&veS^Ow*XorPJ@>KgA>B1wGskJ&SGWw6vYJjvq3RBY0T}IG4cc z9WY~QfnkWtR{U~@d`F}B8&@EW2_R{o(w~iEP;5A~@uNo@X#F#ML2JX)!1g=)KB%q!;EI&?B4hBBA#9 zg>S|;h*KCxZ7ev&F9%N%F^Zc1UFaUQ=LQ1PDD-rvQ_3?l1t%bpMT(?STtN=f@Z ztifmK9Xu**{Jwo7@w;c<)x+laTw-pz)S;OfnLeOQ{8Y$!M-%!8muIgNW!$3AbemY z6g10A&)UhRwN%}sD4Vj`JB`2mU;f3osiglY417PIr{EL>iFiCwjz`qL4j)6y5j28K z!muhl2ZsKKgj-;^EOZCs@5DrjZ+d2}p%Z`c6K|<+Br-KE+gw{)U6^-l#`B!WExO|0 z&IQw&z!<03YRgRERLA;8!igNuGuxS8SY2B)ZOf$c*Z$MmbTFrJ0$Z-tbdE6rM!jT= zF?=0GD7OkCap^-6g8%wC}P;T^Tr$BT9R{|DC)hU-RR8C=3|#O z;M2M&ayhy5)*El!xf5{lgw8avLESh%JJ)I0#rhL8YC0cDuY_7rc&kE-IYT(=!Kwl9 ziJ|aiD=KXZi}bp(@v9Bu2y(vAbt!8xPUZEHq2pi+YPwwcT8_1t>~srxS#XH4z;ZWY zOy||{YvP9-CHzos#<0^6783rEkwc55Us+y|uf@oE%3k-m)gD71B z=0CBfy828%HL9xBJP-aCwBXj{&*0cZRUdF$^!KJBl{Bbm5@|nlP$db5lxw>z6^ke^ zax6wKjdA+Y7??JlAZw+%Q7LUvi5MDLlVKZ+tkfV14UQS;*Xdth1G+4aMx=dV$WWf% zz>y$Elup-xH6>m*j@OP?l5Q-X=1#xvb;;@j@ghr0M>nryluD#r5Nz(<8`amMp+?k- zMAz2@tI6wLceV+XByJEDSjQ&tbhP@MZZNged8H_I?;39Q1IGyI1Oxq#mfp zEXNQ{!?hT0HaB+fTT*JbPjEs?7wN_I@vTlf4wSDuPH#!f@HH`Wk;^Kh71&9NH|WIM z>t%-s;fdPMBx}&wVQ`=%ii;qwWi8%+Jt_4cBu|lO@|>~-5vxEx9CT;<>SBkL7rESx zQ@o*pbli^D_FUI!dpT*v3L{T}30r+tVS-rcCT-fg?7|XlBJRSomZEF}-+7wAbJ`Zh zZZc1vTgK%O>GW_Zu^p1%upn|fZny1kYlcYiP##0G>}y{zy?-`6zijV@n;}I#{N5`_)&E_BRkj1qu4SxO?c-JVJKyuRF;5{z^*;QL#NT zLueu+x+I=L*Y`;Pl0I=2(*sE=Kf%&sYK2Uf!(ut&RAhD(N@DH8JF|}|8BM3S5CY`$ z*!ov7g0IC2O3!#zEWQH0+WPc5syQU&a9(T2p6k|D3Q8J{(UV_1W6$@blA%KjHzvwF zEv6I*Khc{yD~Vr^20AKYB$t1t9@V3^!ZiPhk#v(b^tdl^+?Tl0nKNf3=?us9PoF+* zGXzpwnZ$ES949A_3q%T`^wP5FacRURz{e|Xw zWSkyX9JyAmq%U`@Ob6F>&8V@OG(r%~9$_O{ZA51Gx?rsh+l^$6;Pr38Y7V_u-wKM* z5}nPEI8}?uY{JL~A%N(>+i6>p*lRPdru5Kwc|=Yk;*|nf(?PgW04%xwMze|K&pTk- zr77q0`BHWX3+v_wxY^wBT?vDDg#h{*5v~-8#EH1s+$a@3=S(^7dE|4H2!-vf(U^0%(lAZNyj{9Bnl*5eJshy1q!}JCehY%_|K9!$7IXF_ zi()UytUgREz|9JuyOX!+d<_+mpB3vZO>pGK*lF^)b@WQoIYPTMm{{(8gZ| z6{_vZBhh*^Rzwnl4ORNUv9Sl1hdeVJ4hf8ataj*vu|AX(=x;p~o;*GnkDZ>F8Fwa! z!4OEJK|pFWf={Y@!%bnsQYZ8Lv(Z9K2nORMbUe9hY48~ng%!=T0O?`EFRPc3i&!r% zC#|5}r(zm=;%}Af;gaNfSSiOLNox>2eP`a`{Z{s<>#_aHV=Z*h&z25AF<*f$qNX6# zCPrP)7Y{jFkA#d>Auq-$O1&VAdcAP2aHVI4+_pfQbe>9FkA_VF5V`)GYKCHDy*r-$ zm5t%iS&ZG>TxhJje$E>KjXkK>SMOL2nDuG0&*!oEq|S6D`(?PScUZ4s+pVoDiX0;A zu06L3G-WTY*6R>C>oU&M&0fmd{waPl{7^ku4q;ElPtXr;Y?6`U9z*Maj>CC~S7%LhT;#n=QA zkg%aJ&GYr<+Ky)brT=_iy$K4&k)FcWU%gy^=)!HEZSGiW)&zbU;>CC{%t>Hk?B;_? z?l#}|N>h2Pf^*Sp6gwrc|32- z%(UpCNp{=`7Evm3fIZNdaRFaurSepOE)iu9t{MxIxZ8nX;7Ps`ebev19lGWg+QcP6 zFSWxbt2T^l+XI%qVdq6PV^6V(GJ;g`A9j)mA z2ow~>E0w%I@b9?e4zE=56y<~IufgW7Ml!Tr-)1&P4e5j43=4{y=DL6I-aGEN!*w<7 zgX!NqDqUq>>~p7!dPNg_4@&h&7gyrVWQbU{su{a9#Jkop7vJ)hw>WHrdHRE#ba1-O z&CS$S)QiHHZ7}D5JG>;e4AO061*+mN(a3Lq6TSjpkdCruokVvT9d%V(Sa*KP`RW<- z62dKZK5su01eN*u%6Y0NRFclO_wH@CTF=y$mTFkgN{^g~%z)h*kGTWqkN zsm#w;g5bO)QAMHWTdnrqz3pehu(q^R+j3pMRPu*E?qsN{vb<&I^ESel{iBMg^8RChrWBUsX<%7H6F*l(k}c9(w1ik+b1jT@&2V?Uuln-xq(Ghv_7=&?eh6h zqsaV0MZI|hf*~9)ra=Y2!d?)MwjSI?JqT>;SJYtzv~lvLU6rC5?Dn}m24K%R1Gt5=SL$1K`pzvo89!_}iF4_fs^n`Mxm37;D= z57)A%DI_4k-)o#gd(m<9rdZoy^u|M@FDic<`|%CjudTjEoY4v$`b5>nw)Mrf7m8)b0+!A+Z2oI9^e~J-YK>IwVQPhP{;_8tYg<0qt)Enj6MIOLaDMUJB}RJ+AE4gQ$1HXknCVQBl2qt zhdDys@XsKb)&v2*B5-`UvdSFC1`dmY{YE!|Ii9!kIr~7eg9*|VG7qhS#w5&hsboWu zv%NE30M++XfUv~mBDy}^l4Z&M8g+{rlQ0np00v8xt|R~kLL^T0a_MwYl0S^PSRagH zd_uPtc=UkhM&ae=S<5DCpbN4Gt`f@_B(uWZ!E0LNOkLBcL=fUz#yD4xOJl+K%0jVBnTeom%j~x7seMJyOk5Z+#$yn(!wH z&rRXEkFEoj_@!*T2{VoY7qxeS6vEv#=mg&pg6$Vk3I_lon|?=BG>CowVa&!!MyQ(& zKKl%gP&zPd8^E@W!2p6leZMyT%mEyLG-vZnCtN?KW}u(%gh5Dt2fbtiDxxvmxF1fi zHCS#?j=n2;e51TmMI%pLPTSVo#Wzi}9h-4jNs^lG zCX3O}L^>M5U^E(y6e8mpV)MosK4nX}h5siaWg+R->~s zFc_3IiSy09x4gGx#|DGaXZ{BG{Cm(O^2N}zuJ*_I&tcyGZ5p;;MEl=~Yv4ZL3qG_l zf`NZ?Lp9zg&WEp=)>&zK&U9V#IktXHIra%v{e){? zr~4N#UaXSq7eB6PAJ1Q*(P!ar~#@Aod*gwnpOX>#jV4c43MGRyvg#qBS` zC*eD#ZsgatjPKSPUBl!1{t4p*UQ2D)-bMzYZvRSZyEY($NZzeiz`K1z(dOLw7kK4<74&9c5v2ITx7 z>z^m0LS*`ovm8h@O$0c8ELoT2|2BZO^N*1KbwzQ*ej7qGy& zg$Q;en2yeLP`$}aXN-V6aLI_Y{uCl2_oM~g)Vq1JZai?1QJE^1WtUx7nT2VuU+f9%IkOV+;!>e~}aX zp@+wKcFEZ8S^wK%8w}=lB@P+eW9Y*eO`{gt3n?tE#Ju`)$snV41dp<(jWY=dC*bxT z@#!Qa@r8yNNKzR{Qd*!aNr5@q3^Co~gXdQ_8AmT%j6hN5*9cge*X9)&q9tcxL;PX4 zO(xRTSYR-#3sGk{f;nbf+Cv@*oR?iPO~pG*$Tch3A1}6;YT1;WDv~BiaST~M8!aLt zP|8lmp)ik|&5h>FjOUkUi$xF@ zN>f=y6KBJtwwM-dYBi|?Oy2s;jKT8=BC+eu^ah4mCJn1g-P#O%+E`RF;Pj~IK@Vf^ z!H5B*a~vO@J-|^ERc(#0meIql6LJ&@8dbQVTdvCOpT4hjI zJaldP@DR<&KoV7oWZEs9(<}^qL`c7-=6h1X<~4ox{1hir(-|LtF#c zD>B`Nx}MY4nYjLNHN*b;theCn=ymaFLv|MB$%qA!N1B8=G8do)%plxwb?v|fBG$7; z3KVd-By{8j=XgQX3SG{(TtO2Bo>vvE;HWBuGl?)gz0jHt;@7<|UXCw66vyIPI0LHc z6aql#`hjo>JfSHnPw%EHE8k7sh`OJ^OT;wXyVvLEwE5x`?kZr(rV{BRMJQb?7v&owA0kK z3k3*UtF6w@uiJ+cD(!Y(%hqZ4h`l~PuiA{#Y~9F)Z;*bWaS1Ja@sL>9=BbINJGbWw zguoDX7l_g+4o#efFrxhEH_62Tl5Ig|kSP*M0eGzAjsWW?I3i7&al5u%;Ld}ON48A~ zj!hn_N8#96IpLB9dbHX+o?%Qv)BHt<@NLO z#a7nM=%J79$-p&f3Pr8iPzrYKQLtf}6rOs{_*>CAc+y>|)9XV5ZW5~8UHa38Bb(qn z4sE-8G^p)y(_?Nj{@Xf68j8>=I`ZW3;~c5lE{vPncH?G z%lsa^qQ0Dklr#dUl63ykfxJI8r~CMjaxEk!RF_uuX-mfRI-aT6*cN?)z)_&Ts6H_s zj0XU8oM09zV51#|c?Kno5%ggrB1SFh)LZDI2^TYzMV83HHzT%_ugW-eT2)Rm0CrMQ zPoFYuraWhmP|ap>?wx0AGzp~S0)a}aqGjmQ4f#6JbyDX&jnEQrwq5aDP&N0M zDK2|JZ*_H50<}Ha!{T&8z#*3m!1XF8ecO_2RXD;Wd;giw=XvR*3g<5v=9B!wf%}|t z9_(r@JiaP2|b{v_Dlb(IO z-|H*0MGGYVTJLPCtV@c&k1zYKTmcin?;lnPtxIc&YB82gTqT-is2u)oavwZC^hTr6 zB8Q)~et6`!L@6jLX&GRob16bF+0P^{*LGjFo4^am>guiozuwWm%53yud>mz|NA0HW z>l~A8j!4~X7nE2GlUD0LKHX-V-Oe#_zhis?qw{TzkW(wo(xr#+Zb&RbPvI&Z+s`ik zZz-+~LM5SV@*Suh*&#{ST=LaLFqKgR!FJn`9kMF^-@Lz{U=K!+@}TSbz3r?6$x-;X zecXxnGx@9AO}|-VC_2xzU54LGyL+UpL=x-51nKt4m7j~y~(tk2SooCIXW4<`r?uaa=gO6wd84+B*8a-5!S`$Oqg-b23A zPkT@+**@rx==nyn{omVP!pQe2aURum5ID`1=o;h$m7LkB>8;k?F#@hMaVp4}GXfiN z2WUMWoG)kE*Q2@j#p`&)CQ_l`*n|`djzdVX`1Q*Dxl7EY!~D-c!v$}xrk1u7M2ObH z-$Q|HMw71Z7Y7AGJxw*LM-o>~De5NDXl~*)%=0T1-(!j@Q?pc>oh_A2swj%%I!3zt z#x+V60T#zcr8~0tONJH}>?T8@it0F2@H~#HQ00y)sW7N}obvcb&_)N*)xzn7p~7mV zWh;$;4REcXYn)cCE-qH98mH-kTquNLp&;u&n$BpP$QrhpH8pgB)5@p-BjwK>eL`fJ zow5j;`az_Yz?5)&UHnq;SooZR>Myf-jE@79YJH zIoED(kVQxPNY0aeTRo}>m`$EAi6?eKP*YQn8PZSZy4_=drnYS(XfZ2vy{pu1l8Pte z0SqL>ilkWABTM%>TXgFEl-egTLP&r(<2!jGxbo%vQS>zW2KpuXEA$_IuXg=wO%omio+-TozcF>FNeqVwJ8CLOmUhQ_SFQ30d$zoe5U z7=Tkfa$r5>)k;w=x`i>3B2{zk+?=9RrhUg%m08EqG{?@TfC@P#O--fK71#9;?yt`< zS;4Y+iAq-Xyi2u0bxJq5bi|wcz}(nh*)KE3_OZPxhLqwIL~*~$!68mPNJL11Q+JD$ z;KRIdxpCxCOohW(#8*9b=+Ghg02YMt9l~4DCE2LJptD$!xqY`3nB)QN_hiQmzJvd8 zcOB|Xg;LMbr}AUjkb~J59vp_#FMs~mk%v0y74$0!UMURy?yA$Tx5gs6RIreoKJ7wy zSW^{#5EE>gnAxQCnrpgnrjI`~ko|ZL)>#5yqgfaW))1?P44pzb*OgN#|mLk}5dP6}3uI(e(IkFPNzDHg_p z?bK?1Mh0K~R|sj_e-EF7N0E(B1&Y)kOdI})FvHG9J}>6Ca4xS5;Rf4aWT@nGcq=dR zKJ?n9XT1U;Na73$v?)j2m`6aCbSibnJztg}G*>uOb8NymNs{wB+5MNNf8JDKjuoWy zO7UdDUEm>ZtZ>Ic#>9;DU9IWnD3b3+t zPW>?Xg7{rDU`#nhBi7{xn}ett=aa)Jl)_%VJtQr%Vb9_7=sDHwyIYI^Wry;~;X+TC zU|B^1QVxmZD-)LHz5{-i{mf>1!dN+SQcuucbc2=!jx-t`lSxPODiUcX>m>5s>p$g@ zh>W53<`KJ=Bfrz<2&y@bbFZdx{YKFXEJ+GxJDr7hf7j3Fow9WMJ!@-g#I1L*Yxxw{ zEZ6JxFUhSr&Ree`QvF8R%g@d)R3eV6-2Nej=j_VdHHFpH)i>?2yK!uHt3;{tE?lGr zG=@(hHPZf0BQr;M5A@VcWDUM<8MEB+>` zL{==bLbYti0p8N(HQTZBT(>b!om*Z8Z=D-lM-dsf=EsydmlDV+oSP zXmku}R{>pyx(e7`i{AMLmr#ieRK2fgp%-2 zlko*A1>-0j;QCM5_HWr}wd4rG*5p=eLmiW_fh40Fx`$gi>XIN0O;iA_I>a{(7!gLK zW`pqbn@AKviet4OG^LODB2lW$I?mVei}1$z`FYFf)@EP{4%Qc7*>WR3g6W{heuVY# zx^>@~-BhhsMVP5|X^rC!`w-6%*oCRfnAE^@vk4J&l#3a}iukwy**W>xL;_9X<^sRq3)mDpto%|Fp72xM&8 z!A{AHtTU~EA^)vD#t6P{(}cc8=heuy%ZRBNWfy7mJQCRwTlfm1VC3N>?)qFXWl$Sb z+nm|oF9iNoRaG`}guNxxnpkFOwV*n-WL1JWt(ceW6`T=Me*p|QtCKzl*p~vnDC<34 zrd+_=AuANC!(p{pU?r<#5!I;|3i4Ft{tR+9A8<5#1CEFqvZ~|lm$v^G5984e+LswB zVO{n$Nsa)J0L=%!Gz3A;M3S&Q20#3OeQ0`mS`!5FMn*)jeW>cg`I^0&k@0@#qsj;9LFDtCYWLjzN*_ONnv9(?%~NQ9 z((--F_!9Zs;`g=;yW=gJwBxNo;_R39_`CUzc{S4VODLPPJl%3c5rDM3+@a@-lE%)K)RMUO1S{6C9Z?&!0nIbL3&RIgDQKPjb;-EDVLIigBz~P7XIB6 zHk%vE#%GH~huC@Q_3WyiZytE4!4s)$)e!xNO_uP!SfAi04isvv0!LpYpt#mMM3qb5$)vUuFDC+&9$@^3m~etwf%T zNUJA}YZ_JBNbqwc)oj?#?R8*W$TyqqcC(o;Or=z}W+R{`E2~7ouesn@Z)d!+uuv!z z3JVJ>Q;GLkZj*&o_lc0&EW6G~-c(&e0~kkBKF*^$q}?*aDc7EnOQ0bA5;*8DH~P-~ zsq_7EV=wwS)4A1cu-vP|&!Yj1_66qx=Ox#f;o%L^{)gmFe7k$>x(d+Mo2#Bj3usqX zMxb4sgoDBIbU}OtnzhjFjD+=>30I5-YN4mh94ChFGJ2f-x5 z+bzP;lnhV5)L&6mO&u!AP}QErS9}v;Ta1Y01kp6JB>GHFQ58@PM) z*pvxMwWQf;U%~aHetpurL8SEkM}$B1mmS^dI{xDXeg560#Tk}RsCp+ zrTw-JLdm!dKHI?~E2^X4u@D>{a3LKJMXpSNEC#94Ls#q*6pORamPtY+ai0A_bQl?j z1(YUUj#rL0+t5p<{r!;v5VG&5%a3-5v|8|NV;5#ef-`aGR9QZJ>+V-q5b%#n{GOElSp?` zQN%hH_xCclFve8F(A-0=sy_O*8rHG+Ubh^hw!WpV4p&r~y3%a3Ou4g6tjvbOZtS8W zU1*zM_Yh;I`Orn(!};>0gqUi5$TS&y=%k1J8LQg-y5;MasZ$8mu>EBa2-O{`7ZG%w zT?VJoTBDs#?N&vdBT6S1y9a2G)*cjki;Ih)?*nJ3fDO!Zil1{`k>|rVWm(tc-&NJ$ zqbi@dS9x6=l}BWi@HoHu3HW{(NJKLMc*7`{mv+rI@Gf1J>01=TP~Pgxgm54mOWxY8 zDnHAmN&W;1sD<|TKrCaxK{H3=`s+n2!qpQSDtoox`ObIhvdpgv+Uv-ED5ch0VXrT* zuCDU3tiMwezM}*0M3ct7_N;ys4C)J^V+~We=k?#fH(-==5YY!@PFMi$tnZ~LS57YRHH_1Vj=LqJaok#0DYh^W#p@J!-PK2oh;E8P91s9_c?vXL*K|qZ zrI~7^>k>n?7-Kb!o6JE&3vOq|7xtkUM1Lg$aL{6q0<|PWmRvgElH%tN?PN0ol zHBsPz!@v=N$jz_8KKPh*Sz+Bx+iUs$_2!u)6}azebFV#zGjTOqH%+Jf`jtye8PbDm z%4c5B*vjikQlw1Zcq6>aE}h`q^~XSZ5ij8`sGL(XGNpR{d|h83zz7|R-6tTA4}^Pk z>caHq-CeeaRv@pjo6Iq@I_f7D+Zw}R65eg6l#P$UvyCuNh&r0+NNtdh|AtL4hL546 z=vC;oyxLNoJvdZM?5aJr;z@F_A+wfOC@P2wnNAewMaxSRC6yzK1ilKSdLxJC=kPjX^r8_*~Vei5P z4|`9X;_xx%hovVjWH-bmpLk($F`b&4no1WJ$E)D0fM}-Xl$tNfPRa8yB{;x;YRD}Z26K5%91D6teXnq9; z6l=!Z&`}1aqngI)X_{U^VAIy&+zs^RqWUSwAXR!{OrrIUACvguO z$Fvo-Nyju|csmOHx0Oa^IInvJr_96eux6zHKA-El?gYI5_xENmy$@#hP=?t*amEgr zPQs_iWILreZ(;&Ti1O3=Y-*!rbR6A=-gqVEf^h(K6+W=NB`bKMK!Z;fLOy(X@8P{S z-nH4@#pp6^U4_w%9#A=U=4xamlkw1&2gd{3ThdlJTK-+b(Rhv1^=6-r6|hvS)9!^C z94@4!a!Xmf!1upWd+RT-3{Rs;bR1nk5BmXwHOZk72)or_7uH-aS!e@uObAJ|6ynQR zmIM%My|9VHCY7S@`=ZLKKRk^0=io(d#1BnFSmc_xr~jBuJ^S;^c3RPcq5mF;m718^mTm-l3^v2d?A=x~2}5PdT++KJqVeH)BlIH8#Gd z+;INIW2yK7D{~(b+r1+6LB+$zVY71#$L~4GKj=Jf%Kfg_kNM=FmPULDY=%GfyG{r% z>IEH=Hp#<_4PNG9MNX~At2G^O#5XnbdGM0dr#U~CDLko|`j|!w{=s^zro_mFPUT(B ze)n^#68XGJ%6tod6y)>GMtP5#!Zp^oWdla=G}>V&Kf$s?nut`0TW#!8lAlnlQFJZ| zze?C2(K(d%1If5?FB8ngu+3Ff5z8JYkJh{es%lYO#Z-C=-c-r8CIKSaQL$*6ZuSob z^8E0D4~eGfY7-IY+%0n+*t#yLysk--%XKgd`q}d@ex@yTx?XJ`1A6}mgn&b@k){=zv~S$%k49BIW{-GAS6mMR zo^ZvseF*6KT9F*oi7#KI+B^wNQ802L;KDpN44%K%*?ptiUM2UC9iKpBlE z^YZz)&NaLt@_) z`r!-PT(SIFUAOdfPh>O5GF0><`g=+LI-AJdC)#Y*K8uI;=0}^m=DU@0HbK5w*YA`i zN#o`f^9j!7CloAbOo0tmiQW{v%oGI#Jf9q%pO^@UreKgcSKmN+G|4%RX`oz?aG1!= zZ~;_Nz`1BLAvDx03RQq*qz~yDr6303s7GHiKn)lf@`2?()=)sWiW-qFdqy9dd*#{jtheE8>fW=kbRw;OwhM& zvIH72oME46Y{?)4%`l@Aj{a8z!1z~E+qLeWjB(ghxuH;mU_p%A=R#lTln0idUWFGk z6+t0_zZ4chA4+|O)KD7x9G`jt_2{R2v@niRAk-z^gDEAqb|13;XSkonvi(jsgYHBg znq#&J5k>k#BRh;#g(DnPux|!B@?6kO=DQ5UJXAZxo|EGbr@B_Izi3+yI+Ehel}ZxU zhR!yd9&=pHDCBEQdp}plt-T#%Eb5vaa9s!_+X^Ir8x*M_sjA+GI?Bl_uAAS_v>PZm z;xgLSUuC{a?1_m5cCKGAKWMuebBd-3VKr`)O8P-XQ7lCT(+ckOIS1t?jYwjzX_oBE zagN5ENAR5w-)+vwbVRsUIz3JgWXm^Z-45J`dyyyL0s{bz+Tz`n*b3GlLDJ8}u@0CV z9%RbN119S+&QuHj71%%wx!Rd)WM~8NO9$^JVx6vQY`cU93tHR88`TxLGZ3*>>Zgow zaruz0M{o#L3nfv#*Gm>S@$dWa&fe{t_%Ck1{r28Yyt#!~69%%BbjpvaTVcwb0K(qv zY+X_6v$MTyGw8^$p(v&(8mbb8gQ4yvVVG)ALt;&}%yrXJH7<|OV+d8pndW@jajI}{ zKA$%fMLaDkih1t{uQJ`q50;b=UP`~Xpr(<}Xw+(xFgs5mG<>@bDwP{~^2sNkl!}0g z(vyN92<5lF^{rBth>cVVFz^*$K6mb10pr3s3{X6C<_x@Z^bKc79)H2N|6?zre5B<# zpMfF|rvc-Tx)m{nX)htsMT+ssv3gQ(f{Ke}?blsWhCqw{eRFfu7fIf{kKOV_^fz_= zRfEC6qyIk#V>tSs8)$g72woTthiWdTn(8x=aW1D03HfvH{*%N13&(<@>Ub;L`b!>8 zdf+#XxK1VRqtzfGRbgF?xaEPTt%cEm{)ozmP7~>!3NJ0O{E3%7p)k<2?8gRxv6KhF zQFKWV4NnX;QD9 zl%|`GO=VdyK@jPlN#D)SHUe#@sB^k3^CfZZhVx?fmXa4L!E==!>k`s^OqT`dr94|l zi)feES&4g6wx&lpvM#Dtvn(rvh{yrphGIXn;Wwl0HucQ|T>i}(bQoHe>~F?g8^K5f zDR1$Te(LO`pzkS~%=r4QZXr#W{}T_OE%Yu)*QEh5Eyk{3%reQqb{wbWKxpG>)5h4w zST6v!4OulEN=#d{7%@f0G)?2&aMWnU#@JrKHVi&SrXaTLH`*2g6srL0y2Xg;x+Y=P z`nIX5sj2 zzYV*IT8GVS16ax{4YFB^9%i^&#osG*WwmL@xd;Ji{Z`}l!$B$BDA*Gk|^qPPVwM>Iq`5LeG-4TNZW!JxJJ z_4;c*3hvlf`afI`r*PA%;?cl34w-N&l}4jdaVCZ>#xzat4itn*3^$UEBis1CaV^-@ z#SM4GDbm!sZ^6)av`w2B!^cpp!1OKNngK_7>^-2Q-RNwz;j2la1%PxW!#e2*A6R+YMHc6q(4uK z7gy0lo_3l(eIlK6LnEHem)lwmrY?`8uNUb9ey%AE}-oxno_+KIVX*G6 zM&eS4uDtTftFOLN5I%_Uu#TZN^n<(a@q=LqxIV-f*N3h)>=kGmK#Rv zzG}64CcJi{QmIs{6@YJ^J9jP|Hogf^sa7k$QLop}h1W?K2?%Zde~iX{<7?4d@9xM) zW>#kogl~A(^LsR#5{&mH=oE`!%){f;0Mk27$`s?YE96AeVCD`Ez)NbBTlS7EK5Q@c4DOja3AwJY~9UVm1`cHU(rWr^> zdAnr~iPD%ADo+_0Dyq%Ht(BzRXp&kzH}mE~p#ZId?0?3WZ;YZy$>*w{spj%ZWc&0a z3=OO~f5;hARogc7JUpf^1BVYEK77~(a97WtKOf`61?Q=0y6bq#g0Fm@b=NfMb??uG zo6aGAbLT#au0waChx9czaY~cXH5ht5M+_z;hIdqyrZcTPprpPtn9s4EgWb~h)d!Kz zH|C6$gP?eb29Uq%krD*u2#(z8XFl^8UoK=nEXY1qavly(=#5H4%a+P59K{f-Y3bj1kXMF^wX4i_z-0tzLqc#-&t3}9wXOckI_TeWAthI z9;QE>^Ux&PnJ-D8ld?z+E3~g)3@8ynYZ^)KmGx8m?tIN?rQ&%%m*BSuE zwP##W_BTv0Z@kd}FgJWzbdTr5ap0Y_r$7z-bjR{q&NUj1hT)jX+?;AT#&pW#crE|E zu&}UTsfM#>k7KCT7kGcF^RYTRF(cDnkAX1Y1E1#X zxCG1JV4sks(~>AEr{BUPQH&+VBt4ccHIJP<&l=K^EHhb_S7q5dKvBIU_f2DhcA~@R zrdCD!XUwWih;%j04AyKq8>G)oypX1rX)%y2&83;y=td^KSVCxy=V%TKCfb05;2kON zzc6O3Q9PKSOz9avEz4KQq%5C4z5ZGT;QPkA(CK_1YrCu{ZC$8ckYp+#z=>?xAja;g zm8*Oif_J1s1s;k^mStHboe|Z~9){lw)CkkhDvClIH3Pt?HK@|nR0F_JHHFDCQ;Mhj z*B1EoS}daJO!xdk!S{5gYoscraFvc~^|xe1g@`G3K5r{b)nr{`ntHGFwv+bRTSC4- zx7aPy(V!h*IdA71M>dMalgdlfZW` zGcmd#2S~Y1Kbtw+7&P5%H`bBbqg3T=%(xM zx$e3>zH90W7%y;Z-eqQ&mX@pqS&mLh;?iSv2z+-EAP1Jsvv zeQBfe)BW!Vs2_DW`tH)w(oVWA*l_rU>1VCkHlNSlmdA&D&4rBN-YFX@Sgg!Q~OqA9|3|=M80lwG){F{jfg3kE^`%KpX@sl!B zv~QfYz=W}F!gH#d4Go!+-D-yBk%@TujiDTsD@x7QG977NL}WLU=Ga{|IIjaJ0L0`|I7(*~E_0o2Pimo6ofA3uG%$ z=fM8pbl;ajjPaDYPCoCr>=!2?{KdS&6zkvRV$)OjHrcGJr&D<7pWxJ5;i-A={9gHc zVH#Ft^^~kq)9RJG+3u_BZ}4?JO_LrIXKb)x`+ka+G{h1q2?K5r6&O5MoI02CqmQ3O z?DGkc0yuI*(ScqYCW<#KlX=^2C{AqtcMBnNg*B%ObA)U{&7{>_+@SRQT{yHLx}K3M z{rzsWcY^jp&)V?5G?A-pwR6;z$yAYAkh4yluyX4xEZR0)?UZIsl$@*CG$w=gsXcs% z&(0aE9%I`@QJ8UH=Cm^-h)eT`u0IaZK(D3P5MJcOI+9n4noY9ye=($9ZQ?LAf%$1xgQLww2VfrDaGD zt)g=XHQT|nN#OTWt#&KQl2LxL0R=gmYEOKMgi=lj(A|ZA9n3=TM{m0gA3k{SpiBw2 zgF+#&F`@FoqPR@4AQZzmC9+J?I4lYRrpsdS!)%=XBR0-?tcwmYcbLQx_4u?TNs=fZ zAmo57N>ZoS5@jmyX*;u$H0!kY$W#{F3!Ntrz&;-b7>iVM(F8CTO*KLYF$7zium$TV zLS3{Mo$%+&h7X`;I17T8kp&8v=p`+Ff?jzFMc%wNBSYTiS_!fu?o0YEZ3RKVo$B(A zYp&U`Ty=QBb60zC^eA{&=Q!znu6PZqYC~aNfeU@vW%-Jq^LHjDCW=8LtYKUW8$ofx zBSqOyi^bHJi^RL}gZjeZq%A|ihQX$Q%zp4ySFaUq#hX=MlZ%9kXv0KatTI8qXGoV# z60LJnx9fxFxW9HHE9vH*q+_msFe2+RL;0H5G2)CBJxP`d=l-@psN@wFRL-3n9-kbB zg8>>W&2caRF1x)q6HV+WU|iTS5zX|rKb1l-sC!`;4mLJ6Htu2SlfqxCmh~p$=)J=3 z%yxX;>i7_4g*89Gjx9!wh&ey}Yz%&BozkYJwj&YY!{1nVN<#9lOUrE2 z{$)vOZdJ&YQs*L?uDWVjAugV8sh z8%yusz)z!U+4J!aHieeZ{;@b&pmqZr=BP&rHtr=PlXF5M3_nBV-rJn3bJq&I--|Q0 zr|~%4_4A+qTqOR8-w}duTkEm;AUNXhua7bA80o#)`7eFxOVXiKHXIv{O2h~M20ezA zh4c2}3Rv1t$ck6-tQidT|x0{NA=LABK6$ zUp&VwKyhIxMG8u_9mILK??QA|Us zLr2J~24}D;G)_G~UJ1r!7&B^VClpRzxNw0`Ly1%Ud?**n6(5{=0O{+{ zxCg$7EY$58GVwIak0=E+H*UxoBEB9r6ufx;3q3eKmH)7U1&v##@h?qym2>aC_s&); z03ge{bRoVB>v1)Nt7+rE4a?Fr0QI-aa~BJ@-FBN$4QC0_RTX!=9#&(F34m(Be^>b!9Zj4 zNwP-DrLwJQw;OwF0sleO4u&=gRb4R|B|V9V!;*?%y)M_=#eiG2sdqA$%Mm?JFO=j& zLd4O`{Kdb@xzAT`WUj;a2-CA<2?KyA6A1u|vgvw;EMfqO(z!=VvgKKtV;80UF;A-N z7{EX`BaeuZUJ~3Q4`JO{t)*arvgGF zqNiX!X}Wj-C2qAP8uaq8Y_Xm>BFOIC}1VQ7yq@`Mh zU#%1eZrdg*jArySD$?Lo{oD77CBbCnC8m!%^T3TgG@WUGpa>LP5RhG&t{yC)rU9n2 zr9L&DuYCK{fy@Pd7e-<-qVWV#ASlt4^u2yIQZy?XBxVyQXj3?XWXS6@^krFmOi>JX zxAqzww^EY6dG?U@x%+r83rDgsQ|uJ_&hZE~ES!%YM5Bzog2b30;E@$Z`e`I6!iXno zUy#fNsDljN&Nvyl;tmy#_ERZ)!xYur*nBtU{KE{m-q}VFz8VVk_Z4L=$We3Ce$g;b z*`3Ts5lwXYgg1lF$kkovX68hXhheC>4htocw$t=_4?BBq_wL=qaSDqLB;XvOvQh7L zyN4jW`vasb`&|4cZVZ^C)Bcpfb8 zxUj*f>`Ir`UT$ZMuZ_Crp(7H;?vgY{=$Aq>u#eddF?aHs)jKA!UgXk&k&WSygc)^_ z@*8j==T#pJdfU*)RS)!n&`bGjnQn9fooQ}2@I64}pkgzY<*&(ftAecdJ!9$*Hh9w%v6%pw}%i4Hn$ zJDkJ$3#==haVF9agkwli9$e-5*(ViAb^%Xk2Lg*aU2P^x|Wea zO^cs3TupPpILj@Q=5^#(((rSQMuXDEb=Q3(h!Ryz!+B~R!x$Ywukgik;3zana4SL& zhs%(WRiz<$`bnFZz!h!~V zfe`L%ibA785wI-5WyniX9yHbBgm6pMhG7_v#$h-fk4IrxPolke?yJ%5=rQ!sKi);b zFA7&})uq{ekl0ET+61&fSi+^#a=iDvSqN&E^&e_C7qp(i>!ndkMuU6WhAf#k&p5^N zoH327FH|@nSXRYoKbF&-Es|H~YHW^c!LC0jl}eiHuo4(~ucB>(k^M6@P50T|?3yOs ztJKro8ZH7jR9E(Hf0&U8L@n6&apl;ILlHok5O!gPHBqbi zg2Obo_wfLmPw%!>b?y}{%m8%F4Cj4<{h3^{oV_xY<>7E=MVBN|%*~KLQX0lh#+)&d|Clk3^Z#r2 zkHq&dGi6nGO;x3wIRFmhR8>t^S7no7&nHa7Sdy4*0a!AVB#brIe{T5zs-ZIo1?fhI zG7=`kC^bVM>AK0tN(jN>oJ^LK5K;ym^txQcX_dCX0LwC21V+)mVlYq>vF|H#|{RDc_GfH9l zbaepB7|M}91Vo(gUVh{*9IMp?H5M(oUme+G*YVBLdR$M7Z&3RJHfGRwFz0_ThI06(3aO{sjDTt_IclMma$3Qr#RQUU!5dFNn4$J*rt! znu#j(9;FA|yCwI%L~mP85}lGXy+6j{D9(PE&tSbxsNaRf+MFu;9!^*3YeBs3Fq2?f zo4_@I#(DS*%Cb|g)M4WpLse1t_(4;2Y0Z6ri;_ZX9j{?R*i`{?L)F*Xi)M6n2OmeN}DOdSXyK??g{?nc{gYvm> zSRzpIPU;jIYxf;{tnzex7s7%9k(2ptLOXf9PxN(c&#sdFP~@YJdTJ8SRofE$VZ9 za%w9Hen;Q7kSru667_)}Z<>}p=6w;n7);boq&y~)ccZP=_APoMoEN*_UO1c20EIw$ zzeV993iT>LQ7o=bG_dt4P!u}IK2~%LK^TR|#P`Em40*MCXIYg{V6gF}m05=K3^GdVZ&CFg3YnKt?ZSb&FRm zYgLhmxww7}gxU}v=0(+c+<|riiib|L3xY?o3jIi|smCU)y&qvupF-a&#Hd?Z&$cHQ zu%&oHdGHMr6YCiW0-h7T9 z_G2Na=+TR>D1Apx@p!&xsZQU4(|j;+T#tIx)${^&NV?|&PkjJX5Tqj{B(>R0Z4Jy1 z#r@boNjy5_jBPT;H-mWR49?hQCaZ@>CknkGnY-CwbSl_dTyG$-gxruzbPmzyh!b?! z%5&%@1EwqntN~9()_Vn*79j#Eh*X9s?W-kVsmyKHJsBYRoZb(jS>vVEW~0C#-y7IM z>gy4;OP9VmWQ2IyEz~R&$Sko@+RQ8|6q@mQYlDeyXN(UCn`aRWSYv_?qx0y2h*DUV z^Ip4~fa3O+!sjND73k6=Mbn|A5>9JdIAfQMn1?!|tBSo031V~G>3AO_AM~xqfFDt~ z#4-SJ{H6wm72pEsmoPQLc zgL*cCHA;qCU7xEy49D1#AuH%PgK~`|2lHE<`OApakYV{ng56?!3tkG8MU(Elx!ICOAo^F|IOgH6VEa` zUAnxKRK@qKYzPeb9@%(M%|2y|~Hn4J)r`xbb-O92yDu@T8AqF?|Kh5`4I}~ZB4n>LA zzDU7a$=Z=@F_;;=Cc4bJ4r017i^BJU+C+nc;W~Pq$|rpKA^$+?J$4VyyjlxSkZOQP zmTH}mf33ldJo?~KtzTGP{ZlQ!K(E^e^`;bZI`*5m>xmTZ~a zXtI0OHjIK!Cs+(+`)}n+9Mzei+$fu-e4`?;dK71GJap*LV=Hgi(iGL>II3H9;7HEc zgq8iEVl|I525rk>VBhvCKsDQZ-Rp+n`*q8BnuGqdVby&f{_J(Hd)@2axq1WmzHH-q zq>r+NK`Ho=5DdVUIO#n#cC?I?#soKM1bffPXfS8PvoO1F-)y~R-4Hf3hhr%2+gDVg z{1xDgse9)3?VH=9kf*!;lG$NZRn>{ozJ2BPm_DD&&+B1y;&-KVPfVl4?~ORA)ro%n z%CtE)H%wEa`}R?357_Li%GWAYzCMs6T4+P?_rLQvI@Y=KjpZr2Lb+=I7)9Bsw6?b=%iqS^jIi2SHAQuv z)*Ma$uacdL?7mrae2x}i?9+x(&3XLMtb#!H@;-|@W(@!!SaG=fdhXCoQ&Y9O_g?QD zPUi701d+_|4OQ?tvOb4rFJoaz)pXO;Zr{}_%Mqur)|wF#-R3esxeG%W!6RswJR5XJ zapXM|b;~akc+4qC>@rEPnUg^hP2dpe-%C2O7zzaOKKN8)ezvY1)&uNK|KZd0=UvG!VnQHy~p`FXAK3(==OEj?^1 z;*_M4#X3^hg(XQ!ubrb*d8Ss^j|rjsaL}f}I5Y%Gb*`vFOY$7D4L+%RSn+68|B8u$ zy<6wRf5dl)Ac(z7X@O8IPJt7*56vTn_21wMz~+MAaRKZ<;lU1AO1-O3EIOB~p;|uK z@A?5;o>+MddB6;zQIw3*fC90_=Q!(#3mv6PK35Zkqig9jHH~}M(>0j`Nv4yHMqx$4 zg3e7tU0eg@XKAsSas@92Ph7+c-mBpXQ&3Y- zUXlhVE<}I>i;i^BFgN!iUSC7@=f{s9KX6bIB~8~fsd%7pn_JpcCaYZ;8)lAZbLH}7 zrG$jpnT6#oYnwmy!V51vt!t7ZobWFI)WGyB9yy)2Eur6`aRlek6k7F3LLZ@62Erc5 zV}%!HsTE4}vK$-)r`=87G8w%@vh8x4*VtTS91RkhC&~|l^NS)WAg#~=^i}1>)H_e zr$Z*7rCz6wr#6?#4qJR@Q}RSBUG!r)pk+EZ?5Wf_X7=jJaE;n|cF=y+vc6N)_d=X< za#2^1izt&qNhgxfo*F$7rh5=%R6tdLfH*iE!AQ4u$I-yjt~w!v8B=T2zeHBE2lmF_ zyU!;$J9oqEq;)t0nbxOvwqQ$4vA)WKqv$?dD7l~aO(0w9fE$vyYA(W`9 zJW_tpwJZbB_VlF(s{$rs2tPYO=slN@_>H-?WlaZZ;#-l2EJ@F=Ycjy~vEh7f?rgi> zJ;Zi_mNhqr(EIrIy88SdIzK(*dk($hMmNbHC5G~dO%`wow30ff4N@QGJ1j&O0L=UNdGF+GlJLq?GR_C zv`9}LW2LGjU=aY>ZUiM?twOrHDL+=t05FEAN`{f0k<3-Nu2OhGAM(t{#bT$mLV{j5 zJ^l34g7EbHLf3=Ay6MFc+TX@!E&71Zu4@7{!qf|yDE9)kyv2krtdnCC`UMhKPg0;p zo1zEo1`kpxW-ONI2VT8KL8BXfVABG4kTW($`xcbTSt(Z4nD#`|CTA=R*B-$bA8Zbz z>xJ^DoA@g{fDa)V1*naX)DGHK5+qh?S=I(Eceb(R$@{FaXBQi|8?|N3e9vsy1okM3rnUoE!x z)4ODI#OuQd6vs!a)lVx!lTzl(o3OSQ0L_FOC^nO$crf73ptOc3y?#W+LIuMTK2dN* zAlrEmyD>SuOlOlqk1LGf4%dle5Eq4w?>#ufME%&N~=CA<=Rb6o9ud&ljzKrAzWQeav{Oqo4SUaz?hyZXmhFSnf(Nixfc z5lv6I8gqX4!kd5D(>d2Y6X)#pyAIRbr=H6GeK>43kp#!84drZe?-z=pl+==zaWO`q z>Qa!iX7NOU8Mrk<0GfpAV1}tcFHI*S;SbD5Je9gyzJ$w?=dqkXD9$n8mCCqO&>X6G z+Qih$dIf0B@SqDm1lzumGVMexH$5mmOH zhriV$bo2l^fyZILbOiUmE8GT1NL%?h=A+OM zIePr+T5!hY^Ece!s=$S}HsMFFfBoxYA9wfDyXUv z!Ljte*8PGe`9(z2{NV^8wEaE@Qklqbv+Jo&2H@*-y*L@Z$NKH??oR*zk&V$ zjnTKzpQ67(G8ZTffO0*cGII6uS$@z@qy4*gx41TgaAg2oVQ_#HFX4j+tJU5=hY&5p z%}y`}J2G6)*j-amcYk?{$AsR_iWQCy&~@+%KDfC`!`(fvtNW!xCZBuadN*ukT@^QT zgIAOI^iF;CRa)QO;$v}@FQM(|Ui4=4B>HXiO(ZS0CUHWE(vboNnES-!USHCR;$$JI zC-Fpfjy@$cmFh^qc}I7l5Oh&epGIl@l#7}!0xETq;`v>ukQ!TCQJvDA&->vSINeX- zT`~q810WF1G&F*A*JD|pZ^;tI0DuLBXa6oKkW_;5^otnPxtkj`#MKb28Nlx8{YlK? zr89R^j^*-*i+A1A}&2Oy-!yZ46>|efBWLR<}S@L1AdJS7>gFo zX&+-B=n1t&z|lgE@Y7w5o<`9V%p%$b-RLF|$zMWRG#I}MLBc}XP)F`^83^hpAd>|3 zJB+SCI!2gwNM~Ep#bhb$le-)~RkzS5CfY{hikudyD6B1O!KhLx&>*ws3nFz}S8Ib7 z)$_+Jr#gKhfCCkj2YpgM(BIT5C*gapy&L(>VwLrq4WKicrc)vanxme4=uA#mhL-ITZ?i-daW&dr{)vAOQh3m2mEKc_0 z{mjl-5LSu&QEg~cQFI)rq`PbpV;tT(F)?w)^F#7+2JQj=-1iqyDoyFK3|LY0ebZAY z97_(yu0i5zc)Kmqxl8h{!x6i>t=>1F?E^YnjbB75I*88Dt$@fSWx4=TN#iD9V5Hg; zw5*e;9I+bbaWiOVq!cGNaoP{!SvLrVxcC^~5P|!(?%h6ck#uSI4 zlmAy`yRF$D=ks}A$MF5{a<)(?JW^AWyQ3!mlNBC1bf_H+`Nxa#cO|H&FZ%Ii9Y;aF zBPaPUf-2gEb|Z`ZFlig_zl$iLkn~f?lW1J!%=vDdH04xIw%E@_T1hfBt7-XPFZB*n zgX5)K_P%-H;}<4M+4n#GY1BobTw7R}-&6Cv>=&{Qm6M9{9P?us1nBs4%u$5EvMeG~ z1}4P;0_4T?2%r$MSdMb0vAV{ImQT=q4#iyMw{L7{Rmb&bDwUav=T&C9hm_0BsbX=e zSuQty%QS4SZ2C3wY{RttX1Uz-96L~S7-n0rnQaMzA_|x>3?wCh8N>7<#f)J=5G6r> zJMK!VYl0*SPni)!MG)#XdOMDJ;tD$Eohpj!e9HG!(IF@-)lO_E>Cr0jy=y~NbP00( z#E8x}Ug6dk)##XDxX^_8T<_hu&VSXgzt`(&7^rOM?0QX(>HIg;Us+knm8NWy=e$=~ zb}4sw>NUS!g>brQsSH4WF#Eh7+hx_wpgx!)wDYgw=A%cC%DS#;n3J!P6jd>zI{&r3 zwb5u;JfF)Ii}rrWXifgQ0--X-Ot)=z<{0Ra#!{V(51b~x^R528(1?EOz&Bw(ar~I* zBvpRjPM_JeL~%V#$K&z%!@6y=kBn{hEj!aNp4g4$zp2}o&Ye4VuJt>L@;j}I%De2~ zQd@eTEre9PP zPtz2H+~|?%n+vMsR&)S|M%tKKZG#U&Bw!P>{Ury2eaeUh-sniWooG#e?=-TlL zH(SL3Bls#5Hkh$ew{C}_E4A=9Hh9D=m1feJQpqgN)aK`FGsWz-uIFYn>pG4*`zT2H zcLR5>>!1_9*?@3nCWLQRKXo*??jNXw@9ps>ZK?UdDxmk?`{#DKrn#E$-#8k*Da`8` zdVr2;sLWTD;xNeAk!=h?LW^Ac+k_Qxu1tJyd;3gebUii4)c|=RYY;3~x)ANmmY2pU z=(=}@h4Z(|-`i>2vW%j@d^d5B{q0dNs_UK%ApbILIe%DNPZuzjE8~tq z*%FO>6%eRS=;HE&DmmF?3WF>d$dDeM@{|Zu}&A1|GEH$9+Pm*i+xqWId`Asc0Nn zzHX*%d6UF-c)N7={25@{* zuVWi?!LR$nPF+?Mqa0MGz%&^f3Bp`=Ic%7g@f)AdzPYnIzh(MUb|BB_e+RaDP?YU) z{~#HM*2()BxLlGkw93@od5~S+H%m&VS|#pqs0z;bWWF+5xoE3!FojEEFZ3(7BE3z?-)*=YdQM#o5^$6L?-=x!KubfzqLH>C%5KbWM6*Y6te< z1C8d3Z7^zZ=s~0?iF7_nrk>>1h*n_#XhYHr^5z~YeMum*q0jGE;V=PeS#O0BG9kjhXF|LYPn2x}`!G3Y ze(kU!=>+Ho5;Yw~r%W3Q22aJ|+)PT|Kjsg6zjv(2r$$nczB6by_HY!gGL<~wJv;(L z$#Q|CzoY(k^gi@4zh`jmGbDU0lnNX65-OlVq&?vi)V0xzo2b~Ssn=}e?N>`Z5}tHI zYoNY`JrBp)Hd*1xc|;)6hdd9j{?+!rg$DCDk_8J2VlKyFlfQiSl;G~L)+fnUTpz>N zVI1{tg8CrcdqB{|vPt@H^P*`FT}n2_7ZFHNwP7D|77$xeMjfz^uoF;4@Q8rwI^^#8 zD5g}2>ybJZC%V4BkM?KA2$lhn_eGpAN_Ep@EZ${FuFDHKRaGUCQi}vr{MfeuF>~*T4@xgGv!%3daL~aP| z>Jk$r&*7|a#^xMP64}(d8NzH&;+*~A!PtRRK{*$bBmEU-_PtLdf6YQm$qW#W(X?Lj zR>^3@F-MX4XxK`U{JRImsfGEt1X<+!Gc&W*;@=G@wf_BIOjTxQW_-VBSrpGNOclZV z`;nl&zeDiQ@z+p&?g5C-R2H2Sk6g|y<4h$Kct8d2jqTJvM5-4wNP#b7M8vD0LqKn@ zPVB-+E>9PyF#bN0uQ3~e#`tom%b+-+VXYTe=9vaSC9Gn`u!d~RTP!rch zDI4@JGD;1N)6P;k%;kB8@i#Z&^SMx_XEjcHkOD|&82~#g0ni7}L)mHR;6AzoA;X){ z`OtJXftcpgn8j47p*4xhrgg|)TSH3MCLL*J9evx+DhcTTW3Fho(A zTVQ&&pKoziWegA7ZjuCo+fiwvx4IQhQ6Fu@S4c;ZatCqd7H>-uWZ+ovGuAvm4FYlk{ z&98l#1cBt>d2B!zDQOS!ny#{w$L$51eFi;H0u%vxfidr z`+LJZXU?2alru78vYa(spe!>cKPM8b*VIv0f>)h6b4D=?<%}%LZ1>LR+|6WJmiaU@ zg)>mA!n#6qejg57Bqe5566~ASVufUF>FK%C`$#?5pM9U~8UKCnZOf+Nl^tmIBqZN# zxUr<^ABN|nZq-jBT$Cg!gZ!}GWx;)n?nAHiQYrc03jISSyi4RU)(CAatD!j(#^1;; zN}UjgjwGn0PN;Id(;wde8WjaD+Q49YrjpB8rA-zKrh%V{_>-;~W}&#Q#N2B5k%9oe zKXc_99dsD=dfq+5n-qoe4xmTl9K10n(vcTg4_eK|>D;lqd!VbC|C)V5ta9Fy4p@g0c;<(DUZulu6I z`&Ct~?yjodcMKBpvdr%CjPH2=O(_-0QJ>>|(1Rc7y6&mf-BrccEvsP{@=j|w94d+| zKd3#cD9Rqs|2u|zwk8NCSr9t&A~$*K1==A@4-CePK8pQmQIL zN)=Tfq(!g|UqvRGfvxJ|zj`+Xj*8&sIF8>Dzp&{;zy0lR&!oXMUU&!m;T{LI3wftu zS%+SD;RW5hi^(z{68(jDlz)}&EX{Q>7UY%A8Ra-8r4U5&wT-ryea~be@#w;nAJrR! z?ex;VDBo%{8kV&JM$cTa3wh@krg_pd89V8fN}gu+3^1R(>||b}6btT=4`}d*jmBy4 z({{9bjGbi6G*7zjQ-(iv#1$~5TK?pb4`}ncC?3N`>{xCtRx`4%gEDsxH}-ru`eLm)ta5z7z6i}-q?wnt z$FM)0s?fcVxQ?faf98JoSh@-9K42fPGqhiT&{BKHSL+qjKszL^$FQL29w4!jHAZ65 zK2GYN_7xnlWZ*jH^(wFP!Z(V6ReO+6F~(H2bf~21hV~El-h1z%d$kpr5kcof_V2?6 zjMCqKoo4Q2tSe@EkPZf#jx?1Hl~na}PqjW6@3RII7~yX)jV@GlCCUh~R*0u!8&oZ{ zD$PDJ=V46VpH8?I)uZnkAaxNirZ$cqZBSajXZTCdIC`|9h@!E_S}A8eYahXj18JAc4(BUvW1J?i(})}-S58n=9@)H5^pBh*&#l` zW8C3jVhjE~vuAI(;RZptfyfRf)O&jD$mBJrwGq>_5cv_nFbEe|`7B6D9A`Ds7VH^j z&t8B1^`dzFt5~)1Nfx6tPOCpyw$>y8DSJ<2>lC}mGV)_yUefHT7`3rQucr6V#ujf+2<}8|6 zd3;vgfrny{*%@vYY}=T%Wn%S-IrR%3d;ms<%i=MIXdVB}?I@yLb*92~+)l}0X=pAL z8CbO39x}4w(+-e={;-QlWuGX{h>|4kt5AbYhGV<#>~9`^_+cHeOG#y)C`sasDDJBe z9Ou%FU&aW&g(}g*h_7+6VB zL{NZ+;Tx9q9l%FSX)(PEE1*CliW9g9j* zn~Q^Y5IPZbj1_uR1dWHPaFslm4O zj4vQ}JQOv8vLDaRA6=aZK$XPLlS#JXspYuU7A2`KPUI8&bxnSUsFzgImzC#e6- zW(*8{eSe!tm6;(C%mKF_gs^Py>t~@I<^Ma-zEfK&T90*2?@*9{Ye=q^&_kp{hw1V~ zi(*NsCF3a`2y_%?nj--!kyxpHG@x78y4b>cY!)FVI9^6Ls4?X@yx)R9wTE>NIAmiA z+Saian^_OQ?I5gHpMAX#W3)uik4TInml2dCht8F(mlrzVyV7b}ePn8gJ!}t|OX5z8 z#O;BuI3|dIOG;&HIN^lbGuDiAqBk1p!>OdEqzBT)JTWv3SrIUFokm&CfgG~cNSsFt z9D(qzcsjg6(kub6tYU{&kLhCc;JGX(&f1(zCKDJIY1ma^FocCih#EPEmr{Z*Y#-QW zPXb8$F-g_@+@=FP)1WmdLv{B#8lK~HKqcL4i=3i6 zQ{)3Ho%uH{`@gQq)r=Fhppo7)PHm{16x>^fUI999VQl4c78bR7vti*_c~NjZX|0#j zJ!L^PYVfW3sBu0EZ&(;xI-u&xOl=?+f-~d0mXYYM@KjfH%(Z{?}XqdMA!kd|Ja*w%1vU#o$ZB7O7QWD}ZNVB6*6(TDkQC{HMo zbica%rYoN;>kN-53{|jYu=j6hm#p*(8L==hM>{61HM`S3X=Gg~`@gIcW%p-rd*n>o*pgm{JYCu2G7c ziyMF9&FU)zxVgBYQA(+{vDmb4ij2+QC9sEf(bMHtFhbC0?C3Y-v1I~rHN)Pi6r)v# zM3^^vot6(~cU zQLz2Fc>!vo9Vim$`M>l|o8*Is^<3w+_0>e8VBZD;7i{(+Lp`GCwRWAEr)}dyjLkCp zM0358>4IN;i&N8tG5e5VpEmVcyQV8gRO3U;w%IJpHk+!6>WZ)!Br!%7!JQ(?cV|!{ zhE*VNvbrCjTguCAffgn`-*Ib@lU}>qc5qy+-dRZ+@y)K|SHo(E>0Vyxv|38_$apiR zD_)8bsBX~8YuiI4-(x#=yix@3Apkcp5DXYZ#r$#)@=P`aF4LU1)2mt1M49ieNjj&c z?cgt8lP3KYkP}Nw+z+VC1w&@}K$Op?UJwXi!`S0haWE*?rP_Wji`w?m;l(QDephQm zFh&enWmA0-?M8?ATplE72mN%RO(-SQ@AlJnTG!1-2NB;qL+fqgvE+{ll>#$|BD{In zd_Y?fp+VA5Z7o;orvja78nw2c&sMLWo;q>jLTJI2%e<4MsCr+H0-0r)4I!N{qh)$e>Ah)ux z{LD`LGEvoA4m`6w4XtmBNk||%k?iUHg~OG0;t$0~3H{G{W)3W+?}JVnJ4%9CNZ2z4 z3CWyU9J<{fxxv>IUbH3$}PO^Hp|DPw`hduqf3pfY!bC$twkCS z+qf=Ofl7D{8LroiYAa3KWiN;jT_J4))4EtSduO>4^qT-9y>-0s{mca$Lk;^F`=a?4 zGxXG&a1F4%uuFY7H8mxfZX}kbHr(W=rKl|0NtzmkauL5lEX!tau^&;RD+s;QsLfVv z9owRKjj>3`Y$Ww-MA61g+h#LcTUuHoerFyaOUuJAFDxu*th%yNW!l2wGUg*f{;h`L zIL8PK^p^(Kg9UA*SPPrf!!_i&C&JpRMo~(?yGBt7fAD;x)e^wA+_7uf0J(Fjswl5$ zHS)9JX`j_jr$ey^wufnF6FBdt3#7KR{ffx-Sh2`FH(HEuQ502u#ZrwFIAhty$u z>fZ_nKcqmHPkvfQ7VCAo zHh!fywHu+E`fBDAmZ}Lyv(2M|rdm&IIRIn)*-obeVTWQb`?QDY+shP>caJsIlIgS0 zQrS{9tx(Qwa>lZD=l!+tr1d4+yXkFlXQZS`6B9>KrH*GhSya1w(cLiN1_8h0oN#%* zOtpj#bzOJ38sr60m{(O9Z z#&}U$Ta${MvHyB;ZaGueP>OcO_W_~cwG2%v0AO8{ z^BaWbC0miFdk&NDfkTAU?@eY148Sk}xzKDiK^PZ<);iDrDIh)`u?KqN0Sz^gTb zh;j9;^*u>%t+ypa9*3opEIYQHBM6b{G9ECtK#y0P*tM0G2ILDH^GcP0*_do9g~ zerp-t45%2ChTP4w3+)zduehg2^8LE|(I(;QtZJF4G6~o*x<l=X=n4svKDKf1!$4gPSGg&B1cDnMf?YEmV z1yfmJhRy^wzqpj^iom$StnIWi`0Hy!9Z!7)?qgv4c52)E0qA9v;b6L662;X<&}@e$F0JuBMYso?!Nn~F_JEiZA@eCKRjyD{IJi<0OflZzE{zOxgve%OibXoH919Q|y)Rz#gM@YchX3vQOT3-+j{D z)Q(TPn7&aEu-H{G)a7LF&sw?g#>Wqlah);`-%<83t&bV|>-+AzZ*MXQ*j4D=f+*m; zs3nm+C%qcjrz^R#N5@Epj6nAtB2hQa5KP<*q8qVzurg zi9)ZbsJgB!G0v5cfwETtMQMNqcZv1TwBb78Pj&$QAE3K;@2)(& z;!Z;%^Jya_)K2$r-#%l^9=_s~5dN?jMccO@Du;)6Y_DCreSf3Z+gY7DzJFgUyC2$} z=8UF#HOD~+$!`ySd~;{fd35Kj6}szq^MwKtxG(_02vf3f3Y6mAR5_ic^Bn!cxX(9S zMM+a@72&Z24ra^A2e6u5KD?s8tiE9J>RRf7F$Og@bwqh*vJ@=(|=>Go$R4yWMX0@;zn#!sW}CyS#kQ zWg8w?V*|JME9cLjA3@>#`2vi>abl+&h#Tk%F4}J7GRehk4H*#?`vM`kllMDO62aSL zZ>}VDIsF^_?k^`MCP>>DJGy-9pmTRZ=v^iBh4St&wr!k%(8prDzA3O|*$Q|jg=^2r ztXUkYZwq}DS@3Vg?&spByeLpm+=~vCz)<^41#WG%8L4Ln6@5#hW+zS1 zPw!f%DQV!qvYI6VY1FYG6K*5hC{2kYy2?aN#ZNq&4#a&m&^aL3CZTnvg?O-udI>aG zj#3xm-f=*vzPKQOR|CMpT>_D1BHXp0;k1AC)%_H!*AY;R=SOg^!-ybfSo4#P3&Rw1AbZITzlm!HO>_cuwgn5H=TgK*bNin04@QzTnANC zxZ{`x2JN~pq-I!1xVToK;;T17(a>xi!x)`K7toq^kzk^V7QCjqGGY!?VXf{8tWJ7j zq6X15U>r!w8g#-@K(Lc`*H z+@t~)T(1>YGyoO@EZ_-!{pqcA)eSrP_kaKQh5|Xo`1_?H*^d=tu~ZF<_w|f_n`Rn~ zN~eJ}4FHRh>#3@QF>qe2R2q$$TLF6yHagp`n2k)+Gy$2WX~v%C!KUN7)w4Ql*gZld zt)oMMMUaEX`l--M90XahPBA}Cn_LTZfG|`$`Lku|AHWkV#A{(-}A+nwdY(fjS5W>Ij`U8gcaWFiM_+Pg+*4gmXsYDi$RuBvs|fSxZN ztp}QiZ5-XeB)eL5gc7Px_{w6i_kAm8F>O|D(jlzEpe$NEl$qRa%QAC+lUzk5BO~z? z$+pQGkmY6BQ-e#}CsxN}XMK=~>ULdck|-4lk|?otzSUN_6_-&%dx->$kOU1zR)bcU z3I-XtsJW7=g5;$_YpE-frbZ<5tVM6go#}9xhf0l7=aF*7vX~U~Y)^fj)bJR#rik{u zs3>CTKt)xp>T==C04v_O$)Z~rOQ%#0EhU|jiT3-3Z4h6DVO%xLA>TPRhr=n!lU$Dr^|n`OOh@D3Ijb`o1D!kJpBV?3`E!_#Z8 z;g6I<(LG)?pjRZevEn@1I}Zkw&9Xhc+GYU{)6@2Hz+M?djS8E<8Fsds7`c>U=bC`X zdc@<=h}14QyGk`FEON&6HBi2;5FDoex%14Z2*Qyw8dPYz#udK>+1nKWg?@4F1eBwy z$LdX+gX+C}_ZaL?#CQRH5P&>~=?Fb!46z1L@JNBih7R(o^$wHRTAAUEH0vxmg|AF4 zro_vO1m(+Z5Hm0vQOh7_So=!BSyG{|c=G_1$>@xn+9b4FOKu?>Z|3uJq^5>PXyjYd zqP=!~a0OP()No7O56g9bvLM48TsJ?_0Hc-T*>J-mmQ0`1t$y+f8QZn!S3I7HT4=j1 zI?#f5Y32$=kJ+9?q6B^`TIjk~rFzhxeJ(L|sg(l@hIDe7r{z#QMHEH;oD51dtpaG( z-LY^KQ55-k3d*zdYZP*$&CelQ3ee|eMIo-9qT|!ij*nv$kUu9Y3K_qKuVteZnz4!U zF)2pIa#1A^-LsdnNI^p)16dUI08!6aZtaoy+*#hq%n&^=3W?Ff79u7&iV(oRin8%s&l#H2fJ?wZ_#OPmT+Bu zTGw^g2}46YChS$fMZxmez;>U{^!t76`&bFjX;@`~|23pGZqhKQ@2?g>DCa&cS+RWM z8b(aBc#LkE@hI6h)kg&Fg>u4PqGhg;SfoLjL=@*cLd6b}w4&F}ibv(aBrvs<3-yj$ zlP(eJDh@99GLb=>f=k&E_9U9%5n$U3{uT+xy?#XxuA> z`8m(`FOK63k3J%SmRG>uh@`h}%A*zEiGC#ls;HJOd|>68vxa^E2={nF&+E0;Gh~T< ztujuC=T4@9K4^lag2^ZEeZ9w!_PgCpb1;UE$DeA9dppMbyN|Z8A-#ou9rdt|Z*FW5 zP{FmB8?M*|HdIyJKIPSBNdV1LUG6QP{OEae2l@&ur55Uj8^bV^4kF8GuF#9KOrGXcA#@}Nmh5_(oa*k9syjIE z*XE&FN@jleZJe!4O_$36lzAHd_WLm#3#Hn`R`S<<7Jp z^ps7UAw4t3?hMp6QC8-`-XfKDV*P$nDNpI1JzR_~Vav zhZi6oSDIM%lhTBgJ5?a?kWeighQHWVwbwNAuRzf8{cNEF`4CyXCG2rtfeBolbnjWj z7+>^jt{_E!W;tVTiQ_naV!IShWIjv5(f-Ur%oqok3M-d7v%UVeL zL8k}bk{YXZ2_@RAwM0a36Ga|I)S9;}VRIG>guR8~NL6jnGz~OcRUJ7cBss~eQ)T!u z8?i+`h7tC&Cn$7YYc`sI4b#nDL^a15WB%Q}x*YZw7k#`o7z_r( z)z#J2`irzd!xJ0`Pzd;j{+WFcaOBf;)lblcHaG@)S{j5U>4Da|v&lT!P%pmainq9f)y}=ZeP;YMDB7Y~A43{!e~t%T zLDy_U4IBU`Pz_tt1^3`CI*dj!KC~Kw-v?o&Zf)XM!-r56?Xx-RXpp2zhI0p~LYJwv zTWJcAV*+;­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⋙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 literal 0 HcmV?d00001 diff --git a/webfonts/fa-v4compatibility.ttf b/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b175aa8ece8b1881ed7a23ec6ee6db6ad6b7cd94 GIT binary patch literal 10832 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 SW@ke+i9ap#|HA+S0001);};|V literal 0 HcmV?d00001