├── .gitignore ├── .ruby-version ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE.txt ├── README.md ├── RELEASING.md ├── _changes ├── 2017-11-02.md └── 2017-11-14.md ├── _config.yml ├── _includes ├── drawer_nav_full.html ├── footer.html ├── head.html ├── header.html └── side_nav.html ├── _layouts ├── default.html ├── page.html └── post.html ├── _sass ├── _base.scss ├── _config.scss ├── _layout.scss ├── _mdl.scss └── _syntax-highlighting.scss ├── assets ├── favicon.png ├── home.png ├── logo.png └── sdk.png ├── changelog.html ├── contribute.md ├── css └── main.scss ├── index.md ├── interop.md └── style.md /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | vendor 4 | .bundle -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.4.0 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.4.0 4 | 5 | # Build all branches, *including* gh-pages: 6 | branches: 7 | only: 8 | - gh-pages 9 | - /.*/ 10 | 11 | script: bundle exec jekyll build 12 | 13 | sudo: false 14 | 15 | notifications: 16 | email: false 17 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'github-pages' 4 | gem 'therubyracer' 5 | gem 'octopress-autoprefixer' 6 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.9) 5 | i18n (~> 0.7) 6 | minitest (~> 5.1) 7 | thread_safe (~> 0.3, >= 0.3.4) 8 | tzinfo (~> 1.1) 9 | addressable (2.5.2) 10 | public_suffix (>= 2.0.2, < 4.0) 11 | autoprefixer-rails (7.1.5) 12 | execjs 13 | coffee-script (2.4.1) 14 | coffee-script-source 15 | execjs 16 | coffee-script-source (1.11.1) 17 | colorator (1.1.0) 18 | concurrent-ruby (1.0.5) 19 | ethon (0.10.1) 20 | ffi (>= 1.3.0) 21 | execjs (2.7.0) 22 | faraday (0.13.1) 23 | multipart-post (>= 1.2, < 3) 24 | ffi (1.9.18) 25 | forwardable-extended (2.6.0) 26 | gemoji (3.0.0) 27 | github-pages (165) 28 | activesupport (= 4.2.9) 29 | github-pages-health-check (= 1.3.5) 30 | jekyll (= 3.6.0) 31 | jekyll-avatar (= 0.5.0) 32 | jekyll-coffeescript (= 1.0.2) 33 | jekyll-default-layout (= 0.1.4) 34 | jekyll-feed (= 0.9.2) 35 | jekyll-gist (= 1.4.1) 36 | jekyll-github-metadata (= 2.9.3) 37 | jekyll-mentions (= 1.2.0) 38 | jekyll-optional-front-matter (= 0.2.0) 39 | jekyll-paginate (= 1.1.0) 40 | jekyll-readme-index (= 0.1.0) 41 | jekyll-redirect-from (= 0.12.1) 42 | jekyll-relative-links (= 0.5.0) 43 | jekyll-sass-converter (= 1.5.0) 44 | jekyll-seo-tag (= 2.3.0) 45 | jekyll-sitemap (= 1.1.1) 46 | jekyll-swiss (= 0.4.0) 47 | jekyll-theme-architect (= 0.1.0) 48 | jekyll-theme-cayman (= 0.1.0) 49 | jekyll-theme-dinky (= 0.1.0) 50 | jekyll-theme-hacker (= 0.1.0) 51 | jekyll-theme-leap-day (= 0.1.0) 52 | jekyll-theme-merlot (= 0.1.0) 53 | jekyll-theme-midnight (= 0.1.0) 54 | jekyll-theme-minimal (= 0.1.0) 55 | jekyll-theme-modernist (= 0.1.0) 56 | jekyll-theme-primer (= 0.5.2) 57 | jekyll-theme-slate (= 0.1.0) 58 | jekyll-theme-tactile (= 0.1.0) 59 | jekyll-theme-time-machine (= 0.1.0) 60 | jekyll-titles-from-headings (= 0.4.0) 61 | jemoji (= 0.8.1) 62 | kramdown (= 1.14.0) 63 | liquid (= 4.0.0) 64 | listen (= 3.0.6) 65 | mercenary (~> 0.3) 66 | minima (= 2.1.1) 67 | rouge (= 2.2.1) 68 | terminal-table (~> 1.4) 69 | github-pages-health-check (1.3.5) 70 | addressable (~> 2.3) 71 | net-dns (~> 0.8) 72 | octokit (~> 4.0) 73 | public_suffix (~> 2.0) 74 | typhoeus (~> 0.7) 75 | html-pipeline (2.7.1) 76 | activesupport (>= 2) 77 | nokogiri (>= 1.4) 78 | i18n (0.9.0) 79 | concurrent-ruby (~> 1.0) 80 | jekyll (3.6.0) 81 | addressable (~> 2.4) 82 | colorator (~> 1.0) 83 | jekyll-sass-converter (~> 1.0) 84 | jekyll-watch (~> 1.1) 85 | kramdown (~> 1.14) 86 | liquid (~> 4.0) 87 | mercenary (~> 0.3.3) 88 | pathutil (~> 0.9) 89 | rouge (>= 1.7, < 3) 90 | safe_yaml (~> 1.0) 91 | jekyll-avatar (0.5.0) 92 | jekyll (~> 3.0) 93 | jekyll-coffeescript (1.0.2) 94 | coffee-script (~> 2.2) 95 | coffee-script-source (~> 1.11.1) 96 | jekyll-default-layout (0.1.4) 97 | jekyll (~> 3.0) 98 | jekyll-feed (0.9.2) 99 | jekyll (~> 3.3) 100 | jekyll-gist (1.4.1) 101 | octokit (~> 4.2) 102 | jekyll-github-metadata (2.9.3) 103 | jekyll (~> 3.1) 104 | octokit (~> 4.0, != 4.4.0) 105 | jekyll-mentions (1.2.0) 106 | activesupport (~> 4.0) 107 | html-pipeline (~> 2.3) 108 | jekyll (~> 3.0) 109 | jekyll-optional-front-matter (0.2.0) 110 | jekyll (~> 3.0) 111 | jekyll-paginate (1.1.0) 112 | jekyll-readme-index (0.1.0) 113 | jekyll (~> 3.0) 114 | jekyll-redirect-from (0.12.1) 115 | jekyll (~> 3.3) 116 | jekyll-relative-links (0.5.0) 117 | jekyll (~> 3.3) 118 | jekyll-sass-converter (1.5.0) 119 | sass (~> 3.4) 120 | jekyll-seo-tag (2.3.0) 121 | jekyll (~> 3.3) 122 | jekyll-sitemap (1.1.1) 123 | jekyll (~> 3.3) 124 | jekyll-swiss (0.4.0) 125 | jekyll-theme-architect (0.1.0) 126 | jekyll (~> 3.5) 127 | jekyll-seo-tag (~> 2.0) 128 | jekyll-theme-cayman (0.1.0) 129 | jekyll (~> 3.5) 130 | jekyll-seo-tag (~> 2.0) 131 | jekyll-theme-dinky (0.1.0) 132 | jekyll (~> 3.5) 133 | jekyll-seo-tag (~> 2.0) 134 | jekyll-theme-hacker (0.1.0) 135 | jekyll (~> 3.5) 136 | jekyll-seo-tag (~> 2.0) 137 | jekyll-theme-leap-day (0.1.0) 138 | jekyll (~> 3.5) 139 | jekyll-seo-tag (~> 2.0) 140 | jekyll-theme-merlot (0.1.0) 141 | jekyll (~> 3.5) 142 | jekyll-seo-tag (~> 2.0) 143 | jekyll-theme-midnight (0.1.0) 144 | jekyll (~> 3.5) 145 | jekyll-seo-tag (~> 2.0) 146 | jekyll-theme-minimal (0.1.0) 147 | jekyll (~> 3.5) 148 | jekyll-seo-tag (~> 2.0) 149 | jekyll-theme-modernist (0.1.0) 150 | jekyll (~> 3.5) 151 | jekyll-seo-tag (~> 2.0) 152 | jekyll-theme-primer (0.5.2) 153 | jekyll (~> 3.5) 154 | jekyll-github-metadata (~> 2.9) 155 | jekyll-seo-tag (~> 2.2) 156 | jekyll-theme-slate (0.1.0) 157 | jekyll (~> 3.5) 158 | jekyll-seo-tag (~> 2.0) 159 | jekyll-theme-tactile (0.1.0) 160 | jekyll (~> 3.5) 161 | jekyll-seo-tag (~> 2.0) 162 | jekyll-theme-time-machine (0.1.0) 163 | jekyll (~> 3.5) 164 | jekyll-seo-tag (~> 2.0) 165 | jekyll-titles-from-headings (0.4.0) 166 | jekyll (~> 3.3) 167 | jekyll-watch (1.5.0) 168 | listen (~> 3.0, < 3.1) 169 | jemoji (0.8.1) 170 | activesupport (~> 4.0, >= 4.2.9) 171 | gemoji (~> 3.0) 172 | html-pipeline (~> 2.2) 173 | jekyll (>= 3.0) 174 | kramdown (1.14.0) 175 | libv8 (3.16.14.19) 176 | liquid (4.0.0) 177 | listen (3.0.6) 178 | rb-fsevent (>= 0.9.3) 179 | rb-inotify (>= 0.9.7) 180 | mercenary (0.3.6) 181 | mini_portile2 (2.3.0) 182 | minima (2.1.1) 183 | jekyll (~> 3.3) 184 | minitest (5.10.3) 185 | multipart-post (2.0.0) 186 | net-dns (0.8.0) 187 | nokogiri (1.8.1) 188 | mini_portile2 (~> 2.3.0) 189 | octokit (4.7.0) 190 | sawyer (~> 0.8.0, >= 0.5.3) 191 | octopress-autoprefixer (2.0.1) 192 | autoprefixer-rails 193 | jekyll (~> 3.0) 194 | pathutil (0.16.0) 195 | forwardable-extended (~> 2.6) 196 | public_suffix (2.0.5) 197 | rb-fsevent (0.10.2) 198 | rb-inotify (0.9.10) 199 | ffi (>= 0.5.0, < 2) 200 | ref (2.0.0) 201 | rouge (2.2.1) 202 | safe_yaml (1.0.4) 203 | sass (3.5.2) 204 | sass-listen (~> 4.0.0) 205 | sass-listen (4.0.0) 206 | rb-fsevent (~> 0.9, >= 0.9.4) 207 | rb-inotify (~> 0.9, >= 0.9.7) 208 | sawyer (0.8.1) 209 | addressable (>= 2.3.5, < 2.6) 210 | faraday (~> 0.8, < 1.0) 211 | terminal-table (1.8.0) 212 | unicode-display_width (~> 1.1, >= 1.1.1) 213 | therubyracer (0.12.3) 214 | libv8 (~> 3.16.14.15) 215 | ref 216 | thread_safe (0.3.6) 217 | typhoeus (0.8.0) 218 | ethon (>= 0.8.0) 219 | tzinfo (1.2.3) 220 | thread_safe (~> 0.1) 221 | unicode-display_width (1.3.0) 222 | 223 | PLATFORMS 224 | ruby 225 | 226 | DEPENDENCIES 227 | github-pages 228 | octopress-autoprefixer 229 | therubyracer 230 | 231 | BUNDLED WITH 232 | 1.15.4 233 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Kotlin 指导 2 | ============= 3 | 4 | [Android Kotlin Guides][1] 网站的第三方简体中文翻译,维护者 @fython 。 5 | 6 | 关于贡献信息,请查看 [website][2]。 7 | 8 | 9 | 10 | 许可 11 | ------- 12 | 13 | 请查看 ["内容许可"][3]. 14 | 15 | 16 | 17 | [1]: https://android.github.io/kotlin-guides/ 18 | [2]: https://android.github.io/kotlin-guides/contribute.html 19 | [3]: https://developer.android.com/license.html 20 | -------------------------------------------------------------------------------- /RELEASING.md: -------------------------------------------------------------------------------- 1 | Releasing 2 | ========= 3 | 4 | 1. Checkout `master` (`git checkout master`) 5 | 2. Pull latest changes from upstream (`git pull`) 6 | 3. Create an entry in `_changes/` for the current date and write in the changes since the last version. Easiest way to do this is to copy the previous file and update it. (Yes those double `---` lines at the top of each file are required) 7 | 4. Commit (`git commit -am "Prepare release 20XX-YY-ZZ"`) 8 | 5. Tag (`git tag -a 20XX-YY-ZZ -m "20XX-YY-ZZ"`) 9 | 6. Checkout `gh-pages` branch (`git checkout gh-pages`) 10 | * If you don't have a `gh-pages` branch locally, run `git checkout -t origin/gh-pages`. 11 | 7. Merge in `master` (`git merge master`) 12 | 8. Push both branches (`git push --all`) 13 | 9. Push tag (`git push --tags`) 14 | -------------------------------------------------------------------------------- /_changes/2017-11-02.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 2017-11-02 3 | --- 4 | 5 | 发布初始版本。 -------------------------------------------------------------------------------- /_changes/2017-11-14.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 2017-11-14 3 | --- 4 | 5 | **互通** 6 | 7 | * 修正: 修改 ["Lambda 参数"](interop.html#lambda-arguments) 小节内容使能准确地反映出 lambda 类型和 SAM 接口转换的现状。 8 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Site settings 2 | title: Android Kotlin Guides 3 | email: fythonx@gmail.com 4 | description: > 5 | 在 Android 上开发 Kotlin 的官方指导 6 | baseurl: "/kotlin-guides-cn" 7 | url: "https://fython.github.io" 8 | 9 | # Build settings 10 | markdown: kramdown 11 | 12 | collections: 13 | - changes 14 | 15 | plugins: 16 | - octopress-autoprefixer 17 | - jekyll-redirect-from 18 | 19 | exclude: 20 | - vendor 21 | -------------------------------------------------------------------------------- /_includes/drawer_nav_full.html: -------------------------------------------------------------------------------- 1 | {% assign menu_items = (site.pages | sort:"site_nav_category_order" %} 2 | 3 |
4 | 12 |
13 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if page.title %}{{ page.title }} - Kotlin 指导{% else %}{{ site.title }}{% endif %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 | 8 | 9 |
10 | 13 |
14 | 15 | 16 | 17 |
18 |
19 | 20 |
21 | 22 | 23 | 24 | 25 | {{ site.title }} 26 | 27 | 28 |
29 | 30 |
31 |
32 | 33 |
34 | 46 |
47 |
48 | -------------------------------------------------------------------------------- /_includes/side_nav.html: -------------------------------------------------------------------------------- 1 | 2 | {% if page.site_nav_category %} 3 | {% assign menu_items = (site.pages | where: "site_nav_category", page.site_nav_category) | sort:"site_nav_category_order" %} 4 | 5 | 14 | {% endif %} 15 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include head.html %} 5 | 6 | 7 |
8 | {% include header.html %} 9 | {% include drawer_nav_full.html %} 10 |
11 |
12 | {% include side_nav.html %} 13 |
14 |
15 | {{ content }} 16 |
17 |
{% include footer.html %}
18 |
19 |
{% include footer.html %}
20 |
21 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | 6 |
7 |

{{ page.title }}

8 |
9 | 10 |
11 | {{ content }} 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | 6 |
7 |

{{ page.title }}

8 | 9 |
10 | 11 |
12 | {{ content }} 13 |
14 | 15 |
16 | -------------------------------------------------------------------------------- /_sass/_base.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Reset some basic elements 4 | */ 5 | body, h1, h2, h3, h4, h5, h6, 6 | p, blockquote, pre, hr, 7 | dl, dd, ol, ul, figure { 8 | margin: 0; 9 | padding: 0; 10 | } 11 | 12 | 13 | 14 | /** 15 | * Basic styling 16 | */ 17 | html, body { 18 | font-family: 'Roboto', 'Helvetica', sans-serif; 19 | } 20 | 21 | 22 | /** 23 | * Set `margin-bottom` to maintain vertical rhythm 24 | */ 25 | h1, h2, h3, h4, h5, h6, 26 | p, blockquote, pre, 27 | ul, ol, dl, figure, 28 | %vertical-rhythm { 29 | margin-bottom: $spacing-unit / 2; 30 | } 31 | 32 | h1 { 33 | font-size: 44px; 34 | } 35 | h2 { 36 | font-size: 28px; 37 | font-weight: 400; 38 | line-height: 32px; 39 | margin: 24px 0 16px; 40 | } 41 | h3 { 42 | font-size: 24px; 43 | line-height: 32px; 44 | font-weight: 400; 45 | margin: 16px 0; 46 | } 47 | h4 { 48 | font-size: 18px; 49 | line-height: 24px; 50 | margin: 12px 0; 51 | font-weight: 500; 52 | } 53 | h5, h6 { 54 | font-size: 16px; 55 | line-height: 24px; 56 | margin: 8px 0; 57 | } 58 | /** 59 | * Images 60 | */ 61 | img { 62 | max-width: 100%; 63 | vertical-align: middle; 64 | } 65 | 66 | 67 | 68 | /** 69 | * Figures 70 | */ 71 | figure > img { 72 | display: block; 73 | } 74 | 75 | figcaption { 76 | font-size: $small-font-size; 77 | } 78 | 79 | 80 | 81 | /** 82 | * Lists 83 | */ 84 | ul, ol { 85 | margin-left: $spacing-unit; 86 | } 87 | 88 | li { 89 | > ul, 90 | > ol { 91 | margin-bottom: 0; 92 | } 93 | } 94 | 95 | 96 | 97 | /** 98 | * Headings 99 | */ 100 | h1, h2 { 101 | font-weight: 300; 102 | } 103 | 104 | 105 | 106 | /** 107 | * Links 108 | */ 109 | a { 110 | color: $color-primary; 111 | text-decoration: none; 112 | } 113 | 114 | 115 | 116 | /** 117 | * Blockquotes 118 | */ 119 | blockquote { 120 | color: $grey-color; 121 | border-left: 4px solid $grey-color-light; 122 | padding-left: $spacing-unit / 2; 123 | font-size: 18px; 124 | letter-spacing: -1px; 125 | font-style: italic; 126 | 127 | > :last-child { 128 | margin-bottom: 0; 129 | } 130 | } 131 | 132 | 133 | 134 | /** 135 | * Code formatting 136 | */ 137 | pre 138 | code { 139 | font-size: 15px; 140 | background: $tac-code-background; 141 | } 142 | 143 | code { 144 | color: #505050; 145 | font-size: inherit; 146 | background: transparent; 147 | 148 | padding: 0px 4px; 149 | border: 1px solid $grey-color-light; 150 | } 151 | 152 | pre { 153 | padding: 8px 12px; 154 | background: $tac-code-background; 155 | overflow-x: auto; 156 | 157 | border: 1px solid $grey-color-light; 158 | 159 | > code { 160 | border: 0; 161 | padding-right: 0; 162 | padding-left: 0; 163 | } 164 | } 165 | 166 | /** 167 | * Wrapper 168 | */ 169 | .wrapper { 170 | max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); 171 | max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); 172 | margin-right: auto; 173 | margin-left: auto; 174 | padding-right: $spacing-unit; 175 | padding-left: $spacing-unit; 176 | @extend %clearfix; 177 | 178 | @include media-query($on-laptop) { 179 | max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); 180 | max-width: calc(#{$content-width} - (#{$spacing-unit})); 181 | padding-right: $spacing-unit / 2; 182 | padding-left: $spacing-unit / 2; 183 | } 184 | } 185 | 186 | 187 | 188 | /** 189 | * Clearfix 190 | */ 191 | %clearfix { 192 | 193 | &:after { 194 | content: ""; 195 | display: table; 196 | clear: both; 197 | } 198 | } 199 | 200 | 201 | 202 | /** 203 | * Icons 204 | */ 205 | .icon { 206 | 207 | > svg { 208 | display: inline-block; 209 | width: 16px; 210 | height: 16px; 211 | vertical-align: middle; 212 | 213 | path { 214 | fill: $grey-color; 215 | } 216 | } 217 | } 218 | 219 | 220 | @media screen and (max-width: $layout-large-screen) { 221 | 222 | h1 { 223 | font-size: 36px; 224 | line-height: 48px; 225 | 226 | } 227 | h2 { 228 | clear: left; 229 | font-size: 28px; 230 | font-weight: 400; 231 | line-height: 32px; 232 | margin: 24px 0 16px; 233 | } 234 | h3 { 235 | font-size: 24px; 236 | line-height: 32px; 237 | font-weight: 400; 238 | margin: 16px 0; 239 | } 240 | h4 { 241 | font-size: 18px; 242 | line-height: 24px; 243 | margin: 12px 0; 244 | font-weight: 500; 245 | } 246 | h5, h6 { 247 | font-size: 16px; 248 | line-height: 24px; 249 | margin: 8px 0; 250 | } 251 | } 252 | -------------------------------------------------------------------------------- /_sass/_config.scss: -------------------------------------------------------------------------------- 1 | // Colors 2 | $color-primary-dark: #436176; 3 | $color-primary: #708EA5; 4 | $color-primary-contrast: white; 5 | 6 | $color-accent: #ffc65b; 7 | $color-accent-contrast: #003633; 8 | 9 | $tac-grey: #e0e0e0; 10 | $tac-code-background: #f7f7f7; 11 | 12 | // Dimensions 13 | $side-nav-width: 240px; 14 | $layout-large-screen: 840px; 15 | -------------------------------------------------------------------------------- /_sass/_layout.scss: -------------------------------------------------------------------------------- 1 | .site-header { 2 | min-height: 74px; 3 | } 4 | .tac-site-title { 5 | text-decoration: none; 6 | color: white; 7 | } 8 | .tac-site-title img { 9 | height: 36px; 10 | margin-right: 12px; 11 | padding-left: 12px; 12 | } 13 | .tac-header { 14 | padding-top: 0px; 15 | background-color: $color-primary-dark !important; 16 | } 17 | .header-content { 18 | display: flex; 19 | } 20 | .header-content .mdl-textfield { 21 | align-self: center; 22 | } 23 | .header-content .mdl-textfield .mdl-button { 24 | bottom: inherit; /*Override MDL default*/ 25 | } 26 | .tac-logo-row { 27 | background-color: $color-primary-dark; 28 | height: 72px; 29 | } 30 | .tac-title { 31 | display: inline-block; 32 | font-weight: 300; 33 | vertical-align: middle; 34 | } 35 | .tac-layout { 36 | min-height: 100%; 37 | height: auto; 38 | } 39 | .tac-search { 40 | margin-left: auto; 41 | } 42 | .docs-content-wrapper { 43 | width: 100%; 44 | } 45 | .docs-content-grid { 46 | padding-left: 8px; /*Align with the menu above*/ 47 | } 48 | 49 | /* Selectable elements */ 50 | .docs-content-grid, .mdl-textfield { 51 | -webkit-touch-callout: text; 52 | -webkit-user-select: text; 53 | -khtml-user-select: text; 54 | -moz-user-select: text; 55 | -ms-user-select: text; 56 | user-select: text; 57 | } 58 | 59 | .side-nav { 60 | position: absolute; 61 | top: 0; 62 | left: 0; 63 | display: inline-block; 64 | background: #fff; 65 | height: 100%; 66 | width: $side-nav-width; 67 | box-sizing: border-box; 68 | padding: 24px 0; 69 | z-index: 1; 70 | } 71 | .scrollable-header-row { 72 | overflow-x: auto; 73 | overflow-y: hidden; 74 | background-color: $color-primary; 75 | } 76 | 77 | .tac-tab-navigation .mdl-navigation__link { 78 | font-weight: 700; 79 | font-size: 14px; 80 | box-sizing: border-box; 81 | text-transform: uppercase; 82 | display: inline-block; 83 | height: 100%; 84 | position: relative; 85 | overflow: hidden; 86 | font-weight: 500; 87 | background-color: transparent !important; 88 | border-bottom: 4px solid transparent; 89 | } 90 | .tac-navigation .mdl-navigation__link.tac-site-nav-category { 91 | padding-left: 12px; 92 | font-weight: 600; 93 | } 94 | .tac-tab-navigation .mdl-navigation__link:hover { 95 | border-bottom: 4px solid $color-accent; 96 | } 97 | 98 | // Ripples 99 | .tac-tab-navigation .mdl-navigation__link .mdl-ripple { 100 | background-color: white; 101 | } 102 | .tac-navigation .mdl-navigation__link { 103 | overflow: hidden; 104 | position: relative; 105 | } 106 | .tac-navigation .mdl-navigation__link:hover { 107 | text-decoration: none; 108 | } 109 | .tac-tab-navigation .mdl-navigation__link--current { 110 | border-bottom: 4px solid $color-accent; 111 | } 112 | .tac-navigation .mdl-navigation__link--current { 113 | font-weight: 800; 114 | color: $color-primary !important; 115 | background-color: $tac-grey; 116 | } 117 | .tac-navigation { 118 | flex-direction: column; 119 | align-items: stretch; 120 | padding-top: 16px; 121 | 122 | & .mdl-navigation__link { 123 | display: block; 124 | flex-shrink: 0; 125 | padding: 8px; 126 | padding-left: 24px; 127 | margin: 0; 128 | color: grey; 129 | 130 | &:hover { 131 | background-color: $tac-grey; 132 | } 133 | } 134 | } 135 | 136 | .tac-header .mdl-layout__drawer-button { 137 | display: none; 138 | } 139 | 140 | /* Orders for the title header */ 141 | .header-content .mdl-textfield { 142 | order: 3; 143 | } 144 | 145 | .header-content .mdl-layout-spacer { 146 | order: 2; 147 | } 148 | 149 | .header-content .tac-site-title { 150 | order: 1; 151 | } 152 | 153 | 154 | 155 | 156 | /* TOC */ 157 | #markdown-toc { 158 | list-style-type: none; 159 | border-left: solid 3px $color-primary; 160 | padding-left: 20px; 161 | line-height: 28px; 162 | margin-left: 0px; 163 | } 164 | 165 | #markdown-toc a { 166 | text-decoration: none; 167 | font-weight: 400; 168 | font-size: 16px; 169 | color: $color-primary-dark; 170 | } 171 | 172 | /* TABLES */ 173 | td { 174 | padding: 2px; 175 | } 176 | 177 | 178 | // Remove tabs and move to a drawer navigation on smaller screens 179 | @media screen and (max-width: $layout-large-screen) { 180 | .tac-header .mdl-layout__drawer-button { 181 | display: block; 182 | } 183 | .header-content { 184 | padding-left: 48px; 185 | } 186 | 187 | .tac-navigation .mdl-navigation__link { 188 | padding-left: 12px; 189 | font-weight: inherit; 190 | } 191 | 192 | .tac-navigation .mdl-navigation__link.tac-site-nav-category { 193 | padding-left: 8px; 194 | font-weight: 800; 195 | } 196 | 197 | .tac-navigation .mdl-navigation__link.tac-site-nav-category2 { 198 | padding-left: 12px; 199 | font-weight: 500; 200 | } 201 | 202 | .tac-site-title img { 203 | padding-left: 0px; 204 | width: 24px; 205 | height: auto; 206 | } 207 | 208 | .tac-logo-row{ 209 | height: 48px; 210 | } 211 | 212 | .tac-navigation .mdl-navigation__link--current { 213 | color: $color-accent; 214 | background-color: transparent !important; 215 | } 216 | .tac_navigation { 217 | display: none; 218 | } 219 | .tac-title { 220 | font-size: 12px 221 | } 222 | /* Remove title when search textfield is focused */ 223 | .header-content .mdl-textfield.is-focused ~ .tac-site-title { 224 | display: none; 225 | } 226 | 227 | } 228 | 229 | .tac-site-footer { 230 | z-index: 5; 231 | margin: 0px; 232 | position: relative; 233 | border-top: 1px solid #f0f0f0; 234 | color: #999; 235 | padding-top: 12px; 236 | font-size: 12px; 237 | background-color: transparent; 238 | } 239 | -------------------------------------------------------------------------------- /_sass/_mdl.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * material-design-lite - Material Design Components in CSS, JS and HTML 3 | * @version v1.0.1 4 | * @license Apache-2.0 5 | * @copyright 2015 Google, Inc. 6 | * @link https://github.com/google/material-design-lite 7 | */ 8 | /* Using Material Design Lite v1.0.1 */ 9 | @charset "UTF-8";html{color:rgba(0,0,0,.87)}::-moz-selection{background:$color-accent;text-shadow:none}::selection{background:$color-accent;text-shadow:none}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}audio,canvas,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.browsehappy{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}@media print{*,*:before,*:after{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}a,.mdl-accordion,.mdl-button,.mdl-card,.mdl-checkbox,.mdl-dropdown-menu,.mdl-icon-toggle,.mdl-item,.mdl-radio,.mdl-slider,.mdl-switch,.mdl-tabs__tab{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:rgba(255,255,255,0)}html{width:100%;height:100%;-ms-touch-action:manipulation;touch-action:manipulation}body{width:100%;min-height:100%}main{display:block}*[hidden]{display:none!important}html,body{font-family:"Helvetica","Arial",sans-serif;font-size:14px;font-weight:400;line-height:20px}h1,h2,h3,h4,h5,h6,p{padding:0}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;line-height:1.35;letter-spacing:-.02em;opacity:.54;font-size:.6em}h1{font-size:56px;line-height:1.35;letter-spacing:-.02em;margin:24px 0}h1,h2{font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400}h2{font-size:45px;line-height:48px}h2,h3{margin:24px 0}h3{font-size:34px;line-height:40px}h3,h4{font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400}h4{font-size:24px;line-height:32px;-moz-osx-font-smoothing:grayscale;margin:24px 0 16px}h5{font-size:20px;font-weight:500;line-height:1;letter-spacing:.02em}h5,h6{font-family:"Roboto","Helvetica","Arial",sans-serif;margin:24px 0 16px}h6{font-size:16px;letter-spacing:.04em}h6,p{font-weight:400;line-height:24px}p{font-size:14px;letter-spacing:0;margin:0 0 16px}a{color:$color-accent ;font-weight:500}blockquote{font-family:"Roboto","Helvetica","Arial",sans-serif;position:relative;font-size:24px;font-weight:300;font-style:italic;line-height:1.35;letter-spacing:.08em}blockquote:before{position:absolute;left:-.5em;content:'“'}blockquote:after{content:'”';margin-left:-.05em}mark{background-color:#f4ff81}dt{font-weight:700}address{font-size:12px;line-height:1;font-style:normal}address,ul,ol{font-weight:400;letter-spacing:0}ul,ol{font-size:14px;line-height:24px}.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:112px;font-weight:300;line-height:1;letter-spacing:-.04em}.mdl-typography--display-4-color-contrast{opacity:.54}.mdl-typography--display-3,.mdl-typography--display-3-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:56px;font-weight:400;line-height:1.35;letter-spacing:-.02em}.mdl-typography--display-3-color-contrast{opacity:.54}.mdl-typography--display-2,.mdl-typography--display-2-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:45px;font-weight:400;line-height:48px}.mdl-typography--display-2-color-contrast{opacity:.54}.mdl-typography--display-1,.mdl-typography--display-1-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:34px;font-weight:400;line-height:40px}.mdl-typography--display-1-color-contrast{opacity:.54}.mdl-typography--headline,.mdl-typography--headline-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:24px;font-weight:400;line-height:32px;-moz-osx-font-smoothing:grayscale}.mdl-typography--headline-color-contrast{opacity:.87}.mdl-typography--title,.mdl-typography--title-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:20px;font-weight:500;line-height:1;letter-spacing:.02em}.mdl-typography--title-color-contrast{opacity:.87}.mdl-typography--subhead,.mdl-typography--subhead-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:16px;font-weight:400;line-height:24px;letter-spacing:.04em}.mdl-typography--subhead-color-contrast{opacity:.87}.mdl-typography--body-2,.mdl-typography--body-2-color-contrast{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0}.mdl-typography--body-2-color-contrast{opacity:.87}.mdl-typography--body-1,.mdl-typography--body-1-color-contrast{font-size:14px;font-weight:400;line-height:24px;letter-spacing:0}.mdl-typography--body-1-color-contrast{opacity:.87}.mdl-typography--body-2-force-preferred-font,.mdl-typography--body-2-force-preferred-font-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0}.mdl-typography--body-2-force-preferred-font-color-contrast{opacity:.87}.mdl-typography--body-1-force-preferred-font,.mdl-typography--body-1-force-preferred-font-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:14px;font-weight:400;line-height:24px;letter-spacing:0}.mdl-typography--body-1-force-preferred-font-color-contrast{opacity:.87}.mdl-typography--caption,.mdl-typography--caption-force-preferred-font{font-size:12px;font-weight:400;line-height:1;letter-spacing:0}.mdl-typography--caption-force-preferred-font{font-family:"Roboto","Helvetica","Arial",sans-serif}.mdl-typography--caption-color-contrast,.mdl-typography--caption-force-preferred-font-color-contrast{font-size:12px;font-weight:400;line-height:1;letter-spacing:0;opacity:.54}.mdl-typography--caption-force-preferred-font-color-contrast,.mdl-typography--menu{font-family:"Roboto","Helvetica","Arial",sans-serif}.mdl-typography--menu{font-size:14px;font-weight:500;line-height:1;letter-spacing:0}.mdl-typography--menu-color-contrast{opacity:.87}.mdl-typography--menu-color-contrast,.mdl-typography--button,.mdl-typography--button-color-contrast{font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:14px;font-weight:500;line-height:1;letter-spacing:0}.mdl-typography--button,.mdl-typography--button-color-contrast{text-transform:uppercase}.mdl-typography--button-color-contrast{opacity:.87}.mdl-typography--text-left{text-align:left}.mdl-typography--text-right{text-align:right}.mdl-typography--text-center{text-align:center}.mdl-typography--text-justify{text-align:justify}.mdl-typography--text-nowrap{white-space:nowrap}.mdl-typography--text-lowercase{text-transform:lowercase}.mdl-typography--text-uppercase{text-transform:uppercase}.mdl-typography--text-capitalize{text-transform:capitalize}.mdl-typography--font-thin{font-weight:200!important}.mdl-typography--font-light{font-weight:300!important}.mdl-typography--font-regular{font-weight:400!important}.mdl-typography--font-medium{font-weight:500!important}.mdl-typography--font-bold{font-weight:700!important}.mdl-typography--font-black{font-weight:900!important}.mdl-color-text--red{color:#f44336 !important}.mdl-color--red{background-color:#f44336 !important}.mdl-color-text--red-50{color:#ffebee !important}.mdl-color--red-50{background-color:#ffebee !important}.mdl-color-text--red-100{color:#ffcdd2 !important}.mdl-color--red-100{background-color:#ffcdd2 !important}.mdl-color-text--red-200{color:#ef9a9a !important}.mdl-color--red-200{background-color:#ef9a9a !important}.mdl-color-text--red-300{color:#e57373 !important}.mdl-color--red-300{background-color:#e57373 !important}.mdl-color-text--red-400{color:#ef5350 !important}.mdl-color--red-400{background-color:#ef5350 !important}.mdl-color-text--red-500{color:#f44336 !important}.mdl-color--red-500{background-color:#f44336 !important}.mdl-color-text--red-600{color:#e53935 !important}.mdl-color--red-600{background-color:#e53935 !important}.mdl-color-text--red-700{color:#d32f2f !important}.mdl-color--red-700{background-color:#d32f2f !important}.mdl-color-text--red-800{color:#c62828 !important}.mdl-color--red-800{background-color:#c62828 !important}.mdl-color-text--red-900{color:#b71c1c !important}.mdl-color--red-900{background-color:#b71c1c !important}.mdl-color-text--red-A100{color:#ff8a80 !important}.mdl-color--red-A100{background-color:#ff8a80 !important}.mdl-color-text--red-A200{color:#ff5252 !important}.mdl-color--red-A200{background-color:#ff5252 !important}.mdl-color-text--red-A400{color:#ff1744 !important}.mdl-color--red-A400{background-color:#ff1744 !important}.mdl-color-text--red-A700{color:#d50000 !important}.mdl-color--red-A700{background-color:#d50000 !important}.mdl-color-text--pink{color:#e91e63 !important}.mdl-color--pink{background-color:#e91e63 !important}.mdl-color-text--pink-50{color:#fce4ec !important}.mdl-color--pink-50{background-color:#fce4ec !important}.mdl-color-text--pink-100{color:#f8bbd0 !important}.mdl-color--pink-100{background-color:#f8bbd0 !important}.mdl-color-text--pink-200{color:#f48fb1 !important}.mdl-color--pink-200{background-color:#f48fb1 !important}.mdl-color-text--pink-300{color:#f06292 !important}.mdl-color--pink-300{background-color:#f06292 !important}.mdl-color-text--pink-400{color:#ec407a !important}.mdl-color--pink-400{background-color:#ec407a !important}.mdl-color-text--pink-500{color:#e91e63 !important}.mdl-color--pink-500{background-color:#e91e63 !important}.mdl-color-text--pink-600{color:#d81b60 !important}.mdl-color--pink-600{background-color:#d81b60 !important}.mdl-color-text--pink-700{color:#c2185b !important}.mdl-color--pink-700{background-color:#c2185b !important}.mdl-color-text--pink-800{color:#ad1457 !important}.mdl-color--pink-800{background-color:#ad1457 !important}.mdl-color-text--pink-900{color:#880e4f !important}.mdl-color--pink-900{background-color:#880e4f !important}.mdl-color-text--pink-A100{color:#ff80ab !important}.mdl-color--pink-A100{background-color:#ff80ab !important}.mdl-color-text--pink-A200{color:#ff4081 !important}.mdl-color--pink-A200{background-color:#ff4081 !important}.mdl-color-text--pink-A400{color:#f50057 !important}.mdl-color--pink-A400{background-color:#f50057 !important}.mdl-color-text--pink-A700{color:#c51162 !important}.mdl-color--pink-A700{background-color:#c51162 !important}.mdl-color-text--purple{color:#9c27b0 !important}.mdl-color--purple{background-color:#9c27b0 !important}.mdl-color-text--purple-50{color:#f3e5f5 !important}.mdl-color--purple-50{background-color:#f3e5f5 !important}.mdl-color-text--purple-100{color:#e1bee7 !important}.mdl-color--purple-100{background-color:#e1bee7 !important}.mdl-color-text--purple-200{color:#ce93d8 !important}.mdl-color--purple-200{background-color:#ce93d8 !important}.mdl-color-text--purple-300{color:#ba68c8 !important}.mdl-color--purple-300{background-color:#ba68c8 !important}.mdl-color-text--purple-400{color:#ab47bc !important}.mdl-color--purple-400{background-color:#ab47bc !important}.mdl-color-text--purple-500{color:#9c27b0 !important}.mdl-color--purple-500{background-color:#9c27b0 !important}.mdl-color-text--purple-600{color:#8e24aa !important}.mdl-color--purple-600{background-color:#8e24aa !important}.mdl-color-text--purple-700{color:#7b1fa2 !important}.mdl-color--purple-700{background-color:#7b1fa2 !important}.mdl-color-text--purple-800{color:#6a1b9a !important}.mdl-color--purple-800{background-color:#6a1b9a !important}.mdl-color-text--purple-900{color:#4a148c !important}.mdl-color--purple-900{background-color:#4a148c !important}.mdl-color-text--purple-A100{color:#ea80fc !important}.mdl-color--purple-A100{background-color:#ea80fc !important}.mdl-color-text--purple-A200{color:#e040fb !important}.mdl-color--purple-A200{background-color:#e040fb !important}.mdl-color-text--purple-A400{color:#d500f9 !important}.mdl-color--purple-A400{background-color:#d500f9 !important}.mdl-color-text--purple-A700{color:#a0f !important}.mdl-color--purple-A700{background-color:#a0f !important}.mdl-color-text--deep-purple{color:#673ab7 !important}.mdl-color--deep-purple{background-color:#673ab7 !important}.mdl-color-text--deep-purple-50{color:#ede7f6 !important}.mdl-color--deep-purple-50{background-color:#ede7f6 !important}.mdl-color-text--deep-purple-100{color:#d1c4e9 !important}.mdl-color--deep-purple-100{background-color:#d1c4e9 !important}.mdl-color-text--deep-purple-200{color:#b39ddb !important}.mdl-color--deep-purple-200{background-color:#b39ddb !important}.mdl-color-text--deep-purple-300{color:#9575cd !important}.mdl-color--deep-purple-300{background-color:#9575cd !important}.mdl-color-text--deep-purple-400{color:#7e57c2 !important}.mdl-color--deep-purple-400{background-color:#7e57c2 !important}.mdl-color-text--deep-purple-500{color:#673ab7 !important}.mdl-color--deep-purple-500{background-color:#673ab7 !important}.mdl-color-text--deep-purple-600{color:#5e35b1 !important}.mdl-color--deep-purple-600{background-color:#5e35b1 !important}.mdl-color-text--deep-purple-700{color:#512da8 !important}.mdl-color--deep-purple-700{background-color:#512da8 !important}.mdl-color-text--deep-purple-800{color:#4527a0 !important}.mdl-color--deep-purple-800{background-color:#4527a0 !important}.mdl-color-text--deep-purple-900{color:#311b92 !important}.mdl-color--deep-purple-900{background-color:#311b92 !important}.mdl-color-text--deep-purple-A100{color:#b388ff !important}.mdl-color--deep-purple-A100{background-color:#b388ff !important}.mdl-color-text--deep-purple-A200{color:#7c4dff !important}.mdl-color--deep-purple-A200{background-color:#7c4dff !important}.mdl-color-text--deep-purple-A400{color:#651fff !important}.mdl-color--deep-purple-A400{background-color:#651fff !important}.mdl-color-text--deep-purple-A700{color:#6200ea !important}.mdl-color--deep-purple-A700{background-color:#6200ea !important}.mdl-color-text--indigo{color:#3f51b5 !important}.mdl-color--indigo{background-color:#3f51b5 !important}.mdl-color-text--indigo-50{color:#e8eaf6 !important}.mdl-color--indigo-50{background-color:#e8eaf6 !important}.mdl-color-text--indigo-100{color:#c5cae9 !important}.mdl-color--indigo-100{background-color:#c5cae9 !important}.mdl-color-text--indigo-200{color:#9fa8da !important}.mdl-color--indigo-200{background-color:#9fa8da !important}.mdl-color-text--indigo-300{color:#7986cb !important}.mdl-color--indigo-300{background-color:#7986cb !important}.mdl-color-text--indigo-400{color:#5c6bc0 !important}.mdl-color--indigo-400{background-color:#5c6bc0 !important}.mdl-color-text--indigo-500{color:#3f51b5 !important}.mdl-color--indigo-500{background-color:#3f51b5 !important}.mdl-color-text--indigo-600{color:#3949ab !important}.mdl-color--indigo-600{background-color:#3949ab !important}.mdl-color-text--indigo-700{color:#303f9f !important}.mdl-color--indigo-700{background-color:#303f9f !important}.mdl-color-text--indigo-800{color:#283593 !important}.mdl-color--indigo-800{background-color:#283593 !important}.mdl-color-text--indigo-900{color:#1a237e !important}.mdl-color--indigo-900{background-color:#1a237e !important}.mdl-color-text--indigo-A100{color:#8c9eff !important}.mdl-color--indigo-A100{background-color:#8c9eff !important}.mdl-color-text--indigo-A200{color:#536dfe !important}.mdl-color--indigo-A200{background-color:#536dfe !important}.mdl-color-text--indigo-A400{color:#3d5afe !important}.mdl-color--indigo-A400{background-color:#3d5afe !important}.mdl-color-text--indigo-A700{color:#304ffe !important}.mdl-color--indigo-A700{background-color:#304ffe !important}.mdl-color-text--blue{color:#2196f3 !important}.mdl-color--blue{background-color:#2196f3 !important}.mdl-color-text--blue-50{color:#e3f2fd !important}.mdl-color--blue-50{background-color:#e3f2fd !important}.mdl-color-text--blue-100{color:#bbdefb !important}.mdl-color--blue-100{background-color:#bbdefb !important}.mdl-color-text--blue-200{color:#90caf9 !important}.mdl-color--blue-200{background-color:#90caf9 !important}.mdl-color-text--blue-300{color:#64b5f6 !important}.mdl-color--blue-300{background-color:#64b5f6 !important}.mdl-color-text--blue-400{color:#42a5f5 !important}.mdl-color--blue-400{background-color:#42a5f5 !important}.mdl-color-text--blue-500{color:#2196f3 !important}.mdl-color--blue-500{background-color:#2196f3 !important}.mdl-color-text--blue-600{color:#1e88e5 !important}.mdl-color--blue-600{background-color:#1e88e5 !important}.mdl-color-text--blue-700{color:#1976d2 !important}.mdl-color--blue-700{background-color:#1976d2 !important}.mdl-color-text--blue-800{color:#1565c0 !important}.mdl-color--blue-800{background-color:#1565c0 !important}.mdl-color-text--blue-900{color:#0d47a1 !important}.mdl-color--blue-900{background-color:#0d47a1 !important}.mdl-color-text--blue-A100{color:#82b1ff !important}.mdl-color--blue-A100{background-color:#82b1ff !important}.mdl-color-text--blue-A200{color:#448aff !important}.mdl-color--blue-A200{background-color:#448aff !important}.mdl-color-text--blue-A400{color:#2979ff !important}.mdl-color--blue-A400{background-color:#2979ff !important}.mdl-color-text--blue-A700{color:#2962ff !important}.mdl-color--blue-A700{background-color:#2962ff !important}.mdl-color-text--light-blue{color:#03a9f4 !important}.mdl-color--light-blue{background-color:#03a9f4 !important}.mdl-color-text--light-blue-50{color:#e1f5fe !important}.mdl-color--light-blue-50{background-color:#e1f5fe !important}.mdl-color-text--light-blue-100{color:#b3e5fc !important}.mdl-color--light-blue-100{background-color:#b3e5fc !important}.mdl-color-text--light-blue-200{color:#81d4fa !important}.mdl-color--light-blue-200{background-color:#81d4fa !important}.mdl-color-text--light-blue-300{color:#4fc3f7 !important}.mdl-color--light-blue-300{background-color:#4fc3f7 !important}.mdl-color-text--light-blue-400{color:#29b6f6 !important}.mdl-color--light-blue-400{background-color:#29b6f6 !important}.mdl-color-text--light-blue-500{color:#03a9f4 !important}.mdl-color--light-blue-500{background-color:#03a9f4 !important}.mdl-color-text--light-blue-600{color:#039be5 !important}.mdl-color--light-blue-600{background-color:#039be5 !important}.mdl-color-text--light-blue-700{color:#0288d1 !important}.mdl-color--light-blue-700{background-color:#0288d1 !important}.mdl-color-text--light-blue-800{color:#0277bd !important}.mdl-color--light-blue-800{background-color:#0277bd !important}.mdl-color-text--light-blue-900{color:#01579b !important}.mdl-color--light-blue-900{background-color:#01579b !important}.mdl-color-text--light-blue-A100{color:#80d8ff !important}.mdl-color--light-blue-A100{background-color:#80d8ff !important}.mdl-color-text--light-blue-A200{color:#40c4ff !important}.mdl-color--light-blue-A200{background-color:#40c4ff !important}.mdl-color-text--light-blue-A400{color:#00b0ff !important}.mdl-color--light-blue-A400{background-color:#00b0ff !important}.mdl-color-text--light-blue-A700{color:#0091ea !important}.mdl-color--light-blue-A700{background-color:#0091ea !important}.mdl-color-text--cyan{color:#00bcd4 !important}.mdl-color--cyan{background-color:#00bcd4 !important}.mdl-color-text--cyan-50{color:#e0f7fa !important}.mdl-color--cyan-50{background-color:#e0f7fa !important}.mdl-color-text--cyan-100{color:#b2ebf2 !important}.mdl-color--cyan-100{background-color:#b2ebf2 !important}.mdl-color-text--cyan-200{color:#80deea !important}.mdl-color--cyan-200{background-color:#80deea !important}.mdl-color-text--cyan-300{color:#4dd0e1 !important}.mdl-color--cyan-300{background-color:#4dd0e1 !important}.mdl-color-text--cyan-400{color:#26c6da !important}.mdl-color--cyan-400{background-color:#26c6da !important}.mdl-color-text--cyan-500{color:#00bcd4 !important}.mdl-color--cyan-500{background-color:#00bcd4 !important}.mdl-color-text--cyan-600{color:#00acc1 !important}.mdl-color--cyan-600{background-color:#00acc1 !important}.mdl-color-text--cyan-700{color:#0097a7 !important}.mdl-color--cyan-700{background-color:#0097a7 !important}.mdl-color-text--cyan-800{color:#00838f !important}.mdl-color--cyan-800{background-color:#00838f !important}.mdl-color-text--cyan-900{color:#006064 !important}.mdl-color--cyan-900{background-color:#006064 !important}.mdl-color-text--cyan-A100{color:#84ffff !important}.mdl-color--cyan-A100{background-color:#84ffff !important}.mdl-color-text--cyan-A200{color:#18ffff !important}.mdl-color--cyan-A200{background-color:#18ffff !important}.mdl-color-text--cyan-A400{color:#00e5ff !important}.mdl-color--cyan-A400{background-color:#00e5ff !important}.mdl-color-text--cyan-A700{color:#00b8d4 !important}.mdl-color--cyan-A700{background-color:#00b8d4 !important}.mdl-color-text--teal{color:#009688 !important}.mdl-color--teal{background-color:#009688 !important}.mdl-color-text--teal-50{color:#e0f2f1 !important}.mdl-color--teal-50{background-color:#e0f2f1 !important}.mdl-color-text--teal-100{color:#b2dfdb !important}.mdl-color--teal-100{background-color:#b2dfdb !important}.mdl-color-text--teal-200{color:#80cbc4 !important}.mdl-color--teal-200{background-color:#80cbc4 !important}.mdl-color-text--teal-300{color:#4db6ac !important}.mdl-color--teal-300{background-color:#4db6ac !important}.mdl-color-text--teal-400{color:#26a69a !important}.mdl-color--teal-400{background-color:#26a69a !important}.mdl-color-text--teal-500{color:#009688 !important}.mdl-color--teal-500{background-color:#009688 !important}.mdl-color-text--teal-600{color:#00897b !important}.mdl-color--teal-600{background-color:#00897b !important}.mdl-color-text--teal-700{color:#00796b !important}.mdl-color--teal-700{background-color:#00796b !important}.mdl-color-text--teal-800{color:#00695c !important}.mdl-color--teal-800{background-color:#00695c !important}.mdl-color-text--teal-900{color:#004d40 !important}.mdl-color--teal-900{background-color:#004d40 !important}.mdl-color-text--teal-A100{color:#a7ffeb !important}.mdl-color--teal-A100{background-color:#a7ffeb !important}.mdl-color-text--teal-A200{color:#64ffda !important}.mdl-color--teal-A200{background-color:#64ffda !important}.mdl-color-text--teal-A400{color:#1de9b6 !important}.mdl-color--teal-A400{background-color:#1de9b6 !important}.mdl-color-text--teal-A700{color:#00bfa5 !important}.mdl-color--teal-A700{background-color:#00bfa5 !important}.mdl-color-text--green{color:#4caf50 !important}.mdl-color--green{background-color:#4caf50 !important}.mdl-color-text--green-50{color:#e8f5e9 !important}.mdl-color--green-50{background-color:#e8f5e9 !important}.mdl-color-text--green-100{color:#c8e6c9 !important}.mdl-color--green-100{background-color:#c8e6c9 !important}.mdl-color-text--green-200{color:#a5d6a7 !important}.mdl-color--green-200{background-color:#a5d6a7 !important}.mdl-color-text--green-300{color:#81c784 !important}.mdl-color--green-300{background-color:#81c784 !important}.mdl-color-text--green-400{color:#66bb6a !important}.mdl-color--green-400{background-color:#66bb6a !important}.mdl-color-text--green-500{color:#4caf50 !important}.mdl-color--green-500{background-color:#4caf50 !important}.mdl-color-text--green-600{color:#43a047 !important}.mdl-color--green-600{background-color:#43a047 !important}.mdl-color-text--green-700{color:#388e3c !important}.mdl-color--green-700{background-color:#388e3c !important}.mdl-color-text--green-800{color:#2e7d32 !important}.mdl-color--green-800{background-color:#2e7d32 !important}.mdl-color-text--green-900{color:#1b5e20 !important}.mdl-color--green-900{background-color:#1b5e20 !important}.mdl-color-text--green-A100{color:#b9f6ca !important}.mdl-color--green-A100{background-color:#b9f6ca !important}.mdl-color-text--green-A200{color:#69f0ae !important}.mdl-color--green-A200{background-color:#69f0ae !important}.mdl-color-text--green-A400{color:#00e676 !important}.mdl-color--green-A400{background-color:#00e676 !important}.mdl-color-text--green-A700{color:#00c853 !important}.mdl-color--green-A700{background-color:#00c853 !important}.mdl-color-text--light-green{color:#8bc34a !important}.mdl-color--light-green{background-color:#8bc34a !important}.mdl-color-text--light-green-50{color:#f1f8e9 !important}.mdl-color--light-green-50{background-color:#f1f8e9 !important}.mdl-color-text--light-green-100{color:#dcedc8 !important}.mdl-color--light-green-100{background-color:#dcedc8 !important}.mdl-color-text--light-green-200{color:#c5e1a5 !important}.mdl-color--light-green-200{background-color:#c5e1a5 !important}.mdl-color-text--light-green-300{color:#aed581 !important}.mdl-color--light-green-300{background-color:#aed581 !important}.mdl-color-text--light-green-400{color:#9ccc65 !important}.mdl-color--light-green-400{background-color:#9ccc65 !important}.mdl-color-text--light-green-500{color:#8bc34a !important}.mdl-color--light-green-500{background-color:#8bc34a !important}.mdl-color-text--light-green-600{color:#7cb342 !important}.mdl-color--light-green-600{background-color:#7cb342 !important}.mdl-color-text--light-green-700{color:#689f38 !important}.mdl-color--light-green-700{background-color:#689f38 !important}.mdl-color-text--light-green-800{color:#558b2f !important}.mdl-color--light-green-800{background-color:#558b2f !important}.mdl-color-text--light-green-900{color:#33691e !important}.mdl-color--light-green-900{background-color:#33691e !important}.mdl-color-text--light-green-A100{color:#ccff90 !important}.mdl-color--light-green-A100{background-color:#ccff90 !important}.mdl-color-text--light-green-A200{color:#b2ff59 !important}.mdl-color--light-green-A200{background-color:#b2ff59 !important}.mdl-color-text--light-green-A400{color:#76ff03 !important}.mdl-color--light-green-A400{background-color:#76ff03 !important}.mdl-color-text--light-green-A700{color:#64dd17 !important}.mdl-color--light-green-A700{background-color:#64dd17 !important}.mdl-color-text--lime{color:#cddc39 !important}.mdl-color--lime{background-color:#cddc39 !important}.mdl-color-text--lime-50{color:#f9fbe7 !important}.mdl-color--lime-50{background-color:#f9fbe7 !important}.mdl-color-text--lime-100{color:#f0f4c3 !important}.mdl-color--lime-100{background-color:#f0f4c3 !important}.mdl-color-text--lime-200{color:#e6ee9c !important}.mdl-color--lime-200{background-color:#e6ee9c !important}.mdl-color-text--lime-300{color:#dce775 !important}.mdl-color--lime-300{background-color:#dce775 !important}.mdl-color-text--lime-400{color:#d4e157 !important}.mdl-color--lime-400{background-color:#d4e157 !important}.mdl-color-text--lime-500{color:#cddc39 !important}.mdl-color--lime-500{background-color:#cddc39 !important}.mdl-color-text--lime-600{color:#c0ca33 !important}.mdl-color--lime-600{background-color:#c0ca33 !important}.mdl-color-text--lime-700{color:#afb42b !important}.mdl-color--lime-700{background-color:#afb42b !important}.mdl-color-text--lime-800{color:#9e9d24 !important}.mdl-color--lime-800{background-color:#9e9d24 !important}.mdl-color-text--lime-900{color:#827717 !important}.mdl-color--lime-900{background-color:#827717 !important}.mdl-color-text--lime-A100{color:#f4ff81 !important}.mdl-color--lime-A100{background-color:#f4ff81 !important}.mdl-color-text--lime-A200{color:#eeff41 !important}.mdl-color--lime-A200{background-color:#eeff41 !important}.mdl-color-text--lime-A400{color:#c6ff00 !important}.mdl-color--lime-A400{background-color:#c6ff00 !important}.mdl-color-text--lime-A700{color:#aeea00 !important}.mdl-color--lime-A700{background-color:#aeea00 !important}.mdl-color-text--yellow{color:#ffeb3b !important}.mdl-color--yellow{background-color:#ffeb3b !important}.mdl-color-text--yellow-50{color:#fffde7 !important}.mdl-color--yellow-50{background-color:#fffde7 !important}.mdl-color-text--yellow-100{color:#fff9c4 !important}.mdl-color--yellow-100{background-color:#fff9c4 !important}.mdl-color-text--yellow-200{color:#fff59d !important}.mdl-color--yellow-200{background-color:#fff59d !important}.mdl-color-text--yellow-300{color:#fff176 !important}.mdl-color--yellow-300{background-color:#fff176 !important}.mdl-color-text--yellow-400{color:#ffee58 !important}.mdl-color--yellow-400{background-color:#ffee58 !important}.mdl-color-text--yellow-500{color:#ffeb3b !important}.mdl-color--yellow-500{background-color:#ffeb3b !important}.mdl-color-text--yellow-600{color:#fdd835 !important}.mdl-color--yellow-600{background-color:#fdd835 !important}.mdl-color-text--yellow-700{color:#fbc02d !important}.mdl-color--yellow-700{background-color:#fbc02d !important}.mdl-color-text--yellow-800{color:#f9a825 !important}.mdl-color--yellow-800{background-color:#f9a825 !important}.mdl-color-text--yellow-900{color:#f57f17 !important}.mdl-color--yellow-900{background-color:#f57f17 !important}.mdl-color-text--yellow-A100{color:#ffff8d !important}.mdl-color--yellow-A100{background-color:#ffff8d !important}.mdl-color-text--yellow-A200{color:#ff0 !important}.mdl-color--yellow-A200{background-color:#ff0 !important}.mdl-color-text--yellow-A400{color:#ffea00 !important}.mdl-color--yellow-A400{background-color:#ffea00 !important}.mdl-color-text--yellow-A700{color:#ffd600 !important}.mdl-color--yellow-A700{background-color:#ffd600 !important}.mdl-color-text--amber{color:#ffc107 !important}.mdl-color--amber{background-color:#ffc107 !important}.mdl-color-text--amber-50{color:#fff8e1 !important}.mdl-color--amber-50{background-color:#fff8e1 !important}.mdl-color-text--amber-100{color:#ffecb3 !important}.mdl-color--amber-100{background-color:#ffecb3 !important}.mdl-color-text--amber-200{color:#ffe082 !important}.mdl-color--amber-200{background-color:#ffe082 !important}.mdl-color-text--amber-300{color:#ffd54f !important}.mdl-color--amber-300{background-color:#ffd54f !important}.mdl-color-text--amber-400{color:#ffca28 !important}.mdl-color--amber-400{background-color:#ffca28 !important}.mdl-color-text--amber-500{color:#ffc107 !important}.mdl-color--amber-500{background-color:#ffc107 !important}.mdl-color-text--amber-600{color:#ffb300 !important}.mdl-color--amber-600{background-color:#ffb300 !important}.mdl-color-text--amber-700{color:#ffa000 !important}.mdl-color--amber-700{background-color:#ffa000 !important}.mdl-color-text--amber-800{color:#ff8f00 !important}.mdl-color--amber-800{background-color:#ff8f00 !important}.mdl-color-text--amber-900{color:#ff6f00 !important}.mdl-color--amber-900{background-color:#ff6f00 !important}.mdl-color-text--amber-A100{color:#ffe57f !important}.mdl-color--amber-A100{background-color:#ffe57f !important}.mdl-color-text--amber-A200{color:#ffd740 !important}.mdl-color--amber-A200{background-color:#ffd740 !important}.mdl-color-text--amber-A400{color:#ffc400 !important}.mdl-color--amber-A400{background-color:#ffc400 !important}.mdl-color-text--amber-A700{color:#ffab00 !important}.mdl-color--amber-A700{background-color:#ffab00 !important}.mdl-color-text--orange{color:#ff9800 !important}.mdl-color--orange{background-color:#ff9800 !important}.mdl-color-text--orange-50{color:#fff3e0 !important}.mdl-color--orange-50{background-color:#fff3e0 !important}.mdl-color-text--orange-100{color:#ffe0b2 !important}.mdl-color--orange-100{background-color:#ffe0b2 !important}.mdl-color-text--orange-200{color:#ffcc80 !important}.mdl-color--orange-200{background-color:#ffcc80 !important}.mdl-color-text--orange-300{color:#ffb74d !important}.mdl-color--orange-300{background-color:#ffb74d !important}.mdl-color-text--orange-400{color:#ffa726 !important}.mdl-color--orange-400{background-color:#ffa726 !important}.mdl-color-text--orange-500{color:#ff9800 !important}.mdl-color--orange-500{background-color:#ff9800 !important}.mdl-color-text--orange-600{color:#fb8c00 !important}.mdl-color--orange-600{background-color:#fb8c00 !important}.mdl-color-text--orange-700{color:#f57c00 !important}.mdl-color--orange-700{background-color:#f57c00 !important}.mdl-color-text--orange-800{color:#ef6c00 !important}.mdl-color--orange-800{background-color:#ef6c00 !important}.mdl-color-text--orange-900{color:#e65100 !important}.mdl-color--orange-900{background-color:#e65100 !important}.mdl-color-text--orange-A100{color:#ffd180 !important}.mdl-color--orange-A100{background-color:#ffd180 !important}.mdl-color-text--orange-A200{color:#ffab40 !important}.mdl-color--orange-A200{background-color:#ffab40 !important}.mdl-color-text--orange-A400{color:#ff9100 !important}.mdl-color--orange-A400{background-color:#ff9100 !important}.mdl-color-text--orange-A700{color:#ff6d00 !important}.mdl-color--orange-A700{background-color:#ff6d00 !important}.mdl-color-text--deep-orange{color:#ff5722 !important}.mdl-color--deep-orange{background-color:#ff5722 !important}.mdl-color-text--deep-orange-50{color:#fbe9e7 !important}.mdl-color--deep-orange-50{background-color:#fbe9e7 !important}.mdl-color-text--deep-orange-100{color:#ffccbc !important}.mdl-color--deep-orange-100{background-color:#ffccbc !important}.mdl-color-text--deep-orange-200{color:#ffab91 !important}.mdl-color--deep-orange-200{background-color:#ffab91 !important}.mdl-color-text--deep-orange-300{color:#ff8a65 !important}.mdl-color--deep-orange-300{background-color:#ff8a65 !important}.mdl-color-text--deep-orange-400{color:#ff7043 !important}.mdl-color--deep-orange-400{background-color:#ff7043 !important}.mdl-color-text--deep-orange-500{color:#ff5722 !important}.mdl-color--deep-orange-500{background-color:#ff5722 !important}.mdl-color-text--deep-orange-600{color:#f4511e !important}.mdl-color--deep-orange-600{background-color:#f4511e !important}.mdl-color-text--deep-orange-700{color:#e64a19 !important}.mdl-color--deep-orange-700{background-color:#e64a19 !important}.mdl-color-text--deep-orange-800{color:#d84315 !important}.mdl-color--deep-orange-800{background-color:#d84315 !important}.mdl-color-text--deep-orange-900{color:#bf360c !important}.mdl-color--deep-orange-900{background-color:#bf360c !important}.mdl-color-text--deep-orange-A100{color:#ff9e80 !important}.mdl-color--deep-orange-A100{background-color:#ff9e80 !important}.mdl-color-text--deep-orange-A200{color:#ff6e40 !important}.mdl-color--deep-orange-A200{background-color:#ff6e40 !important}.mdl-color-text--deep-orange-A400{color:#ff3d00 !important}.mdl-color--deep-orange-A400{background-color:#ff3d00 !important}.mdl-color-text--deep-orange-A700{color:#dd2c00 !important}.mdl-color--deep-orange-A700{background-color:#dd2c00 !important}.mdl-color-text--brown{color:#795548 !important}.mdl-color--brown{background-color:#795548 !important}.mdl-color-text--brown-50{color:#efebe9 !important}.mdl-color--brown-50{background-color:#efebe9 !important}.mdl-color-text--brown-100{color:#d7ccc8 !important}.mdl-color--brown-100{background-color:#d7ccc8 !important}.mdl-color-text--brown-200{color:#bcaaa4 !important}.mdl-color--brown-200{background-color:#bcaaa4 !important}.mdl-color-text--brown-300{color:#a1887f !important}.mdl-color--brown-300{background-color:#a1887f !important}.mdl-color-text--brown-400{color:#8d6e63 !important}.mdl-color--brown-400{background-color:#8d6e63 !important}.mdl-color-text--brown-500{color:#795548 !important}.mdl-color--brown-500{background-color:#795548 !important}.mdl-color-text--brown-600{color:#6d4c41 !important}.mdl-color--brown-600{background-color:#6d4c41 !important}.mdl-color-text--brown-700{color:#5d4037 !important}.mdl-color--brown-700{background-color:#5d4037 !important}.mdl-color-text--brown-800{color:#4e342e !important}.mdl-color--brown-800{background-color:#4e342e !important}.mdl-color-text--brown-900{color:#3e2723 !important}.mdl-color--brown-900{background-color:#3e2723 !important}.mdl-color-text--grey{color:#9e9e9e !important}.mdl-color--grey{background-color:#9e9e9e !important}.mdl-color-text--grey-50{color:#fafafa !important}.mdl-color--grey-50{background-color:#fafafa !important}.mdl-color-text--grey-100{color:#f5f5f5 !important}.mdl-color--grey-100{background-color:#f5f5f5 !important}.mdl-color-text--grey-200{color:#eee !important}.mdl-color--grey-200{background-color:#eee !important}.mdl-color-text--grey-300{color:#e0e0e0 !important}.mdl-color--grey-300{background-color:#e0e0e0 !important}.mdl-color-text--grey-400{color:#bdbdbd !important}.mdl-color--grey-400{background-color:#bdbdbd !important}.mdl-color-text--grey-500{color:#9e9e9e !important}.mdl-color--grey-500{background-color:#9e9e9e !important}.mdl-color-text--grey-600{color:#757575 !important}.mdl-color--grey-600{background-color:#757575 !important}.mdl-color-text--grey-700{color:#616161 !important}.mdl-color--grey-700{background-color:#616161 !important}.mdl-color-text--grey-800{color:#424242 !important}.mdl-color--grey-800{background-color:#424242 !important}.mdl-color-text--grey-900{color:#212121 !important}.mdl-color--grey-900{background-color:#212121 !important}.mdl-color-text--blue-grey{color:#607d8b !important}.mdl-color--blue-grey{background-color:#607d8b !important}.mdl-color-text--blue-grey-50{color:#eceff1 !important}.mdl-color--blue-grey-50{background-color:#eceff1 !important}.mdl-color-text--blue-grey-100{color:#cfd8dc !important}.mdl-color--blue-grey-100{background-color:#cfd8dc !important}.mdl-color-text--blue-grey-200{color:#b0bec5 !important}.mdl-color--blue-grey-200{background-color:#b0bec5 !important}.mdl-color-text--blue-grey-300{color:#90a4ae !important}.mdl-color--blue-grey-300{background-color:#90a4ae !important}.mdl-color-text--blue-grey-400{color:#78909c !important}.mdl-color--blue-grey-400{background-color:#78909c !important}.mdl-color-text--blue-grey-500{color:#607d8b !important}.mdl-color--blue-grey-500{background-color:#607d8b !important}.mdl-color-text--blue-grey-600{color:#546e7a !important}.mdl-color--blue-grey-600{background-color:#546e7a !important}.mdl-color-text--blue-grey-700{color:#455a64 !important}.mdl-color--blue-grey-700{background-color:#455a64 !important}.mdl-color-text--blue-grey-800{color:#37474f !important}.mdl-color--blue-grey-800{background-color:#37474f !important}.mdl-color-text--blue-grey-900{color:#263238 !important}.mdl-color--blue-grey-900{background-color:#263238 !important}.mdl-color--black{background-color:#000 !important}.mdl-color-text--black{color:#000 !important}.mdl-color--white{background-color:#fff !important}.mdl-color-text--white{color:#fff !important}.mdl-color--primary{background-color:$color-primary !important}.mdl-color--primary-contrast{background-color:$color-primary-contrast !important}.mdl-color--primary-dark{background-color:$color-primary-dark !important}.mdl-color--accent{background-color:$color-accent !important}.mdl-color--accent-contrast{background-color:$color-accent-contrast !important}.mdl-color-text--primary{color:$color-primary !important}.mdl-color-text--primary-contrast{color:$color-primary-contrast !important}.mdl-color-text--primary-dark{color:$color-primary-dark !important}.mdl-color-text--accent{color:$color-accent !important}.mdl-color-text--accent-contrast{color:$color-accent-contrast !important}.mdl-ripple{background:#000;border-radius:50%;height:50px;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:50px;overflow:hidden}.mdl-ripple.is-animating{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1);transition:transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1)}.mdl-ripple.is-visible{opacity:.3}.mdl-animation--default,.mdl-animation--fast-out-slow-in{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-animation--linear-out-slow-in{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.mdl-animation--fast-out-linear-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.mdl-badge{position:relative;white-space:nowrap;margin-right:24px}.mdl-badge:not([data-badge]){margin-right:auto}.mdl-badge[data-badge]:after{content:attr(data-badge);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;top:-11px;right:-24px;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:600;font-size:12px;width:22px;height:22px;border-radius:50%;background:$color-accent ;color:#fff}.mdl-button .mdl-badge[data-badge]:after{top:-10px;right:-5px}.mdl-badge.mdl-badge--no-background[data-badge]:after{color:$color-accent ;background:rgba(255,255,255,.2);box-shadow:0 0 1px gray}.mdl-button{background:0 0;border:none;border-radius:2px;color:#000;display:block;position:relative;height:36px;min-width:64px;padding:0 8px;display:inline-block;font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:0;overflow:hidden;will-change:box-shadow,transform;-webkit-transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);outline:none;cursor:pointer;text-decoration:none;text-align:center;line-height:36px;vertical-align:middle}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:rgba(158,158,158,.2)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0,.12)}.mdl-button:active{background-color:rgba(158,158,158,.4)}.mdl-button.mdl-button--colored{color:$color-primary }.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0,.12)}input.mdl-button[type="submit"]{-webkit-appearance:none}.mdl-button--raised{background:rgba(158,158,158,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--raised.mdl-button--colored{background:$color-primary ;color:$color-primary-contrast }.mdl-button--raised.mdl-button--colored:hover{background-color:$color-primary }.mdl-button--raised.mdl-button--colored:active{background-color:$color-primary }.mdl-button--raised.mdl-button--colored:focus:not(:active){background-color:$color-primary }.mdl-button--raised.mdl-button--colored .mdl-ripple{background:$color-primary-contrast }.mdl-button--fab{border-radius:50%;font-size:24px;height:56px;margin:auto;min-width:56px;width:56px;padding:0;overflow:hidden;background:rgba(158,158,158,.2);box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);position:relative;line-height:normal}.mdl-button--fab .material-icons{position:absolute;top:50%;left:50%;-webkit-transform:translate(-12px,-12px);-ms-transform:translate(-12px,-12px);transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--fab.mdl-button--colored{background:$color-accent ;color:$color-accent-contrast }.mdl-button--fab.mdl-button--colored:hover{background-color:$color-accent }.mdl-button--fab.mdl-button--colored:focus:not(:active){background-color:$color-accent }.mdl-button--fab.mdl-button--colored:active{background-color:$color-accent }.mdl-button--fab.mdl-button--colored .mdl-ripple{background:$color-accent-contrast }.mdl-button--icon{border-radius:50%;font-size:24px;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;padding:0;overflow:hidden;color:inherit;line-height:normal}.mdl-button--icon .material-icons{position:absolute;top:50%;left:50%;-webkit-transform:translate(-12px,-12px);-ms-transform:translate(-12px,-12px);transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon .material-icons{top:0;left:0}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button__ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:$color-primary }.mdl-button--primary.mdl-button--primary .mdl-ripple{background:$color-primary-contrast }.mdl-button--primary.mdl-button--primary.mdl-button--raised,.mdl-button--primary.mdl-button--primary.mdl-button--fab{color:$color-primary-contrast ;background-color:$color-primary }.mdl-button--accent.mdl-button--accent{color:$color-accent }.mdl-button--accent.mdl-button--accent .mdl-ripple{background:$color-accent-contrast }.mdl-button--accent.mdl-button--accent.mdl-button--raised,.mdl-button--accent.mdl-button--accent.mdl-button--fab{color:$color-accent-contrast ;background-color:$color-accent }.mdl-button[disabled][disabled]{color:rgba(0,0,0,.26);cursor:auto;background-color:transparent}.mdl-button--fab[disabled][disabled],.mdl-button--raised[disabled][disabled],.mdl-button--colored[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:#fff;border-radius:2px;box-sizing:border-box}.mdl-card__media{background-color:$color-accent ;background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll;box-sizing:border-box}.mdl-card__title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#000;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;line-height:normal;padding:16px;-webkit-perspective-origin:165px 56px;perspective-origin:165px 56px;-webkit-transform-origin:165px 56px;-ms-transform-origin:165px 56px;transform-origin:165px 56px;box-sizing:border-box}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__title-text{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;color:inherit;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;-webkit-transform-origin:149px 48px;-ms-transform-origin:149px 48px;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:grey;margin:0}.mdl-card__supporting-text{color:rgba(0,0,0,.54);font-size:13px;line-height:18px;overflow:hidden;padding:16px;width:90%}.mdl-card__actions{font-size:16px;line-height:normal;width:100%;background-color:transparent;padding:8px;box-sizing:border-box}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,.1)}.mdl-card--expand{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px}.mdl-checkbox{position:relative;z-index:1;vertical-align:middle;display:inline-block;box-sizing:border-box;width:100%;height:24px;margin:0;padding:0}.mdl-checkbox.is-upgraded{padding-left:24px}.mdl-checkbox__input{line-height:24px}.mdl-checkbox.is-upgraded .mdl-checkbox__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-checkbox__box-outline{position:absolute;top:3px;left:0;display:inline-block;box-sizing:border-box;width:16px;height:16px;margin:0;cursor:pointer;overflow:hidden;border:2px solid rgba(0,0,0,.54);border-radius:2px;z-index:2}.mdl-checkbox.is-checked .mdl-checkbox__box-outline{border:2px solid $color-primary }.mdl-checkbox.is-disabled .mdl-checkbox__box-outline{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__focus-helper{position:absolute;top:3px;left:0;display:inline-block;box-sizing:border-box;width:16px;height:16px;border-radius:50%;background-color:transparent}.mdl-checkbox.is-focused .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-checkbox.is-focused.is-checked .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba($color-primary,.26);background-color:rgba($color-primary,.26)}.mdl-checkbox__tick-outline{position:absolute;top:0;left:0;height:100%;width:100%;-webkit-mask:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==");mask:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==");background:0 0;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background;transition-property:background}.mdl-checkbox.is-checked .mdl-checkbox__tick-outline{background:$color-primary url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K")}.mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline{background:rgba(0,0,0,.26)url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K")}.mdl-checkbox__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0}.mdl-checkbox.is-disabled .mdl-checkbox__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__ripple-container{position:absolute;z-index:2;top:-6px;left:-10px;box-sizing:border-box;width:36px;height:36px;border-radius:50%;cursor:pointer;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-checkbox__ripple-container .mdl-ripple{background:$color-primary }.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container{cursor:auto}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple{background:0 0}.mdl-data-table{position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff}.mdl-data-table thead{padding-bottom:3px}.mdl-data-table thead .mdl-data-table__select{margin-top:0}.mdl-data-table tbody tr{position:relative;height:48px;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background-color;transition-property:background-color}.mdl-data-table tbody tr.is-selected{background-color:#e0e0e0}.mdl-data-table tbody tr:hover{background-color:#eee}.mdl-data-table td{text-align:right}.mdl-data-table th{padding:0 18px 0 18px;text-align:right}.mdl-data-table td:first-of-type,.mdl-data-table th:first-of-type{padding-left:24px}.mdl-data-table td:last-of-type,.mdl-data-table th:last-of-type{padding-right:24px}.mdl-data-table td{position:relative;vertical-align:top;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding:12px 18px 0;box-sizing:border-box}.mdl-data-table td .mdl-data-table__select{vertical-align:top;position:absolute;left:24px}.mdl-data-table th{position:relative;vertical-align:bottom;text-overflow:ellipsis;font-weight:700;line-height:24px;letter-spacing:0;height:48px;font-size:12px;color:rgba(0,0,0,.54);padding-bottom:8px;box-sizing:border-box}.mdl-data-table th .mdl-data-table__select{position:relative}.mdl-data-table__select{width:16px}.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric{text-align:left}.mdl-mega-footer{padding:16px 40px;color:#9e9e9e;background-color:#424242}.mdl-mega-footer--top-section:after,.mdl-mega-footer--middle-section:after,.mdl-mega-footer--bottom-section:after,.mdl-mega-footer__top-section:after,.mdl-mega-footer__middle-section:after,.mdl-mega-footer__bottom-section:after{content:'';display:block;clear:both}.mdl-mega-footer--left-section,.mdl-mega-footer__left-section,.mdl-mega-footer--right-section,.mdl-mega-footer__right-section{margin-bottom:16px}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:block;margin-bottom:16px;color:inherit;text-decoration:none}@media screen and (min-width:760px){.mdl-mega-footer--left-section,.mdl-mega-footer__left-section{float:left}.mdl-mega-footer--right-section,.mdl-mega-footer__right-section{float:right}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:inline-block;margin-left:16px;line-height:36px;vertical-align:middle}}.mdl-mega-footer--social-btn,.mdl-mega-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{display:block;position:relative}@media screen and (min-width:760px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{width:33%}.mdl-mega-footer--drop-down-section:nth-child(1),.mdl-mega-footer--drop-down-section:nth-child(2),.mdl-mega-footer__drop-down-section:nth-child(1),.mdl-mega-footer__drop-down-section:nth-child(2){float:left}.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(3){float:right}.mdl-mega-footer--drop-down-section:nth-child(3):after,.mdl-mega-footer__drop-down-section:nth-child(3):after{clear:right}.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section:nth-child(4){clear:right;float:right}.mdl-mega-footer--middle-section:after,.mdl-mega-footer__middle-section:after{content:'';display:block;clear:both}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:0}}@media screen and (min-width:1024px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section,.mdl-mega-footer__drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(4){width:24%;float:left}}.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{position:absolute;width:100%;height:55.8px;padding:32px;margin:-16px 0 0;cursor:pointer;z-index:1;opacity:0}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CE'}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:none}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CF'}.mdl-mega-footer--heading,.mdl-mega-footer__heading{position:relative;width:100%;padding-right:39.8px;margin-bottom:16px;box-sizing:border-box;font-size:14px;line-height:23.8px;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:#e0e0e0}.mdl-mega-footer--heading:after,.mdl-mega-footer__heading:after{content:'';position:absolute;top:0;right:0;display:block;width:23.8px;height:23.8px;background-size:cover}.mdl-mega-footer--link-list,.mdl-mega-footer__link-list{list-style:none;padding:0;margin:0 0 32px}.mdl-mega-footer--link-list:after,.mdl-mega-footer__link-list:after{clear:both;display:block;content:''}.mdl-mega-footer--link-list li,.mdl-mega-footer__link-list li{font-size:14px;font-weight:400;letter-spacing:0;line-height:20px}.mdl-mega-footer--link-list a,.mdl-mega-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}@media screen and (min-width:760px){.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{display:none}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{background-image:none}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:block}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{content:''}}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:16px;margin-bottom:16px}.mdl-logo{margin-bottom:16px;color:#fff}.mdl-mega-footer--bottom-section .mdl-mega-footer--link-list li,.mdl-mega-footer__bottom-section .mdl-mega-footer__link-list li{float:left;margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-logo{float:left;margin-bottom:0;margin-right:16px}}.mdl-mini-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:32px 16px;color:#9e9e9e;background-color:#424242}.mdl-mini-footer:after{content:'';display:block}.mdl-mini-footer .mdl-logo{line-height:36px}.mdl-mini-footer--link-list,.mdl-mini-footer__link-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;list-style:none;margin:0;padding:0}.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{line-height:36px}}.mdl-mini-footer--link-list a,.mdl-mini-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mini-footer--left-section,.mdl-mini-footer__left-section{display:inline-block;-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.mdl-mini-footer--right-section,.mdl-mini-footer__right-section{display:inline-block;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.mdl-mini-footer--social-btn,.mdl-mini-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-icon-toggle{position:relative;z-index:1;vertical-align:middle;display:inline-block;height:32px;margin:0;padding:0}.mdl-icon-toggle__input{line-height:32px}.mdl-icon-toggle.is-upgraded .mdl-icon-toggle__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-icon-toggle__label{display:inline-block;position:relative;cursor:pointer;height:32px;width:32px;min-width:32px;color:#616161;border-radius:50%;padding:0;margin-left:0;margin-right:0;text-align:center;background-color:transparent;will-change:background-color;-webkit-transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1)}.mdl-icon-toggle__label.material-icons{line-height:32px;font-size:24px}.mdl-icon-toggle.is-checked .mdl-icon-toggle__label{color:$color-primary }.mdl-icon-toggle.is-disabled .mdl-icon-toggle__label{color:rgba(0,0,0,.26);cursor:auto;-webkit-transition:none;transition:none}.mdl-icon-toggle.is-focused .mdl-icon-toggle__label{background-color:rgba(0,0,0,.12)}.mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label{background-color:rgba($color-primary,.26)}.mdl-icon-toggle__ripple-container{position:absolute;z-index:2;top:-2px;left:-2px;box-sizing:border-box;width:36px;height:36px;border-radius:50%;cursor:pointer;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-icon-toggle__ripple-container .mdl-ripple{background:#616161}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container{cursor:auto}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container .mdl-ripple{background:0 0}.mdl-menu__container{display:block;margin:0;padding:0;border:none;position:absolute;overflow:visible;height:0;width:0;z-index:-1}.mdl-menu__container.is-visible{z-index:999}.mdl-menu__outline{display:block;background:#fff;margin:0;padding:0;border:none;border-radius:2px;position:absolute;top:0;left:0;overflow:hidden;opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);will-change:transform;-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);z-index:-1}.mdl-menu__container.is-visible .mdl-menu__outline{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);z-index:999}.mdl-menu__outline.mdl-menu--bottom-right{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.mdl-menu__outline.mdl-menu--top-left{-webkit-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.mdl-menu__outline.mdl-menu--top-right{-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.mdl-menu{position:absolute;list-style:none;top:0;left:0;height:auto;width:auto;min-width:124px;padding:8px 0;margin:0;opacity:0;clip:rect(0 0 0 0);z-index:-1}.mdl-menu__container.is-visible .mdl-menu{opacity:1;z-index:999}.mdl-menu.is-animating{-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1)}.mdl-menu.mdl-menu--bottom-right{left:auto;right:0}.mdl-menu.mdl-menu--top-left{top:auto;bottom:0}.mdl-menu.mdl-menu--top-right{top:auto;left:auto;bottom:0;right:0}.mdl-menu.mdl-menu--unaligned{top:auto;left:auto}.mdl-menu__item{display:block;border:none;color:rgba(0,0,0,.87);background-color:transparent;text-align:left;margin:0;padding:0 16px;outline-color:#bdbdbd;position:relative;overflow:hidden;font-size:14px;font-weight:400;letter-spacing:0;text-decoration:none;cursor:pointer;height:48px;line-height:48px;white-space:nowrap;opacity:0;-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdl-menu__container.is-visible .mdl-menu__item{opacity:1}.mdl-menu__item::-moz-focus-inner{border:0}.mdl-menu__item[disabled]{color:#bdbdbd;background-color:transparent;cursor:auto}.mdl-menu__item[disabled]:hover{background-color:transparent}.mdl-menu__item[disabled]:focus{background-color:transparent}.mdl-menu__item[disabled] .mdl-ripple{background:0 0}.mdl-menu__item:hover{background-color:#eee}.mdl-menu__item:focus{outline:none;background-color:#eee}.mdl-menu__item:active{background-color:#e0e0e0}.mdl-menu__item--ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-progress{display:block;position:relative;height:4px;width:500px}.mdl-progress>.bar{display:block;position:absolute;top:0;bottom:0;width:0%;-webkit-transition:width .2s cubic-bezier(.4,0,.2,1);transition:width .2s cubic-bezier(.4,0,.2,1)}.mdl-progress>.progressbar{background-color:$color-primary ;z-index:1;left:0}.mdl-progress>.bufferbar{background-image:-webkit-linear-gradient(left,rgba($color-primary-contrast,.7),rgba($color-primary-contrast,.7)),-webkit-linear-gradient(left,$color-primary ,$color-primary );background-image:linear-gradient(to right,rgba($color-primary-contrast,.7),rgba($color-primary-contrast,.7)),linear-gradient(to right,$color-primary ,$color-primary );z-index:0;left:0}.mdl-progress>.auxbar{right:0}@supports (-webkit-appearance:none){.mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba($color-primary-contrast,.7),rgba($color-primary-contrast,.7)),-webkit-linear-gradient(left,$color-primary ,$color-primary );background-image:linear-gradient(to right,rgba($color-primary-contrast,.7),rgba($color-primary-contrast,.7)),linear-gradient(to right,$color-primary ,$color-primary );-webkit-mask:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=");mask:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=")}}.mdl-progress:not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba($color-primary-contrast,.9),rgba($color-primary-contrast,.9)),-webkit-linear-gradient(left,$color-primary ,$color-primary );background-image:linear-gradient(to right,rgba($color-primary-contrast,.9),rgba($color-primary-contrast,.9)),linear-gradient(to right,$color-primary ,$color-primary )}.mdl-progress.mdl-progress__indeterminate>.bar1{-webkit-animation-name:indeterminate1;animation-name:indeterminate1}.mdl-progress.mdl-progress__indeterminate>.bar1,.mdl-progress.mdl-progress__indeterminate>.bar3{background-color:$color-primary ;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar3{background-image:none;-webkit-animation-name:indeterminate2;animation-name:indeterminate2}@-webkit-keyframes indeterminate1{0%{left:0%;width:0%}50%{left:25%;width:75%}75%{left:100%;width:0%}}@keyframes indeterminate1{0%{left:0%;width:0%}50%{left:25%;width:75%}75%{left:100%;width:0%}}@-webkit-keyframes indeterminate2{0%,50%{left:0%;width:0%}75%{left:0%;width:25%}100%{left:100%;width:0%}}@keyframes indeterminate2{0%,50%{left:0%;width:0%}75%{left:0%;width:25%}100%{left:100%;width:0%}}.mdl-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;box-sizing:border-box}.mdl-navigation__link{color:#424242;text-decoration:none;font-weight:500;font-size:13px;margin:0}.mdl-layout{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;overflow-x:hidden;position:relative;-webkit-overflow-scrolling:touch}.mdl-layout.is-small-screen .mdl-layout--large-screen-only{display:none}.mdl-layout:not(.is-small-screen) .mdl-layout--small-screen-only{display:none}.mdl-layout__container{position:absolute;width:100%;height:100%}.mdl-layout-title{display:block;position:relative;font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:20px;line-height:1;letter-spacing:.02em;font-weight:400;box-sizing:border-box}.mdl-layout-spacer{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-layout__drawer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:240px;height:100%;max-height:100%;position:absolute;top:0;left:0;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);box-sizing:border-box;border-right:1px solid #e0e0e0;background:#fafafa;-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;will-change:transform;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;color:#424242;overflow:visible;overflow-y:auto;z-index:5}.mdl-layout__drawer.is-visible{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout__drawer>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__drawer>.mdl-layout-title{line-height:64px;padding-left:40px}@media screen and (max-width:1024px){.mdl-layout__drawer>.mdl-layout-title{line-height:56px;padding-left:16px}}.mdl-layout__drawer .mdl-navigation{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;padding-top:16px}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{display:block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:16px 40px;margin:0;color:#757575}@media screen and (max-width:1024px){.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{padding:16px}}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover{background-color:#e0e0e0}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current{background-color:#000;color:$color-primary }@media screen and (min-width:1025px){.mdl-layout--fixed-drawer>.mdl-layout__drawer{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.mdl-layout__drawer-button{display:block;position:absolute;height:48px;width:48px;border:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden;text-align:center;cursor:pointer;font-size:26px;line-height:50px;font-family:Helvetica,Arial,sans-serif;margin:10px 12px;top:0;left:0;color:$color-primary-contrast ;z-index:4}.mdl-layout__header .mdl-layout__drawer-button{position:absolute;color:$color-primary-contrast ;background-color:inherit}@media screen and (max-width:1024px){.mdl-layout__header .mdl-layout__drawer-button{margin:4px}}@media screen and (max-width:1024px){.mdl-layout__drawer-button{margin:4px;color:rgba(0,0,0,.5)}}@media screen and (min-width:1025px){.mdl-layout--fixed-drawer>.mdl-layout__drawer-button{display:none}}.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;margin:0;padding:0;border:none;min-height:64px;max-height:1000px;z-index:3;background-color:$color-primary ;color:$color-primary-contrast ;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:max-height,box-shadow;transition-property:max-height,box-shadow}@media screen and (max-width:1024px){.mdl-layout__header{min-height:56px}}.mdl-layout--fixed-drawer:not(.is-small-screen)>.mdl-layout__header{margin-left:240px;width:calc(100% - 240px)}.mdl-layout__header>.mdl-layout-icon{position:absolute;left:40px;top:16px;height:32px;width:32px;overflow:hidden;z-index:3;display:block}@media screen and (max-width:1024px){.mdl-layout__header>.mdl-layout-icon{left:16px;top:12px}}.mdl-layout.has-drawer .mdl-layout__header>.mdl-layout-icon{display:none}.mdl-layout__header.is-compact{max-height:64px}@media screen and (max-width:1024px){.mdl-layout__header.is-compact{max-height:56px}}.mdl-layout__header.is-compact.has-tabs{height:112px}@media screen and (max-width:1024px){.mdl-layout__header.is-compact.has-tabs{min-height:104px}}@media screen and (max-width:1024px){.mdl-layout__header{display:none}.mdl-layout--fixed-header>.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}.mdl-layout__header--transparent.mdl-layout__header--transparent{background-color:transparent;box-shadow:none}.mdl-layout__header--seamed,.mdl-layout__header--scroll{box-shadow:none}.mdl-layout__header--waterfall{box-shadow:none;overflow:hidden}.mdl-layout__header--waterfall.is-casting-shadow{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-layout__header-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:64px;margin:0;padding:0 40px 0 0px}@media screen and (max-width:1024px){.mdl-layout__header-row{height:56px;padding:0 16px 0 72px}}.mdl-layout__header-row>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__header--scroll .mdl-layout__header-row{width:100%}.mdl-layout__header-row .mdl-navigation{margin:0;padding:0;height:64px;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media screen and (max-width:1024px){.mdl-layout__header-row .mdl-navigation{height:56px}}.mdl-layout__header-row .mdl-navigation__link{display:block;color:$color-primary-contrast ;line-height:64px;padding:0 24px}@media screen and (max-width:1024px){.mdl-layout__header-row .mdl-navigation__link{line-height:56px;padding:0 16px}}.mdl-layout__obfuscator{background-color:transparent;position:absolute;top:0;left:0;height:100%;width:100%;z-index:4;visibility:hidden;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout__drawer.is-visible~.mdl-layout__obfuscator{background-color:rgba(0,0,0,.5);visibility:visible}.mdl-layout__content{-ms-flex:0 1 auto;display:inline-block;overflow-y:auto;overflow-x:hidden;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;z-index:1;-webkit-overflow-scrolling:touch}.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:240px}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow:visible}@media screen and (max-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:0}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow-y:auto;overflow-x:hidden}}.mdl-layout__tab-bar{height:96px;margin:0;width:calc(100% - 112px);padding:0 0 0 56px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:$color-primary ;overflow-y:hidden;overflow-x:scroll}.mdl-layout__tab-bar::-webkit-scrollbar{display:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar{width:calc(100% - 60px);padding:0 0 0 60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar{padding:0;overflow:hidden;width:100%}.mdl-layout__tab-bar-container{position:relative;height:48px;width:100%;border:none;margin:0;z-index:2;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.mdl-layout__container>.mdl-layout__tab-bar-container{position:absolute;top:0;left:0}.mdl-layout__tab-bar-button{display:inline-block;position:absolute;top:0;height:48px;width:56px;z-index:4;text-align:center;background-color:$color-primary ;color:transparent;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar-button{display:none;width:60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar-button{display:none}.mdl-layout__tab-bar-button .material-icons{line-height:48px}.mdl-layout__tab-bar-button.is-active{color:$color-primary-contrast }.mdl-layout__tab-bar-left-button{left:0}.mdl-layout__tab-bar-right-button{right:0}.mdl-layout__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-decoration:none;height:48px;line-height:48px;text-align:center;font-weight:500;font-size:14px;text-transform:uppercase;color:rgba($color-primary-contrast,.6);overflow:hidden}@media screen and (max-width:1024px){.mdl-layout__tab{padding:0 12px}}.mdl-layout--fixed-tabs .mdl-layout__tab{float:none;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0}.mdl-layout.is-upgraded .mdl-layout__tab.is-active{color:$color-primary-contrast }.mdl-layout.is-upgraded .mdl-layout__tab.is-active::after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:$color-accent ;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1).01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1).01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-layout__tab .mdl-layout__tab-ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-layout__tab .mdl-layout__tab-ripple-container .mdl-ripple{background-color:$color-primary-contrast }.mdl-layout__tab-panel{display:block}.mdl-layout.is-upgraded .mdl-layout__tab-panel{display:none}.mdl-layout.is-upgraded .mdl-layout__tab-panel.is-active{display:block}.mdl-radio{position:relative;font-size:16px;line-height:24px;display:inline-block;box-sizing:border-box;margin:0;padding-left:0}.mdl-radio.is-upgraded{padding-left:24px}.mdl-radio__button{line-height:24px}.mdl-radio.is-upgraded .mdl-radio__button{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-radio__outer-circle{position:absolute;top:2px;left:0;display:inline-block;box-sizing:border-box;width:16px;height:16px;margin:0;cursor:pointer;border:2px solid rgba(0,0,0,.54);border-radius:50%;z-index:2}.mdl-radio.is-checked .mdl-radio__outer-circle{border:2px solid $color-primary }.mdl-radio.is-disabled .mdl-radio__outer-circle{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-radio__inner-circle{position:absolute;z-index:1;margin:0;top:6px;left:4px;box-sizing:border-box;width:8px;height:8px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0);border-radius:50%;background:$color-primary }.mdl-radio.is-checked .mdl-radio__inner-circle{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}.mdl-radio.is-disabled .mdl-radio__inner-circle{background:rgba(0,0,0,.26);cursor:auto}.mdl-radio.is-focused .mdl-radio__inner-circle{box-shadow:0 0 0 10px rgba(0,0,0,.1)}.mdl-radio__label{cursor:pointer}.mdl-radio.is-disabled .mdl-radio__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-radio__ripple-container{position:absolute;z-index:2;top:-9px;left:-13px;box-sizing:border-box;width:42px;height:42px;border-radius:50%;cursor:pointer;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-radio__ripple-container .mdl-ripple{background:$color-primary }.mdl-radio.is-disabled .mdl-radio__ripple-container{cursor:auto}.mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple{background:0 0}_:-ms-input-placeholder,:root .mdl-slider.mdl-slider.is-upgraded{-ms-appearance:none;height:32px;margin:0}.mdl-slider{width:calc(100% - 40px);margin:0 20px}.mdl-slider.is-upgraded{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:2px;background:0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0;padding:0;color:$color-primary ;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;z-index:1}.mdl-slider.is-upgraded::-moz-focus-outer{border:0}.mdl-slider.is-upgraded::-ms-tooltip{display:none}.mdl-slider.is-upgraded::-webkit-slider-runnable-track{background:0 0}.mdl-slider.is-upgraded::-moz-range-track{background:0 0;border:none}.mdl-slider.is-upgraded::-ms-track{background:0 0;color:transparent;height:2px;width:100%;border:none}.mdl-slider.is-upgraded::-ms-fill-lower{padding:0;background:linear-gradient(to right,transparent,transparent 16px,$color-primary 16px,$color-primary 0)}.mdl-slider.is-upgraded::-ms-fill-upper{padding:0;background:linear-gradient(to left,transparent,transparent 16px,rgba(0,0,0,.26)16px,rgba(0,0,0,.26)0)}.mdl-slider.is-upgraded::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:$color-primary ;border:none;-webkit-transition:-webkit-transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1);transition:transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded::-moz-range-thumb{-moz-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background-image:none;background:$color-primary ;border:none}.mdl-slider.is-upgraded:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba($color-primary,.26)}.mdl-slider.is-upgraded:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba($color-primary,.26)}.mdl-slider.is-upgraded:active::-webkit-slider-thumb{background-image:none;background:$color-primary ;-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded:active::-moz-range-thumb{background-image:none;background:$color-primary ;transform:scale(1.5)}.mdl-slider.is-upgraded::-ms-thumb{width:32px;height:32px;border:none;border-radius:50%;background:$color-primary ;-ms-transform:scale(.375);transform:scale(.375);transition:transform .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,$color-primary 0%,$color-primary 37.5%,rgba($color-primary,.26)37.5%,rgba($color-primary,.26)100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded:active::-ms-thumb{background:$color-primary ;-ms-transform:scale(.5625);transform:scale(.5625)}.mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:active::-webkit-slider-thumb{border:1.6px solid rgba(0,0,0,.26);-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value:active~.mdl-slider__background-flex>.mdl-slider__background-upper{left:9px}.mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb{border:1.5px solid rgba(0,0,0,.26);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value::-ms-thumb{background:radial-gradient(circle closest-side,transparent 0%,transparent 66.67%,rgba(0,0,0,.26)66.67%,rgba(0,0,0,.26)100%)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,rgba(0,0,0,.12)0%,rgba(0,0,0,.12)25%,rgba(0,0,0,.26)25%,rgba(0,0,0,.26)37.5%,rgba(0,0,0,.12)37.5%,rgba(0,0,0,.12)100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb{-ms-transform:scale(.5625);transform:scale(.5625);background:radial-gradient(circle closest-side,transparent 0%,transparent 77.78%,rgba(0,0,0,.26)77.78%,rgba(0,0,0,.26)100%)}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower{background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper{margin-left:9px}.mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled::-webkit-slider-thumb{-webkit-transform:scale(.667);transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded:disabled::-moz-range-thumb{transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-lower{background-color:rgba(0,0,0,.26);left:-6px}.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;-webkit-transform:scale(.667);transform:scale(.667)}.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;transform:scale(.667)}.mdl-slider.is-upgraded.is-lowest-value:disabled:active~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded:disabled:focus::-ms-thumb,.mdl-slider.is-upgraded:disabled:active::-ms-thumb,.mdl-slider.is-upgraded:disabled::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:radial-gradient(circle closest-side,transparent 0%,transparent 50%,rgba(0,0,0,.26)50%,rgba(0,0,0,.26)100%)}.mdl-slider.is-upgraded:disabled::-ms-fill-lower{margin-right:6px;background:linear-gradient(to right,transparent,transparent 25px,rgba(0,0,0,.26)25px,rgba(0,0,0,.26)0)}.mdl-slider.is-upgraded:disabled::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-fill-upper{margin-left:6px}.mdl-slider__ie-container{height:18px;overflow:visible;border:none;margin:none;padding:none}.mdl-slider__container{height:18px;position:relative;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mdl-slider__container,.mdl-slider__background-flex{background:0 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.mdl-slider__background-flex{position:absolute;height:2px;width:calc(100% - 52px);top:50%;left:0;margin:0 26px;overflow:hidden;border:0;padding:0;-webkit-transform:translate(0,-1px);-ms-transform:translate(0,-1px);transform:translate(0,-1px)}.mdl-slider__background-lower{background:$color-primary }.mdl-slider__background-lower,.mdl-slider__background-upper{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0}.mdl-slider__background-upper{background:rgba(0,0,0,.26);-webkit-transition:left .18s cubic-bezier(.4,0,.2,1);transition:left .18s cubic-bezier(.4,0,.2,1)}.mdl-spinner{display:inline-block;position:relative;width:28px;height:28px}.mdl-spinner:not(.is-upgraded).is-active:after{content:"Loading..."}.mdl-spinner.is-upgraded.is-active{-webkit-animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite;animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite}@-webkit-keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mdl-spinner__layer{position:absolute;width:100%;height:100%;opacity:0}.mdl-spinner__layer-1{border-color:#42a5f5}.mdl-spinner--single-color .mdl-spinner__layer-1{border-color:$color-primary }.mdl-spinner.is-active .mdl-spinner__layer-1{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both}.mdl-spinner__layer-2{border-color:#f44336}.mdl-spinner--single-color .mdl-spinner__layer-2{border-color:$color-primary }.mdl-spinner.is-active .mdl-spinner__layer-2{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both}.mdl-spinner__layer-3{border-color:#fdd835}.mdl-spinner--single-color .mdl-spinner__layer-3{border-color:$color-primary }.mdl-spinner.is-active .mdl-spinner__layer-3{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both}.mdl-spinner__layer-4{border-color:#4caf50}.mdl-spinner--single-color .mdl-spinner__layer-4{border-color:$color-primary }.mdl-spinner.is-active .mdl-spinner__layer-4{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1)infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1)infinite both}@-webkit-keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes mdl-spinner__layer-1-fade-in-out{from,25%{opacity:.99}26%,89%{opacity:0}90%,100%{opacity:.99}}@keyframes mdl-spinner__layer-1-fade-in-out{from,25%{opacity:.99}26%,89%{opacity:0}90%,100%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-2-fade-in-out{from,15%{opacity:0}25%,50%{opacity:.99}51%{opacity:0}}@keyframes mdl-spinner__layer-2-fade-in-out{from,15%{opacity:0}25%,50%{opacity:.99}51%{opacity:0}}@-webkit-keyframes mdl-spinner__layer-3-fade-in-out{from,40%{opacity:0}50%,75%{opacity:.99}76%{opacity:0}}@keyframes mdl-spinner__layer-3-fade-in-out{from,40%{opacity:0}50%,75%{opacity:.99}76%{opacity:0}}@-webkit-keyframes mdl-spinner__layer-4-fade-in-out{from,65%{opacity:0}75%,90%{opacity:.99}100%{opacity:0}}@keyframes mdl-spinner__layer-4-fade-in-out{from,65%{opacity:0}75%,90%{opacity:.99}100%{opacity:0}}.mdl-spinner__gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__gap-patch .mdl-spinner__circle{width:1000%;left:-450%}.mdl-spinner__circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__circle-clipper .mdl-spinner__circle{width:200%}.mdl-spinner__circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0;left:0}.mdl-spinner__left .mdl-spinner__circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);-ms-transform:rotate(129deg);transform:rotate(129deg)}.mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle{-webkit-animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1)infinite both;animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1)infinite both}.mdl-spinner__right .mdl-spinner__circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);-ms-transform:rotate(-129deg);transform:rotate(-129deg)}.mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle{-webkit-animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1)infinite both;animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1)infinite both}@-webkit-keyframes mdl-spinner__left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@keyframes mdl-spinner__left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes mdl-spinner__right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}@keyframes mdl-spinner__right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}.mdl-switch{position:relative;z-index:1;vertical-align:middle;display:inline-block;box-sizing:border-box;width:100%;height:24px;margin:0;padding:0;overflow:visible;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdl-switch.is-upgraded{padding-left:28px}.mdl-switch__input{line-height:24px}.mdl-switch.is-upgraded .mdl-switch__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-switch__track{background:rgba(0,0,0,.26);position:absolute;left:0;top:5px;height:14px;width:36px;border-radius:14px;cursor:pointer}.mdl-switch.is-checked .mdl-switch__track{background:rgba($color-primary,.5)}.mdl-switch.is-disabled .mdl-switch__track{background:rgba(0,0,0,.12);cursor:auto}.mdl-switch__thumb{background:#fafafa;position:absolute;left:0;top:2px;height:20px;width:20px;border-radius:50%;cursor:pointer;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:left;transition-property:left}.mdl-switch.is-checked .mdl-switch__thumb{background:$color-primary ;left:16px;box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-switch.is-disabled .mdl-switch__thumb{background:#bdbdbd;cursor:auto}.mdl-switch__focus-helper{position:absolute;top:50%;left:50%;-webkit-transform:translate(-4px,-4px);-ms-transform:translate(-4px,-4px);transform:translate(-4px,-4px);display:inline-block;box-sizing:border-box;width:8px;height:8px;border-radius:50%;background-color:transparent}.mdl-switch.is-focused .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-switch.is-focused.is-checked .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba($color-primary,.26);background-color:rgba($color-primary,.26)}.mdl-switch__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0;left:24px}.mdl-switch.is-disabled .mdl-switch__label{color:#bdbdbd;cursor:auto}.mdl-switch__ripple-container{position:absolute;z-index:2;top:-12px;left:-14px;box-sizing:border-box;width:48px;height:48px;border-radius:50%;cursor:pointer;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000);-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-timing-function:step-end;transition-timing-function:step-end;-webkit-transition-property:left;transition-property:left}.mdl-switch__ripple-container .mdl-ripple{background:$color-primary }.mdl-switch.is-disabled .mdl-switch__ripple-container{cursor:auto}.mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple{background:0 0}.mdl-switch.is-checked .mdl-switch__ripple-container{cursor:auto;left:2px}.mdl-tabs{display:block;width:100%}.mdl-tabs__tab-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;height:48px;padding:0;margin:0;border-bottom:1px solid #e0e0e0}.mdl-tabs__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;color:red;text-decoration:none;height:48px;line-height:48px;text-align:center;font-weight:500;font-size:14px;text-transform:uppercase;color:rgba(0,0,0,.54);overflow:hidden}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active{color:rgba(0,0,0,.87)}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active:after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:$color-primary ;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1).01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1).01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-tabs__tab .mdl-tabs__ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-tabs__tab .mdl-tabs__ripple-container .mdl-ripple{background:$color-primary }.mdl-tabs__panel{display:block}.mdl-tabs.is-upgraded .mdl-tabs__panel{display:none}.mdl-tabs.is-upgraded .mdl-tabs__panel.is-active{display:block}@-webkit-keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}@keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}.mdl-textfield{position:relative;font-size:16px;display:inline-block;box-sizing:border-box;width:300px;max-width:100%;margin:0;padding:20px 0}.mdl-textfield .mdl-button{position:absolute;bottom:20px}.mdl-textfield--align-right{text-align:right}.mdl-textfield--full-width{width:100%}.mdl-textfield--expandable{min-width:32px;width:auto;min-height:32px}.mdl-textfield__input{border:none;border-bottom:1px solid rgba(0,0,0,.12);display:inline-block;font-size:16px;margin:0;padding:4px 0;width:100%;background:16px;text-align:left;color:inherit}.mdl-textfield.is-focused .mdl-textfield__input{outline:none}.mdl-textfield.is-invalid .mdl-textfield__input{border-color:#de3226;box-shadow:none}.mdl-textfield.is-disabled .mdl-textfield__input{background-color:transparent;border-bottom:1px dotted rgba(0,0,0,.12)}.mdl-textfield__label{bottom:0;color:rgba(0,0,0,.26);font-size:16px;left:0;right:0;pointer-events:none;position:absolute;top:24px;width:100%;overflow:hidden;white-space:nowrap;text-align:left}.mdl-textfield.is-dirty .mdl-textfield__label{visibility:hidden}.mdl-textfield--floating-label .mdl-textfield__label{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield--floating-label.is-focused .mdl-textfield__label,.mdl-textfield--floating-label.is-dirty .mdl-textfield__label{color:$color-primary ;font-size:12px;top:4px;visibility:visible}.mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label,.mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label{top:-16px}.mdl-textfield--floating-label.is-invalid .mdl-textfield__label{color:#de3226;font-size:12px}.mdl-textfield__label:after{background-color:$color-primary ;bottom:20px;content:'';height:2px;left:45%;position:absolute;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden;width:10px}.mdl-textfield.is-focused .mdl-textfield__label:after{left:0;visibility:visible;width:100%}.mdl-textfield.is-invalid .mdl-textfield__label:after{background-color:#de3226}.mdl-textfield__error{color:#de3226;position:absolute;font-size:12px;margin-top:3px;visibility:hidden}.mdl-textfield.is-invalid .mdl-textfield__error{visibility:visible}.mdl-textfield__expandable-holder{display:inline-block;position:relative;margin-left:32px;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-block;max-width:.1px}.mdl-textfield.is-focused .mdl-textfield__expandable-holder,.mdl-textfield.is-dirty .mdl-textfield__expandable-holder{max-width:600px}.mdl-textfield__expandable-holder .mdl-textfield__label:after{bottom:0}.mdl-tooltip{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;will-change:transform;z-index:999;background:rgba(97,97,97,.9);border-radius:2px;color:#fff;display:inline-block;font-size:10px;font-weight:500;line-height:14px;max-width:170px;position:fixed;top:-500px;left:-500px;padding:8px;text-align:center}.mdl-tooltip.is-active{-webkit-animation:pulse 200ms cubic-bezier(0,0,.2,1)forwards;animation:pulse 200ms cubic-bezier(0,0,.2,1)forwards}.mdl-tooltip--large{line-height:14px;font-size:14px;padding:16px}@-webkit-keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}@keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}.mdl-shadow--2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.2)}.mdl-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin:0 auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.mdl-grid.mdl-grid--no-spacing{padding:0}.mdl-cell{box-sizing:border-box}.mdl-cell--top{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.mdl-cell--middle{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.mdl-cell--bottom{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.mdl-cell--stretch{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.mdl-grid.mdl-grid--no-spacing>.mdl-cell{margin:0}@media (max-width:479px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:100%}.mdl-cell--hide-phone{display:none!important}.mdl-cell--1-col{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col{width:25%}.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:25%}.mdl-cell--2-col{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col{width:50%}.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:50%}.mdl-cell--3-col{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col{width:75%}.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:75%}.mdl-cell--4-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col{width:100%}.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:100%}.mdl-cell--5-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col{width:100%}.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:100%}.mdl-cell--6-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col{width:100%}.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:100%}.mdl-cell--7-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col{width:100%}.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:100%}.mdl-cell--8-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col{width:100%}.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:100%}.mdl-cell--9-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col{width:100%}.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:100%}.mdl-cell--10-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col{width:100%}.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:100%}.mdl-cell--11-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col{width:100%}.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:100%}.mdl-cell--12-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col{width:100%}.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:100%}}@media (min-width:480px) and (max-width:839px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:50%}.mdl-cell--hide-tablet{display:none!important}.mdl-cell--1-col{width:calc(12.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col{width:12.5%}.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:calc(12.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:12.5%}.mdl-cell--2-col{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col{width:25%}.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:25%}.mdl-cell--3-col{width:calc(37.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col{width:37.5%}.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:calc(37.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:37.5%}.mdl-cell--4-col{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col{width:50%}.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:50%}.mdl-cell--5-col{width:calc(62.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col{width:62.5%}.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:calc(62.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:62.5%}.mdl-cell--6-col{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col{width:75%}.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:75%}.mdl-cell--7-col{width:calc(87.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col{width:87.5%}.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:calc(87.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:87.5%}.mdl-cell--8-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col{width:100%}.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:100%}.mdl-cell--9-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col{width:100%}.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:100%}.mdl-cell--10-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col{width:100%}.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:100%}.mdl-cell--11-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col{width:100%}.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:100%}.mdl-cell--12-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col{width:100%}.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:100%}}@media (min-width:840px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:33.3333333333%}.mdl-cell--hide-desktop{display:none!important}.mdl-cell--1-col{width:calc(8.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col{width:8.3333333333%}.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:calc(8.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:8.3333333333%}.mdl-cell--2-col{width:calc(16.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col{width:16.6666666667%}.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:calc(16.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:16.6666666667%}.mdl-cell--3-col{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col{width:25%}.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:25%}.mdl-cell--4-col{width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col{width:33.3333333333%}.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:33.3333333333%}.mdl-cell--5-col{width:calc(41.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col{width:41.6666666667%}.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:calc(41.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:41.6666666667%}.mdl-cell--6-col{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col{width:50%}.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:50%}.mdl-cell--7-col{width:calc(58.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col{width:58.3333333333%}.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:calc(58.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:58.3333333333%}.mdl-cell--8-col{width:calc(66.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col{width:66.6666666667%}.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:calc(66.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:66.6666666667%}.mdl-cell--9-col{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col{width:75%}.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:75%}.mdl-cell--10-col{width:calc(83.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col{width:83.3333333333%}.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:calc(83.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:83.3333333333%}.mdl-cell--11-col{width:calc(91.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col{width:91.6666666667%}.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:calc(91.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:91.6666666667%}.mdl-cell--12-col{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col{width:100%}.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:100%}}body{margin:0}.styleguide-demo h1{margin:48px 24px 0}.styleguide-demo h1:after{content:'';display:block;width:100%;border-bottom:1px solid rgba(0,0,0,.5);margin-top:24px}.styleguide-demo{opacity:0;-webkit-transition:opacity .6s ease;transition:opacity .6s ease}.styleguide-masthead{height:256px;background:#212121;padding:115px 16px 0}.styleguide-container{position:relative;max-width:960px;width:100%}.styleguide-title{color:#fff;bottom:auto;position:relative;font-size:56px;font-weight:300;line-height:1;letter-spacing:-.02em}.styleguide-title:after{border-bottom:0}.styleguide-title span{font-weight:300}.mdl-styleguide .mdl-layout__drawer .mdl-navigation__link{padding:10px 24px}.demosLoaded .styleguide-demo{opacity:1}iframe{display:block;width:100%;border:none}iframe.heightSet{overflow:hidden}.demo-wrapper{margin:24px}.demo-wrapper iframe{border:1px solid rgba(0,0,0,.5)} 10 | -------------------------------------------------------------------------------- /_sass/_syntax-highlighting.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Syntax highlighting styles 3 | */ 4 | .highlight { 5 | background: #fff; 6 | @extend %vertical-rhythm; 7 | 8 | .c { color: #998; font-style: italic } // Comment 9 | .err { color: #a61717; background-color: #e3d2d2 } // Error 10 | .k { font-weight: bold } // Keyword 11 | .o { font-weight: bold } // Operator 12 | .cm { color: #998; font-style: italic } // Comment.Multiline 13 | .cp { color: #999; font-weight: bold } // Comment.Preproc 14 | .c1 { color: #998; font-style: italic } // Comment.Single 15 | .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special 16 | .gd { color: #000; background-color: #fdd } // Generic.Deleted 17 | .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific 18 | .ge { font-style: italic } // Generic.Emph 19 | .gr { color: #a00 } // Generic.Error 20 | .gh { color: #999 } // Generic.Heading 21 | .gi { color: #000; background-color: #dfd } // Generic.Inserted 22 | .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific 23 | .go { color: #888 } // Generic.Output 24 | .gp { color: #555 } // Generic.Prompt 25 | .gs { font-weight: bold } // Generic.Strong 26 | .gu { color: #aaa } // Generic.Subheading 27 | .gt { color: #a00 } // Generic.Traceback 28 | .kc { font-weight: bold } // Keyword.Constant 29 | .kd { font-weight: bold } // Keyword.Declaration 30 | .kp { font-weight: bold } // Keyword.Pseudo 31 | .kr { font-weight: bold } // Keyword.Reserved 32 | .kt { color: #458; font-weight: bold } // Keyword.Type 33 | .m { color: #099 } // Literal.Number 34 | .s { color: #d14 } // Literal.String 35 | .na { color: #008080 } // Name.Attribute 36 | .nb { color: #0086B3 } // Name.Builtin 37 | .nc { color: #458; font-weight: bold } // Name.Class 38 | .no { color: #008080 } // Name.Constant 39 | .ni { color: #800080 } // Name.Entity 40 | .ne { color: #900; font-weight: bold } // Name.Exception 41 | .nf { color: #900; font-weight: bold } // Name.Function 42 | .nn { color: #555 } // Name.Namespace 43 | .nt { color: #000080 } // Name.Tag 44 | .nv { color: #008080 } // Name.Variable 45 | .ow { font-weight: bold } // Operator.Word 46 | .w { color: #bbb } // Text.Whitespace 47 | .mf { color: #099 } // Literal.Number.Float 48 | .mh { color: #099 } // Literal.Number.Hex 49 | .mi { color: #099 } // Literal.Number.Integer 50 | .mo { color: #099 } // Literal.Number.Oct 51 | .sb { color: #d14 } // Literal.String.Backtick 52 | .sc { color: #d14 } // Literal.String.Char 53 | .sd { color: #d14 } // Literal.String.Doc 54 | .s2 { color: #d14 } // Literal.String.Double 55 | .se { color: #d14 } // Literal.String.Escape 56 | .sh { color: #d14 } // Literal.String.Heredoc 57 | .si { color: #d14 } // Literal.String.Interpol 58 | .sx { color: #d14 } // Literal.String.Other 59 | .sr { color: #009926 } // Literal.String.Regex 60 | .s1 { color: #d14 } // Literal.String.Single 61 | .ss { color: #990073 } // Literal.String.Symbol 62 | .bp { color: #999 } // Name.Builtin.Pseudo 63 | .vc { color: #008080 } // Name.Variable.Class 64 | .vg { color: #008080 } // Name.Variable.Global 65 | .vi { color: #008080 } // Name.Variable.Instance 66 | .il { color: #099 } // Literal.Number.Integer.Long 67 | } 68 | .highlight code { 69 | background: transparent; 70 | } -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fython/kotlin-guides-cn/92de43e6931eb7b7b310300a34fb0fbc02fdf599/assets/favicon.png -------------------------------------------------------------------------------- /assets/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fython/kotlin-guides-cn/92de43e6931eb7b7b310300a34fb0fbc02fdf599/assets/home.png -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fython/kotlin-guides-cn/92de43e6931eb7b7b310300a34fb0fbc02fdf599/assets/logo.png -------------------------------------------------------------------------------- /assets/sdk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fython/kotlin-guides-cn/92de43e6931eb7b7b310300a34fb0fbc02fdf599/assets/sdk.png -------------------------------------------------------------------------------- /changelog.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 改动日志 4 | site_nav_category_order: 201 5 | is_site_nav_category2: true 6 | site_nav_category: contribute 7 | --- 8 | 9 | {% assign sorted_changes = site.changes | sort: 'date' | reverse %} 10 | {% for change in sorted_changes %} 11 |

{{ change.date | date: "%Y-%m-%d" }}

12 | {{ change.content }} 13 | {% endfor %} 14 | -------------------------------------------------------------------------------- /contribute.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 贡献 4 | site_nav_category: contribute 5 | site_nav_category_order: 400 6 | is_site_nav_category: true 7 | --- 8 | 9 | **本页仅从官方直接翻译过来,页面均指向原文。如果要为文档新增、修改内容(不是指翻译结果)请提交到官方的 GitHub Repo,本 Repo 仅从官方拉取内容上的改动。对于翻译问题,您仍可以在本 Repo 上提出 Issues 或 Pull Request 进行修正,更多详情请跳到 GitHub:[fython/kotlin-guides-cn](https://github.com/fython/kotlin-guides-cn)** 10 | 11 | 我们欢迎且十分支持为这个网站作出贡献! 12 | 13 | 要为这个网站作出贡献,小修改请自由地创建 Pull Request。对于更大的贡献我们推荐先于 [issue tracker](https://github.com/android/kotlin-guides/issues) 中提出 Issue 进行讨论。 14 | 15 | Pull requests 应当设定目标为 [GitHub repo](https://github.com/android/kotlin-guides) 的 `master` 分支。每几周 [更新改动](changelog.html) 将会被升级且所有改动都会定期地推送到 `gh-pages` 分支。 16 | 17 | **我们期待你的所有贡献!** 18 | 19 | 20 | ## 开发 21 | 22 | 在改动过程你可以在你的计算机本地运行网站。 23 | 24 | ### 安装 Ruby 和 Bundler 25 | 26 | 确保你已经安装了 Ruby 和 [Bundler](http://bundler.io/)。 27 | 28 | gem install bundler 29 | 30 | ### 一次性设置 31 | 32 | bundle install --path vendor/bundle 33 | 34 | _注意: 如果你在 Mac OS 平台上,这会在安装 nokogiri 时失败,先运行 `brew unlink xz`,安装它然后再 `brew link xz`。_ 35 | 36 | ### 运行网站 37 | 38 | bundle exec jekyll serve 39 | 40 | 在你的浏览器中打开 [http://127.0.0.1:4000/kotlin-guides/](http://127.0.0.1:4000/kotlin-guides/)。 41 | -------------------------------------------------------------------------------- /css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | # Only the main Sass file needs front matter (the dashes are enough) 3 | --- 4 | @charset "utf-8"; 5 | 6 | 7 | 8 | // Our variables 9 | $base-font-family: Roboto, Helvetica, Arial, sans-serif; 10 | $base-font-size: 16px; 11 | $small-font-size: $base-font-size * 0.875; 12 | $base-line-height: 1.5; 13 | 14 | $spacing-unit: 30px; 15 | 16 | $text-color: #111; 17 | $background-color: #fdfdfd; 18 | $brand-color: #2a7ae2; 19 | 20 | $grey-color: #828282; 21 | $grey-color-light: lighten($grey-color, 40%); 22 | $grey-color-dark: darken($grey-color, 25%); 23 | 24 | // Width of the content area 25 | $content-width: 800px; 26 | 27 | $on-palm: 600px; 28 | $on-laptop: 800px; 29 | 30 | 31 | 32 | // Using media queries with like this: 33 | // @include media-query($on-palm) { 34 | // .wrapper { 35 | // padding-right: $spacing-unit / 2; 36 | // padding-left: $spacing-unit / 2; 37 | // } 38 | // } 39 | @mixin media-query($device) { 40 | @media screen and (max-width: $device) { 41 | @content; 42 | } 43 | } 44 | 45 | 46 | 47 | // Import partials from `sass_dir` (defaults to `_sass`) 48 | @import 49 | "config", 50 | "mdl", 51 | "base", 52 | "layout", 53 | "syntax-highlighting" 54 | ; 55 | 56 | /** 57 | * Copyright 2015 Google Inc. All Rights Reserved. 58 | * 59 | * Licensed under the Apache License, Version 2.0 (the "License"); 60 | * you may not use this file except in compliance with the License. 61 | * You may obtain a copy of the License at 62 | * 63 | * http://www.apache.org/licenses/LICENSE-2.0 64 | * 65 | * Unless required by applicable law or agreed to in writing, software 66 | * distributed under the License is distributed on an "AS IS" BASIS, 67 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 68 | * See the License for the specific language governing permissions and 69 | * limitations under the License. 70 | */ 71 | 72 | @font-face { 73 | font-family: "And Black"; 74 | src: url("myfont-webfont.eot?#iefix") format('embedded-opentype'), 75 | url("fonts/and_black.woff") format('woff'), 76 | url("fonts/and_black.ttf") format('truetype'); 77 | } 78 | 79 | body { 80 | margin: 0; 81 | -webkit-touch-callout: none; 82 | -webkit-user-select: none; 83 | -khtml-user-select: none; 84 | -moz-user-select: none; 85 | -ms-user-select: none; 86 | user-select: none; 87 | } 88 | 89 | /* Disable ugly boxes around images in IE10 */ 90 | a img{ 91 | border: 0px; 92 | } 93 | 94 | ::-moz-selection { 95 | background-color: $color-primary; 96 | color: #fff; 97 | } 98 | 99 | ::selection { 100 | background-color: $color-primary; 101 | color: #fff; 102 | } 103 | 104 | .android-search-box .mdl-textfield__input { 105 | color: rgba(0, 0, 0, 0.87); 106 | } 107 | 108 | .android-header .mdl-menu__container { 109 | z-index: 50; 110 | margin: 0 !important; 111 | } 112 | 113 | 114 | .mdl-textfield--expandable { 115 | width: auto; 116 | } 117 | 118 | .android-fab { 119 | position: absolute; 120 | right: 20%; 121 | bottom: -26px; 122 | z-index: 3; 123 | background: #64ffda !important; 124 | color: black !important; 125 | } 126 | 127 | .android-mobile-title { 128 | display: none !important; 129 | } 130 | 131 | 132 | .android-logo-image { 133 | height: 28px; 134 | width: 140px; 135 | } 136 | 137 | 138 | .android-header { 139 | overflow: visible; 140 | background-color: white; 141 | } 142 | 143 | .android-header .material-icons { 144 | color: #767777 !important; 145 | } 146 | 147 | .android-header .mdl-layout__drawer-button { 148 | background: transparent; 149 | color: #767777; 150 | } 151 | 152 | .android-header .mdl-navigation__link { 153 | color: #757575; 154 | font-weight: 700; 155 | font-size: 14px; 156 | } 157 | 158 | .android-navigation-container { 159 | /* Simple hack to make the overflow happen to the left instead... */ 160 | direction: rtl; 161 | order: 1; 162 | width: 500px; 163 | transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), 164 | width 0.2s cubic-bezier(0.4, 0, 0.2, 1); 165 | } 166 | 167 | .android-navigation { 168 | /* ... and now make sure the content is actually LTR */ 169 | direction: ltr; 170 | justify-content: flex-end; 171 | width: 800px; 172 | } 173 | 174 | .android-search-box.is-focused ~ .android-navigation-container { 175 | opacity: 0; 176 | width: 100px; 177 | } 178 | 179 | 180 | .android-navigation .mdl-navigation__link { 181 | display: inline-block; 182 | height: 60px; 183 | line-height: 68px; 184 | background-color: transparent !important; 185 | border-bottom: 4px solid transparent; 186 | } 187 | 188 | .android-navigation .mdl-navigation__link:hover { 189 | border-bottom: 4px solid #8bc34a; 190 | } 191 | 192 | .android-search-box { 193 | order: 2; 194 | margin-left: 16px; 195 | margin-right: 16px; 196 | } 197 | 198 | .android-more-button { 199 | order: 3; 200 | } 201 | 202 | 203 | .android-drawer { 204 | border-right: none; 205 | } 206 | 207 | .android-drawer-separator { 208 | height: 1px; 209 | background-color: #dcdcdc; 210 | margin: 8px 0; 211 | } 212 | 213 | .android-drawer .mdl-navigation__link.mdl-navigation__link { 214 | font-size: 14px; 215 | color: #757575; 216 | } 217 | 218 | .android-drawer span.mdl-navigation__link.mdl-navigation__link { 219 | color: #8bc34a; 220 | } 221 | 222 | .android-drawer .mdl-layout-title { 223 | position: relative; 224 | background: #6ab344; 225 | height: 160px; 226 | } 227 | 228 | .android-drawer .android-logo-image { 229 | position: absolute; 230 | bottom: 16px; 231 | } 232 | 233 | .android-be-together-section { 234 | position: relative; 235 | height: 800px; 236 | width: auto; 237 | background-color: #f3f3f3; 238 | background: url('images/slide01.jpg') center 30% no-repeat; 239 | background-size: cover; 240 | } 241 | 242 | .android-font { 243 | font-family: 'And Black', 'Helvetica', 'Arial', sans-serif; 244 | line-height: 1; 245 | color: #767777; 246 | font-weight: 300; 247 | } 248 | 249 | .android-slogan { 250 | font-size: 60px; 251 | padding-top: 160px; 252 | } 253 | 254 | .android-sub-slogan { 255 | font-size: 21px; 256 | padding-top: 24px; 257 | } 258 | 259 | .android-create-character { 260 | font-size: 21px; 261 | padding-top: 400px; 262 | } 263 | 264 | .android-create-character a { 265 | text-decoration: none; 266 | color: #767777; 267 | font-weight: 300; 268 | } 269 | 270 | .android-screen-section { 271 | position: relative; 272 | padding-top: 60px; 273 | padding-bottom: 80px; 274 | } 275 | 276 | .android-screens { 277 | text-align: right; 278 | width: 100%; 279 | white-space: nowrap; 280 | overflow-x: auto; 281 | } 282 | 283 | .android-screen { 284 | text-align: center; 285 | } 286 | 287 | .android-screen .android-link { 288 | margin-top: 16px; 289 | display: block; 290 | z-index: 2; 291 | } 292 | 293 | .android-image-link { 294 | text-decoration: none; 295 | } 296 | 297 | .android-wear { 298 | display: inline-block; 299 | width: 160px; 300 | margin-right: 32px; 301 | } 302 | 303 | .android-wear .android-screen-image { 304 | width: 40%; 305 | z-index: 1; 306 | } 307 | 308 | 309 | .android-phone { 310 | display: inline-block; 311 | width: 64px; 312 | margin-right: 48px; 313 | } 314 | 315 | .android-phone .android-screen-image { 316 | width: 100%; 317 | z-index: 1; 318 | } 319 | 320 | 321 | .android-tablet { 322 | display: inline-block; 323 | width: 110px; 324 | margin-right: 64px; 325 | } 326 | 327 | .android-tablet .android-screen-image { 328 | width: 100%; 329 | z-index: 1; 330 | } 331 | 332 | .android-tablet .android-link { 333 | display: block; 334 | z-index: 2; 335 | } 336 | 337 | 338 | .android-tv { 339 | display: inline-block; 340 | width: 300px; 341 | margin-right: 80px; 342 | } 343 | 344 | .android-tv .android-screen-image { 345 | width: 100%; 346 | z-index: 1; 347 | } 348 | 349 | 350 | .android-auto { 351 | display: inline-block; 352 | width: 300px; 353 | overflow: hidden; 354 | } 355 | 356 | .android-auto .android-screen-image { 357 | display: block; 358 | height: 300px; 359 | z-index: 1; 360 | } 361 | 362 | 363 | .android-wear-section { 364 | position: relative; 365 | background: url('images/wear.png') center top no-repeat; 366 | background-size: cover; 367 | height: 800px; 368 | } 369 | 370 | .android-wear-band { 371 | position: absolute; 372 | bottom: 0; 373 | width: 100%; 374 | text-align: center; 375 | background-color: #37474f; 376 | } 377 | 378 | .android-wear-band-text { 379 | max-width: 800px; 380 | margin-left: 25%; 381 | padding: 24px; 382 | text-align: left; 383 | color: white; 384 | } 385 | 386 | .android-wear-band-text p { 387 | padding-top: 8px; 388 | } 389 | 390 | .android-link { 391 | text-decoration: none; 392 | color: #8bc34a !important; 393 | } 394 | 395 | .android-link:hover { 396 | color: #7cb342 !important; 397 | } 398 | 399 | .android-link .material-icons { 400 | position: relative; 401 | top: 6px; 402 | } 403 | 404 | .android-alt-link { 405 | text-decoration: none; 406 | color: #64ffda !important; 407 | font-size: 16px; 408 | } 409 | 410 | .android-alt-link:hover { 411 | color: #00bfa5 !important; 412 | } 413 | 414 | .android-alt-link .material-icons { 415 | position: relative; 416 | top: 6px; 417 | } 418 | 419 | .android-customized-section { 420 | text-align: center; 421 | } 422 | 423 | .android-customized-section-text { 424 | max-width: 500px; 425 | margin-left: auto; 426 | margin-right: auto; 427 | padding: 80px 16px 0 16px; 428 | } 429 | 430 | .android-customized-section-text p { 431 | padding-top: 16px; 432 | } 433 | 434 | .android-customized-section-image { 435 | background: url('images/devices.jpg') center top no-repeat; 436 | background-size: cover; 437 | height: 400px; 438 | } 439 | 440 | .android-more-section { 441 | padding: 80px 0; 442 | max-width: 1044px; 443 | margin-left: auto; 444 | margin-right: auto; 445 | } 446 | 447 | .android-more-section .android-section-title { 448 | margin-left: 12px; 449 | padding-bottom: 24px; 450 | } 451 | 452 | .android-card-container { 453 | } 454 | 455 | .android-card-container .mdl-card__media { 456 | overflow: hidden; 457 | background: transparent; 458 | } 459 | 460 | .android-card-container .mdl-card__media img { 461 | width: 100%; 462 | } 463 | 464 | .android-card-container .mdl-card__title { 465 | background: transparent; 466 | height: auto; 467 | } 468 | 469 | .android-card-container .mdl-card__title-text { 470 | color: black; 471 | height: auto; 472 | } 473 | 474 | .android-card-container .mdl-card__supporting-text { 475 | height: auto; 476 | color: black; 477 | padding-bottom: 48px; 478 | } 479 | 480 | .android-card-container .mdl-card__actions { 481 | position: absolute; 482 | bottom: 0; 483 | } 484 | 485 | .android-card-container .mdl-card__actions a { 486 | border-top: none; 487 | line-height: 32px; 488 | font-size: 16px; 489 | } 490 | 491 | .android-footer { 492 | background-color: #fafafa; 493 | position: relative; 494 | } 495 | 496 | .android-footer a:hover { 497 | color: #8bc34a; 498 | } 499 | 500 | .android-footer .mdl-mega-footer--top-section::after { 501 | border-bottom: none; 502 | } 503 | 504 | .android-footer .mdl-mega-footer--middle-section::after { 505 | border-bottom: none; 506 | } 507 | 508 | .android-footer .mdl-mega-footer--bottom-section { 509 | position: relative; 510 | } 511 | 512 | .android-footer .mdl-mega-footer--bottom-section a { 513 | margin-right: 2em; 514 | } 515 | 516 | .android-footer .mdl-mega-footer--right-section a .material-icons { 517 | position: relative; 518 | top: 6px; 519 | } 520 | 521 | 522 | .android-link-menu:hover { 523 | cursor: pointer; 524 | } 525 | 526 | 527 | /**** Mobile layout ****/ 528 | @media (max-width: 900px) { 529 | .android-navigation-container { 530 | display: none; 531 | } 532 | 533 | .android-title { 534 | display: none !important; 535 | } 536 | 537 | .android-mobile-title { 538 | display: block !important; 539 | position: absolute; 540 | left: calc(50% - 70px); 541 | top: 12px; 542 | transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); 543 | } 544 | 545 | .android-search-box.is-focused ~ .android-mobile-title { 546 | opacity: 0; 547 | } 548 | 549 | .android-more-button { 550 | display: none; 551 | } 552 | 553 | .android-search-box.is-focused { 554 | width: calc(100% - 48px); 555 | } 556 | 557 | .android-search-box .mdl-textfield__expandable-holder { 558 | width: 100%; 559 | } 560 | 561 | .android-be-together-section { 562 | height: 350px; 563 | } 564 | 565 | .android-slogan { 566 | font-size: 26px; 567 | margin: 0 16px; 568 | padding-top: 24px; 569 | } 570 | 571 | .android-sub-slogan { 572 | font-size: 16px; 573 | margin: 0 16px; 574 | padding-top: 8px; 575 | } 576 | 577 | .android-create-character { 578 | padding-top: 200px; 579 | font-size: 16px; 580 | } 581 | 582 | .android-create-character img { 583 | height: 12px; 584 | } 585 | 586 | .android-fab { 587 | display: none; 588 | } 589 | 590 | .android-wear-band-text { 591 | margin-left: 0; 592 | padding: 16px; 593 | } 594 | 595 | .android-footer .mdl-mega-footer--bottom-section { 596 | display: none; 597 | } 598 | } 599 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: 主页 4 | permalink: /index.html 5 | is_site_nav_category: true 6 | site_nav_category: home 7 | site_nav_category_order: 1 8 | --- 9 | 10 |
11 |
12 |

Kotlin 指导

13 | 14 |

Kotlin 是 Android 平台最新支持的编程语言。它易于表达、简洁、可扩展、强大,使用起来十分令人享受。

15 |

这些指导提供了在 Android 平台上编写 Kotlin 时可遵循的一系列的规范。

16 |

网站的内容是一本在线的指导书,它会周期性地更新内容。更新改动会发布到 更新日志。如果你想参与贡献,请阅读贡献规范

17 |
18 |
19 |

本网站为第三方的简体中文翻译,对于翻译问题,欢迎在本 Repo 上提出 Issues 或 Pull Request 进行修正,GitHub Repo:fython/kotlin-guides-cn

20 |

翻译不定期更新,更多详情请联系作者

21 |
22 | 23 |
24 | 25 |
26 |
27 | -------------------------------------------------------------------------------- /interop.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 互通指导 4 | site_nav_category: interop 5 | is_site_nav_category: true 6 | site_nav_category_order: 300 7 | --- 8 | 9 | 一套用于编写 Java 与 Kotlin 间使用公共 API 的规则,目的是让代码在其它语言也能使用到感到习惯的用法。 10 | 11 | _上次更新时间(官方源): {{ site.changes.last.date | date: "%Y-%m-%d" }}_ 12 | 13 | 14 | # Java (为 Kotlin 使用时) 15 | 16 | ## 没有硬性关键字 17 | 18 | 不要使用 Kotlin 的 [硬性关键字(Hard keywords)](https://kotlinlang.org/docs/reference/keyword-reference.html#hard-keywords) 作为方法或者成员的名字。这些会令 Kotlin 在调用时要求使用反引号。[非硬性关键字(Soft keywords)](https://kotlinlang.org/docs/reference/keyword-reference.html#soft-keywords)、[修饰符关键字](https://kotlinlang.org/docs/reference/keyword-reference.html#modifier-keywords) 和 [特殊标识符](https://kotlinlang.org/docs/reference/keyword-reference.html#special-identifiers) 则允许。 19 | 20 | 例如,Mockito 的 `when` 方法当在 Kotlin 调用时需要反引号: 21 | 22 | ```kotlin 23 | val callable = Mockito.mock(Callable::class.java) 24 | Mockito.`when`(callable.call()).thenReturn(/* … */) 25 | ``` 26 | 27 | 28 | ## Lambda 参数放最后 29 | 30 | 适用于 [SAM 转换](https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions) 的参数类型应该放到最后。 31 | 32 | 例如,RxJava 2 的 `Flowable.create()` 方法签名被定义为: 33 | 34 | ```java 35 | public static Flowable create( 36 | FlowableOnSubscribe source, 37 | BackpressureStrategy mode) { /* … */ } 38 | ``` 39 | 40 | 因为 `FlowableOnSubscribe` 适用于 SAM 转换,Kotlin 中调用这个方法看起来像这样: 41 | 42 | ```kotlin 43 | Flowable.create({ /* … */ }, BackpressureStrategy.LATEST) 44 | ``` 45 | 46 | 如果方法签名中的参数被颠倒过来,函数调用可以使用尾部 Lambda 语法: 47 | 48 | ```kotlin 49 | Flowable.create(BackpressureStrategy.LATEST) { /* … */ } 50 | ``` 51 | 52 | 53 | ## 属性前缀 54 | 55 | 对于在 Kotlin 中要表示为属性的方法,必须使用严格的 Bean 风格前缀。 56 | 57 | 属性访问方法需要一个 `get` 前缀,返回类型为 `boolean` 的方法可以使用 `is` 作为前缀。 58 | 59 | ```java 60 | public final class User { 61 | public String getName() { /* … */ } 62 | public boolean isActive() { /* … */ } 63 | } 64 | ``` 65 | ```kotlin 66 | val name = user.name // 会调用 user.getName() 67 | val active = user.active // 会调用 user.isActive() 68 | ``` 69 | 70 | 对应的改值方法需要 `set` 前缀。 71 | 72 | ```java 73 | public final class User { 74 | public String getName() { /* … */ } 75 | public void setName(String name) { /* … */ } 76 | } 77 | ``` 78 | ```kotlin 79 | user.name = "Bob" // 会调用 user.setName(String) 80 | ``` 81 | 82 | 如果你想让方法公开为属性,不要使用不标准的前缀,如 `has`/`set` 或者非 `get` 前缀的访问方法。带非标准前缀的方法仍然可以调用,能否接受取决于它的行为。 83 | 84 | 85 | ## 操作符重载 86 | 87 | 注意在 Kotlin 语法中允许“特殊语法”调用的方法名 (即 [操作符重载](https://kotlinlang.org/docs/reference/operator-overloading.html))。保证方法名和缩短的语法一起使用是有意义的。 88 | 89 | ```java 90 | public final class IntBox { 91 | private final int value; 92 | public IntBox(int value) { 93 | this.value = value; 94 | } 95 | public IntBox plus(IntBox other) { 96 | return new IntBox(value + other.value); 97 | } 98 | } 99 | ``` 100 | ```kotlin 101 | val one = IntBox(1) 102 | val two = IntBox(2) 103 | val three = one + two // 会调用 one.plus(two) 104 | ``` 105 | 106 | 107 | ## 可空性注释 108 | 109 | 在公开的 API 里所有的非原生类型参数、返回值和字段类型都应该有可空性注释。未标注的类型会被转译为带含糊的可空性的 [“平台”类型](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types)。 110 | 111 | JSR 305 包注释可以用来设定合理的默认值但目前不鼓励。他们要求编译器承认 Opt-in 标记且与 Java 9 的模块系统冲突。 112 | 113 | 114 | # Kotlin (为 Java 使用时) 115 | 116 | ## 文件名 117 | 118 | 当一个文件包含顶级方法或属性时,*始终* 要用 `@file:JvmName("Foo")` 来标注它以提供一个好听的名字。 119 | 120 | 在默认情况,一个文件 `Foo.kt` 中的顶级成员最终会到一个叫 `FooKt` 的类里,这很没有吸引力同时也泄露了语言作为实现细节。 121 | 122 | 考虑添加 `@file:JvmMultifileClass` 注释将多个文件中的顶级成员合并为一个类。 123 | 124 | 125 | ## Lambda 参数 126 | 127 | 被 Java 使用的 [方法类型](https://kotlinlang.org/docs/reference/lambdas.html#function-types) 应该避免返回 `Unit`。这么做的话就要指定一条明确的表达式: `return Unit.INSTANCE;` 。 128 | 129 | ```kotlin 130 | fun sayHi(callback: (String) -> Unit) = /* … */ 131 | ``` 132 | ```kotlin 133 | // Kotlin 调用者: 134 | greeter.sayHi { Log.d("打招呼", "你好,$it!") } 135 | ``` 136 | ```java 137 | // Java 调用者: 138 | greeter.sayHi(name -> { 139 | Log.d("打招呼", "你好," + name + "!"); 140 | return Unit.INSTANCE; 141 | }); 142 | ``` 143 | 144 | 这个语法也不允许提供一个语义命名的类型,以便能在其它类型上实现。 145 | 146 | 在 Kotlin 中为 Lambda 类型定义命名一个单抽象(SAM)方法可以纠正 Java 的问题,但会阻止 Kotlin 中使用 Lambda 语法。 147 | 148 | ```kotlin 149 | interface GreeterCallback { 150 | fun greetName(name: String): Unit 151 | } 152 | 153 | fun sayHi(callback: GreeterCallback) = /* … */ 154 | ``` 155 | ```kotlin 156 | // Kotlin 调用者: 157 | greeter.sayHi(object : GreeterCallback { 158 | override fun greetName(name: String) { 159 | Log.d("打招呼", "你好,$name!") 160 | } 161 | }) 162 | ``` 163 | ```java 164 | // Java 调用者: 165 | greeter.sayHi(name -> Log.d("打招呼", "你好," + name + "!")) 166 | ``` 167 | 168 | 在 Java 中定义命名一个单抽象(SAM)接口允许 Kotlin 使用较低级的 Lambda 语法,其中接口类型必须明确指定。 169 | 170 | ```java 171 | // 在 Java 中定义: 172 | interface GreeterCallback { 173 | void greetName(String name); 174 | } 175 | ``` 176 | ```kotlin 177 | fun sayHi(greeter: GreeterCallback) = /* … */ 178 | ``` 179 | ```kotlin 180 | // Kotlin 调用者: 181 | greeter.sayHi(GreeterCallback { Log.d("打招呼", "你好,$it!") }) 182 | ``` 183 | ```java 184 | // Java 调用者: 185 | greeter.sayHi(name -> Log.d("打招呼", "你好," + name + "!")); 186 | ``` 187 | 188 | 目前还没有办法在 Java 和 Kotlin 中定义一个参数类型作为 Lambda,这可以感受到两种语言的习惯。目前的建议是选用 [方法类型](https://kotlinlang.org/docs/reference/lambdas.html#function-types),尽管返回类型是 `Unit` 时 Java 上体验不佳。 189 | 190 | _注明: 这个建议未来可能会改变,请看 [KT-7770](https://youtrack.jetbrains.com/issue/KT-7770) 和 [KT-21018](https://youtrack.jetbrains.com/issue/KT-21018)。_ 191 | 192 | 193 | ## 避免 `Nothing` 泛型 194 | 195 | 泛型参数为 `Nothing` 类型会作为原始类型暴露给 Java,原始类型很少在 Java 中使用且应当避免。 196 | 197 | 198 | ## 记载异常 (Exceptions) 199 | 200 | 会抛出 Checked Exceptions(会被检查的异常)的方法应该使用 `@Throws` 记载那些异常。运行时异常应在 KDoc 中被记载。 201 | 202 | 要留意一个方法所代表的 API,Kotlin 默许它们可以抛出 Checked Exceptions(会被检查的异常)。 203 | 204 | 205 | ## 保护性复制副本(Defensive copy/保护性拷贝) 206 | 207 | 当从公共 API 中返回共享/不被持有(unowned)的只读集合(Collections),请用一个不可修改的容器包装它们,或者进行保护性复制副本。尽管 Kotlin 会强制设置它们的只读属性,但在 Java 那端不会有这样的强制性措施。没有包装或者保护性复制副本,通过返回一个长期存活的集合引用则可以违背不可变性。 208 | 209 | 210 | ## 伴随方法 211 | 212 | 在 `companion object` 内的公开方法必须用 `@JvmStatic` 标注来暴露为一个静态方法。 213 | 214 | 没有标注,这些方法只能在静态的 `Companion` 成员中作为一个实例方法可用。 215 | 216 | _不正确: 没有标注_ 217 | 218 | ```kotlin 219 | class KotlinClass { 220 | companion object { 221 | fun doWork() { 222 | /* … */ 223 | } 224 | } 225 | } 226 | ``` 227 | ```java 228 | public final class JavaClass { 229 | public static void main(String... args) { 230 | KotlinClass.Companion.doWork(); 231 | } 232 | } 233 | ``` 234 | 235 | _正确: `@JvmStatic` 标注_ 236 | 237 | 238 | ```kotlin 239 | class KotlinClass { 240 | companion object { 241 | @JvmStatic fun doWork() { 242 | /* … */ 243 | } 244 | } 245 | } 246 | ``` 247 | ```java 248 | public final class JavaClass { 249 | public static void main(String... args) { 250 | KotlinClass.doWork(); 251 | } 252 | } 253 | ``` 254 | 255 | 256 | ## 伴随常量 257 | 258 | 那些有用的公开、非 `const`(非常量)的属性([_effective constants_](TODO))在 `companion object` 必须用 `@JvmField` 标注暴露为一个静态成员。 259 | 260 | 没有标注,这些方法这能在静态的 `Companion` 成员中以命名奇怪的实例 `getters` 可用。在仍然不正确的类中使用 `@JvmStatic` 来取代 `@JvmField` 可以为静态方法移除命名奇怪的 `getters` 。 261 | 262 | _不正确: 没有标注_ 263 | 264 | ```kotlin 265 | class KotlinClass { 266 | companion object { 267 | const val INTEGER_ONE = 1 268 | val BIG_INTEGER_ONE = BigInteger.ONE 269 | } 270 | } 271 | ``` 272 | ```java 273 | public final class JavaClass { 274 | public static void main(String... args) { 275 | System.out.println(KotlinClass.INTEGER_ONE); 276 | System.out.println(KotlinClass.Companion.getBIG_INTEGER_ONE()); 277 | } 278 | } 279 | ``` 280 | 281 | _不正确: `@JvmStatic` 标注_ 282 | 283 | ```kotlin 284 | class KotlinClass { 285 | companion object { 286 | const val INTEGER_ONE = 1 287 | @JvmStatic val BIG_INTEGER_ONE = BigInteger.ONE 288 | } 289 | } 290 | ``` 291 | ```java 292 | public final class JavaClass { 293 | public static void main(String... args) { 294 | System.out.println(KotlinClass.INTEGER_ONE); 295 | System.out.println(KotlinClass.getBIG_INTEGER_ONE()); 296 | } 297 | } 298 | ``` 299 | 300 | _正确: `@JvmField` 标注_ 301 | 302 | ```kotlin 303 | class KotlinClass { 304 | companion object { 305 | const val INTEGER_ONE = 1 306 | @JvmField val BIG_INTEGER_ONE = BigInteger.ONE 307 | } 308 | } 309 | ``` 310 | ```java 311 | public final class JavaClass { 312 | public static void main(String... args) { 313 | System.out.println(KotlinClass.INTEGER_ONE); 314 | System.out.println(KotlinClass.BIG_INTEGER_ONE); 315 | } 316 | } 317 | ``` 318 | 319 | ## 习惯命名 320 | 321 | Kotlin 有着和 Java 不一样的调用惯例,这会改变你命名函数的方式。使用 `@JvmName` 来为感到不自然的方法设计名字,照顾到两边语言不同的习惯,与它们各自的标准库命名所匹配。 322 | 323 | 这最频繁出现于扩展方法和扩展属性,因为它们的接收器类型位置是不一样的。 324 | 325 | ```kotlin 326 | sealed class Optional 327 | data class Some(val value: T): Optional() 328 | object None : Optional() 329 | 330 | @JvmName("ofNullable") 331 | fun T?.asOptional() = if (this == null) None else Some(this) 332 | ``` 333 | ```kotlin 334 | // FROM KOTLIN: 335 | fun main(vararg args: String) { 336 | val nullableString: String? = "foo" 337 | val optionalString = nullableString.asOptional() 338 | } 339 | ``` 340 | ```java 341 | // FROM JAVA: 342 | public static void main(String... args) { 343 | String nullableString = "Foo"; 344 | Optional optionalString = 345 | Optionals.ofNullable(nullableString); 346 | } 347 | ``` 348 | 349 | ## 默认参数的方法重载 350 | 351 | 参数拥有默认值的方法必须使用 `@JvmOverloads`,没有这个标注是无法调用一个使用默认值参数的方法。 352 | 353 | 当使用 `@JvmOverloads` 时,检查它们生成的方法确保各有意义。如果没有的话,进行下列修改直至满意: 354 | 355 | 1. 改变参数的顺序让优先选择默认值的参数在结尾。 356 | 2. 在重载函数中手动移动默认值。 357 | 358 | _不正确: 没有 `@JvmOverloads`_ 359 | 360 | ```kotlin 361 | class Greeting { 362 | fun sayHello(prefix: String = "Mr.", name: String) { 363 | println("Hello, $prefix $name") 364 | } 365 | } 366 | ``` 367 | ```java 368 | public class JavaClass { 369 | public static void main(String... args) { 370 | Greeting greeting = new Greeting(); 371 | greeting.sayHello("Mr.", "Bob"); 372 | } 373 | } 374 | ``` 375 | 376 | _正确: `@JvmOverloads` 标注._ 377 | 378 | ```kotlin 379 | class Greeting { 380 | @JvmOverloads 381 | fun sayHello(prefix: String = "Mr.", name: String) { 382 | println("Hello, $prefix $name") 383 | } 384 | } 385 | ``` 386 | ```java 387 | public class JavaClass { 388 | public static void main(String... args) { 389 | Greeting greeting = new Greeting(); 390 | greeting.sayHello("Bob"); 391 | } 392 | } 393 | ``` 394 | -------------------------------------------------------------------------------- /style.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: 代码风格指导 4 | site_nav_category_order: 200 5 | is_site_nav_category: true 6 | site_nav_category: style 7 | --- 8 | 9 | 这篇文档提供了使用 Kotlin 编程语言开发 Android 的 Google 代码标准完整定义。Google Android 风格的 Kotlin 源文件应当遵循这里的规范。 10 | 11 | 类似其它编程风格规范,所包括的问题不仅涉及格式的美观问题,也涉及了其它约定和编码标准。然而,本文主要专注于我们都要遵循的硬性规定,并避免给出不明确以执行(无论由人还是工具)的建议。 12 | 13 | _上次更新时间(官方源): {{ site.changes.last.date | date: "%Y-%m-%d" }}_ 14 | 15 | # 源文件 16 | 17 | 所有源文件必须以 UTF-8 为编码。 18 | 19 | ## 命名 20 | 21 | 如果一个源文件只包含一个顶级类,文件名应为对应的区分大小写的名并加上 `.kt` 扩展名。除此以外,如果一个源文件包含多个顶级声明,选择一个可以描述文件内容的名字,应用 PascalCase 命名法,然后加上 `.kt` 扩展名。 22 | 23 | ```kotlin 24 | // Foo.kt 25 | class Foo { } 26 | 27 | // Bar.kt 28 | class Bar { } 29 | fun Runnable.toBar(): Bar = // … 30 | 31 | // Map.kt 32 | fun Set.map(func: (T) -> O): List = // … 33 | fun List.map(func: (T) -> O): List = // … 34 | ``` 35 | 36 | ## 特殊字符 37 | 38 | ### 空白字符 39 | 40 | 除了换行符, **ASCII 横向空格字符 (0x20)** 是唯一可在源文件里出现的空格字符。这意味着: 41 | 42 | 1. 所有字符串和字符中的其它空白字符都会被转义。 43 | 2. Tab 字符 **不会被** 用于缩进。 44 | 45 | ### 特殊的转义符 46 | 47 | 对于任何有 [特殊转义符](https://kotlinlang.org/docs/reference/basic-types.html#characters) 的字符应该使用对应的字符串 (`\b`, `\n`, `\r`, `\t`, `\'`, `\"`, `\\`, and `\$`) 而不是相应的 Unicode (例如 `\u000a`) 转义符。 48 | 49 | ### 非 ASCII 字符 50 | 51 | 对于其余的非 ASCII 字符,使用实际的 Unicode 字符 (例如 `∞`) 或者同义的 Unicode 转义符 (例如 `\u221e`)。选择取决于哪种让代码 **更易于阅读理解** 。强烈建议除了字符串和注释以外,可显示的字符都不使用 Unicode 转义符。 52 | 53 | | **例子** | **评论** | 54 | |------------------------------------|-------------------------------------------------| 55 | | `val unitAbbrev = "μs"` | 最好: 即便没有标注也很清晰 | 56 | | `val unitAbbrev = "\u03bcs" // μs` | 不建议: 这里没有理由为一个可显示的字符进行转义。| 57 | | `val unitAbbrev = "\u03bcs"` | 不建议: 读者不知道这是什么字符 | 58 | | `return "\ufeff" + content` | 可以: 为不显示的字符使用转义,有必要的时候标注 | 59 | 60 | 61 | ## 结构 62 | 63 | 一个 `.kt` 文件按照顺序包含下列内容: 64 | 65 | 1. 版权和/或许可头部 (可选) 66 | 2. 文件级注释 67 | 3. 包声明 68 | 4. 引入声明 69 | 5. 顶级声明 70 | 71 | 恰好一行空白行来分割这些内容。 72 | 73 | ### 版权 / 许可 74 | 75 | 如果文件中包含版权或许可证标题,则应该将它们放在多行注释的顶部。 76 | 77 | ```kotlin 78 | /* 79 | * Copyright 2017 Google, Inc. 80 | * 81 | * ... 82 | */ 83 | ``` 84 | 85 | 不要使用 [KDoc 风格](https://kotlinlang.org/docs/reference/kotlin-doc.html) 或者 单行风格 注释。 86 | 87 | ```kotlin 88 | /** 89 | * Copyright 2017 Google, Inc. 90 | * 91 | * ... 92 | */ 93 | ``` 94 | ```kotlin 95 | // Copyright 2017 Google, Inc. 96 | // 97 | // ... 98 | ``` 99 | 100 | ### 文件级别注解 101 | 102 | 注释和 'file' [use-site target](https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets) 应放置在包声明和任意头部注释。 103 | 104 | ### 包声明 105 | 106 | 包声明不受任何列的限制且永不换行。 107 | 108 | ### 引入声明 109 | 110 | 为类、方法、属性的引入应组合到单个 ASCII 顺序排列的列表。 111 | 112 | 任意类型的通配符在引入中是 **不允许的**。 113 | 114 | 和包声明一样,引入声明也不受任何列的限制且永不换行。 115 | 116 | ### 顶级声明 117 | 118 | 一个 `.kt` 文件可以在顶级声明一个或多个类型、方法、属性和类型别名。 119 | 120 | 一个文件的内容应该专注于同一个主题,这个例子可以是单个公开类或者一组扩展函数在多个接收器(Receivers)类型上执行相同的操作。不相关的声明应该被分到它们对应的文件,并应当减少单个文件的公开声明。 121 | 122 | 对文件内容的数量和顺序没有明确的限制。 123 | 124 | 源文件通常是从上至下的阅读,这意味着顺序通常反应出上面的声明会让人们更深入地了解这些内容。不同的文件可能选择不同的顺序。同样地,一个文件可能包含 100 个属性、10 个函数以及另外的一个类。 125 | 126 | 重要的是,每个类都是用 **_一些_** 维护者可以解释的 **逻辑顺序**。例如,新的方法不只是习惯地添加到类之后,这样会产生不合乎逻辑的“按日期添加”顺序。 127 | 128 | ### 类成员排序 129 | 130 | 类的成员顺序和顶级声明遵循同样的规则。 131 | 132 | 133 | # 格式 134 | 135 | ## 花括号 136 | 137 | 对 `when` 的分支和没有 `else if` 或 `else` 分支的 `if` 语句来说,写成单行时花括号不是必需的。 138 | 139 | ```kotlin 140 | if (string.isEmpty()) return 141 | 142 | when (value) { 143 | 0 -> return 144 | // … 145 | } 146 | ``` 147 | 148 | 对任何 `if`、`for`、`when` 的分支和 `do`、`while` 的表达式中,即便代码体是 空的或仅包含单行语句时,花括号也是必需的。 149 | 150 | ```kotlin 151 | if (string.isEmpty()) 152 | return // 错误的! 153 | 154 | if (string.isEmpty()) { 155 | return // 正确 156 | } 157 | ``` 158 | 159 | ### 非空代码区块 160 | 161 | 非空代码区块和区块型构造花括号遵循 Kernighan 和 Ritchie 风格 ("Egyptian brackets"): 162 | 163 | * 头部花括号不需要换行 164 | * 在头部花括号后换行 165 | * 在尾部花括号前换行 166 | * 只有在花括号结束一个语句、一个方法的代码体或者一个命名类时,才在尾部花括号后换行。例如花括号后面有 `else` 或者逗号时不用换行。 167 | 168 | ```kotlin 169 | return Runnable { 170 | while (condition()) { 171 | foo() 172 | } 173 | } 174 | 175 | return object : MyClass() { 176 | override fun foo() { 177 | if (condition()) { 178 | try { 179 | something() 180 | } catch (e: ProblemException) { 181 | recover() 182 | } 183 | } else if (otherCondition()) { 184 | somethingElse() 185 | } else { 186 | lastThing() 187 | } 188 | } 189 | } 190 | ``` 191 | 192 | 一些 [常量方法](#enum-classes) 的例外会在下面给出。 193 | 194 | ### 空的代码区块 195 | 196 | 一个空的代码区块或者区块型构造必须是 K&R 风格。 197 | 198 | ```kotlin 199 | try { 200 | doSomething() 201 | } catch (e: Exception) {} // 错误的! 202 | ``` 203 | ```kotlin 204 | try { 205 | doSomething() 206 | } catch (e: Exception) { 207 | } // 可以 208 | ``` 209 | 210 | ### 表达式 211 | 212 | 用作表达式的 `if`/`else` 可能会省略花括号,但仅在整个表达式只有一行时适用。 213 | 214 | ```kotlin 215 | val value = if (string.isEmpty()) 0 else 1 // 可以 216 | ``` 217 | ```kotlin 218 | val value = if (string.isEmpty()) // 错误的! 219 | 0 220 | else 221 | 1 222 | ``` 223 | ```kotlin 224 | val value = if (string.isEmpty()) { // 可以 225 | 0 226 | } else { 227 | 1 228 | } 229 | ``` 230 | 231 | 232 | ## 缩进 233 | 234 | 每次打开一个新的代码区块或者区块型构造,缩进增加四个空格。当区块结束时,缩进回到前一个级别。缩进级别适用于整个区块的代码和注释。 235 | 236 | 237 | ## 一行一句 238 | 239 | 每句都断行,并且不使用分号。 240 | 241 | 242 | ## 行宽 243 | 244 | 一列的代码被限制在 100 个字符内。除了下面的情况,任何超过这个限制的行,都必须按照下面的解释进行换行。 245 | 246 | 例外: 247 | 248 | * 不可能遵循列限制的行 (比如在 KDoc 的一条长链接地址) 249 | * `package` 和 `import` 声明 250 | * 可能会被拷贝到 Shell 中使用的命令行 251 | 252 | ### 换行位置 253 | 254 | 换行的主要指示:优先在更高的句式级别上换行。包括: 255 | 256 | 1. 当一行在 _非赋值_ 运算符换行时,在符号 _之前_ 断行。 257 | * 这也适用于 "类似运算符" 的符号: 258 | * 分割符:句号 (`.`) 259 | * 方法引用:两个冒号 (`::`) 260 | 2. 当一行在 _赋值_ 运算符换行时,在符号 _之后_ 断行。 261 | 3. 一个方法或构造名要紧跟着它的头部括号 (`(`)。 262 | 4. 一个逗号 (`,`) 要紧跟着它前面的标志(Token)。 263 | 5. 一个 Lambda 箭头 (`->`) 要紧跟它前面的参数列表。 264 | 265 | 注意: 换行的主要目的是拥有更清晰的代码,_不一定_ 要让代码有最少的行数。 266 | 267 | 268 | ### 继续缩进 269 | 270 | 当换行后,每一行 (每个 _连续行_) 之后对原来的行至少缩进 +8。 271 | 272 | 当有多个连续行时,缩进可能根据需求增加到 +8 以上。通常来说,当且仅当两个连续行在语法上并行的元素开始时,使用相同的缩进级别。 273 | 274 | ### 函数 275 | 276 | 当一个函数签名不在一行内时,每个参数声明都断出自己的行。在这种格式定义的参数应该使用单缩进(+4)。尾部括号 (`)`) 和返回类型放在独自的行且没有额外的缩进。 277 | 278 | ```kotlin 279 | fun Iterable.joinToString( 280 | separator: CharSequence = ", ", 281 | prefix: CharSequence = "", 282 | postfix: CharSequence = "" 283 | ): String { 284 | // … 285 | } 286 | ``` 287 | 288 | #### 表达式函数 289 | 290 | 当一个函数只包含一行表达式时它代表了一个 [表达式函数](https://kotlinlang.org/docs/reference/functions.html#single-expression-functions). 291 | 292 | ```kotlin 293 | override fun toString(): String { 294 | return "嘿" 295 | } 296 | ``` 297 | ```kotlin 298 | override fun toString(): String = "嘿" 299 | ``` 300 | 301 | 表达式函数不应该换到两行,如果一个表达式很长以至于需要换行,使用正常的函数体、`return` 声明和正常的表达式换行规则代替。 302 | 303 | ### 属性 304 | 305 | 当一个属性的初始化不在一行内,在等号 (`=`) 后换行并使用继续缩进。 306 | 307 | ```kotlin 308 | private val defaultCharset: Charset? = 309 | EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(file) 310 | ``` 311 | 312 | 声明了 `get` 和/或 `set` 方法的属性应当在它们各自的行内且有一个正常缩进(+4)。使用和函数一样的规则格式。 313 | 314 | ```kotlin 315 | var directory: File? = null 316 | set(value) { 317 | // … 318 | } 319 | ``` 320 | 321 | 只读属性可以在一行内时可以使用更简短的句式。 322 | 323 | ```kotlin 324 | val defaultExtension: String get() = "kt" 325 | ``` 326 | 327 | 328 | ## 空白 329 | 330 | ### 纵向 331 | 332 | 一个单空行应该出现在: 333 | 334 | 1. 在类的连续成员 _之间_:属性、构造函数、方法、嵌套类等等。 335 | 336 | * **例外**: 两个连续属性之间(没有其它代码)的空行是可选的。如果需要,根据创建属性的逻辑分类的需求使用这种空白行,将属性和其后面的属性相连。 337 | 338 | * **例外**: 枚举常量之间的空白行如下所示。 339 | 340 | 2. 表达式之间,_根据需要_ 用来组织代码成一节逻辑集。 341 | 342 | 3. _可选_ :在 方法的第一行/类的第一个成员 前或 类的最后一个成员 后使用空行。 343 | 344 | 4. 按照本文档其它部分的要求(例如 ["结构"](#结构) 部分). 345 | 346 | 允许多行连续的空白行,既不会鼓励也不要求。 347 | 348 | ### 横向 349 | 350 | 除了语言或其它风格规范的要求外,除文字、注释和 KDoc 外,一个 ASCII 空格字符也应该只出现在以下位置: 351 | 352 | 1. 将任何一个保留字(如 `if`、`for` 或 `catch`)和同一行内一个头部括号 (`(`) 分隔开来。 353 | 354 | ```kotlin 355 | // 错误的! 356 | for(i in 0..1) { 357 | } 358 | ``` 359 | ```kotlin 360 | // 可以 361 | for (i in 0..1) { 362 | } 363 | ``` 364 | 365 | 2. 将任何一个保留字(如 `else` 或 `catch`)和同一行内一个尾部花括号 (`}`) 分割开来。 366 | 367 | ```kotlin 368 | // 错误的! 369 | }else { 370 | } 371 | ``` 372 | ```kotlin 373 | // 可以 374 | } else { 375 | } 376 | ``` 377 | 378 | 3. 在任何头部花括号前 (`{`). 379 | 380 | ```kotlin 381 | // 错误的! 382 | if (list.isEmpty()){ 383 | } 384 | ``` 385 | ```kotlin 386 | // 可以 387 | if (list.isEmpty()) { 388 | } 389 | ``` 390 | 391 | 4. 任何二元运算符的两边 392 | 393 | ```kotlin 394 | // 错误的! 395 | val two = 1+1 396 | ``` 397 | ```kotlin 398 | // 可以 399 | val two = 1 + 1 400 | ``` 401 | 402 | 这也适用于下面的 "运算符型" 符号: 403 | 404 | * 一个 Lambda 表达式的箭头 (`->`) 405 | 406 | ```kotlin 407 | // 错误的! 408 | ints.map { value->value.toString() } 409 | ``` 410 | ```kotlin 411 | // 可以 412 | ints.map { value -> value.toString() } 413 | ``` 414 | 415 | 但不适用于: 416 | 417 | * 方法引用的两个冒号 (`::`) 418 | 419 | ```kotlin 420 | // 错误的! 421 | val toString = Any :: toString 422 | ``` 423 | ```kotlin 424 | // 可以 425 | val toString = Any::toString 426 | ``` 427 | 428 | * 分隔符句号 (`.`). 429 | 430 | ```kotlin 431 | // 错误的! 432 | it . toString() 433 | ``` 434 | ```kotlin 435 | // 可以 436 | it.toString() 437 | ``` 438 | 439 | * 范围运算符 (`..`). 440 | 441 | ```kotlin 442 | // 错误的! 443 | for (i in 1 .. 4) print(i) 444 | ``` 445 | ```kotlin 446 | // 可以 447 | for (i in 1..4) print(i) 448 | ``` 449 | 450 | 5. 只有在用于基类/接口的类声明或在 [泛型约束](https://kotlinlang.org/docs/reference/generics.html#generic-constraints) 的 `where` 子句中使用时的冒号前 451 | 452 | ```kotlin 453 | // 错误的! 454 | class Foo: Runnable 455 | ``` 456 | ```kotlin 457 | // 正确 458 | class Foo : Runnable 459 | ``` 460 | 461 | ```kotlin 462 | // 错误的 463 | fun max(a: T, b: T) 464 | ``` 465 | ```kotlin 466 | // 正确 467 | fun max(a: T, b: T) 468 | ``` 469 | 470 | ```kotlin 471 | // 错误的 472 | fun max(a: T, b: T) where T: Comparable 473 | ``` 474 | ```kotlin 475 | // 正确 476 | fun max(a: T, b: T) where T : Comparable 477 | ``` 478 | 479 | 6. 在一个逗号 (`,`) 或冒号 (`:`) 之后. 480 | 481 | ```kotlin 482 | // 错误的! 483 | val oneAndTwo = listOf(1,2) 484 | ``` 485 | ```kotlin 486 | // 正确 487 | val oneAndTwo = listOf(1, 2) 488 | ``` 489 | 490 | ```kotlin 491 | // 错误的! 492 | class Foo :Runnable 493 | ``` 494 | ```kotlin 495 | // 正确 496 | class Foo : Runnable 497 | ``` 498 | 499 | 7. 开始行尾注释的双斜杠 (`//`) 的两边,这里允许多个空格但不作要求。 500 | 501 | ```kotlin 502 | // 错误的! 503 | var debugging = false//默认禁用 504 | ``` 505 | ```kotlin 506 | // 正确 507 | var debugging = false // 默认禁用 508 | ``` 509 | 510 | 这条规则不能解释为要求或禁止行首/行末的额外空格,它只涉及行内的空格。 511 | 512 | 513 | ## 具体构造 514 | 515 | ### 枚举常量类 516 | 517 | 没有函数和文档的枚举里它的常量可以选择单行格式。 518 | 519 | ```kotlin 520 | enum class Answer { YES, NO, MAYBE } 521 | ``` 522 | 523 | 当一个枚举常量放在不同的行时,它们之间不需要空行,除非定义了一个代码体。 524 | 525 | ```kotlin 526 | enum class Answer { 527 | YES, 528 | NO, 529 | 530 | MAYBE { 531 | override fun toString() = """¯\_(ツ)_/¯""" 532 | } 533 | } 534 | ``` 535 | 536 | 因为枚举类也是类,其它用于格式类的规范也适用。 537 | 538 | ### 注解 539 | 540 | 成员或类型的注解要放置在注解结构前的不同行中。 541 | 542 | ```kotlin 543 | @Retention(SOURCE) 544 | @Target(FUNCTION, PROPERTY_SETTER, FIELD) 545 | annotation class Global 546 | ``` 547 | 548 | 没有参数的注解可以放在单行内。 549 | 550 | ```kotlin 551 | @JvmField @Volatile 552 | var disposable: Disposable? = null 553 | ``` 554 | 555 | 只有单个没有参数的注释可以和声明放在同一行。 556 | 557 | ```kotlin 558 | @Volatile var disposable: Disposable? = null 559 | 560 | @Test fun selectAll() { 561 | // … 562 | } 563 | ``` 564 | 565 | ### 隐式返回/属性类型 566 | 567 | 如果一个表达式函数体或者一个属性初始化是一个标量值(Scalar value)或者返回类型可以从函数体中清楚地推断出来时,可以忽略类型。 568 | 569 | ```kotlin 570 | override fun toString(): String = "嘿" 571 | // becomes 572 | override fun toString() = "嘿" 573 | ``` 574 | ```kotlin 575 | private val ICON: Icon = IconLoader.getIcon("/icons/kotlin.png") 576 | // becomes 577 | private val ICON = IconLoader.getIcon("/icons/kotlin.png") 578 | ``` 579 | 580 | 在编写库时,在公开 API 部分中保持显式类型声明。 581 | 582 | 583 | # 命名 584 | 585 | 标识符只使用 ASCII 字母、数字和在下面指出的少数情况。因此每个有效的标识符名称都由 `\w+` 正则表达式匹配。 586 | 587 | 除了["返回值属性"](#返回值属性)以外,不使用类似 `name_`、`mName`、`s_name`、`kName` 这样的特殊前缀或后缀。 588 | 589 | 590 | ## 包名 591 | 592 | 包名应该全部都是小写,且连续的单词连在一起(不使用下划线)。 593 | 594 | ```kotlin 595 | // 正确 596 | package com.example.deepspace 597 | // 错误的! 598 | package com.example.deepSpace 599 | // 错误的! 600 | package com.example.deep_space 601 | ``` 602 | 603 | 604 | ## 类名 605 | 606 | 类名使用 PascalCase 法命名且通常为名词或名词短语。比如,`Character` 或 `ImmutableList`。接口名字可以是名词或名词短语(比如 `List`),但有时也可以是形容词或者形容词短语(比如 `Readable`)。 607 | 608 | 测试类使用要测试的类的名字作为开头,并以 `Test` 结尾。比如 `HashTest` 或 `HashIntegrationTest`。 609 | 610 | 611 | ## 函数名 612 | 613 | 函数名使用 camelCase(驼峰)法命名且通常为动词或者动词短语。比如 `sendMessage` 或 `stop`。 614 | 615 | 下划线被允许在测试函数的名字中出现用于分隔逻辑组件的名称。 616 | 617 | ```kotlin 618 | @Test fun pop_emptyStack() { 619 | // … 620 | } 621 | ``` 622 | 623 | 624 | ## 常量名 625 | 626 | 常量名使用 UPPER_SNAKE_CASE 命名法: 全部大写、用下划线分隔。但究竟什么 _才是_ 一个常量? 627 | 628 | 常量是一个没有自定义 `get` 方法的 `val` 属性,且它的值完全不可变、它的方法没有可检测的副作用。这包括了不可变类型、使用不可变类型的不可变集合和被标记为 `const` 的标量/字符串。如果任何一个实例可观察到的状态能够被改变,就不是常量了,仅在意愿上不改变对象是不足以符合条件的。 629 | 630 | ```kotlin 631 | const val NUMBER = 5 632 | val NAMES = listOf("艾莉丝", "鲍勃") 633 | val AGES = mapOf("艾莉丝" to 35, "鲍勃" to 32) 634 | val COMMA_JOINER = Joiner.on(',') // Joiner 是不可变的 635 | val EMPTY_ARRAY = arrayOf() 636 | ``` 637 | 638 | 这些名字通常是名词或名词短语。 639 | 640 | 常量值只可以在一个 `object` 或者顶级中声明定义。否则,满足常量定义的值在类中定义必须使用非常量的名字。 641 | 642 | 作为标量的常量必须使用 [`const` 标识符](http://kotlinlang.org/docs/reference/properties.html#compile-time-constants). 643 | 644 | 645 | ## 变量(非常量)名 646 | 647 | 非常量名字用 camelCase(驼峰)法命名。这些适用于实例属性、本地属性和参数名。 648 | 649 | ```kotlin 650 | val variable = "var" 651 | val nonConstScalar = "non-const" 652 | val mutableCollection: MutableSet = HashSet() 653 | val mutableElements = listOf(mutableInstance) 654 | val mutableValues = mapOf("電" to mutableInstance, "天津風" to mutableInstance2) 655 | val logger = Logger.getLogger(MyClass::class.java.name) 656 | val nonEmptyArray = arrayOf("这些", "可以", "改变") 657 | ``` 658 | 659 | 这些名字通常是名词或名词短语。 660 | 661 | ### 返回值属性 662 | 663 | 当一个[返回值属性](https://kotlinlang.org/docs/reference/properties.html#backing-properties)需要时,其名字应该和实际属性的名字完全匹配,除了前缀是下划线。 664 | 665 | ```kotlin 666 | private var _table: Map? = null 667 | 668 | val table: Map 669 | get() { 670 | if (_table == null) { 671 | _table = HashMap() 672 | } 673 | return _table ?: throw AssertionError() 674 | } 675 | ``` 676 | 677 | 678 | ## 类型变量名 679 | 680 | 每个类型变量都以两种风格其中之一进行命名: 681 | 682 | 1. 一个大写字母,可以跟着一个数字。(比如 `E`、`T`、`X`、`T2`) 683 | 2. 用于类的形式的名字跟随着一个大写字母 `T` (比如 `RequestT`、`FooBarT`) 684 | 685 | 686 | ## 驼峰命名 687 | 688 | 有时,有多种合理的方法将英文词语转换为驼峰命名,比如缩略词或像 "IPv6" 或 "iOS" 等不寻常的词语结构。为了提高可预测性、降低理解难度,使用以下的方案。 689 | 690 | 从名字的散文形式(the prose form)开始: 691 | 692 | 1. 将词语转换到简单的 ASCII 并移除任何撇号。比如 "Müller's algorithm" 可以变成 "Muellers algorithm"。 693 | 694 | 2. 将这个结果分割成单词,分割空格和任何剩下的标点符号(通常是连接字符)。 695 | 696 | * _推荐_: 如果任何单词已经有了广泛使用的公认驼峰命名案例,则将其分割成它的组成部分(比如 "AdWords" 变成 "ad words")。请注意像 "iOS" 这样的单词本身并不是真正的驼峰命名例子,其违背了 _任何_ 案例,因此这个建议不适用。 697 | 698 | 3. 现在全部字母小写(包括首字母缩略词),然后只对第一个字符大写: 699 | 700 | * ...每个单词都产生驼峰,或 701 | 702 | * ...除了第一个,每个单词都产生驼峰 703 | 704 | 4. 最终,组合所有词成一个标识符。 705 | 706 | 请注意,原词语的原样式几乎完全被忽略。 707 | 708 | | **散文形式(Prose form)** | **正确** | **错误** | 709 | |----------------------------|-----------------------------------------|---------------------| 710 | | "XML Http Request" | `XmlHttpRequest` | `XMLHTTPRequest` | 711 | | "new customer ID" | `newCustomerId` | `newCustomerID` | 712 | | "inner stopwatch" | `innerStopwatch` | `innerStopWatch` | 713 | | "supports IPv6 on iOS" | `supportsIpv6OnIos` | `supportsIPv6OnIOS` | 714 | | "YouTube importer" | `YouTubeImporter`
`YoutubeImporter`* | | 715 | 716 | (_*可接受使用,但不会推荐。_) 717 | 718 | **注意**: 有些英文单词是不明确地使用连接字符:比如 "nonempty" 和 "non-empty" 都是对的,所以方法名 `checkNonempty` 和 `checkNonEmpty` 都似乎是正确的。 719 | 720 | 721 | # 文档 722 | 723 | 724 | ## 格式 725 | 726 | KDoc 区块的基本格式如下: 727 | 728 | ```kotlin 729 | /** 730 | * 多行 KDoc 文本在这里写, 731 | * 通常这样包裹着…… 732 | */ 733 | fun method(arg: String) { 734 | // … 735 | } 736 | ``` 737 | 738 | ...或者像这样的单行注释: 739 | 740 | ```kotlin 741 | /** 一个非常短的 KDoc。 */ 742 | ``` 743 | 744 | 基本格式总是可以接受的。当整个 KDoc 区块(包括注释标记)可以放在一行上时,可以代替单行形式。请注意,这只适用于没有区块注释(例如 `@return`)的情况。 745 | 746 | ### 段落 747 | 748 | 一个空白行——即只包括对齐的前置星号(`*`)的行在段落之间出现,并在区块标记组(如果存在)前出现。 749 | 750 | ### 区块标签 751 | 752 | 任何使用的标准“区块标签”都按照 `@constructor`、`@receiver`、`@param`、`@property`、`@return`、`@throws`、`@see` 的顺序且都不会空的描述出现。当一个区块标记不适合在单行时,连续行将从 `@` 的位置缩进 8 个空格。 753 | 754 | 755 | ## 概要片段 756 | 757 | 每个 KDoc 区块以一个简短的概要片段开始,这个片段非常重要:它是文本的唯一部分出现在某些上下文中,例如类和方法索引。 758 | 759 | 它是一个片段——一个名词短语或动词短语,而不是一个完整的句子。其不以 "``A `Foo` is a…``" 或 "`This method returns…`" 开头,也不必形成一个完整的祈使句,如 "`Save the record.`"。然而,这个片段是大写开头且有标点,就好像是一个完整的句子一样。 760 | 761 | 762 | ## 用法 763 | 764 | 每个 `public` 类型、`public` 或 `protected` 的成员都至少有 KDoc,除了下面举出的例子。 765 | 766 | ### 例外: 无需解释的方法 767 | 768 | 对于像 `getFoo` 这样“简单、明显”的方法和像 `foo` 这样的属性,KDoc 是可选的。在真的没有什么可说的时候,就是 "Returns the foo"。 769 | 770 | 引用这个例外是不恰当的,因为我们可能忽略读者通常需要知道的相关信息。例如一个叫 `getCanonicalName` 的方法或者叫 `canonicalName` 的属性,如果通常读者可能不知道术语的 `canonical name` 的意思的话,就不要忽略它的文档(合理地是解释 `/** Returns the canonical name. */`)! 771 | 772 | ### 例外: 重载 773 | 774 | KDoc 并不是总出现在重载的 super 类型方法。 775 | --------------------------------------------------------------------------------