├── .dockerignore ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── app.py ├── command ├── docker-build.sh ├── docker-update.sh ├── start-debug.sh └── start.sh ├── config.example.json ├── index.md ├── loader.py ├── render.py ├── static ├── jquery.min.js ├── mdui │ ├── css │ │ └── mdui.min.css │ ├── fonts │ │ └── roboto │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-Black.woff │ │ │ ├── Roboto-Black.woff2 │ │ │ ├── Roboto-BlackItalic.woff │ │ │ ├── Roboto-BlackItalic.woff2 │ │ │ ├── Roboto-Bold.woff │ │ │ ├── Roboto-Bold.woff2 │ │ │ ├── Roboto-BoldItalic.woff │ │ │ ├── Roboto-BoldItalic.woff2 │ │ │ ├── Roboto-Light.woff │ │ │ ├── Roboto-Light.woff2 │ │ │ ├── Roboto-LightItalic.woff │ │ │ ├── Roboto-LightItalic.woff2 │ │ │ ├── Roboto-Medium.woff │ │ │ ├── Roboto-Medium.woff2 │ │ │ ├── Roboto-MediumItalic.woff │ │ │ ├── Roboto-MediumItalic.woff2 │ │ │ ├── Roboto-Regular.woff │ │ │ ├── Roboto-Regular.woff2 │ │ │ ├── Roboto-RegularItalic.woff │ │ │ ├── Roboto-RegularItalic.woff2 │ │ │ ├── Roboto-Thin.woff │ │ │ ├── Roboto-Thin.woff2 │ │ │ ├── Roboto-ThinItalic.woff │ │ │ └── Roboto-ThinItalic.woff2 │ ├── icons │ │ └── material-icons │ │ │ ├── LICENSE.txt │ │ │ ├── MaterialIcons-Regular.ijmap │ │ │ ├── MaterialIcons-Regular.woff │ │ │ └── MaterialIcons-Regular.woff2 │ └── js │ │ └── mdui.min.js └── style.css └── templates ├── errorpage.html ├── index.html ├── layout.html ├── problem.html └── problemset.html /.dockerignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | source 3 | source.zip 4 | source-master 5 | 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # pyenv 81 | .python-version 82 | 83 | # celery beat schedule file 84 | celerybeat-schedule 85 | 86 | # SageMath parsed files 87 | *.sage.py 88 | 89 | # Environments 90 | .env 91 | .venv 92 | env/ 93 | venv/ 94 | ENV/ 95 | env.bak/ 96 | venv.bak/ 97 | 98 | # Spyder project settings 99 | .spyderproject 100 | .spyproject 101 | 102 | # Rope project settings 103 | .ropeproject 104 | 105 | # mkdocs documentation 106 | /site 107 | 108 | # mypy 109 | .mypy_cache/ 110 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | source 3 | source.zip 4 | config.json 5 | 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # pyenv 81 | .python-version 82 | 83 | # celery beat schedule file 84 | celerybeat-schedule 85 | 86 | # SageMath parsed files 87 | *.sage.py 88 | 89 | # Environments 90 | .env 91 | .venv 92 | env/ 93 | venv/ 94 | ENV/ 95 | env.bak/ 96 | venv.bak/ 97 | 98 | # Spyder project settings 99 | .spyderproject 100 | .spyproject 101 | 102 | # Rope project settings 103 | .ropeproject 104 | 105 | # mkdocs documentation 106 | /site 107 | 108 | # mypy 109 | .mypy_cache/ 110 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.7 2 | COPY . /app 3 | WORKDIR /app 4 | RUN bash -c 'if [[ ! -f "/app/config.json" ]]; then cp /app/config.example.json /app/config.json; fi' 5 | RUN bash -c 'pip3 install --default-timeout=3600 flask markdown -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com' 6 | EXPOSE 8080 7 | CMD sh command/start.sh -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # oi-archive-python 2 | 3 | ### Usage 4 | 5 | ```shell 6 | # Require Python3.6+ and pip3 installed. 7 | git clone https://github.com/oi-archive/source.git source 8 | pip3 install flask markdown 9 | sh command/start.sh 10 | ``` 11 | 12 | or 13 | 14 | ```shell 15 | # Require Docker installed. 16 | git clone https://github.com/oi-archive/source.git source 17 | docker image build . -t oi-archive 18 | # and run container with 19 | docker container run --name oi-archive -d -p 8080:8080 -v $PWD/source:/app/source -it oi-archive 20 | ``` 21 | 22 | 23 | ### Demo 24 | 25 | ![](https://i.loli.net/2019/10/02/d9EQPpqCDIGXwah.png) 26 | 27 | ![](https://i.loli.net/2019/10/02/8guPhLr6OEDsC72.png) 28 | 29 | 30 | 31 | ![](https://i.loli.net/2019/10/02/nSde1pLvZWNPFlJ.jpg) -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import re 2 | import json 3 | 4 | from flask import Flask 5 | from flask import render_template, send_from_directory 6 | app = Flask(__name__) 7 | 8 | from render import render, render_markdown 9 | from loader import Problem, ProblemInfo, OnlineJudge 10 | import loader 11 | loader.init() 12 | loader.init_data() 13 | from loader import data, config, oj_list 14 | 15 | @app.errorhandler(404) 16 | def page_404(e): 17 | return render_template('errorpage.html', **data, 18 | error_code = 404, 19 | error_info = 'Not Found' 20 | ), 404 21 | 22 | @app.errorhandler(500) 23 | def page_500(e): 24 | return render_template('errorpage.html', 25 | error_code = 500, 26 | error_info = 'Internal Server Error' 27 | ), 500 28 | 29 | @app.route('/source/') 30 | def source_file(filename): 31 | return send_from_directory('source', filename) 32 | 33 | @app.route('/favicon.png') 34 | def favicon_file(): 35 | return send_from_directory('.', 'favicon.png') 36 | 37 | @app.route('/') 38 | def index(): 39 | return render_template('index.html', **data, 40 | content = render_markdown(open('index.md', 'r+', encoding='utf8').read()), 41 | style = 'index' 42 | ) 43 | 44 | @app.route('/problemset/') 45 | def problemset(oj): 46 | if not oj in oj_list.keys(): 47 | return page_404(None) 48 | return render_template('problemset.html', **data, 49 | oj = oj_list[oj], 50 | problemset = oj_list[oj].problemlist.values(), 51 | style = 'problemset' 52 | ) 53 | 54 | @app.route('/problem//') 55 | def problem(oj, pid): 56 | if not oj in oj_list.keys() or not pid in oj_list[oj].problemlist.keys(): 57 | return page_404(None) 58 | info = json.load(open('source/{oj}/{pid}/main.json'.format(oj=oj, pid=pid), encoding='utf8')) 59 | plain = open('source/{oj}/{pid}/description.md'.format(oj=oj, pid=pid), 'r+', encoding='utf8').read() 60 | problem_info = ProblemInfo( 61 | time = info['time'], 62 | memory = info['memory'], 63 | judge = info['judge'], 64 | url = info['url'], 65 | title = info['title'], 66 | description_type = info['description_type'] 67 | ) 68 | problem_data = dict() 69 | for string in ('\n' + plain).split('\n# '): 70 | key = string.find('\n') 71 | if key == -1: 72 | continue 73 | title = string[0:key] 74 | statement = render(string[key:], problem_info.description_type, oj) 75 | if re.sub(r'\s', '', statement) == '': 76 | continue 77 | problem_data[title] = statement 78 | return render_template('problem.html', **data, 79 | oj = oj_list[oj], 80 | problem = oj_list[oj].problemlist[pid], 81 | problem_info = problem_info, 82 | problem_data = problem_data, 83 | style = 'problem' 84 | ) 85 | 86 | @app.route('/search/') 87 | def search(input): 88 | keywords = re.findall(r'\w+', input.upper()) 89 | problemset = [] 90 | for oj in oj_list.values(): 91 | for problem in oj.problemlist.values(): 92 | flag = True 93 | for keyword in keywords: 94 | if not problem.search(keyword): 95 | flag = False 96 | break 97 | if flag: 98 | problemset.append(problem) 99 | return render_template('problemset.html', **data, 100 | keywords = keywords, 101 | problemset = problemset, 102 | style = 'search' 103 | ) 104 | 105 | if __name__ == '__main__': 106 | app.run() -------------------------------------------------------------------------------- /command/docker-build.sh: -------------------------------------------------------------------------------- 1 | docker stop oi-archive && docker rm oi-archive 2 | git pull 3 | if [ -d "./source" ]; then 4 | cd ./source 5 | git pull 6 | cd ../ 7 | fi 8 | docker image build . -t oi-archive 9 | docker container run --name oi-archive -d -p 8080:8080 -v $PWD/source:/app/source -it oi-archive -------------------------------------------------------------------------------- /command/docker-update.sh: -------------------------------------------------------------------------------- 1 | if [ -d "./source" ]; then 2 | cd ./source 3 | git pull 4 | cd ../ 5 | fi 6 | docker exec -it oi-archive git pull -------------------------------------------------------------------------------- /command/start-debug.sh: -------------------------------------------------------------------------------- 1 | FLASK_APP=app.py FLASK_DEBUG=1 python3 -m flask run --port 8080 -------------------------------------------------------------------------------- /command/start.sh: -------------------------------------------------------------------------------- 1 | FLASK_APP=app.py python3 -m flask run --host 0.0.0.0 --port 8080 -------------------------------------------------------------------------------- /config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "oj": { 3 | "loj": { 4 | "name": "LOJ", 5 | "enable": true, 6 | "submit_link": "https://loj.ac/problem/{pid}#submit_code", 7 | "testdata_link": "https://loj.ac/problem/{pid}/testdata", 8 | "submission_link": "https://loj.ac/submissions?problem_id={pid}", 9 | "statistics_link": "https://loj.ac/problem/{pid}/statistics/shortest", 10 | "discussion_link": "https://loj.ac/discussion/problem/{pid}" 11 | }, 12 | "uoj": { 13 | "name": "UOJ", 14 | "enable": true, 15 | "submit_link": "http://uoj.ac/problem/{pid}#tab-submit-answer", 16 | "statistics_link": "http://uoj.ac/problem/{pid}/statistics", 17 | "submission_link": "http://uoj.ac/submissions?problem_id={pid}" 18 | }, 19 | "bzoj": { 20 | "name": "BZOJ", 21 | "enable": true, 22 | "testdata_link": "https://darkbzoj.tk/data/{pid}.zip" 23 | }, 24 | "guoj": { 25 | "name": "GuOJ", 26 | "enable": true, 27 | "submit_link": "https://guoj.icu/problem/{pid}#submit_code", 28 | "testdata_link": "https://guoj.icu/problem/{pid}/testdata", 29 | "submission_link": "https://guoj.icu/submissions?problem_id={pid}", 30 | "statistics_link": "https://guoj.icu/problem/{pid}/statistics/shortest", 31 | "discussion_link": "https://guoj.icu/discussion/problem/{pid}" 32 | }, 33 | "seuoj": { 34 | "name": "seuOJ", 35 | "enable": true, 36 | "submit_link": "https://oj.seucpc.club/problem/{pid}#submit_code", 37 | "testdata_link": "https://oj.seucpc.club/problem/{pid}/testdata", 38 | "submission_link": "https://oj.seucpc.club/submissions?problem_id={pid}", 39 | "statistics_link": "https://oj.seucpc.club/problem/{pid}/statistics/shortest", 40 | "discussion_link": "https://oj.seucpc.club/discussion/problem/{pid}" 41 | }, 42 | "tsinsen": { 43 | "name": "清橙", 44 | "enable": true, 45 | "discussion_link": "http://www.tsinsen.com/Forum/Index.page?gpid={pid}" 46 | }, 47 | "cogs": { 48 | "name": "COGS", 49 | "enable": false 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | OI-Archive 是一个 OI 题目存档计划,类似于 Wayback Machine 之于 Internet,OI-Archive 的目标是尽量长久的保存在 OI 中出现过的题目。 2 | 3 | [oi-archive-python](https://github.com/memset0/oi-archive-python) 项目是 oi-archive 的一个第三方网页端,目前由 memset0 维护。 4 | 5 | #### 特性 6 | 7 | * Material Design 8 | * 自适应页面 9 | * 暗黑模式 10 | * 关键词搜索 11 | 12 | #### 相关链接 13 | 14 | * 题库爬虫:[github.com/oi-archive/crawler](https://github.com/oi-archive/crawler) 15 | * 主数据集:[github.com/oi-archive/source](https://github.com/oi-archive/source) 16 | * 信息聚合:[github.com/oi-archive/oi-archive-rss](https://github.com/oi-archive/oi-archive-rss) -------------------------------------------------------------------------------- /loader.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | class Problem: 4 | def __init__(self, oj, oj_name, pid, title, order=-1): 5 | self.oj = oj 6 | self.oj_name = oj_name 7 | self.pid = pid 8 | self.title = title 9 | self.order = order 10 | def __str__(self): 11 | return self.title 12 | def search(self, keyword): 13 | keyword = keyword.upper() 14 | if keyword == self.oj.upper() or keyword == self.pid.upper() or keyword == self.oj.upper() + self.pid.upper(): 15 | return True 16 | if keyword in self.title.upper(): 17 | return True 18 | return False 19 | 20 | class ProblemInfo: 21 | def __init__(self, time, memory, judge, url, title, description_type): 22 | self.time = time 23 | self.memory = memory 24 | self.judge = judge 25 | self.url = url 26 | self.title = title 27 | self.description_type = description_type 28 | 29 | class OnlineJudge: 30 | def __init__(self, key, name, enable, problemlist, submit_link=None, testdata_link=None, submission_link=None, statistics_link=None, discussion_link=None): 31 | self.key = key 32 | self.name = name 33 | self.problemlist = problemlist 34 | self.submit_link = submit_link 35 | self.testdata_link = testdata_link 36 | self.submission_link = submission_link 37 | self.statistics_link = statistics_link 38 | self.discussion_link = discussion_link 39 | 40 | def init(): 41 | global config, oj_list 42 | config = json.load(open('config.json', encoding='utf8')) 43 | oj_list = dict() 44 | for oj_key, oj_data in config['oj'].items(): 45 | if not oj_data['enable']: 46 | continue 47 | problemlist = dict() 48 | for problem in json.load(open('source/{oj}/problemlist.json'.format(oj=oj_key))): 49 | problemlist[problem['pid']] = Problem( 50 | oj = oj_key, 51 | oj_name = oj_data['name'], 52 | pid = problem['pid'], 53 | title = problem['title'] 54 | ) 55 | oj_list[oj_key] = OnlineJudge(**oj_data, 56 | key = oj_key, 57 | problemlist = problemlist 58 | ) 59 | 60 | def init_data(): 61 | global data 62 | data = dict() 63 | data['config'] = config 64 | data['oj_list'] = oj_list -------------------------------------------------------------------------------- /render.py: -------------------------------------------------------------------------------- 1 | import re 2 | import markdown as markdown_lib 3 | 4 | def render_markdown(text): 5 | text = markdown_lib.markdown(text, extensions=['markdown.extensions.extra']) 6 | return text 7 | 8 | def render(text, type, oj): 9 | # 人类智慧 10 | if type == 'markdown': 11 | text = text.replace('\n* ', '\n\n* ') 12 | text = text.replace('\n- ', '\n\n- ') 13 | text = render_markdown(text) 14 | if oj == 'tsinsen': 15 | text = text.replace('
', '') 16 | data = re.findall('
[\s\S]*?
', text) 17 | for item in data: 18 | text = text.replace(item, '
' + item[20:-6].replace('
', '') + '
') 19 | elif oj == 'bzoj': 20 | text = text.replace('
', '
')
21 | 		text = text.replace('
', '') 22 | text = text.replace('
\n', '
') 23 | text = text.replace('

', '') 24 | text = re.sub('

[\s]*', '

', text) 25 | text = text.replace('src="source/', 'src="/source/') 26 | text = re.sub('

\n*', '
', text)
27 | 	text = re.sub('\n*
', '
', text) 28 | text = re.sub('', '
', text)
29 | 	text = re.sub('
', '
', text) 30 | text = re.sub('', '
', text) 31 | text = re.sub('
', '
', text) 32 | return text -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Black.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Black.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-BlackItalic.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-BlackItalic.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-BoldItalic.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-BoldItalic.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-LightItalic.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-LightItalic.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-MediumItalic.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-MediumItalic.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-RegularItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-RegularItalic.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-RegularItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-RegularItalic.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-ThinItalic.woff -------------------------------------------------------------------------------- /static/mdui/fonts/roboto/Roboto-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/fonts/roboto/Roboto-ThinItalic.woff2 -------------------------------------------------------------------------------- /static/mdui/icons/material-icons/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public licenses. 379 | Notwithstanding, Creative Commons may elect to apply one of its public 380 | licenses to material it publishes and in those instances will be 381 | considered the "Licensor." Except for the limited purpose of indicating 382 | that material is shared under a Creative Commons public license or as 383 | otherwise permitted by the Creative Commons policies published at 384 | creativecommons.org/policies, Creative Commons does not authorize the 385 | use of the trademark "Creative Commons" or any other trademark or logo 386 | of Creative Commons without its prior written consent including, 387 | without limitation, in connection with any unauthorized modifications 388 | to any of its public licenses or any other arrangements, 389 | understandings, or agreements concerning use of licensed material. For 390 | the avoidance of doubt, this paragraph does not form part of the public 391 | licenses. 392 | 393 | Creative Commons may be contacted at creativecommons.org. 394 | -------------------------------------------------------------------------------- /static/mdui/icons/material-icons/MaterialIcons-Regular.ijmap: -------------------------------------------------------------------------------- 1 | {"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} -------------------------------------------------------------------------------- /static/mdui/icons/material-icons/MaterialIcons-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/icons/material-icons/MaterialIcons-Regular.woff -------------------------------------------------------------------------------- /static/mdui/icons/material-icons/MaterialIcons-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memset0/oi-archive-python/fa4f61749ffdba5d73550c4daeb7602d4a0a2922/static/mdui/icons/material-icons/MaterialIcons-Regular.woff2 -------------------------------------------------------------------------------- /static/mdui/js/mdui.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * mdui v0.4.3 (https://mdui.org) 3 | * Copyright 2016-2019 zdhxiong 4 | * Licensed under MIT 5 | */ 6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.mdui=e()}(this,function(){"use strict";var a,d={};a=0,window.requestAnimationFrame||(window.requestAnimationFrame=window.webkitRequestAnimationFrame,window.cancelAnimationFrame=window.webkitCancelAnimationFrame),window.requestAnimationFrame||(window.requestAnimationFrame=function(t,e){var n=(new Date).getTime(),i=Math.max(0,16.7-(n-a)),o=window.setTimeout(function(){t(n+i)},i);return a=n+i,o}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)});var n,g=function(){var c=function(t){for(var e=0;e"===n[n.length-1]){var i="div";0===n.indexOf(":~]/)?document.querySelectorAll(t):[document.getElementById(t.slice(1))],r=0;r"===t[t.length-1])e=v(t).get();else{var n=document.createElement("div");n.innerHTML=t,e=[].slice.call(n.childNodes)}return 1===a&&e.reverse(),this.each(function(n,i){x(e,function(t,e){o&&0').appendTo(document.body).reflow().css("z-index",t));var n=e.data("overlay-level")||0;return e.data("overlay-level",++n).addClass("mdui-overlay-show")},hideOverlay:function(t){var e=g(".mdui-overlay");if(e.length){var n=t?1:e.data("overlay-level");1i.lastScrollY?"down":"up",n=Math.abs(t-i.lastScrollY)>=i.options.tolerance[e];t>i.lastScrollY&&t>=i.options.offset&&n?i.unpin():(t"};function n(t){this.$table=g(t).eq(0),this.$table.length&&this.init()}n.prototype.init=function(){var t=this;t.$thRow=t.$table.find("thead tr"),t.$tdRows=t.$table.find("tbody tr"),t.$tdCheckboxs=g(),t.selectable=t.$table.hasClass("mdui-table-selectable"),t.selectedRow=0,t._updateThCheckbox(),t._updateTdCheckbox(),t._updateNumericCol()},n.prototype._updateThCheckboxStatus=function(){var t=this,e=t.$thCheckbox[0];e.checked=t.selectedRow===t.$tdRows.length,e.indeterminate=t.selectedRow&&t.selectedRow!==t.$tdRows.length},n.prototype._updateTdCheckbox=function(){var n=this;n.$tdRows.each(function(){var t=g(this);if(t.find(".mdui-table-cell-checkbox").remove(),n.selectable){var e=g(i("td")).prependTo(t).find('input[type="checkbox"]');t.hasClass("mdui-table-row-selected")&&(e[0].checked=!0,n.selectedRow++),n._updateThCheckboxStatus(),e.on("change",function(){e[0].checked?(t.addClass("mdui-table-row-selected"),n.selectedRow++):(t.removeClass("mdui-table-row-selected"),n.selectedRow--),n._updateThCheckboxStatus()}),n.$tdCheckboxs=n.$tdCheckboxs.add(e)}})},n.prototype._updateThCheckbox=function(){var t=this;t.$thRow.find(".mdui-table-cell-checkbox").remove(),t.selectable&&(t.$thCheckbox=g(i("th")).prependTo(t.$thRow).find('input[type="checkbox"]').on("change",function(){var n=t.$thCheckbox[0].checked;t.selectedRow=n?t.$tdRows.length:0,t.$tdCheckboxs.each(function(t,e){e.checked=n}),t.$tdRows.each(function(t,e){g(e)[n?"addClass":"removeClass"]("mdui-table-row-selected")})}))},n.prototype._updateNumericCol=function(){var n,i,o=this;o.$thRow.find("th").each(function(e,t){n=g(t),o.$tdRows.each(function(){i=g(this);var t=n.hasClass("mdui-table-col-numeric")?"addClass":"removeClass";i.find("td").eq(e)[t]("mdui-table-col-numeric")})})},d.mutation(".mdui-table",function(){var t=g(this);t.data("mdui.table")||t.data("mdui.table",new n(t))}),d.updateTables=function(){g(arguments.length?arguments[0]:".mdui-table").each(function(){var t=g(this),e=t.data("mdui.table");e?e.init():t.data("mdui.table",new n(t))})}}(),c={delay:200,show:function(t,e){if(2!==t.button){var n,i=(n="touches"in t&&t.touches.length?t.touches[0]:t).pageX,o=n.pageY,a=e.offset(),s=i-a.left,r=o-a.top,d=e.innerHeight(),c=e.innerWidth(),u=Math.max(Math.pow(Math.pow(d,2)+Math.pow(c,2),.5),48),l="translate3d("+(c/2-s)+"px, "+(d/2-r)+"px, 0) scale(1)";g('
').data("translate",l).prependTo(e).reflow().transform(l)}},hide:function(t,e){var n=g(e||this);n.children(".mdui-ripple-wave").each(function(){!function(t){if(!t.length||t.data("isRemoved"))return;t.data("isRemoved",!0);var e=setTimeout(function(){t.remove()},400),n=t.data("translate");t.addClass("mdui-ripple-wave-fill").transform(n.replace("scale(1)","scale(1.01)")).transitionEnd(function(){clearTimeout(e),t.addClass("mdui-ripple-wave-out").transform(n.replace("scale(1)","scale(1.01)")),e=setTimeout(function(){t.remove()},700),setTimeout(function(){t.transitionEnd(function(){clearTimeout(e),t.remove()})},0)})}(g(this))}),n.off("touchmove touchend touchcancel mousemove mouseup mouseleave",c.hide)}},f.on(r.start,function(e){if(r.isAllow(e)&&(r.register(e),e.target!==document)){var n,t=g(e.target);if((n=t.hasClass("mdui-ripple")?t:t.parents(".mdui-ripple").eq(0)).length){if(n[0].disabled||null!==n.attr("disabled"))return;if("touchstart"===e.type){var i=!1,o=setTimeout(function(){o=null,c.show(e,n)},c.delay),a=function(t){o&&(clearTimeout(o),o=null,c.show(e,n)),i||(i=!0,c.hide(t,n))};n.on("touchmove",function(t){o&&(clearTimeout(o),o=null),a(t)}).on("touchend touchcancel",a)}else c.show(e,n),n.on("touchmove touchend touchcancel mousemove mouseup mouseleave",c.hide)}}}).on(r.unlock,r.register),h=function(t,e){return!("object"!=typeof t||null===t||void 0===t[e]||!t[e])&&t[e]},f.on("input focus blur",".mdui-textfield-input",{useCapture:!0},function(t){var e=t.target,n=g(e),i=t.type,o=n.val(),a=h(t.detail,"reInit"),s=h(t.detail,"domLoadedEvent"),r=n.attr("type")||"";if(!(0<=["checkbox","button","submit","range","radio","image"].indexOf(r))){var d=n.parent(".mdui-textfield");if("focus"===i&&d.addClass("mdui-textfield-focus"),"blur"===i&&d.removeClass("mdui-textfield-focus"),"blur"!==i&&"input"!==i||d[o&&""!==o?"addClass":"removeClass"]("mdui-textfield-not-empty"),d[e.disabled?"addClass":"removeClass"]("mdui-textfield-disabled"),"input"!==i&&"blur"!==i||s||e.validity&&d[e.validity.valid?"removeClass":"addClass"]("mdui-textfield-invalid-html5"),"textarea"===t.target.nodeName.toLowerCase()){var c=n.val(),u=!1;""===c.replace(/[\r\n]/g,"")&&(n.val(" "+c),u=!0),n.height("");var l=n.height(),f=e.scrollHeight;l / '+p+"
").appendTo(d),d.find(".mdui-textfield-counter-inputed").text(o.length.toString())),(d.find(".mdui-textfield-helper").length||d.find(".mdui-textfield-error").length||p)&&d.addClass("mdui-textfield-has-bottom")}}),f.on("click",".mdui-textfield-expandable .mdui-textfield-icon",function(){g(this).parents(".mdui-textfield").addClass("mdui-textfield-expanded").find(".mdui-textfield-input")[0].focus()}),f.on("click",".mdui-textfield-expanded .mdui-textfield-close",function(){g(this).parents(".mdui-textfield").removeClass("mdui-textfield-expanded").find(".mdui-textfield-input").val("")}),d.updateTextFields=function(){g(arguments.length?arguments[0]:".mdui-textfield").each(function(){g(this).find(".mdui-textfield-input").trigger("input",{reInit:!0})})},g(function(){d.mutation(".mdui-textfield",function(){g(this).find(".mdui-textfield-input").trigger("input",{domLoadedEvent:!0})})}),u=function(t){var e=t.data(),n=e.$track,i=e.$fill,o=e.$thumb,a=e.$input,s=e.min,r=e.max,d=e.disabled,c=e.discrete,u=e.$thumbText,l=a.val(),f=(l-s)/(r-s)*100;i.width(f+"%"),n.width(100-f+"%"),d&&(i.css("padding-right","6px"),n.css("padding-left","6px")),o.css("left",f+"%"),c&&u.text(l),t[0===parseFloat(f)?"addClass":"removeClass"]("mdui-slider-zero")},t=function(t){var e=g('
'),n=g('
'),i=g('
'),o=t.find('input[type="range"]'),a=o[0].disabled;t[a?"addClass":"removeClass"]("mdui-slider-disabled"),t.find(".mdui-slider-track").remove(),t.find(".mdui-slider-fill").remove(),t.find(".mdui-slider-thumb").remove(),t.append(e).append(n).append(i);var s,r=t.hasClass("mdui-slider-discrete");r&&(s=g(""),i.empty().append(s)),t.data({$track:e,$fill:n,$thumb:i,$input:o,min:o.attr("min"),max:o.attr("max"),disabled:a,discrete:r,$thumbText:s}),u(t)},e='.mdui-slider input[type="range"]',f.on("input change",e,function(){var t=g(this).parent();u(t)}).on(r.start,e,function(t){r.isAllow(t)&&(r.register(t),this.disabled||g(this).parent().addClass("mdui-slider-focus"))}).on(r.end,e,function(t){r.isAllow(t)&&(this.disabled||g(this).parent().removeClass("mdui-slider-focus"))}).on(r.unlock,e,r.register),d.updateSliders=function(){g(arguments.length?arguments[0]:".mdui-slider").each(function(){t(g(this))})},g(function(){d.mutation(".mdui-slider",function(){t(g(this))})}),d.Fab=function(){var o={trigger:"hover"};function t(t,e){var n=this;if(n.$fab=g(t).eq(0),n.$fab.length){var i=n.$fab.data("mdui.fab");if(i)return i;n.options=g.extend({},o,e||{}),n.state="closed",n.$btn=n.$fab.find(".mdui-fab"),n.$dial=n.$fab.find(".mdui-fab-dial"),n.$dialBtns=n.$dial.find(".mdui-fab"),"hover"===n.options.trigger&&(n.$btn.on("touchstart mouseenter",function(){n.open()}),n.$fab.on("mouseleave",function(){n.close()})),"click"===n.options.trigger&&n.$btn.on(r.start,function(){n.open()}),f.on(r.start,function(t){g(t.target).parents(".mdui-fab-wrapper").length||n.close()})}}return t.prototype.open=function(){var n=this;"opening"!==n.state&&"opened"!==n.state&&(n.$dialBtns.each(function(t,e){e.style["transition-delay"]=e.style["-webkit-transition-delay"]=15*(n.$dialBtns.length-t)+"ms"}),n.$dial.css("height","auto").addClass("mdui-fab-dial-show"),n.$btn.find(".mdui-fab-opened").length&&n.$btn.addClass("mdui-fab-opened"),n.state="opening",p("open","fab",n,n.$fab),n.$dialBtns.eq(0).transitionEnd(function(){n.$btn.hasClass("mdui-fab-opened")&&(n.state="opened",p("opened","fab",n,n.$fab))}))},t.prototype.close=function(){var t=this;"closing"!==t.state&&"closed"!==t.state&&(t.$dialBtns.each(function(t,e){e.style["transition-delay"]=e.style["-webkit-transition-delay"]=15*t+"ms"}),t.$dial.removeClass("mdui-fab-dial-show"),t.$btn.removeClass("mdui-fab-opened"),t.state="closing",p("close","fab",t,t.$fab),t.$dialBtns.eq(-1).transitionEnd(function(){t.$btn.hasClass("mdui-fab-opened")||(t.state="closed",p("closed","fab",t,t.$fab),t.$dial.css("height",0))}))},t.prototype.toggle=function(){var t=this;"opening"===t.state||"opened"===t.state?t.close():"closing"!==t.state&&"closed"!==t.state||t.open()},t.prototype.getState=function(){return this.state},t.prototype.show=function(){this.$fab.removeClass("mdui-fab-hide")},t.prototype.hide=function(){this.$fab.addClass("mdui-fab-hide")},t}(),g(function(){f.on("touchstart mousedown mouseover","[mdui-fab]",function(t){var e=g(this),n=e.data("mdui.fab");if(!n){var i=s(e.attr("mdui-fab"));n=new d.Fab(e,i),e.data("mdui.fab",n)}})}),d.Select=function(){var a={position:"auto",gutter:16};function t(t,e){var n=this,i=n.$selectNative=g(t).eq(0);if(i.length){var o=i.data("mdui.select");if(o)return o;i.hide(),n.options=g.extend({},a,e||{}),n.uniqueID=g.guid(),n.state="closed",n.handleUpdate(),f.on("click touchstart",function(t){var e=g(t.target);"opening"!==n.state&&"opened"!==n.state||e.is(n.$select)||g.contains(n.$select[0],e[0])||n.close()})}}t.prototype.handleUpdate=function(){var i=this;"opening"!==i.state&&"opened"!==i.state||i.close();var n=i.$selectNative;i.value=n.val(),i.text="",i.$items=g(),n.find("option").each(function(t,e){var n={value:e.value,text:e.textContent,disabled:e.disabled,selected:i.value===e.value,index:t};i.value===n.value&&(i.text=n.text,i.selectedIndex=t),i.$items=i.$items.add(g('
"+n.text+"
").data(n))}),i.$selected=g(''+i.text+""),i.$select=g('
').show().append(i.$selected),i.$menu=g('
').appendTo(i.$select).append(i.$items),g("#"+i.uniqueID).remove(),n.after(i.$select),i.size=parseInt(i.$selectNative.attr("size")),(!i.size||i.size<0)&&(i.size=i.$items.length,8').appendTo(n.$tab),n.activeIndex=!1;var o=location.hash;o&&n.$tabs.each(function(t,e){if(g(e).attr("href")===o)return n.activeIndex=t,!1}),!1===n.activeIndex&&n.$tabs.each(function(t,e){if(g(e).hasClass("mdui-tab-active"))return n.activeIndex=t,!1}),n.$tabs.length&&!1===n.activeIndex&&(n.activeIndex=0),n._setActive(),T.on("resize",g.throttle(function(){n._setIndicatorPosition()},100)),n.$tabs.each(function(t,e){n._bindTabEvent(e)})}}return t.prototype._bindTabEvent=function(e){var n=this,i=g(e),t=function(t){s(i)?t.preventDefault():(n.activeIndex=n.$tabs.index(e),n._setActive())};i.on("click",t),"hover"===n.options.trigger&&i.on("mouseenter",t),i.on("click",function(t){0===i.attr("href").indexOf("#")&&t.preventDefault()})},t.prototype._setActive=function(){var o=this;o.$tabs.each(function(t,e){var n=g(e),i=n.attr("href");t!==o.activeIndex||s(n)?(n.removeClass("mdui-tab-active"),g(i).hide()):(n.hasClass("mdui-tab-active")||(p("change","tab",o,o.$tab,{index:o.activeIndex,id:i.substr(1)}),p("show","tab",o,n),n.addClass("mdui-tab-active")),g(i).show(),o._setIndicatorPosition())})},t.prototype._setIndicatorPosition=function(){var t,e,n=this;!1!==n.activeIndex?(t=n.$tabs.eq(n.activeIndex),s(t)||(e=t.offset(),n.$indicator.css({left:e.left+n.$tab[0].scrollLeft-n.$tab[0].getBoundingClientRect().left+"px",width:t.width()+"px"}))):n.$indicator.css({left:0,width:0})},t.prototype.next=function(){var t=this;!1!==t.activeIndex&&(t.$tabs.length>t.activeIndex+1?t.activeIndex++:t.options.loop&&(t.activeIndex=0),t._setActive())},t.prototype.prev=function(){var t=this;!1!==t.activeIndex&&(0',g.each(n.buttons,function(t,e){o+=''+e.text+""}),o+="");var t='
'+(n.title?'
'+n.title+"
":"")+(n.content?'
'+n.content+"
":"")+o+"
",a=new d.Dialog(t,{history:n.history,overlay:n.overlay,modal:n.modal,closeOnEsc:n.closeOnEsc,destroyOnClosed:n.destroyOnClosed});return n.buttons.length&&a.$dialog.find(".mdui-dialog-actions .mdui-btn").each(function(t,e){g(e).on("click",function(){"function"==typeof n.buttons[t].onClick&&n.buttons[t].onClick(a),n.buttons[t].close&&a.close()})}),"function"==typeof n.onOpen&&a.$dialog.on("open.mdui.dialog",function(){n.onOpen(a)}).on("opened.mdui.dialog",function(){n.onOpened(a)}).on("close.mdui.dialog",function(){n.onClose(a)}).on("closed.mdui.dialog",function(){n.onClosed(a)}),a.open(),a},d.alert=function(t,e,n,i){"function"==typeof e&&(e="",n=arguments[1],i=arguments[2]),void 0===n&&(n=function(){}),void 0===i&&(i={});return i=g.extend({},{confirmText:"ok",history:!0,modal:!1,closeOnEsc:!0},i),d.dialog({title:e,content:t,buttons:[{text:i.confirmText,bold:!1,close:!0,onClick:n}],cssClass:"mdui-dialog-alert",history:i.history,modal:i.modal,closeOnEsc:i.closeOnEsc})},d.confirm=function(t,e,n,i,o){"function"==typeof e&&(e="",n=arguments[1],i=arguments[2],o=arguments[3]),void 0===n&&(n=function(){}),void 0===i&&(i=function(){}),void 0===o&&(o={});return o=g.extend({},{confirmText:"ok",cancelText:"cancel",history:!0,modal:!1,closeOnEsc:!0},o),d.dialog({title:e,content:t,buttons:[{text:o.cancelText,bold:!1,close:!0,onClick:i},{text:o.confirmText,bold:!1,close:!0,onClick:n}],cssClass:"mdui-dialog-confirm",history:o.history,modal:o.modal,closeOnEsc:o.closeOnEsc})},d.prompt=function(t,e,i,n,o){"function"==typeof e&&(e="",i=arguments[1],n=arguments[2],o=arguments[3]),void 0===i&&(i=function(){}),void 0===n&&(n=function(){}),void 0===o&&(o={});var a='
'+(t?'":"")+("text"===(o=g.extend({},{confirmText:"ok",cancelText:"cancel",history:!0,modal:!1,closeOnEsc:!0,type:"text",maxlength:"",defaultValue:"",confirmOnEnter:!1},o)).type?'":"")+("textarea"===o.type?'":"")+"
",s=n;"function"==typeof n&&(s=function(t){var e=t.$dialog.find(".mdui-textfield-input").val();n(e,t)});var r=i;return"function"==typeof i&&(r=function(t){var e=t.$dialog.find(".mdui-textfield-input").val();i(e,t)}),d.dialog({title:e,content:a,buttons:[{text:o.cancelText,bold:!1,close:!0,onClick:s},{text:o.confirmText,bold:!1,close:!0,onClick:r}],cssClass:"mdui-dialog-prompt",history:o.history,modal:o.modal,closeOnEsc:o.closeOnEsc,onOpen:function(n){var t=n.$dialog.find(".mdui-textfield-input");d.updateTextFields(t),t[0].focus(),"text"===o.type&&!0===o.confirmOnEnter&&t.on("keydown",function(t){if(13===t.keyCode){var e=n.$dialog.find(".mdui-textfield-input").val();i(e,n),n.close()}}),"textarea"===o.type&&t.on("input",function(){n.handleUpdate()}),o.maxlength&&n.handleUpdate()}})},d.Tooltip=function(){var o={position:"auto",delay:0,content:""};function i(t){var e,n,i,o=t.$target[0].getBoundingClientRect(),a=1024'+n.options.content+"").appendTo(document.body),n.$target.on("touchstart mouseenter",function(t){this.disabled||r.isAllow(t)&&(r.register(t),n.open())}).on("touchend mouseleave",function(t){this.disabled||r.isAllow(t)&&n.close()}).on(r.unlock,function(t){this.disabled||r.register(t)})}}var e=function(t){t.$tooltip.hasClass("mdui-tooltip-open")?(t.state="opened",p("opened","tooltip",t,t.$target)):(t.state="closed",p("closed","tooltip",t,t.$target))};return t.prototype._doOpen=function(){var t=this;t.state="opening",p("open","tooltip",t,t.$target),t.$tooltip.addClass("mdui-tooltip-open").transitionEnd(function(){e(t)})},t.prototype.open=function(t){var e=this;if("opening"!==e.state&&"opened"!==e.state){var n=g.extend({},e.options);g.extend(e.options,s(e.$target.attr("mdui-tooltip"))),t&&g.extend(e.options,t),n.content!==e.options.content&&e.$tooltip.html(e.options.content),i(e),e.options.delay?e.timeoutId=setTimeout(function(){e._doOpen()},e.options.delay):(e.timeoutId=!1,e._doOpen())}},t.prototype.close=function(){var t=this;t.timeoutId&&(clearTimeout(t.timeoutId),t.timeoutId=!1),"closing"!==t.state&&"closed"!==t.state&&(t.state="closing",p("close","tooltip",t,t.$target),t.$tooltip.removeClass("mdui-tooltip-open").transitionEnd(function(){e(t)}))},t.prototype.toggle=function(){var t=this;"opening"===t.state||"opened"===t.state?t.close():"closing"!==t.state&&"closed"!==t.state||t.open()},t.prototype.getState=function(){return this.state},t}(),g(function(){f.on("touchstart mouseover","[mdui-tooltip]",function(){var t=g(this),e=t.data("mdui.tooltip");if(!e){var n=s(t.attr("mdui-tooltip"));e=new d.Tooltip(t,n),t.data("mdui.tooltip",e)}})}),function(){var n,i="__md_snackbar",a={timeout:4e3,buttonText:"",buttonColor:"",position:"bottom",closeOnButtonClick:!0,closeOnOutsideClick:!0,onClick:function(){},onButtonClick:function(){},onOpen:function(){},onOpened:function(){},onClose:function(){},onClosed:function(){}},o=function(t){var e=g(t.target);e.hasClass("mdui-snackbar")||e.parents(".mdui-snackbar").length||n.close()};function s(t,e){var n=this;if(n.message=t,n.options=g.extend({},a,e||{}),n.message){n.state="closed",n.timeoutId=!1;var i="",o="";0===n.options.buttonColor.indexOf("#")||0===n.options.buttonColor.indexOf("rgb")?i='style="color:'+n.options.buttonColor+'"':""!==n.options.buttonColor&&(o="mdui-text-color-"+n.options.buttonColor),n.$snackbar=g('
'+n.message+"
"+(n.options.buttonText?'"+n.options.buttonText+"":"")+"
").appendTo(document.body),n._setPosition("close"),n.$snackbar.reflow().addClass("mdui-snackbar-"+n.options.position)}}s.prototype._setPosition=function(t){var e,n,i=this.$snackbar[0].clientHeight,o=this.options.position;e="bottom"===o||"top"===o?"-50%":"0","open"===t?n="0":("bottom"===o&&(n=i),"top"===o&&(n=-i),"left-top"!==o&&"right-top"!==o||(n=-i-24),"left-bottom"!==o&&"right-bottom"!==o||(n=i+24)),this.$snackbar.transform("translate("+e+","+n+"px)")},s.prototype.open=function(){var e=this;e.message&&"opening"!==e.state&&"opened"!==e.state&&(n?l.queue(i,function(){e.open()}):((n=e).state="opening",e.options.onOpen(),e._setPosition("open"),e.$snackbar.transitionEnd(function(){"opening"===e.state&&(e.state="opened",e.options.onOpened(),e.options.buttonText&&e.$snackbar.find(".mdui-snackbar-action").on("click",function(){e.options.onButtonClick(),e.options.closeOnButtonClick&&e.close()}),e.$snackbar.on("click",function(t){g(t.target).hasClass("mdui-snackbar-action")||e.options.onClick()}),e.options.closeOnOutsideClick&&f.on(r.start,o),e.options.timeout&&(e.timeoutId=setTimeout(function(){e.close()},e.options.timeout)))})))},s.prototype.close=function(){var t=this;t.message&&"closing"!==t.state&&"closed"!==t.state&&(t.timeoutId&&clearTimeout(t.timeoutId),t.options.closeOnOutsideClick&&f.off(r.start,o),t.state="closing",t.options.onClose(),t._setPosition("close"),t.$snackbar.transitionEnd(function(){"closing"===t.state&&(n=null,t.state="closed",t.options.onClosed(),t.$snackbar.remove(),l.dequeue(i))}))},d.snackbar=function(t,e){"string"!=typeof t&&(t=(e=t).message);var n=new s(t,e);return n.open(),n}}(),f.on("click",".mdui-bottom-nav>a",function(){var n,i=g(this),o=i.parent();o.children("a").each(function(t,e){(n=i.is(e))&&p("change","bottomNav",null,o,{index:t}),g(e)[n?"addClass":"removeClass"]("mdui-bottom-nav-active")})}),d.mutation(".mdui-bottom-nav-scroll-hide",function(){var t=g(this),e=new d.Headroom(t,{pinnedClass:"mdui-headroom-pinned-down",unpinnedClass:"mdui-headroom-unpinned-down"});t.data("mdui.headroom",e)}),o=function(){var t=!!arguments.length&&arguments[0];return'
'},m=function(t){var e,n=g(t);e=n.hasClass("mdui-spinner-colorful")?o("1")+o("2")+o("3")+o("4"):o(),n.html(e)},g(function(){d.mutation(".mdui-spinner",function(){m(this)})}),d.updateSpinners=function(){g(arguments.length?arguments[0]:".mdui-spinner").each(function(){m(this)})},d.Panel=function(t,e){return new v(t,e,"panel")},g(function(){d.mutation("[mdui-panel]",function(){var t=g(this),e=t.data("mdui.panel");if(!e){var n=s(t.attr("mdui-panel"));e=new d.Panel(t,n),t.data("mdui.panel",e)}})}),d.Menu=function(){var a={position:"auto",align:"auto",gutter:16,fixed:!1,covered:"auto",subMenuTrigger:"hover",subMenuDelay:200},s=function(t){var e,n,i,o,a,s,r=T.height(),d=T.width(),c=t.options.gutter,u=t.isCovered,l=t.options.fixed,f=t.$menu.width(),p=t.$menu.height(),h=t.$anchor,m=h[0].getBoundingClientRect(),v=m.top,g=m.left,b=m.height,x=m.width,y=r-v-b,w=d-g-x,$=h[0].offsetTop,C=h[0].offsetLeft;if(i="auto"===t.options.position?p+c * { 90 | color: #f5f5f5 !important; 91 | } 92 | .drawer .mdui-list-item .mdui-list-item-content { 93 | margin-left: 20px; 94 | } 95 | /* ===== drawer ===== */ 96 | 97 | /* ===== comment ===== */ 98 | .comment { 99 | margin-top: 32px; 100 | display: none; 101 | } 102 | .comment-container { 103 | margin: 0 32px 0 32px !important; 104 | padding: 0; 105 | min-height: 36px !important; 106 | margin-bottom: -32px !important; 107 | } 108 | /* ===== comment ===== */ 109 | 110 | /* ===== index page ===== */ 111 | .index-card .mdui-card-content { 112 | padding: 0; 113 | margin: 1.2em; 114 | } 115 | /* ===== index page ===== */ 116 | 117 | /* ===== problemset ===== */ 118 | .problemset-link { 119 | color: #000; 120 | text-decoration: none; 121 | } 122 | /* ===== problemset ===== */ 123 | 124 | /* ===== problem ===== */ 125 | .problem-card { 126 | margin-bottom: 32px; 127 | } 128 | .problem-card .mdui-card-primary { 129 | font-size: 10px; 130 | margin: 1.2em; 131 | padding: 0; 132 | } 133 | .problem-card .mdui-card-content { 134 | padding: 0; 135 | margin: 0 1.2em 1.2em 1.2em; 136 | } 137 | .problem-card .mdui-card-primary .mdui-card-primary-title { 138 | font-size: 22px; 139 | } 140 | .problem-card img { 141 | margin: auto; 142 | display: block; 143 | } 144 | .problem-card .table { 145 | border: 1px solid rgba(0,0,0,.12); 146 | border-radius: 2px; 147 | box-shadow: none !important; 148 | -webkit-box-shadow: none !important; 149 | } 150 | .problem-card p { 151 | margin-top: 16px; 152 | margin-bottom: 16px; 153 | } 154 | .problem-infobar { 155 | margin-bottom: 32px; 156 | width: 100%; 157 | height: 36px; 158 | display: block; 159 | text-align: justify; 160 | position: relative !important; 161 | } 162 | .problem-infobar .btn { 163 | color: #000 !important; 164 | background: #fff; 165 | } 166 | .problem-infobar .btn-group { 167 | display: inline-block; 168 | box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); 169 | -webkit-box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); 170 | } 171 | .problem-infobar .left { 172 | position: absolute !important; 173 | left: 0px !important; 174 | } 175 | .problem-infobar .right { 176 | position: absolute !important; 177 | right: 0px !important; 178 | } 179 | .problem-infobar .btn-group .btn { 180 | color: #f5f5f5 !important; 181 | background: #78909c !important; 182 | } 183 | .fab, 184 | .problem-infobar .btn-group .btn-active, 185 | .problem-infobar .btn-group .btn:hover { 186 | color: #f5f5f5 !important; 187 | background: #00BCD4 !important; 188 | } 189 | @media (max-width: 680px) { 190 | .problem-infobar .left.btn-group .btn { 191 | display: none !important; 192 | } 193 | .problem-infobar .left.btn-group .btn-active { 194 | display: block !important; 195 | } 196 | } 197 | /* ===== problem ===== */ 198 | 199 | /* ===== dark mode ===== */ 200 | .body.mdui-theme-layout-dark, 201 | .mdui-theme-layout-dark .toolbar { 202 | background: #303030 !important; 203 | } 204 | .mdui-theme-layout-dark .toolbar { 205 | background: #303030 !important; 206 | color: #d0d0d0 !important; 207 | } 208 | .mdui-theme-layout-dark .drawer { 209 | background: #263238 !important; 210 | } 211 | .mdui-theme-layout-dark .drawer .mdui-subheader, 212 | .mdui-theme-layout-dark .drawer .mdui-list-item, 213 | .mdui-theme-layout-dark .drawer .mdui-list-item-icon { 214 | color: #607D8B !important; 215 | } 216 | .mdui-theme-layout-dark .drawer .list-item :hover { 217 | background: #06859f !important; 218 | } 219 | .mdui-theme-layout-dark .drawer .list-item :hover > * { 220 | color: #d0d0d0 !important; 221 | } 222 | .mdui-theme-layout-dark .problem-infobar .btn-group .btn { 223 | color: #d0d0d0 !important; 224 | background: #455A64 !important; 225 | } 226 | .mdui-theme-layout-dark .fab, 227 | .mdui-theme-layout-dark .problem-infobar .btn-group .btn-active, 228 | .mdui-theme-layout-dark .problem-infobar .btn-group .btn:hover { 229 | color: #d0d0d0 !important; 230 | background: #06859f !important; 231 | } 232 | .mdui-theme-layout-dark .problemset-link { 233 | color: #fff !important; 234 | } 235 | .mdui-theme-layout-dark .mdui-typo a { 236 | color: #06859f !important; 237 | } 238 | .mdui-theme-layout-dark .mdui-typo a:before { 239 | background-color: #06859f !important; 240 | } 241 | /* ===== dark mode ===== */ -------------------------------------------------------------------------------- /templates/errorpage.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %}{{ error_code }} Page{% endblock %} 3 | {% block main %} 4 |
5 |
6 |
{{ error_code }} {{ error_info }}
7 |
我们常会遇到迷茫,但总能抓住心中的方向。
8 |
9 |
10 | 如果遇到预期之外的服务器错误,请反馈给 memset0 或 OI Archive 团队。 11 |
12 |
13 | {% endblock %} -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block title %}OI Archive{% endblock %} 4 | {% block page_title %}OI Archive{% endblock %} 5 | 6 | {% block main_content %} 7 | {{ content | safe }} 8 | {% endblock %} -------------------------------------------------------------------------------- /templates/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% block page_title %}{{ title }} - OI Archive{% endblock %} 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | {% block toolbar %} 18 | menu 19 | {% block title %}{{ title }}{% endblock %} 20 |
21 |
22 | 23 | 24 | 25 |
26 | {% endblock %} 27 |
28 | 29 |
30 | {% block drawer %} 31 | 48 | {% endblock %} 49 |
50 | 51 |
52 | {% block main %} 53 |
54 |
55 | {% block main_content %} 56 | 子曰:「学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?」 57 | {% endblock %} 58 |
59 |
60 | {% endblock %} 61 | {% block comment %} 62 |
63 |
64 |
评论
65 |
66 |
67 |
68 |
69 | {% endblock %} 70 |
71 | 72 | 75 | 76 | 88 | 89 | 90 | 108 | 123 | 124 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /templates/problem.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block title %} 4 | {{ oj.name }} 5 | {{ problem.pid }} 6 | chevron_right 7 | {{ problem_info.title }} 8 | {% endblock %} 9 | 10 | {% block page_title %} 11 | {{ oj.name }}{{ problem.pid }} 12 | {{ problem_info.title }} 13 | {% endblock %} 14 | 15 | {% block main %} 16 |
17 |
18 | 19 | open_in_new 20 | 21 | {% if oj.submit_link %} 22 | 提交 23 | {% endif %} 24 | {% if oj.testdata_link %} 25 | 测试数据 26 | {% endif %} 27 | {% if oj.submission_link %} 28 | 提交记录 29 | {% endif %} 30 | {% if oj.statistics_link %} 31 | 统计 32 | {% endif %} 33 | {% if oj.discussion_link %} 34 | 讨论 35 | {% endif %} 36 |
37 |
38 |
44 |
45 | {% for title, content in problem_data.items() %} 46 |
47 |
48 |
{{ title }}
49 |
50 |
51 | {{ content | safe }} 52 |
53 |
54 | {% endfor %} 55 | {% endblock %} -------------------------------------------------------------------------------- /templates/problemset.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | 3 | {% block title %} 4 | {% if style == 'problemset' %} 5 | {{ oj.name }} 的题目列表 6 | {% elif style == 'search' %} 7 | {{ ' '.join(keywords) }} 的搜索结果 8 | {% endif %} 9 | {% endblock %} 10 | 11 | {% block page_title %} 12 | {% if style == 'problemset' %} 13 | {{ oj.name }} 的题目列表 - OI Archive 14 | {% elif style == 'search' %} 15 | {{ ' '.join(keywords) }} 的搜索结果 - OI Archive 16 | {% endif %} 17 | {% endblock %} 18 | 19 | {% block main %} 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | {% for problem in problemset %} 30 | 31 | 32 | 37 | 38 | {% endfor %} 39 | 40 |
#Problem Name
{{ problem.oj_name }}{{ problem.pid }} 33 | 34 | {{ problem.title }} 35 | 36 |
41 |
42 | {% endblock %} --------------------------------------------------------------------------------