diff --git a/.env.template b/.env.template deleted file mode 100644 index ad9d69a..0000000 --- a/.env.template +++ /dev/null @@ -1,6 +0,0 @@ -# Required for all uses -# It takes 2 mins to get a free twilio account https://www.twilio.com/login -# Fill in your credentials below and rename this file to .env - -TWILIO_ACCOUNT_SID=YourAccountSIDHere -LOCAL_AUTH_TOKEN=YourAuthTokenHere diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 401db49..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -* linguist-vendored -*.js linguist-vendored=false diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 25dfad1..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -.DS_Store -/.idea -.env \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index aad6757..0000000 --- a/LICENSE +++ /dev/null @@ -1,87 +0,0 @@ -Creative Commons Attribution-NonCommercial 4.0 International Public License -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -Section 1 – Definitions. - -Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. -Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. -Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. -Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. -Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. -Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. -Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. -Licensor means the individual(s) or entity(ies) granting rights under this Public License. -NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. -Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. -Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. -You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. -Section 2 – Scope. - -License grant. -Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: -reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and -produce, reproduce, and Share Adapted Material for NonCommercial purposes only. -Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. -Term. The term of this Public License is specified in Section 6(a). -Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. -Downstream recipients. -Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. -No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. -No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). -Other rights. - -Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. -Patent and trademark rights are not licensed under this Public License. -To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. -Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - -Attribution. - -If You Share the Licensed Material (including in modified form), You must: - -retain the following if it is supplied by the Licensor with the Licensed Material: -identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); -a copyright notice; -a notice that refers to this Public License; -a notice that refers to the disclaimer of warranties; -a URI or hyperlink to the Licensed Material to the extent reasonably practicable; -indicate if You modified the Licensed Material and retain an indication of any previous modifications; and -indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. -You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. -If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. -If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. -Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - -for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; -if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and -You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. -Section 5 – Disclaimer of Warranties and Limitation of Liability. - -Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. -To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. -The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. -Section 6 – Term and Termination. - -This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. -Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - -automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or -upon express reinstatement by the Licensor. -For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. -For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. -Sections 1, 5, 6, 7, and 8 survive termination of this Public License. -Section 7 – Other Terms and Conditions. - -The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. -Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. -Section 8 – Interpretation. - -For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. -To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. -No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. -Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. diff --git a/README.md b/README.md index b8d1b69..c8f293d 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,21 @@ -# Zipcall - Decentralized Video Chat +# Zipcall - Acquired at 250k users [![Author](https://img.shields.io/badge/Author-ianramzy-brightgreen.svg)](https://ianramzy.com) -![License: CC-NC](https://img.shields.io/badge/License-CCNC-blue.svg) [![Donate](https://img.shields.io/badge/Donate-PayPal-brightgreen.svg)](https://paypal.me/ianramzy) [![Repo Link](https://img.shields.io/badge/Repo-Link-black.svg)](https://github.com/ianramzy/decentralized-video-chat) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?)](https://github.com/prettier/prettier) [![Join the chat at https://gitter.im/zipcall](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/zipcall) -# https://zipcall.io +# Source code has been removed from this repository as a result of the acquisition. -Decentralized video chat platform powered by WebRTC using Twilio STUN/TURN infrastructure. -Zipcall provides video quality and latency simply not available with traditional +Decentralized video chat platform with video quality and latency simply not available with traditional technology. -![screenshot](public/images/readmecall.png "Video Calling") +![screenshot](images/readmecall.png "Video Calling") ## Features - + - Screen sharing - Picture in picture @@ -26,45 +24,4 @@ technology. - Auto-scaling video quality - No download required, entirely browser based - Direct peer to peer connection ensures lowest latency -- Single use disposable chat rooms - -## Quick start - -- You will need to have Node.js installed, this project has been tested with Node version 10.X and 12.X -- Clone this repo - -``` -git clone https://github.com/ianramzy/decentralized-video-chat -cd decentralized-video-chat -``` - -#### Set up credentials - -- Rename .env.template to .env -- Sign up for free twilio account https://www.twilio.com/login -- Get your Account SID and Auth Token from the Twillio console -- Fill in your credentials in the .env file - -#### Install dependencies - -``` -npm install -``` - -#### Start the server - -``` -npm start -``` - -- Open `localhost:3000` in browser -- If you want to use a client on another computer/network, make sure you publish your server on an HTTPS connection. - You can use a service like [ngrok](https://ngrok.com/) for that. - -## Contributing - -Pull Requests are welcome! - -Please run prettier on all of your PRs before submitting, this can be done with `prettier --write` in the project directory - -For communication we use Gitter Chat which can be found here: [![Join the chat at https://gitter.im/zipcall](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/zipcall) +- Single use disposable chat rooms \ No newline at end of file diff --git a/public/images/preview.gif b/images/preview.gif similarity index 100% rename from public/images/preview.gif rename to images/preview.gif diff --git a/public/images/preview.png b/images/preview.png similarity index 100% rename from public/images/preview.png rename to images/preview.png diff --git a/public/images/readmecall.png b/images/readmecall.png similarity index 100% rename from public/images/readmecall.png rename to images/readmecall.png diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 835b7f2..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1217 +0,0 @@ -{ - "name": "video-chat2", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/body-parser": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", - "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", - "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.16.9", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", - "integrity": "sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==", - "requires": { - "@types/node": "*", - "@types/range-parser": "*" - } - }, - "@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" - }, - "@types/node": { - "version": "12.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", - "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==" - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" - }, - "@types/serve-static": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deprecate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz", - "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "dotenv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", - "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "engine.io": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz", - "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==", - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~6.1.0" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", - "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "heroku-ssl-redirect": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/heroku-ssl-redirect/-/heroku-ssl-redirect-0.0.4.tgz", - "integrity": "sha1-IboHB6pQO1CkEqCUar+qiO99CCw=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pop-iterate": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", - "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" - }, - "prettier": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", - "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", - "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", - "requires": { - "asap": "^2.0.0", - "pop-iterate": "^1.0.1", - "weak-map": "^1.0.5" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } - } - }, - "rootpath": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz", - "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "scmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.0.0.tgz", - "integrity": "sha1-JHEQ7yLM+JexOj8KvdtSeCOTzWo=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "socket.io": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz", - "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.3.1", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.2.0", - "socket.io-parser": "~3.3.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" - }, - "socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.3.1", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "twilio": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.34.0.tgz", - "integrity": "sha512-LBOOyT2NZJXe3gnC2kGmtqopKRiKDjGQjDK93IJ0+5ePUIh77huulaWHkdwaoD1ejL3gKs+K+P3MVIkFHeAqUQ==", - "requires": { - "@types/express": "^4.17.1", - "deprecate": "1.0.0", - "jsonwebtoken": "^8.5.1", - "lodash": "^4.17.15", - "moment": "^2.24.0", - "q": "2.0.x", - "request": "^2.88.0", - "rootpath": "0.1.2", - "scmp": "2.0.0", - "xmlbuilder": "9.0.1" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "weak-map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", - "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xmlbuilder": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.1.tgz", - "integrity": "sha1-kc1wiXdVNj66V8Et3uq0o0GmH2U=" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index fd31563..0000000 --- a/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "video-chat2", - "version": "1.0.0", - "description": "", - "main": "server.js", - "scripts": { - "start": "node server.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "See License", - "dependencies": { - "dotenv": "^8.1.0", - "express": "^4.17.1", - "heroku-ssl-redirect": "0.0.4", - "socket.io": "^2.2.0", - "twilio": "^3.34.0" - }, - "devDependencies": { - "prettier": "2.0.2" - } -} diff --git a/public/chat.html b/public/chat.html deleted file mode 100644 index 9192e56..0000000 --- a/public/chat.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - Zipcall - - - - - - - - - - - - - - - -

- -
-

No webcam input

- -
- -
-
-
-
-
- -
-
- -
-
- -
Mute
-
- - - - - - - - -
- -
Pause Video
-
- -
- -
Share Screen
-
- -
- -
Show Chat
-
- -
- -
Toggle Picture in Picture
-
- -
- -
- Start Live Caption -
-
- -
- -
End Call
-
-
- - - - - - - - - diff --git a/public/css/chat.css b/public/css/chat.css deleted file mode 100644 index a3a3bb1..0000000 --- a/public/css/chat.css +++ /dev/null @@ -1,572 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Fira+Sans:600|Heebo:400,500,700&display=swap"); - -/*Fade in page on load*/ -@-webkit-keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@-moz-keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* End Fade in page on load*/ - -body { - background: #16171b; - margin: 0; - padding: 0; - opacity: 0; /* make things invisible upon start */ - -webkit-animation: fadeIn ease-in 1; - -moz-animation: fadeIn ease-in 1; - animation: fadeIn ease-in 1; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - animation-fill-mode: forwards; - -webkit-animation-duration: 0.3s; - -moz-animation-duration: 0.3s; - animation-duration: 0.3s; - overflow: hidden; -} - -video { - background: #16171a; -} - -#header { - position: absolute; - color: white; - font-family: "Fira Sans", sans-serif; - font-weight: 600; - font-size: 1rem; - white-space: nowrap; - top: 20px; - left: 20px; - float: left; -} - -#header p, -img { - float: left; - padding: 7px; -} - -#header, -a { - color: white; - text-decoration: none; -} - -/*Moveable local video id*/ -#moveable { - z-index: 100; - position: absolute; - width: 15%; - cursor: move; -} - -/*Text inside local video*/ -#moveable p { - z-index: 101; - position: absolute; - color: white; - font-family: "Heebo", sans-serif; - white-space: nowrap; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - font-weight: bold; - background: rgba(0, 0, 0, 0.12); - padding: 10px; - border-radius: 5px; -} - -#local-video { - width: 100%; - height: auto; - border-radius: 10px; - -webkit-transform: scaleX(-1); - transform: scaleX(-1); - background: #16171a; -} - -/*caption text*/ -#remote-video-text { - box-sizing: border-box; - margin: 0; - width: 65vw; - position: absolute; - top: calc(80%); - left: 20vw; - z-index: 1; - color: white; - font-family: "Heebo", sans-serif; - font-size: 1.2rem; - font-weight: bold; - text-align: left; - background: rgba(0, 0, 0, 0.2); - border-radius: 0 0 10px 10px; - padding: 10px; -} - -#remote-video { - padding: 0; - margin: 0; - position: absolute; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - width: 65%; - height: auto; - max-height: 100%; - max-width: 100%; - border-radius: 10px; - background-image: url(../images/loader.gif); - background-size: 400px auto; - background-repeat: no-repeat; - background-position: center center; -} - -#remote-video.fullscreen { - width: 100%; -} - -/*Buttons*/ -.multi-button button { - border: none; - font-size: 1.5rem; - transition: all 0.3s ease-in-out; - color: gray; - background: transparent; - cursor: pointer; - padding: 7px; - border-radius: 5px; -} - -button:focus { - outline: none; -} - -button:hover { - color: white; -} - -.multi-button { - position: absolute; - left: calc(7.5vw - 40px); - top: 50%; - -ms-transform: translate(0%, -50%); - transform: translate(0%, -50%); - z-index: 999; - border-radius: 10px; - background: #16171a; - box-shadow: 9px 9px 16px #0a0b0c, -9px -9px 16px #222328; - padding: 15px; - display: flex; - flex-direction: column; - justify-content: space-around; - /* grid-gap: 0.2rem; */ - width: 40px; -} - -.HoverState { - color: white; - font-family: "Heebo", sans-serif; - font-size: 0.8rem; - position: absolute; - left: 60px; - white-space: nowrap; - top: 0px; - font-weight: bold; - background: #16171a; - padding: 10px; - border-radius: 10px; -} - -.buttonContainer { - position: relative; - margin: 0 auto; -} - -/*.fa-phone-slash {*/ -/* color: #470000;*/ -/*}*/ - -/*End buttons*/ - -/*Text chat*/ -#entire-chat { - position: absolute; - height: 100%; - right: 0; - width: 17.5vw; - padding: 0; -} - -.compose { - width: calc(17.5vw - 40px); - height: 60px; - font-family: "Heebo", sans-serif; - position: fixed; - bottom: 0; - right: 0; - z-index: 100; - border-radius: 20px; - box-shadow: 6px 6px 12px #030506, -6px -6px 12px #292a30; - margin: 20px; - box-sizing: border-box; - padding: 16px; - background: #1c1d22; - overflow-x: hidden; - overflow: -moz-scrollbars-none; - -ms-overflow-style: none; - scrollbar-width: none; -} - -.compose input { - /*font-family: inherit;*/ - font-size: 0.8rem; - border: none; - width: 100%; - height: calc(100% - 5px); - resize: none; - outline: none; - background-color: inherit; - color: white; -} - -.compose input::placeholder { - color: white; - font-size: 0.8rem; -} - -#chat-zone { - padding-top: 20px; - box-sizing: border-box; - position: absolute; - height: 100%; - right: 0; - width: 17.5vw; - overflow: scroll; - font-family: "Heebo", sans-serif; - font-size: 0.8rem; -} - -#chat-zone::-webkit-scrollbar { - width: 0 !important; -} - -#chat-zone .chat-messages .message-item { - position: relative; - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: flex-end; - padding: 0 16px 4px; - margin-bottom: 10px; -} - -.chat-messages { - overflow-x: hidden; - padding-bottom: 80px; - overflow: -moz-scrollbars-none; -} - -#chat-zone .chat-messages .message-item.customer { - padding-left: 40px; -} - -/*received messages*/ -#chat-zone .message-item.moderator .message-bloc { - background-color: rgb(29, 30, 33); - color: #fff; - position: relative; - display: flex; - align-items: center; - justify-content: center; - padding: 12px; - max-width: 100%; - border-radius: 20px 20px 20px 5px; - box-shadow: 6px 6px 12px #030506, -6px -6px 12px #23242a; -} - -/*sent messages*/ -#chat-zone .message-item.customer .message-bloc { - background-color: rgb(47, 48, 52); - color: #fff; - border-radius: 20px 20px 5px 20px; - box-shadow: 6px 6px 12px #030506, -6px -6px 12px #22232a; -} - -#chat-zone .chat-messages .message-item.customer .message-bloc { - margin-left: auto; -} - -#chat-zone .chat-messages .message-item .message-bloc { - position: relative; - display: flex; - align-items: center; - justify-content: center; - padding: 12px; - max-width: 100%; -} - -.message { - word-break: break-all; -} - -.message a { - text-decoration: underline; -} - -.cssanimation { - animation-duration: 1s; - animation-fill-mode: both; -} - -.fadeInBottom { - animation-name: fadeInBottom; -} -@keyframes fadeInBottom { - from { - opacity: 0; - transform: translateY(200%); - } - to { - opacity: 1; - } -} - -/*End text chat*/ - -/* Begin mobile layout */ - -@media (max-width: 640px) { - /* @media (min-width: 320px) and (max-width: 480px) { */ - - html, - body { - width: 100%; - height: 100%; - font-size: 1em; - } - - #header { - z-index: 5; - } - - #header img { - width: auto; - height: 2rem; - } - - #header p { - margin: 0; - line-height: 2rem; - } - - #remote-video { - /* width: 75vw; - height: calc((16/9) * 75vw); */ - width: 100%; - height: 100%; - /* border: 3px solid red; */ - } - - #moveable { - position: fixed; - top: 5rem; - left: 5rem; - min-width: 20%; - min-height: 10%; - width: initial; - height: initial; - max-width: 25%; - } - - #moveable #local-video { - width: auto; - height: auto; - max-width: 100%; - max-height: 100%; - } - - #moveable p { - text-align: center; - z-index: 101; - position: absolute; - color: white; - font-family: "Heebo", sans-serif; - white-space: pre-wrap; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - font-weight: bold; - font-size: 1rem; - background: rgba(0, 0, 0, 0.12); - padding: 10px; - border-radius: 5px; - margin: 0; - } - - #remote-video-text { - position: fixed; - top: 60% !important; - bottom: initial; - left: initial; - width: 80%; - height: auto; - margin: 0; - margin-left: 10%; - text-align: center; - } - - .multi-button { - position: fixed; - left: 0; - top: initial; - bottom: 0; - width: 80vw; - height: 3rem; - margin: 0 10vw; - -ms-transform: translate(0%, 0%); - transform: translate(0%, 0%); - z-index: 999; - box-shadow: none; - border-radius: 10px; - padding: 0; - /* display: flex; */ - flex-direction: row; - /* overflow: hidden; */ - } - - .buttonContainer { - position: relative; - height: 100%; - font-size: 3rem; - display: flex; - flex-direction: column; - align-items: center; - min-width: 0; - width: 100%; - margin: 0; - /* line-height: 1.5rem; */ - } - - .multi-button button { - position: relative; - width: 100%; - border: none; - font-size: 2rem; - transition: all 0.3s ease-in-out; - color: gray; - background: transparent; - cursor: pointer; - padding: 7px; - border-radius: 5px; - } - - .HoverState { - display: none !important; - } - - .buttonContainer:nth-child(3), - .buttonContainer:nth-child(5) { - display: none; - } - - #entire-chat { - position: absolute; - top: 3rem; - right: 0; - height: calc(100% - 3rem - 3rem); - width: 100vw; - /* padding: 1rem 0; */ - padding: 0; - /* border: 3px solid green; */ - text-align: center; - /* background: #16171a; */ - } - - #chat-zone { - position: relative; - padding-top: 20px; - width: 100%; - height: calc(100% - 2rem); - margin-left: 0; - /* box-shadow: 4px 4px 12px #030506, -4px -4px 12px #292a30; */ - /* border: 5px solid blue */ - border-radius: 10px; - /* background: #16171a; */ - } - - #chat-zone .message-item.moderator .message-bloc, - #chat-zone .message-item.customer .message-bloc { - box-shadow: none; - } - - .compose { - position: absolute; - font-size: 0.8rem; - left: 10%; - right: initial; - /* bottom: calc(3rem + 2rem); */ - bottom: 0; - width: 80%; - height: 2rem; - margin: 0.5rem 0; - padding: 0; - box-shadow: none; - } - - .compose input { - width: 90%; - height: 2rem; - line-height: 2rem; - } - - .compose input::placeholder { - color: white; - } -} - -/*Hide video controls on mobile*/ -/*todo: still buggy on iOS, play/pause button pops up on load for iOS, - goes away after you press pause then play again*/ -video ::-webkit-media-controls-panel { - display: none !important; - -webkit-appearance: none; -} - -video ::--webkit-media-controls-play-button { - display: none !important; - -webkit-appearance: none; -} - -video ::-webkit-media-controls-start-playback-button { - display: none !important; - -webkit-appearance: none; -} - -/* End mobile layout */ diff --git a/public/css/landing.css b/public/css/landing.css deleted file mode 100755 index f65815f..0000000 --- a/public/css/landing.css +++ /dev/null @@ -1,3511 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Fira+Sans:600|Lato:400&display=swap"); - -html { - line-height: 1.15; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -article, -aside, -footer, -header, -nav, -section { - display: block; -} - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -figcaption, -figure, -main { - display: block; -} - -figure { - margin: 1em 40px; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -pre { - font-family: monospace, monospace; - font-size: 1em; -} - -a { - background-color: transparent; - -webkit-text-decoration-skip: objects; -} - -abbr[title] { - border-bottom: none; - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -b, -strong { - font-weight: inherit; -} - -b, -strong { - font-weight: bolder; -} - -code, -kbd, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -dfn { - font-style: italic; -} - -mark { - background-color: #ff0; - color: #000; -} - -small { - font-size: 80%; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -audio, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -img { - border-style: none; -} - -svg:not(:root) { - overflow: hidden; -} - -button, -input, -optgroup, -select, -textarea { - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -legend { - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; -} - -progress { - display: inline-block; - vertical-align: baseline; -} - -textarea { - overflow: auto; -} - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; - padding: 0; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -[type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; -} - -[type="search"]::-webkit-search-cancel-button, -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; -} - -details, -menu { - display: block; -} - -summary { - display: list-item; -} - -canvas { - display: inline-block; -} - -template { - display: none; -} - -[hidden] { - display: none; -} - -@media (min-width: 641px) { - .has-animations [class*="reveal-"] { - opacity: 0; - will-change: opacity, transform; - } - - .has-animations .reveal-from-top { - transform: translateY(-10px); - } - - .has-animations .reveal-from-bottom { - transform: translateY(10px); - } - - .has-animations .reveal-from-left { - transform: translateX(-10px); - } - - .has-animations .reveal-from-right { - transform: translateX(10px); - } - - .has-animations .reveal-scale-up { - transform: scale(0.95); - } - - .has-animations .reveal-scale-down { - transform: scale(1.05); - } - - .has-animations .reveal-rotate-from-left { - transform: perspective(1000px) rotateY(-45deg); - } - - .has-animations .reveal-rotate-from-right { - transform: perspective(1000px) rotateY(45deg); - } - - .has-animations.is-loaded [class*="reveal-"] { - transition: opacity 1s cubic-bezier(0.39, 0.575, 0.565, 1), - transform 1s cubic-bezier(0.39, 0.575, 0.565, 1); - } - - .has-animations.is-loaded [class*="reveal-"].is-revealed { - opacity: 1; - transform: translate(0); - } -} - -html { - box-sizing: border-box; -} - -*, -*:before, -*:after { - box-sizing: inherit; -} - -body { - background: #16171b; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -hr { - border: 0; - display: block; - height: 1px; - background: #292b32; - margin-top: 24px; - margin-bottom: 24px; -} - -ul, -ol { - margin-top: 0; - padding-left: 24px; -} - -ul:not(:last-child), -ol:not(:last-child) { - margin-bottom: 24px; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li:not(:last-child) { - margin-bottom: 12px; -} - -li > ul, -li > ol { - margin-top: 12px; - margin-bottom: 0; -} - -dl { - margin-top: 0; - margin-bottom: 24px; -} - -dt { - font-weight: 700; -} - -dd { - margin-left: 24px; - margin-bottom: 24px; -} - -img { - border-radius: 2px; -} - -img, -svg, -video { - display: block; - height: auto; - max-width: 100%; -} - -figure { - margin: 48px 0; -} - -figcaption { - padding: 8px 0; -} - -table { - font-size: 16px; - line-height: 24px; - letter-spacing: -0.1px; - border-collapse: collapse; - margin-bottom: 24px; - width: 100%; -} - -tr { - border-bottom: 1px solid #292b32; -} - -th { - font-weight: 700; - text-align: left; -} - -th, -td { - padding: 8px 16px; -} - -th:first-child, -td:first-child { - padding-left: 0; -} - -th:last-child, -td:last-child { - padding-right: 0; -} - -.invert-color hr { - display: block; - height: 1px; - background: #e5e9ff; -} - -.invert-color tr { - border-bottom: 1px solid #e5e9ff; -} - -html { - font-size: 20px; - line-height: 32px; - letter-spacing: -0.1px; -} - -body { - color: #959cb1; - font-size: 1rem; -} - -body, -button, -input, -select, -textarea { - font-family: "Lato", sans-serif; - font-weight: 400; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Fira Sans", sans-serif; - font-weight: 600; - clear: both; - color: #f9faff; - word-wrap: break-word; - overflow-wrap: break-word; -} - -h1, -.h1 { - font-size: 38px; - line-height: 48px; -} - -h2, -.h2 { - font-size: 32px; - line-height: 42px; -} - -h3, -.h3 { - font-size: 24px; - line-height: 34px; - letter-spacing: -0.1px; -} - -h4, -.h4 { - font-size: 24px; - line-height: 34px; - letter-spacing: -0.1px; -} - -h5, -.h5 { - font-size: 20px; - line-height: 32px; - letter-spacing: -0.1px; -} - -h6, -.h6, -small, -.text-sm { - font-size: 18px; - line-height: 30px; - letter-spacing: -0.1px; -} - -.text-xs { - font-size: 16px; - line-height: 24px; - letter-spacing: -0.1px; -} - -.text-xxs { - font-size: 14px; - line-height: 22px; -} - -figcaption { - font-size: 14px; - line-height: 22px; -} - -a:not(.button) { - color: inherit; -} - -a:not(.button):hover, -a:not(.button):active { - color: #f9faff; - outline: 0; -} - -a.button-link { - color: #6a6f82; -} - -a.button-link:hover, -a.button-link:active { - color: #959cb1; -} - -a.func-link { - color: #376df9; -} - -a.func-link:hover, -a.func-link:active { - color: #6991fa; -} - -h1, -.h1 { - margin-top: 48px; - margin-bottom: 32px; -} - -h2, -.h2 { - margin-top: 48px; - margin-bottom: 32px; -} - -h3, -.h3 { - margin-top: 36px; - margin-bottom: 24px; -} - -h4, -h5, -h6, -.h4, -.h5, -.h6 { - margin-top: 24px; - margin-bottom: 24px; -} - -p { - margin-top: 0; - margin-bottom: 24px; -} - -dfn, -cite, -em, -i { - font-style: italic; -} - -blockquote { - font-size: 20px; - line-height: 32px; - letter-spacing: -0.1px; - margin-top: 24px; - margin-bottom: 24px; - margin-left: 24px; -} - -blockquote::before { - content: "\201C"; -} - -blockquote::after { - content: "\201D"; -} - -blockquote p { - display: inline; -} - -address { - border-width: 1px 0; - border-style: solid; - border-color: #292b32; - padding: 24px 0; - margin: 0 0 24px; -} - -pre, -pre h1, -pre h2, -pre h3, -pre h4, -pre h5, -pre h6, -pre .h1, -pre .h2, -pre .h3, -pre .h4, -pre .h5, -pre .h6 { - font-family: "Courier 10 Pitch", Courier, monospace; -} - -pre, -code, -kbd, -tt, -var { - background: #0d0d10; -} - -pre { - font-size: 16px; - line-height: 24px; - letter-spacing: -0.1px; - max-width: 100%; - overflow: auto; - padding: 24px 24px; - margin-top: 24px; - margin-bottom: 24px; -} - -code, -kbd, -tt, -var { - font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; - font-size: 16px; - line-height: 24px; - letter-spacing: -0.1px; - padding: 2px 4px; -} - -abbr, -acronym { - cursor: help; -} - -mark, -ins { - text-decoration: none; -} - -b, -strong { - font-weight: 700; -} - -.invert-color { - color: #6a6f82; -} - -.invert-color a:not(.button):hover, -.invert-color a:not(.button):active { - color: #1c1d22; - outline: 0; -} - -.invert-color a.button-link:hover, -.invert-color a.button-link:active { - color: #376df9; -} - -.invert-color a.func-link:hover, -.invert-color a.func-link:active { - color: #6991fa; -} - -.invert-color h1, -.invert-color h2, -.invert-color h3, -.invert-color h4, -.invert-color h5, -.invert-color h6, -.invert-color .h1, -.invert-color .h2, -.invert-color .h3, -.invert-color .h4, -.invert-color .h5, -.invert-color .h6 { - color: #16171b; -} - -.invert-color address { - border-color: #e5e9ff; -} - -.invert-color pre, -.invert-color code, -.invert-color kbd, -.invert-color tt, -.invert-color var { - background: #0d0d10; -} - -@media (max-width: 640px) { - .h1-mobile { - font-size: 38px; - line-height: 48px; - } - - .h2-mobile { - font-size: 32px; - line-height: 42px; - } - - .h3-mobile { - font-size: 24px; - line-height: 34px; - letter-spacing: -0.1px; - } - - .h4-mobile { - font-size: 24px; - line-height: 34px; - letter-spacing: -0.1px; - } - - .h5-mobile { - font-size: 20px; - line-height: 32px; - letter-spacing: -0.1px; - } - - .h6-mobile { - font-size: 18px; - line-height: 30px; - letter-spacing: -0.1px; - } -} - -@media (min-width: 641px) { - h1, - .h1 { - font-size: 44px; - line-height: 54px; - } - - h2, - .h2 { - font-size: 38px; - line-height: 48px; - } - - h3, - .h3 { - font-size: 32px; - line-height: 42px; - } -} - -.container, -.container-sm, -.container-xs { - width: 100%; - margin: 0 auto; - padding-left: 16px; - padding-right: 16px; -} - -@media (min-width: 481px) { - .container, - .container-sm, - .container-xs { - padding-left: 24px; - padding-right: 24px; - } -} - -.container { - max-width: 1128px; -} - -.container-sm { - max-width: 944px; -} - -.container-xs { - max-width: 668px; -} - -[class*="container"] [class*="container"] { - padding-left: 0; - padding-right: 0; -} - -[class*="container"] .container-sm { - max-width: 896px; -} - -[class*="container"] .container-xs { - max-width: 620px; -} - -.button { - display: inline-flex; - font-size: 14px; - line-height: 22px; - font-weight: 700; - padding: 12px 31px; - height: 48px; - text-decoration: none !important; - text-transform: uppercase; - color: #6a6f82; - background-color: #f9faff; - border-width: 1px; - border-style: solid; - border-color: rgba(0, 0, 0, 0); - border-radius: 2px; - cursor: pointer; - justify-content: center; - text-align: center; - letter-spacing: inherit; - white-space: nowrap; - transition: background 0.15s ease; -} - -.button:active { - outline: 0; -} - -.button:hover { - background-color: #fff; -} - -.button.is-loading { - position: relative; - color: transparent !important; - pointer-events: none; -} - -.button.is-loading::after { - content: ""; - display: block; - position: absolute; - width: 22px; - height: 22px; - margin-left: -11px; - margin-top: -11px; - top: 50%; - left: 50%; - border: 2px solid #6a6f82; - border-radius: 50%; - border-right-color: transparent !important; - border-top-color: transparent !important; - z-index: 1; - -webkit-animation: button-loading 0.6s infinite linear; - animation: button-loading 0.6s infinite linear; -} - -.button[disabled] { - cursor: not-allowed; - color: #16171b; - background-color: #292b32 !important; -} - -.button[disabled].is-loading::after { - border-color: #16171b; -} - -.button-sm { - padding: 6px 23px; - height: 36px; -} - -.button-dark { - color: #f9faff; - background-color: #292b32; -} - -.button-dark:hover { - background-color: #30323a; -} - -.button-dark.is-loading::after { - border-color: #f9faff; -} - -.button-primary { - color: #f9faff; - background-color: #376df9; -} - -.button-primary:hover { - background-color: #4678f9; -} - -.button-primary.is-loading::after { - border-color: #f9faff; -} - -.button-secondary { - color: #f9faff; - background-color: #ff5fa0; -} - -.button-secondary:hover { - background-color: #ff6ea9; -} - -.button-secondary.is-loading::after { - border-color: #f9faff; -} - -.button-block { - display: flex; - width: 100%; -} - -.button-group { - display: flex; - flex-wrap: wrap; - align-items: center; - margin-right: -8px; - margin-left: -8px; - margin-top: -8px; -} - -.button-group:last-of-type { - margin-bottom: -8px; -} - -.button-group:not(:last-of-type) { - margin-bottom: 8px; -} - -.button-group > [class*="button"] { - margin: 8px; -} - -@media (max-width: 640px) { - .button-wide-mobile { - width: 100%; - max-width: 280px; - } -} - -@-webkit-keyframes button-loading { - 0% { - transform: rotate(0); - } - 100% { - transform: rotate(360deg); - } -} - -@keyframes button-loading { - 0% { - transform: rotate(0); - } - 100% { - transform: rotate(360deg); - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -.form-label, -.form-switch { - color: #6a6f82; - font-weight: 500; -} - -.form-label { - font-size: 14px; - line-height: 22px; -} - -.form-input, -.form-select, -.form-checkbox input, -.form-radio input { - -moz-appearance: none; - -webkit-appearance: none; - background-color: #f9faff; - border-width: 1px; - border-style: solid; - border-color: #16171b; -} - -.form-input:hover, -.form-select:hover, -.form-checkbox input:hover, -.form-radio input:hover { - border-color: #6a6f82; -} - -.form-input:active, -.form-input:focus, -.form-select:active, -.form-select:focus, -.form-checkbox input:active, -.form-checkbox input:focus, -.form-radio input:active, -.form-radio input:focus { - outline: none; - border-color: #376df9; -} - -.form-input[disabled], -.form-select[disabled], -.form-checkbox input[disabled], -.form-radio input[disabled] { - cursor: not-allowed; - background-color: #292b32; - border-color: #1c1d22; -} - -.form-input.form-error, -.form-select.form-error, -.form-checkbox input.form-error, -.form-radio input.form-error { - border-color: #ff5fa0; -} - -.form-input.form-warning, -.form-select.form-warning, -.form-checkbox input.form-warning, -.form-radio input.form-warning { - border-color: #ffc55a; -} - -.form-input.form-success, -.form-select.form-success, -.form-checkbox input.form-success, -.form-radio input.form-success { - border-color: #1ec198; -} - -.form-input, -.form-select { - display: block; - font-size: 16px; - line-height: 24px; - letter-spacing: -0.1px; - padding: 11px 15px; - height: 48px; - border-radius: 0; - color: #16171b; - box-shadow: none; - max-width: 100%; - width: 100%; -} - -.form-input::-webkit-input-placeholder { - color: #959cb1; -} - -.form-input::-moz-placeholder { - color: #959cb1; -} - -.form-input:-ms-input-placeholder { - color: #959cb1; -} - -.form-input::-ms-input-placeholder { - color: #959cb1; -} - -.form-input::placeholder { - color: #959cb1; -} - -.form-input::-ms-input-placeholder { - color: #959cb1; -} - -textarea.form-input { - height: auto; - resize: vertical; -} - -.form-select { - padding-right: 46px; - background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8%2011.4L2.6%206%204%204.6l4%204%204-4L13.4%206%208%2011.4z%22%20fill%3D%22%23F9FAFF%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E"); - background-position: right 15px center; - background-repeat: no-repeat; - background-size: 16px 16px; -} - -.form-select-sm { - padding-right: 38px; - background-position: right 11px center; -} - -.form-select-sm, -.form-input-sm { - padding: 5px 11px; - height: 36px; -} - -.has-icon-left, -.has-icon-right { - position: relative; -} - -.has-icon-left svg, -.has-icon-right svg { - pointer-events: none; - position: absolute; - top: 50%; - transform: translateY(-50%); -} - -.has-icon-left .form-input { - padding-left: 46px; -} - -.has-icon-left .form-input + svg { - left: 15px; -} - -.has-icon-left .form-input-sm { - padding-left: 38px; -} - -.has-icon-left .form-input-sm + svg { - left: 11px; -} - -.has-icon-right .form-input { - padding-right: 46px; -} - -.has-icon-right .form-input + svg { - right: 15px; -} - -.has-icon-right .form-input-sm { - padding-right: 38px; -} - -.has-icon-right .form-input-sm + svg { - right: 11px; -} - -.form-checkbox, -.form-radio, -.form-switch { - font-size: 16px; - line-height: 24px; - letter-spacing: -0.1px; - cursor: pointer; -} - -.form-checkbox, -.form-radio { - color: #959cb1; -} - -.form-checkbox, -.form-radio { - position: relative; - padding-left: 24px; -} - -.form-checkbox input, -.form-radio input { - position: absolute; - left: 0; - top: 3px; - width: 16px; - height: 16px; - cursor: pointer; -} - -.form-checkbox input:checked, -.form-radio input:checked { - background-color: #376df9 !important; - border-color: #376df9 !important; - background-position: 50%; -} - -.form-checkbox input { - border-radius: 2px; -} - -.form-checkbox input:checked { - background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+IDxwYXRoIGQ9Ik0xMS40IDVMMTAgMy42bC00IDQtMi0yTDIuNiA3IDYgMTAuNHoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==); -} - -.form-radio input { - border-radius: 50%; -} - -.form-radio input:checked { - background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBmaWxsPSIjRkZGIiBjeD0iNyIgY3k9IjciIHI9IjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==); -} - -.form-switch { - display: inline-flex; - align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.form-switch input { - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - position: absolute; - width: 1px; -} - -.form-switch .form-switch-icon { - display: block; - position: relative; - min-width: 60px; - width: 60px; - height: 32px; - border-radius: 16px; - background: #292b32; -} - -.form-switch .form-switch-icon::before { - content: ""; - display: block; - position: absolute; - top: 2px; - left: 2px; - width: 28px; - height: 28px; - border-radius: 14px; - background: #f9faff; - transition: all 0.15s ease-out; -} - -.form-switch input:checked + .form-switch-icon { - background: #376df9; -} - -.form-switch input:checked + .form-switch-icon::before { - left: 30px; -} - -.form-switch > span:not(.form-switch-icon) { - order: -1; - margin-right: 12px; -} - -.form-switch > span:not(.form-switch-icon):last-child { - order: initial; - margin-left: 12px; - margin-right: 0; -} - -.invert-color .form-label, -.invert-color .form-switch { - color: #292b32; -} - -.invert-color .form-input, -.invert-color .form-select, -.invert-color .form-checkbox input, -.invert-color .form-radio input { - border-color: #e5e9ff; -} - -.invert-color .form-input:active, -.invert-color .form-input:focus, -.invert-color .form-select:active, -.invert-color .form-select:focus, -.invert-color .form-checkbox input:active, -.invert-color .form-checkbox input:focus, -.invert-color .form-radio input:active, -.invert-color .form-radio input:focus { - border-color: #376df9; -} - -.invert-color .form-input[disabled], -.invert-color .form-select[disabled], -.invert-color .form-checkbox input[disabled], -.invert-color .form-radio input[disabled] { - background-color: #e5e9ff; -} - -.invert-color .form-input, -.invert-color .form-select { - color: #292b32; -} - -.invert-color .form-select { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8%2011.4L2.6%206%204%204.6l4%204%204-4L13.4%206%208%2011.4z%22%20fill%3D%22%23292B32%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E"); -} - -.invert-color .form-checkbox, -.invert-color .form-radio { - color: #292b32; -} - -.invert-color .form-checkbox input:checked, -.invert-color .form-radio input:checked { - /*background-color: !important;*/ - /*border-color: !important*/ -} - -.form-group { - display: flex; -} - -.form-group .form-input { - flex-grow: 1; - flex-shrink: 1; - margin-right: 12px; -} - -.form-group .button { - padding-left: 24px; - padding-right: 24px; - flex-shrink: 0; -} - -.form-hint { - font-size: 14px; - line-height: 22px; - margin-top: 8px; -} - -@media (max-width: 640px) { - .form-group-desktop .form-input { - margin-bottom: 12px; - } - - .form-group-desktop .button { - width: 100%; - } -} - -@media (min-width: 641px) { - .form-group-desktop { - display: flex; - } - - .form-group-desktop .form-input { - flex-grow: 1; - flex-shrink: 1; - margin-right: 12px; - } - - .form-group-desktop .button { - padding-left: 24px; - padding-right: 24px; - flex-shrink: 0; - } -} - -.header-nav-toggle { - background: transparent; - border: 0; - outline: 0; - padding: 0; - cursor: pointer; -} - -.hamburger, -.hamburger-inner { - display: block; - pointer-events: none; -} - -.hamburger { - position: relative; - width: 24px; - height: 24px; -} - -.hamburger-inner, -.hamburger-inner::before, -.hamburger-inner::after { - width: 24px; - height: 2px; - position: absolute; - background: #959cb1; -} - -.invert-color .hamburger-inner, -.invert-color .hamburger-inner::before, -.invert-color .hamburger-inner::after { - background: #1c1d22; -} - -.hamburger-inner { - top: 50%; - margin-top: -1px; - transition-duration: 0.22s; - transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); -} - -.hamburger-inner::before, -.hamburger-inner::after { - content: ""; - display: block; -} - -.hamburger-inner::before { - top: -7px; - transition: top 0.1s 0.25s ease-in, opacity 0.1s ease-in; -} - -.hamburger-inner::after { - bottom: -7px; - transition: bottom 0.1s 0.25s ease-in, - transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19), - width 0.1s 0.25s ease-in; -} - -.off-nav-is-active .hamburger-inner { - transform: rotate(225deg); - transition-delay: 0.12s; - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); -} - -.off-nav-is-active .hamburger-inner::before { - top: 0; - opacity: 0; - transition: top 0.1s ease-out, opacity 0.1s 0.12s ease-out; -} - -.off-nav-is-active .hamburger-inner::after { - width: 24px; - bottom: 0; - transform: rotate(-90deg); - transition: bottom 0.1s ease-out, - transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1), - width 0.1s ease-out; -} - -.accordion li { - position: relative; -} - -.accordion li::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -.accordion li:last-of-type { - position: relative; -} - -.accordion li:last-of-type::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -.invert-color .accordion li { - position: relative; -} - -.invert-color .accordion li::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #e5e9ff; -} - -.invert-color .accordion li:last-of-type { - position: relative; -} - -.invert-color .accordion li:last-of-type::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #e5e9ff; -} - -.accordion-header { - display: flex; - justify-content: space-between; - align-items: center; - padding-top: 24px; - padding-bottom: 24px; - cursor: pointer; -} - -.accordion-header span { - width: calc(100% - (16px * 2)); -} - -.accordion-content { - max-height: 0; - opacity: 0; - overflow: hidden; - transition: max-height 0.15s ease-in-out, opacity 0.15s; -} - -.is-active .accordion-content { - opacity: 1; -} - -.accordion-content p:last-child { - margin-bottom: 24px; -} - -.accordion-icon { - position: relative; - width: 16px; - height: 16px; -} - -.accordion-icon::before, -.accordion-icon::after { - content: ""; - position: absolute; - background: #376df9; - transition: transform 0.25s ease-out; -} - -.accordion-icon::before { - top: 0; - left: 50%; - width: 2px; - height: 100%; - margin-left: -1px; -} - -.accordion-icon::after { - top: 50%; - left: 0; - width: 100%; - height: 2px; - margin-top: -1px; -} - -.is-active .accordion-icon { - cursor: pointer; -} - -.is-active .accordion-icon::before { - transform: rotate(90deg); -} - -.is-active .accordion-icon::after { - transform: rotate(180deg); -} - -.modal, -.modal::before { - bottom: 0; - left: 0; - right: 0; - top: 0; -} - -.modal { - display: none; - align-items: center; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; -} - -.modal.modal-video .modal-inner { - padding: 0; - max-width: 1024px; -} - -.modal::before, -.modal .modal-inner { - display: none; -} - -.modal::before { - content: ""; - position: absolute; - background-color: rgba(22, 23, 27, 0.88); -} - -.modal.is-active { - display: flex; -} - -.modal.is-active::before, -.modal.is-active .modal-inner { - display: block; -} - -.modal.is-active .modal-inner { - -webkit-animation: slideUpInModal 0.15s ease-in-out both; - animation: slideUpInModal 0.15s ease-in-out both; -} - -.modal.is-active::before { - -webkit-animation: slideUpInModalBg 0.15s ease-in-out both; - animation: slideUpInModalBg 0.15s ease-in-out both; -} - -.modal-inner { - max-height: calc(100vh - 16px * 2); - overflow: auto; - position: relative; - width: calc(100% - (16px * 2)); - max-width: 480px; - margin-left: 16px; - margin-right: 16px; - background: #292b32; -} - -.modal-content { - padding: 48px 16px; -} - -.modal-close { - background: transparent; - border: 0; - outline: 0; - padding: 0; - cursor: pointer; - position: absolute; - right: 24px; - top: 24px; - width: 16px; - height: 16px; -} - -.modal-close::before, -.modal-close::after { - content: ""; - display: block; - position: absolute; - top: 50%; - left: 50%; - margin-top: -1px; - margin-left: -8px; - width: 16px; - height: 2px; - background: #6a6f82; -} - -.modal-close::before { - transform: rotate(225deg); -} - -.modal-close::after { - transform: rotate(-45deg); -} - -.modal-close:hover::before, -.modal-close:hover::after { - background: #959cb1; -} - -@media (min-width: 641px) { - .modal-inner { - margin: 0 auto; - max-height: calc(100vh - 48px * 2); - } - - .modal-content { - padding-top: 48px; - padding-bottom: 48px; - padding-left: 32px; - padding-right: 32px; - } -} - -@-webkit-keyframes slideUpInModal { - 0% { - opacity: 0; - transform: translateY(-24px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes slideUpInModal { - 0% { - opacity: 0; - transform: translateY(-24px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@-webkit-keyframes slideUpInModalBg { - 0% { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes slideUpInModalBg { - 0% { - opacity: 0; - } - to { - opacity: 1; - } -} - -.carousel-item { - display: none; -} - -.carousel-item.is-loading:not(.is-active) { - display: block; - position: absolute; - visibility: hidden; - opacity: 0; -} - -.carousel-item.is-active { - display: block; -} - -.carousel-bullets { - display: inline-flex; -} - -.carousel-bullet { - display: block; - position: relative; - width: 20px; - height: 20px; - padding: 0; - cursor: pointer; - line-height: 0; - border: none; - background: transparent; -} - -.carousel-bullet::before { - content: ""; - position: absolute; - left: 6px; - top: 6px; - background: #292b32; - width: 8px; - height: 8px; - border-radius: 50%; - transition: background 0.25s ease; -} - -.carousel-bullet:focus { - outline: none; -} - -.carousel-bullet.is-active::before { - background: #6a6f82; -} - -.carousel-bullet:hover::before { - background: #959cb1; -} - -.invert-color .carousel-bullet::before { - background: #6a6f82; -} - -.invert-color .carousel-bullet.is-active::before { - background: #292b32; -} - -.invert-color .carousel-bullet:hover::before { - background: #376df9; -} - -.split-wrap { - margin-top: -24px; -} - -.split-wrap:last-of-type { - margin-bottom: -24px; -} - -.split-wrap:not(:last-of-type) { - margin-bottom: 24px; -} - -.split-wrap .split-item { - padding-top: 24px; - padding-bottom: 24px; - display: flex; - flex-direction: column; -} - -.split-wrap .split-item .split-item-image { - position: relative; - width: 100%; -} - -.split-wrap .split-item .split-item-image img, -.split-wrap .split-item .split-item-image svg, -.split-wrap .split-item .split-item-image video { - width: auto; - height: auto; - max-width: 100%; - overflow: visible; -} - -.split-wrap .split-item .split-item-image.split-item-image-fill img, -.split-wrap .split-item .split-item-image.split-item-image-fill svg, -.split-wrap .split-item .split-item-image.split-item-image-fill video { - width: 100%; -} - -@media (max-width: 640px) { - .split-wrap .split-item .split-item-content { - margin-bottom: 32px; - } - - .split-wrap.invert-mobile .split-item .split-item-content { - order: 1; - margin-bottom: 0 !important; - } - - .split-wrap.invert-mobile .split-item .split-item-image { - margin-bottom: 32px; - } -} - -@media (min-width: 641px) { - .split-wrap { - margin-top: -40px; - } - - .split-wrap:last-of-type { - margin-bottom: -40px; - } - - .split-wrap:not(:last-of-type) { - margin-bottom: 40px; - } - - .split-wrap .split-item { - padding-top: 40px; - padding-bottom: 40px; - flex-direction: row; - flex-wrap: nowrap; - align-items: center; - justify-content: flex-start; - } - - .split-wrap .split-item .split-item-content { - flex-shrink: 0; - width: 396px; - margin-bottom: 0; - margin-right: 64px; - } - - .split-wrap .split-item .split-item-image { - min-width: 436px; - } - - .split-wrap:not(.invert-desktop) .split-item:nth-child(even), - .split-wrap.invert-desktop .split-item:nth-child(odd) { - justify-content: flex-end; - } - - .split-wrap:not(.invert-desktop) - .split-item:nth-child(even) - .split-item-content, - .split-wrap.invert-desktop .split-item:nth-child(odd) .split-item-content { - order: 1; - margin-left: 64px; - margin-right: 0; - } - - .split-wrap:not(.invert-desktop) - .split-item:nth-child(odd) - .split-item-image - img, - .split-wrap:not(.invert-desktop) - .split-item:nth-child(odd) - .split-item-image - svg, - .split-wrap:not(.invert-desktop) - .split-item:nth-child(odd) - .split-item-image - video, - .split-wrap.invert-desktop .split-item:nth-child(even) .split-item-image img, - .split-wrap.invert-desktop .split-item:nth-child(even) .split-item-image svg, - .split-wrap.invert-desktop - .split-item:nth-child(even) - .split-item-image - video { - margin-left: auto; - } - - .split-wrap.align-top .split-item { - align-items: flex-start; - } -} - -@media (min-width: 821px) { - .container .split-wrap .split-item .split-item-content { - width: 488px; - } - - .container .split-wrap .split-item .split-item-image { - min-width: 528px; - } -} - -.tiles-wrap { - display: flex; - flex-wrap: wrap; - justify-content: center; - margin-right: -12px; - margin-left: -12px; - margin-top: -12px; -} - -.tiles-wrap:last-of-type { - margin-bottom: -12px; -} - -.tiles-wrap:not(:last-of-type) { - margin-bottom: 12px; -} - -.tiles-wrap.push-left::after { - content: ""; - flex-basis: 330px; - max-width: 330px; - box-sizing: content-box; - padding-left: 12px; - padding-right: 12px; - height: 0; -} - -.tiles-item { - flex-basis: 330px; - max-width: 330px; - box-sizing: content-box; - padding: 12px; -} - -.tiles-item * { - box-sizing: border-box; -} - -.tiles-item-inner { - display: flex; - flex-wrap: wrap; - flex-direction: column; - height: 100%; - padding: 32px 24px; -} - -@media (max-width: 640px) { - .section:first-of-type { - min-height: calc(100vh - (80px / 2)); - } -} - -.site-header { - position: absolute !important; - top: 0; - width: 100%; - z-index: 10 !important; -} - -.site-header + .site-content .section:first-of-type { - padding-top: 80px; -} - -.site-header .brand { - margin-right: 32px; -} - -.site-header-inner { - display: flex; - justify-content: space-between; - align-items: center; - height: 80px; -} - -.header-nav { - flex-grow: 1; -} - -.header-nav .header-nav-inner { - display: flex; - flex-grow: 1; -} - -.header-nav ul { - display: flex; - align-items: center; - flex-grow: 1; - white-space: nowrap; - margin-bottom: 0; -} - -.header-nav ul:first-of-type { - flex-wrap: wrap; -} - -.header-nav li + .header-button { - margin-left: 32px; -} - -.header-nav a:not(.button) { - display: block; - text-decoration: none; - font-weight: 500; - text-transform: uppercase; - padding: 0 32px; -} - -.invert-color .header-nav a:not(.button) { - text-decoration: none; -} - -.header-nav a.button { - margin-left: 32px; -} - -.header-nav-center:first-of-type { - flex-grow: 1; - justify-content: flex-end; -} - -.header-nav-right { - justify-content: flex-end; -} - -.header-nav-right + .header-nav-right { - flex-grow: 0; -} - -.header-nav-toggle { - display: none; -} - -@media (max-width: 640px) { - .header-nav-toggle { - display: block; - } - - .header-nav-toggle + .header-nav { - flex-direction: column; - position: absolute; - left: 0; - right: 0; - top: 100%; - z-index: 9999; - background: #292b32; - max-height: 0; - opacity: 0; - overflow: hidden; - transition: max-height 0.25s ease-in-out, opacity 0.15s; - } - - .header-nav-toggle + .header-nav.is-active { - opacity: 1; - } - - .header-nav-toggle + .header-nav .header-nav-inner { - flex-direction: column; - padding: 24px; - } - - .header-nav-toggle + .header-nav ul { - display: block; - text-align: center; - } - - .header-nav-toggle + .header-nav ul a:not(.button) { - display: inline-flex; - padding-top: 12px; - padding-bottom: 12px; - } - - .header-nav-toggle + .header-nav a.button { - margin-left: 0; - margin-top: 12px; - margin-bottom: 12px; - } -} - -.is-boxed { - background: #1b1c21; -} - -.is-boxed .body-wrap { - max-width: 1440px; - margin: 0 auto; - box-shadow: 0 20px 48px rgba(22, 23, 27, 0.8); -} - -.is-boxed .body-wrap::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #16171b; - z-index: -10; -} - -.body-wrap { - position: relative; - overflow: hidden; - display: flex; - flex-direction: column; - min-height: 100vh; -} - -.site-content { - flex: 1 0 auto; -} - -.site-footer { - position: relative; -} - -.site-footer::before { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - background: #16171b; - z-index: -3; -} - -.site-footer-inner { - padding: 48px 0; -} - -.footer-top { - padding-bottom: 12px; -} - -.footer-bottom { - padding-top: 12px; -} - -.footer-blocks { - display: flex; - flex-wrap: wrap; - margin-right: -24px; - margin-left: -24px; - margin-top: -12px; -} - -.footer-blocks:last-of-type { - margin-bottom: 28px; -} - -.footer-blocks:not(:last-of-type) { - margin-bottom: 12px; -} - -.footer-block { - flex-grow: 1; - flex-basis: 160px; - box-sizing: content-box; - padding: 12px 24px; -} - -.footer-block * { - box-sizing: border-box; -} - -.footer-block ul li:not(:last-child) { - margin-bottom: 4px; -} - -.footer-block a { - color: #6a6f82; - text-decoration: none; -} - -.footer-block a:hover, -.footer-block a:active { - color: #959cb1; -} - -.invert-color .footer-block a { - text-decoration: none; -} - -.footer-block-title { - font-size: 14px; - line-height: 22px; - font-weight: 700; - color: #f9faff; - text-transform: uppercase; - margin-bottom: 8px; -} - -.invert-color .footer-block-title { - color: #16171b; -} - -.footer-social a, -.footer-nav a { - display: flex; -} - -.footer-social ul, -.footer-nav ul { - display: flex; - flex-wrap: wrap; - justify-content: center; - align-items: center; - white-space: nowrap; - margin-bottom: 0; -} - -.footer-social ul { - margin-right: -16px; - margin-left: -16px; -} - -.footer-social li { - padding: 0 8px; -} - -.footer-social a { - padding: 8px; -} - -.footer-social a svg { - fill: #376df9; - transition: fill 0.15s ease; -} - -.footer-social a:hover svg { - fill: #6991fa; -} - -.footer-nav { - margin-right: -12px; - margin-left: -12px; -} - -.footer-nav a { - color: #6a6f82; - text-decoration: none; - padding: 0 12px; -} - -.footer-nav a:hover, -.footer-nav a:active { - color: #959cb1; -} - -.invert-color .footer-nav a { - text-decoration: none; -} - -@media (max-width: 640px) { - .footer-top > *:not(:last-child), - .footer-bottom > *:not(:last-child) { - margin-bottom: 24px; - } -} - -@media (min-width: 641px) { - .site-footer-inner { - padding: 64px 0; - } - - .footer-top.space-between, - .footer-bottom.space-between { - display: flex; - justify-content: space-between; - align-items: center; - } - - .footer-top.invert-order-desktop > *:first-child, - .footer-bottom.invert-order-desktop > *:first-child { - order: 1; - } -} - -.section-inner { - position: relative; - padding-top: 48px; - padding-bottom: 48px; -} - -.section-header { - padding-bottom: 48px; -} - -@media (min-width: 641px) { - .section-inner { - padding-top: 80px; - padding-bottom: 80px; - } - - .section-header { - padding-bottom: 80px; - } -} - -.hero-inner > .hero-content + .hero-figure, -.hero-inner > .hero-figure + .hero-content { - margin-top: 48px; -} - -.hero-inner > .hero-figure > a { - display: inline-flex; - align-items: center; - vertical-align: top; -} - -@media (max-width: 640px) { - .hero .split-wrap .split-item .split-item-content { - margin-bottom: 48px; - } - - .hero .split-wrap.invert-mobile .split-item .split-item-image { - margin-bottom: 48px; - } -} - -@media (min-width: 641px) { - .hero-inner > .hero-content + .hero-figure, - .hero-inner > .hero-figure + .hero-content { - margin-top: 64px; - } -} - -@media (min-width: 641px) { - .features-split .section-header { - padding-bottom: 92px; - } -} - -.features-tiles .tiles-wrap { - margin-right: -16px; - margin-left: -16px; - margin-top: -16px; -} - -.features-tiles .tiles-wrap:last-of-type { - margin-bottom: -16px; -} - -.features-tiles .tiles-wrap:not(:last-of-type) { - margin-bottom: 16px; -} - -.features-tiles .tiles-wrap.push-left::after { - flex-basis: 360px; - max-width: 360px; - padding-left: 16px; - padding-right: 16px; -} - -.features-tiles .tiles-item { - flex-basis: 360px; - max-width: 360px; - padding: 16px; -} - -.features-tiles .tiles-item-inner { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; -} - -@media (min-width: 641px) { - .features-tiles .tiles-wrap { - margin-right: -32px; - margin-left: -32px; - margin-top: -32px; - } - - .features-tiles .tiles-wrap:last-of-type { - margin-bottom: -32px; - } - - .features-tiles .tiles-wrap:not(:last-of-type) { - margin-bottom: 32px; - } - - .features-tiles .tiles-wrap.push-left::after { - padding-left: 32px; - padding-right: 32px; - } - - .features-tiles .tiles-item { - padding: 32px; - } -} - -.pricing .tiles-wrap.push-left::after { - flex-basis: 344px; - max-width: 344px; -} - -.pricing .tiles-item { - flex-basis: 344px; - max-width: 344px; -} - -.pricing .tiles-item-inner { - padding-top: 24px; - padding-bottom: 24px; - padding-left: 24px; - padding-right: 24px; -} - -.pricing-item-content { - flex-grow: 1; - width: 100%; -} - -ul.pricing-item-features-list li { - display: flex; - align-items: center; - margin-bottom: 12px; -} - -.pricing-switcher { - margin-bottom: 48px; -} - -@media (min-width: 641px) { - .pricing-switcher { - margin-bottom: 64px; - } -} - -.testimonial .tiles-wrap.push-left::after { - flex-basis: 344px; - max-width: 344px; -} - -.testimonial .tiles-item { - flex-basis: 344px; - max-width: 344px; -} - -.testimonial .tiles-item-inner { - padding-top: 20px; - padding-bottom: 20px; - padding-left: 24px; - padding-right: 24px; -} - -.testimonial-item-content { - flex-grow: 1; -} - -.testimonial-item-source { - display: inline-flex; - flex-wrap: wrap; - align-items: center; -} - -.team .tiles-wrap { - margin-right: -16px; - margin-left: -16px; - margin-top: -16px; -} - -.team .tiles-wrap:last-of-type { - margin-bottom: -16px; -} - -.team .tiles-wrap:not(:last-of-type) { - margin-bottom: 16px; -} - -.team .tiles-wrap.push-left::after { - flex-basis: 296px; - max-width: 296px; - padding-left: 16px; - padding-right: 16px; -} - -.team .tiles-item { - flex-basis: 296px; - max-width: 296px; - padding: 16px; -} - -.team .tiles-item-inner { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; -} - -@media (min-width: 641px) { - .team .section-header { - padding-bottom: 80px; - } - - .team .tiles-wrap { - margin-right: -32px; - margin-left: -32px; - margin-top: -32px; - } - - .team .tiles-wrap:last-of-type { - margin-bottom: -32px; - } - - .team .tiles-wrap:not(:last-of-type) { - margin-bottom: 32px; - } - - .team .tiles-wrap.push-left::after { - padding-left: 32px; - padding-right: 32px; - } - - .team .tiles-item { - padding: 32px; - } -} - -.cta .section-inner { - padding-top: 48px; - padding-bottom: 48px; -} - -.cta-slogan { - margin-bottom: 40px; -} - -@media (min-width: 641px) { - .cta .section-inner { - padding-top: 64px; - padding-bottom: 64px; - } - - .cta-split { - display: flex; - justify-content: space-between; - align-items: center; - } - - .cta-split .cta-slogan { - margin-bottom: 0; - margin-right: 48px; - } -} - -.clients .section-inner { - padding-top: 26px; - padding-bottom: 26px; -} - -.clients-inner ul { - display: flex; - flex-wrap: wrap; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 0; -} - -.clients-inner li { - padding: 12px 28px; -} - -@media (min-width: 641px) { - .clients .clients-inner ul { - flex-direction: row; - } -} - -.signin .section-header { - padding-bottom: 32px; -} - -.signin .tiles-item-inner { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; -} - -@media (min-width: 641px) { - .signin .section-header { - padding-bottom: 48px; - } -} - -.signin-footer { - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} - -[class*="illustration-"] { - position: relative; -} - -[class*="illustration-"]::after { - pointer-events: none; -} - -[class*="illustration-element-"]::after { - z-index: -1; -} - -[class*="illustration-section-"]::after { - z-index: -2; -} - -.illustration-section-01::after { - content: ""; - position: absolute; - width: 100%; - max-width: 100%; - height: 612px; - background-image: url(../images/illustration-section-01.svg); - background-repeat: no-repeat; - background-size: auto; - left: 50%; - top: 0; - background-position: center top; - transform: translate(-50%); -} - -.illustration-section-02::after { - content: ""; - position: absolute; - width: 100%; - max-width: 100%; - height: 612px; - background-image: url(../images/illustration-section-02.svg); - background-repeat: no-repeat; - background-size: auto; - left: 50%; - top: 0; - background-position: center top; - transform: translate(-50%); -} - -.site-footer { - color: #6a6f82; -} - -.features-tiles-item-image { - display: inline-flex; - border-radius: 50%; - background: radial-gradient( - circle at bottom, - #376df9 0%, - #ff79af 50%, - #ff8d74 100% - ); -} - -.pricing .tiles-item-inner { - background: #292b32; -} - -.pricing-item-header { - position: relative; -} - -.pricing-item-header::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -.pricing-item-header::after { - background: rgba(106, 111, 130, 0.32); - max-width: 88px; -} - -.pricing-item-price-currency { - color: #959cb1; -} - -ul.pricing-item-features-list { - position: relative; -} - -ul.pricing-item-features-list::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -ul.pricing-item-features-list::after { - background: rgba(106, 111, 130, 0.32); -} - -ul.pricing-item-features-list li { - margin-bottom: 0; - padding: 14px 0; - position: relative; -} - -ul.pricing-item-features-list li::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -ul.pricing-item-features-list li::before { - background: rgba(106, 111, 130, 0.32); -} - -ul.pricing-item-features-list li::after { - content: ""; - display: block; - width: 24px; - height: 24px; - margin-right: 12px; - background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%2011h14v2H5z%22%20fill%3D%22%236A6F82%22%20fill-rule%3D%22nonzero%22%2F%3E%3C%2Fsvg%3E"); - background-repeat: no-repeat; - order: -1; -} - -ul.pricing-item-features-list li.is-checked::after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22nonzero%22%20fill%3D%22none%22%3E%3Ccircle%20fill%3D%22%231EC198%22%20cx%3D%2212%22%20cy%3D%2212%22%20r%3D%2212%22%2F%3E%3Cpath%20fill%3D%22%23292B32%22%20d%3D%22M10.5%2012.267l-2.5-1.6-1%201.066L10.5%2016%2017%209.067%2016%208z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} - -.testimonial .tiles-item-inner { - background: #292b32; -} - -.testimonial-item-content { - position: relative; -} - -.testimonial-item-content::before { - content: ""; - display: block; - width: 24px; - height: 18px; - margin-top: 12px; - margin-bottom: 16px; - background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2224%22%20height%3D%2218%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M0%2013.481c0-2.34.611-4.761%201.833-7.263C3.056%203.716%204.733%201.643%206.865%200L11%202.689C9.726%204.382%208.777%206.093%208.152%207.824c-.624%201.73-.936%203.578-.936%205.545V18H0v-4.519zm13%200c0-2.34.611-4.761%201.833-7.263%201.223-2.502%202.9-4.575%205.032-6.218L24%202.689c-1.274%201.693-2.223%203.404-2.848%205.135-.624%201.73-.936%203.578-.936%205.545V18H13v-4.519z%22%20fill%3D%22%23FF5FA0%22%20fill-rule%3D%22nonzero%22%2F%3E%3C%2Fsvg%3E"); - background-repeat: no-repeat; -} - -.testimonial-item-footer { - font-family: "Fira Sans", sans-serif; - font-weight: 600; - padding-top: 20px; -} - -.testimonial-item-footer.has-top-divider::before { - background: rgba(106, 111, 130, 0.32); -} - -.testimonial-item-link { - color: #376df9; -} - -.testimonial-item-link a { - color: #376df9; - text-decoration: none; -} - -.testimonial-item-link a:hover { - color: #6991fa; -} - -.cta .form-input { - border-color: transparent; - border-radius: 2px; -} - -.cta-inner { - padding-left: 16px; - padding-right: 16px; - background-color: #376df9; - background: linear-gradient(100deg, #376df9 0, #ff5fa0 75%, #ffc55a 100%); -} - -@media (min-width: 641px) { - .cta .form-input { - min-width: 280px; - } - - .cta-inner { - padding-left: 48px; - padding-right: 48px; - } -} - -.screen-reader { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.list-reset { - list-style: none; - padding: 0; -} - -.list-reset li { - margin: 0; -} - -.ta-l { - text-align: left; -} - -.ta-c { - text-align: center; -} - -.ta-r { - text-align: right; -} - -.fw-400 { - font-weight: 400; -} - -.fw-500 { - font-weight: 500; -} - -.fw-600 { - font-weight: 600; -} - -.fw-700 { - font-weight: 700; -} - -.text-color-high { - color: #f9faff; -} - -.text-color-mid { - color: #959cb1; -} - -.text-color-low { - color: #6a6f82; -} - -.text-color-primary { - color: #376df9; -} - -.text-color-secondary { - color: #ff5fa0; -} - -.text-color-error { - color: #ff5fa0; -} - -.text-color-warning { - color: #ffc55a; -} - -.text-color-success { - color: #1ec198; -} - -.invert-color .text-color-high { - color: #16171b; -} - -.invert-color .text-color-mid { - color: #1c1d22; -} - -.invert-color .text-color-low { - color: #6a6f82; -} - -.tt-u { - text-transform: uppercase; -} - -.image-full { - width: 100%; -} - -.image-larger { - position: relative; - left: 50%; - transform: translateX(-50%); - width: calc(100% + 96px); - max-width: 100vw; -} - -.has-bg-color { - position: relative; - background-color: #fff; - z-index: 0; -} - -.has-shadow { - box-shadow: 0 24px 64px rgba(22, 23, 27, 0.64); -} - -img.has-shadow { - border-radius: 2px; -} - -.has-top-divider { - position: relative; -} - -.has-top-divider::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -.has-bottom-divider { - position: relative; -} - -.has-bottom-divider::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #292b32; -} - -.invert-color .has-top-divider { - position: relative; -} - -.invert-color .has-top-divider::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #e5e9ff; -} - -.invert-color .has-bottom-divider { - position: relative; -} - -.invert-color .has-bottom-divider::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - display: block; - height: 1px; - background: #e5e9ff; -} - -.center-content { - text-align: center; -} - -.center-content img, -.center-content svg, -.center-content video { - margin-left: auto; - margin-right: auto; -} - -.center-content .button-group { - justify-content: center; -} - -.responsive-video { - position: relative; - padding-bottom: 56.25%; - height: 0; -} - -.responsive-video.is-4-3 { - padding-bottom: 75%; -} - -.responsive-video iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.m-0 { - margin: 0; -} - -.mt-0 { - margin-top: 0; -} - -.mr-0 { - margin-right: 0; -} - -.mb-0 { - margin-bottom: 0; -} - -.ml-0 { - margin-left: 0; -} - -.m-4 { - margin: 4px; -} - -.mt-4 { - margin-top: 4px; -} - -.mr-4 { - margin-right: 4px; -} - -.mb-4 { - margin-bottom: 4px; -} - -.ml-4 { - margin-left: 4px; -} - -.m-8 { - margin: 8px; -} - -.mt-8 { - margin-top: 8px; -} - -.mr-8 { - margin-right: 8px; -} - -.mb-8 { - margin-bottom: 8px; -} - -.ml-8 { - margin-left: 8px; -} - -.m-12 { - margin: 12px; -} - -.mt-12 { - margin-top: 12px; -} - -.mr-12 { - margin-right: 12px; -} - -.mb-12 { - margin-bottom: 12px; -} - -.ml-12 { - margin-left: 12px; -} - -.m-16 { - margin: 16px; -} - -.mt-16 { - margin-top: 16px; -} - -.mr-16 { - margin-right: 16px; -} - -.mb-16 { - margin-bottom: 16px; -} - -.ml-16 { - margin-left: 16px; -} - -.m-24 { - margin: 24px; -} - -.mt-24 { - margin-top: 24px; -} - -.mr-24 { - margin-right: 24px; -} - -.mb-24 { - margin-bottom: 24px; -} - -.ml-24 { - margin-left: 24px; -} - -.m-32 { - margin: 32px; -} - -.mt-32 { - margin-top: 32px; -} - -.mr-32 { - margin-right: 32px; -} - -.mb-32 { - margin-bottom: 32px; -} - -.ml-32 { - margin-left: 32px; -} - -.p-0 { - padding: 0; -} - -.pt-0 { - padding-top: 0; -} - -.pr-0 { - padding-right: 0; -} - -.pb-0 { - padding-bottom: 0; -} - -.pl-0 { - padding-left: 0; -} - -.p-4 { - padding: 4px; -} - -.pt-4 { - padding-top: 4px; -} - -.pr-4 { - padding-right: 4px; -} - -.pb-4 { - padding-bottom: 4px; -} - -.pl-4 { - padding-left: 4px; -} - -.p-8 { - padding: 8px; -} - -.pt-8 { - padding-top: 8px; -} - -.pr-8 { - padding-right: 8px; -} - -.pb-8 { - padding-bottom: 8px; -} - -.pl-8 { - padding-left: 8px; -} - -.p-12 { - padding: 12px; -} - -.pt-12 { - padding-top: 12px; -} - -.pr-12 { - padding-right: 12px; -} - -.pb-12 { - padding-bottom: 12px; -} - -.pl-12 { - padding-left: 12px; -} - -.p-16 { - padding: 16px; -} - -.pt-16 { - padding-top: 16px; -} - -.pr-16 { - padding-right: 16px; -} - -.pb-16 { - padding-bottom: 16px; -} - -.pl-16 { - padding-left: 16px; -} - -.p-24 { - padding: 24px; -} - -.pt-24 { - padding-top: 24px; -} - -.pr-24 { - padding-right: 24px; -} - -.pb-24 { - padding-bottom: 24px; -} - -.pl-24 { - padding-left: 24px; -} - -.p-32 { - padding: 32px; -} - -.pt-32 { - padding-top: 32px; -} - -.pr-32 { - padding-right: 32px; -} - -.pb-32 { - padding-bottom: 32px; -} - -.pl-32 { - padding-left: 32px; -} - -.spacer-4 { - padding-top: 4px; -} - -.spacer-8 { - padding-top: 8px; -} - -.spacer-12 { - padding-top: 12px; -} - -.spacer-16 { - padding-top: 16px; -} - -.spacer-24 { - padding-top: 24px; -} - -.spacer-32 { - padding-top: 32px; -} - -.spacer-48 { - padding-top: 48px; -} - -.spacer-64 { - padding-top: 64px; -} - -@media (max-width: 640px) { - .ta-l-mobile { - text-align: left; - } - - .ta-c-mobile { - text-align: center; - } - - .ta-r-mobile { - text-align: right; - } - - .center-content-mobile { - text-align: center; - } - - .center-content-mobile img, - .center-content-mobile svg, - .center-content-mobile video { - margin-left: auto; - margin-right: auto; - } - - .center-content-mobile .button-group { - justify-content: center; - } - - .spacer-4-mobile { - padding-top: 4px; - } - - .spacer-8-mobile { - padding-top: 8px; - } - - .spacer-12-mobile { - padding-top: 12px; - } - - .spacer-16-mobile { - padding-top: 16px; - } - - .spacer-24-mobile { - padding-top: 24px; - } - - .spacer-32-mobile { - padding-top: 32px; - } - - .spacer-48-mobile { - padding-top: 48px; - } - - .spacer-64-mobile { - padding-top: 64px; - } -} - -@media (min-width: 641px) { - .ta-l-desktop { - text-align: left; - } - - .ta-c-desktop { - text-align: center; - } - - .ta-r-desktop { - text-align: right; - } - - .center-content-desktop { - text-align: center; - } - - .center-content-desktop img, - .center-content-desktop svg, - .center-content-desktop video { - margin-left: auto; - margin-right: auto; - } - - .center-content-desktop .button-group { - justify-content: center; - } -} - -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtR0FBbUcsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLDZCQUE2QixDQUFDLEtBQUssUUFBUSxDQUFDLHdDQUF3QyxhQUFhLENBQUMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLHVCQUF1QixhQUFhLENBQUMsT0FBTyxlQUFlLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxvQ0FBb0MsQ0FBQyxZQUFZLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLHdDQUErQixDQUEvQixnQ0FBZ0MsQ0FBQyxTQUFTLG1CQUFtQixDQUFDLFNBQVMsa0JBQWtCLENBQUMsY0FBYyxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxRQUFRLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxvQkFBb0IsQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLGVBQWUsZUFBZSxDQUFDLHNDQUFzQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsZ0JBQWdCLENBQUMsY0FBYyxtQkFBbUIsQ0FBQywyREFBMkQseUJBQXlCLENBQUMsOEhBQThILGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxrSEFBa0gsNkJBQTZCLENBQUMsU0FBUyw2QkFBNkIsQ0FBQyxPQUFPLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLFNBQVMsYUFBYSxDQUFDLGlDQUFpQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsc0ZBQXNGLFdBQVcsQ0FBQyxnQkFBZ0IsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMseUZBQXlGLHVCQUF1QixDQUFDLDZCQUE2Qix5QkFBeUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxhQUFhLENBQUMsUUFBUSxpQkFBaUIsQ0FBQyxPQUFPLG9CQUFvQixDQUFDLFNBQVMsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLDBCQUEwQixpQ0FBaUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLGlDQUFpQywyQkFBMkIsQ0FBQyxvQ0FBb0MsMEJBQTBCLENBQUMsa0NBQWtDLDJCQUEyQixDQUFDLG1DQUFtQywwQkFBMEIsQ0FBQyxpQ0FBaUMsb0JBQW9CLENBQUMsbUNBQW1DLHFCQUFxQixDQUFDLHlDQUF5Qyw2Q0FBNkMsQ0FBQywwQ0FBMEMsNENBQTRDLENBQUMsMkNBQTJDLDBHQUEwRyxDQUFDLHVEQUF1RCxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLG1CQUFtQixrQkFBa0IsQ0FBQyxLQUFLLGtCQUFrQixDQUFDLGlDQUFpQyxDQUFDLGtDQUFrQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxrQkFBa0IsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLG9CQUFvQixrQkFBa0IsQ0FBQyxZQUFZLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLGNBQWMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBTyxhQUFhLENBQUMsV0FBVyxhQUFhLENBQUMsTUFBTSxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsK0JBQStCLENBQUMsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsOEJBQThCLGNBQWMsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLGlCQUFpQixhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQiwrQkFBK0IsQ0FBQyxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxjQUFjLENBQUMsa0NBQWtDLCtCQUErQixDQUFDLGVBQWUsQ0FBQywwQ0FBMEMsbUNBQW1DLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLGFBQWEsQ0FBQywyQ0FBMkMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxjQUFjLGFBQWEsQ0FBQyx5Q0FBeUMsYUFBYSxDQUFDLFlBQVksYUFBYSxDQUFDLHFDQUFxQyxhQUFhLENBQUMsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLGlCQUFpQixDQUFDLFdBQVcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsYUFBYSxjQUFjLENBQUMsUUFBUSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLDhGQUE4RixrREFBa0QsQ0FBQyxvQkFBb0Isa0JBQWtCLENBQUMsSUFBSSxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLDBFQUEwRSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsYUFBYSxXQUFXLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxjQUFjLGFBQWEsQ0FBQyx1RUFBdUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxxRUFBcUUsYUFBYSxDQUFDLGlFQUFpRSxhQUFhLENBQUMsa05BQWtOLGFBQWEsQ0FBQyxzQkFBc0Isb0JBQW9CLENBQUMsMEZBQTBGLGtCQUFrQixDQUFDLDBCQUEwQixXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLDBCQUEwQixPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLHVDQUF1QyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLDBCQUEwQix1Q0FBdUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLGdCQUFnQixDQUFDLGNBQWMsZUFBZSxDQUFDLGNBQWMsZUFBZSxDQUFDLHNDQUFzQyxjQUFjLENBQUMsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyxRQUFRLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsK0JBQStCLENBQUMsZUFBZSxTQUFTLENBQUMsY0FBYyxxQkFBcUIsQ0FBQyxtQkFBbUIsaUJBQWlCLENBQUMsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHlDQUF5QyxDQUFDLHVDQUF1QyxDQUFDLFNBQVMsQ0FBQyxvREFBMkMsQ0FBM0MsNENBQTRDLENBQUMsa0JBQWtCLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxvQ0FBb0Msb0JBQW9CLENBQUMsV0FBVyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsYUFBYSxhQUFhLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLHdCQUF3QixDQUFDLCtCQUErQixvQkFBb0IsQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQix3QkFBd0IsQ0FBQyxrQ0FBa0Msb0JBQW9CLENBQUMsa0JBQWtCLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0Isd0JBQXdCLENBQUMsb0NBQW9DLG9CQUFvQixDQUFDLGNBQWMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxjQUFjLFlBQVksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLDJCQUEyQixrQkFBa0IsQ0FBQyxpQ0FBaUMsaUJBQWlCLENBQUMsOEJBQThCLFVBQVUsQ0FBQywwQkFBMEIsb0JBQW9CLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxrQ0FBMEIsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLHdCQUF3QixDQUFDLENBQS9FLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDLEtBQUssd0JBQXdCLENBQUMsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHlCQUF5QixhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksY0FBYyxDQUFDLGdCQUFnQixDQUFDLGdFQUFnRSxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyx3RkFBd0Ysb0JBQW9CLENBQUMsb0xBQW9MLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyx3R0FBd0csa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsNEdBQTRHLG9CQUFvQixDQUFDLG9IQUFvSCxvQkFBb0IsQ0FBQyxvSEFBb0gsb0JBQW9CLENBQUMseUJBQXlCLGFBQWEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsdUNBQXlCLGFBQWEsQ0FBdEMsOEJBQXlCLGFBQWEsQ0FBdEMsa0NBQXlCLGFBQWEsQ0FBdEMsbUNBQXlCLGFBQWEsQ0FBdEMseUJBQXlCLGFBQWEsQ0FBQyxtQ0FBbUMsYUFBYSxDQUFDLG9CQUFvQixXQUFXLENBQUMsZUFBZSxDQUFDLGFBQWEsa0JBQWtCLENBQUMsbVRBQW1ULENBQUMscUNBQXFDLENBQUMsMkJBQTJCLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLGtCQUFrQixDQUFDLHFDQUFxQyxDQUFDLCtCQUErQixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsK0JBQStCLGlCQUFpQixDQUFDLHVDQUF1QyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsMkJBQTJCLGlCQUFpQixDQUFDLCtCQUErQixTQUFTLENBQUMsOEJBQThCLGlCQUFpQixDQUFDLGtDQUFrQyxTQUFTLENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLGdDQUFnQyxVQUFVLENBQUMsK0JBQStCLGtCQUFrQixDQUFDLG1DQUFtQyxVQUFVLENBQUMsd0NBQXdDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsMkJBQTJCLGFBQWEsQ0FBQywyQkFBMkIsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsdUNBQXVDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsdURBQXVELG1DQUFtQyxDQUFDLCtCQUErQixDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixpQkFBaUIsQ0FBQyw2QkFBNkIsNFBBQTRQLENBQUMsa0JBQWtCLGlCQUFpQixDQUFDLDBCQUEwQixnT0FBZ08sQ0FBQyxhQUFhLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLHdCQUFlLENBQWYscUJBQWUsQ0FBZixvQkFBZSxDQUFmLGdCQUFnQixDQUFDLG1CQUFtQixxQkFBcUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsK0JBQStCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLENBQUMsNkNBQTZDLGtCQUFrQixDQUFDLHFEQUFxRCxTQUFTLENBQUMseUNBQXlDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxvREFBb0QsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxxREFBcUQsYUFBYSxDQUFDLHdIQUF3SCxvQkFBb0IsQ0FBQyxvU0FBb1Msb0JBQW9CLENBQUMsZ0tBQWdLLHdCQUF3QixDQUFDLHFEQUFxRCxhQUFhLENBQUMsMkJBQTJCLG1UQUFtVCxDQUFDLHVEQUF1RCxhQUFhLENBQUMsbUZBQW1GLDJCQUEyQixDQUFDLHVCQUF1QixDQUFDLFlBQVksWUFBWSxDQUFDLHdCQUF3QixXQUFXLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLDBCQUEwQixnQ0FBZ0Msa0JBQWtCLENBQUMsNEJBQTRCLFVBQVUsQ0FBQyxDQUFDLDBCQUEwQixvQkFBb0IsWUFBWSxDQUFDLGdDQUFnQyxXQUFXLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDRCQUE0QixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxtQkFBbUIsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLDRCQUE0QixhQUFhLENBQUMsbUJBQW1CLENBQUMsV0FBVyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGtFQUFrRSxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLDRHQUE0RyxrQkFBa0IsQ0FBQyxpQkFBaUIsT0FBTyxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxpRUFBaUUsQ0FBQyxpREFBaUQsVUFBVSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLHVEQUF1RCxDQUFDLHdCQUF3QixXQUFXLENBQUMsb0hBQW9ILENBQUMsb0NBQW9DLHdCQUF3QixDQUFDLHNCQUFzQixDQUFDLDhEQUE4RCxDQUFDLDRDQUE0QyxLQUFLLENBQUMsU0FBUyxDQUFDLHlEQUF5RCxDQUFDLDJDQUEyQyxVQUFVLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLDZHQUE2RyxDQUFDLGNBQWMsaUJBQWlCLENBQUMsc0JBQXNCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLDJCQUEyQixpQkFBaUIsQ0FBQyxrQ0FBa0MsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLGlCQUFpQixDQUFDLG9DQUFvQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyx5Q0FBeUMsaUJBQWlCLENBQUMsZ0RBQWdELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixZQUFZLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLHVCQUF1Qiw2QkFBNkIsQ0FBQyxtQkFBbUIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsbURBQW1ELENBQUMsOEJBQThCLFNBQVMsQ0FBQyxnQ0FBZ0Msa0JBQWtCLENBQUMsZ0JBQWdCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsK0NBQStDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0MsQ0FBQyx3QkFBd0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLDJCQUEyQixjQUFjLENBQUMsbUNBQW1DLHVCQUF1QixDQUFDLGtDQUFrQyx3QkFBd0IsQ0FBQyxzQkFBc0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sWUFBWSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsbUNBQW1DLFlBQVksQ0FBQyxlQUFlLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxvQ0FBb0MsQ0FBQyxpQkFBaUIsWUFBWSxDQUFDLHVEQUF1RCxhQUFhLENBQUMsOEJBQThCLHNEQUE2QyxDQUE3Qyw4Q0FBOEMsQ0FBQyx5QkFBeUIsd0RBQStDLENBQS9DLGdEQUFnRCxDQUFDLGFBQWEsaUNBQWlDLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGdDQUFnQyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLGlCQUFpQixDQUFDLGFBQWEsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx5Q0FBeUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQix3QkFBd0IsQ0FBQyxvQkFBb0Isd0JBQXdCLENBQUMscURBQXFELGtCQUFrQixDQUFDLDBCQUEwQixhQUFhLGFBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxlQUFlLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUMsa0NBQTBCLEdBQUcsU0FBUyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQXhHLDBCQUEwQixHQUFHLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLG9DQUE0QixHQUFHLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUF0RCw0QkFBNEIsR0FBRyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxlQUFlLFlBQVksQ0FBQywwQ0FBMEMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLGtCQUFrQixtQkFBbUIsQ0FBQyxpQkFBaUIsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLHlCQUF5QixVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLHVCQUF1QixZQUFZLENBQUMsbUNBQW1DLGtCQUFrQixDQUFDLCtCQUErQixrQkFBa0IsQ0FBQyx1Q0FBdUMsa0JBQWtCLENBQUMsaURBQWlELGtCQUFrQixDQUFDLDZDQUE2QyxrQkFBa0IsQ0FBQyxZQUFZLGdCQUFnQixDQUFDLHlCQUF5QixtQkFBbUIsQ0FBQywrQkFBK0Isa0JBQWtCLENBQUMsd0JBQXdCLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBMEMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLDRJQUE0SSxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyw4TUFBOE0sVUFBVSxDQUFDLDBCQUEwQiw0Q0FBNEMsa0JBQWtCLENBQUMsMERBQTBELE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyx3REFBd0Qsa0JBQWtCLENBQUMsQ0FBQywwQkFBMEIsWUFBWSxnQkFBZ0IsQ0FBQyx5QkFBeUIsbUJBQW1CLENBQUMsK0JBQStCLGtCQUFrQixDQUFDLHdCQUF3QixnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyw0Q0FBNEMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsMENBQTBDLGVBQWUsQ0FBQyxtSEFBbUgsd0JBQXdCLENBQUMsMkpBQTJKLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsaWVBQWllLGdCQUFnQixDQUFDLGtDQUFrQyxzQkFBc0IsQ0FBQyxDQUFDLDBCQUEwQix1REFBdUQsV0FBVyxDQUFDLHFEQUFxRCxlQUFlLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLG1CQUFtQixDQUFDLCtCQUErQixrQkFBa0IsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLGNBQWMscUJBQXFCLENBQUMsa0JBQWtCLFlBQVksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsNEJBQTRCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxrREFBa0QsZ0JBQWdCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLG1CQUFtQixZQUFZLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLFlBQVksV0FBVyxDQUFDLDhCQUE4QixZQUFZLENBQUMsV0FBVyxDQUFDLGVBQWUsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsNkJBQTZCLGNBQWMsQ0FBQyw4QkFBOEIsZ0JBQWdCLENBQUMsMkJBQTJCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLHlDQUF5QyxvQkFBb0IsQ0FBQyxxQkFBcUIsZ0JBQWdCLENBQUMsaUNBQWlDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0Isd0JBQXdCLENBQUMsb0NBQW9DLFdBQVcsQ0FBQyxtQkFBbUIsWUFBWSxDQUFDLDBCQUEwQixtQkFBbUIsYUFBYSxDQUFDLCtCQUErQixxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsb0RBQW9ELENBQUMseUNBQXlDLFNBQVMsQ0FBQyxpREFBaUQscUJBQXFCLENBQUMsWUFBWSxDQUFDLGtDQUFrQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsaURBQWlELG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLHdDQUF3QyxhQUFhLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxrQkFBa0IsQ0FBQyxxQkFBcUIsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxDQUFDLDZCQUE2QixVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxXQUFXLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxhQUFhLENBQUMsYUFBYSxpQkFBaUIsQ0FBQyxxQkFBcUIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLGNBQWMsQ0FBQyxZQUFZLG1CQUFtQixDQUFDLGVBQWUsZ0JBQWdCLENBQUMsZUFBZSxZQUFZLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixrQkFBa0IsQ0FBQyxrQ0FBa0Msa0JBQWtCLENBQUMsY0FBYyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLHFCQUFxQixDQUFDLHFDQUFxQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDLG9CQUFvQixDQUFDLDZDQUE2QyxhQUFhLENBQUMsOEJBQThCLG9CQUFvQixDQUFDLG9CQUFvQixjQUFjLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQ0FBa0MsYUFBYSxDQUFDLCtCQUErQixZQUFZLENBQUMsaUNBQWlDLFlBQVksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGtCQUFrQixrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsYUFBYSxDQUFDLGlCQUFpQixXQUFXLENBQUMscUJBQXFCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQywyQkFBMkIsWUFBWSxDQUFDLFlBQVksa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxhQUFhLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLHlDQUF5QyxhQUFhLENBQUMsNEJBQTRCLG9CQUFvQixDQUFDLDBCQUEwQixpRUFBaUUsa0JBQWtCLENBQUMsQ0FBQywwQkFBMEIsbUJBQW1CLGNBQWMsQ0FBQyx1REFBdUQsWUFBWSxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLGlHQUFpRyxPQUFPLENBQUMsQ0FBQyxlQUFlLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixtQkFBbUIsQ0FBQywwQkFBMEIsZUFBZSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsbUJBQW1CLENBQUMsQ0FBQyw4RUFBOEUsZUFBZSxDQUFDLDJCQUEyQixtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsa0RBQWtELGtCQUFrQixDQUFDLDhEQUE4RCxrQkFBa0IsQ0FBQyxDQUFDLDBCQUEwQiw4RUFBOEUsZUFBZSxDQUFDLENBQUMsMEJBQTBCLGdDQUFnQyxtQkFBbUIsQ0FBQyxDQUFDLDRCQUE0QixrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyx5Q0FBeUMsbUJBQW1CLENBQUMsK0NBQStDLGtCQUFrQixDQUFDLDZDQUE2QyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsa0NBQWtDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLDBCQUEwQiw0QkFBNEIsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMseUNBQXlDLG1CQUFtQixDQUFDLCtDQUErQyxrQkFBa0IsQ0FBQyw2Q0FBNkMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLFlBQVksQ0FBQyxDQUFDLHNDQUFzQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMscUJBQXFCLGdCQUFnQixDQUFDLGVBQWUsQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLFdBQVcsQ0FBQyxVQUFVLENBQUMsaUNBQWlDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0Isa0JBQWtCLENBQUMsMEJBQTBCLGtCQUFrQixrQkFBa0IsQ0FBQyxDQUFDLDBDQUEwQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMseUJBQXlCLGdCQUFnQixDQUFDLGVBQWUsQ0FBQywrQkFBK0IsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLFdBQVcsQ0FBQyx5QkFBeUIsbUJBQW1CLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQywrQkFBK0IsbUJBQW1CLENBQUMscUNBQXFDLGtCQUFrQixDQUFDLG1DQUFtQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLDBCQUEwQixzQkFBc0IsbUJBQW1CLENBQUMsa0JBQWtCLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLCtCQUErQixtQkFBbUIsQ0FBQyxxQ0FBcUMsa0JBQWtCLENBQUMsbUNBQW1DLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixZQUFZLENBQUMsQ0FBQyxvQkFBb0IsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsWUFBWSxrQkFBa0IsQ0FBQywwQkFBMEIsb0JBQW9CLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFdBQVcsWUFBWSxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyx3QkFBd0IsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLFlBQVksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixpQkFBaUIsQ0FBQywwQkFBMEIsMkJBQTJCLGtCQUFrQixDQUFDLENBQUMsd0JBQXdCLG1CQUFtQixDQUFDLDBCQUEwQixhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQywwQkFBMEIsd0JBQXdCLG1CQUFtQixDQUFDLENBQUMsZUFBZSxZQUFZLENBQUMsY0FBYyxDQUFDLDZCQUE2QixDQUFDLHVCQUF1QixpQkFBaUIsQ0FBQyw4QkFBOEIsbUJBQW1CLENBQUMsc0NBQXNDLFVBQVUsQ0FBQyxzQ0FBc0MsVUFBVSxDQUFDLGdDQUFnQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsMkRBQTJELENBQUMsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLDJEQUEyRCxDQUFDLDJCQUEyQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMseUJBQXlCLENBQUMsYUFBYSxhQUFhLENBQUMsMkJBQTJCLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLG1GQUFtRixDQUFDLDJCQUEyQixrQkFBa0IsQ0FBQyxxQkFBcUIsaUJBQWlCLENBQUMsNEJBQTRCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixpQ0FBaUMsQ0FBQyxjQUFjLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyw4QkFBOEIsaUJBQWlCLENBQUMscUNBQXFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLHFDQUFxQyxpQ0FBaUMsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyx5Q0FBeUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMseUNBQXlDLGlDQUFpQyxDQUFDLHdDQUF3QyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsMlFBQTJRLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLG1EQUFtRCwwYkFBMGIsQ0FBQywrQkFBK0Isa0JBQWtCLENBQUMsMEJBQTBCLGlCQUFpQixDQUFDLGtDQUFrQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLHFuQkFBcW5CLENBQUMsMkJBQTJCLENBQUMseUJBQXlCLG1DQUFtQyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpREFBaUQsaUNBQWlDLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLG9CQUFvQixDQUFDLCtCQUErQixhQUFhLENBQUMsaUJBQWlCLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLFdBQVcsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsd0VBQXdFLENBQUMsMEJBQTBCLGlCQUFpQixlQUFlLENBQUMsV0FBVyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGVBQWUsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxZQUFZLGVBQWUsQ0FBQyxTQUFTLENBQUMsZUFBZSxRQUFRLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLFFBQVEsZUFBZSxDQUFDLFFBQVEsZUFBZSxDQUFDLFFBQVEsZUFBZSxDQUFDLFFBQVEsZUFBZSxDQUFDLGlCQUFpQixhQUFhLENBQUMsZ0JBQWdCLGFBQWEsQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDLG9CQUFvQixhQUFhLENBQUMsc0JBQXNCLGFBQWEsQ0FBQyxrQkFBa0IsYUFBYSxDQUFDLG9CQUFvQixhQUFhLENBQUMsb0JBQW9CLGFBQWEsQ0FBQywrQkFBK0IsYUFBYSxDQUFDLDhCQUE4QixhQUFhLENBQUMsOEJBQThCLGFBQWEsQ0FBQyxNQUFNLHdCQUF3QixDQUFDLFlBQVksVUFBVSxDQUFDLGNBQWMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxjQUFjLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxZQUFZLDBDQUEwQyxDQUFDLGVBQWUsaUJBQWlCLENBQUMsaUJBQWlCLGlCQUFpQixDQUFDLHlCQUF5QixVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsMkJBQTJCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLCtCQUErQixpQkFBaUIsQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsa0NBQWtDLGlCQUFpQixDQUFDLHlDQUF5QyxVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsaUJBQWlCLENBQUMsOERBQThELGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDhCQUE4QixzQkFBc0IsQ0FBQyxrQkFBa0IsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyx5QkFBeUIsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sWUFBWSxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sZUFBZSxDQUFDLE1BQU0sYUFBYSxDQUFDLEtBQUssVUFBVSxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLE1BQU0saUJBQWlCLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sWUFBWSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLG1CQUFtQixDQUFDLE9BQU8saUJBQWlCLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLFVBQVUsZUFBZSxDQUFDLFVBQVUsZUFBZSxDQUFDLFdBQVcsZ0JBQWdCLENBQUMsV0FBVyxnQkFBZ0IsQ0FBQyxXQUFXLGdCQUFnQixDQUFDLFdBQVcsZ0JBQWdCLENBQUMsV0FBVyxnQkFBZ0IsQ0FBQyxXQUFXLGdCQUFnQixDQUFDLDBCQUEwQixhQUFhLGVBQWUsQ0FBQyxhQUFhLGlCQUFpQixDQUFDLGFBQWEsZ0JBQWdCLENBQUMsdUJBQXVCLGlCQUFpQixDQUFDLG1GQUFtRixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxxQ0FBcUMsc0JBQXNCLENBQUMsaUJBQWlCLGVBQWUsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLGtCQUFrQixnQkFBZ0IsQ0FBQyxrQkFBa0IsZ0JBQWdCLENBQUMsa0JBQWtCLGdCQUFnQixDQUFDLGtCQUFrQixnQkFBZ0IsQ0FBQyxrQkFBa0IsZ0JBQWdCLENBQUMsa0JBQWtCLGdCQUFnQixDQUFDLENBQUMsMEJBQTBCLGNBQWMsZUFBZSxDQUFDLGNBQWMsaUJBQWlCLENBQUMsY0FBYyxnQkFBZ0IsQ0FBQyx3QkFBd0IsaUJBQWlCLENBQUMsc0ZBQXNGLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHNDQUFzQyxzQkFBc0IsQ0FBQyIsImZpbGUiOiJzdHlsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAaW1wb3J0IHVybChcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1GaXJhK1NhbnM6NjAwfEhlZWJvOjQwMCw1MDAsNzAwJmRpc3BsYXk9c3dhcFwiKTtodG1se2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfWgxe2ZvbnQtc2l6ZToyZW07bWFyZ2luOjAuNjdlbSAwfWZpZ2NhcHRpb24sZmlndXJlLG1haW57ZGlzcGxheTpibG9ja31maWd1cmV7bWFyZ2luOjFlbSA0MHB4fWhye2JveC1zaXppbmc6Y29udGVudC1ib3g7aGVpZ2h0OjA7b3ZlcmZsb3c6dmlzaWJsZX1wcmV7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLCBtb25vc3BhY2U7Zm9udC1zaXplOjFlbX1he2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC10ZXh0LWRlY29yYXRpb24tc2tpcDpvYmplY3RzfWFiYnJbdGl0bGVde2JvcmRlci1ib3R0b206bm9uZTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkfWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLCBtb25vc3BhY2U7Zm9udC1zaXplOjFlbX1kZm57Zm9udC1zdHlsZTppdGFsaWN9bWFya3tiYWNrZ3JvdW5kLWNvbG9yOiNmZjA7Y29sb3I6IzAwMH1zbWFsbHtmb250LXNpemU6ODAlfXN1YixzdXB7Zm9udC1zaXplOjc1JTtsaW5lLWhlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXN1Yntib3R0b206LTAuMjVlbX1zdXB7dG9wOi0wLjVlbX1hdWRpbyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja31hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO2hlaWdodDowfWltZ3tib3JkZXItc3R5bGU6bm9uZX1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59YnV0dG9uLGlucHV0LG9wdGdyb3VwLHNlbGVjdCx0ZXh0YXJlYXtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMDAlO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjB9YnV0dG9uLGlucHV0e292ZXJmbG93OnZpc2libGV9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixodG1sIFt0eXBlPVwiYnV0dG9uXCJdLFt0eXBlPVwicmVzZXRcIl0sW3R5cGU9XCJzdWJtaXRcIl17LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9XCJidXR0b25cIl06Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cInN1Ym1pdFwiXTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXItc3R5bGU6bm9uZTtwYWRkaW5nOjB9YnV0dG9uOi1tb3otZm9jdXNyaW5nLFt0eXBlPVwiYnV0dG9uXCJdOi1tb3otZm9jdXNyaW5nLFt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJzdWJtaXRcIl06LW1vei1mb2N1c3Jpbmd7b3V0bGluZToxcHggZG90dGVkIEJ1dHRvblRleHR9ZmllbGRzZXR7cGFkZGluZzowLjM1ZW0gMC43NWVtIDAuNjI1ZW19bGVnZW5ke2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O2Rpc3BsYXk6dGFibGU7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzowO3doaXRlLXNwYWNlOm5vcm1hbH1wcm9ncmVzc3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX10ZXh0YXJlYXtvdmVyZmxvdzphdXRvfVt0eXBlPVwiY2hlY2tib3hcIl0sW3R5cGU9XCJyYWRpb1wiXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowfVt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPVwic2VhcmNoXCJdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH1bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fWRldGFpbHMsbWVudXtkaXNwbGF5OmJsb2NrfXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19Y2FudmFze2Rpc3BsYXk6aW5saW5lLWJsb2NrfXRlbXBsYXRle2Rpc3BsYXk6bm9uZX1baGlkZGVuXXtkaXNwbGF5Om5vbmV9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuaGFzLWFuaW1hdGlvbnMgW2NsYXNzKj1yZXZlYWwtXXtvcGFjaXR5OjA7d2lsbC1jaGFuZ2U6b3BhY2l0eSwgdHJhbnNmb3JtfS5oYXMtYW5pbWF0aW9ucyAucmV2ZWFsLWZyb20tdG9we3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMHB4KX0uaGFzLWFuaW1hdGlvbnMgLnJldmVhbC1mcm9tLWJvdHRvbXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMHB4KX0uaGFzLWFuaW1hdGlvbnMgLnJldmVhbC1mcm9tLWxlZnR7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpfS5oYXMtYW5pbWF0aW9ucyAucmV2ZWFsLWZyb20tcmlnaHR7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCl9Lmhhcy1hbmltYXRpb25zIC5yZXZlYWwtc2NhbGUtdXB7dHJhbnNmb3JtOnNjYWxlKC45NSl9Lmhhcy1hbmltYXRpb25zIC5yZXZlYWwtc2NhbGUtZG93bnt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9Lmhhcy1hbmltYXRpb25zIC5yZXZlYWwtcm90YXRlLWZyb20tbGVmdHt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC00NWRlZyl9Lmhhcy1hbmltYXRpb25zIC5yZXZlYWwtcm90YXRlLWZyb20tcmlnaHR7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSg0NWRlZyl9Lmhhcy1hbmltYXRpb25zLmlzLWxvYWRlZCBbY2xhc3MqPXJldmVhbC1de3RyYW5zaXRpb246b3BhY2l0eSAxcyBjdWJpYy1iZXppZXIoMC4zOSwgMC41NzUsIDAuNTY1LCAxKSx0cmFuc2Zvcm0gMXMgY3ViaWMtYmV6aWVyKDAuMzksIDAuNTc1LCAwLjU2NSwgMSl9Lmhhcy1hbmltYXRpb25zLmlzLWxvYWRlZCBbY2xhc3MqPXJldmVhbC1dLmlzLXJldmVhbGVke29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlKDApfX1odG1se2JveC1zaXppbmc6Ym9yZGVyLWJveH0qLCo6YmVmb3JlLCo6YWZ0ZXJ7Ym94LXNpemluZzppbmhlcml0fWJvZHl7YmFja2dyb3VuZDojMTYxNzFCOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkfWhye2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMyOTJCMzI7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweH11bCxvbHttYXJnaW4tdG9wOjA7cGFkZGluZy1sZWZ0OjI0cHh9dWw6bm90KDpsYXN0LWNoaWxkKSxvbDpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1ib3R0b206MjRweH11bHtsaXN0LXN0eWxlOmRpc2N9b2x7bGlzdC1zdHlsZTpkZWNpbWFsfWxpOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbToxMnB4fWxpPnVsLGxpPm9se21hcmdpbi10b3A6MTJweDttYXJnaW4tYm90dG9tOjB9ZGx7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MjRweH1kdHtmb250LXdlaWdodDo3MDB9ZGR7bWFyZ2luLWxlZnQ6MjRweDttYXJnaW4tYm90dG9tOjI0cHh9aW1ne2JvcmRlci1yYWRpdXM6MnB4fWltZyxzdmcsdmlkZW97ZGlzcGxheTpibG9jaztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJX1maWd1cmV7bWFyZ2luOjQ4cHggMH1maWdjYXB0aW9ue3BhZGRpbmc6OHB4IDB9dGFibGV7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDtsZXR0ZXItc3BhY2luZzotMC4xcHg7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbi1ib3R0b206MjRweDt3aWR0aDoxMDAlfXRye2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMyOTJCMzJ9dGh7Zm9udC13ZWlnaHQ6NzAwO3RleHQtYWxpZ246bGVmdH10aCx0ZHtwYWRkaW5nOjhweCAxNnB4fXRoOmZpcnN0LWNoaWxkLHRkOmZpcnN0LWNoaWxke3BhZGRpbmctbGVmdDowfXRoOmxhc3QtY2hpbGQsdGQ6bGFzdC1jaGlsZHtwYWRkaW5nLXJpZ2h0OjB9LmludmVydC1jb2xvciBocntkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojZTVlOWZmfS5pbnZlcnQtY29sb3IgdHJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U1ZTlmZn1odG1se2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMycHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fWJvZHl7Y29sb3I6Izk1OUNCMTtmb250LXNpemU6MXJlbX1ib2R5LGJ1dHRvbixpbnB1dCxzZWxlY3QsdGV4dGFyZWF7Zm9udC1mYW1pbHk6XCJIZWVib1wiLCBzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjQwMH1oMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNntmb250LWZhbWlseTpcIkZpcmEgU2Fuc1wiLCBzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjYwMDtjbGVhcjpib3RoO2NvbG9yOiNGOUZBRkY7d29yZC13cmFwOmJyZWFrLXdvcmQ7b3ZlcmZsb3ctd3JhcDpicmVhay13b3JkfWgxLC5oMXtmb250LXNpemU6MzhweDtsaW5lLWhlaWdodDo0OHB4fWgyLC5oMntmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDo0MnB4fWgzLC5oM3tmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1oNCwuaDR7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzRweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9aDUsLmg1e2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMycHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fWg2LC5oNixzbWFsbCwudGV4dC1zbXtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDozMHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH0udGV4dC14c3tmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH0udGV4dC14eHN7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjJweH1maWdjYXB0aW9ue2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjIycHh9YTpub3QoLmJ1dHRvbil7Y29sb3I6aW5oZXJpdH1hOm5vdCguYnV0dG9uKTpob3ZlcixhOm5vdCguYnV0dG9uKTphY3RpdmV7Y29sb3I6I0Y5RkFGRjtvdXRsaW5lOjB9YS5idXR0b24tbGlua3tjb2xvcjojNkE2RjgyfWEuYnV0dG9uLWxpbms6aG92ZXIsYS5idXR0b24tbGluazphY3RpdmV7Y29sb3I6Izk1OUNCMX1hLmZ1bmMtbGlua3tjb2xvcjojMzc2REY5fWEuZnVuYy1saW5rOmhvdmVyLGEuZnVuYy1saW5rOmFjdGl2ZXtjb2xvcjojNjk5MUZBfWgxLC5oMXttYXJnaW4tdG9wOjQ4cHg7bWFyZ2luLWJvdHRvbTozMnB4fWgyLC5oMnttYXJnaW4tdG9wOjQ4cHg7bWFyZ2luLWJvdHRvbTozMnB4fWgzLC5oM3ttYXJnaW4tdG9wOjM2cHg7bWFyZ2luLWJvdHRvbToyNHB4fWg0LGg1LGg2LC5oNCwuaDUsLmg2e21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjI0cHh9cHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyNHB4fWRmbixjaXRlLGVtLGl7Zm9udC1zdHlsZTppdGFsaWN9YmxvY2txdW90ZXtmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMnB4O2xldHRlci1zcGFjaW5nOi0wLjFweDttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4O21hcmdpbi1sZWZ0OjI0cHh9YmxvY2txdW90ZTo6YmVmb3Jle2NvbnRlbnQ6XCJcXDIwMUNcIn1ibG9ja3F1b3RlOjphZnRlcntjb250ZW50OlwiXFwyMDFEXCJ9YmxvY2txdW90ZSBwe2Rpc3BsYXk6aW5saW5lfWFkZHJlc3N7Ym9yZGVyLXdpZHRoOjFweCAwO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6IzI5MkIzMjtwYWRkaW5nOjI0cHggMDttYXJnaW46MCAwIDI0cHh9cHJlLHByZSBoMSxwcmUgaDIscHJlIGgzLHByZSBoNCxwcmUgaDUscHJlIGg2LHByZSAuaDEscHJlIC5oMixwcmUgLmgzLHByZSAuaDQscHJlIC5oNSxwcmUgLmg2e2ZvbnQtZmFtaWx5OlwiQ291cmllciAxMCBQaXRjaFwiLCBDb3VyaWVyLCBtb25vc3BhY2V9cHJlLGNvZGUsa2JkLHR0LHZhcntiYWNrZ3JvdW5kOiMwZDBkMTB9cHJle2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O21heC13aWR0aDoxMDAlO292ZXJmbG93OmF1dG87cGFkZGluZzoyNHB4IDI0cHg7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweH1jb2RlLGtiZCx0dCx2YXJ7Zm9udC1mYW1pbHk6TW9uYWNvLCBDb25zb2xhcywgXCJBbmRhbGUgTW9ub1wiLCBcIkRlamFWdSBTYW5zIE1vbm9cIiwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O3BhZGRpbmc6MnB4IDRweH1hYmJyLGFjcm9ueW17Y3Vyc29yOmhlbHB9bWFyayxpbnN7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YixzdHJvbmd7Zm9udC13ZWlnaHQ6NzAwfS5pbnZlcnQtY29sb3J7Y29sb3I6IzZBNkY4Mn0uaW52ZXJ0LWNvbG9yIGE6bm90KC5idXR0b24pOmhvdmVyLC5pbnZlcnQtY29sb3IgYTpub3QoLmJ1dHRvbik6YWN0aXZle2NvbG9yOiMxQzFEMjI7b3V0bGluZTowfS5pbnZlcnQtY29sb3IgYS5idXR0b24tbGluazpob3ZlciwuaW52ZXJ0LWNvbG9yIGEuYnV0dG9uLWxpbms6YWN0aXZle2NvbG9yOiMzNzZERjl9LmludmVydC1jb2xvciBhLmZ1bmMtbGluazpob3ZlciwuaW52ZXJ0LWNvbG9yIGEuZnVuYy1saW5rOmFjdGl2ZXtjb2xvcjojNjk5MUZBfS5pbnZlcnQtY29sb3IgaDEsLmludmVydC1jb2xvciBoMiwuaW52ZXJ0LWNvbG9yIGgzLC5pbnZlcnQtY29sb3IgaDQsLmludmVydC1jb2xvciBoNSwuaW52ZXJ0LWNvbG9yIGg2LC5pbnZlcnQtY29sb3IgLmgxLC5pbnZlcnQtY29sb3IgLmgyLC5pbnZlcnQtY29sb3IgLmgzLC5pbnZlcnQtY29sb3IgLmg0LC5pbnZlcnQtY29sb3IgLmg1LC5pbnZlcnQtY29sb3IgLmg2e2NvbG9yOiMxNjE3MUJ9LmludmVydC1jb2xvciBhZGRyZXNze2JvcmRlci1jb2xvcjojZTVlOWZmfS5pbnZlcnQtY29sb3IgcHJlLC5pbnZlcnQtY29sb3IgY29kZSwuaW52ZXJ0LWNvbG9yIGtiZCwuaW52ZXJ0LWNvbG9yIHR0LC5pbnZlcnQtY29sb3IgdmFye2JhY2tncm91bmQ6IzBkMGQxMH1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5oMS1tb2JpbGV7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweH0uaDItbW9iaWxle2ZvbnQtc2l6ZTozMnB4O2xpbmUtaGVpZ2h0OjQycHh9LmgzLW1vYmlsZXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH0uaDQtbW9iaWxle2ZvbnQtc2l6ZToyNHB4O2xpbmUtaGVpZ2h0OjM0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fS5oNS1tb2JpbGV7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzJweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9Lmg2LW1vYmlsZXtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDozMHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH19QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXtoMSwuaDF7Zm9udC1zaXplOjQ0cHg7bGluZS1oZWlnaHQ6NTRweH1oMiwuaDJ7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweH1oMywuaDN7Zm9udC1zaXplOjMycHg7bGluZS1oZWlnaHQ6NDJweH19LmNvbnRhaW5lciwuY29udGFpbmVyLXNtLC5jb250YWluZXIteHN7d2lkdGg6MTAwJTttYXJnaW46MCBhdXRvO3BhZGRpbmctbGVmdDoxNnB4O3BhZGRpbmctcmlnaHQ6MTZweH1AbWVkaWEgKG1pbi13aWR0aDogNDgxcHgpey5jb250YWluZXIsLmNvbnRhaW5lci1zbSwuY29udGFpbmVyLXhze3BhZGRpbmctbGVmdDoyNHB4O3BhZGRpbmctcmlnaHQ6MjRweH19LmNvbnRhaW5lcnttYXgtd2lkdGg6MTEyOHB4fS5jb250YWluZXItc217bWF4LXdpZHRoOjk0NHB4fS5jb250YWluZXIteHN7bWF4LXdpZHRoOjY2OHB4fVtjbGFzcyo9Y29udGFpbmVyXSBbY2xhc3MqPWNvbnRhaW5lcl17cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfVtjbGFzcyo9Y29udGFpbmVyXSAuY29udGFpbmVyLXNte21heC13aWR0aDo4OTZweH1bY2xhc3MqPWNvbnRhaW5lcl0gLmNvbnRhaW5lci14c3ttYXgtd2lkdGg6NjIwcHh9LmJ1dHRvbntkaXNwbGF5OmlubGluZS1mbGV4O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjIycHg7Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6MTJweCAzMXB4O2hlaWdodDo0OHB4O3RleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2NvbG9yOiM2QTZGODI7YmFja2dyb3VuZC1jb2xvcjojRjlGQUZGO2JvcmRlci13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLDApO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7dGV4dC1hbGlnbjpjZW50ZXI7bGV0dGVyLXNwYWNpbmc6aW5oZXJpdDt3aGl0ZS1zcGFjZTpub3dyYXA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xNXMgZWFzZX0uYnV0dG9uOmFjdGl2ZXtvdXRsaW5lOjB9LmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ1dHRvbi5pcy1sb2FkaW5ne3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX0uYnV0dG9uLmlzLWxvYWRpbmc6OmFmdGVye2NvbnRlbnQ6Jyc7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O21hcmdpbi1sZWZ0Oi0xMXB4O21hcmdpbi10b3A6LTExcHg7dG9wOjUwJTtsZWZ0OjUwJTtib3JkZXI6MnB4IHNvbGlkICM2QTZGODI7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O3otaW5kZXg6MTthbmltYXRpb246YnV0dG9uLWxvYWRpbmcgLjZzIGluZmluaXRlIGxpbmVhcn0uYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6bm90LWFsbG93ZWQ7Y29sb3I6IzE2MTcxQjtiYWNrZ3JvdW5kLWNvbG9yOiMyOTJCMzIgIWltcG9ydGFudH0uYnV0dG9uW2Rpc2FibGVkXS5pcy1sb2FkaW5nOjphZnRlcntib3JkZXItY29sb3I6IzE2MTcxQn0uYnV0dG9uLXNte3BhZGRpbmc6NnB4IDIzcHg7aGVpZ2h0OjM2cHh9LmJ1dHRvbi1kYXJre2NvbG9yOiNGOUZBRkY7YmFja2dyb3VuZC1jb2xvcjojMjkyQjMyfS5idXR0b24tZGFyazpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzMDMyM2F9LmJ1dHRvbi1kYXJrLmlzLWxvYWRpbmc6OmFmdGVye2JvcmRlci1jb2xvcjojRjlGQUZGfS5idXR0b24tcHJpbWFyeXtjb2xvcjojRjlGQUZGO2JhY2tncm91bmQtY29sb3I6IzM3NkRGOX0uYnV0dG9uLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNDY3OGY5fS5idXR0b24tcHJpbWFyeS5pcy1sb2FkaW5nOjphZnRlcntib3JkZXItY29sb3I6I0Y5RkFGRn0uYnV0dG9uLXNlY29uZGFyeXtjb2xvcjojRjlGQUZGO2JhY2tncm91bmQtY29sb3I6I0ZGNUZBMH0uYnV0dG9uLXNlY29uZGFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjZlYTl9LmJ1dHRvbi1zZWNvbmRhcnkuaXMtbG9hZGluZzo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOiNGOUZBRkZ9LmJ1dHRvbi1ibG9ja3tkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJX0uYnV0dG9uLWdyb3Vwe2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXJpZ2h0Oi04cHg7bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tdG9wOi04cHh9LmJ1dHRvbi1ncm91cDpsYXN0LW9mLXR5cGV7bWFyZ2luLWJvdHRvbTotOHB4fS5idXR0b24tZ3JvdXA6bm90KDpsYXN0LW9mLXR5cGUpe21hcmdpbi1ib3R0b206OHB4fS5idXR0b24tZ3JvdXA+W2NsYXNzKj1idXR0b25de21hcmdpbjo4cHh9QG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KXsuYnV0dG9uLXdpZGUtbW9iaWxle3dpZHRoOjEwMCU7bWF4LXdpZHRoOjI4MHB4fX1Aa2V5ZnJhbWVzIGJ1dHRvbi1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fWZpZWxkc2V0e3BhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MH0uZm9ybS1sYWJlbCwuZm9ybS1zd2l0Y2h7Y29sb3I6IzZBNkY4Mjtmb250LXdlaWdodDo1MDB9LmZvcm0tbGFiZWx7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjJweH0uZm9ybS1pbnB1dCwuZm9ybS1zZWxlY3QsLmZvcm0tY2hlY2tib3ggaW5wdXQsLmZvcm0tcmFkaW8gaW5wdXR7LW1vei1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojRjlGQUZGO2JvcmRlci13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojMTYxNzFCfS5mb3JtLWlucHV0OmhvdmVyLC5mb3JtLXNlbGVjdDpob3ZlciwuZm9ybS1jaGVja2JveCBpbnB1dDpob3ZlciwuZm9ybS1yYWRpbyBpbnB1dDpob3Zlcntib3JkZXItY29sb3I6IzZBNkY4Mn0uZm9ybS1pbnB1dDphY3RpdmUsLmZvcm0taW5wdXQ6Zm9jdXMsLmZvcm0tc2VsZWN0OmFjdGl2ZSwuZm9ybS1zZWxlY3Q6Zm9jdXMsLmZvcm0tY2hlY2tib3ggaW5wdXQ6YWN0aXZlLC5mb3JtLWNoZWNrYm94IGlucHV0OmZvY3VzLC5mb3JtLXJhZGlvIGlucHV0OmFjdGl2ZSwuZm9ybS1yYWRpbyBpbnB1dDpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMzNzZERjl9LmZvcm0taW5wdXRbZGlzYWJsZWRdLC5mb3JtLXNlbGVjdFtkaXNhYmxlZF0sLmZvcm0tY2hlY2tib3ggaW5wdXRbZGlzYWJsZWRdLC5mb3JtLXJhZGlvIGlucHV0W2Rpc2FibGVkXXtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjojMjkyQjMyO2JvcmRlci1jb2xvcjojMUMxRDIyfS5mb3JtLWlucHV0LmZvcm0tZXJyb3IsLmZvcm0tc2VsZWN0LmZvcm0tZXJyb3IsLmZvcm0tY2hlY2tib3ggaW5wdXQuZm9ybS1lcnJvciwuZm9ybS1yYWRpbyBpbnB1dC5mb3JtLWVycm9ye2JvcmRlci1jb2xvcjojRkY1RkEwfS5mb3JtLWlucHV0LmZvcm0td2FybmluZywuZm9ybS1zZWxlY3QuZm9ybS13YXJuaW5nLC5mb3JtLWNoZWNrYm94IGlucHV0LmZvcm0td2FybmluZywuZm9ybS1yYWRpbyBpbnB1dC5mb3JtLXdhcm5pbmd7Ym9yZGVyLWNvbG9yOiNGRkM1NUF9LmZvcm0taW5wdXQuZm9ybS1zdWNjZXNzLC5mb3JtLXNlbGVjdC5mb3JtLXN1Y2Nlc3MsLmZvcm0tY2hlY2tib3ggaW5wdXQuZm9ybS1zdWNjZXNzLC5mb3JtLXJhZGlvIGlucHV0LmZvcm0tc3VjY2Vzc3tib3JkZXItY29sb3I6IzFFQzE5OH0uZm9ybS1pbnB1dCwuZm9ybS1zZWxlY3R7ZGlzcGxheTpibG9jaztmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweDtwYWRkaW5nOjExcHggMTVweDtoZWlnaHQ6NDhweDtib3JkZXItcmFkaXVzOjA7Y29sb3I6IzE2MTcxQjtib3gtc2hhZG93Om5vbmU7bWF4LXdpZHRoOjEwMCU7d2lkdGg6MTAwJX0uZm9ybS1pbnB1dDo6cGxhY2Vob2xkZXJ7Y29sb3I6Izk1OUNCMX0uZm9ybS1pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM5NTlDQjF9dGV4dGFyZWEuZm9ybS1pbnB1dHtoZWlnaHQ6YXV0bztyZXNpemU6dmVydGljYWx9LmZvcm0tc2VsZWN0e3BhZGRpbmctcmlnaHQ6NDZweDtiYWNrZ3JvdW5kLWltYWdlOnVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PVVTLUFTQ0lJLCUzQ3N2ZyUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDE2JTIwMTYlMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUzRSUzQ3BhdGglMjBkJTNEJTIyTTglMjAxMS40TDIuNiUyMDYlMjA0JTIwNC42bDQlMjA0JTIwNC00TDEzLjQlMjA2JTIwOCUyMDExLjR6JTIyJTIwZmlsbCUzRCUyMiUyM0Y5RkFGRiUyMiUyMGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlMkYlM0UlM0MlMkZzdmclM0VcIik7YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCAxNXB4IGNlbnRlcjtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjE2cHggMTZweH0uZm9ybS1zZWxlY3Qtc217cGFkZGluZy1yaWdodDozOHB4O2JhY2tncm91bmQtcG9zaXRpb246cmlnaHQgMTFweCBjZW50ZXJ9LmZvcm0tc2VsZWN0LXNtLC5mb3JtLWlucHV0LXNte3BhZGRpbmc6NXB4IDExcHg7aGVpZ2h0OjM2cHh9Lmhhcy1pY29uLWxlZnQsLmhhcy1pY29uLXJpZ2h0e3Bvc2l0aW9uOnJlbGF0aXZlfS5oYXMtaWNvbi1sZWZ0IHN2ZywuaGFzLWljb24tcmlnaHQgc3Zne3BvaW50ZXItZXZlbnRzOm5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0uaGFzLWljb24tbGVmdCAuZm9ybS1pbnB1dHtwYWRkaW5nLWxlZnQ6NDZweH0uaGFzLWljb24tbGVmdCAuZm9ybS1pbnB1dCtzdmd7bGVmdDoxNXB4fS5oYXMtaWNvbi1sZWZ0IC5mb3JtLWlucHV0LXNte3BhZGRpbmctbGVmdDozOHB4fS5oYXMtaWNvbi1sZWZ0IC5mb3JtLWlucHV0LXNtK3N2Z3tsZWZ0OjExcHh9Lmhhcy1pY29uLXJpZ2h0IC5mb3JtLWlucHV0e3BhZGRpbmctcmlnaHQ6NDZweH0uaGFzLWljb24tcmlnaHQgLmZvcm0taW5wdXQrc3Zne3JpZ2h0OjE1cHh9Lmhhcy1pY29uLXJpZ2h0IC5mb3JtLWlucHV0LXNte3BhZGRpbmctcmlnaHQ6MzhweH0uaGFzLWljb24tcmlnaHQgLmZvcm0taW5wdXQtc20rc3Zne3JpZ2h0OjExcHh9LmZvcm0tY2hlY2tib3gsLmZvcm0tcmFkaW8sLmZvcm0tc3dpdGNoe2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O2N1cnNvcjpwb2ludGVyfS5mb3JtLWNoZWNrYm94LC5mb3JtLXJhZGlve2NvbG9yOiM5NTlDQjF9LmZvcm0tY2hlY2tib3gsLmZvcm0tcmFkaW97cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1sZWZ0OjI0cHh9LmZvcm0tY2hlY2tib3ggaW5wdXQsLmZvcm0tcmFkaW8gaW5wdXR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDozcHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjdXJzb3I6cG9pbnRlcn0uZm9ybS1jaGVja2JveCBpbnB1dDpjaGVja2VkLC5mb3JtLXJhZGlvIGlucHV0OmNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjojMzc2REY5ICFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMzNzZERjkgIWltcG9ydGFudDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJX0uZm9ybS1jaGVja2JveCBpbnB1dHtib3JkZXItcmFkaXVzOjJweH0uZm9ybS1jaGVja2JveCBpbnB1dDpjaGVja2Vke2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1UUWlJR2hsYVdkb2REMGlNVFFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrSUR4d1lYUm9JR1E5SWsweE1TNDBJRFZNTVRBZ015NDJiQzAwSURRdE1pMHlUREl1TmlBM0lEWWdNVEF1TkhvaUlHWnBiR3c5SWlOR1JrWWlJR1pwYkd3dGNuVnNaVDBpWlhabGJtOWtaQ0l2UGp3dmMzWm5QZz09KX0uZm9ybS1yYWRpbyBpbnB1dHtib3JkZXItcmFkaXVzOjUwJX0uZm9ybS1yYWRpbyBpbnB1dDpjaGVja2Vke2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1UUWlJR2hsYVdkb2REMGlNVFFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdOcGNtTnNaU0JtYVd4c1BTSWpSa1pHSWlCamVEMGlOeUlnWTNrOUlqY2lJSEk5SWpNaUlHWnBiR3d0Y25Wc1pUMGlaWFpsYm05a1pDSXZQand2YzNablBnPT0pfS5mb3JtLXN3aXRjaHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt1c2VyLXNlbGVjdDpub25lfS5mb3JtLXN3aXRjaCBpbnB1dHtjbGlwOnJlY3QoMCwgMCwgMCwgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4fS5mb3JtLXN3aXRjaCAuZm9ybS1zd2l0Y2gtaWNvbntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO21pbi13aWR0aDo2MHB4O3dpZHRoOjYwcHg7aGVpZ2h0OjMycHg7Ym9yZGVyLXJhZGl1czoxNnB4O2JhY2tncm91bmQ6IzI5MkIzMn0uZm9ybS1zd2l0Y2ggLmZvcm0tc3dpdGNoLWljb246OmJlZm9yZXtjb250ZW50OicnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDtsZWZ0OjJweDt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6MTRweDtiYWNrZ3JvdW5kOiNGOUZBRkY7dHJhbnNpdGlvbjphbGwgLjE1cyBlYXNlLW91dH0uZm9ybS1zd2l0Y2ggaW5wdXQ6Y2hlY2tlZCsuZm9ybS1zd2l0Y2gtaWNvbntiYWNrZ3JvdW5kOiMzNzZERjl9LmZvcm0tc3dpdGNoIGlucHV0OmNoZWNrZWQrLmZvcm0tc3dpdGNoLWljb246OmJlZm9yZXtsZWZ0OjMwcHh9LmZvcm0tc3dpdGNoPnNwYW46bm90KC5mb3JtLXN3aXRjaC1pY29uKXtvcmRlcjotMTttYXJnaW4tcmlnaHQ6MTJweH0uZm9ybS1zd2l0Y2g+c3Bhbjpub3QoLmZvcm0tc3dpdGNoLWljb24pOmxhc3QtY2hpbGR7b3JkZXI6aW5pdGlhbDttYXJnaW4tbGVmdDoxMnB4O21hcmdpbi1yaWdodDowfS5pbnZlcnQtY29sb3IgLmZvcm0tbGFiZWwsLmludmVydC1jb2xvciAuZm9ybS1zd2l0Y2h7Y29sb3I6IzI5MkIzMn0uaW52ZXJ0LWNvbG9yIC5mb3JtLWlucHV0LC5pbnZlcnQtY29sb3IgLmZvcm0tc2VsZWN0LC5pbnZlcnQtY29sb3IgLmZvcm0tY2hlY2tib3ggaW5wdXQsLmludmVydC1jb2xvciAuZm9ybS1yYWRpbyBpbnB1dHtib3JkZXItY29sb3I6I2U1ZTlmZn0uaW52ZXJ0LWNvbG9yIC5mb3JtLWlucHV0OmFjdGl2ZSwuaW52ZXJ0LWNvbG9yIC5mb3JtLWlucHV0OmZvY3VzLC5pbnZlcnQtY29sb3IgLmZvcm0tc2VsZWN0OmFjdGl2ZSwuaW52ZXJ0LWNvbG9yIC5mb3JtLXNlbGVjdDpmb2N1cywuaW52ZXJ0LWNvbG9yIC5mb3JtLWNoZWNrYm94IGlucHV0OmFjdGl2ZSwuaW52ZXJ0LWNvbG9yIC5mb3JtLWNoZWNrYm94IGlucHV0OmZvY3VzLC5pbnZlcnQtY29sb3IgLmZvcm0tcmFkaW8gaW5wdXQ6YWN0aXZlLC5pbnZlcnQtY29sb3IgLmZvcm0tcmFkaW8gaW5wdXQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOiMzNzZERjl9LmludmVydC1jb2xvciAuZm9ybS1pbnB1dFtkaXNhYmxlZF0sLmludmVydC1jb2xvciAuZm9ybS1zZWxlY3RbZGlzYWJsZWRdLC5pbnZlcnQtY29sb3IgLmZvcm0tY2hlY2tib3ggaW5wdXRbZGlzYWJsZWRdLC5pbnZlcnQtY29sb3IgLmZvcm0tcmFkaW8gaW5wdXRbZGlzYWJsZWRde2JhY2tncm91bmQtY29sb3I6I2U1ZTlmZn0uaW52ZXJ0LWNvbG9yIC5mb3JtLWlucHV0LC5pbnZlcnQtY29sb3IgLmZvcm0tc2VsZWN0e2NvbG9yOiMyOTJCMzJ9LmludmVydC1jb2xvciAuZm9ybS1zZWxlY3R7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD1VUy1BU0NJSSwlM0NzdmclMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAxNiUyMDE2JTIyJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlM0UlM0NwYXRoJTIwZCUzRCUyMk04JTIwMTEuNEwyLjYlMjA2JTIwNCUyMDQuNmw0JTIwNCUyMDQtNEwxMy40JTIwNiUyMDglMjAxMS40eiUyMiUyMGZpbGwlM0QlMjIlMjMyOTJCMzIlMjIlMjBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTJGJTNFJTNDJTJGc3ZnJTNFXCIpfS5pbnZlcnQtY29sb3IgLmZvcm0tY2hlY2tib3gsLmludmVydC1jb2xvciAuZm9ybS1yYWRpb3tjb2xvcjojMjkyQjMyfS5pbnZlcnQtY29sb3IgLmZvcm0tY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZCwuaW52ZXJ0LWNvbG9yIC5mb3JtLXJhZGlvIGlucHV0OmNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjohaW1wb3J0YW50O2JvcmRlci1jb2xvcjohaW1wb3J0YW50fS5mb3JtLWdyb3Vwe2Rpc3BsYXk6ZmxleH0uZm9ybS1ncm91cCAuZm9ybS1pbnB1dHtmbGV4LWdyb3c6MTtmbGV4LXNocmluazoxO21hcmdpbi1yaWdodDoxMnB4fS5mb3JtLWdyb3VwIC5idXR0b257cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4O2ZsZXgtc2hyaW5rOjB9LmZvcm0taGludHtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMnB4O21hcmdpbi10b3A6OHB4fUBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCl7LmZvcm0tZ3JvdXAtZGVza3RvcCAuZm9ybS1pbnB1dHttYXJnaW4tYm90dG9tOjEycHh9LmZvcm0tZ3JvdXAtZGVza3RvcCAuYnV0dG9ue3dpZHRoOjEwMCV9fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LmZvcm0tZ3JvdXAtZGVza3RvcHtkaXNwbGF5OmZsZXh9LmZvcm0tZ3JvdXAtZGVza3RvcCAuZm9ybS1pbnB1dHtmbGV4LWdyb3c6MTtmbGV4LXNocmluazoxO21hcmdpbi1yaWdodDoxMnB4fS5mb3JtLWdyb3VwLWRlc2t0b3AgLmJ1dHRvbntwYWRkaW5nLWxlZnQ6MjRweDtwYWRkaW5nLXJpZ2h0OjI0cHg7ZmxleC1zaHJpbms6MH19LmhlYWRlci1uYXYtdG9nZ2xle2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7b3V0bGluZTowO3BhZGRpbmc6MDtjdXJzb3I6cG9pbnRlcn0uaGFtYnVyZ2VyLC5oYW1idXJnZXItaW5uZXJ7ZGlzcGxheTpibG9jaztwb2ludGVyLWV2ZW50czpub25lfS5oYW1idXJnZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MjRweDtoZWlnaHQ6MjRweH0uaGFtYnVyZ2VyLWlubmVyLC5oYW1idXJnZXItaW5uZXI6OmJlZm9yZSwuaGFtYnVyZ2VyLWlubmVyOjphZnRlcnt3aWR0aDoyNHB4O2hlaWdodDoycHg7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDojOTU5Q0IxfS5pbnZlcnQtY29sb3IgLmhhbWJ1cmdlci1pbm5lciwuaW52ZXJ0LWNvbG9yIC5oYW1idXJnZXItaW5uZXI6OmJlZm9yZSwuaW52ZXJ0LWNvbG9yIC5oYW1idXJnZXItaW5uZXI6OmFmdGVye2JhY2tncm91bmQ6IzFDMUQyMn0uaGFtYnVyZ2VyLWlubmVye3RvcDo1MCU7bWFyZ2luLXRvcDotMXB4O3RyYW5zaXRpb24tZHVyYXRpb246MC4yMnM7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOSl9LmhhbWJ1cmdlci1pbm5lcjo6YmVmb3JlLC5oYW1idXJnZXItaW5uZXI6OmFmdGVye2NvbnRlbnQ6Jyc7ZGlzcGxheTpibG9ja30uaGFtYnVyZ2VyLWlubmVyOjpiZWZvcmV7dG9wOi03cHg7dHJhbnNpdGlvbjp0b3AgMC4xcyAwLjI1cyBlYXNlLWluLCBvcGFjaXR5IDAuMXMgZWFzZS1pbn0uaGFtYnVyZ2VyLWlubmVyOjphZnRlcntib3R0b206LTdweDt0cmFuc2l0aW9uOmJvdHRvbSAwLjFzIDAuMjVzIGVhc2UtaW4sdHJhbnNmb3JtIDAuMjJzIGN1YmljLWJlemllcigwLjU1LCAwLjA1NSwgMC42NzUsIDAuMTkpLHdpZHRoIDAuMXMgMC4yNXMgZWFzZS1pbn0ub2ZmLW5hdi1pcy1hY3RpdmUgLmhhbWJ1cmdlci1pbm5lcnt0cmFuc2Zvcm06cm90YXRlKDIyNWRlZyk7dHJhbnNpdGlvbi1kZWxheTowLjEyczt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKX0ub2ZmLW5hdi1pcy1hY3RpdmUgLmhhbWJ1cmdlci1pbm5lcjo6YmVmb3Jle3RvcDowO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRvcCAwLjFzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMXMgMC4xMnMgZWFzZS1vdXR9Lm9mZi1uYXYtaXMtYWN0aXZlIC5oYW1idXJnZXItaW5uZXI6OmFmdGVye3dpZHRoOjI0cHg7Ym90dG9tOjA7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RyYW5zaXRpb246Ym90dG9tIDAuMXMgZWFzZS1vdXQsdHJhbnNmb3JtIDAuMjJzIDAuMTJzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpLHdpZHRoIDAuMXMgZWFzZS1vdXR9LmFjY29yZGlvbiBsaXtwb3NpdGlvbjpyZWxhdGl2ZX0uYWNjb3JkaW9uIGxpOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjkyQjMyfS5hY2NvcmRpb24gbGk6bGFzdC1vZi10eXBle3Bvc2l0aW9uOnJlbGF0aXZlfS5hY2NvcmRpb24gbGk6bGFzdC1vZi10eXBlOjphZnRlcntjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMyOTJCMzJ9LmludmVydC1jb2xvciAuYWNjb3JkaW9uIGxpe3Bvc2l0aW9uOnJlbGF0aXZlfS5pbnZlcnQtY29sb3IgLmFjY29yZGlvbiBsaTo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6I2U1ZTlmZn0uaW52ZXJ0LWNvbG9yIC5hY2NvcmRpb24gbGk6bGFzdC1vZi10eXBle3Bvc2l0aW9uOnJlbGF0aXZlfS5pbnZlcnQtY29sb3IgLmFjY29yZGlvbiBsaTpsYXN0LW9mLXR5cGU6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6I2U1ZTlmZn0uYWNjb3JkaW9uLWhlYWRlcntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmctdG9wOjI0cHg7cGFkZGluZy1ib3R0b206MjRweDtjdXJzb3I6cG9pbnRlcn0uYWNjb3JkaW9uLWhlYWRlciBzcGFue3dpZHRoOmNhbGMoMTAwJSAtICgxNnB4ICogMikpfS5hY2NvcmRpb24tY29udGVudHttYXgtaGVpZ2h0OjA7b3BhY2l0eTowO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOm1heC1oZWlnaHQgLjE1cyBlYXNlLWluLW91dCxvcGFjaXR5IC4xNXN9LmlzLWFjdGl2ZSAuYWNjb3JkaW9uLWNvbnRlbnR7b3BhY2l0eToxfS5hY2NvcmRpb24tY29udGVudCBwOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbToyNHB4fS5hY2NvcmRpb24taWNvbntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxNnB4O2hlaWdodDoxNnB4fS5hY2NvcmRpb24taWNvbjo6YmVmb3JlLC5hY2NvcmRpb24taWNvbjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOiMzNzZERjk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjI1cyBlYXNlLW91dH0uYWNjb3JkaW9uLWljb246OmJlZm9yZXt0b3A6MDtsZWZ0OjUwJTt3aWR0aDoycHg7aGVpZ2h0OjEwMCU7bWFyZ2luLWxlZnQ6LTFweH0uYWNjb3JkaW9uLWljb246OmFmdGVye3RvcDo1MCU7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjJweDttYXJnaW4tdG9wOi0xcHh9LmlzLWFjdGl2ZSAuYWNjb3JkaW9uLWljb257Y3Vyc29yOnBvaW50ZXJ9LmlzLWFjdGl2ZSAuYWNjb3JkaW9uLWljb246OmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0uaXMtYWN0aXZlIC5hY2NvcmRpb24taWNvbjo6YWZ0ZXJ7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5tb2RhbCwubW9kYWw6OmJlZm9yZXtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt0b3A6MH0ubW9kYWx7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo0MH0ubW9kYWwubW9kYWwtdmlkZW8gLm1vZGFsLWlubmVye3BhZGRpbmc6MDttYXgtd2lkdGg6MTAyNHB4fS5tb2RhbDo6YmVmb3JlLC5tb2RhbCAubW9kYWwtaW5uZXJ7ZGlzcGxheTpub25lfS5tb2RhbDo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIyLDIzLDI3LDAuODgpfS5tb2RhbC5pcy1hY3RpdmV7ZGlzcGxheTpmbGV4fS5tb2RhbC5pcy1hY3RpdmU6OmJlZm9yZSwubW9kYWwuaXMtYWN0aXZlIC5tb2RhbC1pbm5lcntkaXNwbGF5OmJsb2NrfS5tb2RhbC5pcy1hY3RpdmUgLm1vZGFsLWlubmVye2FuaW1hdGlvbjpzbGlkZVVwSW5Nb2RhbCAuMTVzIGVhc2UtaW4tb3V0IGJvdGh9Lm1vZGFsLmlzLWFjdGl2ZTo6YmVmb3Jle2FuaW1hdGlvbjpzbGlkZVVwSW5Nb2RhbEJnIC4xNXMgZWFzZS1pbi1vdXQgYm90aH0ubW9kYWwtaW5uZXJ7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMTZweCAqIDIpO292ZXJmbG93OmF1dG87cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6Y2FsYygxMDAlICAtICggMTZweCAqIDIgKSk7bWF4LXdpZHRoOjQ4MHB4O21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjE2cHg7YmFja2dyb3VuZDojMjkyQjMyfS5tb2RhbC1jb250ZW50e3BhZGRpbmc6NDhweCAxNnB4fS5tb2RhbC1jbG9zZXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO291dGxpbmU6MDtwYWRkaW5nOjA7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MjRweDt0b3A6MjRweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4fS5tb2RhbC1jbG9zZTo6YmVmb3JlLC5tb2RhbC1jbG9zZTo6YWZ0ZXJ7Y29udGVudDonJztkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luLXRvcDotMXB4O21hcmdpbi1sZWZ0Oi04cHg7d2lkdGg6MTZweDtoZWlnaHQ6MnB4O2JhY2tncm91bmQ6IzZBNkY4Mn0ubW9kYWwtY2xvc2U6OmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlKDIyNWRlZyl9Lm1vZGFsLWNsb3NlOjphZnRlcnt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9Lm1vZGFsLWNsb3NlOmhvdmVyOjpiZWZvcmUsLm1vZGFsLWNsb3NlOmhvdmVyOjphZnRlcntiYWNrZ3JvdW5kOiM5NTlDQjF9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsubW9kYWwtaW5uZXJ7bWFyZ2luOjAgYXV0bzttYXgtaGVpZ2h0OmNhbGMoMTAwdmggLSA0OHB4ICogMil9Lm1vZGFsLWNvbnRlbnR7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4O3BhZGRpbmctbGVmdDozMnB4O3BhZGRpbmctcmlnaHQ6MzJweH19QGtleWZyYW1lcyBzbGlkZVVwSW5Nb2RhbHswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTI0cHgpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19QGtleWZyYW1lcyBzbGlkZVVwSW5Nb2RhbEJnezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fS5jYXJvdXNlbC1pdGVte2Rpc3BsYXk6bm9uZX0uY2Fyb3VzZWwtaXRlbS5pcy1sb2FkaW5nOm5vdCguaXMtYWN0aXZlKXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MH0uY2Fyb3VzZWwtaXRlbS5pcy1hY3RpdmV7ZGlzcGxheTpibG9ja30uY2Fyb3VzZWwtYnVsbGV0c3tkaXNwbGF5OmlubGluZS1mbGV4fS5jYXJvdXNlbC1idWxsZXR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O3BhZGRpbmc6MDtjdXJzb3I6cG9pbnRlcjtsaW5lLWhlaWdodDowO2JvcmRlcjpub25lO2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9LmNhcm91c2VsLWJ1bGxldDo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo2cHg7dG9wOjZweDtiYWNrZ3JvdW5kOiMyOTJCMzI7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4yNXMgZWFzZX0uY2Fyb3VzZWwtYnVsbGV0OmZvY3Vze291dGxpbmU6bm9uZX0uY2Fyb3VzZWwtYnVsbGV0LmlzLWFjdGl2ZTo6YmVmb3Jle2JhY2tncm91bmQ6IzZBNkY4Mn0uY2Fyb3VzZWwtYnVsbGV0OmhvdmVyOjpiZWZvcmV7YmFja2dyb3VuZDojOTU5Q0IxfS5pbnZlcnQtY29sb3IgLmNhcm91c2VsLWJ1bGxldDo6YmVmb3Jle2JhY2tncm91bmQ6IzZBNkY4Mn0uaW52ZXJ0LWNvbG9yIC5jYXJvdXNlbC1idWxsZXQuaXMtYWN0aXZlOjpiZWZvcmV7YmFja2dyb3VuZDojMjkyQjMyfS5pbnZlcnQtY29sb3IgLmNhcm91c2VsLWJ1bGxldDpob3Zlcjo6YmVmb3Jle2JhY2tncm91bmQ6IzM3NkRGOX0uc3BsaXQtd3JhcHttYXJnaW4tdG9wOi0yNHB4fS5zcGxpdC13cmFwOmxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOi0yNHB4fS5zcGxpdC13cmFwOm5vdCg6bGFzdC1vZi10eXBlKXttYXJnaW4tYm90dG9tOjI0cHh9LnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW17cGFkZGluZy10b3A6MjRweDtwYWRkaW5nLWJvdHRvbToyNHB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW0gLnNwbGl0LWl0ZW0taW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJX0uc3BsaXQtd3JhcCAuc3BsaXQtaXRlbSAuc3BsaXQtaXRlbS1pbWFnZSBpbWcsLnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW0gLnNwbGl0LWl0ZW0taW1hZ2Ugc3ZnLC5zcGxpdC13cmFwIC5zcGxpdC1pdGVtIC5zcGxpdC1pdGVtLWltYWdlIHZpZGVve3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6dmlzaWJsZX0uc3BsaXQtd3JhcCAuc3BsaXQtaXRlbSAuc3BsaXQtaXRlbS1pbWFnZS5zcGxpdC1pdGVtLWltYWdlLWZpbGwgaW1nLC5zcGxpdC13cmFwIC5zcGxpdC1pdGVtIC5zcGxpdC1pdGVtLWltYWdlLnNwbGl0LWl0ZW0taW1hZ2UtZmlsbCBzdmcsLnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW0gLnNwbGl0LWl0ZW0taW1hZ2Uuc3BsaXQtaXRlbS1pbWFnZS1maWxsIHZpZGVve3dpZHRoOjEwMCV9QG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KXsuc3BsaXQtd3JhcCAuc3BsaXQtaXRlbSAuc3BsaXQtaXRlbS1jb250ZW50e21hcmdpbi1ib3R0b206MzJweH0uc3BsaXQtd3JhcC5pbnZlcnQtbW9iaWxlIC5zcGxpdC1pdGVtIC5zcGxpdC1pdGVtLWNvbnRlbnR7b3JkZXI6MTttYXJnaW4tYm90dG9tOjAgIWltcG9ydGFudH0uc3BsaXQtd3JhcC5pbnZlcnQtbW9iaWxlIC5zcGxpdC1pdGVtIC5zcGxpdC1pdGVtLWltYWdle21hcmdpbi1ib3R0b206MzJweH19QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc3BsaXQtd3JhcHttYXJnaW4tdG9wOi00MHB4fS5zcGxpdC13cmFwOmxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOi00MHB4fS5zcGxpdC13cmFwOm5vdCg6bGFzdC1vZi10eXBlKXttYXJnaW4tYm90dG9tOjQwcHh9LnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW17cGFkZGluZy10b3A6NDBweDtwYWRkaW5nLWJvdHRvbTo0MHB4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6bm93cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uc3BsaXQtd3JhcCAuc3BsaXQtaXRlbSAuc3BsaXQtaXRlbS1jb250ZW50e2ZsZXgtc2hyaW5rOjA7d2lkdGg6Mzk2cHg7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1yaWdodDo2NHB4fS5zcGxpdC13cmFwIC5zcGxpdC1pdGVtIC5zcGxpdC1pdGVtLWltYWdle21pbi13aWR0aDo0MzZweH0uc3BsaXQtd3JhcDpub3QoLmludmVydC1kZXNrdG9wKSAuc3BsaXQtaXRlbTpudGgtY2hpbGQoZXZlbiksLnNwbGl0LXdyYXAuaW52ZXJ0LWRlc2t0b3AgLnNwbGl0LWl0ZW06bnRoLWNoaWxkKG9kZCl7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zcGxpdC13cmFwOm5vdCguaW52ZXJ0LWRlc2t0b3ApIC5zcGxpdC1pdGVtOm50aC1jaGlsZChldmVuKSAuc3BsaXQtaXRlbS1jb250ZW50LC5zcGxpdC13cmFwLmludmVydC1kZXNrdG9wIC5zcGxpdC1pdGVtOm50aC1jaGlsZChvZGQpIC5zcGxpdC1pdGVtLWNvbnRlbnR7b3JkZXI6MTttYXJnaW4tbGVmdDo2NHB4O21hcmdpbi1yaWdodDowfS5zcGxpdC13cmFwOm5vdCguaW52ZXJ0LWRlc2t0b3ApIC5zcGxpdC1pdGVtOm50aC1jaGlsZChvZGQpIC5zcGxpdC1pdGVtLWltYWdlIGltZywuc3BsaXQtd3JhcDpub3QoLmludmVydC1kZXNrdG9wKSAuc3BsaXQtaXRlbTpudGgtY2hpbGQob2RkKSAuc3BsaXQtaXRlbS1pbWFnZSBzdmcsLnNwbGl0LXdyYXA6bm90KC5pbnZlcnQtZGVza3RvcCkgLnNwbGl0LWl0ZW06bnRoLWNoaWxkKG9kZCkgLnNwbGl0LWl0ZW0taW1hZ2UgdmlkZW8sLnNwbGl0LXdyYXAuaW52ZXJ0LWRlc2t0b3AgLnNwbGl0LWl0ZW06bnRoLWNoaWxkKGV2ZW4pIC5zcGxpdC1pdGVtLWltYWdlIGltZywuc3BsaXQtd3JhcC5pbnZlcnQtZGVza3RvcCAuc3BsaXQtaXRlbTpudGgtY2hpbGQoZXZlbikgLnNwbGl0LWl0ZW0taW1hZ2Ugc3ZnLC5zcGxpdC13cmFwLmludmVydC1kZXNrdG9wIC5zcGxpdC1pdGVtOm50aC1jaGlsZChldmVuKSAuc3BsaXQtaXRlbS1pbWFnZSB2aWRlb3ttYXJnaW4tbGVmdDphdXRvfS5zcGxpdC13cmFwLmFsaWduLXRvcCAuc3BsaXQtaXRlbXthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fX1AbWVkaWEgKG1pbi13aWR0aDogODIxcHgpey5jb250YWluZXIgLnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW0gLnNwbGl0LWl0ZW0tY29udGVudHt3aWR0aDo0ODhweH0uY29udGFpbmVyIC5zcGxpdC13cmFwIC5zcGxpdC1pdGVtIC5zcGxpdC1pdGVtLWltYWdle21pbi13aWR0aDo1MjhweH19LnRpbGVzLXdyYXB7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLXJpZ2h0Oi0xMnB4O21hcmdpbi1sZWZ0Oi0xMnB4O21hcmdpbi10b3A6LTEycHh9LnRpbGVzLXdyYXA6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206LTEycHh9LnRpbGVzLXdyYXA6bm90KDpsYXN0LW9mLXR5cGUpe21hcmdpbi1ib3R0b206MTJweH0udGlsZXMtd3JhcC5wdXNoLWxlZnQ6OmFmdGVye2NvbnRlbnQ6Jyc7ZmxleC1iYXNpczozMzBweDttYXgtd2lkdGg6MzMwcHg7Ym94LXNpemluZzpjb250ZW50LWJveDtwYWRkaW5nLWxlZnQ6MTJweDtwYWRkaW5nLXJpZ2h0OjEycHg7aGVpZ2h0OjB9LnRpbGVzLWl0ZW17ZmxleC1iYXNpczozMzBweDttYXgtd2lkdGg6MzMwcHg7Ym94LXNpemluZzpjb250ZW50LWJveDtwYWRkaW5nOjEycHh9LnRpbGVzLWl0ZW0gKntib3gtc2l6aW5nOmJvcmRlci1ib3h9LnRpbGVzLWl0ZW0taW5uZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtwYWRkaW5nOjMycHggMjRweH0uc2l0ZS1oZWFkZXJ7cG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDt0b3A6MDt3aWR0aDoxMDAlO3otaW5kZXg6MTAgIWltcG9ydGFudH0uc2l0ZS1oZWFkZXIrLnNpdGUtY29udGVudCAuc2VjdGlvbjpmaXJzdC1vZi10eXBle3BhZGRpbmctdG9wOjgwcHh9LnNpdGUtaGVhZGVyIC5icmFuZHttYXJnaW4tcmlnaHQ6MzJweH0uc2l0ZS1oZWFkZXItaW5uZXJ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6ODBweH0uaGVhZGVyLW5hdntmbGV4LWdyb3c6MX0uaGVhZGVyLW5hdiAuaGVhZGVyLW5hdi1pbm5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjF9LmhlYWRlci1uYXYgdWx7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LWdyb3c6MTt3aGl0ZS1zcGFjZTpub3dyYXA7bWFyZ2luLWJvdHRvbTowfS5oZWFkZXItbmF2IHVsOmZpcnN0LW9mLXR5cGV7ZmxleC13cmFwOndyYXB9LmhlYWRlci1uYXYgbGkrLmhlYWRlci1idXR0b257bWFyZ2luLWxlZnQ6MzJweH0uaGVhZGVyLW5hdiBhOm5vdCguYnV0dG9uKXtkaXNwbGF5OmJsb2NrO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7cGFkZGluZzowIDMycHh9LmludmVydC1jb2xvciAuaGVhZGVyLW5hdiBhOm5vdCguYnV0dG9uKXt0ZXh0LWRlY29yYXRpb246bm9uZX0uaGVhZGVyLW5hdiBhLmJ1dHRvbnttYXJnaW4tbGVmdDozMnB4fS5oZWFkZXItbmF2LWNlbnRlcjpmaXJzdC1vZi10eXBle2ZsZXgtZ3JvdzoxO2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uaGVhZGVyLW5hdi1yaWdodHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmhlYWRlci1uYXYtcmlnaHQrLmhlYWRlci1uYXYtcmlnaHR7ZmxleC1ncm93OjB9LmhlYWRlci1uYXYtdG9nZ2xle2Rpc3BsYXk6bm9uZX1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5oZWFkZXItbmF2LXRvZ2dsZXtkaXNwbGF5OmJsb2NrfS5oZWFkZXItbmF2LXRvZ2dsZSsuaGVhZGVyLW5hdntmbGV4LWRpcmVjdGlvbjpjb2x1bW47cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3JpZ2h0OjA7dG9wOjEwMCU7ei1pbmRleDo5OTk5O2JhY2tncm91bmQ6IzI5MkIzMjttYXgtaGVpZ2h0OjA7b3BhY2l0eTowO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOm1heC1oZWlnaHQgLjI1cyBlYXNlLWluLW91dCwgb3BhY2l0eSAuMTVzfS5oZWFkZXItbmF2LXRvZ2dsZSsuaGVhZGVyLW5hdi5pcy1hY3RpdmV7b3BhY2l0eToxfS5oZWFkZXItbmF2LXRvZ2dsZSsuaGVhZGVyLW5hdiAuaGVhZGVyLW5hdi1pbm5lcntmbGV4LWRpcmVjdGlvbjpjb2x1bW47cGFkZGluZzoyNHB4fS5oZWFkZXItbmF2LXRvZ2dsZSsuaGVhZGVyLW5hdiB1bHtkaXNwbGF5OmJsb2NrO3RleHQtYWxpZ246Y2VudGVyfS5oZWFkZXItbmF2LXRvZ2dsZSsuaGVhZGVyLW5hdiB1bCBhOm5vdCguYnV0dG9uKXtkaXNwbGF5OmlubGluZS1mbGV4O3BhZGRpbmctdG9wOjEycHg7cGFkZGluZy1ib3R0b206MTJweH0uaGVhZGVyLW5hdi10b2dnbGUrLmhlYWRlci1uYXYgYS5idXR0b257bWFyZ2luLWxlZnQ6MDttYXJnaW4tdG9wOjEycHg7bWFyZ2luLWJvdHRvbToxMnB4fX0uaXMtYm94ZWR7YmFja2dyb3VuZDojMWIxYzIxfS5pcy1ib3hlZCAuYm9keS13cmFwe21heC13aWR0aDoxNDQwcHg7bWFyZ2luOjAgYXV0bztib3gtc2hhZG93OjAgMjBweCA0OHB4IHJnYmEoMjIsMjMsMjcsMC44KX0uaXMtYm94ZWQgLmJvZHktd3JhcDo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMTYxNzFCO3otaW5kZXg6LTEwfS5ib2R5LXdyYXB7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLWhlaWdodDoxMDB2aH0uc2l0ZS1jb250ZW50e2ZsZXg6MSAwIGF1dG99LnNpdGUtZm9vdGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5zaXRlLWZvb3Rlcjo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMTYxNzFCO3otaW5kZXg6LTN9LnNpdGUtZm9vdGVyLWlubmVye3BhZGRpbmc6NDhweCAwfS5mb290ZXItdG9we3BhZGRpbmctYm90dG9tOjEycHh9LmZvb3Rlci1ib3R0b217cGFkZGluZy10b3A6MTJweH0uZm9vdGVyLWJsb2Nrc3tkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7bWFyZ2luLXJpZ2h0Oi0yNHB4O21hcmdpbi1sZWZ0Oi0yNHB4O21hcmdpbi10b3A6LTEycHh9LmZvb3Rlci1ibG9ja3M6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206MjhweH0uZm9vdGVyLWJsb2Nrczpub3QoOmxhc3Qtb2YtdHlwZSl7bWFyZ2luLWJvdHRvbToxMnB4fS5mb290ZXItYmxvY2t7ZmxleC1ncm93OjE7ZmxleC1iYXNpczoxNjBweDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3BhZGRpbmc6MTJweCAyNHB4fS5mb290ZXItYmxvY2sgKntib3gtc2l6aW5nOmJvcmRlci1ib3h9LmZvb3Rlci1ibG9jayB1bCBsaTpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1ib3R0b206NHB4fS5mb290ZXItYmxvY2sgYXtjb2xvcjojNkE2RjgyO3RleHQtZGVjb3JhdGlvbjpub25lfS5mb290ZXItYmxvY2sgYTpob3ZlciwuZm9vdGVyLWJsb2NrIGE6YWN0aXZle2NvbG9yOiM5NTlDQjF9LmludmVydC1jb2xvciAuZm9vdGVyLWJsb2NrIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmZvb3Rlci1ibG9jay10aXRsZXtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMnB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojRjlGQUZGO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTttYXJnaW4tYm90dG9tOjhweH0uaW52ZXJ0LWNvbG9yIC5mb290ZXItYmxvY2stdGl0bGV7Y29sb3I6IzE2MTcxQn0uZm9vdGVyLXNvY2lhbCBhLC5mb290ZXItbmF2IGF7ZGlzcGxheTpmbGV4fS5mb290ZXItc29jaWFsIHVsLC5mb290ZXItbmF2IHVse2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7bWFyZ2luLWJvdHRvbTowfS5mb290ZXItc29jaWFsIHVse21hcmdpbi1yaWdodDotMTZweDttYXJnaW4tbGVmdDotMTZweH0uZm9vdGVyLXNvY2lhbCBsaXtwYWRkaW5nOjAgOHB4fS5mb290ZXItc29jaWFsIGF7cGFkZGluZzo4cHh9LmZvb3Rlci1zb2NpYWwgYSBzdmd7ZmlsbDojMzc2REY5O3RyYW5zaXRpb246ZmlsbCAuMTVzIGVhc2V9LmZvb3Rlci1zb2NpYWwgYTpob3ZlciBzdmd7ZmlsbDojNjk5MUZBfS5mb290ZXItbmF2e21hcmdpbi1yaWdodDotMTJweDttYXJnaW4tbGVmdDotMTJweH0uZm9vdGVyLW5hdiBhe2NvbG9yOiM2QTZGODI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cGFkZGluZzowIDEycHh9LmZvb3Rlci1uYXYgYTpob3ZlciwuZm9vdGVyLW5hdiBhOmFjdGl2ZXtjb2xvcjojOTU5Q0IxfS5pbnZlcnQtY29sb3IgLmZvb3Rlci1uYXYgYXt0ZXh0LWRlY29yYXRpb246bm9uZX1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5mb290ZXItdG9wPio6bm90KDpsYXN0LWNoaWxkKSwuZm9vdGVyLWJvdHRvbT4qOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbToyNHB4fX1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5zaXRlLWZvb3Rlci1pbm5lcntwYWRkaW5nOjY0cHggMH0uZm9vdGVyLXRvcC5zcGFjZS1iZXR3ZWVuLC5mb290ZXItYm90dG9tLnNwYWNlLWJldHdlZW57ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcn0uZm9vdGVyLXRvcC5pbnZlcnQtb3JkZXItZGVza3RvcD4qOmZpcnN0LWNoaWxkLC5mb290ZXItYm90dG9tLmludmVydC1vcmRlci1kZXNrdG9wPio6Zmlyc3QtY2hpbGR7b3JkZXI6MX19LnNlY3Rpb24taW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4fS5zZWN0aW9uLWhlYWRlcntwYWRkaW5nLWJvdHRvbTo0OHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNlY3Rpb24taW5uZXJ7cGFkZGluZy10b3A6ODBweDtwYWRkaW5nLWJvdHRvbTo4MHB4fS5zZWN0aW9uLWhlYWRlcntwYWRkaW5nLWJvdHRvbTo4MHB4fX0uaGVyby1pbm5lcj4uaGVyby1jb250ZW50Ky5oZXJvLWZpZ3VyZSwuaGVyby1pbm5lcj4uaGVyby1maWd1cmUrLmhlcm8tY29udGVudHttYXJnaW4tdG9wOjQ4cHh9Lmhlcm8taW5uZXI+Lmhlcm8tZmlndXJlPmF7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7dmVydGljYWwtYWxpZ246dG9wfUBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCl7Lmhlcm8gLnNwbGl0LXdyYXAgLnNwbGl0LWl0ZW0gLnNwbGl0LWl0ZW0tY29udGVudHttYXJnaW4tYm90dG9tOjQ4cHh9Lmhlcm8gLnNwbGl0LXdyYXAuaW52ZXJ0LW1vYmlsZSAuc3BsaXQtaXRlbSAuc3BsaXQtaXRlbS1pbWFnZXttYXJnaW4tYm90dG9tOjQ4cHh9fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7Lmhlcm8taW5uZXI+Lmhlcm8tY29udGVudCsuaGVyby1maWd1cmUsLmhlcm8taW5uZXI+Lmhlcm8tZmlndXJlKy5oZXJvLWNvbnRlbnR7bWFyZ2luLXRvcDo2NHB4fX1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5mZWF0dXJlcy1zcGxpdCAuc2VjdGlvbi1oZWFkZXJ7cGFkZGluZy1ib3R0b206OTJweH19LmZlYXR1cmVzLXRpbGVzIC50aWxlcy13cmFwe21hcmdpbi1yaWdodDotMTZweDttYXJnaW4tbGVmdDotMTZweDttYXJnaW4tdG9wOi0xNnB4fS5mZWF0dXJlcy10aWxlcyAudGlsZXMtd3JhcDpsYXN0LW9mLXR5cGV7bWFyZ2luLWJvdHRvbTotMTZweH0uZmVhdHVyZXMtdGlsZXMgLnRpbGVzLXdyYXA6bm90KDpsYXN0LW9mLXR5cGUpe21hcmdpbi1ib3R0b206MTZweH0uZmVhdHVyZXMtdGlsZXMgLnRpbGVzLXdyYXAucHVzaC1sZWZ0OjphZnRlcntmbGV4LWJhc2lzOjM2MHB4O21heC13aWR0aDozNjBweDtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjE2cHh9LmZlYXR1cmVzLXRpbGVzIC50aWxlcy1pdGVte2ZsZXgtYmFzaXM6MzYwcHg7bWF4LXdpZHRoOjM2MHB4O3BhZGRpbmc6MTZweH0uZmVhdHVyZXMtdGlsZXMgLnRpbGVzLWl0ZW0taW5uZXJ7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5mZWF0dXJlcy10aWxlcyAudGlsZXMtd3JhcHttYXJnaW4tcmlnaHQ6LTMycHg7bWFyZ2luLWxlZnQ6LTMycHg7bWFyZ2luLXRvcDotMzJweH0uZmVhdHVyZXMtdGlsZXMgLnRpbGVzLXdyYXA6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206LTMycHh9LmZlYXR1cmVzLXRpbGVzIC50aWxlcy13cmFwOm5vdCg6bGFzdC1vZi10eXBlKXttYXJnaW4tYm90dG9tOjMycHh9LmZlYXR1cmVzLXRpbGVzIC50aWxlcy13cmFwLnB1c2gtbGVmdDo6YWZ0ZXJ7cGFkZGluZy1sZWZ0OjMycHg7cGFkZGluZy1yaWdodDozMnB4fS5mZWF0dXJlcy10aWxlcyAudGlsZXMtaXRlbXtwYWRkaW5nOjMycHh9fS5wcmljaW5nIC50aWxlcy13cmFwLnB1c2gtbGVmdDo6YWZ0ZXJ7ZmxleC1iYXNpczozNDRweDttYXgtd2lkdGg6MzQ0cHh9LnByaWNpbmcgLnRpbGVzLWl0ZW17ZmxleC1iYXNpczozNDRweDttYXgtd2lkdGg6MzQ0cHh9LnByaWNpbmcgLnRpbGVzLWl0ZW0taW5uZXJ7cGFkZGluZy10b3A6MjRweDtwYWRkaW5nLWJvdHRvbToyNHB4O3BhZGRpbmctbGVmdDoyNHB4O3BhZGRpbmctcmlnaHQ6MjRweH0ucHJpY2luZy1pdGVtLWNvbnRlbnR7ZmxleC1ncm93OjE7d2lkdGg6MTAwJX11bC5wcmljaW5nLWl0ZW0tZmVhdHVyZXMtbGlzdCBsaXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTJweH0ucHJpY2luZy1zd2l0Y2hlcnttYXJnaW4tYm90dG9tOjQ4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsucHJpY2luZy1zd2l0Y2hlcnttYXJnaW4tYm90dG9tOjY0cHh9fS50ZXN0aW1vbmlhbCAudGlsZXMtd3JhcC5wdXNoLWxlZnQ6OmFmdGVye2ZsZXgtYmFzaXM6MzQ0cHg7bWF4LXdpZHRoOjM0NHB4fS50ZXN0aW1vbmlhbCAudGlsZXMtaXRlbXtmbGV4LWJhc2lzOjM0NHB4O21heC13aWR0aDozNDRweH0udGVzdGltb25pYWwgLnRpbGVzLWl0ZW0taW5uZXJ7cGFkZGluZy10b3A6MjBweDtwYWRkaW5nLWJvdHRvbToyMHB4O3BhZGRpbmctbGVmdDoyNHB4O3BhZGRpbmctcmlnaHQ6MjRweH0udGVzdGltb25pYWwtaXRlbS1jb250ZW50e2ZsZXgtZ3JvdzoxfS50ZXN0aW1vbmlhbC1pdGVtLXNvdXJjZXtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcn0udGVhbSAudGlsZXMtd3JhcHttYXJnaW4tcmlnaHQ6LTE2cHg7bWFyZ2luLWxlZnQ6LTE2cHg7bWFyZ2luLXRvcDotMTZweH0udGVhbSAudGlsZXMtd3JhcDpsYXN0LW9mLXR5cGV7bWFyZ2luLWJvdHRvbTotMTZweH0udGVhbSAudGlsZXMtd3JhcDpub3QoOmxhc3Qtb2YtdHlwZSl7bWFyZ2luLWJvdHRvbToxNnB4fS50ZWFtIC50aWxlcy13cmFwLnB1c2gtbGVmdDo6YWZ0ZXJ7ZmxleC1iYXNpczoyOTZweDttYXgtd2lkdGg6Mjk2cHg7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDoxNnB4fS50ZWFtIC50aWxlcy1pdGVte2ZsZXgtYmFzaXM6Mjk2cHg7bWF4LXdpZHRoOjI5NnB4O3BhZGRpbmc6MTZweH0udGVhbSAudGlsZXMtaXRlbS1pbm5lcntwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjA7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnRlYW0gLnNlY3Rpb24taGVhZGVye3BhZGRpbmctYm90dG9tOjgwcHh9LnRlYW0gLnRpbGVzLXdyYXB7bWFyZ2luLXJpZ2h0Oi0zMnB4O21hcmdpbi1sZWZ0Oi0zMnB4O21hcmdpbi10b3A6LTMycHh9LnRlYW0gLnRpbGVzLXdyYXA6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206LTMycHh9LnRlYW0gLnRpbGVzLXdyYXA6bm90KDpsYXN0LW9mLXR5cGUpe21hcmdpbi1ib3R0b206MzJweH0udGVhbSAudGlsZXMtd3JhcC5wdXNoLWxlZnQ6OmFmdGVye3BhZGRpbmctbGVmdDozMnB4O3BhZGRpbmctcmlnaHQ6MzJweH0udGVhbSAudGlsZXMtaXRlbXtwYWRkaW5nOjMycHh9fS5jdGEgLnNlY3Rpb24taW5uZXJ7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4fS5jdGEtc2xvZ2Fue21hcmdpbi1ib3R0b206NDBweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5jdGEgLnNlY3Rpb24taW5uZXJ7cGFkZGluZy10b3A6NjRweDtwYWRkaW5nLWJvdHRvbTo2NHB4fS5jdGEtc3BsaXR7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcn0uY3RhLXNwbGl0IC5jdGEtc2xvZ2Fue21hcmdpbi1ib3R0b206MDttYXJnaW4tcmlnaHQ6NDhweH19LmNsaWVudHMgLnNlY3Rpb24taW5uZXJ7cGFkZGluZy10b3A6MjZweDtwYWRkaW5nLWJvdHRvbToyNnB4fS5jbGllbnRzLWlubmVyIHVse2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luOjB9LmNsaWVudHMtaW5uZXIgbGl7cGFkZGluZzoxMnB4IDI4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuY2xpZW50cyAuY2xpZW50cy1pbm5lciB1bHtmbGV4LWRpcmVjdGlvbjpyb3d9fS5zaWduaW4gLnNlY3Rpb24taGVhZGVye3BhZGRpbmctYm90dG9tOjMycHh9LnNpZ25pbiAudGlsZXMtaXRlbS1pbm5lcntwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjA7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpZ25pbiAuc2VjdGlvbi1oZWFkZXJ7cGFkZGluZy1ib3R0b206NDhweH19LnNpZ25pbi1mb290ZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufVtjbGFzcyo9aWxsdXN0cmF0aW9uLV17cG9zaXRpb246cmVsYXRpdmV9W2NsYXNzKj1pbGx1c3RyYXRpb24tXTo6YWZ0ZXJ7cG9pbnRlci1ldmVudHM6bm9uZX1bY2xhc3MqPWlsbHVzdHJhdGlvbi1lbGVtZW50LV06OmFmdGVye3otaW5kZXg6LTF9W2NsYXNzKj1pbGx1c3RyYXRpb24tc2VjdGlvbi1dOjphZnRlcnt6LWluZGV4Oi0yfS5pbGx1c3RyYXRpb24tc2VjdGlvbi0wMTo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO2hlaWdodDo2MTJweDtiYWNrZ3JvdW5kLWltYWdlOnVybCguLi9pbWFnZXMvaWxsdXN0cmF0aW9uLXNlY3Rpb24tMDEuc3ZnKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOmF1dG87bGVmdDo1MCU7dG9wOjA7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXIgdG9wO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSl9LmlsbHVzdHJhdGlvbi1zZWN0aW9uLTAyOjphZnRlcntjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OjYxMnB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKC4uL2ltYWdlcy9pbGx1c3RyYXRpb24tc2VjdGlvbi0wMi5zdmcpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6YXV0bztsZWZ0OjUwJTt0b3A6MDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlciB0b3A7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlKX0uc2l0ZS1mb290ZXJ7Y29sb3I6IzZBNkY4Mn0uZmVhdHVyZXMtdGlsZXMtaXRlbS1pbWFnZXtkaXNwbGF5OmlubGluZS1mbGV4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBib3R0b20sICMzNzZERjkgMCUsICNmZjc5YWYgNTAlLCAjRkY4RDc0IDEwMCUpfS5wcmljaW5nIC50aWxlcy1pdGVtLWlubmVye2JhY2tncm91bmQ6IzI5MkIzMn0ucHJpY2luZy1pdGVtLWhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0ucHJpY2luZy1pdGVtLWhlYWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjkyQjMyfS5wcmljaW5nLWl0ZW0taGVhZGVyOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMTA2LDExMSwxMzAsMC4zMik7bWF4LXdpZHRoOjg4cHh9LnByaWNpbmctaXRlbS1wcmljZS1jdXJyZW5jeXtjb2xvcjojOTU5Q0IxfXVsLnByaWNpbmctaXRlbS1mZWF0dXJlcy1saXN0e3Bvc2l0aW9uOnJlbGF0aXZlfXVsLnByaWNpbmctaXRlbS1mZWF0dXJlcy1saXN0OjphZnRlcntjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMyOTJCMzJ9dWwucHJpY2luZy1pdGVtLWZlYXR1cmVzLWxpc3Q6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgxMDYsMTExLDEzMCwwLjMyKX11bC5wcmljaW5nLWl0ZW0tZmVhdHVyZXMtbGlzdCBsaXttYXJnaW4tYm90dG9tOjA7cGFkZGluZzoxNHB4IDA7cG9zaXRpb246cmVsYXRpdmV9dWwucHJpY2luZy1pdGVtLWZlYXR1cmVzLWxpc3QgbGk6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMyOTJCMzJ9dWwucHJpY2luZy1pdGVtLWZlYXR1cmVzLWxpc3QgbGk6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMTA2LDExMSwxMzAsMC4zMil9dWwucHJpY2luZy1pdGVtLWZlYXR1cmVzLWxpc3QgbGk6OmFmdGVye2NvbnRlbnQ6Jyc7ZGlzcGxheTpibG9jazt3aWR0aDoyNHB4O2hlaWdodDoyNHB4O21hcmdpbi1yaWdodDoxMnB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9VVMtQVNDSUksJTNDc3ZnJTIwd2lkdGglM0QlMjIyNCUyMiUyMGhlaWdodCUzRCUyMjI0JTIyJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlM0UlM0NwYXRoJTIwZCUzRCUyMk01JTIwMTFoMTR2Mkg1eiUyMiUyMGZpbGwlM0QlMjIlMjM2QTZGODIlMjIlMjBmaWxsLXJ1bGUlM0QlMjJub256ZXJvJTIyJTJGJTNFJTNDJTJGc3ZnJTNFXCIpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtvcmRlcjotMX11bC5wcmljaW5nLWl0ZW0tZmVhdHVyZXMtbGlzdCBsaS5pcy1jaGVja2VkOjphZnRlcntiYWNrZ3JvdW5kLWltYWdlOnVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PVVTLUFTQ0lJLCUzQ3N2ZyUyMHdpZHRoJTNEJTIyMjQlMjIlMjBoZWlnaHQlM0QlMjIyNCUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTNFJTNDZyUyMGZpbGwtcnVsZSUzRCUyMm5vbnplcm8lMjIlMjBmaWxsJTNEJTIybm9uZSUyMiUzRSUzQ2NpcmNsZSUyMGZpbGwlM0QlMjIlMjMxRUMxOTglMjIlMjBjeCUzRCUyMjEyJTIyJTIwY3klM0QlMjIxMiUyMiUyMHIlM0QlMjIxMiUyMiUyRiUzRSUzQ3BhdGglMjBmaWxsJTNEJTIyJTIzMjkyQjMyJTIyJTIwZCUzRCUyMk0xMC41JTIwMTIuMjY3bC0yLjUtMS42LTElMjAxLjA2NkwxMC41JTIwMTYlMjAxNyUyMDkuMDY3JTIwMTYlMjA4eiUyMiUyRiUzRSUzQyUyRmclM0UlM0MlMkZzdmclM0VcIil9LnRlc3RpbW9uaWFsIC50aWxlcy1pdGVtLWlubmVye2JhY2tncm91bmQ6IzI5MkIzMn0udGVzdGltb25pYWwtaXRlbS1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlfS50ZXN0aW1vbmlhbC1pdGVtLWNvbnRlbnQ6OmJlZm9yZXtjb250ZW50OicnO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MjRweDtoZWlnaHQ6MThweDttYXJnaW4tdG9wOjEycHg7bWFyZ2luLWJvdHRvbToxNnB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9VVMtQVNDSUksJTNDc3ZnJTIwd2lkdGglM0QlMjIyNCUyMiUyMGhlaWdodCUzRCUyMjE4JTIyJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlM0UlM0NwYXRoJTIwZCUzRCUyMk0wJTIwMTMuNDgxYzAtMi4zNC42MTEtNC43NjElMjAxLjgzMy03LjI2M0MzLjA1NiUyMDMuNzE2JTIwNC43MzMlMjAxLjY0MyUyMDYuODY1JTIwMEwxMSUyMDIuNjg5QzkuNzI2JTIwNC4zODIlMjA4Ljc3NyUyMDYuMDkzJTIwOC4xNTIlMjA3LjgyNGMtLjYyNCUyMDEuNzMtLjkzNiUyMDMuNTc4LS45MzYlMjA1LjU0NVYxOEgwdi00LjUxOXptMTMlMjAwYzAtMi4zNC42MTEtNC43NjElMjAxLjgzMy03LjI2MyUyMDEuMjIzLTIuNTAyJTIwMi45LTQuNTc1JTIwNS4wMzItNi4yMThMMjQlMjAyLjY4OWMtMS4yNzQlMjAxLjY5My0yLjIyMyUyMDMuNDA0LTIuODQ4JTIwNS4xMzUtLjYyNCUyMDEuNzMtLjkzNiUyMDMuNTc4LS45MzYlMjA1LjU0NVYxOEgxM3YtNC41MTl6JTIyJTIwZmlsbCUzRCUyMiUyM0ZGNUZBMCUyMiUyMGZpbGwtcnVsZSUzRCUyMm5vbnplcm8lMjIlMkYlM0UlM0MlMkZzdmclM0VcIik7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS50ZXN0aW1vbmlhbC1pdGVtLWZvb3Rlcntmb250LWZhbWlseTpcIkZpcmEgU2Fuc1wiLCBzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nLXRvcDoyMHB4fS50ZXN0aW1vbmlhbC1pdGVtLWZvb3Rlci5oYXMtdG9wLWRpdmlkZXI6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMTA2LDExMSwxMzAsMC4zMil9LnRlc3RpbW9uaWFsLWl0ZW0tbGlua3tjb2xvcjojMzc2REY5fS50ZXN0aW1vbmlhbC1pdGVtLWxpbmsgYXtjb2xvcjojMzc2REY5O3RleHQtZGVjb3JhdGlvbjpub25lfS50ZXN0aW1vbmlhbC1pdGVtLWxpbmsgYTpob3Zlcntjb2xvcjojNjk5MUZBfS5jdGEgLmZvcm0taW5wdXR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MnB4fS5jdGEtaW5uZXJ7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDoxNnB4O2JhY2tncm91bmQtY29sb3I6IzM3NkRGOTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMDBkZWcsICMzNzZERjkgMCwgI0ZGNUZBMCA3NSUsICNGRkM1NUEgMTAwJSl9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuY3RhIC5mb3JtLWlucHV0e21pbi13aWR0aDoyODBweH0uY3RhLWlubmVye3BhZGRpbmctbGVmdDo0OHB4O3BhZGRpbmctcmlnaHQ6NDhweH19LnNjcmVlbi1yZWFkZXJ7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwgMCwgMCwgMCk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlcjowfS5saXN0LXJlc2V0e2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjB9Lmxpc3QtcmVzZXQgbGl7bWFyZ2luOjB9LnRhLWx7dGV4dC1hbGlnbjpsZWZ0fS50YS1je3RleHQtYWxpZ246Y2VudGVyfS50YS1ye3RleHQtYWxpZ246cmlnaHR9LmZ3LTQwMHtmb250LXdlaWdodDo0MDB9LmZ3LTUwMHtmb250LXdlaWdodDo1MDB9LmZ3LTYwMHtmb250LXdlaWdodDo2MDB9LmZ3LTcwMHtmb250LXdlaWdodDo3MDB9LnRleHQtY29sb3ItaGlnaHtjb2xvcjojRjlGQUZGfS50ZXh0LWNvbG9yLW1pZHtjb2xvcjojOTU5Q0IxfS50ZXh0LWNvbG9yLWxvd3tjb2xvcjojNkE2RjgyfS50ZXh0LWNvbG9yLXByaW1hcnl7Y29sb3I6IzM3NkRGOX0udGV4dC1jb2xvci1zZWNvbmRhcnl7Y29sb3I6I0ZGNUZBMH0udGV4dC1jb2xvci1lcnJvcntjb2xvcjojRkY1RkEwfS50ZXh0LWNvbG9yLXdhcm5pbmd7Y29sb3I6I0ZGQzU1QX0udGV4dC1jb2xvci1zdWNjZXNze2NvbG9yOiMxRUMxOTh9LmludmVydC1jb2xvciAudGV4dC1jb2xvci1oaWdoe2NvbG9yOiMxNjE3MUJ9LmludmVydC1jb2xvciAudGV4dC1jb2xvci1taWR7Y29sb3I6IzFDMUQyMn0uaW52ZXJ0LWNvbG9yIC50ZXh0LWNvbG9yLWxvd3tjb2xvcjojNkE2RjgyfS50dC11e3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaW1hZ2UtZnVsbHt3aWR0aDoxMDAlfS5pbWFnZS1sYXJnZXJ7cG9zaXRpb246cmVsYXRpdmU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7d2lkdGg6Y2FsYygxMDAlICsgOTZweCk7bWF4LXdpZHRoOjEwMHZ3fS5oYXMtYmctY29sb3J7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3otaW5kZXg6MH0uaGFzLXNoYWRvd3tib3gtc2hhZG93OjAgMjRweCA2NHB4IHJnYmEoMjIsMjMsMjcsMC42NCl9aW1nLmhhcy1zaGFkb3d7Ym9yZGVyLXJhZGl1czoycHh9Lmhhcy10b3AtZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uaGFzLXRvcC1kaXZpZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjkyQjMyfS5oYXMtYm90dG9tLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy1ib3R0b20tZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjkyQjMyfS5pbnZlcnQtY29sb3IgLmhhcy10b3AtZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uaW52ZXJ0LWNvbG9yIC5oYXMtdG9wLWRpdmlkZXI6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiNlNWU5ZmZ9LmludmVydC1jb2xvciAuaGFzLWJvdHRvbS1kaXZpZGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5pbnZlcnQtY29sb3IgLmhhcy1ib3R0b20tZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojZTVlOWZmfS5jZW50ZXItY29udGVudHt0ZXh0LWFsaWduOmNlbnRlcn0uY2VudGVyLWNvbnRlbnQgaW1nLC5jZW50ZXItY29udGVudCBzdmcsLmNlbnRlci1jb250ZW50IHZpZGVve21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LmNlbnRlci1jb250ZW50IC5idXR0b24tZ3JvdXB7anVzdGlmeS1jb250ZW50OmNlbnRlcn0ucmVzcG9uc2l2ZS12aWRlb3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLWJvdHRvbTo1Ni4yNSU7aGVpZ2h0OjB9LnJlc3BvbnNpdmUtdmlkZW8uaXMtNC0ze3BhZGRpbmctYm90dG9tOjc1JX0ucmVzcG9uc2l2ZS12aWRlbyBpZnJhbWV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9Lm0tMHttYXJnaW46MH0ubXQtMHttYXJnaW4tdG9wOjB9Lm1yLTB7bWFyZ2luLXJpZ2h0OjB9Lm1iLTB7bWFyZ2luLWJvdHRvbTowfS5tbC0we21hcmdpbi1sZWZ0OjB9Lm0tNHttYXJnaW46NHB4fS5tdC00e21hcmdpbi10b3A6NHB4fS5tci00e21hcmdpbi1yaWdodDo0cHh9Lm1iLTR7bWFyZ2luLWJvdHRvbTo0cHh9Lm1sLTR7bWFyZ2luLWxlZnQ6NHB4fS5tLTh7bWFyZ2luOjhweH0ubXQtOHttYXJnaW4tdG9wOjhweH0ubXItOHttYXJnaW4tcmlnaHQ6OHB4fS5tYi04e21hcmdpbi1ib3R0b206OHB4fS5tbC04e21hcmdpbi1sZWZ0OjhweH0ubS0xMnttYXJnaW46MTJweH0ubXQtMTJ7bWFyZ2luLXRvcDoxMnB4fS5tci0xMnttYXJnaW4tcmlnaHQ6MTJweH0ubWItMTJ7bWFyZ2luLWJvdHRvbToxMnB4fS5tbC0xMnttYXJnaW4tbGVmdDoxMnB4fS5tLTE2e21hcmdpbjoxNnB4fS5tdC0xNnttYXJnaW4tdG9wOjE2cHh9Lm1yLTE2e21hcmdpbi1yaWdodDoxNnB4fS5tYi0xNnttYXJnaW4tYm90dG9tOjE2cHh9Lm1sLTE2e21hcmdpbi1sZWZ0OjE2cHh9Lm0tMjR7bWFyZ2luOjI0cHh9Lm10LTI0e21hcmdpbi10b3A6MjRweH0ubXItMjR7bWFyZ2luLXJpZ2h0OjI0cHh9Lm1iLTI0e21hcmdpbi1ib3R0b206MjRweH0ubWwtMjR7bWFyZ2luLWxlZnQ6MjRweH0ubS0zMnttYXJnaW46MzJweH0ubXQtMzJ7bWFyZ2luLXRvcDozMnB4fS5tci0zMnttYXJnaW4tcmlnaHQ6MzJweH0ubWItMzJ7bWFyZ2luLWJvdHRvbTozMnB4fS5tbC0zMnttYXJnaW4tbGVmdDozMnB4fS5wLTB7cGFkZGluZzowfS5wdC0we3BhZGRpbmctdG9wOjB9LnByLTB7cGFkZGluZy1yaWdodDowfS5wYi0we3BhZGRpbmctYm90dG9tOjB9LnBsLTB7cGFkZGluZy1sZWZ0OjB9LnAtNHtwYWRkaW5nOjRweH0ucHQtNHtwYWRkaW5nLXRvcDo0cHh9LnByLTR7cGFkZGluZy1yaWdodDo0cHh9LnBiLTR7cGFkZGluZy1ib3R0b206NHB4fS5wbC00e3BhZGRpbmctbGVmdDo0cHh9LnAtOHtwYWRkaW5nOjhweH0ucHQtOHtwYWRkaW5nLXRvcDo4cHh9LnByLTh7cGFkZGluZy1yaWdodDo4cHh9LnBiLTh7cGFkZGluZy1ib3R0b206OHB4fS5wbC04e3BhZGRpbmctbGVmdDo4cHh9LnAtMTJ7cGFkZGluZzoxMnB4fS5wdC0xMntwYWRkaW5nLXRvcDoxMnB4fS5wci0xMntwYWRkaW5nLXJpZ2h0OjEycHh9LnBiLTEye3BhZGRpbmctYm90dG9tOjEycHh9LnBsLTEye3BhZGRpbmctbGVmdDoxMnB4fS5wLTE2e3BhZGRpbmc6MTZweH0ucHQtMTZ7cGFkZGluZy10b3A6MTZweH0ucHItMTZ7cGFkZGluZy1yaWdodDoxNnB4fS5wYi0xNntwYWRkaW5nLWJvdHRvbToxNnB4fS5wbC0xNntwYWRkaW5nLWxlZnQ6MTZweH0ucC0yNHtwYWRkaW5nOjI0cHh9LnB0LTI0e3BhZGRpbmctdG9wOjI0cHh9LnByLTI0e3BhZGRpbmctcmlnaHQ6MjRweH0ucGItMjR7cGFkZGluZy1ib3R0b206MjRweH0ucGwtMjR7cGFkZGluZy1sZWZ0OjI0cHh9LnAtMzJ7cGFkZGluZzozMnB4fS5wdC0zMntwYWRkaW5nLXRvcDozMnB4fS5wci0zMntwYWRkaW5nLXJpZ2h0OjMycHh9LnBiLTMye3BhZGRpbmctYm90dG9tOjMycHh9LnBsLTMye3BhZGRpbmctbGVmdDozMnB4fS5zcGFjZXItNHtwYWRkaW5nLXRvcDo0cHh9LnNwYWNlci04e3BhZGRpbmctdG9wOjhweH0uc3BhY2VyLTEye3BhZGRpbmctdG9wOjEycHh9LnNwYWNlci0xNntwYWRkaW5nLXRvcDoxNnB4fS5zcGFjZXItMjR7cGFkZGluZy10b3A6MjRweH0uc3BhY2VyLTMye3BhZGRpbmctdG9wOjMycHh9LnNwYWNlci00OHtwYWRkaW5nLXRvcDo0OHB4fS5zcGFjZXItNjR7cGFkZGluZy10b3A6NjRweH1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey50YS1sLW1vYmlsZXt0ZXh0LWFsaWduOmxlZnR9LnRhLWMtbW9iaWxle3RleHQtYWxpZ246Y2VudGVyfS50YS1yLW1vYmlsZXt0ZXh0LWFsaWduOnJpZ2h0fS5jZW50ZXItY29udGVudC1tb2JpbGV7dGV4dC1hbGlnbjpjZW50ZXJ9LmNlbnRlci1jb250ZW50LW1vYmlsZSBpbWcsLmNlbnRlci1jb250ZW50LW1vYmlsZSBzdmcsLmNlbnRlci1jb250ZW50LW1vYmlsZSB2aWRlb3ttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS5jZW50ZXItY29udGVudC1tb2JpbGUgLmJ1dHRvbi1ncm91cHtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5zcGFjZXItNC1tb2JpbGV7cGFkZGluZy10b3A6NHB4fS5zcGFjZXItOC1tb2JpbGV7cGFkZGluZy10b3A6OHB4fS5zcGFjZXItMTItbW9iaWxle3BhZGRpbmctdG9wOjEycHh9LnNwYWNlci0xNi1tb2JpbGV7cGFkZGluZy10b3A6MTZweH0uc3BhY2VyLTI0LW1vYmlsZXtwYWRkaW5nLXRvcDoyNHB4fS5zcGFjZXItMzItbW9iaWxle3BhZGRpbmctdG9wOjMycHh9LnNwYWNlci00OC1tb2JpbGV7cGFkZGluZy10b3A6NDhweH0uc3BhY2VyLTY0LW1vYmlsZXtwYWRkaW5nLXRvcDo2NHB4fX1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey50YS1sLWRlc2t0b3B7dGV4dC1hbGlnbjpsZWZ0fS50YS1jLWRlc2t0b3B7dGV4dC1hbGlnbjpjZW50ZXJ9LnRhLXItZGVza3RvcHt0ZXh0LWFsaWduOnJpZ2h0fS5jZW50ZXItY29udGVudC1kZXNrdG9we3RleHQtYWxpZ246Y2VudGVyfS5jZW50ZXItY29udGVudC1kZXNrdG9wIGltZywuY2VudGVyLWNvbnRlbnQtZGVza3RvcCBzdmcsLmNlbnRlci1jb250ZW50LWRlc2t0b3AgdmlkZW97bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0b30uY2VudGVyLWNvbnRlbnQtZGVza3RvcCAuYnV0dG9uLWdyb3Vwe2p1c3RpZnktY29udGVudDpjZW50ZXJ9fVxuIl19 */ - -/*Pulse Button*/ -.pulse { - box-shadow: 0 0 0 rgba(120, 120, 120, 0.4); - animation: pulse 4s infinite; -} -.pulse:hover { - animation: none; -} - -@-webkit-keyframes pulse { - 0% { - -webkit-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0.4); - } - 70% { - -webkit-box-shadow: 0 0 0 15px rgba(120, 120, 120, 0); - } - 100% { - -webkit-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0); - } -} -@keyframes pulse { - 0% { - -moz-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0.4); - box-shadow: 0 0 0 0 rgba(120, 120, 120, 0.4); - } - 70% { - -moz-box-shadow: 0 0 0 10px rgba(120, 120, 120, 0); - box-shadow: 0 0 0 15px rgba(120, 120, 120, 0); - } - 100% { - -moz-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0); - box-shadow: 0 0 0 0 rgba(120, 120, 120, 0); - } -} -/*Pulse Button*/ diff --git a/public/css/newcall.css b/public/css/newcall.css deleted file mode 100644 index d0b4901..0000000 --- a/public/css/newcall.css +++ /dev/null @@ -1,27 +0,0 @@ -@media (max-width: 640px) { - .section:first-of-type { - min-height: 0; - } - - section:first-of-type .hero-inner { - padding-top: 1rem; - padding-bottom: 0; - } - - section:first-of-type .hero-inner .split-item { - padding: 0; - } - - section:nth-of-type(2) { - margin-top: 2rem; - } - - section:nth-of-type(2) .section-inner { - padding-top: 1rem; - padding-bottom: 0.5rem; - } - - section:nth-of-type(2) .section-inner .cta-slogan { - margin-bottom: 1rem; - } -} diff --git a/public/css/snackbar.css b/public/css/snackbar.css deleted file mode 100644 index 256f784..0000000 --- a/public/css/snackbar.css +++ /dev/null @@ -1,143 +0,0 @@ -.snackbar-container { - box-shadow: 9px 9px 16px #0a0b0c, -9px -9px 16px #222328; - transition: all 0.5s ease; - transition-property: top, right, bottom, left, opacity; - font-family: "Heebo", sans-serif; - font-size: 14px; - min-height: 14px; - position: fixed; - display: flex; - justify-content: space-between; - align-items: center; - color: #b4b4b4; - line-height: 22px; - padding: 18px 24px; - bottom: -100px; - top: -100px; - opacity: 0; - z-index: 9999; - - background-color: #376df9; - background: linear-gradient(100deg, #376df9 0, #ff5fa0 75%, #ffc55a 100%); -} - -.snackbar-container .action { - background: white; - padding: 7px; - border-radius: 3px; - display: inline-block; - border: none; - font-size: inherit; - text-transform: uppercase; - color: #000000; - margin: 0 0 0 24px; - /*padding: 0;*/ - min-width: min-content; - cursor: pointer; -} - -@media (min-width: 640px) { - .snackbar-container { - min-width: 288px; - max-width: 568px; - display: inline-flex; - border-radius: 5px; - margin: 24px; - } -} - -/* @media (max-width: 640px) { - .snackbar-container { - left: 0; - right: 0; - width: 100%; - } -} */ - -.snackbar-pos.bottom-center { - top: auto !important; - bottom: 0; - left: 50%; - transform: translate(-50%, 0); -} - -.snackbar-pos.bottom-left { - top: auto !important; - bottom: 0; - left: 0; -} - -.snackbar-pos.bottom-right { - top: auto !important; - bottom: 0; - right: 0; -} - -.snackbar-pos.top-left { - bottom: auto !important; - top: 0; - left: 0; -} - -.snackbar-pos.top-center { - bottom: auto !important; - top: 0; - left: 50%; - transform: translate(-50%, 0); -} - -.snackbar-pos.top-right { - bottom: auto !important; - top: 0; - right: 0; -} - -/* Mobile Styles Start */ - -@media (max-width: 640px) { - .snackbar-container { - position: fixed; - top: 5rem; - bottom: initial; - left: calc(10vw - 0.5rem); - right: initial; - display: flex; - justify-content: space-between; - width: 80vw !important; - min-width: 80vw; - max-width: 80vw; - height: auto; - margin: 0; - margin-top: 1rem; - padding: 0.5rem; - word-wrap: break-word; - line-height: 1.2rem; - font-size: 1rem; - } - - .snackbar-container p { - width: 80%; - } - - .snackbar-container .action { - width: 15%; - padding: 0.2rem; - border-radius: 10px; - display: inline-block; - border: none; - font-size: 1rem; - text-transform: uppercase; - color: #000000; - margin: 0; - /*padding: 0;*/ - cursor: pointer; - } - - .snackbar-pos.bottom-center, - .snackbar-pos.top-center { - left: calc(10vw - 0.5rem); - transform: none; - } -} - -/* Mobile Styles End */ diff --git a/public/images/clients-01.svg b/public/images/clients-01.svg deleted file mode 100755 index 40510aa..0000000 --- a/public/images/clients-01.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/clients-02.svg b/public/images/clients-02.svg deleted file mode 100755 index 0fe5ebf..0000000 --- a/public/images/clients-02.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/clients-03.svg b/public/images/clients-03.svg deleted file mode 100755 index b18db75..0000000 --- a/public/images/clients-03.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/clients-04.svg b/public/images/clients-04.svg deleted file mode 100755 index 04c30fc..0000000 --- a/public/images/clients-04.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/clients-05.svg b/public/images/clients-05.svg deleted file mode 100755 index a437997..0000000 --- a/public/images/clients-05.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/feature-tile-icon-01.svg b/public/images/feature-tile-icon-01.svg deleted file mode 100755 index a1c4e2d..0000000 --- a/public/images/feature-tile-icon-01.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/feature-tile-icon-02.svg b/public/images/feature-tile-icon-02.svg deleted file mode 100755 index d06548d..0000000 --- a/public/images/feature-tile-icon-02.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/feature-tile-icon-03.svg b/public/images/feature-tile-icon-03.svg deleted file mode 100755 index b5da414..0000000 --- a/public/images/feature-tile-icon-03.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/feature-tile-icon-04.svg b/public/images/feature-tile-icon-04.svg deleted file mode 100755 index 13236c4..0000000 --- a/public/images/feature-tile-icon-04.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/feature-tile-icon-05.svg b/public/images/feature-tile-icon-05.svg deleted file mode 100755 index 3e092f4..0000000 --- a/public/images/feature-tile-icon-05.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/feature-tile-icon-06.svg b/public/images/feature-tile-icon-06.svg deleted file mode 100755 index 99d4d42..0000000 --- a/public/images/feature-tile-icon-06.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/features-split-image-01.svg b/public/images/features-split-image-01.svg deleted file mode 100755 index 0c3fbb3..0000000 --- a/public/images/features-split-image-01.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/features-split-image-02.svg b/public/images/features-split-image-02.svg deleted file mode 100755 index 36cdf59..0000000 --- a/public/images/features-split-image-02.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/illustration-section-01.svg b/public/images/illustration-section-01.svg deleted file mode 100755 index c38025b..0000000 --- a/public/images/illustration-section-01.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/illustration-section-02.svg b/public/images/illustration-section-02.svg deleted file mode 100755 index 633ed57..0000000 --- a/public/images/illustration-section-02.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/image-placeholder.svg b/public/images/image-placeholder.svg deleted file mode 100755 index 16c62da..0000000 --- a/public/images/image-placeholder.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/loader.gif b/public/images/loader.gif deleted file mode 100644 index e395c93..0000000 Binary files a/public/images/loader.gif and /dev/null differ diff --git a/public/images/logo.svg b/public/images/logo.svg deleted file mode 100755 index 777ea8e..0000000 --- a/public/images/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/portrait.png b/public/images/portrait.png deleted file mode 100644 index 14b589d..0000000 Binary files a/public/images/portrait.png and /dev/null differ diff --git a/public/images/team-member-01.jpg b/public/images/team-member-01.jpg deleted file mode 100755 index 0a71e53..0000000 Binary files a/public/images/team-member-01.jpg and /dev/null differ diff --git a/public/images/team-member-02.jpg b/public/images/team-member-02.jpg deleted file mode 100755 index d332bf2..0000000 Binary files a/public/images/team-member-02.jpg and /dev/null differ diff --git a/public/images/team-member-03.jpg b/public/images/team-member-03.jpg deleted file mode 100755 index d65b207..0000000 Binary files a/public/images/team-member-03.jpg and /dev/null differ diff --git a/public/images/team-member-04.jpg b/public/images/team-member-04.jpg deleted file mode 100755 index 15a1a3c..0000000 Binary files a/public/images/team-member-04.jpg and /dev/null differ diff --git a/public/images/team-member-05.jpg b/public/images/team-member-05.jpg deleted file mode 100755 index 43630c3..0000000 Binary files a/public/images/team-member-05.jpg and /dev/null differ diff --git a/public/images/team-member-06.jpg b/public/images/team-member-06.jpg deleted file mode 100755 index 49bdb38..0000000 Binary files a/public/images/team-member-06.jpg and /dev/null differ diff --git a/public/images/video-placeholder.svg b/public/images/video-placeholder.svg deleted file mode 100755 index 3ea74aa..0000000 --- a/public/images/video-placeholder.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/js/accordion.js b/public/js/accordion.js deleted file mode 100755 index 35cb7b4..0000000 --- a/public/js/accordion.js +++ /dev/null @@ -1,28 +0,0 @@ -(function () { - "use strict"; - const accordionEl = document.getElementsByClassName("accordion-header"); - - function openAccordion(parent, panel) { - parent.classList.add("is-active"); - panel.style.maxHeight = panel.scrollHeight + "px"; - } - - function closeAccordion(parent, panel) { - parent.classList.remove("is-active"); - panel.style.maxHeight = null; - } - - if (accordionEl.length > 0) { - for (let i = 0; i < accordionEl.length; i++) { - const el = accordionEl[i]; - const parent = el.parentNode; - const panel = el.nextElementSibling; - parent.classList.contains("is-active") && openAccordion(parent, panel); - el.addEventListener("click", function () { - parent.classList.contains("is-active") - ? closeAccordion(parent, panel) - : openAccordion(parent, panel); - }); - } - } -})(); diff --git a/public/js/autolink.js b/public/js/autolink.js deleted file mode 100644 index baab926..0000000 --- a/public/js/autolink.js +++ /dev/null @@ -1,42 +0,0 @@ -// Generated by CoffeeScript 1.10.0 -(function () { - var autoLink, - slice = [].slice; - - autoLink = function () { - var callback, k, linkAttributes, option, options, pattern, v; - options = 1 <= arguments.length ? slice.call(arguments, 0) : []; - pattern = /(^|[\s\n]|<[A-Za-z]*\/?>)((?:https?|ftp):\/\/[\-A-Z0-9+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|])/gi; - if (!(options.length > 0)) { - return this.replace(pattern, "$1$2"); - } - option = options[0]; - callback = option["callback"]; - linkAttributes = (function () { - var results; - results = []; - for (k in option) { - v = option[k]; - if (k !== "callback") { - results.push(" " + k + "='" + v + "'"); - } - } - return results; - })().join(""); - return this.replace(pattern, function (match, space, url) { - var link; - link = - (typeof callback === "function" ? callback(url) : void 0) || - "" + - url + - ""; - return "" + space + link; - }); - }; - - String.prototype["autoLink"] = autoLink; -}.call(this)); diff --git a/public/js/carousel.js b/public/js/carousel.js deleted file mode 100755 index ed569f2..0000000 --- a/public/js/carousel.js +++ /dev/null @@ -1,195 +0,0 @@ -(function () { - "use strict"; - - // Swipe detector - // https://gist.github.com/chrishaensel/e17c9f3838f246d75fe3bd19d6bb92e8#file-swipe-js - let swipe = { - touchStartX: 0, - touchEndX: 0, - minSwipePixels: 30, - detectionZone: undefined, - swipeCallback: function () {}, - - init: function (detectionZone, callback) { - swipe.swipeCallback = callback; - detectionZone.addEventListener( - "touchstart", - function (event) { - swipe.touchStartX = event.changedTouches[0].screenX; - }, - false - ); - detectionZone.addEventListener( - "touchend", - function (event) { - swipe.touchEndX = event.changedTouches[0].screenX; - swipe.handleSwipeGesture(); - }, - false - ); - }, - - handleSwipeGesture: function () { - let direction, moved; - if (swipe.touchEndX <= swipe.touchStartX) { - moved = swipe.touchStartX - swipe.touchEndX; - direction = "left"; - } - if (swipe.touchEndX >= swipe.touchStartX) { - moved = swipe.touchEndX - swipe.touchStartX; - direction = "right"; - } - if (moved > swipe.minSwipePixels && direction !== "undefined") { - swipe.swipe(direction, moved); - } - }, - - swipe: function (direction, movedPixels) { - let ret = {}; - ret.direction = direction; - ret.movedPixels = movedPixels; - swipe.swipeCallback(ret); - }, - }; - - const carousels = document.getElementsByClassName("carousel-items"); - - // Rotate the carousel forward or backward - function rotateCarousel(el, dir) { - if (dir === undefined) { - dir = "next"; - } - let currentItem = el.getElementsByClassName("carousel-item is-active")[0]; - let nextItem = - dir === "next" - ? currentItem.nextElementSibling - : currentItem.previousElementSibling; - let index = currentItem.getAttribute("data-carousel"); - let currentBullet = el.parentNode.getElementsByClassName("carousel-bullet")[ - index - ]; - let nextBullet = - dir === "next" - ? currentBullet.nextElementSibling - : currentBullet.previousElementSibling; - currentItem.classList.remove("is-active"); - currentBullet.classList.remove("is-active"); - if (nextItem) { - nextItem.classList.add("is-active"); - nextBullet.classList.add("is-active"); - } else { - if (dir === "next") { - el.firstElementChild.classList.add("is-active"); - el.parentNode - .getElementsByClassName("carousel-bullets")[0] - .firstElementChild.classList.add("is-active"); - } else { - el.lastElementChild.classList.add("is-active"); - el.parentNode - .getElementsByClassName("carousel-bullets")[0] - .lastElementChild.classList.add("is-active"); - } - } - } - - // Equal heights fix - function equalHeightCarousel(carousel, items) { - let taller = 0; - let height; - for (let i = 0; i < items.length; i++) { - items[0].parentNode.style.minHeight = taller + "px"; - items[i].classList.add("is-loading"); - height = items[i].offsetHeight; - items[i].classList.remove("is-loading"); - if (height > taller) { - taller = height; - } - } - items[0].parentNode.style.minHeight = taller + "px"; - } - - // Clear autorotate - function clearAutorotate(autorotate) { - if (autorotate) { - clearInterval(autorotate); - } - } - - if (carousels.length > 0) { - for (let i = 0; i < carousels.length; i++) { - let carousel = carousels[i]; - let items = carousel.getElementsByClassName("carousel-item"); - let activeItem = 0; - let autorotateTiming = carousel.getAttribute("data-autorotate"); - // Generate bullets container - const bulletsContainer = document.createElement("div"); - bulletsContainer.className = "carousel-bullets"; - carousel.parentNode.insertBefore(bulletsContainer, carousel.nextSibling); - for (let i = 0; i < items.length; i++) { - // Add data attributes - items[i].setAttribute("data-carousel", i); - // Determine a new active item, if any - if (items[i].classList.contains("is-active")) activeItem = i; - // Generate bullets - let bullet = document.createElement("button"); - bullet.className = "carousel-bullet"; - bullet.setAttribute("data-bullet", i); - carousel.parentNode - .getElementsByClassName("carousel-bullets")[0] - .appendChild(bullet); - } - // Add is-active class to first carousel item and bullet - items[activeItem].classList.add("is-active"); - let bullets = carousel.parentNode.getElementsByClassName( - "carousel-bullet" - ); - bullets[activeItem].classList.add("is-active"); - // Equal height items - equalHeightCarousel(carousel, items); - window.addEventListener("resize", function () { - equalHeightCarousel(carousel, items); - }); - // Autorotate - let autorotate = false; - if (autorotateTiming) { - autorotate = setInterval(function () { - rotateCarousel(carousel, "next"); - }, autorotateTiming); - } - // Rotate by bullet click - for (let i = 0; i < bullets.length; i++) { - let bullet = bullets[i]; - bullet.addEventListener("click", function (e) { - e.preventDefault(); - // Do nothing if item is active - if (bullet.classList.contains("is-active")) { - return; - } - // Remove active classes - for (let i = 0; i < bullets.length; i++) { - bullets[i].classList.remove("is-active"); - } - for (let i = 0; i < items.length; i++) { - items[i].classList.remove("is-active"); - } - // Add active classes to corresponding items and bullets - let index = this.getAttribute("data-bullet"); - items[index].classList.add("is-active"); - this.classList.add("is-active"); - // Clear autorotate timing - clearAutorotate(autorotate); - }); - } - // Rotate on swipe - swipe.init(carousel, function (e) { - if (e.direction === "left") { - rotateCarousel(carousel, "next"); - } else if (e.direction === "right") { - rotateCarousel(carousel, "prev"); - } - // Clear autorotate timing - clearAutorotate(autorotate); - }); - } - } -})(); diff --git a/public/js/chat.js b/public/js/chat.js deleted file mode 100644 index 381dd22..0000000 --- a/public/js/chat.js +++ /dev/null @@ -1,944 +0,0 @@ -// Vars -var isMuted; -var videoIsPaused; -var dataChanel = null; -const browserName = getBrowserName(); -const url = window.location.href; -const roomHash = url.substring(url.lastIndexOf("/") + 1).toLowerCase(); -var mode = "camera"; -// var isFullscreen = false; -var sendingCaptions = false; -var receivingCaptions = false; -const isWebRTCSupported = - navigator.getUserMedia || - navigator.webkitGetUserMedia || - navigator.mozGetUserMedia || - navigator.msGetUserMedia || - window.RTCPeerConnection; - -// Element vars -const chatInput = document.querySelector(".compose input"); -const remoteVideoVanilla = document.getElementById("remote-video"); -const remoteVideo = $("#remote-video"); -const captionText = $("#remote-video-text"); -const localVideoText = $("#local-video-text"); -const captionButtontext = $("#caption-button-text"); -const entireChat = $("#entire-chat"); -const chatZone = $("#chat-zone"); - -var VideoChat = { - connected: false, - willInitiateCall: false, - localICECandidates: [], - socket: io(), - remoteVideo: document.getElementById("remote-video"), - localVideo: document.getElementById("local-video"), - recognition: undefined, - - // Call to getUserMedia (provided by adapter.js for cross browser compatibility) - // asking for access to both the video and audio streams. If the request is - // accepted callback to the onMediaStream function, otherwise callback to the - // noMediaStream function. - requestMediaStream: function (event) { - logIt("requestMediaStream"); - rePositionLocalVideo(); - navigator.mediaDevices - .getUserMedia({ - video: true, - audio: true, - }) - .then((stream) => { - VideoChat.onMediaStream(stream); - localVideoText.text("Drag Me"); - setTimeout(() => localVideoText.fadeOut(), 5000); - }) - .catch((error) => { - logIt(error); - logIt( - "Failed to get local webcam video, check webcam privacy settings" - ); - // Keep trying to get user media - setTimeout(VideoChat.requestMediaStream, 1000); - }); - }, - - // Called when a video stream is added to VideoChat - onMediaStream: function (stream) { - logIt("onMediaStream"); - VideoChat.localStream = stream; - // Add the stream as video's srcObject. - // Now that we have webcam video sorted, prompt user to share URL - Snackbar.show({ - text: "Here is the join link for your call: " + url, - actionText: "Copy Link", - width: "750px", - pos: "top-center", - actionTextColor: "#616161", - duration: 500000, - backgroundColor: "#16171a", - onActionClick: function (element) { - // Copy url to clipboard, this is achieved by creating a temporary element, - // adding the text we want to that element, selecting it, then deleting it - var copyContent = window.location.href; - $('') - .val(copyContent) - .appendTo("body") - .select(); - document.execCommand("copy"); - var toRemove = document.querySelector("#some-element"); - toRemove.parentNode.removeChild(toRemove); - Snackbar.close(); - }, - }); - VideoChat.localVideo.srcObject = stream; - // Now we're ready to join the chat room. - VideoChat.socket.emit("join", roomHash); - // Add listeners to the websocket - VideoChat.socket.on("full", chatRoomFull); - VideoChat.socket.on("offer", VideoChat.onOffer); - VideoChat.socket.on("ready", VideoChat.readyToCall); - VideoChat.socket.on( - "willInitiateCall", - () => (VideoChat.willInitiateCall = true) - ); - }, - - // When we are ready to call, enable the Call button. - readyToCall: function (event) { - logIt("readyToCall"); - // First to join call will most likely initiate call - if (VideoChat.willInitiateCall) { - logIt("Initiating call"); - VideoChat.startCall(); - } - }, - - // Set up a callback to run when we have the ephemeral token to use Twilio's TURN server. - startCall: function (event) { - logIt("startCall >>> Sending token request..."); - VideoChat.socket.on("token", VideoChat.onToken(VideoChat.createOffer)); - VideoChat.socket.emit("token", roomHash); - }, - - // When we receive the ephemeral token back from the server. - onToken: function (callback) { - logIt("onToken"); - return function (token) { - logIt("<<< Received token"); - // Set up a new RTCPeerConnection using the token's iceServers. - VideoChat.peerConnection = new RTCPeerConnection({ - iceServers: token.iceServers, - }); - // Add the local video stream to the peerConnection. - VideoChat.localStream.getTracks().forEach(function (track) { - VideoChat.peerConnection.addTrack(track, VideoChat.localStream); - }); - // Add general purpose data channel to peer connection, - // used for text chats, captions, and toggling sending captions - dataChanel = VideoChat.peerConnection.createDataChannel("chat", { - negotiated: true, - // both peers must have same id - id: 0, - }); - // Called when dataChannel is successfully opened - dataChanel.onopen = function (event) { - logIt("dataChannel opened"); - }; - // Handle different dataChannel types - dataChanel.onmessage = function (event) { - const receivedData = event.data; - // First 4 chars represent data type - const dataType = receivedData.substring(0, 4); - const cleanedMessage = receivedData.slice(4); - if (dataType === "mes:") { - handleRecieveMessage(cleanedMessage); - } else if (dataType === "cap:") { - recieveCaptions(cleanedMessage); - } else if (dataType === "tog:") { - toggleSendCaptions(); - } - }; - // Set up callbacks for the connection generating iceCandidates or - // receiving the remote media stream. - VideoChat.peerConnection.onicecandidate = VideoChat.onIceCandidate; - VideoChat.peerConnection.onaddstream = VideoChat.onAddStream; - // Set up listeners on the socket - VideoChat.socket.on("candidate", VideoChat.onCandidate); - VideoChat.socket.on("answer", VideoChat.onAnswer); - VideoChat.socket.on("requestToggleCaptions", () => toggleSendCaptions()); - VideoChat.socket.on("recieveCaptions", (captions) => - recieveCaptions(captions) - ); - // Called when there is a change in connection state - VideoChat.peerConnection.oniceconnectionstatechange = function (event) { - switch (VideoChat.peerConnection.iceConnectionState) { - case "connected": - logIt("connected"); - // Once connected we no longer have a need for the signaling server, so disconnect - VideoChat.socket.disconnect(); - break; - case "disconnected": - logIt("disconnected"); - case "failed": - logIt("failed"); - // VideoChat.socket.connect - // VideoChat.createOffer(); - // Refresh page if connection has failed - location.reload(); - break; - case "closed": - logIt("closed"); - break; - } - }; - callback(); - }; - }, - - // When the peerConnection generates an ice candidate, send it over the socket to the peer. - onIceCandidate: function (event) { - logIt("onIceCandidate"); - if (event.candidate) { - logIt( - `<<< Received local ICE candidate from STUN/TURN server (${event.candidate.address})` - ); - if (VideoChat.connected) { - logIt(`>>> Sending local ICE candidate (${event.candidate.address})`); - VideoChat.socket.emit( - "candidate", - JSON.stringify(event.candidate), - roomHash - ); - } else { - // If we are not 'connected' to the other peer, we are buffering the local ICE candidates. - // This most likely is happening on the "caller" side. - // The peer may not have created the RTCPeerConnection yet, so we are waiting for the 'answer' - // to arrive. This will signal that the peer is ready to receive signaling. - VideoChat.localICECandidates.push(event.candidate); - } - } - }, - - // When receiving a candidate over the socket, turn it back into a real - // RTCIceCandidate and add it to the peerConnection. - onCandidate: function (candidate) { - // Update caption text - captionText.text("Found other user... connecting"); - rtcCandidate = new RTCIceCandidate(JSON.parse(candidate)); - logIt( - `onCandidate <<< Received remote ICE candidate (${rtcCandidate.address} - ${rtcCandidate.relatedAddress})` - ); - VideoChat.peerConnection.addIceCandidate(rtcCandidate); - }, - - // Create an offer that contains the media capabilities of the browser. - createOffer: function () { - logIt("createOffer >>> Creating offer..."); - VideoChat.peerConnection.createOffer( - function (offer) { - // If the offer is created successfully, set it as the local description - // and send it over the socket connection to initiate the peerConnection - // on the other side. - VideoChat.peerConnection.setLocalDescription(offer); - VideoChat.socket.emit("offer", JSON.stringify(offer), roomHash); - }, - function (err) { - logIt("failed offer creation"); - logIt(err, true); - } - ); - }, - - // Create an answer with the media capabilities that both browsers share. - // This function is called with the offer from the originating browser, which - // needs to be parsed into an RTCSessionDescription and added as the remote - // description to the peerConnection object. Then the answer is created in the - // same manner as the offer and sent over the socket. - createAnswer: function (offer) { - logIt("createAnswer"); - return function () { - logIt(">>> Creating answer..."); - rtcOffer = new RTCSessionDescription(JSON.parse(offer)); - VideoChat.peerConnection.setRemoteDescription(rtcOffer); - VideoChat.peerConnection.createAnswer( - function (answer) { - VideoChat.peerConnection.setLocalDescription(answer); - VideoChat.socket.emit("answer", JSON.stringify(answer), roomHash); - }, - function (err) { - logIt("Failed answer creation."); - logIt(err, true); - } - ); - }; - }, - - // When a browser receives an offer, set up a callback to be run when the - // ephemeral token is returned from Twilio. - onOffer: function (offer) { - logIt("onOffer <<< Received offer"); - VideoChat.socket.on( - "token", - VideoChat.onToken(VideoChat.createAnswer(offer)) - ); - VideoChat.socket.emit("token", roomHash); - }, - - // When an answer is received, add it to the peerConnection as the remote description. - onAnswer: function (answer) { - logIt("onAnswer <<< Received answer"); - var rtcAnswer = new RTCSessionDescription(JSON.parse(answer)); - // Set remote description of RTCSession - VideoChat.peerConnection.setRemoteDescription(rtcAnswer); - // The caller now knows that the callee is ready to accept new ICE candidates, so sending the buffer over - VideoChat.localICECandidates.forEach((candidate) => { - logIt(`>>> Sending local ICE candidate (${candidate.address})`); - // Send ice candidate over websocket - VideoChat.socket.emit("candidate", JSON.stringify(candidate), roomHash); - }); - // Reset the buffer of local ICE candidates. This is not really needed, but it's good practice - VideoChat.localICECandidates = []; - }, - - // Called when a stream is added to the peer connection - onAddStream: function (event) { - logIt("onAddStream <<< Received new stream from remote. Adding it..."); - // Update remote video source - VideoChat.remoteVideo.srcObject = event.stream; - // Close the initial share url snackbar - Snackbar.close(); - // Remove the loading gif from video - VideoChat.remoteVideo.style.background = "none"; - // Update connection status - VideoChat.connected = true; - // Hide caption status text - captionText.fadeOut(); - // Reposition local video after a second, as there is often a delay - // between adding a stream and the height of the video div changing - setTimeout(() => rePositionLocalVideo(), 500); - // var timesRun = 0; - // var interval = setInterval(function () { - // timesRun += 1; - // if (timesRun === 10) { - // clearInterval(interval); - // } - // rePositionLocalVideo(); - // }, 300); - }, -}; - -// Get name of browser session using user agent -function getBrowserName() { - var name = "Unknown"; - if (window.navigator.userAgent.indexOf("MSIE") !== -1) { - } else if (window.navigator.userAgent.indexOf("Firefox") !== -1) { - name = "Firefox"; - } else if (window.navigator.userAgent.indexOf("Opera") !== -1) { - name = "Opera"; - } else if (window.navigator.userAgent.indexOf("Chrome") !== -1) { - name = "Chrome"; - } else if (window.navigator.userAgent.indexOf("Safari") !== -1) { - name = "Safari"; - } - return name; -} - -// Basic logging class wrapper -function logIt(message, error) { - console.log(message); -} - -// Called when socket receives message that room is full -function chatRoomFull() { - alert( - "Chat room is full. Check to make sure you don't have multiple open tabs, or try with a new room link" - ); - // Exit room and redirect - window.location.href = "/newcall"; -} - -// Reposition local video to top left of remote video -function rePositionLocalVideo() { - // Get position of remote video - var bounds = remoteVideo.position(); - let localVideo = $("#local-video"); - if ( - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) - ) { - bounds.top = $(window).height() * 0.7; - bounds.left += 10; - } else { - bounds.top += 10; - bounds.left += 10; - } - // Set position of local video - $("#moveable").css(bounds); -} - -// Reposition captions to bottom of video -function rePositionCaptions() { - // Get remote video position - var bounds = remoteVideo.position(); - bounds.top -= 10; - bounds.top = bounds.top + remoteVideo.height() - 1 * captionText.height(); - // Reposition captions - captionText.css(bounds); -} - -// Called when window is resized -function windowResized() { - rePositionLocalVideo(); - rePositionCaptions(); -} - -// Fullscreen -// function openFullscreen() { -// try { -// // var elem = document.getElementById("remote-video"); -// var elem = document.getElementById("body"); -// if (!isFullscreen) { -// VideoChat.remoteVideo.classList.add("fullscreen"); -// isFullscreen = true; -// if (elem.requestFullscreen) { -// elem.requestFullscreen(); -// } else if (elem.mozRequestFullScreen) { -// /* Firefox */ -// elem.mozRequestFullScreen(); -// } else if (elem.webkitRequestFullscreen) { -// /* Chrome, Safari and Opera */ -// -// elem.webkitRequestFullscreen(); -// setTimeout(windowResized, 1000); -// } else if (elem.msRequestFullscreen) { -// /* IE/Edge */ -// elem.msRequestFullscreen(); -// } -// } else { -// isFullscreen = false; -// VideoChat.remoteVideo.classList.remove("fullscreen"); -// if (document.exitFullscreen) { -// document.exitFullscreen(); -// } else if (document.mozCancelFullScreen) { -// /* Firefox */ -// document.mozCancelFullScreen(); -// } else if (document.webkitExitFullscreen) { -// /* Chrome, Safari and Opera */ -// document.webkitExitFullscreen(); -// } else if (document.msExitFullscreen) { -// /* IE/Edge */ -// document.msExitFullscreen(); -// } -// } -// } catch (e) { -// logIt(e); -// } -// setTimeout(windowResized, 1000); -// } -// End Fullscreen - -// Mute microphone -function muteMicrophone() { - var audioTrack = null; - // Get audio track to mute - VideoChat.peerConnection.getSenders().find(function (s) { - if (s.track.kind === "audio") { - audioTrack = s.track; - } - }); - isMuted = !audioTrack.enabled; - audioTrack.enabled = isMuted; - isMuted = !isMuted; - // select mic button and mic button text - const micButtonIcon = document.getElementById("mic-icon"); - const micButtonText = document.getElementById("mic-text"); - // Update mute button text and icon - if (isMuted) { - micButtonIcon.classList.remove("fa-microphone"); - micButtonIcon.classList.add("fa-microphone-slash"); - micButtonText.innerText = "Unmute"; - } else { - micButtonIcon.classList.add("fa-microphone"); - micButtonIcon.classList.remove("fa-microphone-slash"); - micButtonText.innerText = "Mute"; - } -} -// End Mute microphone - -// Pause Video -function pauseVideo() { - var videoTrack = null; - // Get video track to pause - VideoChat.peerConnection.getSenders().find(function (s) { - if (s.track.kind === "video") { - videoTrack = s.track; - } - }); - videoIsPaused = !videoTrack.enabled; - videoTrack.enabled = videoIsPaused; - videoIsPaused = !videoIsPaused; - // select video button and video button text - const videoButtonIcon = document.getElementById("video-icon"); - const videoButtonText = document.getElementById("video-text"); - // update pause button icon and text - if (videoIsPaused) { - localVideoText.text("Video is paused"); - localVideoText.show(); - videoButtonIcon.classList.remove("fa-video"); - videoButtonIcon.classList.add("fa-video-slash"); - videoButtonText.innerText = "Unpause Video"; - } else { - localVideoText.text("Video unpaused"); - setTimeout(() => localVideoText.fadeOut(), 2000); - videoButtonIcon.classList.add("fa-video"); - videoButtonIcon.classList.remove("fa-video-slash"); - videoButtonText.innerText = "Pause Video"; - } -} -// End pause Video - -// Swap camera / screen share -function swap() { - // Handle swap video before video call is connected - if (!VideoChat.connected) { - alert("You must join a call before you can share your screen."); - return; - } - // Store swap button icon and text - const swapIcon = document.getElementById("swap-icon"); - const swapText = document.getElementById("swap-text"); - // If mode is camera then switch to screen share - if (mode === "camera") { - // Show accept screenshare snackbar - Snackbar.show({ - text: - "Please allow screen share. Click the middle of the picture above and then press share.", - width: "400px", - pos: "bottom-center", - actionTextColor: "#616161", - duration: 50000, - }); - // Request screen share, note we dont want to capture audio - // as we already have the stream from the Webcam - navigator.mediaDevices - .getDisplayMedia({ - video: true, - audio: false, - }) - .then(function (stream) { - // Close allow screenshare snackbar - Snackbar.close(); - // Change display mode - mode = "screen"; - // Update swap button icon and text - swapIcon.classList.remove("fa-desktop"); - swapIcon.classList.add("fa-camera"); - swapText.innerText = "Share Webcam"; - switchStreamHelper(stream); - }) - .catch(function (err) { - logIt(err); - logIt("Error sharing screen"); - Snackbar.close(); - }); - // If mode is screenshare then switch to webcam - } else { - // Stop the screen share track - VideoChat.localVideo.srcObject.getTracks().forEach((track) => track.stop()); - // Get webcam input - navigator.mediaDevices - .getUserMedia({ - video: true, - audio: true, - }) - .then(function (stream) { - // Change display mode - mode = "camera"; - // Update swap button icon and text - swapIcon.classList.remove("fa-camera"); - swapIcon.classList.add("fa-desktop"); - swapText.innerText = "Share Screen"; - switchStreamHelper(stream); - }); - } -} - -// Swap current video track with passed in stream -function switchStreamHelper(stream) { - // Get current video track - let videoTrack = stream.getVideoTracks()[0]; - // Add listen for if the current track swaps, swap back - videoTrack.onended = function () { - swap(); - }; - if (VideoChat.connected) { - // Find sender - const sender = VideoChat.peerConnection.getSenders().find(function (s) { - // make sure tack types match - return s.track.kind === videoTrack.kind; - }); - // Replace sender track - sender.replaceTrack(videoTrack); - } - // Update local video stream - VideoChat.localStream = videoTrack; - // Update local video object - VideoChat.localVideo.srcObject = stream; - // Unpause video on swap - if (videoIsPaused) { - pauseVideo(); - } -} -// End swap camera / screen share - -// Live caption -// Request captions from other user, toggles state -function requestToggleCaptions() { - // Handle requesting captions before connected - if (!VideoChat.connected) { - alert("You must be connected to a peer to use Live Caption"); - return; - } - if (receivingCaptions) { - captionText.text("").fadeOut(); - captionButtontext.text("Start Live Caption"); - receivingCaptions = false; - } else { - Snackbar.show({ - text: - "This is an experimental feature. Live caption requires the other user to be using Chrome", - width: "400px", - pos: "bottom-center", - actionTextColor: "#616161", - duration: 10000, - }); - captionButtontext.text("End Live Caption"); - receivingCaptions = true; - } - // Send request to get captions over data channel - dataChanel.send("tog:"); -} - -// Start/stop sending captions to other user -function toggleSendCaptions() { - if (sendingCaptions) { - sendingCaptions = false; - VideoChat.recognition.stop(); - } else { - startSpeech(); - sendingCaptions = true; - } -} - -// Start speech recognition -function startSpeech() { - try { - var SpeechRecognition = - window.SpeechRecognition || window.webkitSpeechRecognition; - VideoChat.recognition = new SpeechRecognition(); - // VideoChat.recognition.lang = "en"; - } catch (e) { - sendingCaptions = false; - logIt(e); - logIt("error importing speech library"); - // Alert other user that they cannon use live caption - dataChanel.send("cap:notusingchrome"); - return; - } - // recognition.maxAlternatives = 3; - VideoChat.recognition.continuous = true; - // Show results that aren't final - VideoChat.recognition.interimResults = true; - var finalTranscript; - VideoChat.recognition.onresult = (event) => { - let interimTranscript = ""; - for (let i = event.resultIndex, len = event.results.length; i < len; i++) { - var transcript = event.results[i][0].transcript; - if (event.results[i].isFinal) { - finalTranscript += transcript; - } else { - interimTranscript += transcript; - var charsToKeep = interimTranscript.length % 100; - // Send captions over data chanel, - // subtracting as many complete 100 char slices from start - dataChanel.send( - "cap:" + - interimTranscript.substring(interimTranscript.length - charsToKeep) - ); - } - } - }; - VideoChat.recognition.onend = function () { - logIt("on speech recording end"); - // Restart speech recognition if user has not stopped it - if (sendingCaptions) { - startSpeech(); - } else { - VideoChat.recognition.stop(); - } - }; - VideoChat.recognition.start(); -} - -// Recieve captions over datachannel -function recieveCaptions(captions) { - if (receivingCaptions) { - captionText.text("").fadeIn(); - } else { - captionText.text("").fadeOut(); - } - // Other user is not using chrome - if (captions === "notusingchrome") { - alert( - "Other caller must be using chrome for this feature to work. Live Caption turned off." - ); - receivingCaptions = false; - captionText.text("").fadeOut(); - captionButtontext.text("Start Live Caption"); - return; - } - captionText.text(captions); - rePositionCaptions(); -} -// End Live caption - -// Translation -// function translate(text) { -// let fromLang = "en"; -// let toLang = "zh"; -// // let text = "hello how are you?"; -// const API_KEY = "APIKEYHERE"; -// let gurl = `https://translation.googleapis.com/language/translate/v2?key=${API_KEY}`; -// gurl += "&q=" + encodeURI(text); -// gurl += `&source=${fromLang}`; -// gurl += `&target=${toLang}`; -// fetch(gurl, { -// method: "GET", -// headers: { -// "Content-Type": "application/json", -// Accept: "application/json", -// }, -// }) -// .then((res) => res.json()) -// .then((response) => { -// // console.log("response from google: ", response); -// // return response["data"]["translations"][0]["translatedText"]; -// logIt(response); -// var translatedText = -// response["data"]["translations"][0]["translatedText"]; -// console.log(translatedText); -// dataChanel.send("cap:" + translatedText); -// }) -// .catch((error) => { -// console.log("There was an error with the translation request: ", error); -// }); -// } -// End Translation - -// Text Chat -// Add text message to chat screen on page -function addMessageToScreen(msg, isOwnMessage) { - if (isOwnMessage) { - $(".chat-messages").append( - '
' + - msg + - "
" - ); - } else { - $(".chat-messages").append( - '
' + - msg + - "
" - ); - } -} - -// Listen for enter press on chat input -chatInput.addEventListener("keypress", function (event) { - if (event.keyCode === 13) { - // Prevent page refresh on enter - event.preventDefault(); - var msg = chatInput.value; - // Prevent cross site scripting - msg = msg.replace(//g, ">"); - // Make links clickable - msg = msg.autoLink(); - // Send message over data channel - dataChanel.send("mes:" + msg); - // Add message to screen - addMessageToScreen(msg, true); - // Auto scroll chat down - chatZone.scrollTop(chatZone[0].scrollHeight); - // Clear chat input - chatInput.value = ""; - } -}); - -// Called when a message is recieved over the dataChannel -function handleRecieveMessage(msg) { - // Add message to screen - addMessageToScreen(msg, false); - // Auto scroll chat down - chatZone.scrollTop(chatZone[0].scrollHeight); - // Show chat if hidden - if (entireChat.is(":hidden")) { - toggleChat(); - } -} - -// Show and hide chat -function toggleChat() { - var chatIcon = document.getElementById("chat-icon"); - var chatText = $("#chat-text"); - if (entireChat.is(":visible")) { - entireChat.fadeOut(); - // Update show chat buttton - chatText.text("Show Chat"); - chatIcon.classList.remove("fa-comment-slash"); - chatIcon.classList.add("fa-comment"); - } else { - entireChat.fadeIn(); - // Update show chat buttton - chatText.text("Hide Chat"); - chatIcon.classList.remove("fa-comment"); - chatIcon.classList.add("fa-comment-slash"); - } -} -// End Text chat - -//Picture in picture -function togglePictureInPicture() { - if ( - "pictureInPictureEnabled" in document || - remoteVideoVanilla.webkitSetPresentationMode - ) { - if (document.pictureInPictureElement) { - document.exitPictureInPicture().catch((error) => { - logIt("Error exiting pip."); - logIt(error); - }); - } else if (remoteVideoVanilla.webkitPresentationMode === "inline") { - remoteVideoVanilla.webkitSetPresentationMode("picture-in-picture"); - } else if ( - remoteVideoVanilla.webkitPresentationMode === "picture-in-picture" - ) { - remoteVideoVanilla.webkitSetPresentationMode("inline"); - } else { - remoteVideoVanilla.requestPictureInPicture().catch((error) => { - alert( - "You must be connected to another person to enter picture in picture." - ); - }); - } - } else { - alert( - "Picture in picture is not supported in your browser. Consider using Chrome or Safari." - ); - } -} -//Picture in picture - -function startUp() { - // Try and detect in-app browsers and redirect - var ua = navigator.userAgent || navigator.vendor || window.opera; - if ( - DetectRTC.isMobileDevice && - (ua.indexOf("FBAN") > -1 || - ua.indexOf("FBAV") > -1 || - ua.indexOf("Instagram") > -1) - ) { - if (DetectRTC.osName === "iOS") { - window.location.href = "/notsupportedios"; - } else { - window.location.href = "/notsupported"; - } - } - - // Redirect all iOS browsers that are not Safari - if (DetectRTC.isMobileDevice) { - if (DetectRTC.osName === "iOS" && !DetectRTC.browser.isSafari) { - window.location.href = "/notsupportedios"; - } - } - - if (!isWebRTCSupported || browserName === "MSIE") { - window.location.href = "/notsupported"; - } - - // Set tab title - document.title = "Zipcall - " + url.substring(url.lastIndexOf("/") + 1); - - // get webcam on load - VideoChat.requestMediaStream(); - - // Captions hidden by default - captionText.text("").fadeOut(); - - // Make local video draggable - $("#moveable").draggable({ containment: "window" }); - - // Hide button labels on load - $(".HoverState").hide(); - - // Text chat hidden by default - entireChat.hide(); - - // Show hide button labels on hover - $(document).ready(function () { - $(".hoverButton").mouseover(function () { - $(".HoverState").hide(); - $(this).next().show(); - }); - $(".hoverButton").mouseout(function () { - $(".HoverState").hide(); - }); - }); - - // Fade out / show UI on mouse move - var timedelay = 1; - function delayCheck() { - if (timedelay === 5) { - // $(".multi-button").fadeOut(); - $("#header").fadeOut(); - timedelay = 1; - } - timedelay = timedelay + 1; - } - $(document).mousemove(function () { - $(".multi-button").fadeIn(); - $("#header").fadeIn(); - $(".multi-button").style = ""; - timedelay = 1; - clearInterval(_delay); - _delay = setInterval(delayCheck, 500); - }); - _delay = setInterval(delayCheck, 500); - - // Show accept webcam snackbar - Snackbar.show({ - text: "Please allow microphone and webcam access", - actionText: "Show Me How", - width: "455px", - pos: "top-right", - actionTextColor: "#616161", - duration: 50000, - onActionClick: function (element) { - window.open( - "https://getacclaim.zendesk.com/hc/en-us/articles/360001547832-Setting-the-default-camera-on-your-browser", - "_blank" - ); - }, - }); - - // Set caption text on start - captionText.text("Waiting for other user to join...").fadeIn(); - - // Reposition captions on start - rePositionCaptions(); - - // On change media devices refresh page and switch to system default - navigator.mediaDevices.ondevicechange = () => window.location.reload(); -} - -startUp(); diff --git a/public/js/jquery.ui.touch-punch.js b/public/js/jquery.ui.touch-punch.js deleted file mode 100644 index e98e06c..0000000 --- a/public/js/jquery.ui.touch-punch.js +++ /dev/null @@ -1,174 +0,0 @@ -/*! - * jQuery UI Touch Punch 0.2.3 - * - * Copyright 2011–2014, Dave Furfero - * Dual licensed under the MIT or GPL Version 2 licenses. - * - * Depends: - * jquery.ui.widget.js - * jquery.ui.mouse.js - */ -(function ($) { - // Detect touch support - $.support.touch = "ontouchend" in document; - - // Ignore browsers without touch support - if (!$.support.touch) { - return; - } - - var mouseProto = $.ui.mouse.prototype, - _mouseInit = mouseProto._mouseInit, - _mouseDestroy = mouseProto._mouseDestroy, - touchHandled; - - /** - * Simulate a mouse event based on a corresponding touch event - * @param {Object} event A touch event - * @param {String} simulatedType The corresponding mouse event - */ - function simulateMouseEvent(event, simulatedType) { - // Ignore multi-touch events - if (event.originalEvent.touches.length > 1) { - return; - } - - event.preventDefault(); - - var touch = event.originalEvent.changedTouches[0], - simulatedEvent = document.createEvent("MouseEvents"); - - // Initialize the simulated mouse event using the touch event's coordinates - simulatedEvent.initMouseEvent( - simulatedType, // type - true, // bubbles - true, // cancelable - window, // view - 1, // detail - touch.screenX, // screenX - touch.screenY, // screenY - touch.clientX, // clientX - touch.clientY, // clientY - false, // ctrlKey - false, // altKey - false, // shiftKey - false, // metaKey - 0, // button - null // relatedTarget - ); - - // Dispatch the simulated event to the target element - event.target.dispatchEvent(simulatedEvent); - } - - /** - * Handle the jQuery UI widget's touchstart events - * @param {Object} event The widget element's touchstart event - */ - mouseProto._touchStart = function (event) { - var self = this; - - // Ignore the event if another widget is already being handled - if ( - touchHandled || - !self._mouseCapture(event.originalEvent.changedTouches[0]) - ) { - return; - } - - // Set the flag to prevent other widgets from inheriting the touch event - touchHandled = true; - - // Track movement to determine if interaction was a click - self._touchMoved = false; - - // Simulate the mouseover event - simulateMouseEvent(event, "mouseover"); - - // Simulate the mousemove event - simulateMouseEvent(event, "mousemove"); - - // Simulate the mousedown event - simulateMouseEvent(event, "mousedown"); - }; - - /** - * Handle the jQuery UI widget's touchmove events - * @param {Object} event The document's touchmove event - */ - mouseProto._touchMove = function (event) { - // Ignore event if not handled - if (!touchHandled) { - return; - } - - // Interaction was not a click - this._touchMoved = true; - - // Simulate the mousemove event - simulateMouseEvent(event, "mousemove"); - }; - - /** - * Handle the jQuery UI widget's touchend events - * @param {Object} event The document's touchend event - */ - mouseProto._touchEnd = function (event) { - // Ignore event if not handled - if (!touchHandled) { - return; - } - - // Simulate the mouseup event - simulateMouseEvent(event, "mouseup"); - - // Simulate the mouseout event - simulateMouseEvent(event, "mouseout"); - - // If the touch interaction did not move, it should trigger a click - if (!this._touchMoved) { - // Simulate the click event - simulateMouseEvent(event, "click"); - } - - // Unset the flag to allow other widgets to inherit the touch event - touchHandled = false; - }; - - /** - * A duck punch of the $.ui.mouse _mouseInit method to support touch events. - * This method extends the widget with bound touch event handlers that - * translate touch events to mouse events and pass them to the widget's - * original mouse event handling methods. - */ - mouseProto._mouseInit = function () { - var self = this; - - // Delegate the touch handlers to the widget's element - self.element.bind({ - touchstart: $.proxy(self, "_touchStart"), - touchmove: $.proxy(self, "_touchMove"), - touchend: $.proxy(self, "_touchEnd"), - }); - - // Call the original $.ui.mouse init method - _mouseInit.call(self); - }; - - /** - * Remove the touch event handlers - */ - mouseProto._mouseDestroy = function () { - var self = this; - - // Delegate the touch handlers to the widget's element - self.element.unbind({ - touchstart: $.proxy(self, "_touchStart"), - touchmove: $.proxy(self, "_touchMove"), - touchend: $.proxy(self, "_touchEnd"), - }); - - // Call the original $.ui.mouse destroy method - _mouseDestroy.call(self); - }; -})(jQuery); diff --git a/public/js/landing.js b/public/js/landing.js deleted file mode 100755 index 3672da8..0000000 --- a/public/js/landing.js +++ /dev/null @@ -1,340 +0,0 @@ -!(function () { - "use strict"; - const e = document.getElementsByClassName("accordion-header"); - - function t(e, t) { - e.classList.add("is-active"), (t.style.maxHeight = t.scrollHeight + "px"); - } - - function n(e, t) { - e.classList.remove("is-active"), (t.style.maxHeight = null); - } - - if (e.length > 0) - for (let i = 0; i < e.length; i++) { - const s = e[i], - a = s.parentNode, - l = s.nextElementSibling; - a.classList.contains("is-active") && t(a, l), - s.addEventListener("click", function () { - a.classList.contains("is-active") ? n(a, l) : t(a, l); - }); - } -})(), - (function () { - "use strict"; - let e = { - touchStartX: 0, - touchEndX: 0, - minSwipePixels: 30, - detectionZone: void 0, - swipeCallback: function () {}, - init: function (t, n) { - (e.swipeCallback = n), - t.addEventListener( - "touchstart", - function (t) { - e.touchStartX = t.changedTouches[0].screenX; - }, - !1 - ), - t.addEventListener( - "touchend", - function (t) { - (e.touchEndX = t.changedTouches[0].screenX), - e.handleSwipeGesture(); - }, - !1 - ); - }, - handleSwipeGesture: function () { - let t, n; - e.touchEndX <= e.touchStartX && - ((n = e.touchStartX - e.touchEndX), (t = "left")), - e.touchEndX >= e.touchStartX && - ((n = e.touchEndX - e.touchStartX), (t = "right")), - n > e.minSwipePixels && "undefined" !== t && e.swipe(t, n); - }, - swipe: function (t, n) { - let i = {}; - (i.direction = t), (i.movedPixels = n), e.swipeCallback(i); - }, - }; - const t = document.getElementsByClassName("carousel-items"); - - function n(e, t) { - void 0 === t && (t = "next"); - let n = e.getElementsByClassName("carousel-item is-active")[0], - i = "next" === t ? n.nextElementSibling : n.previousElementSibling, - s = n.getAttribute("data-carousel"), - a = e.parentNode.getElementsByClassName("carousel-bullet")[s], - l = "next" === t ? a.nextElementSibling : a.previousElementSibling; - n.classList.remove("is-active"), - a.classList.remove("is-active"), - i - ? (i.classList.add("is-active"), l.classList.add("is-active")) - : "next" === t - ? (e.firstElementChild.classList.add("is-active"), - e.parentNode - .getElementsByClassName("carousel-bullets")[0] - .firstElementChild.classList.add("is-active")) - : (e.lastElementChild.classList.add("is-active"), - e.parentNode - .getElementsByClassName("carousel-bullets")[0] - .lastElementChild.classList.add("is-active")); - } - - function i(e, t) { - let n, - i = 0; - for (let e = 0; e < t.length; e++) - (t[0].parentNode.style.minHeight = i + "px"), - t[e].classList.add("is-loading"), - (n = t[e].offsetHeight), - t[e].classList.remove("is-loading"), - n > i && (i = n); - t[0].parentNode.style.minHeight = i + "px"; - } - - function s(e) { - e && clearInterval(e); - } - - if (t.length > 0) - for (let a = 0; a < t.length; a++) { - let l = t[a], - c = l.getElementsByClassName("carousel-item"), - o = 0, - r = l.getAttribute("data-autorotate"); - const d = document.createElement("div"); - (d.className = "carousel-bullets"), - l.parentNode.insertBefore(d, l.nextSibling); - for (let e = 0; e < c.length; e++) { - c[e].setAttribute("data-carousel", e), - c[e].classList.contains("is-active") && (o = e); - let t = document.createElement("button"); - (t.className = "carousel-bullet"), - t.setAttribute("data-bullet", e), - l.parentNode - .getElementsByClassName("carousel-bullets")[0] - .appendChild(t); - } - c[o].classList.add("is-active"); - let u = l.parentNode.getElementsByClassName("carousel-bullet"); - u[o].classList.add("is-active"), - i(0, c), - window.addEventListener("resize", function () { - i(0, c); - }); - let m = !1; - r && - (m = setInterval(function () { - n(l, "next"); - }, r)); - for (let e = 0; e < u.length; e++) { - let t = u[e]; - t.addEventListener("click", function (e) { - if ((e.preventDefault(), t.classList.contains("is-active"))) return; - for (let e = 0; e < u.length; e++) - u[e].classList.remove("is-active"); - for (let e = 0; e < c.length; e++) - c[e].classList.remove("is-active"); - let n = this.getAttribute("data-bullet"); - c[n].classList.add("is-active"), - this.classList.add("is-active"), - s(m); - }); - } - e.init(l, function (e) { - "left" === e.direction - ? n(l, "next") - : "right" === e.direction && n(l, "prev"), - s(m); - }); - } - })(), - (function () { - "use strict"; - document.documentElement.classList.remove("no-js"), - document.documentElement.classList.add("js"), - window.addEventListener("load", function () { - document.body.classList.add("is-loaded"); - }); - })(), - (function () { - "use strict"; - const e = document.getElementById("header-nav-toggle"), - t = document.getElementById("header-nav"); - e && - (e.addEventListener("click", function () { - document.body.classList.toggle("off-nav-is-active"), - t.classList.toggle("is-active"), - t.style.maxHeight - ? (t.style.maxHeight = null) - : (t.style.maxHeight = t.scrollHeight + "px"), - "true" === this.getAttribute("aria-expanded") - ? this.setAttribute("aria-expanded", "false") - : this.setAttribute("aria-expanded", "true"); - }), - document.addEventListener("click", function (n) { - n.target === t || - n.target === e || - t.contains(n.target) || - (document.body.classList.remove("off-nav-is-active"), - t.classList.remove("is-active"), - (t.style.maxHeight = null), - e.setAttribute("aria-expanded", "false")); - })); - })(), - (function () { - "use strict"; - const e = document.getElementsByClassName("modal"), - t = document.getElementsByClassName("modal-trigger"); - - function n() { - document.body.classList.remove("modal-is-active"); - for (let t = 0; t < e.length; t++) e[t].classList.remove("is-active"); - } - - if (e.length > 0 && t.length > 0) - for (let e = 0; e < t.length; e++) { - let n = t[e], - i = document.getElementById(n.getAttribute("aria-controls")); - i && - (n.hasAttribute("data-video") && - (null !== i.querySelector("iframe") - ? i - .querySelector("iframe") - .setAttribute("src", n.getAttribute("data-video")) - : null !== i.querySelector("video") && - i - .querySelector("video") - .setAttribute("src", n.getAttribute("data-video"))), - n.addEventListener("click", function (e) { - var t; - e.preventDefault(), - n.hasAttribute("aria-controls") && - (t = i) && - (document.body.classList.add("modal-is-active"), - t.classList.add("is-active")); - })); - } - document.addEventListener("click", function (e) { - (e.target.classList.contains("modal") || - e.target.classList.contains("modal-close-trigger")) && - (e.preventDefault(), n()); - }), - document.addEventListener("keydown", function (e) { - 27 === (e || window.event).keyCode && n(); - }); - })(), - (function () { - "use strict"; - const e = document.getElementById("pricing-toggle"); - - function t() { - const t = document.getElementsByClassName("pricing-switchable"); - if (e.checked) - for (let e = 0; e < t.length; e++) - t[e].innerHTML = t[e].getAttribute("data-pricing-yearly"); - else - for (let e = 0; e < t.length; e++) - t[e].innerHTML = t[e].getAttribute("data-pricing-monthly"); - } - - e && (window.addEventListener("load", t), e.addEventListener("change", t)); - })(), - (function () { - "use strict"; - const e = document.querySelectorAll("[class*=reveal-]"); - let t = window.innerHeight; - - function n(e, t) { - var n = 0; - return function () { - var i = new Date().getTime(); - if (!(i - n < e)) return (n = i), t.apply(void 0, arguments); - }; - } - - function i() { - for (let i = 0; i < e.length; i++) { - let s = e[i], - a = s.getAttribute("data-reveal-delay"), - l = s.getAttribute("data-reveal-offset") - ? s.getAttribute("data-reveal-offset") - : "200", - c = s.getAttribute("data-reveal-container") - ? s.closest(s.getAttribute("data-reveal-container")) - : s; - (n = l), - c.getBoundingClientRect().top <= t - n && - !s.classList.contains("is-revealed") && - (a && 0 !== a - ? setTimeout(function () { - s.classList.add("is-revealed"); - }, a) - : s.classList.add("is-revealed")); - } - var n; - !(function () { - if ( - e.length > - document.querySelectorAll("[class*=reveal-].is-revealed").length - ) - return; - window.removeEventListener("load", i), - window.removeEventListener("scroll", s), - window.removeEventListener("resize", a); - })(); - } - - function s() { - n(30, i()); - } - - function a() { - (t = window.innerHeight), n(30, i()); - } - - e.length > 0 && - document.body.classList.contains("has-animations") && - (window.addEventListener("load", i), - window.addEventListener("scroll", s), - window.addEventListener("resize", a)); - })(), - (function () { - "use strict"; - const e = document.getElementsByClassName("smooth-scroll"), - t = (e, n, i, s, a) => { - const l = n - e; - let c = l / i; - const o = (function (e) { - return e < 0.5 ? 2 * e * e : (4 - 2 * e) * e - 1; - })((c = Math.min(c, 1))); - window.scroll(0, a + s * o), - l < i && - window.requestAnimationFrame((n) => { - const l = n || new Date().getTime(); - t(e, l, i, s, a); - }); - }; - if (e.length > 0) - for (let n = 0; n < e.length; n++) { - e[n].addEventListener("click", function (e) { - e.preventDefault(); - const n = e.target.closest(".smooth-scroll"), - i = n.href.split("#")[1], - s = document.getElementById(i), - a = n.getAttribute("data-duration") || 1e3; - s && - window.requestAnimationFrame((e) => { - const n = e || new Date().getTime(), - i = n, - l = window.pageYOffset, - c = s.getBoundingClientRect().top; - t(i, n, a, c, l); - }); - }); - } - })(); diff --git a/public/js/mobile-menu.js b/public/js/mobile-menu.js deleted file mode 100755 index 83994d1..0000000 --- a/public/js/mobile-menu.js +++ /dev/null @@ -1,34 +0,0 @@ -(function () { - "use strict"; - const navToggle = document.getElementById("header-nav-toggle"); - const mainNav = document.getElementById("header-nav"); - - if (navToggle) { - // Open menu - navToggle.addEventListener("click", function () { - document.body.classList.toggle("off-nav-is-active"); - mainNav.classList.toggle("is-active"); - if (mainNav.style.maxHeight) { - mainNav.style.maxHeight = null; - } else { - mainNav.style.maxHeight = mainNav.scrollHeight + "px"; - } - this.getAttribute("aria-expanded") === "true" - ? this.setAttribute("aria-expanded", "false") - : this.setAttribute("aria-expanded", "true"); - }); - // Close menu - document.addEventListener("click", function (e) { - if ( - e.target !== mainNav && - e.target !== navToggle && - !mainNav.contains(e.target) - ) { - document.body.classList.remove("off-nav-is-active"); - mainNav.classList.remove("is-active"); - mainNav.style.maxHeight = null; - navToggle.setAttribute("aria-expanded", "false"); - } - }); - } -})(); diff --git a/public/js/modal.js b/public/js/modal.js deleted file mode 100755 index 2a38073..0000000 --- a/public/js/modal.js +++ /dev/null @@ -1,65 +0,0 @@ -(function () { - "use strict"; - const modals = document.getElementsByClassName("modal"); - const modalTriggers = document.getElementsByClassName("modal-trigger"); - - function openModal(el) { - if (el) { - document.body.classList.add("modal-is-active"); - el.classList.add("is-active"); - } - } - - function closeModals() { - document.body.classList.remove("modal-is-active"); - for (let i = 0; i < modals.length; i++) { - modals[i].classList.remove("is-active"); - } - } - - if (modals.length > 0 && modalTriggers.length > 0) { - for (let i = 0; i < modalTriggers.length; i++) { - let modalTrigger = modalTriggers[i]; - let modal = document.getElementById( - modalTrigger.getAttribute("aria-controls") - ); - if (modal) { - // Modal video - if (modalTrigger.hasAttribute("data-video")) { - if (modal.querySelector("iframe") !== null) { - modal - .querySelector("iframe") - .setAttribute("src", modalTrigger.getAttribute("data-video")); - } else if (modal.querySelector("video") !== null) { - modal - .querySelector("video") - .setAttribute("src", modalTrigger.getAttribute("data-video")); - } - } - modalTrigger.addEventListener("click", function (e) { - e.preventDefault(); - if (modalTrigger.hasAttribute("aria-controls")) { - openModal(modal); - } - }); - } - } - } - - document.addEventListener("click", function (e) { - if ( - e.target.classList.contains("modal") || - e.target.classList.contains("modal-close-trigger") - ) { - e.preventDefault(); - closeModals(); - } - }); - - document.addEventListener("keydown", function (event) { - var e = event || window.event; - if (e.keyCode === 27) { - closeModals(); - } - }); -})(); diff --git a/public/js/newroom.js b/public/js/newroom.js deleted file mode 100644 index accb3d6..0000000 --- a/public/js/newroom.js +++ /dev/null @@ -1,124 +0,0 @@ -var adjectives = [ - "small", - "big", - "large", - "smelly", - "new", - "happy", - "shiny", - "old", - "clean", - "nice", - "bad", - "cool", - "hot", - "cold", - "warm", - "hungry", - "slow", - "fast", - "red", - "white", - "black", - "blue", - "green", - "basic", - "strong", - "cute", - "poor", - "nice", - "huge", - "rare", - "lucky", - "weak", - "tall", - "short", - "tiny", - "great", - "long", - "single", - "rich", - "young", - "dirty", - "fresh", - "brown", - "dark", - "crazy", - "sad", - "loud", - "brave", - "calm", - "silly", - "smart", -]; - -var nouns = [ - "dog", - "bat", - "wrench", - "apple", - "pear", - "ghost", - "cat", - "wolf", - "squid", - "goat", - "snail", - "hat", - "sock", - "plum", - "bear", - "snake", - "turtle", - "horse", - "spoon", - "fork", - "spider", - "tree", - "chair", - "table", - "couch", - "towel", - "panda", - "bread", - "grape", - "cake", - "brick", - "rat", - "mouse", - "bird", - "oven", - "phone", - "photo", - "frog", - "bear", - "camel", - "sheep", - "shark", - "tiger", - "zebra", - "duck", - "eagle", - "fish", - "kitten", - "lobster", - "monkey", - "owl", - "puppy", - "pig", - "rabbit", - "fox", - "whale", - "beaver", - "gorilla", - "lizard", - "parrot", - "sloth", - "swan", -]; - -var adjective = adjectives[Math.floor(Math.random() * adjectives.length)]; -var noun = nouns[Math.floor(Math.random() * nouns.length)]; -noun = noun.charAt(0).toUpperCase() + noun.substring(1); -adjective = adjective.charAt(0).toUpperCase() + adjective.substring(1); -document.getElementById("input-01").value = adjective + noun; diff --git a/public/js/pricing-switcher.js b/public/js/pricing-switcher.js deleted file mode 100755 index 7f2cd20..0000000 --- a/public/js/pricing-switcher.js +++ /dev/null @@ -1,26 +0,0 @@ -(function () { - "use strict"; - const pricingToggle = document.getElementById("pricing-toggle"); - - if (pricingToggle) { - window.addEventListener("load", pricingSwitch); - pricingToggle.addEventListener("change", pricingSwitch); - } - - function pricingSwitch() { - const switchables = document.getElementsByClassName("pricing-switchable"); - if (pricingToggle.checked) { - for (let i = 0; i < switchables.length; i++) { - switchables[i].innerHTML = switchables[i].getAttribute( - "data-pricing-yearly" - ); - } - } else { - for (let i = 0; i < switchables.length; i++) { - switchables[i].innerHTML = switchables[i].getAttribute( - "data-pricing-monthly" - ); - } - } - } -})(); diff --git a/public/js/scroll-reveal.js b/public/js/scroll-reveal.js deleted file mode 100755 index da36a59..0000000 --- a/public/js/scroll-reveal.js +++ /dev/null @@ -1,76 +0,0 @@ -(function () { - "use strict"; - const revealEl = document.querySelectorAll("[class*=reveal-]"); - let viewportHeight = window.innerHeight; - - function throttle(delay, fn) { - var lastCall = 0; - return function () { - var now = new Date().getTime(); - if (now - lastCall < delay) { - return; - } - lastCall = now; - return fn.apply(void 0, arguments); - }; - } - - function elementIsVisible(el, offset) { - return el.getBoundingClientRect().top <= viewportHeight - offset; - } - - function revealElements() { - for (let i = 0; i < revealEl.length; i++) { - let el = revealEl[i]; - let revealDelay = el.getAttribute("data-reveal-delay"); - let revealOffset = el.getAttribute("data-reveal-offset") - ? el.getAttribute("data-reveal-offset") - : "200"; - let listenedEl = el.getAttribute("data-reveal-container") - ? el.closest(el.getAttribute("data-reveal-container")) - : el; - if ( - elementIsVisible(listenedEl, revealOffset) && - !el.classList.contains("is-revealed") - ) { - if (revealDelay && revealDelay !== 0) { - setTimeout(function () { - el.classList.add("is-revealed"); - }, revealDelay); - } else { - el.classList.add("is-revealed"); - } - } - } - revealDone(); - } - - function revealScroll() { - throttle(30, revealElements()); - } - - function revealResize() { - viewportHeight = window.innerHeight; - throttle(30, revealElements()); - } - - function revealDone() { - if ( - revealEl.length > - document.querySelectorAll("[class*=reveal-].is-revealed").length - ) - return; - window.removeEventListener("load", revealElements); - window.removeEventListener("scroll", revealScroll); - window.removeEventListener("resize", revealResize); - } - - if ( - revealEl.length > 0 && - document.body.classList.contains("has-animations") - ) { - window.addEventListener("load", revealElements); - window.addEventListener("scroll", revealScroll); - window.addEventListener("resize", revealResize); - } -})(); diff --git a/public/js/smooth-scroll.js b/public/js/smooth-scroll.js deleted file mode 100755 index 21b66b2..0000000 --- a/public/js/smooth-scroll.js +++ /dev/null @@ -1,69 +0,0 @@ -(function () { - "use strict"; - const smoothScrollLinks = document.getElementsByClassName("smooth-scroll"); - - const easeInOutQuad = function (t) { - return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; - }; - - const scrollToEl = ( - startTime, - currentTime, - duration, - scrollEndElemTop, - startScrollOffset - ) => { - const runtime = currentTime - startTime; - let progress = runtime / duration; - - progress = Math.min(progress, 1); - - const ease = easeInOutQuad(progress); - - window.scroll(0, startScrollOffset + scrollEndElemTop * ease); - if (runtime < duration) { - window.requestAnimationFrame((timestamp) => { - const currentTime = timestamp || new Date().getTime(); - scrollToEl( - startTime, - currentTime, - duration, - scrollEndElemTop, - startScrollOffset - ); - }); - } - }; - - if (smoothScrollLinks.length > 0) { - for (let i = 0; i < smoothScrollLinks.length; i++) { - const smoothScrollLink = smoothScrollLinks[i]; - - smoothScrollLink.addEventListener("click", function (e) { - e.preventDefault(); - const link = e.target.closest(".smooth-scroll"); - const targetId = link.href.split("#")[1]; - const target = document.getElementById(targetId); - const duration = link.getAttribute("data-duration") || 1000; - - if (!target) return; - - window.requestAnimationFrame((timestamp) => { - const stamp = timestamp || new Date().getTime(); - const start = stamp; - - const startScrollOffset = window.pageYOffset; - const scrollEndElemTop = target.getBoundingClientRect().top; - - scrollToEl( - start, - stamp, - duration, - scrollEndElemTop, - startScrollOffset - ); - }); - }); - } - } -})(); diff --git a/public/js/snackbar.js b/public/js/snackbar.js deleted file mode 100755 index c8ddb2a..0000000 --- a/public/js/snackbar.js +++ /dev/null @@ -1,192 +0,0 @@ -/*! - * Snackbar v0.1.14 - * http://polonel.com/Snackbar - * - * Copyright 2018 Chris Brame and other contributors - * Released under the MIT license - * https://github.com/polonel/Snackbar/blob/master/LICENSE - */ - -(function (root, factory) { - "use strict"; - - if (typeof define === "function" && define.amd) { - define([], function () { - return (root.Snackbar = factory()); - }); - } else if (typeof module === "object" && module.exports) { - module.exports = root.Snackbar = factory(); - } else { - root.Snackbar = factory(); - } -})(this, function () { - var Snackbar = {}; - - Snackbar.current = null; - var $defaults = { - text: "Default Text", - textColor: "#FFFFFF", - width: "auto", - showAction: true, - actionText: "Dismiss", - actionTextAria: "Dismiss, Description for Screen Readers", - alertScreenReader: false, - actionTextColor: "#4CAF50", - showSecondButton: false, - secondButtonText: "", - secondButtonAria: "Description for Screen Readers", - secondButtonTextColor: "#4CAF50", - // backgroundColor: "#323232", - pos: "bottom-left", - duration: 5000, - customClass: "", - onActionClick: function (element) { - element.style.opacity = 0; - }, - onSecondButtonClick: function (element) {}, - onClose: function (element) {}, - }; - - Snackbar.show = function ($options) { - var options = Extend(true, $defaults, $options); - - if (Snackbar.current) { - Snackbar.current.style.opacity = 0; - setTimeout( - function () { - var $parent = this.parentElement; - if ($parent) - // possible null if too many/fast Snackbars - $parent.removeChild(this); - }.bind(Snackbar.current), - 500 - ); - } - - Snackbar.snackbar = document.createElement("div"); - Snackbar.snackbar.className = "snackbar-container " + options.customClass; - Snackbar.snackbar.style.width = options.width; - var $p = document.createElement("p"); - $p.style.margin = 0; - $p.style.padding = 0; - $p.style.color = options.textColor; - $p.style.fontWeight = 300; - // $p.style.fontSize = "14px"; - // $p.style.lineHeight = "1em"; - $p.innerHTML = options.text; - Snackbar.snackbar.appendChild($p); - // Snackbar.snackbar.style.background = options.backgroundColor; - - if (options.showSecondButton) { - var secondButton = document.createElement("button"); - secondButton.className = "action"; - secondButton.innerHTML = options.secondButtonText; - secondButton.setAttribute("aria-label", options.secondButtonAria); - secondButton.style.color = options.secondButtonTextColor; - secondButton.addEventListener("click", function () { - options.onSecondButtonClick(Snackbar.snackbar); - }); - Snackbar.snackbar.appendChild(secondButton); - } - - if (options.showAction) { - var actionButton = document.createElement("button"); - actionButton.className = "action"; - actionButton.innerHTML = options.actionText; - actionButton.setAttribute("aria-label", options.actionTextAria); - actionButton.style.color = options.actionTextColor; - actionButton.addEventListener("click", function () { - options.onActionClick(Snackbar.snackbar); - }); - Snackbar.snackbar.appendChild(actionButton); - } - - if (options.duration) { - setTimeout( - function () { - if (Snackbar.current === this) { - Snackbar.current.style.opacity = 0; - // When natural remove event occurs let's move the snackbar to its origins - Snackbar.current.style.top = "-100px"; - Snackbar.current.style.bottom = "-100px"; - } - }.bind(Snackbar.snackbar), - options.duration - ); - } - - if (options.alertScreenReader) { - Snackbar.snackbar.setAttribute("role", "alert"); - } - - Snackbar.snackbar.addEventListener( - "transitionend", - function (event, elapsed) { - if (event.propertyName === "opacity" && this.style.opacity === "0") { - if (typeof options.onClose === "function") options.onClose(this); - - this.parentElement.removeChild(this); - if (Snackbar.current === this) { - Snackbar.current = null; - } - } - }.bind(Snackbar.snackbar) - ); - - Snackbar.current = Snackbar.snackbar; - - document.body.appendChild(Snackbar.snackbar); - var $bottom = getComputedStyle(Snackbar.snackbar).bottom; - var $top = getComputedStyle(Snackbar.snackbar).top; - Snackbar.snackbar.style.opacity = 1; - Snackbar.snackbar.className = - "snackbar-container " + - options.customClass + - " snackbar-pos " + - options.pos; - }; - - Snackbar.close = function () { - if (Snackbar.current) { - Snackbar.current.style.opacity = 0; - } - }; - - // Pure JS Extend - // http://gomakethings.com/vanilla-javascript-version-of-jquery-extend/ - var Extend = function () { - var extended = {}; - var deep = false; - var i = 0; - var length = arguments.length; - - if (Object.prototype.toString.call(arguments[0]) === "[object Boolean]") { - deep = arguments[0]; - i++; - } - - var merge = function (obj) { - for (var prop in obj) { - if (Object.prototype.hasOwnProperty.call(obj, prop)) { - if ( - deep && - Object.prototype.toString.call(obj[prop]) === "[object Object]" - ) { - extended[prop] = Extend(true, extended[prop], obj[prop]); - } else { - extended[prop] = obj[prop]; - } - } - } - }; - - for (; i < length; i++) { - var obj = arguments[i]; - merge(obj); - } - - return extended; - }; - - return Snackbar; -}); diff --git a/public/landing.html b/public/landing.html deleted file mode 100755 index 332dced..0000000 --- a/public/landing.html +++ /dev/null @@ -1,393 +0,0 @@ - - - - - - - - - - Zipcall - - - - - - - - -
- -
-
-
-
-
-
-
-

- Zipcall.io
Free browser based video calling for - everyone. -

-

- Simple, Secure, and Fast. Peer to peer video calling - provides quality and latency simply not available with - traditional technology. -

-
- Try now -
-
- -
-
-
-
-
- -
-
-
-
-
-

See the whole picture

-

- Zipcall is built radically different. We left behind slow - bulky servers, opting for decentralized peer to peer - calling. We engineered a platform with maximum video quality - and lowest latency. -

-
-
-
-
-
-
-
- Feature tile icon 02 -
-
-
-

Best Video Quality

-

- State of the art video compression combined with our - scaling optimization makes your calls crystal clear. -

-
-
-
- -
-
-
-
- Feature tile icon 04 -
-
-
-

No Download Required

-

- No downloads. No plugins. No nonsense. Just open Zipcall - in your browser and get back to what matters most. -

-
-
-
- -
-
-
-
- Feature tile icon 01 -
-
-
-

Lowest Latency

-

- Breakthrough peer to peer WebRTC technology means your - video goes directly to the other person without a - server. No middleman. No extra stops. -

-
-
-
- -
-
-
-
- Feature tile icon 03 -
-
-
-

Total Privacy

-

- Each chat is single use, data stays between you and your - caller. Zipcall is built privacy first. -

-
-
-
- -
-
-
-
- Feature tile icon 05 -
-
-
-

No Server Needed

-

- Calls are entirely between you and your caller, - decentralized from any server. Call data never leaves - the browser. Cool right? -

-
-
-
- -
-
-
-
- Feature tile icon 06 -
-
-
-

Maximum Security

-

- End to end state of the art encryption means your calls - are exactly that. Your calls. -

-
-
-
-
-
-
-
- -
-
-
-
-
-

- Meet the team -

- - - -
-
- -
-
-
-
-
- Team member 01 -
-
-
- -
Ian Ramzy
-
-
- Software Engineer -
-

- Connecting the world together one Zipcall at a time. -

-
-
-
-
-
-
-
- -
-
-
-
-
-

- Try an easier, more secure way of calling. -

-
-
- Try now -
-
-
-
-
-
- -
- - - diff --git a/public/newcall.html b/public/newcall.html deleted file mode 100755 index bc0f390..0000000 --- a/public/newcall.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - Zipcall - - - - - - - - - -
- -
-
-
-
-
-
-
-

- Pick name.
- Share URL.
- Start chatting. -

-

- Each chat has its own disposable URL. Just pick a call - name and share your custom link. It's really that easy. -

-
- -
-
-
-
-
- -
-
-
-
-

- Pick a call name.
- How about this one? -

-
-
-
- -
- - -
-
-
-
-
-
-
- -
- - - - diff --git a/public/notsupported.html b/public/notsupported.html deleted file mode 100644 index 412bb01..0000000 --- a/public/notsupported.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - Zipcall - - - - - - - - -
- -
-
-
-
-
-
-
-

- Your browser is not supported. Try updating your browser - or try Chrome, Safari, or Firefox. -

-
- -
-
-
-
-
-
- -
- - - diff --git a/public/notsupportedios.html b/public/notsupportedios.html deleted file mode 100644 index 5e63f8c..0000000 --- a/public/notsupportedios.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - Zipcall - - - - - - - - -
- -
-
-
-
-
-
-
-

- Your browser is unsupported. Please open Zipcall in the - Safari app. -

-
- -
-
-
-
-
-
- -
- - - diff --git a/public/reference/additional.html b/public/reference/additional.html deleted file mode 100755 index 839a6ae..0000000 --- a/public/reference/additional.html +++ /dev/null @@ -1,1204 +0,0 @@ - - - - - - - Neon Template - - - -
- -
-
-
-
-
-
-

- Engage Your Visitors with a beautiful template -

-
-
-
- -
-
-
-
-
-
-
- $27/m -
-
- Lorem ipsum is a common text -
-
-
-
- What’s included -
-
    -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • Excepteur sint occaecat velit
  • -
  • Excepteur sint occaecat velit
  • -
-
-
- -
-
-
-
-
-
-
- $47/m -
-
- Lorem ipsum is a common text -
-
-
-
- What’s included -
-
    -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • Excepteur sint occaecat velit
  • -
-
-
- -
-
-
-
-
-
-
- $67/m -
-
- Lorem ipsum is a common text -
-
-
-
- What’s included -
-
    -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
  • - Excepteur sint occaecat velit -
  • -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-

- Meet the team - Lorem ipsum is placeholder text. -

-

- Duis aute irure dolor in reprehenderit in voluptate velit - esse cillum dolore eu fugiat nulla pariatur excepteur sint — - occaecat cupidatat non proident, sunt in culpa qui. -

-
-
-
-
-
-
-
- Team member 01 -
-
-
-
Markus Hasinika
-
- Founder & CEO -
-

- Magnis dis parturient montes nascetur. Quam quisque id - diam vel quam ultricies leo integer. -

-
-
-
-
-
-
-
- Team member 02 -
-
-
-
Diana Stafford
-
- Founder & CEO -
-

- Magnis dis parturient montes nascetur. Quam quisque id - diam vel quam ultricies leo integer. -

-
-
-
-
-
-
-
- Team member 03 -
-
-
-
Patricia Collins
-
- Founder & CEO -
-

- Magnis dis parturient montes nascetur. Quam quisque id - diam vel quam ultricies leo integer. -

-
-
-
-
-
-
-
- Team member 04 -
-
-
-
Anton Klenkov
-
- Founder & CEO -
-

- Magnis dis parturient montes nascetur. Quam quisque id - diam vel quam ultricies leo integer. -

-
-
-
-
-
-
-
- Team member 05 -
-
-
-
Nick Kornilov
-
- Founder & CEO -
-

- Magnis dis parturient montes nascetur. Quam quisque id - diam vel quam ultricies leo integer. -

-
-
-
-
-
-
-
- Team member 01 -
-
-
-
Andrea Engler
-
- Founder & CEO -
-

- Magnis dis parturient montes nascetur. Quam quisque id - diam vel quam ultricies leo integer. -

-
-
-
-
-
-
-
- -
-
-
-
    -
  • - Clients 01 -
  • -
  • - Clients 02 -
  • - -
  • - Clients 03 -
  • - -
  • - Clients 04 -
  • - -
  • - Clients 05 -
  • -
-
-
-
- - Video -
-
-
-
-
-

Built exclusively for you

-

- Duis aute irure dolor in reprehenderit in voluptate velit - esse cillum dolore eu fugiat nulla pariatur excepteur sint — - occaecat cupidatat non proident, sunt in culpa qui. -

-
-
-
- Video -
- -
-
-
- - -
-
-
-
-
-

Don't take our word for it

-

- Duis aute irure dolor in reprehenderit in voluptate velit - esse cillum dolore eu fugiat nulla pariatur excepteur sint — - occaecat cupidatat non proident, sunt in culpa qui. -

-
-
-
-
-
-
-

- — Duis aute irure dolor in reprehenderit in voluptate - velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum - cillum dolore eu fugiat. -

-
- -
-
-
-
-
-

- — Duis aute irure dolor in reprehenderit in voluptate - velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum - cillum dolore eu fugiat. -

-
- -
-
-
-
-
-

- — Duis aute irure dolor in reprehenderit in voluptate - velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum - cillum dolore eu fugiat. -

-
- -
-
-
-
-
-
- -
-
-
-
-

For previewing layouts and visual?

-
-
-
- - - - - -
-
-
-
-
- -
-
-
-
-
-

- Features - Lorem ipsum is placeholder text. -

-

- Duis aute irure dolor in reprehenderit in voluptate velit - esse cillum dolore eu fugiat nulla pariatur excepteur sint — - occaecat cupidatat non proident, sunt in culpa qui. -

-
-
-
-
-
-

Data-driven insights

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, - sed do eiusmod tempor incididunt ut labore et dolore magna - aliqua — Ut enim ad minim veniam, quis nostrud - exercitation ullamco laboris nisi ut aliquip ex ea commodo - consequat. -

-
-
- Features split image 01 -
-
-
-
-

Data-driven insights

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, - sed do eiusmod tempor incididunt ut labore et dolore magna - aliqua — Ut enim ad minim veniam, quis nostrud - exercitation ullamco laboris nisi ut aliquip ex ea commodo - consequat. -

-
-
- Features split image 02 -
-
-
-
-

Data-driven insights

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, - sed do eiusmod tempor incididunt ut labore et dolore magna - aliqua — Ut enim ad minim veniam, quis nostrud - exercitation ullamco laboris nisi ut aliquip ex ea commodo - consequat. -

-
-
- Features split image 03 -
-
-
-
-
-
-
-
-
-
-

- Lorem ipsum is placeholder text commonly used in the graphic. -

-

- Lorem ipsum dolor sit amet, - consectetur adipiscing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua. Ut enim ad - minim veniam, quis nostrud exercitation ullamco laboris nisi - ut aliquip ex ea commodo consequat. -

-

- Duis aute irure dolor in reprehenderit in voluptate velit esse - cillum dolore eu fugiat nulla pariatur. Excepteur sint - occaecat cupidatat non proident, sunt in culpa qui officia - deserunt mollit anim id est laborum. -

-
- Image placeholder -
- A super-nice image - 😀 -
-
-

Flexibility

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed - do eiusmod tempor incididunt ut labore et dolore magna aliqua. - Ut enim ad minim veniam, quis nostrud exercitation ullamco - laboris nisi ut aliquip ex ea commodo consequat sint occaecat - cupidatat non proident, sunt in culpa qui officia deserunt - mollit anim id est laborum. -

-
    -
  • Lorem ipsum dolor sit amet, consectetur.
  • -
  • Lorem ipsum dolor sit amet, consectetur.
  • -
  • Lorem ipsum dolor sit amet, consectetur.
  • -
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed - do eiusmod tempor incididunt ut labore et dolore magna aliqua. - Ut enim ad minim veniam, quis nostrud exercitation ullamco - laboris. -

-
-
-
-
-
-
-
-
-
-

- Modal - Lorem ipsum is placeholder text commonly used. -

-
- - -
-
-
-
-
-
-
-
-
-

- Buttons - Lorem ipsum is placeholder text commonly used. -

-
- - -
-
-
-
-
-
-
-
-
-

- Input forms - Lorem ipsum is placeholder text commonly used. -

-
-
-
- -
- - -
-
-
- -
- - -
-
-
- -
- - -
-
- Something is wrong. -
-
-
- -
- - -
-
- You’ve done it. -
-
-
-
-
-
-
-
-
-
-
-
-

- FAQ - Lorem ipsum is placeholder text commonly used. -

-
-
    -
  • -
    - Nisi porta lorem mollis aliquam ut. -
    -
    -
    -

    - Lorem ipsum is placeholder text commonly used in the - graphic, print, and publishing industries for previewing - layouts and visual mockups. -

    -
    -
  • -
  • -
    - Nisi porta lorem mollis aliquam ut. -
    -
    -
    -

    - Lorem ipsum is placeholder text commonly used in the - graphic, print, and publishing industries for previewing - layouts and visual mockups. -

    -
    -
  • -
  • -
    - Nisi porta lorem mollis aliquam ut. -
    -
    -
    -

    - Lorem ipsum is placeholder text commonly used in the - graphic, print, and publishing industries for previewing - layouts and visual mockups. -

    -
    -
  • -
  • -
    - Nisi porta lorem mollis aliquam ut. -
    -
    -
    -

    - Lorem ipsum is placeholder text commonly used in the - graphic, print, and publishing industries for previewing - layouts and visual mockups. -

    -
    -
  • -
  • -
    - Nisi porta lorem mollis aliquam ut. -
    -
    -
    -

    - Lorem ipsum is placeholder text commonly used in the - graphic, print, and publishing industries for previewing - layouts and visual mockups. -

    -
    -
  • -
-
-
-
-
-
-
-
-
-

For previewing layouts and visual?

-
-
-
- - - - - -
-
-
-
-
-
- -
- - - diff --git a/server.js b/server.js deleted file mode 100644 index 13dbf22..0000000 --- a/server.js +++ /dev/null @@ -1,132 +0,0 @@ -require("dotenv").config(); -var sslRedirect = require("heroku-ssl-redirect"); -// Get twillio auth and SID from heroku if deployed, else get from local .env file -var twillioAuthToken = - process.env.HEROKU_AUTH_TOKEN || process.env.LOCAL_AUTH_TOKEN; -var twillioAccountSID = - process.env.HEROKU_TWILLIO_SID || process.env.LOCAL_TWILLIO_SID; -var twilio = require("twilio")(twillioAccountSID, twillioAuthToken); -var express = require("express"); -var app = express(); -var http = require("http").createServer(app); -var io = require("socket.io")(http); -var path = require("path"); -var public = path.join(__dirname, "public"); -const url = require("url"); - -// enable ssl redirect -app.use(sslRedirect()); - -// Remove trailing slashes in url -app.use(function (req, res, next) { - if (req.path.substr(-1) === "/" && req.path.length > 1) { - let query = req.url.slice(req.path.length); - res.redirect(301, req.path.slice(0, -1) + query); - } else { - next(); - } -}); - -app.get("/", function (req, res) { - res.sendFile(path.join(public, "landing.html")); -}); - -app.get("/newcall", function (req, res) { - res.sendFile(path.join(public, "newcall.html")); -}); - -app.get("/join/", function (req, res) { - res.redirect("/"); -}); - -app.get("/join/*", function (req, res) { - if (Object.keys(req.query).length > 0) { - logIt("redirect:" + req.url + " to " + url.parse(req.url).pathname); - res.redirect(url.parse(req.url).pathname); - } else { - res.sendFile(path.join(public, "chat.html")); - } -}); - -app.get("/notsupported", function (req, res) { - res.sendFile(path.join(public, "notsupported.html")); -}); - -app.get("/notsupportedios", function (req, res) { - res.sendFile(path.join(public, "notsupportedios.html")); -}); - -// Serve static files in the public directory -app.use(express.static("public")); - -// Simple logging function to add room name -function logIt(msg, room) { - if (room) { - console.log(room + ": " + msg); - } else { - console.log(msg); - } -} - -// When a socket connects, set up the specific listeners we will use. -io.on("connection", function (socket) { - // When a client tries to join a room, only allow them if they are first or - // second in the room. Otherwise it is full. - socket.on("join", function (room) { - logIt("A client joined the room", room); - var clients = io.sockets.adapter.rooms[room]; - var numClients = typeof clients !== "undefined" ? clients.length : 0; - if (numClients === 0) { - socket.join(room); - } else if (numClients === 1) { - socket.join(room); - // When the client is second to join the room, both clients are ready. - logIt("Broadcasting ready message", room); - // First to join call initiates call - socket.broadcast.to(room).emit("willInitiateCall", room); - socket.emit("ready", room).to(room); - socket.broadcast.to(room).emit("ready", room); - } else { - logIt("room already full", room); - socket.emit("full", room); - } - }); - - // When receiving the token message, use the Twilio REST API to request an - // token to get ephemeral credentials to use the TURN server. - socket.on("token", function (room) { - logIt("Received token request", room); - twilio.tokens.create(function (err, response) { - if (err) { - logIt(err, room); - } else { - logIt("Token generated. Returning it to the browser client", room); - socket.emit("token", response).to(room); - } - }); - }); - - // Relay candidate messages - socket.on("candidate", function (candidate, room) { - logIt("Received candidate. Broadcasting...", room); - socket.broadcast.to(room).emit("candidate", candidate); - }); - - // Relay offers - socket.on("offer", function (offer, room) { - logIt("Received offer. Broadcasting...", room); - socket.broadcast.to(room).emit("offer", offer); - }); - - // Relay answers - socket.on("answer", function (answer, room) { - logIt("Received answer. Broadcasting...", room); - socket.broadcast.to(room).emit("answer", answer); - }); -}); - -// Listen for Heroku port, otherwise just use 3000 -var port = process.env.PORT || 3000; -http.listen(port, function () { - console.log("http://localhost:" + port); -});