Skip to content

Instantly share code, notes, and snippets.

@526avijitgupta
Created August 18, 2016 16:12
Show Gist options
  • Save 526avijitgupta/a123f23409979dfa676c6b103a8284ba to your computer and use it in GitHub Desktop.
Save 526avijitgupta/a123f23409979dfa676c6b103a8284ba to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
Checking if node.js is installed in /Users/aviato/github/oppia/oppia_tools
Generating list of installed node modules...
Generation completed.
Checking whether Google App Engine is installed in /Users/aviato/github/oppia/oppia_tools/google_appengine_1.9.19/google_appengine
Environment setup completed.
Installing third-party JS libraries and zip files.
Checking whether gulp is installed
Checking whether through2 is installed
Checking whether yargs is installed
Checking whether gulp-concat is installed
Checking whether gulp-clean-css is installed
Checking whether gulp-util is installed
Checking whether jscs is installed
Checking whether gulp-sourcemaps is installed
Checking whether gulp-minify is installed
Checking whether Skulpt is installed in third_party
Checking if pip is installed on the local machine
Checking if numpy is installed in /Users/aviato/github/oppia/oppia_tools/pip_packages
Checking if pylint is installed in /Users/aviato/github/oppia/oppia_tools/pip_packages
Checking if webtest is installed in third_party
Installing pre-push hook for git
Symlink already exists
15:43:34 ERROR core.controllers.dashboard_test: 3.3 secs
----------------------------------------
----------------------------------------
Error 1
test_no_explorations (core.controllers.dashboard_test.DashboardHandlerTest) ... ok
test_one_rating_for_single_exploration (core.controllers.dashboard_test.DashboardStatisticsTest) ... ERROR:root:Exception raised: 'exp_id_1'
ERROR
======================================================================
ERROR: test_one_rating_for_single_exploration (core.controllers.dashboard_test.DashboardStatisticsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/aviato/github/oppia/oppia/core/controllers/dashboard_test.py", line 189, in test_one_rating_for_single_exploration
response = self.get_json(feconf.DASHBOARD_DATA_URL)
File "/Users/aviato/github/oppia/oppia/core/tests/test_utils.py", line 234, in get_json
json_response = self.testapp.get(url, params)
File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 758, in get
expect_errors=expect_errors)
File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1120, in do_request
self._check_status(status, res)
File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1156, in _check_status
res)
AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for http://localhost/dashboardhandler/data)
<!DOCTYPE html>
<html ng-app="oppia" ng-controller="Base" itemscope itemtype="http://schema.org/Organization">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<!-- Tiles for Internet Explorer. -->
<meta name="application-name" content="SITE_NAME">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-square70x70logo" content="http://localhost/assets/images/logo/msapplication-tiny.png">
<meta name="msapplication-square150x150logo" content="http://localhost/assets/images/logo/msapplication-square.png">
<meta name="msapplication-wide310x150logo" content="http://localhost/assets/images/logo/msapplication-wide.png">
<meta name="msapplication-square310x310logo" content="http://localhost/assets/images/logo/msapplication-large.png">
<!-- The itemprops are for G+ sharing. -->
<meta itemprop="name" content="Personalized Online Learning from Oppia">
<meta itemprop="description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!">
<!-- The og tags are for Facebook sharing. -->
<meta property="og:title" content="Personalized Online Learning from Oppia">
<meta property="og:site_name" content="Oppia">
<meta property="og:url" content="http://localhost/dashboardhandler/data">
<meta property="og:description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!">
<meta property="og:type" content="article">
<meta property="og:image" content="http://localhost/assets/images/logo/288x288_logo_mint.png">
<link rel="apple-touch-icon" href="/assets/images/logo/favicon.png">
<!-- The title is bound to the rootScope. The content of the block
maintitle can be a string or a translation id. If it is a translation it
will be replaced by its translation when the page is loading. If it is a
string it would be displayed as is. This is the only way to translate
the page title because the head of the file is outside the scope of
any other controller. -->
<title itemprop="name" translate="
I18N_ERROR_PAGE_TITLE_500
"></title>
<link rel="stylesheet" type="text/css" media="screen"
href="https://fonts.googleapis.com/css?family=Capriola|Rubik|Roboto|Material+Icons|Open+Sans:400,600">
<link rel="stylesheet" type="text/css" media="screen"
href="/third_party/generated/css/third_party.css">
<link rel="stylesheet" type="text/css" media="screen"
href="/css/oppia.css">
<script>
var GLOBALS = {
ACTIVITY_STATUS_PRIVATE: JSON.parse(
'\"private\"'),
ACTIVITY_STATUS_PUBLIC: JSON.parse(
'\"public\"'),
ACTIVITY_STATUS_PUBLICIZED: JSON.parse(
'\"publicized\"'),
ADDITIONAL_ANGULAR_MODULES: [],
ALL_CATEGORIES: JSON.parse('[\"Algebra\", \"Algorithms\", \"Architecture\", \"Arithmetic\", \"Art\", \"Astronomy\", \"Biology\", \"Business\", \"Calculus\", \"Chemistry\", \"Combinatorics\", \"Computing\", \"Economics\", \"Education\", \"Engineering\", \"English\", \"Environment\", \"Gaulish\", \"Geography\", \"Geometry\", \"Government\", \"Graph Theory\", \"History\", \"Languages\", \"Latin\", \"Law\", \"Logic\", \"Mathematics\", \"Medicine\", \"Music\", \"Philosophy\", \"Physics\", \"Poetry\", \"Probability\", \"Programming\", \"Puzzles\", \"Reading\", \"Spanish\", \"Sport\", \"Statistics\", \"Trigonometry\", \"Welcome\"]'),
ALL_LANGUAGE_CODES: JSON.parse('[{\"code\": \"en\", \"description\": \"English\"}, {\"code\": \"ar\", \"description\": \"\\u0627\\u0644\\u0639\\u0631\\u0628\\u064a\\u0629 (Arabic)\"}, {\"code\": \"bg\", \"description\": \"\\u0431\\u044a\\u043b\\u0433\\u0430\\u0440\\u0441\\u043a\\u0438 (Bulgarian)\"}, {\"code\": \"ca\", \"description\": \"catal\\u00e0 (Catalan)\"}, {\"code\": \"zh\", \"description\": \"\\u4e2d\\u6587 (Chinese)\"}, {\"code\": \"hr\", \"description\": \"hrvatski (Croatian)\"}, {\"code\": \"cs\", \"description\": \"\\u010de\\u0161tina (Czech)\"}, {\"code\": \"da\", \"description\": \"dansk (Danish)\"}, {\"code\": \"nl\", \"description\": \"Nederlands (Dutch)\"}, {\"code\": \"tl\", \"description\": \"Filipino (Filipino)\"}, {\"code\": \"fi\", \"description\": \"suomi (Finnish)\"}, {\"code\": \"fr\", \"description\": \"fran\\u00e7ais (French)\"}, {\"code\": \"de\", \"description\": \"Deutsch (German)\"}, {\"code\": \"el\", \"description\": \"\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (Greek)\"}, {\"code\": \"he\", \"description\": \"\\u05e2\\u05d1\\u05e8\\u05d9\\u05ea (Hebrew)\"}, {\"code\": \"hi\", \"description\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940 (Hindi)\"}, {\"code\": \"hu\", \"description\": \"magyar (Hungarian)\"}, {\"code\": \"id\", \"description\": \"Bahasa Indonesia (Indonesian)\"}, {\"code\": \"it\", \"description\": \"italiano (Italian)\"}, {\"code\": \"ja\", \"description\": \"\\u65e5\\u672c\\u8a9e (Japanese)\"}, {\"code\": \"ko\", \"description\": \"\\ud55c\\uad6d\\uc5b4 (Korean)\"}, {\"code\": \"lv\", \"description\": \"latvie\\u0161u (Latvian)\"}, {\"code\": \"lt\", \"description\": \"lietuvi\\u0173 (Lithuanian)\"}, {\"code\": \"no\", \"description\": \"Norsk (Norwegian)\"}, {\"code\": \"fa\", \"description\": \"\\u0641\\u0627\\u0631\\u0633\\u06cc (Persian)\"}, {\"code\": \"pl\", \"description\": \"polski (Polish)\"}, {\"code\": \"pt\", \"description\": \"portugu\\u00eas (Portuguese)\"}, {\"code\": \"ro\", \"description\": \"rom\\u00e2n\\u0103 (Romanian)\"}, {\"code\": \"ru\", \"description\": \"\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 (Russian)\"}, {\"code\": \"sr\", \"description\": \"\\u0441\\u0440\\u043f\\u0441\\u043a\\u0438 (Serbian)\"}, {\"code\": \"sk\", \"description\": \"sloven\\u010dina (Slovak)\"}, {\"code\": \"sl\", \"description\": \"sloven\\u0161\\u010dina (Slovenian)\"}, {\"code\": \"es\", \"description\": \"espa\\u00f1ol (Spanish)\"}, {\"code\": \"sv\", \"description\": \"svenska (Swedish)\"}, {\"code\": \"th\", \"description\": \"\\u0e20\\u0e32\\u0e29\\u0e32\\u0e44\\u0e17\\u0e22 (Thai)\"}, {\"code\": \"tr\", \"description\": \"T\\u00fcrk\\u00e7e (Turkish)\"}, {\"code\": \"uk\", \"description\": \"\\u0443\\u043a\\u0440\\u0430\\u0457\\u043d\\u0441\\u044c\\u043a\\u0430 (Ukrainian)\"}, {\"code\": \"vi\", \"description\": \"Ti\\u1ebfng Vi\\u1ec7t (Vietnamese)\"}]'),
ASSET_DIR_PREFIX: JSON.parse('\"\"'),
can_create_collections: JSON.parse(
'false'),
CAN_SEND_ANALYTICS_EVENTS: JSON.parse(
'false'),
csrf_token: JSON.parse('\"1471535014/kOieX0euygOcLEDTb_qbXQ==\"'),
DEFAULT_LANGUAGE_CODE: JSON.parse(
'\"en\"'),
DEV_MODE: JSON.parse('true'),
INVALID_NAME_CHARS: JSON.parse('\":#/|_%\u003c\u003e[]{}\\ufffd\\\\\\u007f\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\"'),
MINIFICATION: JSON.parse('false'),
/* A list of functions to be called when an exploration is completed */
POST_COMPLETION_HOOKS: [],
preferredSiteLanguageCode: JSON.parse(
'null'),
RTE_COMPONENT_SPECS: JSON.parse('{\"Collapsible\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAABoCAIAAAC2bTrDAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMDQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjA5PC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4KzNxgGQAAJwlJREFUeAHtnc2upVW1hg8IFGgsQSuCmNgmsUGDFoREGtCwyTUQ%0AL4C%2BaAT6tNFwBV4AMaFJoGXDhgltG4im%2BJGjAQqE8%2Bz1VL01zvzW3rXdVXtVYr2zMXjnmONnfs8u%0Ak2%2B49s9d33zzzf90lUAJlEAJlEAJlEAJlEAJlEAJlMB5Erj7PIu3dgmUQAmUQAmUQAmUQAmUQAmU%0AQAkcEejw2X8HJVACJVACJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9%0AN1ACJVACJVACJVACJVACJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBEujw2X8DJVACJVAC%0AJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9N1ACJVACJVACJVACJVAC%0AJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBErjn9AiuXLnyr3/967PPPkN8/fXXp09sZAmU%0AQAmUQAmUQAmUQAmUQAmUwH8lgbvvvvu%2B%2B%2B574IEHvvOd7yBOeMa7vvnmmxOOc/SPf/zjww8/zLai%0ABEqgBEqgBEqgBEqgBEqgBEqgBEKAKfShhx763ve%2BF88iTjV8/vWvf%2BUDTzKpdeHChaVEtyVQAiVQ%0AAiVQAiVQAiVQAiVQAncygS%2B%2B%2BOLjjz%2BGAB%2BB/uhHP9qL4sbD5yeffPLRRx/dc889ly5d2luizhIo%0AgRIogRIogRIogRIogRIogRK4fPnyV1999f3vf//BBx/c0rjBLxxifmXyJK2T55ZdPSVQAiVQAiVQ%0AAiVQAiVQAiVQAiHg2MjnlwyScUacNHzy46D//Oc/CeW7bZNQUQIlUAIlUAIlUAIlUAIlUAIlUAJ7%0ACTA88utpGSS3v13oBsPn559/TsX%2BnOderHWWQAmUQAmUQAmUQAmUQAmUQAlMAg6PDJL/wfBJKOvL%0AL7%2BchapLoARKoARKoARKoARKoARKoARK4GQCDJJOlDPspE8%2Bievf85ywqkugBEqgBEqgBEqgBEqg%0ABEqgBG5IYO8gedLwyah6w6INKIESKIESKIESKIESKIESKIESKIGFwHacPGn4XJK7LYESKIESKIES%0AKIESKIESKIESKIGzETh2%2BNzOqWdr0KwSKIESKIESKIESKIESKIESKIE7kMAyVB47fN6BaPrIJVAC%0AJVACJVACJVACJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVAC%0AJVACJVACJVACJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhOoMPndRZVJVACJVACJVACJVAC%0AJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVACJVACJVACJVAC%0AJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhO4J7r8vwVf2P0rrvu%2Bvrrr23F1sX2mvxGPe9C%0ACltsVraG4Z/xWz0DaLQNOLMnlU8u62lsRPpa5zibsAgjt01n5e0p6blwSiFOiEx8xEyM3p7urbk3%0Afol0GxuRXITtsBFxzrCpjVx6bQPwGDPj0Ti1BNx9990n1Jk1q0ugBEqgBEqgBEqgBEqgBELgcMOn%0A7%2Bt5id%2BOoBzpRLByRV76T1iEEUxA4iPinNWMT8yZhcVTOWJb0KNYhGvexAfEo5g3j7ayWyrMRm4X%0Au8TM9JmLTiQi7RRYxTxKukezQo4iUlxPqiUAMWPQLv3Xdv/veY/uNBYx7LSzLBq/Hk6Xo2WbAEt5%0AmvRZP5FLhW5LoARKoARKoARKoARKoAROIHC44dPXd1/ctYyaCJYiW66LU%2BvbP5aPm7BTuNUaTwrb%0APG2c8ewVJ4fNgjP9hKzlyC12u2bB%2BTh%2Btrb30Sgys6L1zxYcxZmnUGSbgAQjEqMgBsEyOAEzBX3K%0AlSLb%2BFwGkeW/CoLxmOJlFrtU41RPspaAvVuzTNFOjx3xI2L31qmzBEqgBEqgBEqgBEqgBA5D4N//%0A/vcHH3zw4YcfXr58mY6XLl36wQ9%2B8PDDD99zz%2BEGvdM/6eHu5Nu8N2OiQOBBsECGZetCzwfgXZ9h%0ADCeWxZGeGaMTS4X4CYueYsZM/169N3hbeW9YnIis%2BaQ4bUpBlw9IDNvcR03wdOY0Ii2m4NQu1reI%0AHhMNThgikVzGeCM9WiJzdJyYvVJhG2yYl9ECgTU9Znk97oYQV/wE42SLiFNxGpt0g7dFuA/19atP%0AU7YxJVACJVACJVACJVACJXBrCXz55ZfvvPPO22%2B//e6773766adL8YsXLz755JNPP/30U089de%2B9%0A9y6nt3F7/eOs5RJHL/5ff/2Xv/wF/yOPPLKcnmFLNbJ4cXexZeZEY1lHza4tnKnvpOGYwaTB%2Bta3%0AvqXIkWKmRCsIUMzKx3mW3GxTJJ69YmnhFuviERGxVGCbB%2BG50No47aslPmLqq9Wv/Sf1cdjCYGvu%0ATUzYjDR%2BWk5de69x7fDqf%2B2%2BOLfpeq7d/ep/r/1buI4r1WjtP4C9uI6rv/caS3AeCkG7ZUuwfvp6%0AywScULxHJVACJVACJVACJVACJXALCfAi%2BtZbb73xxhvvv//%2BDcs%2B%2BuijL7zwwrPPPnvgF1c%2BjOVu%0AP/nJT3xvzz0PN3yCiYmCxohMm1999dVu9jyaQtHL1EQwmDJjOHbG5kiUE%2Bhx2u4%2BPB0V0xmPYtY5%0AzjNT9tbEmbXMVORyRBeXX5s8r05iEHvt0ppSAWij9DX9apvdf8xNgEJnwo67idUSrMiWUvFMHaeP%0Ak61i3iSU8u8k1/NuARVhTU8tOLtEb%2B%2BTI0UsguB5aq4eNK231ZaH6rYESqAESqAESqAESqAEbiGB%0Av/3tby%2B99NJ77733H9V87LHHXnnlFb4X9z/Kupng2z98Zi7ild2hApvh08kTy6mRCF70WRkwGDtd%0AeBBYT%2BGCiA0mnYvfgUHLUUSy9oqUWqrN4JRahFtsZqqIjz76CD/fkP3ggw/mMRV0zErTvR5OKeJK%0A5Tm2ecnkKnQmS5HIsFUkNwEInLFTGENBhDbClARna3ftfIQ8Bc6PP/4YSwrfyC4i/w0suOy%2B3E3n%0AXpvICB%2BZy%2BDRmZo6tXur1VkCJVACJVACJVACJVAC50TgT3/6E5PnJ598cob6Dz300Msvv/z444%2Bf%0AIfcMKccNn4f7mU8uzVt7LINERlC%2BZTmD6GeffYZmEeBcwbcpX7hwAUu6i6nDOswGeNAZEiLinJ50%0AN2tajvauma6enpkyq6k9RWfxUCyfDmcKMnX7sFiejhhHIAISQzW301ok9RGpTxfAfvHFFzipCUMS%0AU5ZqySIFDXks/gceeCCXUdjRC2AjFj9bjiyiUMdjwLRHtXaLGK8x73/07%2BDat2RfC/wfHopb8USk%0AzHsSsNxHTxL3ClNiieECqUMLNUJ9mpp7G9VZAiVQAiVQAiVQAiVQAmcmwOT54osvMjWcrQIf5JD%2B%0A2muvHWz%2B3HvPww2fvLt7AwTv9y5GCwhimSgYfq5cuaJ/RjqaMnzef//9eQaKOHgQz3gQPyJbRbaJ%0AIdeFBxGbgIjkzlJTG5lqlrJmjuLkqhxhM1Cl%2Bxw%2BcdKCp8OySI%2BIU08sKS7p2UK20PMCTGvEp4LX%0Ay5UQRFIEP5F8GCte47XexERKufUO88gA74OO0J87zxRjsN6fmy/LIyxZ3JP76OGq3nNbNjdcGnkN%0ArTE%2BHVph8WxtarzaLLRiFqwugRIogRIogRIogRIogVtOwO%2B2PfPk6X1I/9WvfvXb3/72kN9/u6A4%0A3PBp4zntoJ0xAPH55587/PhO72v9fLknkg/xKEIAyw%2B%2BqDBj5rPh9yiWLNNTZFfpyKlHEWsi21RQ%0Azy2epeziYavHXg5XWp7IXIQDFWMPz%2BVDOQiRS7t0zHSEB%2B0WbZ0UpyBIsSz7UocWZmFd2ytZh1yE%0A9W2B9Saxudi1Ykf/xZll8dj4l3izDJv35%2BZ5hImLm8gKp6y8p2XpYsFYRfw0mjfRnwqcolOKUzwp%0ANXOnTsGKEiiBEiiBEiiBEiiBErjlBHjzPPN32y6X4fNPSr3%2B%2But5SV4Cznt70OHTV3bGBsScNPjA%0Ak4lCD2//PDM6L/1BQ5YTFIKF3%2BAwwhm9pLvd5V0dQdXTk1xEmm7rxGO8TZc6OlPQU20eXGGMAxWP%0Aw9CFZdFlNnLr0WINs/jRuHltObzRxSMfalbG46k3Id7L8OXIJ4rGY003QO2VcrEZMJ833c2dWd5c%0Af25y7frr8Mn1iKea1yOeyNzTUoudW7tMy6lLnpSiOB4q%2B9RuY5fcua0ugRIogRIogRIogRIogXMi%0AwO%2B2Pfk3DD3xxBO//OUv%2BfOeXIA/%2BPnqq6/%2B8Y9/PO4ylKLgc889d1zAufoPN3zyEs%2BTTOvMg2Wu%0AwM/y1R%2BRSAcD/HiIRDBy7GKPglnSmSnWwZ%2BAhFnW9FidsQiWKYtdCnqa1hYkV8%2BuzFWTGB4BnQfn%0AWYjgGZ2s8rAOPxzNC3iqZVJixWMby87hjbJs5aa1smXJyk0iOOKGZKU4Hpdd5q1SLcIYKrgoe01e%0A/f8FLLXEk0WYd8j9EdwfJ8JTLIkE45EAIqWobHeFjaI9mtYA0iXJER4KKuhlLls01tZqtl0lUAIl%0AUAIlUAIlUAIlcN4E%2BIzqjTfeOLnLz3/%2BcydPwhBsTxg%2BiaHgM888c1v%2B/ufhhk%2BeMy/uiKxMFzLN%0AuOJswFa/W7IcRRBzNkg1hPFYU7Q6PZ3Bak5nosHWj001K2tT0Apza5FYj3y6WJ/OCcohKqOU9U1P%0AayclhiUSWQ5gVPaSOrXUzMJjNcJmfZwzBW0pEglzpbU3We6TggQbaQB1XNZUL7mmpCwxuYw3z%2BTM%0A1lNaWJBcRO45W1MwWwU2XdCU0uMFYIgHq5P/EVKZI5wsq5nOlhjD8LhN5YoSKIESKIESKIESKIES%0AuOUE3nnnnRv%2BPc9ljFy22ytRkLI/%2B9nPtkfn7Tno8Ll9GN/v43e00Kmd7/qcssVvmEdsXY4oags6%0AXRBmpE4Ckm4wW47Q2hmfRJ1uLWu1JC41c6ow0XZpirC1RdCzS1I4jZ8ZiV8FZK/ZIsEeYbPAgqaX%0ARcLEpt4hwWzxE2OY1uK2MyD3QXClXfj%2B4TPdTaQIKXuLz5vkA0/SWRx5ajqaCtx59qUsfi%2BJno3U%0AsQgic3PhJJ6tpaxmqeTaejnitKsESqAESqAESqAESqAEzoPA22%2B/fU5l/8uHT1/ZtRBERDNFMGPo%0AjJUyw4AC68iBYCRwKrAIljCXHlMMM1KrP1ls0Ys1BptE60xP9N50nbOjNdN3EUTy%2BEsXU7QeSYnH%0AZN7DWoQABEfEIK5S2P3naG7bTZ5Yjoi0ThpZISluZ5hlvcO0qUMAgyLWhd%2BwVEZYH5EKBFtBMVMS%0Av7v70djsI1iQSBJxXu13rU76WsqtLaaep1SwDsO8kXpwgje3RVhBgfYofmvWlkAJlEAJlEAJlEAJ%0AlMAtJ8Cb8LvvvnvLy1KQsrzG8yZ8HsVPqHnofrmKb/zT5ijCV3xsFrMBp84DCPx4sBlR3OIxLPWX%0ALHP3Wpwuc9FTuL0a8f9nV5z2XWJmMAFzJSVPFEGYiXqwfsZoelokHuERBFxsr8mj/5pCGMvK2Bkw%0AKxtmZOIJMDGnGQIVibTyvMDe4mTNFGNmll9WLpl0KpOCx1xv4q1irelRrIlanfBkoSmV1gSkF8LI%0A5CJY%2BBW1JVACJVACJVACJVACJXB%2BBD744INPP/10W5/fMMQPdubba3/605/OGLa/%2Bc1v9PAjo2%2B%2B%0A%2Beb2R0Apy59v%2BfGPfzwTD6APPXzyNp%2BnUmOZuR0z0L7x5/1egc34ZIBFHEuwrO2gkvoIV1pHbBt5%0ARDziWt7VO%2Bs0YElMwZm%2BOElZFgF4ljC3009fBiSekWHJUz04eWovaalZf0fluuHIyBl//Xgz4BFG%0ATa3Fba0Tv%2BMfNiPcrEy7k4ubbopdfGQTYxHR8wIUN0ubI6%2BXS8760Qi6G0MdW2Atsi2of7HEnzJy%0ASey2BEqgBEqgBEqgBEqgBE5DgF9duzcsv9t27%2BkPdytHTKrPP/98thEU/28ePnlTn%2B/3bLMcYJxV%0AcCYMNOo5aRAgMo5YZmG3wydhaWGW2xA3AEudWE/xEKw1V39OZ7zpeNIl2niDCXPNrXqGLR62lAUR%0Ay7BsdQoHfa381WfJdgpyXXbxSIYJs6O99lor0BHB5EkimiJY42fZvcVJNN1S2pmbyyByB51siY9z%0ACv3a1Dc%2BLfCzdFpcO2smeFt8eqpLoARKoARKoARKoARK4PwIXL58eW/x/G7bvaeL87jg44ov6bd2%0Ae%2BhPPrm9b/m%2B3zsJoBGOMUwCBmTSyAM7ZVnBgcHBRpvhk62nRtposTlKZLpEcORNpgeN36XWGhm7%0ATbyWdPTfvUXinGXRlGKZ5eeceerUTApi0W5N3x1eD1jS2VLZeDoanMSI3XWuXskpzjq5pBWslqv6%0ARbFIKpCO1iLsmL7pOD0659HURKY4/miLu7Wanr25BqSUIs6KEiiBEiiBEiiBEiiBEiiBsxG4DcMn%0AF/XVX%2BFIEJsRNM/DhMAyYObidKRx7JzDJ2GczvqZcKzj1GQLPAptEpO%2BnBKwLCP3xpu7xLPFr3Mr%0AcmrufHCunVJLImEpaGKsFThVYHMUYTpbuzuFZqvT4OOKWMHixM8vDdqtdVKBbbLizJXSbnb3SvFE%0AJCt1tsKYmUIMTixgWUtKalaUQAmUQAmUQAmUQAmUwOEJXLp0aW9TvmP2uM8zt/HHfe/uccW3FW6h%0A59DDp6/7PIAv%2BhEOAJ565JCQUQHhqSlsXQ420147uT58MlcQgDUXm6XTLfXJnV3wZ4vm1Mi0jnMm%0AGoM11%2BBpzcKzFQlLkdQxePoXTTs7KrbWUnnk2Qtt/OxiwPSkI8Gcuk1YIvVk4FRoicnFCMsXJbfi%0A1LIKu5iiTtO00zNtikwn2joRbOnL0j/tkthtCZRACZRACZRACZRACRyYwHET5quvvrr8wiF%2BzDN3%0A%2B/vf//7nP//Zrb9wKEdTHFd8xtxyfejhc3kAXvfxzJf%2BqR02MnJEWIQti5HG5VYPdjZyi13azakj%0AKRHeJHXwE08vA2ITn0i7sN0e4eRU/1akwnHCK2kthVYkZcYczVW7D0tx0tQjPAbj4XGiFVtPKi/C%0A1jgjDKBsVr40csOfGK9hJM4cLQW9M6cRVmA7U3TmyCKmnGC5A6fYCLdLyixeXQIlUAIlUAIlUAIl%0AUAKHIfDII49cvHhx%2Bwtv%2Be218xfY8rtt5/DJ5PnrX//65BtS9uGHHz455jxOb%2BfwySs%2Bj5QX/UW7%0AdcDYO2bg3Lv2YkqXCEcOp46kUDDaC3hJGzFBJR2R4AhTsjVXZ8pyGv8Sn5gp0tELz220wmpx5gHx%0Ae6UcIXQ6HOr3B0rRGRTJcu29z6ymnmHbxJxyRHy2Uyx12BocwUNxvZkytelYv6xTeBQmEXybd7Qx%0AFIyYxRdNzOLptgRKoARKoARKoARKoARuIQHeVJ988sk//OEPt7CmpSh7%2BD/ySevbOXz65Px5U39c%0A063v9L79M3jo3Fpnm23AMhJYZ7EOG04dObLFUnBWmzMPYSbOeLV2Ji7PNcM4YhsPwsFPfxK58JyR%0AvD8t9k5NcSpIJNIWeMyy8lHj3Z9IxenK/OlRptDtfYhPI7U1Uxnn9Gy3eLbLFPxLHTy080uA4HoE%0AeMmlizXzpLNFnDBx4XFZH238co3ZoroESqAESqAESqAESqAEDkbg6aefPo/hk7IHe4TZ6DYMn/P9%0Anqs4/3gn3v4ZMBIQ4akjR27PqelYI/XMAP1XJ4wxwjF74MQuibPFrIbfSIuzjQeRjgj9WrazCDr%2B%0A1DFFyym3wrqMISv3985ufQRvpSXedFMIoA5OtpYyMcGchrZOLB6WR1bzMpayGmGWwqqxtjDMrelo%0AtwbMCvitoziK29XRJh5BGLeyIFu7TGvwrsCRITJ2CnW%2B%2BorcgVOX6eh5h2j8oRFnRQmUQAmUQAmU%0AQAmUQAnccgJPPfXUo48%2B%2Bv77759QmR/snKfLdh6pKUjZrf8AnsMNn77W563dLU/oqz%2Bfufm0%2BrH4%0AM11ETCI4GUhmJBqnK9WokxlDQZiCz5rRrlSmpprEOK3pB4N8VMs2RwinNQR%2Bs6jJ9lrt6zOn/uTm%0AqvjVWFEgZhGfggtzc6wC7eKUlQo41d7BJ6KaYQiWt%2BWIYDryUDgJsDt%2BlkUizLJmSiGOyu0W8ZwS%0Ar%2BXIYA5zHzxx0tr0RHKk3kUd8cyKh2po/Fh7oXXubnFkKMJyG6FfexxDg%2B2FJVg9RdolrKIESqAE%0ASqAESqAESqAEzoPAvffe%2B8ILL7zyyisnFH/zzTefeOIJf4EQv9uW7QnBHFGQsifHnNPp4YZPp4Xl%0AMXjXZwKZTjxEshCMFtnicQDAoknRsnU6isgRgnT8DjnoCLRbThHLBdxyFD%2B9bGdN9c539RPRnCJm%0AInq7Zlm0KVbDckmfiCNy7ehtOWJZEA9iWrYhZryN0JZCsEzHY0cnap1oAvR7B6wCp0W0trZaPNbk%0ASA%2BJlsVaMwGm%2Byy5EjHJNdI6%2BClFcNIRWRypk4tgpSw60HYnR1sWAQqdWOpMbVlvlbshpl9dWwIl%0AUAIlUAIlUAIlUALnRODZZ5/9/e9//9577x1Xn18%2B9Pzzzx93uvgfe%2BwxCi7Og20PN3wuL/d5y2cG%0AYPLmnZ6FU4szW4cfiThRcMQWy7CENcD5xK3BtsiModDp1OEEgod4WyMyzBBvHaxl7W5wZjaEYcQo%0A0gJhSmwqGJle3oEKLvwsNGEz12vnY8%2BIlLX1vAYe65DrfRKMny74eQQWp2g8pNtdSxinWBZHtqBI%0A9PQYhodcF5EI/fNi%2BLm/uVrrE4PAkxTSbWc6mlO1MQQsldmaYjA2wl48aT783GJMNQV2dlTHk5iK%0AEiiBEiiBEiiBEiiBErjlBHjt5JPPX/ziF5988slNFn/ooYcodRvfYw83fIYUAwOTgBPFbii4Pnw6%0AdYCDhSYFQYy5BqudOvAwF2Gt5hBiPNZGVHC6wOOiAsLxY9a3MgUVBCiwlKI4S4HF6SXRLI7YLk48%0ALJtSjaUHa6S9SOdoV%2Ba6ybxn8NWrX/vPrtj1X9OK2zDyvS3WpYdTuxtpMAG7Z7r%2BrctuTfRhSUeQ%0A6308In1ZFufUB%2BDU7%2BNFkI71GgSgsV6D/9OBLTr%2BXCDXRlgcYS5fTeLnCiucxMxFcdZ8dmN04mft%0AQq5%2BIDxz7ahntqsugRIogRIogRIogRIogUMS4M%2BiMDS%2B%2BOKLvGOfuS9v0S%2B//PJt%2BQsrufP6Hp%2BD%0A8xC%2Bx/Ou70DC1hmAt3y/7ZifjnWQ8Ai/12ALLNP1eIQlnsWXgZpUw5OyeNxSnOWMQbqReKiJk/jl%0AYZM1e5HFsiOWRLa5EnfA6TBjukdYnLNX/IRZHw8BbJdFfcvi9/JY7nzfffdZ0HYeUYRqRFqfRD3e%0A2Tt4RDyRaNsRgAfLMosW8yb43QqZrZXtmzuEFQFUYPHVJIUw08kimC1dvABPgcdbJZ1TFkXwkMgp%0AKYRRyi2P7wVMMYx4stLImt6Nm7i1FJGEUXN3xyPjrfCwjLQyOi3sMj1eZgZUl0AJlEAJlEAJlEAJ%0AlMA5EXj88cdfe%2B21l1566Wyff/KZJ5MnRc7peqcse7jhkxd339d9v8fy0u8YgOC6aqcILAunwYpY%0ABIv4LMcVUmZ8GjlU7IaLqwOGmgAEpRC7kkeGaUQd5%2BxCPAG0YxZi2YIAgzlloJrFnRLx8IzEIEwx%0A/sKFC%2BmLSKOIOBEWcViiWoTtUicQEBxxAY/SF2eCaWQYlprYtJ5aJ1NfThHE29pnSU0TsbTGsgjm%0A1DAtiQjtkm4LsoBsgJWdOQl2pR3CFD2282Kpj%2BB0bg3gEbJyap15Zz21JVACJVACJVACJVACJXAb%0ACTA6/u53v2P%2BPOHnP/dej5/z5IPT2/uZpxc73PBJP8YG3umxvvozJ/Dqr9%2BJwpEDp%2BOEA4ABCUO4%0AErMITymIsJfFbbp4PLpa8Zj/pD7B3DApijjJ5uYZPjPVKJbu3m029GHTK8IYe1GEalpFyhKQapbC%0Aw6l1PLWI1mBODeO5WGl6gkiXbbXUtNRSkFNStDZNhdS0L9splkSzkjKD1bNLWiCgka3cYuNHzHbR%0A3AedLUK2O19NCZRACZRACZRACZRACRyCAAPk66%2B//tZbb73xxhsn//0Vb8NfVeF32/IbhnzLPcQV%0AT%2Bxx0OGTm/jYvMozO82L%2BfbPuII/Q8s2IBUQzieL3aZYGZvZI8KjWdOyFuE0W7uQyMdxKRiBMynL%0A8Mnnk2RtB0WLmxVLFzvOh0pl21HNta1pLqekE5wiswLaOjqJIR7gZkneOqajcS4ec7GWwqpJmZHz%0A6%2BjRTEmu6SbO9HgSsE0hxrC0Zmu8wW5noprnRWDnwkM8nhRBsCjuUYTO3WFNCZRACZRACZRACZRA%0ACRyOAO%2Blzz333DPPPPPOO%2B%2B8/fbb77777qeffrq0v3jx4pNPPvn000/z9zzzjZBLzG3ZHm745J2e%0AacSXeO2cP/EYwPt9pp0QmVlqhw0CEHMlBUHkDZdhM2vRFMdjCy6WWYXKaL7zFssPNzpoofnuUGN4%0AOtYyfM77LI3c2igdFVgStRS3tV3cWpYA1qTh5fVjE2Y1T7EUmVkpMsX2i2LBWdb4ZKVm/AlebrLc%0AJxcjPssUI7U5Oi6egCUrW0XoRehP5eMEHYV2XED9JVACJVACJVACJVACJXB%2BBBgpf7ZbfAz2wQcf%0A8Oc9L1%2B%2BTLtLly7xBz/5gJQx5Py6n7ny4e7E%2Bzpv9s4JvLg7zDCe4XTraEdAVp4qIwEiTsLQBk%2BR%0AgJmlXjxEzoJJ3Aq7JN0At1yexRTqffzkk%2BfCeTR97tYu5MiYYlPt7JUnwjmfi21SENaZ1XCyzFKY%0AYkG0y6MlgO3sNe9A1glHnM6C6qTPROvkDsmK8MiwVEiWYWwRau3MSnCciYxIhXgQrIWkF/DIamic%0AeiL454on7SpKoARKoARKoARKoARK4PAEmDZ%2BvFuHb32GjocbPr2cb/BzzsTjIMoMwJs9i8gIdF7x%0AFdkmcom3URKTFbE9SspWpAuCG3pzRJbj5ZUrV8zldwgtR9lyAbTd8xRLx7TDP7VZybUU1pXTJcUt%0Ap1nER0cQZqQW/yKOjq99XZKFsNpSc0bu8o6%2BoFkzZWoClsSkKGbwCR1n1jYlninQy3beJEfzGrNL%0AdQmUQAmUQAmUQAmUQAmUwGkIHG745CXed3qu5Qu995sv984qCZsPsKTMGPX0JHEWT9/FmeC9wmCK%0Au2YRjhgm%2BaT729/%2B9g9/%2BEOOvvvd7%2BZnPp05GU0VBM%2B1t5dOGk2RLen4LRIRpylu1Vt7wqlH6RVB%0AEXU8ERylYMTJ8V4pwVOk7FZsGyXRgqdJSZHkKrARVtPqnJ5F82VN3%2BWo2xIogRIogRIogRIogRIo%0AgS2Bww2fszdv9ry4H73170Te432bxypMISa5U%2BOcYVPvjU9uBGFTJ2sKyxKGUGvxsPwglJ/oZew0%0AS78DZyxOtEc3bGp9q009E5dSbI3HkpItIhXiTGREwoyZFSxoZEolUbGtnMiImTLjpyZmxk89w6ZO%0A2RkcJ2IGb3U8ETN30bSYYcd1XLK6LYESKIESKIESKIESKIESkMBBh0/e3fPKzjDmd9v6Qu%2BRmpiE%0AcUude79gOSI%2Beomc/qkN23qW9GXLtb0bia48SO7gnLm1lDJlqblsicGTLsspWwO02SYs/r0Vcpr4%0AbRgxOo0xBc82N0UWkchZJzE5jSdiHi2584j4bA3LNqWm2J7GEzFrztzofKERy90SU1ECJVACJVAC%0AJVACJVACJXAcgYMOn1xivuvzEn/cteovgdtIYP4rzTUYOPV38gyTihIogRIogRIogRIogRI4PYGO%0Af6dn1cgSKIESKIESKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fV%0AyBIogRIogRIogRIogRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BDp%2BnZ9XIEiiB%0AEiiBEiiBEiiBEiiBEiiBMxLo8HlGcE0rgRIogRIogRIogRIogRIogRI4PYEOn6dn1cgSKIESKIES%0AKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fVyBIogRIogRIogRIo%0AgRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BGwyfd999g4DTd2pkCZRACZRACZRA%0ACZRACZRACZTAnUBg7yB5g9nynnvuuRPQ9BlLoARKoARKoARKoARKoARKoARuFYG9g%2BSxw%2Bddd91F%0A4/vvv/9WtW%2BdEiiBEiiBEiiBEiiBEiiBEiiBO4GAg6RDZZ732OGTCEIfeOCBJSGZFSVQAiVQAiVQ%0AAiVQAiVQAiVQAiWwEDhukDxp%2BKTEfffdd/HixaVWtyVQAiVQAiVQAiVQAiVQAiVQAiWwlwAjJIPk%0A9uiub775ZuvV8/Vu/Xu3joupvwRKoARKoARKoARKoARKoARKoARC4Fu7xe8cWn7t0Em/T4hPS1km%0A/O9unTCpplNFCZRACZRACZRACZRACZRACZTAnUaA4fG7u8UIuRslj36L0FwnffJJHNOmn39ir1y5%0A8tlnn33xxRdfffVVp9AJsboESqAESqAESqAESqAESqAE7kwCzJn8btsLFy7wC4P4btujjzt3C/8C%0A5AbDJ9GMnRlBEaylRLclUAIlUAIlUAIlUAIlUAIlUAJ3MgE/6szYidjSOOnbbo0mzYGTcrvZ82j4%0A7Ai6RVlPCZRACZRACZRACZRACZRACdxpBPyE0%2BETy/yoZ8vhxp98muPY6czZyXPLsZ4SKIESKIES%0AKIESKIESKIESuDMJLPPncRBOO3yan7Ez4ri69ZdACZRACZRACZRACZRACZRACfzXE8jkecMn/c%2BG%0AzxuWa0AJlEAJlEAJlEAJlEAJlEAJlEAJbAns%2BTHQbVA9JVACJVACJVACJVACJVACJVACJXAzBDp8%0A3gy95pZACZRACZRACZRACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q6PB5M/Sa%0AWwIlUAIlUAIlUAIlUAIlUAIlcCoCHT5PhalBJVACJVACJVACJVACJVACJVACN0Ogw%2BfN0GtuCZRA%0ACZRACZRACZRACZRACZTAqQh0%2BDwVpgaVQAmUQAmUQAmUQAmUQAmUQAncDIEOnzdDr7klUAIlUAIl%0AUAIlUAIlUAIlUAKnItDh81SYGlQCJVACJVACJVACJVACJVACJXAzBDp83gy95pZACZRACZRACZRA%0ACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q%2BD9kSf0dBz/9NQAAAABJRU5ErkJg%0Agg%3D%3D%0A\", \"frontend_name\": \"collapsible\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAGhJREFUeNpinDp16n8GCgALlGYkU/9/JgYKwTAwABaIDK9fv25gYGCo%0AJ1Jfo6ioaAO6CxoYGBgaidEMVYvVC4QMQdGMKwxwGYKhGV8gohuCVTNKIOIwBBsbuwGioqKEDBnk%0ACYnsLA0YAIp6E64EMj9YAAAAAElFTkSuQmCC%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert collapsible block\", \"customization_arg_specs\": [{\"default_value\": \"Sample Header\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"heading\", \"description\": \"The heading for the collapsible block\"}, {\"default_value\": \"You have opened the collapsible block.\", \"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"The content of the collapsible block\"}], \"backend_name\": \"Collapsible\", \"requires_fs\": false}, \"Tabs\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAAFgCAIAAAD8SbMaAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zNTI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjMxPC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4K6FkWAQAAQABJREFUeAHsnWGTXEmSVbvVPewu7IJhGBif%2Bf%2B/ic%2BYYRgGBsva%0ATEviRJzMW673slKpklRSSzdG7eXhcf26x30vc14oq0q/vn///peOKlAFqkAVqAJVoApUgSpQBapA%0AFagCX1OBN1%2BTvNxVoApUgSpQBapAFagCVaAKVIEqUAWWAj189j6oAlWgClSBKlAFqkAVqAJVoApU%0Aga%2BuQA%2BfX13iFqgCVaAKVIEqUAWqQBWoAlWgClSBHj57D1SBKlAFqkAVqAJVoApUgSpQBarAV1eg%0Ah8%2BvLnELVIEqUAWqQBWoAlWgClSBKlAFqkAPn70HqkAVqAJVoApUgSpQBapAFagCVeCrK9DD51eX%0AuAWqQBWoAlWgClSBKlAFqkAVqAJV4PfHJfjrX//6f//v//1//%2B//4bx79%2B7xxCKrQBV4UIE3b978%0Aq3/1r/7hH/7h3/ybf4PzYFZhVaAKVIEqUAWqQBWoAlXg%2B1fg1/fv3z/S5f/6X//rf/yP//EIspgq%0AUAU%2BXwFOof/%2B3//7f/fv/t3nU5WhClSBKlAFqkAVqAJVoAp8Dwo8dPj8b//tv/3zP/8z7f7jP/7j%0Av/23/5YPZHgy/h66bw9V4AdTgO8p4DsL/vf//t//5//8H7b2r//1v/7P//k//2B77HaqQBWoAlWg%0AClSBKlAFfk4FPn749DNPTps8BP/93//9zylTd10FXlmBf/mXf%2BEvfTiL/of/8B/6%2Becri99yVaAK%0AVIEqUAWqQBWoAl9DgY98gMmHMH63bU%2BeX0P9claB5xTgL3r8zPN//s//ycvwOVjjVaAKVIEqUAWq%0AQBWoAlXgz6LARw6f/IYhdvJP//RP/czzz3JF2%2BcPowAvOl56fPjpy/CH2Vc3UgWqQBWoAlWgClSB%0AKvBzKvCRwye/2xZdeAL%2BOdXprqvAt1XAl54vw2/bSatXgSpQBapAFagCVaAKVIHPVOAjh0%2B/36//%0A5MNnqtz0KvAyBXzp9dtuX6Zes6pAFagCVaAKVIEqUAW%2BKwU%2Bcvj03/Ps77b9rq5Zm/l5FPCl58vw%0A59l1d1oFqkAVqAJVoApUgSrwQyrwkcPnD7nnbqoKVIEqUAWqQBWoAlWgClSBKlAFXlmBHj5fWfCW%0AqwJVoApUgSpQBapAFagCVaAK/IwK9PD5M1717rkKVIEqUAWqQBWoAlWgClSBKvDKCvTw%2BcqCt1wV%0AqAJVoApUgSpQBapAFagCVeBnVKCHz5/xqnfPVaAKVIEqUAWqQBWoAlWgClSBV1agh89XFrzlqkAV%0AqAJVoApUgSpQBapAFagCP6MCPXz%2BjFe9e64CVaAKVIEqUAWqQBWoAlWgCryyAj18vrLgLVcFqkAV%0AqAJVoApUgSpQBapAFfgZFejh82e86t1zFagCVaAKVIEqUAWqQBWoAlXglRX47g6f79%2B/f2UJWq4K%0AVAEV%2BFKvPl7DfRn3pqoCVaAKVIEqUAWqQBU4KPD7Yf6aU590f/31V5zY12ygtT5JgXky4Xp9Um7B%0AfxIFXnhZbx41E3wh6deR7Pvs6uvstaxVoApUgSpQBapAFfi%2BFHi9w6cnTHev74EzR5qcPxP5fKle%0A54x0p%2BHXaeDzhbrJcGdf56XX3%2Bm5h8MuXr%2BlQwN/uil/pbBVfdlpMce6ue9FdVz49ZeXFZi8j/ir%0A7ge1z5MPGunfqDyiajFVoApUgSpQBapAFXixAq90%2BOSJdp4E8A8nh0zjvHhLSZwVE6zzOQrk6lTb%0Az5Hxe8jl29v3UXNZxz6qfXA8e7zPO2lX%2BsfJvgxyb%2BeJ6rkOv1V7T53VqwJVoApUgSpQBarAT6PA%0AKx0%2BD2eVnGHiILgYIgfwzWsxEwU8knWTqsFHFDgI7vRbaX5o5pH%2Bi5kKXE%2BenMj8a6D9WeT79TGh%0An0rePKqdz2lPsCdv1ll0WTmnfwj9yCw84h5nuyau7V39xSHD%2B/ExLKuP036k3S5XgSpQBapAFagC%0AVaAKnBR4pcMndTkwcFbR2oZHiEScijz1uQIB3F/NiSjMN/EfDT6efqexx0lu9vOp6dn7TbaPBg8b%0AcTrtZPBqEjkXPUdm4k3/UPrFmJkI5/1O7q9Oqh/M99NOtr9lXzJcfs8XxzP8d%2BuMNs9pTDmVsXQc%0Al%2BPcxh8S1o2xXrQ7Zbs7XQ6iY3Zkvc4vjB8QXzMNymaJbT9Msb1lV/zSy5WdrwjArhbJOIKmtUE%2B%0AcupWgSpQBapAFagCVaAKvFSB1zt8%2BqB/fd699JuDzTx7gGGAmMH4cQ5bNsWs%2BMGcI1nSuUl7M3hI%0AZHoHRt2s3u8hsAP/zfhzVDfBB8KPTkOig40zc%2B3h0IlT8RP8Mv/Ac5iGc8ZnP/hZmvGbiQk%2B7oST%0AKtZK5HGSb4jcn38i0bqBPZgte3F/eWdo98ercZ/e9nny2vElhentkx0fqrK2T3aryJ7u2ZVgZ67I%0AM2Olb27X9/QpdEjcxQSaA9ytUHu3qrkQ2siv63PPdabeZFfGHQGXghdaYPt9KdM6VaAKVIEqUAWq%0AQBWoAp%2BkwCsdPnkK9Onc5pgyzn5az%2BohkngcAD4REjk8GqZinLA950zaM%2BbALyApcZKYuiaeAUHG%0A%2BSjmQHWzpbC9wEkDOPo68eV0a6meKbAEX1CdFAvN3BmZvphzxLgt4dtPYJ/Z3rmxSWiVGZn478en%0AT5r0JLUOWR609ld%2BFPT9u8tHn75EOZP5mec6qO1z2vWle8lken01H7e4PlrcKYtkH10pgn858%2BFc%0AuI6JT%2BFrdyBSZXV%2BQayPLJldp4vHFfYIHv/ibD%2B310pZAqDDL2/2ZJ1C1/88iC6e3eacGqytAlWg%0AClSBKlAFqkAVeKECr3T45DFvPQnuB0HtfiK8RFxyByIvz8VjU0mfYNeNHBIP08H0rJsSZ8S5nwPm%0AnDsbYPWjDBBKMp1ZRYYHqWbiC/zZyTuOInvMxmjGfkJ%2BmBq/GQx5cu84AetkmpRzJEs4NAAgbcSZ%0AmM/05U%2BV2U%2BCn1niy6Z7hPPluM5Xl1PZ5aPOfbH3%2Bc34Qqzz3DqobX%2B9aPe4Hu3WKv%2BT9rq4szxi%0ALrvSF4MHUA90V05TVpU9Jj%2BB/R4BwQ5f1/jq6REAzp5eT40LYzMri4qcpN%2B/W7uz4d0EWastjp2m%0A7X/v%2BDpZlKvbjipQBapAFagCVaAKVIEvq8BrHD59Ekzf6yHwNLKqwyFhnhOAE0%2BSflJExq7MPQDw%0ANXY6yZWZaUq4lPhkmP6E2VhIXJpgfAkNCohNLZ1pgzmwpURyg8QRfHMpqxM/fbIOI4dP42Ggyps3%0Ab2JxHMBwhOGHfPoJ6pyXEtGJTfzAMKepTjAt6Z/TBc/0g39OkeoAO09J/Cj5OesVIvsQyAVaR7Z1%0APNslsXic0C6HtH1uW0sLtU5jS0kmntV2mNm7lbUU2izLcezrv7Drk899piOCz3yf99a5c3Ne8Ocv%0AlsZKukoAkn/3sEtwetxEq73r6ua67mJ9iMvhc1t8STaLnax7eJH89obPP9/T3Ju119Xzhu7Wz801%0AUgWqQBWoAlWgClSBKvAiBV7j8JnG1mPqdcwjDT6PkKyAvDxL%2BrDrA%2Bb1wfaaur6GU2c9gu4hw3W2%0AvoYT/5zIqsHYYHAO6Ytuk2BnIkhGIjgMMdMmuNefjLnMN80TT%2BImhipOAEbCmHgi03H1kCLAJSzD%0ACxSrEx7SGcA4f2qZ4geAQ5zgZJ6rN%2BOkBKOPPTvBHBzLxeKQm6k8pBgx1%2BCMzPiBP9OZZe6M4BM0%0AnpTvz9kHLPTe5zqPZ8jPCS2%2BN7V6oaVb4pLue3TliefLotl2rV0Oh4sf8D4fKsgvb0BtFuLrzth3%0AxzYfyLP4F%2BGFU8fIWrjyc45d3yW7/qymwiN%2BnTnXbfz%2B7f6zNsXh0yb3PUDOb%2Bum/fW33xbr%2Bze/%0A/MbeOYVaY2GWNJeD8gp2VIEqUAWqQBWoAlWgCnyWAq93%2BFyPfR8OzjMeaQy7j/UYeXk03I%2BU%2B6GW%0ACJgz%2BGbKSvtwCINB52xdsg1tMDDhY3Oywg/VISW5Yg4WniSGP85zVFbXQpgBHt/06YfwBY7tRed1%0Aecaww9mJkd9%2B%2Bw2Up1BX04%2BEh05m8KZvMBYnAyr8A6FFDaqPkfgHPAyR7rCU6awy/STiyDNX9V2y%0AhxB%2Bf85FR9SkbayfEHJU24fPdQRdQvPfOnauIxl2/%2BFMdslZpzuOZ/vTRQ9qC87q5Xy4Tp7vTN%2B5%0A%2B%2BS5zQ5iliyXu3i5l7G5KL//rOagXU2uwqsHzPpLD16VUKyPK/e48oDiI9m9nV/evvvl7dtf/tib%0AwvcTUdAkrt7e/JJ3QBp899sv%2BxxqV7vMldMKtVWgClSBKlAFqkAVqAKfo0AevT6H5NNyeYQcJ5qL%0AC4WPljy4Z4R3PXZ%2BePhk6ipgnKRwBIofR0DYDo5Uq8CHI1nweLIKIY4kH2asGXFsAKaEyqyzPfNI%0AFeQsHX/SpmJS7jiCzylpY16gt2/fOmX1X/7lXyz693//92jC4ORJHIe4znPk9gMmjekncnCYPjfC%0AcKjFNBH92KToCDv7E0Z1p3GYhl9ffgCJT7D%2BrDX5v5VvV26OHTLF3x8MvudSv33Pae3dOqetg9r6%0A5G8dG/fRcb%2B0Lgpcstar8vJ9rZtq7Wm/IIH5meewnBIvB9FNuE6oS%2BHD%2BU7R5V%2BNLW81yWEyg888%0AaYbX%2BvrckrXF/CSzWTT2x9v1sSf2D3a0fbulIgdWUn777dd379/85TcCUK5Wll0ffvL16Ztvry/3%0A1K9TBapAFagCVaAKVIEq8BIFXvXwuR4jryPHG842f/zxx1//%2Blfa5yTz%2B%2B%2B/e5JZD5PXhz6SwGsB%0AkwIYJFaMFgC5MqzkPQ4YpnOQwhR7HsLggNNVHKdhSJbt0RsOGDaSdKbxkxgHBnytJOE0yCoMc9iG%0A8djp4N8fsAGQM8hZl04YHjtz%2BDQIjER2ShsMpp4/4XGKlTzMcbKjg%2BP0pqUocUYc2JimxNwFGKY0%0AQEs6wvDTg04iZweA/NPOdFLOIwCW8LWhyup343jM8p/05ADG0W4dI/d3qP6yzmxv3//1j3c4NPzb%0Am19/X3Ii7Lr01%2B%2B6XblvVxaHVcC466T6F9AbtC3LS8w3v/36d39582ZdHM%2Bim2efPOGf12bV22Ox%0Ara724fP6ieWqsPB0cjk6/sbvp33/63qxEd11QaxEutrnZ3rj5PnHH%2B//tk7Ua4ObeYFI%2BYe/%2B51t%0A7KZoaTGsMygUqzf7ughlV7VVoApUgSpQBapAFagCn6PAVz98rme9MZgyPEhgOdgw/va3v3GYWU%2Bm%0Ae6xHwA8PMKaANwW7aRbzeuDcgyBZLnn2MC5G5ptWqlgZgoQEWgacWpA4Aswyxb2EBwC5sSE8O6QQ%0AnFQSGpfBNmJxGC4dLNPzkMoUVnf2hcFperA0lu1o3ZdxfJBkcsmiBhHPn0okwB5AyuxUPxEc/TjA%0AZsQ4pa2ODQAHcu3ayfbB48iAA964FnBGIjcB6QH89APGceROQw2Q3hgs4WMtN/008K2c%2BWp0a76W%0AeEntkx4nz3Xm5G9R1p99VHv7hoPc2hnHyn2yXL1zz7LIWY5EYH/7A7J1Ntyar0vDKQ4LZmVx0Hv/%0AjiOoQYR5undvCbG5LiVsjOZoj/%2BRuMnXh5a/v%2BMbZX99zy8LYtAeZ2P%2Bty/Z2gv38OptbYeT59/2%0AWXp9BLo3Bclf3vz6N37Kc99Hq6X1Ql9VoNjfDwwT0cVI4Hoxb7W7K34EcTuv0SpQBapAFagCVaAK%0A/FwKfN3DJw%2BRPJOtR8k9lFZ/PRruzzx18IPE4TFwPsyBIQvL8PzjVMwEGwGGk3H/ktpPuopDlgx%2B%0AlEqckwbB9Rh%2BHQFTUV9Lk1fIx7%2BSAggrSah07ME9TmucRJyDTUmZM52wZOnMHqjrYBcZRoSZQjME%0AiTg8fxJkCJh1wTjVMYXIdJzOoPwpHQeMVSg0B3Gmch7iLJ0HGILTMk2H%2Bk6TK9jq3g9EmALAnsHi%0Ak/7NHTbMUWod/i6Xbt94u28u5v6ccH%2BfKufJ9X2qnMX4Uchf3755u86Q67tbL3KRsT9d9MPSdVhd%0AZ09OgpdX3v6Ekxzq8NOVWx54dnoEvy2GdwrWBqmCQyO0wt98QAgpn6/uk%2Bebv6yfReUAuQqwL76t%0Adznr5Lnwy%2B5NsReOx39bbzjEF2a1xo7WX3mxLTqk8wWmAO9Z7O5y4db%2BN%2BVKunS%2BvA/H93aVP%2Byu%0AsypQBapAFagCVaAKfC8KfMXDpw9wWAbb1ZnWswTHG7%2BTlgc4Dxv7eXA9TeaRTmTwEroqGMsgjgW2%0AZ8tMkuckP7Q0pzB4psq3%2BMoZWsCzN/ykH8oRP0QyTYps04rxqIONs/a2BwC%2BHmyYdVL6gJTBoBj7%0Ad0c5duoYFEYKU5UhkmGEJfqcPQBgerBmGT8sJUjcuqmOI1gp3ML0jQDT0Z6bIcLSwQaWfnDiBy8n%0ARanCludmWbKZA5W5CX5D53Ibrk/zngZB/qAsp7v1aeHbd3zP7fo%2B1bfrqvHCQqp98vzw8MlpcB/t%0Alt2XBfDbBV7bveD356VcjXf7m25RnKWL8E/1P2jGO2W3dD1A7oPufmmtHJj3/cDrfU13qfW9s5C/%0A28fddc3WjkxfTfKTrLtVjqOcYKmwfrftL3/88ofHTj7wXIfVNd6tnwYle5GvbzDeva4ynzig%2Bn4u%0A%2Bif2XngVqAJVoApUgSpQBb6WAl/x8Dlb5lEs0/WINw4VnG14lMTuZ9Z1gATJE3we4jf8cggRbEQ8%0AlnTBxBOEBD8WR2acwzAOibRxgMFAkAOGtCzphMqUJAJgJJhCwROZvgAjWHM3xyLBEbDF4LF6HWwY%0A9hALBl%2BrY5b2UG4iZTARWAZ1c1FwHOnqgJ%2B18CGBFjvjMrvqkpHpuzqtGOtOS5wS0QGH1UzdVCyE%0A%2BFiHFfWNTzsxVtdekvcX8NbCetjGBqBvP9aa1QP7ho5iXHV4ulLctpdD2vohyf0R6PphTsLrUEcW%0Af5%2Bwfl0QH36us9n6j3uUT0rXoW4fQdclB8zv6tm/SPbNO1Lec%2BQkcUXWS2dBLoKP8%2BYH98oiufDz%0A1U8v17d6X3/sk2Z4BXAL7A8v1yeWVOd3Dr2jNcgvylqL8%2BiFmy%2BQrj9xSPh1f6a6q1xXF8E%2BHcOw%0AjrOXbq%2B8F/oHvpj4ALCQKlAFqkAVqAJVoAr8RAp8xcPnzccvnstRF7ueJ6%2BHHD/5JE6KT/YceHQI%0AghQM3sE0l0hYEnEcsgUmz5xOf1e4nP30sfI4FXzl3k%2Bo%2BymeVVuaJzQiIUldIqk4/QkIm45LKcpO%0A3ayWOIDYOAkeqhB3hHCmsASecZH4emkuR8/9FwQCQNKASCNaE1eL1%2BOxnGFO%2Bh0H8AGffnTMnVtI%0AxdR1FZ7zBjf9kzkAsmCV2MRT16K05GkzcSKAWSVX8jgh%2BeYOLa0T1r7gNMMBb%2B10n8rWYe/9%2BuST%0Ajz3Xz3y%2B5X64oPk7Dy5svu2WMEuePHHY9zrZbWI2vsH7Z0TXX5Xsb8FdR7ldlsuyJdivhyejLHtO%0AK4tpvYrWB5KX76G1SRrYh08UXoROf3vLT5byQ6XkXNg3%2BNLRtRoZsLkjPvjk51EvH4q%2B%2B20FLzq8%0A3z%2BnCnTxr5/3pN3rxbTH2ipQBapAFagCVaAKVIEXKvAVD5/njvYj7uXkuZ4O9/BQwSGHGU/tHjvJ%0A9SyBM2E5gUjOgy0RkThMM87VpUqiDuTGrYKFxwhUMAvDcclyZiWRoIPmr%2B56cnYIi50OvuOKXdXx%0AtTisZkduU2swq3GISzitPGKMh3MG7cHSbmTa2RI%2BbXjuktxcLHFG2suq6ZQLUv9gmTqEzWbwnQqw%0ABLVEMmU1%2B8IBpr0wji92ldU4QiTE1xHsEkjG3uIyk4d4MDMuT1bFfEM7t5M2uNH2fcdhjLH8yw9/%0A/rGOl%2BsAtrTk4t44fC7wTvHcuA%2BE%2BwPS9ZmnH3jue3hdjhRczn7hfRC5BPeXdfq7Hjt3b/vFsK/p%0A7%2BtFuX5%2BlJ/S/H2XXufGdb1YvhJuxemZovvPmmdxVVgF9h8v9A4thtVWRxWoAlWgClSBKlAFqsBX%0AUeAbHD7dB4%2BWjPWsuwfnHCOsEuBRUcvUuDBsYCwBYxDR0RrHOli9us9%2BlXNaoDLrWP0AYCld4bAF%0Ahg5InOBB4mOn4zQRwcnCCYBOOOoQ0WazAPC1BhNJburOpWQlKCw9UCvDTTF11ZRJSyTpnEhBphlT%0Aznam4J9HUmxj9iCYEh7/RFoxdXGAac/k9yMpDUxffEpQl%2BHZmyWrEMHHkiIeZzZwmIr5FhZlPnxF%0A2PE%2B7dE7l5nDpN9Jy6%2BK3a9L2lynuP23CuvzwDXnDr8iuTX4417WGY9Lc/2e2338I7C%2BTTbjg/J7%0AghGQpc2/q%2Bx/rGXTLxQC8/OaVHnLD2ryiSW4S%2BcXDtvbvzZod0Jx%2BtldLY%2B9TwFMX9tRFL9ev1v3%0A0rGUab9OFagCVaAKVIEqUAWqwAsVeNXDJz2uh70PRw45hsGsZ8Q9sidPPiIDC5LINWM9weIn8RGH%0AdGDSHsiJe5zIapAyG88WcNYB9PpNqrYNxixTDjarKTEdwG6NoJ2cd3qOHErM6UGcTA9t2PncV/ZC%0AiuBJq895zD4nLRFG0p2Kx8cJOE5W00AYiLgqWMsqjuMOoYl3rP1g4wDWh1xmrgI9uFOpiLBKcN4q%0AggVgJcn0%2B3G4AOsabLv8faTkRMdh0vMnh0%2BmAJa87/axbx/NiInx5Olnj2iETtwgKLL/TdDlMN0V%0APjj0rYqX8FrMSzbBxU83%2B2C5yPfCvvXA8kOe65tjjW%2BUFbbdr36MpUF78tzW9qj94XnSTi7nz63F%0A4KtbBapAFagCVaAKVIEq8KUUeO3DZ/pej4zXwYM7LpYHVQCxOqJYZQgLCQAGQR1s0sWwdIgcpgKw%0AB0cqwC656hTryBKO7WE9eWINigGPc8278VXYwaaKu2N63ma2PDE3CtwNpTcbAIsTtQ9dMaUWq2dK%0AlvLJp6vmSoVvFs7MnZ27nZkrgynTgoHNo6AM5k4GeWZk%2BqmCM5mtmCBOmHFYpai5XGUitDGHR1CR%0A0ppuyndq17lrNXv9s85163S3PwLFRyH%2B4/zGv5vidlxd588F27mX785dBzwOd2RNfDb%2B4cVf4PPY%0AbdgPv2lodbX/2xdi/b6jNVZH68sHA7b9FkBwXYF1BuYP36C7/hXQ5aw/bG2fh32zWPm3eviAt5Mq%0AUAWqQBWoAlWgClSBL6HAtzl8%2BtC4HiH3YCNXdz1M8tjIMOgeebgXEEcYQcGx4g9WNlOwZE2AU/nn%0AKlkH5MyKb6LWQ4jnz7QaZlLSSdJxJgN%2BIhMzmwGTKY6%2Bjv5MvOlbxUICUvcwJe6YPESYskEsFbMk%0AktNXgkTU4ayGGGyGPExD6FKmOJZOZE6nHwBOCM9sEpqIdRg8MJDLKtbjrrRM2Zfjmv30ldVJ8j37%0A%2B55bDeJwbfcfNrLPn9uuhcuB7fKqYPl6QM3hk0McEi3B%2BQc/OXnuHxVdtAqxquxD7DVwOSheZJqg%0AdbS0gcsVp5m1vv5b7qZadA5Tt1X11QKt7H/Ac58/PYVe7FoicbW67ZWmX6tAFagCVaAKVIEqUAW%2B%0ArgLf5vB52JMP7AbXI%2Bd1%2BCBpJJhMr6inrzPXaBhwGACwTwnrSXaVw8aZq4JX5odZSTFRm0PI9Txy%0AOTDLTAok%2BAcqc2fRc8RyJsqADaGOGOxzw%2BqsmmsV/QRnbpYIJjeAkLBZAXMprVoFDI4WGL4ALMMP%0AEnHCEN8qC7RXdQwGLGGm51WWTBQplXjAhyHGVW3wOuDjHHIznel/Yj8vxP0pIwe%2BS2BfKHzuQV%2Bs%0Ay7/cV%2BtYyKlz/S7ZdfbkmIghdhlXb0XBLcDlf0%2BoRbvY/LMyUmVlrYu5Enfydi9mM%2B0Fb5b9%2B2/5%0A6VM%2Bqc7Hnjh0tg6lEm3kZpMQ21EFqkAVqAJVoApUgSrw1RT4Lg6fPE4yeHZnm/nczGA27tRHf22W%0ATMz07JBrcDp3sqwleKZAkmmqwDOHR6wZCfI5B07wc3VG8B0TcNMHlngIEzQSO4%2BCASc9WYfIAcnU%0AARtIsphiGSYyZYlxwe0vIrEeO00Rb27SccAIwIFnLpmiBYOjnQ5%2BUvSDEcb0PFhikDhzDWpJiTPT%0AJ%2BZP73s45ErqXARBlnVQJMbVvvrruDi12vqseyAn1qMaK3sxM5bZJfi6dN38a%2BHDQS1WtiV5VV6%2B%0AwfV1cSS4Onz6aU8//Fw/Bbq/C3d1S6WF3iT7i2aHlttRBapAFagCVaAKVIEq8OUV%2BDaHz/3oyNPh%0AceSkkQWeYvE5deSgogZ5%2Bo8kRgAnMp0QEjxgLEE8jmCRdxIn/8G3mdhUnMyuWjfpItMJ8dmAU8Ei%0As%2Bp08oQ/QR3iLunos4QTzvjEDQrDD36yEWR4OATDkDBxHS2rOFpJtCvtOox44Lx5VwAAO9P1YcbR%0AnleJnLPsKvacdW3qg68HWOre4TmkfD/TpePWEoOo%2B8/eLGc1fsZ162wcHweNOTrujw%2Bvm%2BCvF3DX%0Af45Ft2CbdvmX/54im5DTIJHF6eAr59X1Nxk7ZR0tF8vubsM2/trhU7er/0WykYtsOYuWDzlXIT78%0AXH%2BRsSiI8MGrrW3KZXbqrlpTBapAFagCVaAKVIEq8NUU%2BDaHT7azn/g%2BMJwxGC5h9XF4mgfHwQaf%0AgTOf7/dzoyv7YfPiri8uYaHCZghh6oHhpkPwkEVkcB9dqQ5RmbEMlrBzgwazlzgiQ7iS9zCOaxUd%0Al2JZMhEbpPiDDX9SdMiauU5ZOrAd0pkyDn9HYNC4fmrJRvBAm0KJ4zDQTXCcmQuAKblfcOyyH5iP%0A3g9fvIcvuJ2PUF2Oavuctg9tnPF%2BW/%2BcyS/8Xll8BvfduhDbslP05mc%2BWXm7qVldL9DLvXnB75WL%0AWSvX1S3rhc0fEF6RDYTWK%2Bnl3LO9tDrkPWEB1zHy2glBE5/sCvEfP3a6loLf508Y/LbbdcTdSwvr%0An51Fyq40W69fBapAFagCVaAKVIEq8IUUeO3D53p4/HDwTO9gR6xgmQbClOfc%2BZEaSzl/HkQwPcGQ%0A4Bw4xexn6P0cvUvjhcHcQ1YISccHP2vFd/UwTa5OVu2BHSUiM3ZGnCZ3Tg0aIQXHjcz2ph/aOKaY%0AGztX4%2BvIb93gLeGVCp5gBkH8LJmYtufUYKyFuBZgItRMNFdy4jha49jHR2hxGN4A0xKEbS9ejORO%0AHi/0nSDX8ezayvIv5zo2vv78vn9tEH/Zc13axz%2BuI596vl//Fuj6XPHd%2B1/551j4pz73C%2BKDC3xl%0Anl831focktPgb0thvK3nBkG7zrQXy%2B80Wp9RwrmaXB9j2hj4yx%2B/rNUx9pTOcpZeKN9TFgN97iY8%0ASC%2BqlctX/9uTwVa3ClSBKlAFqkAVqAJV4Esp8NqHz/TtwzqP9Y75T0RmaT2WXg%2BfnDoY/uMWxOeR%0AJpxxTNTCjxMLxngYdCw0GUwBLF4rYEbW8hhkQQiMbrGsaIXImXh6YBW8iekHmGOSEJlTaWNZnZwh%0ANIXpwbkUuHIeyjmVxMQJwJ9Bl7DineLPqXisIymHKXEirqJYYDoHzrlKVsqFAYD82onXDxLH9OC9%0AXlidxEk8BEMVtnOh7zSyOvactjz%2B4x8m%2BY1/nuS39X21a23fNTjrRMoyV2YfDn/b/xbor2/fcYp7%0A%2B44b3lflOiuOsc6Oiaxcvgf2coy8EK4X6AqvJF46659C4fzJLyziQ9d1sVe6AIDrvLr/0Mc%2BPV6W%0ATN/9Lh7G5gO1ut%2BD8%2Bfl%2BLr6ocSaXg6l%2BLuJa%2BJOvnKuYEcVqAJVoApUgSpQBarA5yvwGodPnvzy%0ATE/Hl0fB6xcf4jl8soSvZdHHfabkrnPn9eSpj13PpfuYB%2BbmuFZ4OnkmYuImeDKQGAeGb2O2kUSX%0AUm7GxdMYjoADm2BX8V3FuhcjTBnp5FCIqSRxmKZDwTJok45DJEUlCXLC9AGcg1mSKlPBcs4sYJlO%0AQpHYQ%2BdnsFkTD8a2A45juZurkyf46QCY3bJExPawDttwSV8Mq5nKyXSSf3/%2BpT3a9FyH4591unvD%0Ar4ddJ8/9sec7/iVTJF875ZyWwyd/t8IRkcPn2/W7ZLF/8Mknf/i0cY3Ljrez0ocCSxv%2BrAPk%2Buc3%0AL7SroV2IFO5TXtvv1qF3VQnbTtyHz/WpLM2sa0Ti%2Bg97dZ5qrWU%2B41w2x07%2BaujN%2Btxz0ZLopVts%0AC8y4HFk332a6kj/R1qsCVaAKVIEqUAWqQBV4qQKvcfikNx7rfCbdT3gX4zM9cT/2BJYjKAif6QkC%0A8MBJxH9CE4tP3PHc3lPLQpniSHsleOLBk02wiTOdVdNjRWKFuQVhsgUgBjtXwZCYs7StAEgn%2BI4k%0ATsJwugpSBu081gKQM45T7bXIB1%2BzlJRUObQ0p/rkmoVlhFd/xy6XmO07zRJgfbMAhBMHZoaRaROM%0AM1fxJ6dLRBbXlQ0nPeAwvKY6O3C5drK5GowA7M1aVvxO7W79crzcZ8Lf0fw3frfwGz7e3MohxeXE%0A6MXkc/11%2BOQs9/aXP5b18On5k4u0/8dulzOv/tLmeo7dp9l9/lz1F3adhtfJc/07oYuQC0J5LxAI%0A/reOrL95avWTz6its/jt0MIra/1Zif75bTfk4XN9wOu%2BrjDxmwXTUQWqQBWoAlWgClSBKvAlFXil%0AwyctXx8JV/f4DJ7aPap5%2BCRy//DJUQoMlsR5WlOPHCFSa9XYAzxftTjBk5JBED9LJpqVxAR1LBQM%0A6SBlwKFD/QkLg0upDj6%2BDgAcLVnikx5n9nbgVK5JS1Y4BU/rEpGD81zK7OomD8FgBKRt407nFmY8%0AKTbA0twRq4mLTNtZMn7HkmLFiTFiV9MSdykWB8ABA5WAyfkd%2BtxS61i5ml0fBe4D4fo4kfPY73z6%0AuX7jLK8a7ul1E65j281PPte/ovnrm7fvOIWuTz7Xh59cF5j53zo3bu9p9%2Btot/XJUZYa%2BFGMK8I1%0AWafOd7%2B%2BW6%2BJdZVzfCUd/D4x7vOnXSXZOpfXypqscn7Kuj78XCl8i7B0a%2B/rlypdeRbVOM3ubPlq%0Aq0AVqAJVoApUgSpQBb6UAq93%2BKRjnhIdPK/zSLmf29dp7fffVxssffTwSYoffubwSeJ6Or01rtWe%0Ajp2JmILNCA8RydKqfSY3DjA3QoqdE/GnUmmPJXmwSSGIb8RCaeDsABMjTxIPbHK6agpZOac9IpT8%0AKWdR%2BzkERaaTJMZJbiJx0nbSjQDIUvaSJVbhZBqbxsJ8dmwj8ftTYZSIc%2BgnXQEQFssSg6uvY2Jg%0AEn6Plr2u23ydBXHZOp1zvOQw9u7NL7%2Bvn/bkRn3HZ5/rGLl3vX850DqFmsqrZH3yuQ6f7/nwEIc/%0A6%2BPQdXm4ZCRdVL%2B8nLYKs9Y%2B0F5OnquB1cjK2cfXi91UTzzA1hGR4/H%2B/HMx7NfT7v/CsFjWxtZ/%0AnFr30j4h0yfnYX6HL98zfP1%2BY9Ivn6Puc%2By6fFuNna9ZbB1VoApUgSpQBapAFagCX0SBVz180vF6%0AvNvDh3We2pnl5OaUpQtoPQquwQkqg1V9nkkdYvB1sKTHTjZpA7sSXJ6Uw6Aj2D6xhwOGq3TCUhIt%0ASnAypxk7SWO2EeR0WHKqIzI8lsZKGCeEdqVKYOxnUuGHzazkzrrTnzAbCAkOyJvWLPEza1aPP2EB%0Ay2AnSn3oynRhZ2tjxGeHmc7cVNSJjcgB6wQwb4yAKRH8uatvGuFK7ZcVpz1fMfvYuT4R5ADGj3ou%0ArRaA2bqR2cfeSz6r3MlgfnnL37lw%2BHzLN9/yW4fmJ5/eDfvYmguw97xydznEmR%2BlXl/oa/ly%2BFy/%0AcGjx8N/kMHH9SOpvb/wI9PpusRqVxypsaHe%2Bz6ucq/dnnm6N76BYKozPUdfuLufPzcNqGt5OTRWo%0AAlWgClSBKlAFqsDnK/B6h08f1umYB3T79ixB3MOnznq4vD5O4oPk0ZOIR6nY9WB6HVGBAL5ZBvEd%0A4QwYR/yVZuUaCSa5pDsSEUNQhzgO1g7lPPCYKzJLqW7pTAEcSOTXSkV1HG1oyfK0mU6cSohlCJbE%0AiDbV4xDH16ZEEhMJJs6kFR/LUhIPTjA6IsOJkzH59UM1l8AzjdVJxJTY6eCfx6GQgBw%2BcyGMA8Yx%0A5fuxtLRF2I1h9re0rmPY%2BjuUd5zofuH22R8Pcm/xja92zkGRwyKR5eyTGyT85h5Op5zpPHlyFt1/%0A64LasPq/lb2vwEUA9Vjllkae95YTmai30tdYdv3A6b58lz6QlD98XLneNDh/Xr9p9koIeJXYhBw9%0Al7tPz7xM18eei4XK79e%2B8HfWOsHCc93a7svMVXoPGllNdlSBKlAFqkAVqAJVoAp8pgKvdPjk2W09%0ATu6xHu/24HmXAPG/%2B7u/wzIIE7ks7y8CWALsacqj1IZfzGZdhrm%2BPPiTSl%2BAVrwsRDINJulUP58x%0ATAkGJx2GTSqWcII0qJ3V08AMAjN%2BIAkbvWVJsBJNG8KUTnoi5oqMNTgxJhKxqEt2OLPOKak4Ew8w%0AaW8iQ55ayQ1hnCwFfHACsFbqxjn0EJiJFjKo/tiMrKbKd%2BXQ3nqh7GMnjXH78AOey%2BwDGIexHbt8%0AAy03375xAXhidHMrzMeinDb9ac998lw3KvFtFsCxvupfD5m8GmDxHKsFsl4i%2B0h4Idm3/Wbb4b0k%0AjOx1mOTQuH88dR1B13c9Q7mOx3vsY6ef7K73mE29Nrz%2BSVJO2esDXVraOyJRKj71xd88e6fXO3y/%0AdiHpqAJVoApUgSpQBapAFfhcBV7p8GmbPBfG4WkRnwjPmlodglkSvx9GlyF%2BOFABJi7nTQuDJDr6%0AEyl5eM5sJvpsy/mTqb5USRfmaoKyiRRAIafpQcxMScSunIqfVBLOZiZnhNKZnAcSsowEg8Mw0R7C%0APHMT1DELe06x1Tu5kyrg4Ce/5FY5ZDk1K0vpx/ZMzyqO5eKk6HTiHxLNmvfGZDuAzz1PwKv5%2B/Kw%0A61VwXat1LvPbUznC7SknLz7T5LfX7mPkUuiiklqRsZJZXJ98cn57w3fFr9%2BMu38/0Ho5r0PeflF6%0AKxy2dhXTo%2ByFE8xqZENpZ5Mwvzi7wcuqyHUS9tD42%2BJZJ1gbXQzuanNBseLrn1rZHr9Qm%2B/rZX%2Bu%0ArurrHLtOob/wfrTAO31vApe3pq3SBb7wV/cjX2F4HPwRri5XgSpQBapAFagCVeBHUeCrHz59AvNR%0ALA9kPK%2Bvx7s9ssQMMFNW9QVgCTpM5FyUoBhWA9bJkx%2BOfpwgzUruYRoeE7FUZ4QHhxSGjgAj2FSZ%0APPjA5pLI2Dhgpp8U0mXQmVYMWQz6xObkuWOXlg7pYZ4VxceKSSLT6QM75GYaGI4juTgZMjAFoz2D%0AUyVgHVOSK6fBicR3qhWWLMuZFRtnwpKoAwap8XNjEGEcYN/PdOv71A5TLh79cvr6hVfV8tapkrt8%0A3zx7I5ej3dpW9sZdz/mT307kr6VdJ9X1eeI6ql10tgjTp2rrdMd/2262XTCcLO47Cbs49m012K5U%0Au4195rx%2BaMlHl%2BtDy72L1eOmvWyMSwPvOm7uivxKpHGeJLSyVu6FYTWTbe7dj/Y/wV0sHVWgClSB%0AKlAFqkAVqAIfKvDVD5%2BznA9kPFfq%2BNQOgAgDhziOq1gdlxbiOjxZmTj5b/qSTDthUDo9O4GtPvaY%0ABwxXCV%2BbuhxB5QnbJMEHn0icmZLEm0HTY3EckzmJHB4UiojBVCTLlKQzFbOxFzODpph1sEkU7xTf%0Aca4VKgAHcFKSRQQ/sFlLcGxo47A08fhzKrM25eJIe3PqUgBgGN7MuUNCa8WZ8s19bnnPV5ct7C/0%0AyQFsf/zHX1vw8SD/KMnlA0JvWVP2fWPCOtzxYl3nz/3DmVhfTNtqbu/1evetU2h8oevVuGjWB5Cb%0A/xK%2BMO%2BZWUvzcW5c508Pjfv0Ccaf%2BTRjnz/9%2BU92xVj78Bgsz76C606b29ygDdxdbqrbZjF%2BDHM7%0As9EqUAWqQBWoAlWgCvxMCrzq4VNh51Oaj%2BzraXM/c7KEbzBXQTxxhrA4wRjJVCeFzk6QMzF%2BHGDm%0AYudIHAeweB1941gHuVf3QpgpziHlMJ2A8NgMS9OR03QsMmIzXNXKk9y5JJ7IdGYWftKTCNiU2Czh%0ApNBziRMs/mCZWmI6%2BHNIPiPx015IsjRbmj6AEMZJ1mEVgJjYc6GZ%2B5343JVcN86c%2B6C3LAdJtsBP%0AcvJzkE%2BKI8VVjXEjs04KnykyeNmu0%2BK%2BCxbnHvvLps5%2B18tg/6fzZHf0mrXYGMtc0o9y0sY%2Baa7m%0Af%2BUX1e7PLQmu8%2Bflf4sRhmX3NumVj2f3Vj/86HNtbfNsxs2c3a70R4bX/RFkMVWgClSBKlAFqkAV%0A%2BJkVeL3D53w%2B41mSo5HfPUvcR0usvsgDfsK4YMen0VNkpoM/TM%2BXfBJOP7kwSBJHEqbisTrE46SQ%0AuZmenaTEuclDMFSzkwTNkgQb51BR/LQiD%2BlOzU2JgzMTJ35mzULGpw3DnZSJmX540lUiccQnK87s%0AKulxSH/OD3Mw/o1J8NNJuZn1Tf10tM5Wa7La3Qc%2BPP5w8Fzhp5PX8jzVjb732RPc9ayYc%2BbFeUof%0ASRf3Srin1Fz0a/iZ52pqT1cfy1mLy71EL9eFvHX4XB2vP/PkaTZp6/NPsljmaI3dLG5tkbqpZRfn%0A4rkEV84qt%2BYdVaAKVIEqUAWqQBWoAl9GgVc6fK7HujGcroe9EXe6nnn3ce6wZByO9ay8R5xB/Kw7%0A2W6CPsomw7QHHpZCEieYT23gzBAqnUMn4ScxnUhyk%2BqQHvKZcicx%2BOlMPH5aAhM/ThJnlsFg4twB%0AZ%2BmQm3j4D84k158R0g/TEB6WgLlZ%2Bc9ZRs7xSfiavp1cXkaevvYHnryuLh8SsqN19Lq80HZvN9tf%0Ax7rLC3Id6vZr/OmEONMP%2B9tHvPGWMFwPmJfAtYVdx9PgpRu%2BrJY20T43rvnFmcUA7PPnuh0X2zpR%0A7lOlIBnMJR7CSVG/ClSBKlAFqkAVqAJV4Asp8EqHz9ntzcdYAS5NOxMnxsf98%2BqdyHN1nzsznKnC%0AECcthSTOOZ3IIVHMzRSDN0kMhirOjJsekjgTg3/IJRJkHFMO9pB4AM9pkHEOVE6TMmHTP8BukhC8%0An5IqSZ/46d8EJDgdsw6WQjfZZuK39f1rH093tKoyOJzM%2BM1BHupGh%2BvcdjkR%2BuVytNxHzn2ou4Q9%0Av63VC3yQDHcv3kQkeCk5qPysdVNf8gXT8%2BUUuXT/oPDKvo61gTW/HJMNL/il5BV7OT%2Bv6HXPV4p%2B%0ArQJVoApUgSpQBapAFfgMBb7B4dNufTQ/PKMbnFbwAfay/Up7ziXuk/d56RCZDPHNzfQOWzBn2nMD%0AAR%2BWEg/JOXJYguGMOUfMMn4zJbRn58CWng9xEg%2BR55AHWCo%2BFw/g7CTlzqaCOaQ/F5%2BwYOLM1e/W%0A59i5TlbrPLbcfWFw1gFsfXuqx7Rr92vuiLcSVxoJlxPaTr6sB3bNu/n1NnifARftoeKaHnnXPIfH%0Ai/MB5kqySTehPW/3ShcGA09TUbVVoApUgSpQBapAFagCX0aB1z588oCe8wY7YMqYW3F6MyjM9ANg%0AMrzAf5ztjJyRF/c2SQ7931kK8oChjRnBn5qTNVdDMp1zylw9MzzCf7OowZl%2BE3ao/rLpc5v6pIo3%0AwQQZU3amL2vydbIuJ899mHs6ln14Y9zewCmawOEjx8c3EgZT9qeu12PhZFmNptmnA%2BJT%2BlNspuk/%0AoZh/MLnOj8EzRyNVoApUgSpQBapAFagCn6fAax8%2B73ebJ/h5GjmkfM%2BP9V%2Bjt7MUH60yAabPiHqe%0AI9H5uZQAzs4dtgP4gHyu1gF2IHnZlFrP0T4Xf6QQue7iEfB3gjkejT3XEd0fh97bTk5/33gnTx%2Bz%0A0tHl3Di%2BXfZWd8%2B3vle22Uz3DrG3iBurAlWgClSBKlAFqkAVeEyBb3P49Fk/T%2B1OD4%2B8BrOLw2ri%0A38qZ7X3V3mahF2z2BekvSHlBY6b8qLVeLMjrJ3oJ1sH8%2BsHiNfL8ae1Wl1/qk8NneZ5dOHTzaW1/%0AmHw5ht6iWOWPh/YPkzurAlWgClSBKlAFqkAVuK/Atzl8pqfnzh7n%2BDkiyf2D33NZaeDgvIztU6sc%0AimZ6v3pg03mu9AuoJm3954Q9KDN1fjDlwPCdTD1Wafmm3DU%2BPGk9d/S7nNNuHdc%2BYWuyfw5JP678%0ABLkLrQJVoApUgSpQBarAt1HgGxw%2Bn3tGN/7c6nPyfCr%2BOR7jX5btfq3z6hes/gWpzn02EgXU%2BQdT%0A%2B8NTZ/Z627kcSp87m95Oeib6RUie4W64ClSBKlAFqkAVqAJV4Jsr8OY1O/jBntFfU7rWqgJVoApU%0AgSpQBapAFagCVaAK/KkVeNXD559aqTZfBapAFagCVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapA%0AFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWoAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWq%0AQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAVqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAF%0AqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapAFagCVaAKVIEqUAVerMB3dPh8//79i7fRxCrw%0AzRXoDfzNL0EbqAJVoApUgSpQBapAFfieFfiODp%2B//vrr96xUe6sC9xXoDXxfn65WgSpQBapAFagC%0AVaAK/OQKfEeHz5/8SnT7VaAKVIEqUAWqQBWoAlWgClSBH1iBHj5/4IvbrVWBKlAFqkAVqAJVoApU%0AgSpQBb4XBXr4/F6uRPuoAlWgClSBKlAFqkAVqAJVoAr8wAr08PkDX9xurQpUgSpQBapAFagCVaAK%0AVIEq8L0o8N0dPvsrQ7%2BXW6N9PKxAb9qHpSqwClSBKlAFqkAVqAJV4OdV4Ls7fPZXhv68N%2BOfdue9%0Aaf%2B0l66NV4EqUAWqQBWoAlWgCryeAt/d4fP1tt5KVaAKVIEqUAWqQBWoAlWgClSBKvBaCvTw%2BVpK%0At04VqAJVoApUgSpQBapAFagCVeAnVuD3j%2B79H//xHz%2BKKaAKVIGvpMB//I//8b//9//%2BX//rf/1K%0A/KWtAlWgClSBKlAFqkAVqAJfQ4H/8l/%2By4H2I598cvL8T//pPx1yOq0CVeDVFPinf/onzp%2BvVq6F%0AqkAVqAJVoApUgSpQBarAV1Lg1/6izq%2BkbGmrQBWoAlWgClSBKlAFqkAVqAJVIAp85JPP4OpUgSpQ%0ABapAFagCVaAKVIEqUAWqQBV4sQI9fL5YuiZWgSpQBapAFagCVaAKVIEqUAWqwKMK9PD5qFLFVYEq%0AUAWqQBWoAlWgClSBKlAFqsCLFejh88XSNbEKVIEqUAWqQBWoAlWgClSBKlAFHlWgh89HlSquClSB%0AKlAFqkAVqAJVoApUgSpQBV6sQA%2BfL5auiVWgClSBKlAFqkAVqAJVoApUgSrwqAI9fD6qVHFVoApU%0AgSpQBapAFagCVaAKVIEq8GIFevh8sXRNrAJVoApUgSpQBapAFagCVaAKVIFHFejh81GliqsCVaAK%0AVIEqUAWqQBWoAlWgClSBFyvQw%2BeLpWtiFagCVaAKVIEqUAWqQBWoAlWgCjyqQA%2BfjypVXBWoAlWg%0AClSBKlAFqkAVqAJVoAq8WIEePl8sXROrQBWoAlWgClSBKlAFqkAVqAJV4FEFevh8VKniqkAVqAJV%0AoApUgSpQBapAFagCVeDFCvTw%2BWLpmlgFqkAVqAJVoApUgSpQBapAFagCjyrQw%2BejShVXBapAFagC%0AVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapAFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWo%0AAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWqQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAV%0AqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAFqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapA%0AFagCVaAKVIEqUAVerEAPny%2BWrolVoApUgSpQBapAFagCVaAKVIEq8KgCPXw%2BqlRxVaAKVIEqUAWq%0AQBWoAlWgClSBKvBiBXr4fLF0TawCVaAKVIEqUAWqQBWoAlWgClSBRxXo4fNRpYqrAlWgClSBKlAF%0AqkAVqAJVoApUgRcr0MPni6VrYhWoAlWgClSBKlAFqkAVqAJVoAo8qkAPn48qVVwVqAJVoApUgSpQ%0ABapAFagCVaAKvFiBHj5fLF0Tq0AVqAJVoApUgSpQBapAFagCVeBRBXr4fFSp4qpAFagCVaAKVIEq%0AUAWqQBWoAlXgxQr08Pli6ZpYBapAFagCVaAKVIEqUAWqQBWoAo8q0MPno0oVVwWqQBWoAlWgClSB%0AKlAFqkAVqAIvVqCHzxdL18QqUAWqQBWoAlWgClSBKlAFqkAVeFSBHj4fVaq4KlAFqkAVqAJVoApU%0AgSpQBapAFXixAj18vli6JlaBKlAFqkAVqAJVoApUgSpQBarAowr08PmoUsVVgSpQBapAFagCVaAK%0AVIEqUAWqwIsV6OHzxdI1sQpUgSpQBapAFagCVaAKVIEqUAUeVaCHz0eVKq4KVIEqUAWqQBWoAlWg%0AClSBKlAFXqxAD58vlq6JVaAKVIEqUAWqQBWoAlWgClSBKvCoAj18PqpUcVWgClSBKlAFqkAVqAJV%0AoApUgSrwYgV6%2BHyxdE2sAlWgClSBKlAFqkAVqAJVoApUgUcV6OHzUaWKqwJVoApUgSpQBapAFagC%0AVaAKVIEXK9DD54ula2IVqAJVoApUgSpQBapAFagCVaAKPKpAD5%2BPKlVcFagCVaAKVIEqUAWqQBWo%0AAlWgCrxYgR4%2BXyxdE6tAFagCVaAKVIEqUAWqQBWoAlXgUQV6%2BHxUqeKqQBWoAlWgClSBKlAFqkAV%0AqAJV4MUK9PD5YumaWAWqQBWoAlWgClSBKlAFqkAVqAKPKtDD56NKFVcFqkAVqAJVoApUgSpQBapA%0AFagCL1agh88XS9fEKlAFqkAVqAJVoApUgSpQBarAN1Pg/fv336z2iwr/%2Bqfr%2BEXbbFIVqAJVoApU%0AgSpQBapAFagCVaAKfEsF%2Bsnnt1S/tatAFagCVaAKVIEqUAWqQBWoAj%2BJAj18/iQXutusAlWgClSB%0AKlAFqkAVqAJVoAp8SwV6%2BPyW6rd2FagCVaAKVIEqUAWqQBWoAlXgJ1Ggh8%2Bf5EJ3m1WgClSBKlAF%0AqkAVqAJVoApUgW%2BpQA%2Bf31L91q4CVaAKVIEqUAWqQBWoAlWgCvwkCvTw%2BZNc6G6zClSBKlAFqkAV%0AqAJVoApUgSrwLRXo4fNbqt/aVaAKVIEqUAWqQBWoAlWgClSBmwr8eP8oZv%2Bdz5sXusEqUAWqQBWo%0AAlWgClSBKlAFqkAV%2BJIK9JPPL6lmuapAFagCVaAKVIEqUAWqQBWoAlXgpgKfcPj88T72valIg1Wg%0AClSBKlAFqkAVqAJVoApUgSrwxRW4ffj81HOm%2BOfsF2%2B6hM8pwCU4j%2BfAjVeBKlAFqkAVqAJVoApU%0AgSpQBV5NgYd%2B5pPzzK%2B/PoR8pG%2BoHoEV84gCXJpHYMF8PfHvdPL1imZfL3Zutv09N/zinTbxOQV6%0AD9xU5qYsN5EfDb74BXW/hxfTfrThbwi4ueU/6U5v7gVt/6Tb%2BaS74mfee4R6ToQAdF75frjf1Ss3%0Ac5DiPP1zdXvu/07k5ta%2BN/3v9N%2Blz1Hg3pHycGdwTxwin1P4Zbm9L7/sJfgcPT%2Bnk8%2Bp%2B7I758/V%0A7cv22Kz7CnzOPXCf%2Bbz6%2Bnf4uYdHIq%2Bpybmfs0qf08%2BZ7Vzx%2B4n8eDv9nB15Xf5cV9Cef85dP/c6%0A%2Bnw1JvOXuh8%2Bp6sv1cPc133/z9Xt/b24%2BuPt6JFdF3Nfgd9zc/Aa4xbJK23eLsaxjPt0z62G9jlA%0A45%2BvwHNX547455Q74M/vsAxVoAr86RTwXaLvDF/kwp3fcr8I7Tcn%2BVH39c2FbQM/iQJ9Bf0kF/pl%0A2%2BT2%2BMH%2BL/iDDzPdnq8B9qmjVa/p31fwOZmei99nc/Vzch/h/xNhDhdiTqc/FZv%2Bndtv0M8AAEAA%0ASURBVJ0%2BCJNh1roZucl2M3inpS%2B1dO4W5kPw3Ns58qX6Kc/rK3C43DZwCH7%2BFf98hldT5rD3m4J8%0AZjPPqfFc/NzSIXIz8WbwMzv/GumHvRxKnFfP%2BzpHDiTfZHruPG2cl85bOEeS/qdwzns8R857PEf%2B%0AFJu93%2BR54%2BfIZHhOhOfiM/dx/9zDIXKz3M3g40U/CXno55B7Xj33do4cSL7h9Nw/zRyC5/7PkW%2B4%0AhZb%2Bsgr8%2Bu7dOy8w90Eca3hn5P6I83gH89Z5zn%2BcTeTk%2BdTcr41/RKLP739W0U8kzkGrFI3zUSnu%0AIw%2BFDtMz%2BYHtMD3jv3jk0OFhei536PAwPeMb%2Bf4VOFz0w/Tc/2de9EfSv3YP503NyKF6pnEm%2BAX%2B%0AQYHDVMIZPNc9R2YbM5f4YTqR34P/3F6eix96PuzuMD2AX236XPPPxQ%2BNzV1M/wD7etNH%2BvxoY5Nk%0A%2BjfbPrAdpjdTPjX4qT18Kv9z%2BHPdROLM3MPeD1OQ58hMf9A/lz5HJtWh6GE6kV/Kf66f5%2BKz7rm9%0Ac2Tiv4l/2Mhhem7psIXD9Iz/3iIf3SAN/%2Bk29cVFXh9vMhQChwLaODeDz/VxFtRI4ofpczw34yG5%0AufpdBaNhuvqyzc%2BLcvYPRafmH23jo4CQ42SbZyewEJ6dYF7HSZPpfEbSg31%2B827TT50vq0Auuk6m%0As8rhHphLj/i5eR4Bizm08QKGx2tNZOoe1DjESfmkliY4fpz7bOfSiaTzUJ2dYL5P57CXOZ3%2BbN49%0Afs87PXQ%2Bp9PPps57SSSY13dmq5/aT3LPTjYi52SefmBf0EkzcH7tWmk7Re84s5lH/JC/2LnTTDjT%0AydkJ5us56dASczr9NHBuMpFgvh9nbkF/Ruwz/Z%2Bd72cjn9TJYY/Z1yeR/KjgDz75ZJMRS4fPRRPB%0An4CbihzEdRobh9wDcrKl4sRMP%2BCbwax%2BbSd93iw0V2/2eTN4k4rgZBNDxKCOdiLlx56d56qIfG71%0AHE8DqWskyJQmMn0Bn1outI87h36%2B/4Yf31qRjytwvg3Od0LY5o16/xYN7YRNP5yPOGEDfIfkztIj%0AVcDMQk6jRpwzTPLHqweJM314MpXzbGnDTliavkjTz3aunjm/VSQbSQOJHJxMg8Q5b3OqN/2Z9TX8%0Am%2B2lUFYPTqZB4nzzTd3sisYS/1RhTTzb7Pprbzmdp%2BInOZ%2B63wP5oTpTI2ebxFQ8KwMmq8E/F5yA%0A%2BNbNVOfczISd2zj3cI4cSjw%2BnaVnewd/9nwgPzR86O0wPeS%2BwvS5Dc4dHTD0nLZ1Mk3D50iWXtk5%0ANH%2BnepA3m78ZvMP2wyw9/cIhthSNcDJy/ozD0s39R8SDw3QO0pnKEGdyTv9cKCmz4cDmaoIH5z7/%0AAfz49EB7mIYnHQrIVMBzWUnHEYOd43x1YJ7DRCKT6o5/H0lpc9OD/Im7KoltzFrGD%2BAJeM6/35VZ%0AN2kNxh6clPviDYcZ55HmJ376Nzc1AWf/kXIvoD0Xev2IW3tB8/O6T39u4eY9cLPi/Qbu63/IPUzP%0A/STyODIpzzlSYecAnOk5MZuKI34iXYqFLf6E4U%2BSyWMDRvDnUrLInenxxWcK/jAEHIKvME3duaOz%0ATycG3ULsYUdOw/lg/weSO1mPME%2BM/n1LuWxHP1MS09ukvdPhF1mataZ/IE9vhzjTZOE4DOJPcHZ6%0AoHJ6AM/E5/w7iWGLA8nNuiGfyAR1DomHVaYzVx/rcDX%2BIVdmLAMMVoBT/ESMgzkwPDg1MRYnfhio%0AxSCOTRBnTs2aq9OfyBnXv5N7aGZOzz5sFsIyAGBTLr6JiX/USeJzyE8lnDyHXWQ6ObOXdGIEnkTw%0AZ8oscYAdlu4nnsGfE5kdTv/AmU2BiX/A/NjTde%2Byw4Nl6mFG6zT%2BBJOrcJFvTuPjvHnzBnsYB3Fl%0APgRJSZXpBCYg01dwzn3OyPRnM3Mjj/d8YHOKzThcKeIWpQQjssdhlfhs7OBnNc4BwNQq9uDUNrJk%0ACgznwRLBWJFfw0YKyGfDth07S5%2B7na3qT3x8%2Be8Agvwazp%2Bouq0%2BLsKXkjR1cW6OtETFOYgzzaoO%0ADIdIYAHHOSOJhCHOGSbDczzPxcNzBsxa%2BE6x8719%2BukzVDqZptbBASBGRwtmOk5nYvohuJr7cIg8%0A06bEBEzaL%2BvT1CS0nxk5%2BMHrxN5xwpCtHRwA1v1o9VB9jpMtHEiyBeIHP9M4yT3sJVMAj2xKws/Z%0AuAz2c24vfaaf6cxV/TDozP8fnIWyzemE%2BXO2M9vAT9E4ArQpFGeu4j8XP8DOU8vF4sx3EqaMZFkF%0A67Dudfb0bEAkKTrnyATMEokbjMXJAIOPlTYNxMlS2G5G5urjvqXB24/OR6cAnuvWtgEEo/%2BV7JRu%0Alsi%2BEjTiNqcFEHA0j8NqdhqqBGfk833bsNxH2dLzGZmlOAdMSrza1g4NfD/TyyefaQjJGLxrOKZP%0AxCkWvBZnioh/nhoE7/kHm3KmhyrOBMSXGYxO4mfnDuBcIpE7WbNE8AkmojMtGGmxxM8lZiQ8Z%2BZE%0AcIBlXC/U0/ViyaIwM5giOAMEdvJIlQhgE0nRz9LBsYSWJW8MpnHEr/JjpDqxA%2BEnTe%2Bkp6UDYRrG%0AyUi3RM4Np1uW7lQ0MQw6H8Uf2nvxNHXTxrn0OZJyh3TiidzJSnqKxvloVvgPJHempHyU9k56liCB%0AikFEJzcAjkEssDkOt4HpATsFT%2BQwCD63epMkQXgklCH2wM%2BUFJFz6Rw5r85a%2BBno4EgEZxaSfNpJ%0ADjjVcW4O8SzpJMVC1tISoRlshilYmc%2BXxriwlEgWDlRzqj%2BDN7NmygQn/X4Wq8nCcZB7dW9EZJYW%0Ay0616cSlTD/VuZ9OQ48QCot1GyTqTGtQTku7HW1q3e8qsM93KJS2YTv7sxN9MDOYHpKLM0duXZHm%0Aeh3xc%2Bve5Ax5epskc3X6UNGAEZ1pic9agmckVGSd4%2BdI8Dipa5ApQwWmnUgI5Ywmk5AlGGLnkvEZ%0Aic9S/DgziO/I1WEa5GpoXBrjRMBgA/viTnqwNy1Vbk7T1ep1j8O9RBbhFzd5MxfOO4T3V92Idu4I%0A36sQZrejdVM3mwn%2BSzmzf/37dSf%2B0EOWdKYFOWmnf1g6cP7A0/Uzn2wvqjFlMMW%2Bfft2z5ajj3Up%0AeKVBSgfTg%2BOUm%2BkwLgnX10kI40T0icRPxQk4%2B0FmaTLf9M8pyZ3OzCXuNDbOTMkWdFiKM2H6k3/6%0ArIYcx0uTC5SpGPnR/LfffpvKz7oHcrvSBoZjV7HJwnFYGh/nGlvvVpJg04ARplkN7XQgcXqonmmc%0Am1lJn04a0zn0nHIw0542DlMGGO0sqp9C4TljPrr0XArxA3%2BQ5/jsMH6cm4mTJP45JbkHJynEP5o1%0AwQeeO9OP0t7JPSzRACMvFu9YbZCUO1x6IgwBpONMy9TVjXq6T5IS5umEIc5cnYTxJ0B/logf54w3%0AQsU5ooZv8k4nILXSSRyWQB4KsZqhkkzjZAnnkCiVpeelwU%2BhpEMopzbx0MaxSvqMc4gzPaQImPaQ%0A69LMmj6r4rGfNFIRtuxx7fb61kScAUwb/H1ngqefLJr8qC9AZOzN3XkFgwkzpbORvafL%2By1xBjBt%0A8AdHwvuYQ8p5mq7sHEAcwenk4EyqkJh%2BuGMlFAOJw/26fSI6pONP5vimO52Y6bN66CSlZzowshz6%0AsThzgMn0OT%2BAc%2BnogOMAgzObufSxvxzUmEtWmT0QOUwPnWSKk4o4GXaiNSindb1A8V2KxTn4RmKf%0A6y0AHerixKY3ndlbloLHsT2s3SpgZLSHBzuxnwmevh2Kmf5zEePTmhU7xc82wVt0buT%2BdmaTs9xz%0AcTDn/k08xz%2BHJDuNc2gP8jlYZRobsMFM7zgUOoDPkTvp33Dpd/q2V6yDbrgtvDPWoXOPP/74gwju%0AXrmcMUBGOJwM45lyG2VwFrIKEQHZPHF8bYJgiIRKXxjBwHAO07l08A%2BFDhUFn9kCiwNyUuHPkaJp%0AXseNm/tIFTil0kkJL8Tl8uwvuTSpiNppQ8elA2GWcJKrQzkcAYesQydWxxoPFfsN0tsAzIFz8uOD%0AP0TEE7%2BfmFwZDpYpI33qGMSSCzkdEo9uTrGuApsNmGWr0zcS%2B1xKAJ/kHArNKYWcWhF/lr5ZRXxI%0A4kzwmWTCpj%2BzbvoBx7kJO1cUdjN%2Bh%2BqABznH4U5IJ7nogPEhcQQgCVOc2dgV%2BPSOSiRZccyKlS1U%0AIQybjoCbhKQQB3BenZFDCbKIRATfSZge3uSTBVWGFW01Ng0EFiVxWFVMrCnBZ4pD0JHGmOIbhBmM%0APET0dVySIT7TwxBM8OyQleAhK9P7ABlSfYLxHe4r/jX8tJre4GGwWYbLLOHDgMVnlbhOsnBuDsHY%0Am6uHoLRaluIIy6pOrg7T5/ww0ABjbenupsCkpeTO6ll93AmnhNgM24aKCFYkNsMlpikn0rg8kmAz%0AjEtIbrZMfAuwLqUlpJU/zAadshTHotKKiQUDJ3YOVy2UcjrAcJJ%2BcFi6D5h4K1pdBfJO4lQAKZbW%0Aqgk%2BTpYSJE7wwR6ApZ%2BDb2nsbC/BWddy8%2BrICdhmUmI6WQI24x/17SFdMdU3PlfxYcNayw4DUz0t%0AMDBBmnWnkwP4JtLqH6UyN%2BDg02d2iqMfsG2wBSJzO0zvd8hqeg5bImfnjDlHzllGDsibU4IZZOGb%0AS59zuEcirGqnY8ojNrkBnyNZ%2Bq6cp2%2B7jV7eE1jfO7CcPB34jHXXXP8qmn0%2BN9inS6jM4IGeQboO%0AkSSC9ApNa3pIBCcYh/j0M4VKn1XGZMY/TMUEH8d47My6ybmJn0xoIdwarC2znL2H%2BSabqxadACJe%0Agn01luHqYA2Kt1wiaE6cQQP2ICGRMLuknR0SsZMgkwU/PjbVUxGwVJSGTWtXIRdwIE8VGaYF7xa0%0ASUwKcYbTs2/EDmfPQcJvh2xntg3AVrGzaOpOBz%2BwOGYdpgYftPQwkZnGYVX%2BWBw71ybdlNg4APRD%0ANZ2k6wQZZ%2B5u%2BuCD0cn0wHmYhkTnMD3T3kxPlnhKM7xdsY7zTZsbNQ7pUpEeqlmRVQE6%2BskKcqav%0AVsYIJgw4vljCE1rBTsWLwYcycfzQ4jjFsmUtCvha8D1kCiIm6VaZtbIU5tTFiXRuIVNoD5uS59wb%0AyAxWBUxmIqHVT3uzt7QnAzbOLG3zRqaf9OkIm%2BCUnrnW0mYvcRLHIRhwaKFig3kvAqMP8ma5xzuU%0AYe6CSNLtZE6DFOaSMDt3U0SykemIt%2BePbgpAyunMokbOmEPKnAasI1taTf%2BpQi7IjPu3K%2BBJ5QsK%0AThzijLB5KQ//V3iH3C2EwaldyelSYEyzlzisEifLFBwrTh4ZYgNOik4AcWwA66BoRt5JIghLSbQH%0A7GHYHkjbsxOz4scJmw49JBJfJ%2B3hQG5L%2BiGH9tAMU2tNC3428JyfTg54pmkJn2ZsAyfDCHY6TqWl%0AaFrNm0MirDoEa0mf0/gg8YPHERmHVSNp4DmqcAaQREnYIBG3mUsQMBWzhTg2hrXJlDDyXDCwg5Na%0AxJ/zD5wPMoQQ2vOQxL1ka8DwCWIDIBhfB0sw%2B03wB3A%2B%2BG237kftvEV8IvHk%2Bbe//e18yCFF%2BaKs%0AEcVKkFcIdxuWITOOieIVfVqbkSFWcJYyDUDHuGyCse7rYF0lSKK%2BTqaHdHnONrS%2BwJyamzsMh10n%0AqBMbBiIHXwzBLFEFPR1eHX2r0zy1GKbMveiHP47xJMJDeoKzyfRgLkhGquMYNwUSIl50LFMsAAvJ%0AH3KZY3HSAE6GcUhwMix6tgBm0G5tOBZHHkvQIYMgllx6dswGxLMqf2x4pkOiU%2Bz0E8SRysgZM1dn%0A0ZuJ6VMHDM5kMIvIYVidYBrQyVSA6QfLNLA4wR/AlHApTpCHXKexh9UDbUhwnkuhIleW4R2LzXta%0Amrle8A/%2BxuRQGrB47SyHn%2BlsKf5OfTI04wQAjulY2og1KAN%2BqIzHBiCPNmAda2G3DBcp8h4SNVwV%0ATKJFU0gnhLNEMJERx5eSbABwJkN4BGDTGw7XCOuSncgspzYNQMtqpnFIxw9/2BJnlVzxcZJubqxO%0AYDgZLOnjMCyU7bgXrUEA2V0cc%2BVhg%2BCxrLrZCJtCONaKlSFWZGziB8duDxYMEZHTCcyNxBJ3I9pM%0AYUgD3hJ3NuWOZlFLa41PjJGbVti0kqTJ2Xn4wdOkFgCOY7aEDz4D2Ly%2B%2BC6Z4lWzFhtXAQFhxpEz%0ANo5LIqcv%2BezBEnYyG0iu%2B8oUBgmlCrnxCZsAfMi1OBTVRgEcxuH9JAzQKog6xMeBZxa1HxLvOHYy%0AW7KQcW06xKExVWLJ1UM/xsHMTtLDnU6yZANOLWEkNiXsJF3ZG6tEYgVjQ6ti8xXkmwOY9JxmTEx6%0AehBwxhOZKfhzkM40JGcnqzoz181Gf/cow7wHDnsBkFYF358Gn07MyjSNHeKTPCQ4h8QZmT6wDLfm%0AVCp1ZpvuDoc4FowArMPdXWdPd34iP4azDp9u3v3oK5k3is8lnjzzjDJvGpTyvlFcrWz6rqI44/ff%0Af5cWSzwpqTv7YZVpMJlKflhidRKaFaQ7yr7mFAzTST59GcSLnP6MEFcWLVNWbYPG3D5BHDldspac%0A00IScvESYuXPO3suDXGX4LRcCoUh5QLGCYxVL5ZKal3FpgF9O5GHZhyhZTVsue44ALAw4wBgyH8g%0ANygg1n4yFZN0%2B4nFOQwqEsFem7185mMcHpgpoXS2ypLdEmcAEIaFShuHqWPCpj9Xr9gPXn0J4pho%0AxBL4sxa%2B02SRMocNJxKYiVr3noglSME5Wxksaop44xOf9AAOeEmyOvH4mYYTJ74A7Zk2sJ1xMUkB%0Az5Yd3AZ5Q8MnKGxf6nUbEJxXPyQ4h7qHogCMzJT47p1yNhNr3I7tAT/OJIwvWFisQXuAk6ml5cfH%0AcdBDRFAKLBGG7QFL29LKFs4DM1OWvPEiIw5sU0mmsoXcQpe2rtfINrSkCJZfTvEwsySDjR3IXZ3k%0A8c065KaQzsSYaBw7y9mYpY0DEE/zDDYy5c2%2BwLAaJI78ErJTNsjI/3Xiqy02PZhibqxtpCUdsnRM%0AibUBbfpJcPLjT5hbw84BgGlgpqSB%2B5sCBl4rg%2BmxOAwBBx%2B8kcTDFkdOLB0e7jHTQTIUCqtjUFph%0AsVK5fQgzjJMiGzy5jjisbu6np6B0HmYi%2Bqk%2BmyGYFNWmtJvSsSUxMlhxkrA6efQFYyfSYCrSWEb2%0AbnXv81iDgiezdzKrVJl3dTDP9XaIM4Vcq5NIgla3k1iDYNypPRBUpXMbRACL1xo5xANY0OsIxgBV%0AaMORGyaXj7iAWByGubanaPScdwYjFMI5l0s6jqvYDFOcBkk5fIctXWcfvMquW1xfATjVicW57HZ/%0Ayf0ZPA042BEQLM0QgQ3nvp2AIG0DmxJpJsEZCf7AZnwip39YZcmhXFowcDLYDvsCgDWRIFN9YfF/%0AeOf3ufPzbtEudwkO7ya%2BoeAn0TtGZZfA19dnpMwtlbsKxwHY28vScoZZqsW4hxjc9GkcBhwsiTqT%0AM8y5G3Dip1bI5WSKk0LADoOlQ4Tpmdl%2B2KxLvE2E0ybJCtXsSj%2BrYiYyl4Mr4vnTEmAoarp7UR98%0A2LS26pXFZ5jFKmC6xTJMZykjYB0rYqHKmG3I4/a94vrGw28Dk5yKrGrtBAsgflrCSTM4aQnHeKwR%0AbFrVMZ5a6TPv6UQODafowZFk2uyCYOL6WtqbU32zEg/GvRCfTmDqGYnA6BuXU6pIgRPfpQObWVqX%0AhGEdwetY6xC8Yp9udQAED7BMU3Q6MhsRKcMknwzZu05S3LKXfr%2BfPb2niaFE7gFg8%2BqHBMe6RrCz%0A1UyzGmf2bCfqP9lo%2BDDce0jkN4gFDAkWEhODZJUg1ohVtKTkhaAOvI0QwbcxYSbKgI0TQhyQTrFi%0AbAPpoFLAOABYDU9yLae1AZrB0eKINF1mIsZxiFAd5ti0JGfAkieIE2S6SkRHMH4c4%2BLdDhZmfeIu%0AiT/onCkOgNmP2wk5bOzLwVLekYxbxUL2NjuE2SVhpDDwiesYt5Z92ozWThLHSYlUsXOs10hrMFQ6%0ApqST657W7ZFNEbQxLHhbTa1DAwKw03EqknSXLBorhrrA5oWw%2BeSCp405JDQdC1IwVjasJLyCZDae%0ANnIdddh4%2BG1P8tDGsbQYUnC0M4tajOzIHgxKm/RDUeICJixgGMQTwQFjV4Ldu1Xm3n0/IRJndpIG%0AJMciiDa17OrcG3XtTSf9RKs46VAMcQZV7FPHIADrppN0mAamox97cGCbYNuYQSOWPojG1EEnDmH4%0AaRVyBh16F0U6bid9lsRgZy18SLQuyaNlKVNXRRK3%2Buwnzcg/bUqYHhJTJMGyzRCaHs2JuxHayBDj%0AFB9HOyMJBmAzTKeTDm1pruIzJo8R7cRPwqziEKd/rY5I%2B3RfRAyCn/3L8/PYp7PQec8RCMcbBctN%0AwxuKU7VbQu7/P8NGSnxWE/HG4uVBui8SLgMjr5NUNzHTEOIkqOOSFh7ZcGBgTGYjcwvxXQohzkxM%0AxTDoxAKIH04cg7LZG7smKOF5U6ZMhpCYNa0w36Q8dvrUSESYIqS6%2BBQFQ8R0U5gCBmCrBHEcBO05%0ADUxH5skmLRhGCLk0xFGAITiX3rqAcXbSMvo2LInNkMUqvln2Zha0OFSxpTiuxrpqD/7fs0gAcDIg%0ApwrDVvWxNoC1KMhwmhsGlsRgHTOCfxgzMUskxtdJFRwH8ThiyEqfbgSAPWPxQzV1iD/ZbMBcfa0Y%0AqaafBiY45XACjmNQTKzpTHH0sWljx56UCZXOJBFJoiOJIt0yl57BbZC/u2HV0mTl0uvIgLVKKppi%0A0NVp0xJOkDr2gD/1B0a6PR/uupQWow3YhmFjhIRVplqCjg15KqoCPiNqidCSsGvS%2BgoPwwiOhQJz%0AGphbgAdHy3Z0iGymp%2BtI1mTDB8lYl2cPp2LIdbO8Qolk2BjTdJhuxUgyLXGmqS5%2B2smZQinBKmCH%0A%2B53WVUu4C%2BX1ZsMneGjmUAJmd4p0eefE8YYknVWrp88wEMFnFUeYvZEr5mbu7EcfMI4pqSK5S6y6%0Au%2BnMLNPTz/1N2SQWPEh4TJwkRBzuTnuNffCVJYeb1YqwQzr3QmiZEmeQlU5QTJ9g2IUdrApgw4bP%0AICuEXD6qYBksTfLwT9pUZNVhMyQyzY5M8UJQ3eGUKqzOHrI1HOOHKkxlFuk9gw%2BPcfFM1/b2sBaW%0A0trc50ZA2YbkYYZcBh3jbA2Y1lpaFTivyox1AMaJ1XHJWliatCWR1sUSjG85S2NTdzo3/Qk2PTCX%0AbAarbpcLdv1ib7aatu0TCxWDJlGMkRsJPFPjYrBWl0RLJCTyZL84cwkfsG0crEtaS8TOJfxM9bFQ%0AuUGsU3Jt2P4F0Ex2kY3oHOJzqp9m4sw2CKaZOEHipEr8mR5fniSGCidyGZTHS8P1kmG2zcYJEpk2%0AzD%2Bqsw6f7tkdqnt8pujCi8K4UmIRV3/iEZfEYHTkl4e7Dem10DJIYUwSGdKA6U7PlkQZsLQkZ2Cs%0AMpjasDcE1R1McdKtSJvZeZdc02UQnL0zPaxaIgBWIbQrwUQkN5HVyUA/dnXgSa7grPpmlXd568Iv%0ALRZCqotPXaYqQLoVidiY3caagnXjadWpVnIJY12yE9l8iwSAQ0s4xNMS%2BAO5/QgALwkwfMlNT5ab%0Aytbg1xeMLxLHYatRQJgNU4IhwG6NzIZhk9BErUEsPNpsME5WSQl%2B%2BgZlEJxVqzhlF07B4KSiQh3k%0AYppaOFcNLrfBQauwZb%2BzectZOjbkQab/m/hzYhhwJok%2BdjYjJiTTkUc8KQyunY5UgNm%2BFzf3gK8j%0AdZDcRK97GAhCYgmL4uMY0QYwg9MXbxta6mYKMs3nrrPugZmpw/awkGCt5ZQIGC1xnDkOt0FEUAeQ%0AUsFgV4mcqUIrWMGxlKCT2MTDKZWFQqJjG1gHJDZALjzSuoW//OUvYVABkGCsYgmRWNhicVJUBlLM%0A0oY2MB3j2A2//H8QpRnpDQcAeEtTF4V5r3b4zmMzaSOO/JBDwvD/NAH7LppCLNmA%2BJtNpkOzKKED%0A2PTk2if2INGhKxKzL3zAGclNymxpbsoeTDxvKo3N9PjyYNnawTIFJsCNY2HLMCjM6t72ufmtkiz6%0ABIZNouRpJg5bdkQNHCOkmC6b%2B2UVh0h6ExbCOFacLZHCqpa4gFndOy33GGDJSZkVmRqXQd9WLSfY%0AWtMXT/xQdIrJfZ6pUtgGuWnD9FjiDjuxyrRuNh1mSWZsBkv4E5Cl9IxjUEJKs0eCWLdvuZDgGBE/%0ArUuJTORcShzH0iijSnlbyFWzvTQpnkQGheyWVmFgcC9pjc9OsvHJEBIFh8cBhgjpu84Hb1/w00wG%0AAMDCYo2kUKaCjcsQNjE2TJA2sHY1d2EJI/hZ0rHnuZqWdNKJPdy0KRH%2BSWIKkeS6yjQwlyIRTrLc%0AEZdJfNomLoYIDjZsP7xz45NPdTnbgxaKOIOJ4Ki7Fgxs3lhEvL24DOiOzxKOGGxIZGZVJzYAO/Si%0AwpMrDYApliXT8VmlAUde3kzTIfwSYk1MLkvCsHFsA5txWCUuFc2w2fDb8CQHae61wafHo5C7faY2%0AIz5v7tmRVVRVEcJACkWtRSFSeL%2BzIksm0htZDOJY8AyWQnJ27ASb5nGEmb751tUh7lukEVYpB7nj%0AwEww6TYTAOmmpDd7sAGl0BpPos4Em2JETq8OJWiVuD0zNY61KOADrRGsAJvXziD%2BHJAw1SYehkR0%0ADhWZ0qHpKUeHyhuwcjGVFrz7mnJFB2DWktD96hu3XMh1smSJaSWk4iEl0%2BTqJNei2rQx9bcTmbWh%0AIksdtAqSXMAZEcHXAnEaS7qJWHIdLKWKW3CKn/gdJzCc9KATtkP1c135gU2knYffVaf4ietgLer2%0ADzZUJM5ac18wOGbzRMTQc3oDwFSbvdie4GTpTNrcljgWImUyE0zWbE8//ZuLfW6n6cGUQ3u2NG1q%0A2Qz74iaxCg5IIuGcdX3XzXN59jXJ9bNTqIDl7Qjf21IxsWnGRMpZGutGRJoFjzD7FJDE2apauSkB%0AWGtlKl7L1jINYDruyIo2I7mFiNCbrYpJLWDwaAniSxXCTHEyDnuHmRJhhsS6WC9K/i%2BDJWBTNDBM%0AYSbO6s2RJkOL4wZNJDe7ZskLalfYNAZY/rlfVwWTCw8Yp0kEb2k24vA2IwjYHkgxSye5OADEpBYY%0Aa8FsRSxB2MCkyUNRSls3NzkRMNkOuZAw1cqDNULQBuyHuI7WpdgshSQOS4fcLFHIQQRHEuoymGpn%0AiQMPS6QAC%2BbsADAYJxgSrYil3FQPxRTNoE0Ks3l8nFDN24kU7iis18j2ZiEZwiMJsJBQjlUjrgpO%0Ak5BzKe1KsP2kSqapNSP64TzwpB%2Bq0IODFOJYh77IWJBnH7xgEymKY%2Bk4boFgHMFYCXUSNP1MFQCO%0AmLk1ySVEaqbS0rZTIvgmzp4n7Y/qf3D4nKLr59LixH9Oi2h3uAbiSUdoXx7znZcsmW/ShpNVaXWw%0A6ZCrKGEAoTKdOHUdvjni5z3RG2IS2lJISAfj0LdQLEhWAzMuIVujPSJyMnXYmFbmtKdzqbdpSbcZ%0AHWsF70aYEgcGP7T2MC1LToEBJsuRRDu0LiTEsalLrnUnZwjllAprHEKGhFhfbFhGRACQxiYzQZaE%0AHS6uKQLMTXV2lLdvfPsJbQoFD0AMEVYZkNMeUwZLeUO3Z1YdIEMbZxNcSIDJFryRYHTMjR/MOQsk%0AMPH0FsegeOWiVdqezGBYkpy4W2N3Z61YshnApmjNdUlmebA2gBUzrUvBJ8VIEnEyko6TcbOT0EYN%0AIvCYRYo6sCqACAOAbRBc134MbhiRYECyAgMDX4sDeVqVyqL6h6U51Z9ga2EzxFDCirv40yslbJDY%0ABrAgveJg3L6WKQCDWKtjM1JaGTIF7CA9hNfY5SZkeuBhKgYessjFUTocpoyw4QhOloRaO6ErHK8L%0AvuVkhlZMepANawkdgyDdINa3hUxJZzW5yZrtpUQc8RZyX16svFMxBQxAfstROiMvvcMuUsIGJBcD%0AiW9HWOKUsAGRSQSMnx3JgCWLERgAfOIiUyIS0SpBphKaaJbWFDFuUPAZbz/YNJxcHC8llnS7FWYV%0A68qJTQPBxGEpw6Bs4YdK0YDhw2bbuShuOX2aCAyeVJn9SGIk8dDiOOwKEsqlGZacEjnzh9lWqZ69%0AgLcWV5NVc1PdHWHdFLcZPrVAhoQUSJxibU8H60g5ciUXhs%2BSvrtLLSpSjqETa0vyhJxpNiKPFa/1%0AV1ezbpoMQCcwwbHGzYrNqhUnP9Uh9FqwOslDBR7/0ICJh%2BCckiJmWgCwUUhxDhoinR1iLWqr2pAH%0AQ9tS4TAoZC03bpZUshkXBn6/May/amfVt4ikW4J%2B0qENg2RJHmxoceaYS/EtNC1Lbsq6NkbEOHaO%0AbF8w02RlSSdZtIQfa4dpQMegKZNnkogJTzjPGDgdptgkEZDuThkR/8AJMmw/vPN0%2BGTbyqr0ajSt%0AChrJBTgAJMEiHJhcAKb4ycVfr5Lr/99YEYyJz4k%2Br5MYCeGB0PdiSQ6EtuHrZ7455oWUjUNIrjZt%0AkJ69SJVOTJxTwcahojd8Od2v3QKzVVbl5BWeF7mNzVo2I21S3JFgrIVA0j8%2BI1vAcYqVNlkUJULc%0AJl1VWCIMlhhpRjAROffiE6cwrKXhSUSH7TNUWP7JI5vkrIok8XBxQ26ue9n6LeMlxiFuUWEplJZM%0AdEpR%2B8mqzu736Q2dzq1uq%2BG0Z5fgwcnuMnU1djIQtAETtWEwRbyW3uZUJL3Rrf//YYrx2QBZN%2BUy%0AKKfV/z97b7jm5pEjWX8729/9X/DO7LOHPMVTUL4kVbYld1tC/oAikYEAMsgqO0fdPaixqDUqSDwG%0AMGOJHNuJ55DgxraKjLRiowJYtp4APJX9jOrCkWQK8YFLEfmPZULwc4TgGE5iuXfPgUQ4JUkhEUGW%0A3Y0Ob2tliRMc%2BH74QbBqzmAGZRaNGozuJg81k17q%2BOnwCJE0AXY3Y7TFEWM6hlfu4s4gh8JD0wyn%0ADgBQnHKXmlRJsHxGlYksaufnAjYPHzUurjjJBJVNHMDRlOpXxPzlkKyTWCW2XMKMMZkEfp9CUgA/%0AOJjOyfyBxvCCUzkFW%2BibhUZkqSLaumkTgQa2nKhX8C2PxhHJmJ7OwaZFakpOAWCVt%2BiCB5lGFTKt%0Ay0Ij316AN/K%2BcqxSTWY6aD6UvvlNS94jolLzjpSYJ87hEWd47247aTYlZjVVro4eic88aFoBEzWn%0AdRgIlrNlzSs7mFpwAGRc0ORjlwTzYO8FaCo/kT7NOYM6EKjyXuoo4pwe0U7B2gFI2rF2dulfqwDi%0AujuM11HfKytr5NSkBEYibxQ0pLNFi6m%2BaiWtKnpapKSjRkrfo8iAyHaPqY0lD%2BCp%2BrkHR2Vm0J/r%0AR8YRy76N4Qy2kFD062EjCfMKSnULCDL96eO0f4g0JOXkHWx%2BpnWEkOCc8%2BjlGJG7S0CCM2vXnL/y%0AaHEE1wgThaPwOmEX4QgMH2ChAxwic2DVZgszRK%2BfCWTQYcgADs/TCo92U/yXxB%2BPT66tNYC5sKyF%0AZWG8A1dinkI9CrCF4xJrOnwACzDbwZm1qhkfMp9qMO3rr2NrTSYioNH8Cb//evz4LySQbzzIrDkS%0AR8jeJ/0mVCIBjpkZVSOjpvUR2DowGXC/qQVOO0sgsyATyVsFDRyZZE2hgW81A4DhsKaCIiTh3w9v%0AQWNVYOskRTJJCTpS%2BSZxF2SLlFuiNDpmMuWuWWiG7v4%2BpZAMW9a1UFlNmP8gFNuRckUEcxII1JJh%0AcYq%2Bk1joad98Z4DmsmTGx8mH%2BfDNBCLc%2Bg0bxdLsUqwEcC%2B6hYasED7D97MA%2BVBgq4KXyqv%2BuTJ9%0AUM2o543RDAI1O7WL24M5t1WRrBZA%2BXeXtar5MaVsLQPzkXEdn531Uh%2ByVdPDMgBpnvp9ILIaDILL%0A4e1Opu3j/MmfcQANIJBtLzXBHNlXfcvBJDnljvMTt9YqC9WBbHki5onQWiW7aYIqWA5fMJPVAjjl%0ACJqTENkaAS45xLk4SodybjcXmcT5fOdWzaalClmSREoU6QsvIImCIjatpJEaJqCgzJpOnWoBzEPs%0AVGCc90ocAN%2BtOmD4XDYOW2q9qQNMpnyiSQgwKWfZ1zwxcwBWIaszxSyi1gEoFBjV9C4ONpmS7Qhf%0A4MxTBGzt00t5qixRkSmlIBlvJAB78dmXcvJmiC3yLi%2BiOBlMk4OU4m450hm24HQCqnWkICIRBNIU%0AR/9oEdkbeZ1%2B2OVbwhEc1agSeJc%2BGvJwYLIgEFNQpGheGkwLvYKRDBwbqd9P1vw3q%2Bu3yEJqkc1b%0Addg2Ur04apF0MOLBjBNI4QARBJwCVNYTlYkV6gA0QMljkuYpL0gN4AXR6aaooclSHOCX6p77xNAg%0AuMRE9R/p259VzWFmrY1gkmShwCQsm5on6SlbsVP1UfqvCpVAY1XitkZuPU35IFtOlEBsyYyfjoS8%0AZQueWwnwAVME7EhGHSt2VKE6UwSOIkXAXIkA8gECIlhNZM46ToLKU%2Bp3wJ9/8%2Bltc1yn7h/rx7/J%0Agf2ymtToSQMjUj77zLDF7skhz3YuOGwrFEMjo0hRZpO4hW%2BGmCxHfd782Lz6QUpwFpKkY%2BWBRoLg%0AKhNwGGJVAgWZEOBiKlezAaqSQxeA0YwECmPSy2G8AlhQVEGOIkkBoEUAIGtGzLZeZFgOYzQDB0C0%0ABZFriiWw5ZTIQpyjmlorzTxHdDz%2BcWuhtSlTy5oe9qDyCCbK8sXO%2BfRGtIgPjS0idLy2VnAq1%2BIA%0Ax8DqU9iafMiupx0pYZ4iwFrILAXJoMC3iEjyQ%2B7x46lXRr9yxz9U4KNw17vVqtCEdqxRAxwEtnKK%0AZQRHZGvfpj1ABAuRPXwgYwkD87Xxm0MSPktxjsCNdAAF04FJJh%2Ba5yZ3X4orQqLtx/GLP%2BQb62it%0AIldM66pSZTB%2BIUuGwJbvc0n5ClYiOSnBMUPX9OK0AJBURAVlKZx5jpSSyZEEy5MVwLH2Gp3KH%2Bd%2B%0AqAV2p4RtvZqTJNOSJ2Pr5uRo/nYFq6CIHR3bFhYaPTVvbGZbNwl8jloJpgDTRWaCxGVaSISDGiCC%0AHV%2B1gD8VcsbvCUcVJgsgTyGGsKZLZjxVlugwNiK6YD7gbYDmb3KBvWwdR/15r%2BMIZTlTGZEWfLCx%0ApFd2i7jjARQhHssuJAFWIciWaCb%2BvGxVnQY8opyFoFJu5TgVRwDiPErWpJwE2c41C%2BsuoITFwHYH%0A08t2RnQoLybLKWRF1I9GEppHKM8vjD9WZjhi3do/ljNQizhqbol%2BUnOejiiN6QDRHDUmwDX54GM9%0AWB9fY0%2BTop0XNw/Z2QXEyfciR1SqiBrLX0rEZEmCGybwsOrjz/KRU6CF2CMEHb7W5o0cTSmSt7HG%0APyXJsKwFMCqnlFDo50jsgzYzBcM2qt1d9SM4sBE%2BWatecSR4Kr%2BrCe43%2BPj3E3BJW7id4knZlyFd%0AfUubZyqIrzrXjEMqQkTcDEzHM2OMfNX5fTKfj09dxhQ/Nr98YD/jI/rjBHnmVcDcqsDTSh03CWbZ%0AC84ElSgIjcyd/hnk0N0facvZ8k0iQyxDDR1d/tgY%2BxXJkS0sKdb0Uf35p/zmDMw8w7B1KSWNjNvH%0A4ed/H5XBmgoModmmjvhzmsf8yDY8oI%2BmpATHMDYDwAyyAqoA5G3EPABjVRLkl0wKhakmVpDZqKoF%0AmNMUPHJ%2BxcG0LsqkxBYAF5yWTpqfIyFYeadmUOvIvmzh0Jcjl7N5WuQIDLlM4Jq0xREtV4dox6Ov%0AmhUyWNgS%2BHIAXJ/ozylMCZx6ZWJGAfrWqQkNviVFlY30PQBbk0dswoMwy1OjF/lb47HMyC9S4qhe%0Axy4yuTXrmiGJqgqexgGQv0bELeHIiWyRyKya5RImuYwlkFt5Pjm1g9YMYMjRvCZbCGA/0D5xmJNg%0A3xkboCTApSDlqBFdHjWA%2BkTH4zRBAFvzRDkAl0eP3Td/WgiBEtUA3ouvKMAkNQymDrOBWZxCbsGB%0AwCKjAkARo0kFi/DBxgnCN8XxFa2wazzcun0cMuPcSz9CggKyARls0SwCmJ8ogNMFTRahffQY/4rJ%0AqRM2HsAJJeuG0d8GRK2zY/rw5yTguaI1nvrkAUTz0ag1D2Ak8JUAmVNLVJPmjYozyffBLTcCX2vJ%0AJAVwK83IMADHs4V5BEkW5RCfitQCBQRTM2/tnF8RG3llmXC8BVulUCMDh0XGwhkVKUKz1qYOU2sV%0A5tZCSqzyiCq2HMlH0y/MjP5weURkNQPgrnf7/giKHJG0iy2Is5btHM9JHCP9CgHXZXfJnLoFJEsG%0A2fIcOQDRZa1NiZCP2NHM%2BzEpS97FFmByRscm0yojIHJErUAa47kFeCQ5EQBHRPPOMH8uuAuLz47o%0AqWQvPj9fsL8ZaloXyTYy1g6grJmiXeZgr47MK%2BKQt4mffQRwINfOrZnaOR53ARjNeJepEG4AgYJh%0AQOKKGCOgc2TkR/gNwe3xqS9eXkx0zQ9YbOSjAmAftPJgRchDSEGXJUcAwCFaNWNJyUbKWX1F5JAR%0AOEM/JP1c2eJeeqttxfQHKR1nVpNox6oEkonHzPBbHEGYyyMygJlPvJEE9bqWVA4nrD59%2BzgO4LTQ%0AAgeuEbKqEUmybSTAMVhMycZaBNThlAwLEaK1s6/YPPPzOd7pt7/oYPl73AHIQ4DvMmmUXJSgpk3J%0AsIX8UXz/Q0LRIziUGK19FSsU2GJG8m0BR3eP4KDP4mrGgEeKQGZNBchsp13TK47QIVpuIdGVUQKU%0Ar2OgT/LNsuo21ljw272qhdARmEZGAIsj4sFh63L%2Bx%2B5jbG7K3dWkli33yg01KalpgCOXp3HoQt5J%0AIgtiBiIcJW6jAa7r6C4BQYCRSaqCbB7gHf349OQpc0qJU%2BsIwHISI%2BIuj4hU2ZQuJQUJNht5dQJT%0AXB2jBOIUAXcjLui94AeYjQ%2BXv%2BX2VLIKSh3lujS9muSj9TxCzTXnf%2BT%2BPwS9Re0YjPIIB4BMxugR%0AWL7gSvDURpaYIbI0REy0XHPY2ott1wfXwvKOBAgCvE6yE3QkIHZKO7D63S5AviNoFJoByCEJUHBG%0AT9PxCtaSFBDJywE4UqeCtpBlBtwSHQwFxyvDNqPALgc2qjCxg5ExSaRKQY9m9zvrmwDTiwBgghnA%0AX2jxUgg4hlEaGACBBUBHrKy4WIkZyUQFSUJ43P7TEL8wHqVgXwvDckzKRDN9MzPKbDyZbBWEmbLM%0A%2BAKl5EgWq2BrIkdmYnLH%2BVOgGrGSnLGQ2OKIhYKy5N0Sj%2B4KTnFFpHna2B3JN08X8imQPBYE1Sxn%0ABgjywfxrMN8oFpdlC0cCVS2OXGVmi5ICj5rHpsaSAsdoGJIzM/OJMBuLRoGOagFA6tjWEVnn7EYA%0Akq4KZ/kUDCs4ZcEPmQ97JU%2Bm%2BFX%2ByvxVM59/89kNMwXg8jM%2BIh/e4/z2TWWxxXeA8Z77%2BIr0odIF%0AGpGMHQMdSWgbDSZNk7KdNHrxk%2BP3SRqY5Ky10KiOfKNMNF1s408a2CNizIBJoutD6/EHSeDj8FO/%0AgY9GDUBJOABZnCz3RV/bZ3z0v/1JiRyT1pp3MAmIm2T78Svn8YdD1rrulhcpDwOUtep6JMFTIttG%0AAnAXmmdONJlzC9aWyE2rZrEqMiXpNVf6k/OUXFLmFBeTDzgh20BH6jBDHyXfardkPJV8lHMUQbty%0ATD69JFRe3jGIlpjXB6uIbO1OdJl57G5/TmU1zXgkU1nwUQ7TJKAjk0XAXLRwmVSfO7JVCvyg3P6s%0AFn05lkh2MOPMgyML2nZ0zacpiCmAfyzyra5PBlr5eVny0QDHJz5vnSHpqDmVj0ZTGdySNrdk2KqM%0AoJqCsKfSqhUwW%2BPBT%2Boqy%2Bm8FEz5/k7i6Pi2c8pCR0Cc5RNHmADC3IK7xTHkQbsqO2o3Yntdis8I%0Ap44AXCrDli5EW89Rw5zaxcnB%2BNM/Hx2yyZUy%2BTTGnCARgHl0XI0aeJzc/nSwGUmmMFuAFX/aAgXy%0AOqMaOhlFhvuicGs5vqX1pVY8FTqtcALn8StXbLaYdjQqeGCY5OWLZwmYZLIeSaYphU8/x0OhiwA4%0AMioSMwc8LR9wDJpikXGWeEqGI2LLfCICWszuYLcCIuVyGnUeSUaKU5f8ukgwQpBJrBAgniAaF1RQ%0AcQtlHrfjyGXJjLOvOpzyYcFnK3YGFUiylfkqfjR7/AHtAT%2BtKMkVOHXsGcm3hWCvORh37EsFE773%0AeqqW1ASUsK5ewblerSsI4NhoRsXLANJhNk8BEjgSA8iwBJUIzFtLbGbGbvL6SrYQ8UMqwVuzx6IW%0AmL4YpucHcHskH0q/y5/fPD7xQge5PfjN8sOWdnw2fKgUmiSyoM0PdVpbOwGFntq60xTUMU9E3O9Q%0AkSR40hQ0c9WZfE4dwGhJyldZh/SCdqnco2uUZmzIwGxREnJ4gqRsyhZws/u%2B%2BG3ygB9/ckq5nMkE%0AuxKU5jDz%2Bk9/Sqm19RHdeqoysgeY2%2BNqFDL37H5gTp3TQqSmwhVLIM6RHOC4AluXpxWiWeZB%2Bfyz%0AI/nHADM5jY0mATmAF/eCEPznBHlOncGqqQlGFkIuwZnYkkNhqklwNnCTiNmacQyjGaPliaRDxjkr%0AZ8vVVFAc7EoQICafsprFgASYlNhOMGdIRMJHv3vJrdPjB8fTgyN5HkV4mlSwFg6WCKfgFKKZLwYq%0ADHCvqcD2utB3cTSlSNZxAjkzI44PkFPmIMxaONEAFLoFsGDyBRAQJVRuvvK6kGFxHQF58PEvDR4V%0A4cySXDoIbGcXaXEETiWtyd0WZwlJZYnwKwFwd69PpBexQk5nFSK3yvELtl4UwiwK0rEQZcFxWov4%0AAZguMoDy9QXMJNjMJICPmd3Kud3n25XCbPpmjKo1sC3AeRpmHkF2mQRDDk8mOAVng%2BlyKv852D8N%0AH4cf3yLLp8jEKVMlBkQwScx8OUxLBppHjhFnKsCHdiyTRJgsNb8bn3ZsEtWc4ZjHI6JjTFB3AKe3%0Aae6XRRZay7xHYU7nvdwSIRTjkITM1pXIQfbUm/aVICnfex2/ZDh1cmNVsx2Y5aUECOqVHRUxSjBS%0AwgK7JIMpJ7INfDDGHT2tke1mTK0WXpCSuepCMk0Jc6vazMBR0OhRc07AEdv0p8jEEsiwKgczv/NE%0AoKMcokn5kqu1qbWU9CMsJnpEFasqkmBNM3paBMghgltUgdU5gNsi4Ddc3zw%2BuT9O6aPGmdG%2BIh8A%0An5OEkgC/E0YIAv7VmSO2mtvHA2BxJDhO3do9HIeSiVUw9gVyiz7M%2BFNqVokPZgQ0XdFgqjwFyczF%0A9ecW/LSqLgAHEKR8bMsLlAUD6Oibc748zXMk36nmbGBuB202Arcet//mT04RJFJoLdExbOTWzI1x%0AXx4VFWFbr6cZT2k/aTLjpznB5M/8xMzF1pgtZVRgO9tBZgtZHWvFr2KTaCLbCdJX6hCHaccaubUX%0A5Mrrov7cTrJ4xphKuaWLrQEuTgGcEi13m1Q6E3SqSFE1T%2BEL5mmFnSqrdUS2xpjNU0myAE6LAtv5%0AuROpUmGWg90WA4iIAdeleBGm4jABr/h9CeXEnI0aAMDKkCtAjSTx2s4x0LeFkaSaRcpJas71lMyx%0AKDRzBeRJ0sjoVvJtiPti%2B4DffFjSKkHh1ZLD6UEub2Gn5QMSuLgi5pkKUHTIPiyO5qp7zsMHs2Yh%0AW6p0mDxVxKkjeSYlw2lIMiy3Rvni1OYWrMJxGkfCPBUfeZNzvLBgRshsj0WyYQLeyEt1NXsV0YFP%0ALCMwU5e75WfgFFmiBwG25g9NGrE4ero8JVKFFIAoLgpmnkzLWreqHUcmiQ1QBhAZ/RZ3mVg%2BmbrM%0AqvA8hTy7THwcUdUYgTQlH7FT%2BB1NnbB95xY%2BiwyxduqQdHkkLY5HCU4OR9KKgNwWzEJqcViOYPYC%0Au%2BV545dK2WaLICBCc4nl13GWIzLLu9S8QgMDqCVKi3wIztM4gEmjKRlbiyWEK6SqQsBBUMQYzVoi%0AGWf2yJiCgOhSBGw5ZPnGycFbxY0Q6gJo3erv66PB/Q9KKCddo07tSyRTYUmBZBSqElgVmWT4NwGf%0Aj88uD8BHrdGmGTPRz4PYksYHWcbPQykNVdl8pyUPJoJWzWhylky1MCXiRARFgDjm7FKS66QJmBzK%0AuWnxJjdWJsgZJzc4dcR2CV8JR2aKKH68PI8nKBxbNLMTkgfMq4kle31/OM3M2EhzGJJuia5oE9il%0ADExx%2BdnoiiGTrOqqU0amW/hVVQu4LvmQuXs4AJ8jtgKiR1%2BM1LYoAVsIUKrTjiRwyiLJR8ZgbQHq%0AzEI/u5mxNqmAOp7a0SjBSMYuVQGOpBkJ12iXvnWpHb2kWe4RmYPTqXliagJFivDLiztyHn5YkgKI%0AYYqJfg3KO8A1HrJs0bdjakiRTNPBlKp8gldNyR8L5bk4ZYsUQP2A%2BiaJtYtgLXOiAIGtOuZJAliH%0AglIlJyERwXFkCS2iNWGzBeDINN7muE8iECuoWqclzc/tgQ%2BRWgP8whBNBtxOHTJszRcrBziwAOab%0ApspK8DOdjaxVTVxraXUPkJcjYUZ1UptHlDiDyUNhbsVHZDuXIjY6vqgdAexIpJbtVHiKdZijafXE%0AiOg58Uqr3WzdkH3zzRDJxHQ84lwOaQZ8gMl8heslgFamEpRJXq/DHfXW1nAoaQyl5jZBmRJM2nRm%0AyguKCB6LIzJOKJZMcm6jBaxymDmSeWhHkoxrtjvKbfog3v6UYB7cun7cyco5tmpyRJ7l16xGJmfk%0ACM51ocCRH5xqVxEySJmfc5Z0QqWMHVl1TDJPxTPazhIGpiMZAdEhPZU5O1Z1CDqGTPE1WqImmF6q%0ATTx1UJuCYmNSJQFzaeOcoZIGsG9jkFcBoA8ySVYimSgoDxALfrf4L82dFk8LOgWw9E7gD8Y9/XlU%0ALUz%2Bfc4tx34SbAXEfloAkCPAgW9UXJEZIU9Nj0iywALxrAore8SDf2yphX8oMLaLI8AhyPb6/EtB%0AwdnFcgngjibudAIIbJ3EjkTBHM8S5zRf9CMgyqk1wEV%2BAmlPY7cQONtMKkX06KkIvSqUT6ZCS8zM%0AcrtcIxySBz/9%2BDrDFlCL%2BmaOR5UrblJsiYTygdoJygdSPph%2BWJ0yTwRqaeqReMZXF4ejwhVUEpBD%0APFZNy5O5Vtmo7xtb3bZq8slI7mg6D5PT2YutSauMihvJ2HcSUDA5Iz8ycFBzwXnA259uG4aMZGLz%0AAOwyZc3IUZAMOikoLoGjp9OmnFpVaiKopiCMmgQV7FKvo12nlhD5v9yTBNi3vF3cVgVovJmcWEI0%0AgFUHp47TSe8i85VLnl4Hm/piWkO75sk0XqdmbOqvVjJszR%2B4pFJGySoUnbNIoR0F6ZTH9rBVV47t%0AytuLbaAjAfzDh0nwiEwcsC0a1UkilI9WCYAxiC6ZFHIvMZHt4/z2p9spRVKR643MGG//CLz/d0%2BM%0AkQF2UXmW1HcOI4Z8XVdaGUBqT8FkiqFdk0%2BPnMQjcFVHo3k1aZHtFT%2BFCa7zyJ8c8cwfVR6ZFDPD%0A3EYQIOhpyvEb3ozbkteplJKAZlVTv3YlEwSED3HJxFaEWXIXePLp9LlY1XaCQyf9OgrMQ2br73wy%0AbJEySb5aANvZxW3JtgCWMwAotAqssuLEfiOB3UoofxMaP7Bgx3Aqq2akEAWihPiKOAaxH2ryLBTg%0AV2VtUQ6xzAR2n5krTqEBACYlK8IAqQHsSLQqEfPXLr9b5vNvPufNtcmMThG1Wx9xttPpLEm2RL4c%0AfQxkwhyJEQT4dTFDVJPoALWuyhIFPZVc4VOQ2hUgxQzm7aJC4hKOK3BKhjh/BsxYSGSRaZmZkUZz%0AO7FHXJaktgAazLyckjZinlatAYpTyJr5MHlbCG68x8cRltAktVa8Lmwnji%2BQrHhHtmDr96H8bCFu%0AKreToPKMjOGHG1nlyRHrA9jJ60U7kooQZ/dEIIOPODtaRfR2HQFIukymA3CkI9qUEoFVKZgkzhav%0AcGSvzBZwtSuaALXAVZkjCUg1VRlO%2BXJ6o0MEsmqx2XOEAABAAElEQVQpuO2m5ieNjNPOpF9%2BWtio%0ArU1rnawZaIqgCRAb/dBtRGSq%2B/k3HEc1IojI0c7hZ63DK2WeKG0qmCE6DBHMslfArTpqEpnWJQ3Z%0AaICbyuPbHoBjuVKUW3Ln3gKnZJQVT0ItFElKTkyAd0x2HtmlIwBkVp8RGGUzfspgaLPLxEqRmZry%0AiUiJIYg78lQpWxBZNuUUTGzdD7/JeGRrZ5ZTJMkpfgqMVFkCsMVU6EMheSzKU7DWRgzszPUVzPFs%0AZDRPRN%2BYbB1hmry1vN9ixgpnC/HR4l798a22Vy0EJOW0bdSAykQyLO/rla8Xr0t8q4q002QAHOIx%0A0rGdghwpS5zALbHacMAjtt7XMdwSWynEB3gK4Bbg7hLwFiqnkGblaZKZ%2BGB6ek1e83SU5mxuwdU6%0AMFtBTeeofedJSgiwndhTopO0LWOekghX8FRwKlCisQDXbDTLObUQ0Gch7qi8gG9svxCSbWCq5opA%0ACfm2AMcgqVrb2e76MwJfgmpEFhkjfHWILvKA%2BobLz3IxZIAlHyqPP7yF0Zw0C/Nn/lBzxIIGH9Bl%0A2ZJ08jvlI5i3JPG2E4Dt2PWPASCwFEF2jm0XjuRMHTMVBtT5reLzx6cWZFMgEzGXpLGkND4Dyjni%0AK0KG/9s5mKWmAA5Vflrq3CmfX2LIqhErjCMgcopOzMiWKCKW06gBFWpxKNiIZB3VfKM2CdD8OQE0%0Ap72kHWRpMGnXV5kkNC8LFlQY4IheLP6/DhARMXZTmKy2B0CWU%2BOdePO/puAWhcdsZDoNPE1ymnjY%0ADL1sJzDpkJMZPgDbllUOQFSQOFtPMvgoaaS%2BqF2ZI%2BcEJAJwayHbOGacgS7ouPxvg5gnVqiOyvBv%0An%2BhjsTUPH5FKwCp4WkwqZpn01SQG4CAI4SBfMxKIx0LKe5lvnnuTz6CgnKsD5BWpnAwY38oAamQS%0AddzyR0DbPvvdUbWoeQSN%2BxLVt68RcTi6AbbWjvUFVJj4tSkcFmQ/LJhwDikIKnCUFMAW8u8ynx9Q%0ATPNT8Irl1KVe3N1vI7MhSIRjudOStKq8p2xZ6MzZ2E4FOUVOK3GA4lMOyiwmpCMEsOJUkXTdKbeg%0A%2BNSxinwcaWaQAshxKluQOfKHgmok5zLJSJ3WC0GTM8KsdaAxUK4c7KUc2KZ8ZJJJuhBJx0YfBl3%2B%0AmGOoTKHtZlMwyhKIcJpEUDvBjBKKANbRotbO74%2B28eNK9z%2BQVVkRdaZUMwNYXNffAK9%2BD3gXNOUX%0AKaShvQDXizeAMzT/MV40lGWWOYAKJAHGugPIEFmcKjXLrS0m0nUA80YwU7Oqkrbqt23%2BoztbpCAf%0AeTMeKUVEDRp%2Bgr1LR4JDBL5zSnYY8FQoeQC3xBqBnWECadc8VST96J3NyIRqliTTUk1CX5unzEo4%0ABVtI0/ICPrXmF8hM03LiVPAHh2SAYVhoIqKOCugfaw4gx%2Bil5imFHClIVLwS%2BGAGMO%2BWDNuiZJWN%0AqjUqIH0ILEsQcWwB0SXHciLLcgsfrI9/OnRU08Thd1qScpoaAfxKKQOAVhXb2RopByByNJfiRk5/%0A2/Xu8Zkp85PARD4DjjCayFG2gs0Iwn2iZPxI/JCILfPGCgVEliJExMPk6w7giBUAQyjezu5rlngX%0AaXWvqkYeRZg6fjWPpirUCA4lk6PCQYtvX7aC5gG4KAcoYrSWRq3UoqnGtiPIfATdS4LbquYYNIXP%0A0ccc385QSYDasMCxi%2BnUOiBfhQZOTQW2AXA07sVvQKJ36Y6VCw5xy9VE1knmVxRsnuhSB1zVgd3O%0AMRDpt7MtlCqqSWQeP02B00KjCtw/Y2A6mCXSiILUnMQo06hXkAHOQJ4WRMnpVCuYZDNdB%2BCp%2BaPd%0AFJQWv6bkVSNyUy5Ilb6BW3EoZHkLLsI/JFi6RyTfgmZTMhwhBdM5wfad3eulPlunnVFNoqteApJ2%0ApMTyGeso56Fxu4uF3VECkbzd05dpVLCqQKcqsG1OfVCTU8ZThMhyW7k0tgAU5BDJlJSTYJxokole%0As60EI0cMZq1Mfev0/iF/fNDeJR2AtDIS1GQwlpriI9q01jJTmL3qovLk1BqAvkfciOVFnMHTOlYF%0AP%2BwpVS7yqrH1p2PObxUEez2NlhNVdjwHQzM1pOZgDlwmQB5sVUmAkwjo1djlrepSAGjeyGSTKGuh%0Awx9q6XMLvxhdPP7sW7mnRkq8i4OJOXIwtmBHap74ZNSfEb6NTLqNUIlATbvQ0UbqK0L5VJgYgiJ3%0AysdHn4cpz2lNVmh5s6lTxJkwQB0iebrwkQnIuBwYzbaAOtoFnQkcoBL4DUMLsArFMpYofsQUAB5d%0AQSUosyDYrtrZ3eS0wnJrwQAitMl5iivkFPdc9FIKhTRl1lpxYgowEfGfjwGkVCPKJDqJvfoxATz6%0Af/7fzhJ3vKZSky0EIls1G4%2BtHAglm9lM4uqkqSCxpQiaFM4hwSbJS0bE5bbCaGQ6EiMCYDmVp2Ay%0AVLXqi1EkbQ2QaRWR7uG76qfyLLEqwm8L3j0%2B/TyIfgYBPzAdLAlw4f4D3n6G/Tzwl/yMHhnnB2Y5%0ATESKFnIEn2HUlAmtz/WYkyMy1LIciS1kf0QB6ngKvhM/yGFA4wHMp2bHInkIRoEdjVUJpHGErMN0%0ALxsd29k6hQnsMn%2BPTGcsh%2BPiiEWLukDwpmZStpBohvJ8KMkR%2BbmdOKlApwCXrWckD985iR9z3/%2Bw%0AnWrQyDFzBMj%2Bs9A5/bibuVr4E9tCTSKylNzcuf9CCaiTmsPLn9iMauanIL2UReeQgmYV0Rs5GDE1%0Aq9giwu1kkjxKLLeqiH5GBZrH7uo3CTTLzRBdJAXzChNzWl9A7QSeEq8lynrEHeHrf0D3TFZei/6Z%0Ayr3mj4N9G5tTaom2U615OHLNXuLHycdvA8uVbQZ7Ecmw5ByC6QAkJGWVsapOzbCFwPxvesWEDHYS%0AZa2i3It3NbtAtsTtNSKCgpoJskXHQhWuhWTmGNbOaInWSeaUOfmqo6ksGQgkWX7EXseq1CgnQ0mn%0A8JmQqHK3vgt/iDuAMakUBOXVcR6ObgONT4QMRw7QGBDsS60/vwBOk1Lc2hrdhnv8RuIIBWNqaarD%0AKYtTfxz6oTBfhOxS3JJ7q495suhB/PiTwWamEsDMNz/KYPuWtIrYdQDeCMDyCEFlLTyk3CbOtisj%0AxdYIYKmAMtgIgMCyHY3kAFzk543EtpNQxkIjybmt9UweWB00HUxAVAoFlqMSwZbf0x8YJnwz3shL%0AqcARSw5xLqTYznkSsSNbmxKhoWOMRkajbMFpWzO1swuFAqLYAYjwWZRHAJjslC3YFoDrslblekEj%0Af0S2qtmCiCyr7pR7ZGGayXpqCViavh2RkhY0FnwzMhFRYf66gzaHAVNiRoXbuOMrjZTl5h3v1uz%2B%0A%2B5BCCP1CaMLGUFy%2B48FxqgQ5VZZoa6r%2B%2B7//WxEy8ufYyja2ClNHKWVTcAxrGQMwB1atksab3R1J%0AHZlU4Y8ZoltoVpkhaa/Z8doasprXqL4TJgVgmZTw28aXj0/c8ZOY3vHR4r5m4SCg07ZUmST2Vchf%0ANf1iderWo5iUq088qthSIhOaX4j5s%2BSn22dsOVsXfMgkzTunOE27u70TP8IkwHlIfvxpVbUAluPB%0AABDJyAbYlOhpjejiv5TMDMmb3GMp9djd/lTE29V00mxHxgWnjwDxMKcw2SYOJhlBnWMeySZnTIQk%0AIm3jk2d1U7qIJVDiXeaN1DFChgl2eSk/X2QVUbCt/Fn1qP4cjxL4DjMvrpSnRmgtNME2nVGCtaoZ%0AyR8iKijSVFxKnA7lZPySgBMh%2BdQuyxGHSXQ7vVKBo6nGlgVZ4FTNIHi6hR85BZuqRpTQ5KlZm6xG%0AGR3YCc1Q7lLNXnz6MP//%2B8oNOoLtTkn6FSo7j1Q%2B2rmlSqax%2BwJYdGmZqR38BNWfOtIoaaoaUdWy%0AUA6NuJdXtqkdZ19ljYk3IeUqKyuhFk9rS0pDSjBjnDegYZzWKD9lZjsmhADT%2Bb071786AAEmOsbr%0AbLYrH1l9Y4OhVlOxR9BkNg8jsdzKbAbyXMeOViFCBkwSXNJCo3k5flLqgK//imkvZ6Mcpuboj5ik%0Aq46Ik2m2Y8K20FiKT2BTaeHE5ROZx1WmElo7gBd0EnGcOiqVoGoom/m427j4o%2B0HAR0yRoB9ccbJ%0AydfXMeCYIdKCaOY62JwQ5tyGqXVg49zCcQb7GpsKZlcLkGQhRaRcBU6bDeApaiwJd%2BJHL7FxDlaL%0AvjlmbAcftaNRo/oPJvs6SV1qoY4ck3Ea/j7yZ1C/UwCFHJdBYerTYq6Ojnb2TUTBz65Dn0LIaAKM%0AZkjCJ2OtY2RgAAKY6KovSdv1JXRCR1LNSKGtBSoQYaqA86mZ6V4Ap7U7NNr5T0kAiwzL0%2B6luI1I%0AekGkzCtOkkJfngzAklZVY6Pg8sg4J0yw5BRBxwlvgz7%2BaY4gHPjed05oL7uDEy9DEkwJ0VOkrPKI%0AfL0EbaXZumkncHIF03FstnWJ9ruBJ49PTMEFTMwdgfZpEBkI4I4EFsK8fg8stIroV0QaW5ecIpqz%0AqpIH/WMAvw3%2B/PQjND9j%2BOiQAczBSNLCaeWY6S4A80QXBIAEayl3lYTjMsOpEz6In7%2B5lHrQb3%2BS%0AIVrofeubPgCpp1sbEfWhjgBlifkwlSH0WdQ3rwKVoMOaM4BLCiRcacfwELz17KuCN/U63ohIOZkp%0AIhmRFBSsnHyCzmw5cQKxBKdKcyqTZEUQpA84WrD1lKgOUaBOpwEViPcBP0I6VFHOr3gP3FpLZtoF%0AZiWCQpPLvA/y8Xa1HQQXWxdMQeMB4BRnHgzZ%2BFH/%2BMMx2CkYU6lELHfLkUY15xU4rXzFvTVflZaZ%0ABqDEoapiqw6RZNHkbGomjgpTxxm8o5GMBGuJXqptmqlZMgstaRJKINvL281IniVhapZkMPKUzBlk%0A8r2CZjsyEKoCTOypMZ2ZBD9dDt/R1BR3BDOvAOStvc1x/yJ1az5rsZ9yzsufN0XE8mnmHInTODLt%0AZUw5WmRbNxLAcglEurRMUtK9Erw2IlOhYxfJg4uA5qHKYTCHf8vMIpNexKmIgRQg9O%2BRJuGgOde9%0A7iPAaZWfZP2xr3n4MJvfS5GcmUPTQkVmJJ9%2BtxZ0X/nOFp/T%2BnJEft7aYZonshnnT9DZjEp15HYS%0AjuE5kux9G8kWFtLd32ndCNCtLSemUC2cBjYprY4CZ0iwdvOb49jwj4GTddRj/vQ9JarTVgBNHadV%0AZEpx6roSrFXZK%2BQSW/DR1JGKD%2BHbd2%2Bu8gAU4B%2BTkydpCQS3dtTAIsDBjDABRo5QALNQc9S5LekR%0AhQ5jR5iWz8nLqJOyCnRk%2BXXy8yUiS5JIOzsSyVPimlIcubUphfzguGx9dHRmdRSXUFTNOBUgsyh3%0A3eYeTiKogmPMQntRBVAEJgSGJPkY9vYndyQvhwj/o9n9jzoG1FR2ji1GwZGMjmHtMbm91DE2wy8P%0Anjw%2B552xw88AEwEY56kfMFhb/STc6j4EOW7T9MOIA3hKU2pWWXLlOyGD8e1x%2BRk7toNRhRSRI3XU%0At5ZvXsny3ssBKp80jhSfjahSwUKxBKeas0nm%2BpEFTkXV4Ywj1dTtjE3ytBdM5ic2T9cxSbvZUXzP%0AfeQ7beDZHdz8OsbW5EHzCiWtoiR9QFJO6yfLvz9xNTBJgDpeCj4Zb2R39Ukm6zzkLSweAEIjJfge%0AwJ9NbZ2sWznqNJJVtpvRGYiITJ1EUOBqfHW7oOWQybBwaf7r5l3m9iuYjoo7iQOQYcG5/izYXQLR%0AARqjrd0lRBZwlEigIwunD4qUd04dm5H83DYALVg64NfGeHfl8x%2BrlNcIHUqIiDSJ4OjCtjXJShmR%0AAswIkwyFljh2OoKpBmapBrBwXrYSG3lfL0h0S2RBaE1NMKfowFefKJM8X4OGhOlKJ/A4uf3ZSIF5%0AOnHtTLpFk63Kgnmq5lRuBqb1ynzKOWBGDlWKK1ghgDt2zesYkynWTyOZOWdk53ESMMu%2BXcdbJNgA%0A1/GohWac5ZbcRh9vTrHiXfnW/vKz0GwAbxG/Ued1UuZUflO1RYHTurtVTQ5jVCVmy5pV1%2BvUGiCT%0AaKFxypJh2/KafSvK11RBaI2tuMxae8rWjEDskVVzsDITTMLT4R0M2tGRbbVdyt/t3o6B%2BygV6VI1%0A8hc7Y6t/xLaWIwiwF9Hfn0bNkaZ4tQAzztM/Spyf00mIKSB6SvT6xFeGzyN/U/mh2Cjl5hc4uVcz%0A3gZ6LGv7WBVMFgARTnPahSSAPKsSMHlNmB/TnMcBrFX5rnErZJGHoKYZkza1NgUJko1MMrfguRQh%0AOs/8cKdREFD24mIiTRVvKpSlkeezcIFZNuWUQlczuz1E4lfb2DKpQoHFnMUpZWHlszU0RThlofAY%0A9vYnmdlLzaNdHe3u6bxCCgDybiPI12EVbjd5/AM62m8FXj4%2BMQsjivilp2RY01kzRr3jdH6cFnYE%0AsNwYMwJS4uJTPsla%2B6H2g9RnLEFm%2BkchA7DqleYcYw4wmX577t%2Bij3/P6xSggpxGYgs2KceOFbKV%0A42C09kiahUYzM5J3zXZk4DQPgNOjHRzazWu2bQwzFSo4u8%2BjOfZkOgxVTWWVrWvK1pmhsfhkmdnP%0A16uZh2PhFKkdnIaX4LTkJ3Bb0r5T0BZvImRO7WtETUFjmop0Tbs8jU4454yGiPfq9yZb%2B8Kn47RL%0AjGnkVZCcWo3gKDuPmh9a%2Bawg48U9kpPgFaQG/xCcCmJijSZgSLcBt2oiSxe/JMT5nWHrSDCpdQCi%0At07E7mznANdeEiQTU7MF8bjsIWg7Y40ESqXcKeTG6JQurq4cID/HULaIFIR0AByxVKuRY3t0REuI%0AcmYsCbiuyRTLQR9gl1k1%2BZPZBZ15XtyMZMunOKf%2By0fXTDYaHJIOQ2QbFnhqoVgOYwCMMCVUItMt%0AHAZgJTJ1ZkcJXKRF1RWbTI0uTkKj%2BTuBLUt9yXO8ZtCiukzm%2B9komTOA4wtma05r8eZSciAzqnFK%0AeVNvQZ7lHY1mPLXckdSEI1DE2jkJp26P6ORzJFuUARyrGeo1M5IdZg5gHmaXOn6tMTOn0KitY8re%0ASFljjSy5VumY7frmsDVvL/WVmr382uSq4rPEaSsJNFWjYoKLDOCap4v/EOwUtTk8BOcn6fy1A9gx%0AE9RX6to3soWVT74Ypu38mPqwHIxCgOV0hMxgiQM4IpOURyRblrv1NGcAzVPSjL3Up9YJacRqQrcc%0AXZsicujM1hz5QRwfx9SZYzOAR0XHu848x0bhupSqMICyR0QBGa/QqE1r3mHkE49emFNGzhzeOe1O%0APjA1Kdfhq1QTpvnLg/PxiQWamGUALCOJX2BNn86aMULwyJJJU5BMHE/jeCTtiJM5MTT6%2BoXwQ/UX%0Ajdh87dJsYAh85%2BbXTsEIgFlea6WkIQIwWu7p5EjwC2eMj6Y61sb0p8KOU2q2s5BYreVw6gJmyUEN%0ArNqhCV8fuqOgZKDyo68zECmME4Dccp62ldTC1uTl5JsfrjERaBTWyCpOWYeHqHVad2gHluMtio50%0A3R75pAAqp%2B%2BE8ZMyf40oOIlSYqIKXJmFM2wBqnFKOxdH2UWGrYJpAsK2uEt%2BSpE8liVN7iS1nmrX%0AwiPDVrXvxro8Bd7dGYh16TuTDw9jPv%2BxKr9bqz/vCDZ5RPPXyb1UM0yQbF2mZo2umkfhUWWLrtat%0A%2Bw4I5iRgNTky7/aQotH8XsE5RGZtQx7A7RFRJuNFBEYEAUUBmWNR2BGA5UWOK3c7G0Hjt4FkmUTs%0A6o7J3hTfLubxXNB4Ju1bC5NdVnLMvntTRFl1ZBIjKHWNXqR8jZqkHwSAK3GqxLYGz6qp6SRPZ4NG%0AeWS3CdZLcbcOeVRNhSuuRIVjkrbO7zXBADP1BeAYyQQBJKUdZjZGecFRqwIigk6zIoJj0GuCybdj%0AXdjG/PjwHr/e50epgswiXeA0ucM0ko0oLFMjrVC/f%2BaafNqIQk75KWPR7ujYPE8BguSVdSSjIjOW%0AJ2mje8Nv/kuGXvlqlMMTncGmXby%2Bs53YI8c7Ikdw5iKDvjNc/%2BZzzoAU5EOQWibnUkdTZ77GyuUT%0AGSZ8BfAToZFzAp5%2BxJLheMHUagowCQGRwweOZNYRgJqyHUUTKHhESyzPQ4DKSs0SM1YVAZpD7Mvj%0AzNbGtNGM16a1ppbCFCYwD1NlRTCK1fDpwPmt1vn49PKaBcbHrMEsMmwB%2BWsmjuWexgGYL86jiSMc%0AQM4R5dh6fqh9tH660viGwQTLJ3IK0%2B8iynWMIN98rdlGnsxwOoLyADs6qvnEo3nKVNfZJiccQCqs%0ACJGMESCh4ed4/vhpBfku%2BxRYqJrRvuUFTxs14QTwJfdZVCvN6/jjeny4EI4ZyMTvN7iCB1kmcS7V%0AvEKDUa5C8Z74JlSS2vQ/WWtUVq3CK0DKQjUl1NVPjW0fnLSuD7ja1QBTWWb%2BNwmC3sJJyjcDgKRR%0AjjMccfYSFwEsFcSzV/oThBuYjEkUbJ0JfW3MTHHKI6eQTlN5ZP4pzbFt3QA2Uj8C4KpzzUx%2B2NZF%0A8%2BoTvd0RzR%2BRQjLoEHGAkqsUpk1vD4KC6oA99RbggPlrlEA8AEzViIFruZlJuNM/vqg5YFKavcD8%0AQojsHb3m7FLhARzPpPioisAM0IzyG4DtpB0mz1MLi/VSiq3gVZRveZ7428CfCJN2bLw5G4Tr10D%2B%0AvJqZ5gmg2QzJQp61EiwxOsnEZPqM0oSA1KtlC%2BJ1UUKti9MH/MzwDSHvGDPCaJLys1xlR5r5MFWT%0AI5NIu6Mq/YAikuH3Oc6PEg4ESuqoLHwMPDyMZgtLTFplL/Vth45LgoViWz/OP742syM0OQHI4QAc%0AZ1DcqA44IO7xABCT9yKIZ5Fvqrb2paNLvoXEY82OHsmvyiQ0BwCwOEXcGeh%2BvD/Js%2BoOmJoWIsLA%0ADaOg0cIZK48PIDm3E8tXwWH6fAFmPFUETDmRo3RqKiDPzMabBfclebZTtniIJAWwFhmAW2KFDnOM%0AGm32tYrY4lTZPrIy9kIcsr1oMcHsaD5ZQH3VmVEaJQrq83S7jlPwl8fPH59dG7/AWNYHQyaXpckx%0Amsn3QIIHge1Uk3%2BQ5cSUH5O%2BLL8WxvmhcqQagO8c%2BMZ%2B8BHxi3ioRbOWKIEYmBy/UmaM0mampoLb%0AEI/ZILslMg9qRNat2X2ho1S02VGdohwJxo4QQ6ckeX4CieSPdvUVFO%2BDfIaUBR3ADwfgXFentbDW%0AGJ%2BZWX2ybjm1HHJMLgKGAICvbF2ksY0/gfmiM7BNxEzRfKcwWQgSGUBlQflZe2N/b6mmlNya%2BpEZ%0Ak6kpfadd5omWtwXAZJFXygkRnBy3DQBoDHGEWQU2H5g08FeW8xQP0PXNK0g7bkScDphxkmhUeXcA%0Ai7yxwUoGrpzIgOOmc1vhVYrMTE5B8STETBzg7a6xI4DLIcHoeHdbeEoGS101nYQPlW8/2YYUvIkN%0ADyd9k1ahD7DLzIiL0mQaLZkOxLGRBK72/o5TzZLZpVPAXPaSf0RontLaozlDJqgm86owe2lXhYIi%0AzI7S4cotfyg4IuNs8AFM5ZajJuQILMHTOJWTcdlX8tOS5oEPftTd/pxV6pgUFytJSkD%2ByDAeGW8t%0AiJmIV3DL6bz1MQOcZphH1QJQKJovUiKO4zBHlHM0stZCr2Ocv9w8pfwQZOvHl2YtJrAFUR1FZq9w%0A%2BpYgbkYAjanArKPjVE7EgYvHSCpMqTL3DrcnHwtsBCjltD07%2Bzs9ZqM1pw5gu6LibK8dOwJAKDoG%0AEU0iY3hkF9rR2gVmOVgDQIPPFk1HQgEwB2g88tEkm4kAQI11BeY7SspJ5mBztnQopEQRk8S50tcQ%0Atl5hcpq57pyKo1EILiZrciqAj1EVqTbNaws4jMetBbl9lBwtrlv4ituU7ex%2BJCXDZzF5ywzR7gG3%0Av3Z89/jMCA3CCAwFE1n5MmlyPDpo8asVzBjnAHEA4TgMwGdp9EMtAwdsiRy2LGnkjx8SjiwJsJ0d%0AwW7tftO6r1nl0YwP1jc/MCTlqMmWqZjHkYz2IkpOJ2BfdV5xyktGDXF6ua2RY9SR07BHZSwkBmxh%0AxmjtzBwzu40wW8xaaX5e4AmqJW%2BJZOL0EBqnJOXHYXtgM9JmVLypAGJB2JI0D5DgwS//CqDDkRFQ%0A0wPEgTldAjeJHAtLSiapaXBcdoz2SH/zrSBJYUeS2c4qdUwWJ5gKMw/uSDC3ZQDhyr31NTaM4rNW%0AEfKtMlO/ZLQD2GLGgzDVOJrbp%2BIlAWIjtXSx0fyUTRrJRzPjlihAKj5kvgN%2BDYxwjl6QLUztJjRW%0A/JE7oRxiIEb6ZMQTRDuSDnPEOHbhRhK8JsnjjrYrSk7E/HVLpmXJVQEC7ehLjOOWDCsFgIQDTIL8%0AI7YNWKIavQDEQGPYiCqPpOGM5hAhcMriSPIVyInZVv6M9i0DcKE/gdtb18fiFPjBvv%2Bh1BzmwGy7%0A1CRPkUkAe%2BtHz1s7mxYPoJR9wQ1QC/lt4zdPJYKpH55VDkx0UQWAUHmC5G%2Bf4uMdCKdhAiVnBgXX%0AbAF%2BpD//eUQG/fL3bh/PTnDijSfTLXjmwa5uDXi67ELs5SmAjAKyjn177d0Xzz8ywK7TGI%2Betz8t%0Af9qxI2lxjknQl%2BkMdHy8Pb/5H%2BL2lGh3QYVogomNNGmQ5Qc8NSpyRLZlBJAVYWBAUTCVwbO28qdN%0AOWU5v5go03YqhxMxE1kwFTpK4QBJASLPJPxD9pjzqDr03SI481NfnMgVSKgcq3XbmH60q/ivl/n4%0ASK4X66PCF38S%2BnnI2VkFrW2EQEeC8ldwMCdf8oyezk9U7CfKaVNRNdfxzaup/BlfDVBru1xL0owJ%0AZy4LiXOw8OE2hfETKXMFTznQWLUQZIVHxQC0A7NlzZHaAuTfGANP8pxNmtF5ZhU4MmD%2BoJqvENBF%0A0JlYTrFCAMlrjDlBl5pAPOMUtFHtnqrN5CvshJ3WDuDiCCBhNn1j16P09uf0Kh3U7DvjdYbZ%2Blpy%0ArTUTU8FrU/PHabQJxDMqTqPW9MFT4iyZ2KZG8xPPzGQemNZkjMeR23TegKNQ5uSn300Fti7ZVnCV%0ARbN1fBnIx7fdbHEVnPwKryCafQ9CjcqbaSuYyVkCdh18e10v2DDwKTQGSk5wYLauo8rt4/D8xes8%0AhwOHArWHiGrNLHgVLUehNX8WSDYbwEmMh0ueqma0tugA0dqSccUMPE6%2B%2BbNCQTEw2UkFOAW3FRc9%0ATQFNZY/LmvfISMncTqyaHQ/9GlU%2ByU5lieXGKQ52W6FVxlcfpVXXqMgUJOP2SM4u117OXCHAlY2C%0AxO1rVE2F4gRg1GZ8yH/zJy1YvDl9drq10BY%2BNe9vz4%2BAXa8co93sKLZf%2BAB0hGDfpzPQy8a9PwFm%0AGgPNZLueyt7FKI17Aa7R02IlUyHcqVJ6ZWyq2QIaJVYZzdgO5kzeeGNNJtgugiLg6VKGI0AR0Gyq%0ApXmIWGXSkghjwG9ghFmVfu04VfCQrXy2njhCUtPwQ/OVeCK/Bvj89lzvk3cCYuBKJpNl0sgEnvI7%0ADTylmZQzY%2BQ%2BTjJ8osSZiUbtdXFKMo61xZkHy5z8rixoexQmOAeb5DmYjczUdCqIKw%2BQ9%2BhpvB/e%0AQre4Nu30PbipjI/7wGxtcSN9uxyVKPj28LZrto5k3ivOEMfC63XMTBo4wfBTUNVxl7aCGS059OdW%0AQgq1%2BApQp1qAeEZ0agc4Vl0quUmMBYFdNMrFAmMEQdvJBM%2BSdA6O2y/G2Sh8zFC%2B7oC5Gsymr8qP%0AkZIlP/FBm1uaug3M0ynyCsOfR5U/TXpHOLa7budRUgIFidcFgeTkH/ocmYlz8Mtfgcw3/JQDU%2BSa%0ALAOY2Coa2UtQ5NS8NAtnJJ/a5IiPOAuPKpjXAUq%2B0eHokJoDhxNXqnwjAea6ypKh6rrMK4tChWK3%0AVEm4gqf8klYRKzTTVjBjJXMYknMbPkC1swvic3HEtngw51ZstNGB1Zm0MHxLZvR0dp8KMW%2BV365k%0AU6DQ2gkmzdP48whttt92uO1MFqe%2BXWaENltUNXVIlhcbU2arZoBtD79efYBojs2/B/bSA7BlcWRE%0AzTFsVzz62tTYkY2IvjyJjeERfBvRywdnz845iTRla5G4GeKxHLvhA9CSsqStYEYJSQHm4pStHOKh%0AU36CxK8gmpopByIcICnyzTBFwHNbeeQy0tKBIEcg7jTyFL9i%2BDFtlI7bBNsKkgK0OAJPwlH1S27f%0APT65MIZiCj9gRD8qXZhG59ph0OQcR1eRp4QrLc1A3QEuqgDFlC0hHgCCmVmiQrWCaILJmfiouspe%0AxztGakvt0etae21d5gpUU/bapVOvMLcTe0pMv8wBqop5BZVEJiOeZDExUGF8qiwMdCTZWvAVHAS3%0ARjWfZjoKTOWJn5bP5BucTl0ExzYaQDxB%2BrM2/EqKKqUqFxx8kzGv4CAcat/d1i5mmQBH4KM1WzMz%0AKnIUpnyASevoadIWcQDXDMlr7ZE5tlPwelSLecEjOSfpaE6iLNHVEdvZfbaYmpPzXTw1Jz4K55wT%0AH7S2k3PMCcdGxUBHgBQCMwm%2Bbk3OWG2g02tTMxAEs%2BQVVq3CYzvz4EQExACFYhWmDoUsMgHx5E%2Bd%0AFKyaUuJrIfmZvJYcmZQDszz8CpjvVHGiasXA0T3mNW/GeNWfp9fJX011dDkKqaowMBuB50UmPpSr%0AqoWZKXtr9vi3KUFVUw0FF0lA8SCzTSRw5ZiZOlO8x2fPPzPykWXd3pr3Nd97JDhqBvHsNbFqZK5j%0AOMzs7uuXjAoN4APYSHeAR9Bmd7scjZQyOcmvsCJWFS2fR4egasQAZPEbkY4m%2BKPzH12Sus7M0aux%0AObrqpHCclhcQBekDWFNQXOYKLCEmVUYw87N8KpenZOJD6hfbfunxqX3TxC%2B68MWSL9Jo%2BorZBzY/%0AUfjlKxTMeL1LVcdRIkd%2BNroemUkzcGUeUz1tV3ng0Jn5iSct5aMjnI7iXzMdCa5dXpXEDBxS7wut%0AqjZQleDYHi2ezpzUU/KRTJ/8xJOWYGCe/kVc08AhaNMZITRJVYIZD51ZdRwlcuTd1uuNwtPCLyaP%0A7sd2ztAkBzhKju2rMb5Iq9crnfJvBN8cVR6YHb%2BCKwTUSDDjpIVf6UtILf4b8IY8u0yFV/k47wnz%0Adq%2B6HwrHtkZXcDCPbe3mDFeRMkd5%2BQMkS37iSUtKMGO0aud4JaMBUpvJA8/Cg39sj0K3s5zMsT1K%0ApuBTPJNHbcqCtk%2BbztNDp%2B3R61VJtEAKgveFVlUboLbCK5gtOp3JiWeL9AMyExHMCKFTybN24tl0%0A4sqTDfja7PlH3kU5yixfngGfnfeTz8fn7DUxUm3DArsY694w5u1ia5%2B%2Bxka6jqE4TQVtG%2BMAKByZ%0A6/YQObbxlUrwANeqmZE8M%2BFAjQTpH/lX2%2B/q/FFBGqV5BXOMqfwKT/6BEz/ySV0BzJJH1S%2B5/QOP%0Az3n/w9mrZQdh1v4J/EW1xggcvdIJHISftL3Oc83MkSZ%2BOtK1fNLen8acXSaOAHiVn5xru1dVV%2BbU%0AeY9n7cRVzaYTR7iCpzpX2tPMV1r8Ff2nTUt%2Bt/tsPfFV4btSlijyRfIsqeMPB18ZZt594jnMV3Qm%0A/2fgr88wmdcbfSXzdP5kA09pJa%2BNOvoK%2BGIXpP5Eo1cls%2BnETwd%2BJfKUPJPvC2ffiacC%2BL3IQWb7%0ARipymoGOAlNn4ggTXHXel1z5U%2B0pvgqaeSp1TV4z3%2B1y7VjJm6M4s%2BMb/qRZa%2BZNydMWVx1ph86x%0ATeq7IP3AtWSKhwPxXynM/LWqjIDYOl59NkKt5Zvz6csTToMFUA4LygiKs/XEVjmAr80ZG%2By73et7%0AzMP2ae2VVuaNVJypOXEEwFd0vk6D%2BarR10XeKCDyZs27TDxLruLXzOS/wof%2BFJmY8mP7SvCXyX/1%0A8Ykvh4l/gwV/ouMXP78/ofzX7/tjZ/uiGmNP5tOLP00e971ypuxB/knbL3a8jvp%2Bni/KJvKH9P%2Bo%0AeF3egC8O8MXWX1R7M8%2Bboy/O8Ebh1dHXx/5JMzwd4I/2eiry6spfzL%2Bf4Ti9DnDNvOl7qL1hzqM/%0A1MLCP9doNp34iwP82KZzAPB3Z/h69%2B9K1fpnaCb%2BRfBTZ3gjfj26%2BnbNXC915VyVr1U/NvOHOl4H%0A/vowf1ujNyM1v4D4dKXAzK757CQDwTiZYNTKXEGngqJvTraBmLO7M1wnuTYqk06ZAxy3OE7n9rtS%0Akb%2BuWckVfL3drJ2t/6jCrJ2ab/AfbTGlvt7uTZeryDUzm/6q%2BEtPSnzEnTdu/me6Mz/Rf9zwP8TS%0A6cAU/ENuvCd/vcUr5hzsD%2BEp%2BH7IPyT7S5LXqz5WrfgNvzDzO5Abgt/QjcOBH769uv2fZvJ//oQ/%0A6kO53nQqf/1zecV8rz97/Qx87f5qzr/Y/doIwZ/Uq1EPfbfEljOwrYQ55yLvVgI45nfBlIXsttYH%0AmGp2PN6ccwzITXJ0mTr/Luxs/4GD/bsM%2BXl9%2Bxr8vBb/mcpfelLyFcQg41%2B/xs/%2BQr//LH9296/4%0A82rCvzLbK8338/yVju%2BVf97pm5v%2BE6/z84xS%2BR9ql2P/wA/0jQ/zI/iBHZP94XdJ%2BSvgixdX6mdc%0A/ytD/ljOmyv/2Au%2BafTmRj92hjeNXh29H/vfPt6rsf9Q/v0dr1L/xFu/v%2BOPutH7Ljr5o3pdP5eZ%0AqYuAGJg0MDM7dsDkQftDW3tRUtNb%2B/sqmaB96952EsIBxML/FsCcf6Lvv31sZ341/M8bz45/Wv/V%0AwH/iI/gnlnzp8flPvNjO/KMceP%2Bj9ern51r1ivmj5lyddWAdWAfWgXXgZzhw/SeaXfafaz/DbTWf%0Ael5S0HaO0YciaPtHP7Kn4vUNIDuZs2l4zjDxHHvxOvD7OLCPz9/ns96brgPrwDqwDqwD68A68E9y%0AYD7tnLtMYN6n113A02M7S97jo0tbQdtEaiRoC2Hi%2BAvWgd/NgX18/m6f%2BN53HVgH1oF1YB1YB9aB%0Af5gD12feNcOVrg%2B8a%2BbP3Xy2e4XnAEffY/vnZtiqdeAXcGAfn7/Ah7hXWAfWgXVgHVgH1oF14Nd3%0AYL76vnLbH/vku3a/Zpjq2vSa%2Bcrwy1kHfkkH9vH5S36se6l1YB1YB9aBdWAdWAd%2BTQeePvnmVX/q%0AY%2B%2B73f%2B2SWajxevAP8WBfXz%2BUz6pnXMdWAfWgXVgHVgH1oF14NOB6zvwpz47a3zt21Hg75mkdgvW%0AgX%2BKA/v4/Kd8UjvnOrAOrAPrwDqwDqwD68A6sA6sA/9gB/7rK7N/5f/A8xWd5awD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvyeDnzn8TmfnRP/nmbtrdeBdWAdWAfWgXVgHVgH1oF1YB1YB/6cA//lk/KLD0to%0AX2T%2BuWm2ah1YB9aBdWAdWAfWgXVgHVgH1oF14Jd04F/XW/G85L8kfTwy53bip/916klI/ymz0wXr%0AwDqwDqwD68A6sA6sA%2BvAOrAOrAO/sANPHp/ztj4jiT5Hrw/Ip%2B/MqRCWeVWIsGAdWAfWgXVgHVgH%0A1oF1YB1YB9aBdeBXdeDz8dkLk6v6UCwGpgt/7hmp1Ndr5c%2B%2BE39dZ1YtXgfWgXVgHVgH1oF1YB1Y%0AB9aBdWAd%2BJsd%2BHx8Ho3ng3Niabz63jwjn74Y50PxTa36TxWOCdl%2BV%2Bdaspl1YB1YB9aBdWAdWAfW%0AgXVgHVgH1oG/34Enj09fdEec2/mMfDOxJRJ6rLKtfBK%2BqBMtETJvdCat2gXrwDqwDqwD68A6sA6s%0AA%2BvAOrAOrAN/swP/6//%2B3/87W/KQ8y0nCMfxOUcMdDSBhWUks72COBMc5cc2EUuO7dSZ%2BIu0WbJ4%0AHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhwPj55i/rSE4RrxhNuLvJsOxUcb0WT0iIHjtq2iQQ6AlQe%0AmKeTcOTfH13Jm1kH1oF1YB1YB9aBdWAdWAfWgXVgHfjrDnw8PnvgAXp2Alj0MNqMx57rv/7rvwTk%0AAY2iVIJVRZM8S6oNTJFDKp3AlJo4tZhlXtEiLFgH1oF1YB1YB9aBdWAdWAfWgXVgHfiBDnzz3/nk%0Amdf6n//5n/vb8/YXocfj02cneZ5wrWYiDzaWBMgMSCA5OeBZHj7UrlLpxCxz6JuX9opzlOx2HVgH%0A1oF1YB1YB9aBdWAdWAfWgXXgLzrw%2Bfj0PTYfnL0/fXxC4LXG8vFJdJl0DkVmNB9ngo66g4VsAa6w%0AgHKAIkUzxAkoPzKekleE7cSSN64D68A6sA6sA%2BvAOrAOrAPrwDqwDvwMB26Pz95pABevTV6eLrE0%0A33uPV%2Bfnn5zOFx0iU9ZTCSpEDsBhWSj4GOXx964dpSBgCPjqTLWwNMrL3Do9Sq55TzeuA%2BvAOrAO%0ArAPrwDqwDqwD68A6sA78QAc%2B/uazlx7Av/z0zfnf//3fgP/zf/4PLX2n8YTjvfe///f/LgJ81xHh%0AyAyw7RQw8dNrVAigNbElXxEifVlwzHSabPlKZgZZtpADFS5YB9aBdWAdWAfWgXVgHVgH1oF1YB34%0AsQ78i6dXij3zenny%2BOTvP3l8RuPBxpOPxyeLIyLbHnVKqQO2yjdenEB9D2C5L8%2BiatYSb%2B/O%2BxJz%0ACkhHTGzBBRMnh0YkyyxYB9aBdWAdWAfWgXVgHVgH1oF1YB34SQ48/5vPj//E7f/8T49PHoFO4BPu%0A/va8BfK%2B63zmyTkenyR9413jcSsfq8fj0/enR0rdX523wADOUwsFa%2BRsRMqLgEkDc2qJ%2BY3rwDqw%0ADqwD68A6sA6sA%2BvAOrAOrAM/1oHP/8EhdXv48eTjCcrjk8XffPoChONjj/fbv/71L5%2BgYBZ51hQB%0A92K0sDgBmDWZYNsRXU5FpIXtjD0%2Ba63abZTHggmtKIGtgAiRqHjJBevAOrAOrAPrwDqwDqwD68A6%0AsA6sAz/Qgc//waEeeLz3wPMvP3l/siVPY990POfI%2BPj0afd463085GAqOGf1mTczB6akwo935%2BMP%0Aj1Do2dl70tZTqmEko8GQKBCjceQ85AUdLVgH1oF1YB1YB9aBdWAdWAfWgXVgHfixDnzzN588w1y8%0A1gBEn6D3v/68/S8P2Ztn23x5Xh%2Bf0Cg/4pu5JUewtZGmLjm8En1P0tS%2BbqsV%2BPiMiQLlKkQo08uT%0ATPgQ3O06sA6sA%2BvAOrAOrAPrwDqwDqwD68BfceCb/84nQj7JiD75enwKyMPxBejzzxcg0ffefLxJ%0ANqrcoCXNXLdkPh6d9z/YsmrNq7LuDnMoO4w0/uPBPj4tb04AmkTygXQWrAPrwDqwDqwD68A6sA6s%0AA%2BvAOrAO/EAHvvmbz3RvT73Hf/GSZyePNx%2BfADg82HjX3V%2BFtzzvQKJJT4mUv4kcdSou3jt/BFsQ%0A3cPxLzNnd7APyENQJrNRzvuTU2gtTmvkEZFFEo544zqwDqwD68A6sA6sA%2BvAOrAOrAPrwI9y4JvH%0AJ08vdHuVAXz4%2BQjkhekRzzMyvgB93ZHxEThfbqmpecTrBeQ3wGzdkU/Kno6zqbMly5GzWctgLMu9%0ATiLkbSpIYcE6sA6sA%2BvAOrAOrAPrwDqwDqwD68CPcuCbxyeiPfMEvuiIPQXBt2fc/T%2Bz6mkvQPNN%0AxmmCMtvGuQKZRfsqZXlSbDml%2BzVPhjyv5fl3nmaILESoZWBriWLArnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgR/uwPn4nA168s0k2OcfT7hehr7cZowmOCJb1tP3nuJFW8gvUujTEeCQ8QXk72/M27sU7Ja3%0AKIu/DoVDuU9QMKcpA66Zebp4HVgH1oF1YB1YB9aBdWAdWAfWgXXgTzjw7vF5f7V9PMyOFxqdeKTZ%0Aj4cc4BVB2oyRKxHEAVxXnI56QDoM244gs%2BWdCfAVyrOTTCumABqgwQC71oF1YB1YB9aBdWAdWAfW%0AgXVgHVgHfqADLx%2BfPvboBHDximPra828c/hsm/F93lo0pQGsZav4EaVZFRbAtNwS3pYCTpmWI96c%0AAP/Ln999fyaubNsF68A6sA6sA%2BvAOrAOrAPrwDqwDqwDf9GB8/Hpm7AIcPGE40lGs153s3FHEopX%0AoFq1c9uTT7U4AGhu5R9VHDlVkQwPUWmA49nZ3396KavUJ9qLpKD8gnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgT/twPn4TMiXG5EXGosHG5FTXmVFgRkLe8gdNE9nTL83HsCqMq/4R%2B3TAah1ZiKEHpwCMia5%0AlLimbMWBOcbidWAdWAfWgXVgHVgH1oF1YB1YB9aBP%2BHAN49PH13zacfbjC2R/%2BQq6mCeZIAiwMWj%0A7rvtD33FTVqLFDo%2BCAG185QtRyxAq6MyiDRJs6GmuJEtCykihdKSqnzBOrAOrAPrwDqwDqwD68A6%0AsA6sA%2BvAD3Hgm8enir3iBLzQ/F%2BI5bRHGqDt/R338ZBTgVNfdEQzxgQBt0fkfcVRnC2CKdholitS%0AnEfhqtQ0KlucY6NWSSIAkhyZ2bgOrAPrwDqwDqwD68A6sA6sA%2BvAOvCnHfh8fPrKKgJ8HPLyBBDJ%0A%2BEIrAnjCkWcBGIKMS3yMBQ0po%2BJupT1KPx6uvhLToQo8y81YC2ZxytZJ2IKNAMXVPCIcMld%2BtbbY%0AuA6sA%2BvAOrAOrAPrwDqwDqwD68A68Kcd%2BHh88tDieUZs%2BTjkzcnDzJenbzZoNDOSgebLzULfeMZo%0AHIGNyhZrJ5lC1QBwUuOUFZmjMHlo9/NbqBBsR%2BMkwPEuzj%2B7JFUVmXAiC9aBdWAdWAfWgXVgHVgH%0A1oF1YB1YB/6QA59/81kZby2XT0Renj4%2Bew3C9JHWEw7gIg%2BQ0EOOrYIANYuPVrfXKXxWOm6NnLri%0AowA2CedxfvsTBTMQpFk1yVM8nOBUW7wOrAPrwDqwDqwD68A6sA6sA%2BvAOvDXHbg9Pnl08QDzhWbs%0Accizk6N//etfvuh8p9lV7FuxaHLSJPuuO8Tt4hG0BAFHOzLqEBUpWtVWIB9MC67QdTxNylrJYTgR%0AFqwD68A6sA6sA%2BvAOrAOrAPrwDqwDvwQB578x255qvH2483mk5I2PMx6Ddq1B5scYzRLij7nfPgR%0A0Tf6JvRUcgqAY9nXmJRbmAzg2E3CUV14PPcEPWpTEBBRc6RARwvWgXVgHVgH1oF1YB1YB9aBdWAd%0AWAf%2BnAOf/7FbXlw%2Bt3qz%2Bf40z5HLNmAAkceeMdDRMRA6LZ%2BdvkJJpkmtSzWxjcAJWnIU9uy0FrLt%0AuAXL96e4vimkvGAdWAfWgXVgHVgH1oF1YB1YB9aBdeBnOPAvHmC963yt8TYjQ%2BSpBugdSPuYAiJL%0AQjSTk9wbL33A0xegtU%2BlOJr3T9NG1zHI1843Z%2B9PWh/dp9rEs%2BPidWAdWAfWgXVgHVgH1oF1YB1Y%0AB9aBP%2B3A53/sVgleZTzkiDzYzPAU5D3m6642PgWJrflihEY%2BMsAXHXEuX4CTlppAnZKTOXEEgGN0%0ASjvvYvQVWnQAo4NVuGAdWAfWgXVgHVgH1oF1YB1YB9aBdeAHOvD5PziEqA8wHmNgHnK28W0G5l1n%0AptP56gt3GjkwX55hTsG2Kx5q5ZOaIPIEyqLM/C2enWBjyWOSlMmHF6wD68A6sA6sA%2BvAOrAOrAPr%0AwDqwDvwVB17%2Bdz4R9fXFiy7gI7B%2BPvbYHq%2B%2BgyZfkSLAlZo6qb0Ckx9%2BOgD6EHxkgn12CubLE%2Bwk%0AM6a8YB1YB9aBdWAdWAfWgXVgHVgH1oF14K878Pkfu%2BX9xusLRd9gU9q/8/SBN/M%2BMsu3nZyJ0ydZ%0AF5NkZvlTbHIKiiMDwvWykS/Ma%2BR0Pj4Tb6pARwvWgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BqAPf/M0n%0AxTzefG71KiNpxnddDdr23rM8wiuAmoLGg/ZGtqOnJdcx6nLr9%2B0j08yreOjvdh1YB9aBdWAdWAfW%0AgXVgHVgH1oF14C868Pn4VIj3mIC/D%2BQ554uODPlwLctcQZwrsEWNroTUOBKXCRxVV1r6ABclD/gk%0A06lAfXiCjevAOrAOrAPrwDqwDqwD68A6sA6sA3/FgdvjkyeWj7frW6tMnGuz%2BSCc%2BMo0k6atD9pU%0AeIUtmaevMrWgqX2LgckJK7hxHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhw/s0nor7KBD7w%2BFvQmT8a%0AXx%2BBEK7JZGf5NXktPDLHdqq96TufmtDq%2Byo/OUeL3a4D68A6sA6sA%2BvAOrAOrAPrwDqwDvxRB548%0APpXgVcYzbz7SXr364lAYZyaPmd4cwZynqs3MlKrXTL7CiQSOXjN/HL3S3Pw6sA6sA%2BvAOrAOrAPr%0AwDqwDqwD68AXHfh8fPr6IvKoOyJax9vslfoXaa/Kj3xqT9%2BZnR5Vka%2BEa4baa/KaOVrsdh1YB9aB%0AdWAdWAfWgXVgHVgH1oF14A858Pn4fFrGM6yXWOAp02QPv4PzldqjZAr%2BofL35L9y%2BnTCTa4D68A6%0AsA6sA%2BvAOrAOrAPrwDqwDnzXgSePT59nxh6TbMNvRN8/7d4Uvjr64YL/9kavBtj8OrAOrAPrwDqw%0ADqwD68A6sA6sA7%2BwA//ydff1N57MrzxEv%2B7az9D8YvevX/yLgktbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB24OvClv8/kqbmPtKt3m1kH1oF1YB1YB9aBdWAdWAfWgXVgHfiiA196fH5Ra2nrwDqwDqwD68A6%0AsA6sA%2BvAOrAOrAPrwFMHbv8PPHetA%2BvAOrAOrAPrwDqwDqwD68A6sA6sAz/VgX18/lR7V3wdWAfW%0AgXVgHVgH1oF1YB1YB9aBdeDmwD4%2B93uwDqwD68A6sA6sA%2BvAOrAOrAPrwDrw0x3Yx%2BdPt3gbrAPr%0AwDqwDqwD68A6sA6sA%2BvAOvCjHLj%2Bfx65Zn5Urx%2Brs/%2BDQz/Wz1VbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB144sB3/ubzn/KGfnKzTa0D68A6sA6sA%2BvAOrAOrAPrwDqwDvzHOLB/8/kf81HsIOvAOrAOrAPr%0AwDqwDqwD68A6sA78ug58528%2Bf92L783WgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BPgf28fn3eb2d1oF1%0AYB1YB9aBdWAdWAfWgXVgHfhtHdjH52/70e/F14F1YB1YB9aBdWAdWAfWgXVgHfj7HNjH59/n9XZa%0AB9aBdWAdWAfWgXVgHVgH1oF14Ld14EuPz/3fvP1tvx978XVgHVgH1oF1YB1YB9aBdWAd%2BLc48Ou9%0AwvZ/7fbf8kXapuvAOrAOrAPrwDqwDqwD68A6sA78Xg586W8%2Bfy9L9rbrwDqwDqwD68A6sA6sA%2BvA%0AOrAOrAM/2oF9fP5oR1dvHVgH1oF1YB1YB9aBdWAdWAfWgXXg4sA%2BPi%2BWbGIdWAfWgXVgHVgH1oF1%0AYB1YB9aBdeBHO7CPzx/t6OqtA%2BvAOrAOrAPrwDqwDqwD68A6sA5cHNjH58WSTawD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvxoB/bx%2BaMdXb11YB1YB9aBdWAdWAfWgXVgHVgH/rID%2B/9q5S9buALrwDqwDqwD%0A68A6sA6sA%2BvAOrAOrAO/nwP7N5%2B/32e%2BN14H1oF1YB1YB9aBdWAdWAfWgXXgb3dgH59/u%2BXbcB1Y%0AB9aBdWAdWAfWgXVgHVgH1oHfz4F9fP5%2Bn/neeB1YB9aBdWAdWAfWgXVgHVgH1oG/3YF9fP7tlm/D%0AdWAdWAfWgXVgHVgH1oF1YB1YB34/B/bx%2Bft95nvjdWAdWAfWgXVgHVgH1oF1YB1YB/52B/bx%2Bbdb%0Avg3XgXVgHVgH1oF1YB1YB9aBdWAd%2BP0c2Mfn7/eZ743XgXVgHVgH1oF1YB1YB9aBdeCf78A/7v8R%0A6P/6x038z/%2BS/L/27B1XQiAGoqhGYgPsf5EsgUlLBESUE5/M7yO3%2BnR0hRsQIECAAAECBAgQIEBg%0AnYAvn%2Bue3IUJECBAgAABAgQIECAwLyA%2B582dSIAAAQIECBAgQIAAgXUC4nPdk7swAQIECBAgQIAA%0AAQIE5gXE57y5EwkQIECAAAECBAgQILBOQHyue3IXJkCAAAECBAgQIECAwLyA%2BJw3dyIBAgQIECBA%0AgAABAgTWCYjPATiAYgAAA/xJREFUdU/uwgQIECBAgAABAgQIEJgXEJ/z5k4kQIAAAQIECBAgQIDA%0AOgHxue7JXZgAAQIECBAgQIAAAQLzAuJz3tyJBAgQIECAAAECBAgQWCcgPtc9uQsTIECAAAECBAgQ%0AIEBgXkB8zps7kQABAgQIECBAgAABAusExOe6J3dhAgQIECBAgAABAgQIzAuIz3lzJxIgQIAAAQIE%0ACBAgQGCdgPhc9%2BQuTIAAAQIECBAgQIAAgXmB4/3I67re/8FfCRAgQIAAAQIECBAgQIDAQ%2BA8z8dv%0AfPl8gPiRAAECBAgQIECAAAECBL4X%2BN33/f1WGwkQIECAAAECBAgQIECAQAj48hkYRgIECBAgQIAA%0AAQIECBDoCIjPjqutBAgQIECAAAECBAgQIBAC4jMwjAQIECBAgAABAgQIECDQERCfHVdbCRAgQIAA%0AAQIECBAgQCAExGdgGAkQIECAAAECBAgQIECgIyA%2BO662EiBAgAABAgQIECBAgEAIiM/AMBIgQIAA%0AAQIECBAgQIBAR0B8dlxtJUCAAAECBAgQIECAAIEQEJ%2BBYSRAgAABAgQIECBAgACBjoD47LjaSoAA%0AAQIECBAgQIAAAQIhID4Dw0iAAAECBAgQIECAAAECHQHx2XG1lQABAgQIECBAgAABAgRCQHwGhpEA%0AAQIECBAgQIAAAQIEOgLis%2BNqKwECBAgQIECAAAECBAiEgPgMDCMBAgQIECBAgAABAgQIdATEZ8fV%0AVgIECBAgQIAAAQIECBAIAfEZGEYCBAgQIECAAAECBAgQ6AiIz46rrQQIECBAgAABAgQIECAQAuIz%0AMIwECBAgQIAAAQIECBAg0BEQnx1XWwkQIECAAAECBAgQIEAgBMRnYBgJECBAgAABAgQIECBAoCMg%0APjuuthIgQIAAAQIECBAgQIBACIjPwDASIECAAAECBAgQIECAQEdAfHZcbSVAgAABAgQIECBAgACB%0AEBCfgWEkQIAAAQIECBAgQIAAgY6A%2BOy42kqAAAECBAgQIECAAAECISA%2BA8NIgAABAgQIECBAgAAB%0AAh0B8dlxtZUAAQIECBAgQIAAAQIEQkB8BoaRAAECBAgQIECAAAECBDoC4rPjaisBAgQIECBAgAAB%0AAgQIhID4DAwjAQIECBAgQIAAAQIECHQExGfH1VYCBAgQIECAAAECBAgQCAHxGRhGAgQIECBAgAAB%0AAgQIEOgIiM%2BOq60ECBAgQIAAAQIECBAgEALiMzCMBAgQIECAAAECBAgQINAREJ8dV1sJECBAgAAB%0AAgQIECBAIATEZ2AYCRAgQIAAAQIECBAgQKAjID47rrYSIECAAAECBAgQIECAQAiIz8AwEiBAgAAB%0AAgQIECBAgEBH4A9xf67VNlopBgAAAABJRU5ErkJggg%3D%3D%0A\", \"frontend_name\": \"tabs\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD%0AGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6e%0AgY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBFTAyMHy7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBw%0AgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJ%0AAwMDg3N%2BQWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8%0AEgX3xMw8BSMDVQYqg4jIKAUICxE%2BCDEESC4tKoMHJQODAIMCgwGDA0MAQyJDPcMChqMMbxjFGV0Y%0ASxlXMN5jEmMKYprAdIFZmDmSeSHzGxZLlg6WW6x6rK2s99gs2aaxfWMPZ9/NocTRxfGFM5HzApcj%0A1xZuTe4FPFI8U3mFeCfxCfNN45fhXyygI7BD0FXwilCq0A/hXhEVkb2i4aJfxCaJG4lfkaiQlJM8%0AJpUvLS19QqZMVl32llyfvIv8H4WtioVKekpvldeqFKiaqP5UO6jepRGqqaT5QeuA9iSdVF0rPUG9%0AV/pHDBYY1hrFGNuayJsym740u2C%2B02KJ5QSrOutcmzjbQDtXe2sHY0cdJzVnJRcFV3k3BXdlD3VP%0AXS8Tbxsfd99gvwT//ID6wIlBS4N3hVwMfRnOFCEXaRUVEV0RMzN2T9yDBLZE3aSw5IaUNak30zky%0ALDIzs%2BZmX8xlz7PPryjYVPiuWLskq3RV2ZsK/cqSql01jLVedVPrHzbqNdU0n22VaytsP9op3VXU%0AfbpXta%2Bx/%2B5Em0mzJ/%2BdGj/t8AyNmf2zvs9JmHt6vvmCpYtEFrcu%2BbYsc/m9lSGrTq9xWbtvveWG%0AbZtMNm/ZarJt%2Bw6rnft3u%2B45uy9s/4ODOYd%2BHmk/Jn58xUnrU%2BfOJJ/9dX7SRe1LR68kXv13fc5N%0Am1t379TfU75/4mHeY7En%2B59lvhB5efB1/lv5dxc%2BNH0y/fzq64Lv4T8Ffp360/rP8f9/AA0ADzT6%0AlvFdAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAD8SURBVHja%0ApNHNKsRhFMfxz/OfZ4QG5X1hRUKRl4S9O2AnJTfhDmzYKJcg2chGyg1QsmUzgxIbGRYshshjM14W%0AYuEsz%2B%2B8/M73hOT3yP7QxZ/TW7OV7YJbzwvhpxU7c3WbHXoV7d9EVqctm0wCSOpNaVGS06ylKZLW%0AJwa6Pu08eNXnSp1jlben4YjWdmdeJDkvuvS7lFdA5XWpmBEEUSavrLkqPzowzlt1bibKKysYda3G%0Ag0OD2r44ZKIztZJjyZ0jQxplAuJK6lXQYM%2B8DUc6PZupdvfVrqYYlJQE506MKTvVYxcfZ3%2BCGql0%0AxyG5w/vFtYvv0MK/n/VnwfsAqHVGROrL2mcAAAAASUVORK5CYII%3D%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert tabs (e.g. for hints)\", \"customization_arg_specs\": [{\"default_value\": [{\"content\": \"This set of tabs shows some hints. Click on the other tabs to display the relevant hints.\", \"title\": \"Hint introduction\"}, {\"content\": \"This is a first hint.\", \"title\": \"Hint 1\"}], \"schema\": {\"items\": {\"type\": \"dict\", \"properties\": [{\"schema\": {\"type\": \"unicode\", \"validators\": [{\"id\": \"is_nonempty\"}]}, \"name\": \"title\", \"description\": \"Tab title\"}, {\"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"Tab content\"}]}, \"type\": \"list\", \"ui_config\": {\"add_element_text\": \"Add new tab\"}}, \"name\": \"tab_contents\", \"description\": \"The tab titles and contents.\"}], \"backend_name\": \"Tabs\", \"requires_fs\": false}, \"Image\": {\"preview_url_template\": \"/imagehandler/\u003c[explorationId]\u003e/\u003c[filepath]\u003e\", \"frontend_name\": \"image\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAANNJREFUeNqk07FKA0EUBdCzScQEU9hMYy/4GWls9AfMD4QUYiFCChuL%0AiI1YLLidln6B4BcFkS2DYLc2E1gnUeLuheExb95c7rszL6uqShv0iqJoxdCLMWt4v%2BokiVssY9wK%0AKcEVhrhoSnCPT%2BT/9WCF67hAWZb1sxzvuIMQwk%2BCpDjFMc7xhWd8/NZCFy9YYBRzu3iMLzXA5V8e%0AzDDGAd5wijkOazUT7G3y4Ag3tX0frxva2ccZnlIFD9jZ0vzpmoIQwkmTr9jREisFjQcqazvO3wMA%0A9cMlpZdjmFYAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert image\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"obj_type\": \"Filepath\", \"type\": \"custom\"}, \"name\": \"filepath\", \"description\": \"The name of the image file. (Allowed extensions: gif, jpeg, jpg, png.)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"caption\", \"description\": \"Caption for image (optional)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"alt\", \"description\": \"Alternative text (for screen readers)\"}], \"backend_name\": \"Image\", \"requires_fs\": true}, \"Video\": {\"preview_url_template\": \"https://img.youtube.com/vi/\u003c[video_id]\u003e/hqdefault.jpg\", \"frontend_name\": \"video\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAFxJREFUeNrskVEKwDAIQ%2BPYaXOgXNf9zGKZ3YT9Nj%2BWGsLDmLvjj854%0ASHIABiBmpeEhaVNAMuS5CnkS3GoTrALGguS0kFQSHAXBl%2BwtoFNJ6wYZGSvPbmG3EB/XAJZSMar4%0AdzYxAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert video\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"video_id\", \"description\": \"The YouTube id for this video. This is the 11-character string after \'v=\' in the video URL.\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"start\", \"description\": \"Video start time in seconds: (leave at 0 to start at the beginning.)\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"end\", \"description\": \"Video end time in seconds: (leave at 0 to play until the end.)\"}, {\"default_value\": false, \"schema\": {\"type\": \"bool\"}, \"name\": \"autoplay\", \"description\": \"Autoplay this video once the question has loaded?\"}], \"backend_name\": \"Video\", \"requires_fs\": false}, \"Link\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"frontend_name\": \"link\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert link\", \"customization_arg_specs\": [{\"default_value\": \"https://www.example.com\", \"schema\": {\"obj_type\": \"SanitizedUrl\", \"type\": \"custom\"}, \"name\": \"url\", \"description\": \"The link URL. If no protocol is specified, HTTPS will be used.\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"text\", \"description\": \"The link text. If left blank, the link URL will be used.\"}], \"backend_name\": \"Link\", \"requires_fs\": false}, \"Math\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"frontend_name\": \"math\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert mathematical formula\", \"customization_arg_specs\": [{\"default_value\": \"\\\\frac{x}{y}\", \"schema\": {\"obj_type\": \"MathLatexString\", \"type\": \"custom\"}, \"name\": \"raw_latex\", \"description\": \"The raw string to be displayed as LaTeX.\"}], \"backend_name\": \"Math\", \"requires_fs\": false}}'),
SYSTEM_USERNAMES: JSON.parse('[\"admin\", \"OppiaMigrationBot\"]'),
SUPPORTED_SITE_LANGUAGES: JSON.parse(
'{\"en\": \"English\", \"pt\": \"Portugu\\u00eas\", \"vi\": \"Ti\\u1ebfng Vi\\u1ec7t\", \"hi\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940\", \"id\": \"Bahasa Indonesia\", \"es\": \"Espa\\u00f1ol\"}'),
userIsLoggedIn: JSON.parse('true')
};
</script>
<!--[if lt IE 9]>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
<!-- jquery.js, angular.js and jquery-ui.js are removed from bundled js because they need to be at the header. Including
bundled js at the header will block rendering.-->
<script src="/third_party/static/jquery-2.1.1/jquery.min.js">
</script>
<!--<![endif]-->
<script src="/third_party/static/jqueryui-1.10.3/jquery-ui.min.js">
</script>
<script src="/third_party/static/angularjs-1.4.7/angular.min.js"></script>
<script src="/third_party/static/jquery-ui-touch-punch-0.3.1/jquery.ui.touch-punch-improved.js"></script>
<!-- See http://docs.mathjax.org/en/latest/start.html#mathjax-cdn -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
skipStartupTypeset: true,
messageStyle: 'none',
'HTML-CSS': {
showMathMenu: false
}
});
MathJax.Hub.Configured();
</script>
<script src="/third_party/static/MathJax-2.6.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
</head>
<body>
<div class="oppia-base-container" ng-class="{'oppia-sidebar-menu-open': sidebarIsShown, 'oppia-sidebar-menu-closed': !sidebarIsShown}" ng-swipe-left="closeSidebarOnSwipe()" ng-swipe-right="openSidebarOnSwipe()">
<div class="oppia-content-container">
<div id="wrapper">
<div class="oppia-main-body">
<!-- Top navigation. -->
<nav class="navbar navbar-default oppia-navbar oppia-prevent-selection" role="navigation">
<div class="navbar-container">
<div class="navbar-header protractor-test-navbar-header pull-left">
<a ng-if="windowIsNarrow" ng-click="openSidebar()" class="navbar-brand oppia-navbar-menu oppia-transition-200">
<i class="material-icons oppia-navbar-menu-icon">&#xE5D2;</i>
</a>
<a class="oppia-navbar-brand-name oppia-transition-200" href="/" focus-on="<[LABEL_FOR_CLEARING_FOCUS]>">
<img ng-src="<[getStaticImageUrl('/logo/288x128_logo_white.png')]>" class="oppia-logo" ng-class="windowIsNarrow ? 'oppia-logo-small' : 'oppia-logo-wide'">
</a>
<!-- This is needed for the correct image to appear when an exploration is shared using G+. -->
<a style="display: none;">
<img ng-src="<[getStaticImageUrl('/logo/288x128_logo_mint.png')]>" itemprop="image">
</a>
</div>
<div ng-cloak class="navbar-header pull-right">
<ul class="nav oppia-navbar-nav oppia-navbar-profile">
<li class="dropdown pull-right">
<a class="dropdown-toggle oppia-navbar-dropdown-toggle" data-toggle="dropdown" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)">
<div class="oppia-navbar-profile-picture-container" ng-cloak>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAYAAADHl1ErAAAAAXNSR0IArs4c6QAADhtJREFUeAHt%0AXHlwVdUZ/859jyxmIQESyCaglC0iAgkJIntrIpvKphSwY2ttxbFOp9R/cGGqdhykLaMVO2OtoyRS%0ACEKNEpYKyBIVQ1iNkBhNMCtb8shiQpJ3b7/fTW7m5uUlecu9L4nTM5Pce8895zvf93vnnPud833f%0AEdQLKXb5jsC6%2BuZERZbHKaSMYRbGKERxgpQQUkSIIigEbAmFavlfrUKiVhCVcFa%2BIJEvJOlCcNCA%0AnNKMFQ0o58vEfPgmhS5Mn0ot8n2KIs8lIZJJUfy8almIJqbxhRDSIbJKe2s%2BXvWlV/RcrGwqYGGp%0A20bI1LyaeVmjKMrodp4EycGBAy6MjgsrSxozqG7O5GgxcVREeEigNDAwwBpmsUiRKGu3y1caGlts%0AtQ3yjbOFV6sPnypXTuRXBReU2GLqGprHkUKSRlMIUcD3WyUakGbbt7JYyzf6agpgYfe9O8kui/U8%0AnB7UhJIkUTljwrBTTz449mZKUlyCEBTnjTCKQiX7T5ScfGP3Rf9j5ysny7IyTKXHPwYP690WSXnZ%0AtvcXp71pw1ldQwELm59%2BlyzbX%2BbeNL%2Btscb4EYOyNz2ZWD99wtAFnGdxxoQBefbs85f3rHsjJyiv%0AuGo60wsATe51WZJkWW/LWnXGgDZUEoYAFr58x0B7beOLPHGv5XnFIpGoS0mKOfze%2Bpmj/f2smNR9%0Alm42teQ/8vLRgv0nyuZwVwtm1Ows5BZLSMBz1RkrbnjLiNeAhaWmPWgn%2BxYeejwkRMu9idH7tm%2BY%0AE8/z0EhvmfOmPs9/RQ9tOJx3IKc8lUixkqBKC1nW2vat3u0NXY8Bi1%2B%2Bw6%2BktnETD7%2BnwEB4iP/p%0AL/5xf03U4IBZ3jBkdN2K641Hkn/7YWh17c1JoM3D9PW4kIB1eRkrmjxpyyPAeK4aLttbPuAhOIU5%0AaHpm1cTMZ1ffuRT8eMKED%2BooL6Wd%2B2Bj%2BtnFUGeYyVzJYl3Kc9sld9t2W8Dw%2BWkTWuz2fdxQ9ACr%0A9P3Jfy7%2BZuSw0HnuNtwb5Ysqaw4mPJb5k%2BYW%2BVZuv9xqsaRWZ60%2B7w4vbgEWnrJ1hp3kTO5ZYUPC%0AAnK%2B3bYiitWDWHca7O2yrI6U3r5yR8U1W2MiC2%2BzkLS4ev%2BaY67y1a749VQBYLUIZT/AGhUTduS7%0Af68Y39/AgozgGbxDBsgCmSBbT/Jr710CDMMQPYvHf2DC2Mj9p95efA8TCNKI9MNrEGSALJAJskFG%0AV%2BTocUhigrfbWz5jYtH4VdrAMksBdYVnI8vYJ/8q83hhmW0WEy23WKx39/Qh6LaHQXXA1xBgYc5i%0AsBL4/scCFoC3QCbIBhkhK2TGi65St4CpeharDvgaYoJnIv15GHaFQRBkg4w8p02BzF0VRH6XgEGD%0AV5VS1rOgOvTHCb47wfXvIBtkhE4JmSG7/r3%2B3ilg6toQyx1OUEr7i56lF8zde8gIWVEPSz1g4IyG%0AU8CwkMbaEMudNg3eWd0fXR5khcyQXcXAiYSdAMMWDY/ltVhIY23IdXr8kjqh21%2BzRKvMogUYAAtH%0AQToBhv0sbNFg16GvLaQdmTfjGTJDdmCgYuHQSIfe07pTSqewn3V9z6qrvb1F48Crzx6xNTR4QXoE%0A9tN4c2%2ByfufWqudC3VbmAYzNPwZrkf6dL%2B4LSm5Q9vkrVH79B6qs%2BoH8B1goatAtNCIqmOZOiabw%0A4G5VJMNYREdhDD7ae6J0USsmtEwj3t7DYLCwK83f8WbbzauZP7/kq53SxiY7vfmfC5R24Fv6prTr%0ADVEWgqbfEUlPLY2nlKkxGv%2BmXbFzG7H4/eE8g/tZyO92zbDSPoe1WncUgT14X4G189Nimvjobnrh%0AX6e6BQuo8DCho2crafnzB2n%2BMwe4PL5H5iVgACx4wEltli%2B1sXbA%2BGkNcmCwUN%2BY%2BI%2B3WOjZt3Lp%0Al68cpQoefu6m4%2Bcqae7TWfTfk%2BXuVnWrvA4LFRtUVockjKxKc8sJmMJsWWsiON/U9eJvNmXTtk%2B%2B%0AdYt5Z4WZX0p/bjYtmBbn7LURefaw%2BVuvwoQnBliTYCxu7WFskQb1WROjcvliKlibM/IMAQv8siD0%0A643H6etiGx7NSBbYUlXCbRipgKnme859Ysl4jwwDrnKaV2SjDe%2B0tu9qnZ7KsQWch/YxVpt6KunZ%0AexieUVPDSIJjCC86k3lwyikJ0di%2BMS09/3au2iuMbuDr4mpKN2CIO%2BMLVnpgA4yAlVRX1ziV4fOD%0ArwOv2k2bDM4UVvEkXeaMJ0PyXn3/nCF0HIkAE2ADjICVpChiLArBMcSxsJHPmdmXjCTXiVZRRS19%0AVVTdKd%2BIDA0bYCW1%2BWcRvGiMIN4Vjb1flHb1yrD8rM9LDKOlJ6RhA6ww6au%2BD3A50hcy%2Bt5sRRP8%0AFpSYo8zqsBnDPax13oJ/ltEgafSqam5SU7NdezTtWsHrTzOShg2wYtWP3SQ5wZnNjMZA80Z9s1mk%0AO9CtMakdDRtgJcGnFK3C869D6wY%2BRISp7loGUnROKtKkdtqxYawkzQGXdwNUN0nnrHiXGxxoJf40%0Ae0fEhdpRg29xoZT7RTRsgJV%2B8e0%2BJTdqJIwd4kZpz4pOGWN%2BG5Lq2s38wQHXMzZdq2XiAlllgP2%2B%0AaH6yOX4xGjbAinejlVq0CG9l10T3rNT99wwnf96KMyvNuHMoDR0UaAr5dmwYK1YrhAoYXLtNaa2N%0A6DAW5vFF6qLClGZeeHSyKXRBVMMGWLFaoUZYEPzgTWuxjfC6lROI/RgMb2bZ7JGUaOIcqWEDrDDp%0A50MCBA0YLokDQRgx0p%2BdTezH4PDG88dxI8LotaeneU7AhZo6bPK5hwkVMERYuFDX6yLT2JDx99/f%0ATVY2anibYiOCaPuGuayydDB%2BeUu2U30NG2AlCaFcRAmEo3QqaVLGynm30a6X5sHz2uMWksZH0pHX%0AF9CIYeb/zho2CAqTgoMDvoTXCmJ3EI7isQRuVpw9KYqytyykhxk8qASuJoD84mNTKGvjveSLFQQw%0AUeOaGCNE0Flqvs5o8b/9gZ8xwyMmj404NComZJyrzHtbLjTIjxZNv1X9C/S30pXqRrLVdd4lh7Ej%0AOX4oPfHAOHrzD9Np9l1RZMHnygeJ45kOZXxaPJ6byr6WueotdfAjhI73rGdu2ZXnn5oY7QM2OjZx%0Ax8hw%2BvPjCepf2bUfqJz/Llc1qHpb1OBAiosMpoFB5i%2BtOnLV%2BoTgL9ypYYZ8bZ0tOd6QmuUNbCiF%0AMoN9GPM0TCbeXYoZcgvhr48kOyLlVF6AESf1UwV7G88jBbC/ISqsjzDb62wAC9UmydhoAaz6b/tW%0AcIgQul7ntI8woMNCxQZstQOGSFYeqQriDeGI0Ud47jU2gIEae8kmtlZsWllpB6zNO2UXZwcg3rDX%0AOO0jDbdhEIDoXs1zB6y1A4YHhP3iiuBMOJXh3tfJzuZ/qBbfX65nR5UGqmto8TUL2OoqAgZoWMNE%0AY6KTMhOa%2Bt4ehCDfmxjz8c4X5y3UChp5hVk/j63Vpwuu0zdlNVTIrkuFfC1hkOobO%2B//Qw8LD/an%0A26JDaFRsKI2KCWU76kCaOi6CoHYYnZY9d/DjAzllC/lDmFWz75EFevqdFmGIkbbL9hREsiI40yg/%0A11wGhxex9PlXV%2BjEhatUU99ZQdUzpr%2BH08n1mkb1L%2BfiVf0rGs5Lo2nxkXT3HUPZ0S7WawAhsxrF%0Ay6HPwKJDY/zQqYehAPey1%2BDgDxfsSxkPwZPYaTmU7S7BPWDXkWLafayYLlWaaidW2cASK5nBWzJz%0AOD3AG5YebCgqw5dvP4PoXab1Oveu3znK5xQIOPW31DZchL/6M6vv2sn%2B68scK3b1jDlo%2B6Hv6G87%0A8ij/e1M3cbtiQc3HML4vKZbWrbyTpowe3G1Z7SVH7e7cmHZmGXePSmtI4FhnQfVOAQMBNfhdse/C%0AwvzsO/cf6ykapKlZpq0HCmlzxlc%2B6U2akK5c2XJNf3x4At3D29hdJUTrTnz0wxlwOrEIy5Kugum7%0ABAyEtaGJwKVrH63mrSDn0besEdNTmz9XJ%2B6uGOoL%2BbAr/OXJJIoM77jryx%2Bh0iGL0mSENnc1FDX%2B%0AO6gVWqZ2RfQ9I5oLQgj75fxO/q%2BvpJ9TnXTxlevr6cPjlyj5iUx2bb%2BsZ7UesqlgsayQWf/S8b7b%0AHobC3QWYrv3rZ%2BwuXuhIs88/Y4v8vfWz4BvrdoBpj4BBejWE2W4/yupTGMJ%2BD21O/emf3j1t2bTN%0ArYD8PgWkv7/FflvUwE8uFFelMAg2i8Uy05UTBlwCTAWtLUieJ8XA2MiQIxXX6xNYI%2B6XC3Wep%2Br5%0Axz/Jsszij1qDVREprp4s4DJgGmjaMQzcUA5bgaNkRTbH3GxSf5SEVMoxRBUMlrnHMIB//Arounxb%0AjgZZuWWtSzlokmyGkwWv4Bm8QwZ1GLpxZgUYcquHaRLgQ6A/SobJ4IiGpeyc7RE9ja55V/aKEOID%0A5s/3R8loQjkeVsTzwmmeF2oYuFlamT5xFeII/4qh3LMmgR/oWT4/rEgPhONxWEKifUJW4mWikfpy%0Avr5nBbNIkUQeD8BU7lm9fxyWHgDHA9fYQlzHg/0w/6qjuZzqdKwvb/J9PveiAl4Hz%2BE5q%2B8duKYX%0AHjHSjkf6sXkqWyEZK4QFLIQ51iihWrr2CJKCeE6fzm2pax8Grm8e6acHDffth0YSLdF9CCoZvFye%0A55okRU7gIetV1AkPuRJZSCfZUdefezJMYf3v0MhOwHVzLKlQxAWSRJlQlDr%2BzrPcUjjbGwbyBB2m%0ACKH62/K7KwywjWM8b5CQq%2BH9x%2B%2BCSVZiFKH8eI4ldQQOz4jJ/P/Bt86QcSFPPVqZA50Qu4NwFK7i%0A3tHK7HEEJ5reOFr5fwkK97jkk8ywAAAAAElFTkSuQmCC%0A" class="oppia-navbar-profile-picture img-circle">
<span class="caret" style="margin-top: 10px;"></span>
<div class="oppia-navbar-dashboard-indicator ng-cloak" ng-if="numUnseenNotifications > 0">
<span class="oppia-navbar-dashboard-indicator-text">
<[numUnseenNotifications]>
</span>
</div>
<div style="display: none;" class="oppia-user-email">
owner1@example.com
</div>
</div>
</a>
<ul class="dropdown-menu ng-cloak oppia-navbar-dropdown" role="menu" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)" ng-show="profileDropdownIsActive">
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/profile/owner1">
<strong>owner1</strong>
</a>
</li>
<hr class="oppia-top-right-menu-item-separator">
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/dashboard">
<span translate="I18N_TOPNAV_DASHBOARD"></span>
</a>
</li>
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/notifications_dashboard">
<span translate="I18N_TOPNAV_NOTIFICATIONS"></span>
<span ng-if="numUnseenNotifications > 0">
(<[numUnseenNotifications]>)
</span>
</a>
</li>
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/preferences">
<span translate="I18N_TOPNAV_PREFERENCES"></span>
</a>
</li>
<hr class="oppia-top-right-menu-item-separator">
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/logout?return_url=http%3A%2F%2Flocalhost%2Fdashboardhandler%2Fdata">
<span translate="I18N_TOPNAV_LOGOUT"></span>
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav oppia-navbar-nav">
<ul ng-if="windowIsNarrow" class="nav oppia-navbar-tabs-narrow">
<create-activity-button></create-activity-button>
</ul>
<ul ng-if="!windowIsNarrow" class="nav oppia-navbar-tabs">
<create-activity-button></create-activity-button>
<li>
<div class="pull-right oppia-navbar-button-container">
<a href="/donate" class="btn oppia-navbar-button oppia-navbar-hide-on-small-width protractor-test-create-activity oppia-transition-200"
<span translate="I18N_TOPNAV_DONATE"></span>
</a>
</div>
</li>
<li class="dropdown oppia-navbar-clickable-dropdown pull-right">
<a class="oppia-navbar-tab">
<span translate="I18N_TOPNAV_ABOUT"></span>
<span class="caret"></span>
</a>
<ul class="dropdown-menu oppia-navbar-dropdown" ng-mouseover="onMouseoverDropdownMenu($event)" ng-mouseleave="onMouseoutDropdownMenu($event)">
<li><a href="/about" translate="I18N_TOPNAV_ABOUT_OPPIA"></a></li>
<li><a href="/teach" translate="I18N_TOPNAV_TEACH_WITH_OPPIA"></a></li>
<li><a href="https://oppiablog.blogspot.com" translate="I18N_TOPNAV_BLOG" target="_blank"></a></li>
<li><a href="/forum" translate="I18N_TOPNAV_FORUM"></a></li>
<li><a href="/contact" translate="I18N_TOPNAV_CONTACT_US"></a></li>
</ul>
</li>
<li class="oppia-clickable-navbar-element pull-right">
<a class="oppia-navbar-tab" href="/library" translate="I18N_TOPNAV_LIBRARY"></a>
</li>
</ul>
</ul>
</div>
<div class="collapse navbar-collapse ng-cloak">
</div>
</div>
</nav>
<div class="oppia-top-of-page-padding">
</div>
<div ng-cloak>
<div class="oppia-toast-container toast-top-center">
<div ng-repeat="warning in (alertsService.warnings | limitTo:5) track by $index" class="toast toast-warning oppia-toast">
<button type="button" class="toast-close-button" ng-click="alertsService.deleteWarning(warning)" role="button">&times;</button>
<div class="toast-message">
<[warning.content]>
</div>
</div>
</div>
<div>
<div ng-repeat="message in alertsService.messages track by $index">
<alert-message message-object="message" message-index="$index"></alert-message>
</div>
</div>
<div ng-show="loadingMessage" class="oppia-loading-fullpage">
<div class="oppia-align-center">
<span translate="<[loadingMessage]>"></span>
<span class="oppia-loading-dot-one">.</span>
<span class="oppia-loading-dot-two">.</span>
<span class="oppia-loading-dot-three">.</span>
</div>
</div>
<div ng-show="!loadingMessage">
<div class="oppia-content" ng-controller="Error">
<br>
<div class="oppia-wide-panel oppia-error-wide-container">
<div class="oppia-wide-panel-content protractor-test-error-container">
<h4>
<span translate="I18N_ERROR_HEADER_500"></span>
- System Error
</h4>
<br>
<img ng-src="<[oopsMintImgUrl]>" alt="Oops!" width="299" height="142"/>
<p><h3>
<h3 translate="I18N_ERROR_MESSAGE_500"></h3>
</p>
<p><span translate="I18N_ERROR_NEXT_STEPS" translate-values="{issueTrackerUrl: 'https://github.com/oppia/oppia/issues/new', homeUrl: '/'}"></span></p>
</div>
</div>
</div>
<div class="oppia-footer-padding">
</div>
<footer class="oppia-footer">
<div class="oppia-footer-container">
<div class="row">
<div class="col-sm-3">
<h4 translate="I18N_FOOTER_ABOUT_ALL_CAPS"></h4>
<ul>
<li><a href="/about" translate="I18N_FOOTER_ABOUT"></a></li>
<li><a href="/about#foundation" translate="I18N_FOOTER_OPPIA_FOUNDATION"></a></li>
<li><a href="/terms" translate="I18N_FOOTER_TERMS_OF_SERVICE"></a></li>
<li><a href="/privacy" translate="I18N_FOOTER_PRIVACY_POLICY"></a></li>
<li><a href="/contact" translate="I18N_FOOTER_CONTACT_US"></a></li>
</ul>
</div>
<div class="col-sm-3">
<h4 translate="I18N_FOOTER_TEACH_LEARN_ALL_CAPS"></h4>
<ul>
<li><a href="/teach#teach" translate="I18N_FOOTER_TEACH"></a></li>
<li><a href="/teach#playbook" translate="I18N_FOOTER_PARTICIPATION_PLAYBOOK"></a></li>
<li><a href="/library" translate="I18N_FOOTER_BROWSE_LIBRARY"></a></li>
<li><a href="/forum" translate="I18N_FOOTER_FORUM"></a></li>
</ul>
</div>
<div class="col-sm-3">
<h4 translate="I18N_FOOTER_CONTRIBUTE_ALL_CAPS"></h4>
<ul>
<li><a href="/contact" translate="I18N_FOOTER_GET_INVOLVED"></a></li>
<li><a href="/donate" translate="I18N_FOOTER_DONATE"></a></li>
<li><a href="/about#credits" translate="I18N_FOOTER_CREDITS"></a></li>
</ul>
</div>
<div class="col-sm-3">
<h4><span translate="I18N_LANGUAGE_FOOTER_VIEW_IN"></span></h4>
<ul ng-controller="I18nFooter">
<select ng-model="currentLanguageCode"
ng-change="changeLanguage()"
ng-options="langCode as langName for (langCode, langName) in supportedSiteLanguages"
class="protractor-test-i18n-language-selector"
style="color: black;">
</select>
</ul>
</div>
</div>
</div>
</footer>
</div>
</div>
</div>
<noscript>
<div class="oppia-page-cards-container">
<div class="md-default-theme oppia-page-card oppia-long-text">
<h2>
<span translate="I18N_SPLASH_JAVASCRIPT_ERROR_TITLE"></span>
<i class="material-icons">&#xE811;</i>
</h2>
<p translate="I18N_SPLASH_JAVASCRIPT_ERROR_DESCRIPTION"
translate-values="{hrefUrl: 'http://www.enable-javascript.com/'}"></p>
<p translate="I18N_SPLASH_JAVASCRIPT_ERROR_THANKS"></p>
</div>
</div>
</noscript>
<nav class="oppia-sidebar-menu" ng-controller="SideNav" ng-class="{'oppia-sidebar-menu-transition': pageHasLoaded}">
<div class="oppia-sidebar-header">
<div class="oppia-sidebar-logo-container">
</div>
</div>
<ul>
<li >
<a href="/library">
<i class="material-icons oppia-sidebar-menu-icon">&#xE88A;</i>
<span translate="I18N_SIDEBAR_LIBRARY_LINK"></span>
</a>
</li>
<li >
<a href="/about">
<i class="material-icons oppia-sidebar-menu-icon">&#xE887;</i>
<span translate="I18N_SIDEBAR_ABOUT_LINK"></span>
</a>
</li>
<li >
<a href="/teach">
<i class="material-icons oppia-sidebar-menu-icon">&#xE88E;</i>
<span translate="I18N_SIDEBAR_TEACH_WITH_OPPIA"></span>
</a>
</li>
<li >
<a href="/donate">
<i class="material-icons oppia-sidebar-menu-icon">&#xE87D;</i>
<span translate="I18N_SIDEBAR_DONATE"></span>
</a>
</li>
<li>
<a href="https://oppiablog.blogspot.com" target="_blank">
<img ng-src="<[getStaticImageUrl('/sidebar/blogger.png')]>" class="oppia-sidebar-menu-icon">
<span translate="I18N_SIDEBAR_BLOG"></span>
</a>
</li>
<li >
<a href="/contact">
<i class="material-icons oppia-sidebar-menu-icon">&#xE87F;</i>
<span translate="I18N_SIDEBAR_CONTACT_US"></span>
</a>
</li>
</ul>
<div class="oppia-sidebar-footer">
<div>
<span="I18N_SIDEBAR_FOLLOW_US"></span>:
</div>
<a href="https://plus.google.com/109898456505810251700/about" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/gplus.png')]>">
</a>
<a href="https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/youtube.png')]>">
</a>
<a href="https://www.facebook.com/oppiaorg" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/fb.png')]>">
</a>
<a href="https://twitter.com/oppiaorg" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/twitter.png')]>">
</a>
</div>
</nav>
</div>
</div>
</div>
<div class="oppia-dev-mode">
Dev Mode
</div>
<script type="text/ng-template" id="components/imageUploader">
<style>
.image-uploader-drop-area {
background: #eee;
height: 200px;
width: 100%;
}
.image-uploader-text {
color: #888;
font-size: 2em;
height: 100%;
margin: 0 auto;
padding-top: 80px;
text-align: center;
width: 100%;
}
.image-uploader-is-active {
background: red;
}
.image-uploader-file-input-container {
margin-top: 20px;
}
.image-uploader-file-input {
margin-top: 10px;
}
</style>
<div class="image-uploader-drop-area">
<div class="image-uploader-text" translate="I18N_DIRECTIVES_DRAG_IMAGE_HERE"></div>
</div>
<div class="image-uploader-file-input-container">
<span translate="I18N_DIRECTIVES_OR_SELECT_FILE"></span>
<input type="file" class="image-uploader-file-input" ng-class="fileInputClassName">
</div>
</script>
<!-- SCHEMA-BASED EDITOR TEMPLATES -->
<script type="text/ng-template" id="schemaBasedEditor/master">
<schema-based-choices-editor ng-if="schema().choices" local-value="$parent.localValue"
schema="schema()" choices="schema().choices"
is-disabled="isDisabled()">
</schema-based-choices-editor>
<schema-based-bool-editor ng-if="schema().type === 'bool' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()">
</schema-based-bool-editor>
<schema-based-int-editor ng-if="schema().type === 'int' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
validators="schema().validators"
label-for-focus-target="labelForFocusTarget()"
on-input-blur="onInputBlur"
on-input-focus="onInputFocus">
</schema-based-int-editor>
<schema-based-float-editor ng-if="schema().type === 'float' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
validators="schema().validators"
label-for-focus-target="labelForFocusTarget()"
on-input-blur="onInputBlur"
on-input-focus="onInputFocus">
</schema-based-float-editor>
<schema-based-unicode-editor ng-if="schema().type === 'unicode' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
validators="schema().validators" ui-config="schema().ui_config"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()"
on-input-blur="onInputBlur"
on-input-focus="onInputFocus">
</schema-based-unicode-editor>
<schema-based-html-editor ng-if="schema().type === 'html' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()"
ui-config="schema().ui_config">
</schema-based-html-editor>
<schema-based-list-editor ng-if="schema().type === 'list' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
item-schema="schema().items" len="schema().len"
ui-config="schema().ui_config" validators="schema().validators"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()">
</schema-based-list-editor>
<schema-based-dict-editor ng-if="schema().type === 'dict' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
property-schemas="schema().properties"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()">
</schema-based-dict-editor>
<schema-based-custom-editor ng-if="schema().type === 'custom' && !schema().choices"
obj-type="schema().obj_type" local-value="$parent.localValue"
is-disabled="isDisabled()">
</schema-based-custom-editor>
</script>
<script type="text/ng-template" id="schemaBasedEditor/choices">
<select class="form-control" ng-model="$parent.$parent.localValue"
ng-options="choice as choice for choice in choices()" required
ng-disabled="isDisabled()">
</select>
</script>
<script type="text/ng-template" id="schemaBasedEditor/expression">
<input type="text" ng-model="localValue" class="form-control" ng-disabled="isDisabled()"
required require-is-valid-expression focus-on="<[labelForFocusTarget()]>">
</script>
<script type="text/ng-template" id="schemaBasedEditor/bool">
<div class="input-group">
<span ng-if="!expressionMode">
<input type="checkbox" ng-model="$parent.localValue" ng-disabled="isDisabled()"
focus-on="<[labelForFocusTarget()]>">
</span>
<span ng-if="allowExpressions()">
<schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()"
local-value="$parent.$parent.localValue"
param-names="paramNames" output-type="bool"
label-for-focus-target="labelForFocusTarget()">
</schema-based-expression-editor>
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()">
<span ng-if="!expressionMode">E</span>
<span ng-if="expressionMode"><del>E</del></span>
</button>
</span>
</span>
</div>
</script>
<script type="text/ng-template" id="schemaBasedEditor/int">
<div class="input-group">
<span ng-if="!expressionMode">
<md-input-group class="long oppia-blue-on-focus md-default-theme" style="margin: 0px;">
<input type="number" ng-model="$parent.localValue" ng-disabled="isDisabled()"
required apply-validation="validators()" focus-on="<[labelForFocusTarget()]>"
ng-blur="onInputBlur()" ng-focus="onInputFocus()">
</md-input-group>
</span>
<span ng-if="allowExpressions()">
<schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()"
local-value="$parent.$parent.localValue"
param-names="paramNames" output-type="int"
ng-keypress="onKeypress($event)"
label-for-focus-target="labelForFocusTarget()">
</schema-based-expression-editor>
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()">
<span ng-if="!expressionMode">E</span>
<span ng-if="expressionMode"><del>E</del></span>
</button>
</span>
</span>
</div>
</script>
<script type="text/ng-template" id="schemaBasedEditor/float">
<span ng-model="localValue" ui-validate="'validate($value)'">
<span ng-form="floatForm">
<span ng-if="!expressionMode">
<input type="text" ng-model="$parent.localValue" class="form-control protractor-test-float-form-input"
name="floatValue" ng-attr-placeholder="<['I18N_FORMS_TYPE_NUMBER' | translate]>" ng-disabled="isDisabled()"
require-is-float apply-validation="validators()"
focus-on="<[labelForFocusTarget()]>" ng-keypress="onKeypress($event)"
ng-blur="onBlur()" ng-focus="onFocus()" style="display: inline;">
<span ng-if="hasLoaded && !isUserCurrentlyTyping && hasFocusedAtLeastOnce"
style="font-size: 0.85em; position: absolute;"
tabindex="-1" focus-on="<[labelForErrorFocusTarget]>">
<span ng-if="floatForm.floatValue.$error.isFloat && floatForm.floatValue.$viewValue" class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_INVALID_DECIMAL"></span>
<span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtLeast"
class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_LEAST" translate-values="{minValue: <[minValue]>}"></span>
<span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtMost"
class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_MOST" translate-values="{maxValue: <[maxValue]>}"></span>
</span>
</span>
<span ng-if="allowExpressions()">
<schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()"
local-value="$parent.$parent.localValue"
param-names="paramNames" output-type="float"
label-for-focus-target="labelForFocusTarget()">
</schema-based-expression-editor>
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()">
<span ng-if="!expressionMode">E</span>
<span ng-if="expressionMode"><del>E</del></span>
</button>
</span>
</span>
</span>
</span>
</script>
<script type="text/ng-template" id="schemaBasedEditor/unicode">
<span ng-if="!allowExpressions()">
<textarea ng-if="!getCodingMode() && getRows()"
ng-model="$parent.$parent.localValue"
rows="<[getRows()]>"
placeholder="<[getPlaceholder()]>"
ng-disabled="isDisabled()"
class="form-control" focus-on="<[labelForFocusTarget()]>"
ng-blur="onInputBlur()"
ng-focus="onInputFocus()">
</textarea>
<span ng-if="!getCodingMode() && !getRows()">
<input type="text" ng-disabled="isDisabled()" class="form-control"
ng-model="$parent.$parent.localValue" ng-blur="onInputBlur()"
ng-focus="onInputFocus()" focus-on="<[labelForFocusTarget()]>"
ng-keypress="onKeypress($event)" placeholder="<[getPlaceholder()]>" apply-validation="validators()"
style="display: inline;">
</span>
<!-- Note that we do not yet support ng-blur for the code editor. -->
<div ng-if="getCodingMode()" style="border: 1px solid #ccc;">
<div ui-codemirror
ng-model="$parent.$parent.localValue"
ui-codemirror-opts="codemirrorOptions"
ui-refresh="codemirrorStatus">
</div>
</div>
</span>
<!-- Note that we do not yet support ng-blur for the expression editor. -->
<span ng-if="allowExpressions()">
<span ng-if="isDisabled()"
ng-class="{'oppia-disabled-contenteditable': isDisabled()}"
ng-bind-html="getDisplayedValue()">
</span>
<span ng-if="!isDisabled()">
<unicode-with-parameters-editor local-value="$parent.$parent.localValue"
allowed-parameter-names="allowedParameterNames"
focus-on="<[labelForFocusTarget()]>">
</unicode-with-parameters-editor>
</span>
</span>
</script>
<script type="text/ng-template" id="schemaBasedEditor/html">
<text-angular-rte ng-if="!isDisabled()" html-content="$parent.localValue"
ui-config="uiConfig()">
</text-angular-rte>
<span ng-if="isDisabled()"
ng-class="{'oppia-disabled-contenteditable': isDisabled()}"
ng-bind-html="localValue">
</span>
</script>
<script type="text/ng-template" id="schemaBasedEditor/dict">
<div role="form">
<div ng-repeat="property in propertySchemas()">
<div class="form-group">
<label for="<[fieldIds[property.name]]>"><[getHumanReadablePropertyDescription(property)]></label>
<!-- TODO(sll): This is in the wrong place. It should be on the input field. -->
<div id="<[fieldIds[property.name]]>">
<schema-based-editor schema="property.schema" is-disabled="isDisabled()"
local-value="localValue[property.name]"
allow-expressions="allowExpressions()"
label-for-focus-target="$index === 0 ? labelForFocusTarget() : ''">
</schema-based-editor>
</div>
</div>
</div>
</div>
</script>
<script type="text/ng-template" id="schemaBasedEditor/list">
<table style="width: 100%;">
<tr ng-repeat="item in localValue track by $index">
<td>
<schema-based-editor schema="itemSchema()" is-disabled="isDisabled()" local-value="localValue[$index]"
allow-expressions="allowExpressions()"
label-for-focus-target="getFocusLabel($index)"
on-input-blur="($last ? lastElementOnBlur : showAddItemButton)"
on-input-focus="($last ? hideAddItemButton : showAddItemButton)">
</schema-based-editor>
</td>
<td ng-if="!len && (!minListLength || localValue.length > minListLength)" style="vertical-align: top;">
<button class="oppia-delete-list-entry-button oppia-transition-200 protractor-test-delete-list-entry" type="button"
ng-click="deleteElement($index)"
ng-disabled="isDisabled()">
<i class="material-icons md-18">&#xE5CD;</i>
</button>
</td>
</tr>
</table>
<div ng-if="showDuplicatesWarning && hasDuplicates()" class="oppia-form-error" aria-live="assertive">
Please ensure that the list has no duplicates.
</div>
<!-- The margin-left is added here to left-align the button with the previous list items. -->
<div style="height: 30px; margin-top: 4px;">
<button ng-show="!isOneLineInput || isAddItemButtonPresent"
ng-if="!len && (maxListLength === null || localValue.length < maxListLength)"
type="button" class="btn btn-default btn-sm protractor-test-add-list-entry" ng-click="addElement()"
ng-disabled="isDisabled()" style="margin-left: 0;">
<[addElementText]>
</button>
</div>
</script>
<script type="text/ng-template" id="schemaBasedEditor/custom">
<object-editor obj-type="<[objType]>" value="$parent.$parent.localValue" always-editable="true">
</object-editor>
</script>
<!-- SCHEMA-BASED VIEWER TEMPLATES -->
<script type="text/ng-template" id="schemaBasedViewer/master">
<schema-based-primitive-viewer ng-if="(schema().type === 'bool' || schema().type === 'int' || schema().type == 'float')" local-value="$parent.localValue">
</schema-based-primitive-viewer>
<schema-based-custom-viewer ng-if="schema().type === 'custom'" obj-type="schema().obj_type"
local-value="$parent.localValue">
</schema-based-custom-viewer>
<schema-based-dict-viewer ng-if="schema().type === 'dict'" property-schemas="schema().properties"
local-value="$parent.localValue">
</schema-based-dict-viewer>
<schema-based-html-viewer ng-if="schema().type === 'html'" local-value="$parent.localValue">
</schema-based-html-viewer>
<schema-based-list-viewer ng-if="schema().type === 'list'" item-schema="schema().items"
local-value="$parent.localValue">
</schema-based-list-viewer>
<schema-based-unicode-viewer ng-if="schema().type === 'unicode'" local-value="$parent.localValue">
</schema-based-unicode-viewer>
</script>
<script type="text/ng-template" id="schemaBasedViewer/primitive">
<span ng-class="{'label label-info': isExpression(localValue)}">
<[localValue]>
</span>
</script>
<script type="text/ng-template" id="schemaBasedViewer/custom">
<[localValue]>
</script>
<script type="text/ng-template" id="schemaBasedViewer/dict">
<div role="form">
<div ng-repeat="property in propertySchemas()">
<div class="form-group">
<label><[getHumanReadablePropertyDescription(property)]></label>
<div>
<schema-based-viewer schema="property.schema" local-value="localValue[property.name]">
</schema-based-viewer>
</div>
</div>
</div>
</div>
</script>
<script type="text/ng-template" id="schemaBasedViewer/html">
<span ng-bind-html="localValue">
</span>
</script>
<script type="text/ng-template" id="schemaBasedViewer/list">
<table class="table">
<tr ng-repeat="item in localValue track by $index">
<td>
<schema-based-viewer schema="itemSchema()" local-value="localValue[$index]">
</schema-based-viewer>
</td>
</tr>
</table>
</script>
<script type="text/ng-template" id="schemaBasedViewer/unicode">
<span ng-bind-html="getDisplayedValue()">
</span>
</script>
<!-- MODALS -->
<script type="text/ng-template" id="modals/editParamName">
<div class="modal-header">
<h3>Edit parameter name</h3>
</div>
<div class="modal-body">
<strong>Parameter name</strong>
<select class="form-control" ng-model="currentParamName"
ng-options="option.value as option.name for option in paramOptions">
</select>
</div>
<div class="modal-footer">
<input type="submit" class="btn btn-default" value="Cancel" ng-click="cancel()">
<input type="submit" class="btn btn-success" value="Done" ng-click="save(currentParamName)"
ng-disabled="!currentParamName">
</div>
</script>
<script type="text/ng-template" id="modals/customizeRteComponent">
<div class="modal-header">
<h3>Customize This Component</h3>
</div>
<div class="modal-body">
<!-- Provide a sink to move the focus into while the modal loads. -->
<input ng-if="modalIsLoading" type="text" focus-on="tmpFocusPoint">
<form name="form.schemaForm">
<div ng-repeat="customizationArgSpec in customizationArgSpecs track by $index" style="margin-bottom: 25px;">
<strong><[customizationArgSpec.description]></strong>
<div style="margin-top: 15px;">
<schema-based-editor local-value="tmpCustomizationArgs[$index].value" schema="customizationArgSpec.schema">
</schema-based-editor>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<input type="submit" class="btn btn-default" value="Cancel" ng-click="cancel()">
<input type="submit" class="btn btn-success protractor-test-close-rich-text-component-editor" value="Done" ng-click="save()" ng-disabled="form.schemaForm.$invalid">
</div>
</script>
<script src="/third_party/generated/js/third_party.js"></script>
<script type="text/ng-template" id="summaryTile/collection">
<md-card class="oppia-activity-summary-tile bottom-card">
<div class="title-section" style="background-color: <[getThumbnailBgColor()]>;"></div>
<md-card class="oppia-activity-summary-tile middle-card">
<div class="title-section" style="background-color: <[getThumbnailBgColor()]>;"></div>
<md-card class="oppia-activity-summary-tile top-card">
<a ng-href="<[getCollectionLink()]>">
<div class="title-section" style="background-color: <[getThumbnailBgColor()]>;">
<img class="thumbnail-image" ng-src="<[getThumbnailIconUrl()]>">
<h2 class="activity-title"><[getCollectionTitle()]></h2>
</div>
<div>
<div class="objective">
<[getObjective() | truncateAndCapitalize: 45]>
<span ng-if="!getObjective()">No objective specified.</span>
</div>
<ul layout="row" class="metrics" layout-align="space-between center">
<li>
<span>
COLLECTION (<[getNodeCount()]>)
</span>
</li>
<li>
<span ng-if="!wasRecentlyUpdated()">
<[getLastUpdatedDatetime()]>
</span>
<span ng-if="wasRecentlyUpdated()" class="recently-updated">
UPDATED
</span>
</li>
</ul>
</div>
<div class="title-section-mask top-card-mask"></div>
</a>
</md-card>
<div class="title-section-mask"></div>
</md-card>
<div class="title-section-mask"></div>
</md-card>
</script>
<style>
.middle-card, .top-card {
box-shadow: -1px -1px 5px 0 rgba(0, 0, 0, 0.26);
margin: -158px 3px;
z-index: 11;
}
.bottom-card {
box-shadow: 8px 10px 5px 0 rgba(0, 0, 0, 0.26);
margin: 4px 8px 12px -4px;
}
.oppia-library-carousel-tiles .oppia-activity-summary-tile.middle-card.oppia-activity-summary-tile.top-card {
margin: -158px 6px;
}
.oppia-library-carousel-tiles .oppia-activity-summary-tile.bottom-card {
margin: 4px 10px 12px 4px;
}
</style>
<script type="text/ng-template" id="summaryTile/exploration">
<md-card class="oppia-activity-summary-tile" ng-class="{'small-width': !isWindowLarge}">
<a ng-href="<[getExplorationLink()]>" target="<[openInNewWindow ? '_blank' : '_self']>">
<div class="title-section" style="background-color: <[getThumbnailBgColor()]>;">
<img class="thumbnail-image" ng-src="<[getThumbnailIconUrl()]>">
<h2 class="activity-title protractor-test-exp-summary-tile-title">
<span ng-if="isWindowLarge"><[getExplorationTitle()|truncate:40]></span>
<span ng-if="!isWindowLarge"><[getExplorationTitle()|truncate:40]></span>
</h2>
<!-- Note that if this is ng-if instead, the avatar area will not detect a mouseover and the tile will behave incorrectly. -->
<div ng-show="isWindowLarge && avatarsList.length > 0" class="exploration-summary-avatars" ng-show="avatarsList.length > 0">
<div>
<circular-image ng-if="avatarsList.length > 0"
src="avatarsList[0].image"
link="avatarsList[0].link"
tooltip="<[avatarsList[0].tooltipText | truncate:14]>"
tooltip-placement="right">
</circular-image>
</div>
<div class="avatars-num-minus-one contributor-indicator contributor-indicator-background" ng-show="avatarsList.length > 1">
<span ng-if="!isCommunityOwned()">+</span><[avatarsList.length - 1]>
</div>
<div class="all-avatars" style="display: none;">
<div ng-repeat="avatar in avatarsList | limitTo:MAX_AVATARS_TO_DISPLAY-1:1">
<circular-image src="avatar.image"
link="avatar.link"
tooltip="<[avatar.tooltipText | truncate:14]>"
tooltip-placement="right">
</circular-image>
</div>
<div style="position: relative;" ng-show="avatarsList.length > MAX_AVATARS_TO_DISPLAY">
<div class="exploration-black-profile"></div>
<div class="num-remaining-avatars" ng-show="avatarsList.length > MAX_AVATARS_TO_DISPLAY">
+<[avatarsList.length - MAX_AVATARS_TO_DISPLAY]>
</div>
</div>
</div>
</div>
</div>
<div class="title-section-mask"></div>
<div ng-attr-section="<[isWindowLarge ? undefined : 'right-section']>">
<div ng-if="isWindowLarge" class="objective protractor-test-exp-summary-tile-objective">
<span ng-if="getObjective()">
<[getObjective() | truncateAndCapitalize: 40]>
</span>
<span ng-if="!getObjective()" translate="I18N_LIBRARY_NO_OBJECTIVE">
</span>
</div>
<ul layout="row" class="metrics" layout-align="space-between center">
<li>
<span class="protractor-test-exp-summary-tile-rating" ng-class="{'rating-disabled': !getAverageRating()}">
<span class="fa fa-star fa-lg" tooltip="<['I18N_LIBRARY_RATINGS_TOOLTIP' | translate]>" tooltip-placement="top">
</span>
<span ng-if="getAverageRating()">
<[getAverageRating() | number:1]>
</span>
<span ng-if="!getAverageRating()" translate="I18N_LIBRARY_N/A">
</span>
</span>
</li>
<li>
<span class="fa fa-eye fa-lg" tooltip="<['I18N_LIBRARY_VIEWS_TOOLTIP' | translate]>" tooltip-placement="top">
</span>
<[getNumViews() | summarizeNonnegativeNumber]>
</li>
<li>
<span ng-if="!wasRecentlyUpdated()">
<[getLastUpdatedDatetime()]>
</span>
<span ng-if="wasRecentlyUpdated()" class="recently-updated" translate="I18N_LIBRARY_UPDATED">
</span>
</li>
</ul>
</div>
</a>
</md-card>
</script>
<script type="text/ng-template" id="components/ratingSummary">
<span style="<[getCursorStyle()]>" ng-mouseleave="leaveArea()">
<span ng-if="ratingValue || isEditable" ng-repeat="star in stars" class="fa <[star.cssClass]> protractor-test-rating-star" ng-click="clickStar(star.value)" ng-mouseenter="enterStar(star.value)"></span>
</span>
</script>
<script type="text/ng-template" id="components/createActivityButton">
<div class="pull-right oppia-navbar-button-container">
<button class="btn oppia-navbar-button oppia-navbar-hide-on-small-width protractor-test-create-activity oppia-transition-200"
ng-click="initCreationProcess()" ng-disabled="creationInProgress">
<span translate="I18N_CREATE_EXPLORATION_CREATE"></span>
</button>
</div>
</script>
<script type="text/ng-template" id="components/activityTilesInfinityGrid">
<div infinite-scroll="showMoreActivities()" infinite-scroll-distance="1"
infinite-scroll-disabled="endOfPageIsReached || searchResultsAreLoading">
<div ng-repeat="activity in allActivitiesInOrder track by $index" style="display: inline-block;">
<collection-summary-tile ng-if="activity.activity_type === 'collection'"
collection-id="activity.id"
collection-title="activity.title"
last-updated-msec="activity.last_updated_msec"
node-count="activity.node_count"
objective="activity.objective"
thumbnail-icon-url="activity.thumbnail_icon_url"
thumbnail-bg-color="activity.thumbnail_bg_color"
style="margin-right: 3px;">
</collection-summary-tile>
<exploration-summary-tile ng-if="activity.activity_type === 'exploration'"
exploration-id="activity.id"
exploration-title="activity.title"
last-updated-msec="activity.last_updated_msec"
objective="activity.objective"
category="activity.category"
ratings="activity.ratings"
thumbnail-icon-url="activity.thumbnail_icon_url"
thumbnail-bg-color="activity.thumbnail_bg_color"
num-views="activity.num_views"
contributors-summary="activity.human_readable_contributors_summary"
is-community-owned="activity.community_owned"
is-community-editable="activity.community_editable"
class="protractor-test-exp-summary-tile">
</exploration-summary-tile>
</div>
</div>
<div class="oppia-search-results-loading-message"
ng-if="searchResultsAreLoading">
Loading more results
<loading-dots></loading-dots>
</div>
</script>
<style>
.oppia-search-results-loading-message {
background-color: #e9e9e9;
bottom: 0;
color: #000;
height: 30px;
margin-top: 15px;
opacity: 0.9;
padding-top: 5px;
text-align: center;
width: 100%;
z-index: 50;
}
</style>
<script type="text/ng-template" id="components/loadingDots">
<span class="oppia-loading-dot-one">.</span>
<span class="oppia-loading-dot-two">.</span>
<span class="oppia-loading-dot-three">.</span>
</script>
<script>
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Initialization and basic configuration for the Oppia module.
*/
// TODO(sll): Remove the check for window.GLOBALS. This check is currently
// only there so that the Karma tests run, since it looks like Karma doesn't
// 'see' the GLOBALS variable that is defined in base.html. We should fix this
// in order to make the testing and production environments match.
var oppia = angular.module(
'oppia', [
'ngMaterial', 'ngAnimate', 'ngSanitize', 'ngTouch', 'ngResource',
'ui.bootstrap', 'ui.sortable', 'infinite-scroll', 'ngJoyRide', 'ngImgCrop',
'ui.validate', 'textAngular', 'pascalprecht.translate', 'ngCookies',
'toastr'
].concat(
window.GLOBALS ? (window.GLOBALS.ADDITIONAL_ANGULAR_MODULES || [])
: []));
oppia.config([
'$compileProvider', '$httpProvider', '$interpolateProvider',
'$locationProvider',
function(
$compileProvider, $httpProvider, $interpolateProvider,
$locationProvider) {
// This improves performance by disabling debug data. For more details,
// see https://code.angularjs.org/1.5.5/docs/guide/production
$compileProvider.debugInfoEnabled(false);
// Set the AngularJS interpolators as <[ and ]>, to not conflict with
// Jinja2 templates.
$interpolateProvider.startSymbol('<[');
$interpolateProvider.endSymbol(']>');
// Prevent the search page from reloading if the search query is changed.
$locationProvider.html5Mode(false);
if (window.location.pathname === '/search/find') {
$locationProvider.html5Mode(true);
}
// Set default headers for POST and PUT requests.
$httpProvider.defaults.headers.post = {
'Content-Type': 'application/x-www-form-urlencoded'
};
$httpProvider.defaults.headers.put = {
'Content-Type': 'application/x-www-form-urlencoded'
};
// Add an interceptor to convert requests to strings and to log and show
// warnings for error responses.
$httpProvider.interceptors.push([
'$q', '$log', 'alertsService', function($q, $log, alertsService) {
return {
request: function(config) {
if (config.data) {
config.data = $.param({
csrf_token: GLOBALS.csrf_token,
payload: JSON.stringify(config.data),
source: document.URL
}, true);
}
return config;
},
responseError: function(rejection) {
// A rejection status of -1 seems to indicate (it's hard to find
// documentation) that the response has not completed,
// which can occur if the user navigates away from the page
// while the response is pending, This should not be considered
// an error.
if (rejection.status !== -1) {
$log.error(rejection.data);
var warningMessage = 'Error communicating with server.';
if (rejection.data && rejection.data.error) {
warningMessage = rejection.data.error;
}
alertsService.addWarning(warningMessage);
}
return $q.reject(rejection);
}
};
}
]);
}
]);
oppia.config(['$provide', function($provide) {
$provide.decorator('$log', ['$delegate', function($delegate) {
var _originalError = $delegate.error;
if (window.GLOBALS && !window.GLOBALS.DEV_MODE) {
$delegate.log = function() {};
$delegate.info = function() {};
// TODO(sll): Send errors (and maybe warnings) to the backend.
$delegate.warn = function() { };
$delegate.error = function(message) {
if (String(message).indexOf('$digest already in progress') === -1) {
_originalError(message);
}
};
// This keeps angular-mocks happy (in tests).
$delegate.error.logs = [];
}
return $delegate;
}]);
}]);
oppia.config(['toastrConfig', function(toastrConfig) {
angular.extend(toastrConfig, {
allowHtml: false,
iconClasses: {
error: 'toast-error',
info: 'toast-info',
success: 'toast-success',
warning: 'toast-warning'
},
positionClass: 'toast-bottom-right',
messageClass: 'toast-message',
progressBar: false,
tapToDismiss: true,
timeOut: 1500,
titleClass: 'toast-title'
});
}]);
// Returns true if the user is on a mobile device.
// See: http://stackoverflow.com/a/14301832/5020618
oppia.factory('deviceInfoService', ['$window', function($window) {
return {
isMobileDevice: function() {
return typeof $window.orientation !== 'undefined';
},
hasTouchEvents: function() {
return 'ontouchstart' in $window;
}
};
}]);
// Overwrite the built-in exceptionHandler service to log errors to the backend
// (so that they can be fixed).
oppia.factory('$exceptionHandler', ['$log', function($log) {
return function(exception, cause) {
var messageAndSourceAndStackTrace = [
'',
'Cause: ' + cause,
'Source: ' + window.location.href,
exception.message,
String(exception.stack)
].join('\n');
// Catch all errors, to guard against infinite recursive loops.
try {
// We use jQuery here instead of Angular's $http, since the latter
// creates a circular dependency.
$.ajax({
type: 'POST',
url: '/frontend_errors',
data: $.param({
csrf_token: GLOBALS.csrf_token,
payload: JSON.stringify({
error: messageAndSourceAndStackTrace
}),
source: document.URL
}, true),
contentType: 'application/x-www-form-urlencoded',
dataType: 'text',
async: true
});
} catch (loggingError) {
$log.warn('Error logging failed.');
}
$log.error.apply($log, arguments);
};
}]);
// Service for HTML serialization and escaping.
oppia.factory('oppiaHtmlEscaper', ['$log', function($log) {
var htmlEscaper = {
objToEscapedJson: function(obj) {
return this.unescapedStrToEscapedStr(JSON.stringify(obj));
},
escapedJsonToObj: function(json) {
if (!json) {
$log.error('Empty string was passed to JSON decoder.');
return '';
}
return JSON.parse(this.escapedStrToUnescapedStr(json));
},
unescapedStrToEscapedStr: function(str) {
return String(str)
.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
},
escapedStrToUnescapedStr: function(value) {
return String(value)
.replace(/&quot;/g, '"')
.replace(/&#39;/g, '\'')
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&amp;/g, '&');
}
};
return htmlEscaper;
}]);
// Service for converting dates in milliseconds since the Epoch to
// human-readable dates.
oppia.factory('oppiaDatetimeFormatter', ['$filter', function($filter) {
return {
// Returns just the time if the local datetime representation has the
// same date as the current date. Otherwise, returns just the date if the
// local datetime representation has the same year as the current date.
// Otherwise, returns the full date (with the year abbreviated).
getLocaleAbbreviatedDatetimeString: function(millisSinceEpoch) {
var date = new Date(millisSinceEpoch);
if (date.toLocaleDateString() === new Date().toLocaleDateString()) {
// The replace function removes 'seconds' from the time returned.
return date.toLocaleTimeString().replace(/:\d\d /, ' ');
} else if (date.getFullYear() === new Date().getFullYear()) {
return $filter('date')(date, 'MMM d');
} else {
return $filter('date')(date, 'shortDate');
}
},
// Returns just the date.
getLocaleDateString: function(millisSinceEpoch) {
var date = new Date(millisSinceEpoch);
return date.toLocaleDateString();
},
// Returns whether the date is at most one week before the current date.
isRecent: function(millisSinceEpoch) {
var ONE_WEEK_IN_MILLIS = 7 * 24 * 60 * 60 * 1000;
return new Date().getTime() - millisSinceEpoch < ONE_WEEK_IN_MILLIS;
}
};
}]);
// Service for validating things and (optionally) displaying warning messages
// if the validation fails.
oppia.factory('validatorsService', [
'$filter', 'alertsService', function($filter, alertsService) {
return {
/**
* Checks whether an entity name is valid, and displays a warning message
* if it isn't.
* @param {string} input - The input to be checked.
* @param {boolean} showWarnings - Whether to show warnings in the
* butterbar.
* @return {boolean} True if the entity name is valid, false otherwise.
*/
isValidEntityName: function(input, showWarnings, allowEmpty) {
input = $filter('normalizeWhitespace')(input);
if (!input && !allowEmpty) {
if (showWarnings) {
alertsService.addWarning('Please enter a non-empty name.');
}
return false;
}
for (var i = 0; i < GLOBALS.INVALID_NAME_CHARS.length; i++) {
if (input.indexOf(GLOBALS.INVALID_NAME_CHARS[i]) !== -1) {
if (showWarnings) {
alertsService.addWarning(
'Invalid input. Please use a non-empty description consisting ' +
'of alphanumeric characters, spaces and/or hyphens.'
);
}
return false;
}
}
return true;
},
isValidExplorationTitle: function(input, showWarnings) {
if (!this.isValidEntityName(input, showWarnings)) {
return false;
}
if (input.length > 40) {
if (showWarnings) {
alertsService.addWarning(
'Exploration titles should be at most 40 characters long.');
}
return false;
}
return true;
},
// NB: this does not check whether the card name already exists in the
// states dict.
isValidStateName: function(input, showWarnings) {
if (!this.isValidEntityName(input, showWarnings)) {
return false;
}
if (input.length > 50) {
if (showWarnings) {
alertsService.addWarning(
'Card names should be at most 50 characters long.');
}
return false;
}
return true;
},
isNonempty: function(input, showWarnings) {
if (!input) {
if (showWarnings) {
// TODO(sll): Allow this warning to be more specific in terms of what
// needs to be entered.
alertsService.addWarning('Please enter a non-empty value.');
}
return false;
}
return true;
}
};
}]);
oppia.constant('LABEL_FOR_CLEARING_FOCUS', 'labelForClearingFocus');
// Service for setting focus. This broadcasts a 'focusOn' event which sets
// focus to the element in the page with the corresponding focusOn attribute.
// Note: This requires LABEL_FOR_CLEARING_FOCUS to exist somewhere in the HTML
// page.
oppia.factory('focusService', [
'$rootScope', '$timeout', 'deviceInfoService', 'LABEL_FOR_CLEARING_FOCUS',
function($rootScope, $timeout, deviceInfoService, LABEL_FOR_CLEARING_FOCUS) {
var _nextLabelToFocusOn = null;
return {
clearFocus: function() {
this.setFocus(LABEL_FOR_CLEARING_FOCUS);
},
setFocus: function(name) {
if (_nextLabelToFocusOn) {
return;
}
_nextLabelToFocusOn = name;
$timeout(function() {
$rootScope.$broadcast('focusOn', _nextLabelToFocusOn);
_nextLabelToFocusOn = null;
});
},
setFocusIfOnDesktop: function(newFocusLabel) {
if (!deviceInfoService.isMobileDevice()) {
this.setFocus(newFocusLabel);
}
},
// Generates a random string (to be used as a focus label).
generateFocusLabel: function() {
return Math.random().toString(36).slice(2);
}
};
}
]);
// Service for manipulating the page URL.
oppia.factory('urlService', ['$window', function($window) {
return {
getUrlParams: function() {
var params = {};
var parts = $window.location.href.replace(
/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
params[key] = value;
});
return params;
},
isIframed: function() {
return !!(this.getUrlParams().iframed);
},
getPathname: function() {
return window.location.pathname;
}
};
}]);
// Service for computing the window dimensions.
oppia.factory('windowDimensionsService', ['$window', function($window) {
var onResizeHooks = [];
$window.onresize = function() {
onResizeHooks.forEach(function(hookFn) {
hookFn();
});
};
return {
getWidth: function() {
return (
$window.innerWidth || document.documentElement.clientWidth ||
document.body.clientWidth);
},
registerOnResizeHook: function(hookFn) {
onResizeHooks.push(hookFn);
}
};
}]);
// Service for sending events to Google Analytics.
//
// Note that events are only sent if the CAN_SEND_ANALYTICS_EVENTS flag is
// turned on. This flag must be turned on explicitly by the application
// owner in feconf.py.
oppia.factory('siteAnalyticsService', ['$window', function($window) {
var CAN_SEND_ANALYTICS_EVENTS = GLOBALS.CAN_SEND_ANALYTICS_EVENTS;
// For definitions of the various arguments, please see:
// developers.google.com/analytics/devguides/collection/analyticsjs/events
var _sendEventToGoogleAnalytics = function(
eventCategory, eventAction, eventLabel) {
if ($window.ga && CAN_SEND_ANALYTICS_EVENTS) {
$window.ga('send', 'event', eventCategory, eventAction, eventLabel);
}
};
// For definitions of the various arguments, please see:
// developers.google.com/analytics/devguides/collection/analyticsjs/
// social-interactions
var _sendSocialEventToGoogleAnalytics = function(
network, action, targetUrl) {
if ($window.ga && CAN_SEND_ANALYTICS_EVENTS) {
$window.ga('send', 'social', network, action, targetUrl);
}
};
return {
// The srcElement refers to the element on the page that is clicked.
registerStartLoginEvent: function(srcElement) {
_sendEventToGoogleAnalytics(
'LoginButton', 'click', $window.location.pathname + ' ' + srcElement);
},
registerNewSignupEvent: function() {
_sendEventToGoogleAnalytics('SignupButton', 'click', '');
},
registerClickBrowseLibraryButtonEvent: function() {
_sendEventToGoogleAnalytics(
'BrowseLibraryButton', 'click', $window.location.pathname);
},
registerClickCreateExplorationButtonEvent: function() {
_sendEventToGoogleAnalytics(
'CreateExplorationButton', 'click', $window.location.pathname);
},
registerCreateNewExplorationEvent: function(explorationId) {
_sendEventToGoogleAnalytics('NewExploration', 'create', explorationId);
},
registerCreateNewExplorationInCollectionEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'NewExplorationFromCollection', 'create', explorationId);
},
registerCreateNewCollectionEvent: function(collectionId) {
_sendEventToGoogleAnalytics('NewCollection', 'create', collectionId);
},
registerCommitChangesToPrivateExplorationEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'CommitToPrivateExploration', 'click', explorationId);
},
registerShareExplorationEvent: function(network) {
_sendSocialEventToGoogleAnalytics(
network, 'share', $window.location.pathname);
},
registerOpenEmbedInfoEvent: function(explorationId) {
_sendEventToGoogleAnalytics('EmbedInfoModal', 'open', explorationId);
},
registerCommitChangesToPublicExplorationEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'CommitToPublicExploration', 'click', explorationId);
},
// Metrics for tutorial on first creating exploration
registerTutorialModalOpenEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'TutorialModalOpen', 'open', explorationId);
},
registerDeclineTutorialModalEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'DeclineTutorialModal', 'click', explorationId);
},
registerAcceptTutorialModalEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'AcceptTutorialModal', 'click', explorationId);
},
// Metrics for visiting the help center
registerClickHelpButtonEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'ClickHelpButton', 'click', explorationId);
},
registerVisitHelpCenterEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'VisitHelpCenter', 'click', explorationId);
},
registerOpenTutorialFromHelpCenterEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'OpenTutorialFromHelpCenter', 'click', explorationId);
},
// Metrics for exiting the tutorial
registerSkipTutorialEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'SkipTutorial', 'click', explorationId);
},
registerFinishTutorialEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FinishTutorial', 'click', explorationId);
},
// Metrics for first time editor use
registerEditorFirstEntryEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstEnterEditor', 'open', explorationId);
},
registerFirstOpenContentBoxEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstOpenContentBox', 'open', explorationId);
},
registerFirstSaveContentEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstSaveContent', 'click', explorationId);
},
registerFirstClickAddInteractionEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstClickAddInteraction', 'click', explorationId);
},
registerFirstSelectInteractionTypeEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstSelectInteractionType', 'click', explorationId);
},
registerFirstSaveInteractionEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstSaveInteraction', 'click', explorationId);
},
registerFirstSaveRuleEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstSaveRule', 'click', explorationId);
},
registerFirstCreateSecondStateEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'FirstCreateSecondState', 'create', explorationId);
},
// Metrics for publishing explorations
registerSavePlayableExplorationEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'SavePlayableExploration', 'save', explorationId);
},
registerOpenPublishExplorationModalEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'PublishExplorationModal', 'open', explorationId);
},
registerPublishExplorationEvent: function(explorationId) {
_sendEventToGoogleAnalytics(
'PublishExploration', 'click', explorationId);
}
};
}]);
// Service for debouncing function calls.
oppia.factory('oppiaDebouncer', [function() {
return {
// Returns a function that will not be triggered as long as it continues to
// be invoked. The function only gets executed after it stops being called
// for `wait` milliseconds.
debounce: function(func, millisecsToWait) {
var timeout;
var context;
var args;
var timestamp;
var result;
var later = function() {
var last = new Date().getTime() - timestamp;
if (last < millisecsToWait && last > 0) {
timeout = setTimeout(later, millisecsToWait - last);
} else {
timeout = null;
result = func.apply(context, args);
if (!timeout) {
context = null;
args = null;
}
}
};
return function() {
context = this;
args = arguments;
timestamp = new Date().getTime();
if (!timeout) {
timeout = setTimeout(later, millisecsToWait);
}
return result;
};
}
};
}]);
// Service for assembling extension tags (for gadgets and interactions).
oppia.factory('extensionTagAssemblerService', [
'$filter', 'oppiaHtmlEscaper', function($filter, oppiaHtmlEscaper) {
return {
formatCustomizationArgAttrs: function(element, customizationArgSpecs) {
for (var caSpecName in customizationArgSpecs) {
var caSpecValue = customizationArgSpecs[caSpecName].value;
element.attr(
$filter('camelCaseToHyphens')(caSpecName) + '-with-value',
oppiaHtmlEscaper.objToEscapedJson(caSpecValue));
}
return element;
}
};
}]);
// Add a String.prototype.trim() polyfill for IE8.
if (typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
};
}
// Add an Object.create() polyfill for IE8.
if (typeof Object.create !== 'function') {
(function() {
var F = function() {};
Object.create = function(o) {
if (arguments.length > 1) {
throw Error('Second argument for Object.create() is not supported');
}
if (o === null) {
throw Error('Cannot set a null [[Prototype]]');
}
if (typeof o !== 'object') {
throw TypeError('Argument must be an object');
}
F.prototype = o;
return new F();
};
})();
}
// Service for code normalization. Used by the code REPL and pencil code
// interactions.
oppia.factory('codeNormalizationService', [function() {
var removeLeadingWhitespace = function(str) {
return str.replace(/^\s+/g, '');
};
var removeTrailingWhitespace = function(str) {
return str.replace(/\s+$/g, '');
};
var removeIntermediateWhitespace = function(str) {
return str.replace(/\s+/g, ' ');
};
var normalizeCaseInStrings = function(str) {
// Note that this only takes into account single-line strings. It also
// tries to properly account for escaped characters.
var inSingleQuotedString = false;
var inDoubleQuotedString = false;
var answer = '';
for (var i = 0; i < str.length; i++) {
if (str[i] === '\\') {
answer += str[i];
i++;
if (i < str.length) {
answer += str[i];
}
} else if (inSingleQuotedString) {
answer += str[i].toLowerCase();
if (str[i] === '\'') {
inSingleQuotedString = false;
}
} else if (inDoubleQuotedString) {
answer += str[i].toLowerCase();
if (str[i] === '"') {
inDoubleQuotedString = false;
}
} else {
if (str[i] === '\'') {
inSingleQuotedString = true;
} else if (str[i] === '"') {
inDoubleQuotedString = true;
}
answer += str[i];
}
}
// If the string is invalid (with regards to quotation marks), just return
// it without normalization.
if (inSingleQuotedString || inDoubleQuotedString) {
answer = str;
}
return answer;
};
return {
getNormalizedCode: function(codeString) {
/*
* Normalizes a code string (which is assumed not to contain tab
* characters). In particular:
*
* - Strips out lines that start with '#' (comments), possibly preceded by
* whitespace.
* - Trims trailing whitespace on each line, and normalizes multiple
* whitespace characters within a single line into one space
* character.
* - Removes blank newlines.
* - Make the indentation level four spaces.
*/
// TODO(sll): Augment this function to strip out comments that occur at
// the end of a line. However, be careful with lines where '#' is
// contained in quotes or the character is escaped.
var FOUR_SPACES = ' ';
// Maps the number of spaces at the beginning of a line to an int
// specifying the desired indentation level.
var numSpacesToDesiredIndentLevel = {
0: 0
};
var codeLines = removeTrailingWhitespace(codeString).split('\n');
var normalizedCodeLines = [];
codeLines.forEach(function(line) {
if (removeLeadingWhitespace(line).indexOf('#') === 0) {
return;
}
line = removeTrailingWhitespace(line);
if (!line) {
return;
}
var numSpaces = line.length - removeLeadingWhitespace(line).length;
var existingNumSpaces = Object.keys(numSpacesToDesiredIndentLevel);
var maxNumSpaces = Math.max.apply(null, existingNumSpaces);
if (numSpaces > maxNumSpaces) {
// Add a new indentation level
numSpacesToDesiredIndentLevel[numSpaces] = existingNumSpaces.length;
}
// This is set when the indentation level of the current line does not
// start a new scope, and also does not match any previous indentation
// level. This case is actually invalid, but for now, we take the
// largest indentation level that is less than this one.
// TODO(sll): Bad indentation should result in an error nearer the
// source.
var isShortfallLine =
!numSpacesToDesiredIndentLevel.hasOwnProperty(numSpaces) &&
numSpaces < maxNumSpaces;
// Clear all existing indentation levels to the right of this one.
for (var indentLength in numSpacesToDesiredIndentLevel) {
if (Number(indentLength) > numSpaces) {
delete numSpacesToDesiredIndentLevel[indentLength];
}
}
if (isShortfallLine) {
existingNumSpaces = Object.keys(numSpacesToDesiredIndentLevel);
numSpaces = Math.max.apply(null, existingNumSpaces);
}
var normalizedLine = '';
for (var i = 0; i < numSpacesToDesiredIndentLevel[numSpaces]; i++) {
normalizedLine += FOUR_SPACES;
}
normalizedLine += normalizeCaseInStrings(removeIntermediateWhitespace(
removeLeadingWhitespace(line)));
normalizedCodeLines.push(normalizedLine);
});
return normalizedCodeLines.join('\n');
}
};
}]);
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Oppia's base controller.
*/
// TODO(sll): Get this to read from a common JSON file; it's replicated in
// feconf.
oppia.constant('CATEGORY_LIST', GLOBALS.ALL_CATEGORIES || []);
// We use a slash because this character is forbidden in a state name.
oppia.constant('PLACEHOLDER_OUTCOME_DEST', '/');
oppia.constant('DEFAULT_RULE_NAME', 'Default');
oppia.constant('CLASSIFIER_RULESPEC_STR', 'FuzzyMatches');
// Feature still in development.
// NOTE TO DEVELOPERS: This should be synchronized with the value in feconf.
oppia.constant('ENABLE_STRING_CLASSIFIER', false);
oppia.constant('DEFAULT_CLASSIFIER_RULE_SPEC', {
rule_type: 'FuzzyMatches',
inputs: {
training_data: []
}
});
oppia.constant('EVENT_HTML_CHANGED', 'htmlChanged');
oppia.constant('PARAMETER_TYPES', {
REAL: 'Real',
UNICODE_STRING: 'UnicodeString'
});
oppia.constant('INTERACTION_DISPLAY_MODE_INLINE', 'inline');
oppia.constant('OBJECT_EDITOR_URL_PREFIX', '/object_editor_template/');
// The maximum number of nodes to show in a row of the state graph.
oppia.constant('MAX_NODES_PER_ROW', 4);
// The following variable must be at least 3. It represents the maximum length,
// in characters, for the name of each node label in the state graph.
oppia.constant('MAX_NODE_LABEL_LENGTH', 15);
// If an $http request fails with the following error codes, a warning is
// displayed using alertsService.
oppia.constant('FATAL_ERROR_CODES', [400, 401, 404, 500]);
// Global utility methods.
oppia.controller('Base', [
'$scope', '$http', '$rootScope', '$window', '$timeout', '$document', '$log',
'alertsService', 'LABEL_FOR_CLEARING_FOCUS', 'siteAnalyticsService',
'windowDimensionsService', 'UrlInterpolationService',
function(
$scope, $http, $rootScope, $window, $timeout, $document, $log,
alertsService, LABEL_FOR_CLEARING_FOCUS, siteAnalyticsService,
windowDimensionsService, UrlInterpolationService) {
$rootScope.DEV_MODE = GLOBALS.DEV_MODE;
$scope.alertsService = alertsService;
$scope.LABEL_FOR_CLEARING_FOCUS = LABEL_FOR_CLEARING_FOCUS;
// If this is nonempty, the whole page goes into 'Loading...' mode.
$rootScope.loadingMessage = '';
if (GLOBALS.userIsLoggedIn) {
// Show the number of unseen notifications in the navbar and page title,
// unless the user is already on the dashboard page.
$http.get('/notificationshandler').then(function(response) {
var data = response.data;
if ($window.location.pathname !== '/') {
$scope.numUnseenNotifications = data.num_unseen_notifications;
if ($scope.numUnseenNotifications > 0) {
$window.document.title = (
'(' + $scope.numUnseenNotifications + ') ' +
$window.document.title);
}
}
});
}
$scope.getStaticImageUrl = UrlInterpolationService.getStaticImageUrl;
// This method is here because the trigger for the tutorial is in the site
// navbar. It broadcasts an event to tell the exploration editor to open the
// editor tutorial.
$scope.openEditorTutorial = function() {
$scope.$broadcast('openEditorTutorial');
};
// The following methods and listeners relate to the global navigation
// sidebar.
$scope.openSidebar = function() {
if (!$scope.sidebarIsShown) {
$scope.sidebarIsShown = true;
$scope.pendingSidebarClick = true;
} else {
$scope.sidebarIsShown = false;
$scope.pendingSidebarClick = false;
}
};
// TODO(sll): use 'touchstart' for mobile.
$document.on('click', function() {
if (!$scope.pendingSidebarClick) {
$scope.sidebarIsShown = false;
} else {
$scope.pendingSidebarClick = false;
}
$scope.$apply();
});
$scope.profileDropdownIsActive = false;
$scope.onMouseoverProfilePictureOrDropdown = function(evt) {
angular.element(evt.currentTarget).parent().addClass('open');
$scope.profileDropdownIsActive = true;
};
$scope.onMouseoutProfilePictureOrDropdown = function(evt) {
angular.element(evt.currentTarget).parent().removeClass('open');
$scope.profileDropdownIsActive = false;
};
$scope.onMouseoverDropdownMenu = function(evt) {
angular.element(evt.currentTarget).parent().addClass('open');
};
$scope.onMouseoutDropdownMenu = function(evt) {
angular.element(evt.currentTarget).parent().removeClass('open');
};
$scope.onLoginButtonClicked = function(loginUrl) {
siteAnalyticsService.registerStartLoginEvent('loginButton');
$timeout(function() {
$window.location = loginUrl;
}, 150);
return false;
};
var doesNavbarHaveSearchBar = function() {
return (
$window.location.pathname.indexOf('/search') === 0 ||
$window.location.pathname.indexOf('/library') === 0);
};
var navbarCutoffWidthPx = doesNavbarHaveSearchBar() ? 1171 : 800;
$scope.windowIsNarrow = (
windowDimensionsService.getWidth() <= navbarCutoffWidthPx);
$scope.openSidebarOnSwipe = function() {
if ($scope.windowIsNarrow) {
if (!$scope.sidebarIsShown) {
$scope.sidebarIsShown = true;
$scope.pendingSidebarClick = true;
}
}
};
$scope.closeSidebarOnSwipe = function() {
if ($scope.windowIsNarrow) {
if ($scope.sidebarIsShown) {
$scope.sidebarIsShown = false;
$scope.pendingSidebarClick = false;
}
}
};
windowDimensionsService.registerOnResizeHook(function() {
$scope.windowIsNarrow = (
windowDimensionsService.getWidth() <= navbarCutoffWidthPx);
$scope.$apply();
// If the window is now wide, and the sidebar is still open, close it.
if (!$scope.windowIsNarrow) {
$scope.sidebarIsShown = false;
}
});
$scope.pageHasLoaded = false;
$scope.pendingSidebarClick = false;
$scope.sidebarIsShown = false;
$timeout(function() {
$scope.pageHasLoaded = true;
}, 500);
}
]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directives that are not associated with reusable components.
* NB: Reusable component directives should go in the components/ folder.
*/
// HTML bind directive that trusts the value it is given and also evaluates
// custom directive tags in the provided value.
oppia.directive('angularHtmlBind', ['$compile', '$timeout',
'EVENT_HTML_CHANGED', function($compile, $timeout, EVENT_HTML_CHANGED) {
return {
restrict: 'A',
link: function(scope, elm, attrs) {
scope.$watch(attrs.angularHtmlBind, function(newValue) {
// Inform child components that the value of the HTML string has
// changed, so that they can perform any necessary cleanup.
scope.$broadcast(EVENT_HTML_CHANGED);
$timeout(function() {
elm.html(newValue);
$compile(elm.contents())(scope);
}, 10);
});
}
};
}]);
oppia.directive('mathjaxBind', [function() {
return {
restrict: 'A',
controller: [
'$scope', '$element', '$attrs', function($scope, $element, $attrs) {
$scope.$watch($attrs.mathjaxBind, function(value) {
var $script = angular.element(
'<script type="math/tex">'
).html(value === undefined ? '' : value);
$element.html('');
$element.append($script);
MathJax.Hub.Queue(['Reprocess', MathJax.Hub, $element[0]]);
});
}
]
};
}]);
// Highlights the text of an input field when it is clicked.
oppia.directive('selectOnClick', [function() {
return {
restrict: 'A',
link: function(scope, elm) {
elm.bind('click', function() {
this.select();
});
}
};
}]);
// A popover that is shown when its label is hovered or clicked upon, and
// disappears when focus moves away from its label.
oppia.directive('customPopover', ['$sce', function($sce) {
return {
restrict: 'A',
template: (
'<div style="cursor: pointer;" ng-click="showPopover()"><[label]></div>'
),
link: function(scope, elt, attrs) {
scope.label = attrs.popoverLabel;
$(elt).popover({
trigger: 'hover',
html: true,
content: $sce.getTrustedHtml(
'<pre class="oppia-pre-wrapped-text">' + attrs.popoverText +
'</pre>'),
placement: attrs.popoverPlacement
});
},
controller: ['$scope', '$element', function($scope, $element) {
$scope.isShown = false;
$element.on('shown.bs.popover', function() {
$scope.isShown = true;
});
$element.on('hidden.bs.popover', function() {
$scope.isShown = false;
});
$scope.showPopover = function() {
if (!$scope.isShown) {
$element.popover('show');
}
};
}]
};
}]);
// When set as an attr of an <input> element, moves focus to that element
// when a 'focusOn' event is broadcast.
oppia.directive('focusOn', [
'LABEL_FOR_CLEARING_FOCUS', function(LABEL_FOR_CLEARING_FOCUS) {
return function(scope, elt, attrs) {
scope.$on('focusOn', function(e, name) {
if (name === attrs.focusOn) {
elt[0].focus();
}
// If the purpose of the focus switch was to clear focus, blur the
// element.
if (name === LABEL_FOR_CLEARING_FOCUS) {
elt[0].blur();
}
});
};
}
]);
oppia.directive('imageUploader', [function() {
return {
restrict: 'E',
scope: {
height: '@',
onFileChanged: '=',
width: '@'
},
templateUrl: 'components/imageUploader',
link: function(scope, elt) {
var onDragEnd = function(e) {
e.preventDefault();
$(elt).removeClass('image-uploader-is-active');
};
$(elt).bind('drop', function(e) {
onDragEnd(e);
scope.onFileChanged(
e.originalEvent.dataTransfer.files[0],
e.originalEvent.dataTransfer.files[0].name);
});
$(elt).bind('dragover', function(e) {
e.preventDefault();
$(elt).addClass('image-uploader-is-active');
});
$(elt).bind('dragleave', onDragEnd);
// We generate a random class name to distinguish this input from
// others in the DOM.
scope.fileInputClassName = (
'image-uploader-file-input' + Math.random().toString(36).substring(5));
angular.element(document).on(
'change', '.' + scope.fileInputClassName, function(evt) {
scope.onFileChanged(
evt.currentTarget.files[0],
evt.target.value.split(/(\\|\/)/g).pop());
});
}
};
}]);
oppia.directive('mobileFriendlyTooltip', ['$timeout', function($timeout) {
return {
restrict: 'A',
scope: true,
controller: ['$scope', 'deviceInfoService', function(
$scope, deviceInfoService) {
$scope.opened = false;
$scope.deviceHasTouchEvents = deviceInfoService.hasTouchEvents();
}],
link: function(scope, element) {
var TIME_TOOLTIP_CLOSE_DELAY_MOBILE = 1000;
if (scope.deviceHasTouchEvents) {
element.on('touchstart', function() {
scope.opened = true;
scope.$apply();
});
element.on('touchend', function() {
// Set time delay before tooltip close
$timeout(function() {
scope.opened = false;
}, TIME_TOOLTIP_CLOSE_DELAY_MOBILE);
});
} else {
element.on('mouseenter', function() {
scope.opened = true;
scope.$apply();
});
element.on('mouseleave', function() {
scope.opened = false;
scope.$apply();
});
};
}
};
}]);
oppia.directive('scrollOnClick', function() {
return {
restrict: 'A',
scope: {
isDropdownOpen: '=isDropdownOpen',
isPrivate: '=isPrivate'
},
link: function(scope, element) {
var isDisabled;
scope.$watch('isDropdownOpen', function() {
isDisabled = scope.isDropdownOpen || scope.isPrivate;
});
element.on('click', function() {
if (!isDisabled) {
$('html, body').animate({
scrollTop: element.offset().top - 60
}, 'slow');
}
});
}
};
});
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Filters for Oppia.
*/
oppia.constant('RULE_SUMMARY_WRAP_CHARACTER_COUNT', 30);
oppia.filter('spacesToUnderscores', [function() {
return function(input) {
return input.trim().replace(/ /g, '_');
};
}]);
oppia.filter('underscoresToCamelCase', [function() {
return function(input) {
return input.replace(/_+(.)/g, function(match, group1) {
return group1.toUpperCase();
});
};
}]);
oppia.filter('camelCaseToHyphens', [function() {
return function(input) {
var result = input.replace(/([a-z])?([A-Z])/g, '$1-$2').toLowerCase();
if (result[0] === '-') {
result = result.substring(1);
}
return result;
};
}]);
// Filter that truncates long descriptors.
oppia.filter('truncate', ['$filter', function($filter) {
return function(input, length, suffix) {
if (!input) {
return '';
}
if (isNaN(length)) {
length = 70;
}
if (suffix === undefined) {
suffix = '...';
}
if (!angular.isString(input)) {
input = String(input);
}
input = $filter('convertToPlainText')(input);
return (
input.length <= length ? input : (
input.substring(0, length - suffix.length) + suffix));
};
}]);
oppia.filter('truncateAtFirstLine', [function() {
return function(input) {
if (!input) {
return input;
}
var pattern = /(\r\n|[\n\v\f\r\x85\u2028\u2029])/g;
// Normalize line endings then split using the normalized delimiter.
var lines = input.replace(pattern, '\n').split('\n');
var firstNonemptyLineIndex = -1;
var otherNonemptyLinesExist = false;
for (var i = 0; i < lines.length; i++) {
if (lines[i].length > 0) {
if (firstNonemptyLineIndex === -1) {
firstNonemptyLineIndex = i;
} else {
otherNonemptyLinesExist = true;
break;
}
}
}
var suffix = otherNonemptyLinesExist ? '...' : '';
return (
firstNonemptyLineIndex !== -1 ?
lines[firstNonemptyLineIndex] + suffix : '');
};
}]);
// Filter that rounds a number to 1 decimal place.
oppia.filter('round1', [function() {
return function(input) {
return Math.round(input * 10) / 10;
};
}]);
// Filter that replaces all {{...}} in a string with '...'.
oppia.filter('replaceInputsWithEllipses', [function() {
var pattern = /\{\{\s*(\w+)\s*(\|\s*\w+\s*)?\}\}/g;
return function(input) {
return input ? input.replace(pattern, '...') : '';
};
}]);
// Filter that truncates a string at the first '...'.
oppia.filter('truncateAtFirstEllipsis', [function() {
var pattern = /\.\.\./g;
return function(input) {
if (!input) {
return '';
}
var matchLocation = input.search(pattern);
return matchLocation === -1 ? input : (input.substring(0, matchLocation));
};
}]);
oppia.filter('wrapTextWithEllipsis', ['$filter', function($filter) {
return function(input, characterCount) {
if (typeof input === 'string' || input instanceof String) {
input = $filter('normalizeWhitespace')(input);
if (input.length <= characterCount || characterCount < 3) {
// String fits within the criteria; no wrapping is necessary.
return input;
}
// Replace characters counting backwards from character count with an
// ellipsis, then trim the string.
return input.substr(0, characterCount - 3).trim() + '...';
} else {
return input;
}
};
}]);
// Filter that returns true iff an outcome has a self-loop and no feedback.
oppia.filter('isOutcomeConfusing', [function() {
return function(outcome, currentStateName) {
return (
outcome.dest === currentStateName &&
!outcome.feedback.some(function(feedbackItem) {
return feedbackItem.trim().length > 0;
})
);
};
}]);
// Filter that changes {{...}} tags into the corresponding parameter input
// values. Note that this returns an HTML string to accommodate the case of
// multiple-choice input and image-click input.
oppia.filter('parameterizeRuleDescription', [
'INTERACTION_SPECS', function(INTERACTION_SPECS) {
return function(rule, interactionId, choices) {
if (!rule) {
return '';
}
if (!INTERACTION_SPECS.hasOwnProperty(interactionId)) {
console.error('Cannot find interaction with id ' + interactionId);
return '';
}
var description = INTERACTION_SPECS[interactionId].rule_descriptions[
rule.rule_type];
if (!description) {
console.error(
'Cannot find description for rule ' + rule.rule_type +
' for interaction ' + interactionId);
return '';
}
var inputs = rule.inputs;
var finalDescription = description;
var PATTERN = /\{\{\s*(\w+)\s*(\|\s*\w+\s*)?\}\}/;
var iter = 0;
while (true) {
if (!description.match(PATTERN) || iter === 100) {
break;
}
iter++;
var varName = description.match(PATTERN)[1];
var varType = description.match(PATTERN)[2];
if (varType) {
varType = varType.substring(1);
}
var replacementText = '[INVALID]';
// Special case for MultipleChoiceInput, ImageClickInput, and
// ItemSelectionInput.
if (choices) {
if (varType === 'SetOfHtmlString') {
replacementText = '[';
var key = inputs[varName];
for (var i = 0; i < key.length; i++) {
replacementText += key[i];
if (i < key.length - 1) {
replacementText += ',';
}
}
replacementText += ']';
} else {
// The following case is for MultipleChoiceInput
for (var i = 0; i < choices.length; i++) {
if (choices[i].val === inputs[varName]) {
replacementText = '\'' + choices[i].label + '\'';
}
}
}
// TODO(sll): Generalize this to use the inline string representation of
// an object type.
} else if (varType === 'MusicPhrase') {
replacementText = '[';
for (var i = 0; i < inputs[varName].length; i++) {
if (i !== 0) {
replacementText += ', ';
}
replacementText += inputs[varName][i].readableNoteName;
}
replacementText += ']';
} else if (varType === 'CoordTwoDim') {
var latitude = inputs[varName][0] || 0.0;
var longitude = inputs[varName][1] || 0.0;
replacementText = '(';
replacementText += (
inputs[varName][0] >= 0.0 ?
latitude.toFixed(2) + '\xb0N' :
-latitude.toFixed(2) + '\xb0S');
replacementText += ', ';
replacementText += (
inputs[varName][1] >= 0.0 ?
longitude.toFixed(2) + '\xb0E' :
-longitude.toFixed(2) + '\xb0W');
replacementText += ')';
} else if (varType === 'NormalizedString') {
replacementText = '"' + inputs[varName] + '"';
} else if (varType === 'Graph') {
replacementText = '[reference graph]';
} else {
replacementText = inputs[varName];
}
description = description.replace(PATTERN, ' ');
finalDescription = finalDescription.replace(PATTERN, replacementText);
}
return finalDescription;
};
}]);
// Filter that removes whitespace from the beginning and end of a string, and
// replaces interior whitespace with a single space character.
oppia.filter('normalizeWhitespace', [function() {
return function(input) {
if (typeof input === 'string' || input instanceof String) {
// Remove whitespace from the beginning and end of the string, and
// replace interior whitespace with a single space character.
input = input.trim();
input = input.replace(/\s{2,}/g, ' ');
return input;
} else {
return input;
}
};
}]);
oppia.filter('convertToPlainText', [function() {
return function(input) {
var strippedText = input.replace(/(<([^>]+)>)/ig, '');
strippedText = strippedText.replace('&nbsp;', ' ');
var trimmedText = strippedText.trim();
if (trimmedText.length === 0) {
return strippedText;
} else {
return trimmedText;
}
};
}]);
oppia.filter('summarizeAnswerGroup', [
'$filter', 'RULE_SUMMARY_WRAP_CHARACTER_COUNT',
function($filter, RULE_SUMMARY_WRAP_CHARACTER_COUNT) {
return function(answerGroup, interactionId, answerChoices, shortenRule) {
var summary = '';
var outcome = answerGroup.outcome;
var hasFeedback = outcome.feedback.length > 0 && outcome.feedback[0];
if (answerGroup.rule_specs) {
var firstRule = $filter('convertToPlainText')(
$filter('parameterizeRuleDescription')(
answerGroup.rule_specs[0], interactionId, answerChoices));
summary = 'Answer ' + firstRule;
if (hasFeedback && shortenRule) {
summary = $filter('wrapTextWithEllipsis')(
summary, RULE_SUMMARY_WRAP_CHARACTER_COUNT);
}
summary = '[' + summary + '] ';
}
if (hasFeedback) {
summary += $filter('convertToPlainText')(outcome.feedback[0]);
}
return summary;
};
}]);
oppia.filter('summarizeDefaultOutcome', [
'$filter', 'RULE_SUMMARY_WRAP_CHARACTER_COUNT',
function($filter, RULE_SUMMARY_WRAP_CHARACTER_COUNT) {
return function(
defaultOutcome, interactionId, answerGroupCount, shortenRule) {
if (!defaultOutcome) {
return '';
}
var summary = '';
var feedback = defaultOutcome.feedback;
var hasFeedback = feedback.length > 0 && feedback[0];
if (interactionId === 'Continue') {
summary = 'When the button is clicked';
} else if (answerGroupCount > 0) {
summary = 'All other answers';
} else {
summary = 'All answers';
}
if (hasFeedback && shortenRule) {
summary = $filter('wrapTextWithEllipsis')(
summary, RULE_SUMMARY_WRAP_CHARACTER_COUNT);
}
summary = '[' + summary + '] ';
if (hasFeedback) {
summary += $filter('convertToPlainText')(defaultOutcome.feedback[0]);
}
return summary;
};
}]);
// Filter that summarizes a large number to a decimal followed by
// the appropriate metric prefix (K, M or B). For example, 167656
// becomes 167.7K.
// Users of this filter should ensure that the input is a non-negative number.
oppia.filter('summarizeNonnegativeNumber', [function() {
return function(input) {
input = Number(input);
// Nine zeros for billions (e.g. 146008788788 --> 146.0B).
// Six zeros for millions (e.g. 146008788 --> 146.0M).
// Three zeros for thousands (e.g. 146008 --> 146.0K).
// No change for small numbers (e.g. 12 --> 12).
return (
input >= 1.0e+9 ? (input / 1.0e+9).toFixed(1) + 'B' :
input >= 1.0e+6 ? (input / 1.0e+6).toFixed(1) + 'M' :
input >= 1.0e+3 ? (input / 1.0e+3).toFixed(1) + 'K' :
input);
};
}]);
// Note that this filter does not truncate at the middle of a word.
oppia.filter('truncateAndCapitalize', [function() {
return function(input, maxNumberOfCharacters) {
var words = input.trim().match(/\S+/g);
// Capitalize the first word and add it to the result.
var result = words[0].charAt(0).toUpperCase() + words[0].slice(1);
// Add the remaining words to the result until the character limit is
// reached.
for (var i = 1; i < words.length; i++) {
if (!maxNumberOfCharacters ||
result.length + 1 + words[i].length <= maxNumberOfCharacters) {
result += ' ';
result += words[i];
} else {
result += '...';
break;
}
}
return result;
};
}]);
oppia.filter('removeDuplicatesInArray', [function() {
return function(input) {
return input.filter(function(val, pos) {
return input.indexOf(val) === pos;
});
};
}]);
})();
(function() {// Copyright 2015 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Translation functions for Oppia.
*
* @author milagro.teruel@gmail.com (Milagro Teruel)
*/
// Translations of strings that are loaded in the front page. They are listed
// here to be loaded synchronously with the script to prevent a FOUC or
// Flash of Untranslated Content.
// See http://angular-translate.github.io/docs/#/guide/12_asynchronous-loading
oppia.constant('DEFAULT_TRANSLATIONS', {
I18N_LIBRARY_PAGE_TITLE: 'Library',
I18N_LIBRARY_LOADING: 'Loading',
I18N_SIGNUP_PAGE_SUBTITLE: 'Registration',
I18N_SIGNUP_PAGE_TITLE: 'Oppia',
I18N_LIBRARY_SEARCH_PLACEHOLDER: 'What are you curious about?',
I18N_LIBRARY_ALL_LANGUAGES: 'All Languages',
I18N_LIBRARY_LANGUAGES_EN: 'English',
I18N_LIBRARY_ALL_CATEGORIES: 'All Categories',
I18N_TOPNAV_SIGN_IN: 'Sign in',
I18N_SPLASH_PAGE_TITLE: 'Oppia: Teach, Learn, Explore',
I18N_SIGNUP_REGISTRATION: 'Registration',
I18N_SIGNUP_LOADING: 'Loading'
});
oppia.controller('I18nFooter', [
'$http', '$rootScope', '$scope', '$translate', '$timeout',
function($http, $rootScope, $scope, $translate, $timeout) {
// Changes the language of the translations.
var preferencesDataUrl = '/preferenceshandler/data';
var siteLanguageUrl = '/save_site_language';
$scope.supportedSiteLanguages = GLOBALS.SUPPORTED_SITE_LANGUAGES;
if (GLOBALS.userIsLoggedIn && GLOBALS.preferredSiteLanguageCode) {
$translate.use(GLOBALS.preferredSiteLanguageCode);
}
// The $timeout seems to be necessary for the dropdown to show anything
// at the outset, if the default language is not English.
$timeout(function() {
// $translate.use() returns undefined until the language file is fully
// loaded, which causes a blank field in the dropdown, hence we use
// $translate.proposedLanguage() as suggested in
// http://stackoverflow.com/a/28903658
$scope.currentLanguageCode = $translate.use() ||
$translate.proposedLanguage();
}, 50);
$scope.changeLanguage = function() {
$translate.use($scope.currentLanguageCode);
if (GLOBALS.userIsLoggedIn) {
$http.put(siteLanguageUrl, {
site_language_code: $scope.currentLanguageCode
});
}
};
}]);
oppia.config([
'$translateProvider', 'DEFAULT_TRANSLATIONS',
function($translateProvider, DEFAULT_TRANSLATIONS) {
var availableLanguageKeys = [];
var availableLanguageKeysMap = {};
for (var prop in GLOBALS.SUPPORTED_SITE_LANGUAGES) {
availableLanguageKeys.push(prop);
availableLanguageKeysMap[prop + '*'] = prop;
}
availableLanguageKeysMap['*'] = 'en';
$translateProvider
.registerAvailableLanguageKeys(
availableLanguageKeys, availableLanguageKeysMap)
.useStaticFilesLoader({
prefix: GLOBALS.ASSET_DIR_PREFIX + '/assets/i18n/',
suffix: '.json'
})
// The use of default translation improves the loading time when English is
// selected
.translations('en', DEFAULT_TRANSLATIONS)
.fallbackLanguage('en')
.determinePreferredLanguage()
.useCookieStorage()
// The messageformat interpolation method is necessary for pluralization.
// Is optional and should be passed as argument to the translate call. See
// https://angular-translate.github.io/docs/#/guide/14_pluralization
.addInterpolation('$translateMessageFormatInterpolation')
// The strategy 'sanitize' does not support utf-8 encoding.
// https://github.com/angular-translate/angular-translate/issues/1131
// The strategy 'escape' will brake strings with raw html, like hyperlinks
.useSanitizeValueStrategy('sanitizeParameters')
.forceAsyncReload(true);
}]);
// Service to dynamically construct translation ids for i18n.
oppia.factory('i18nIdService', function() {
return {
// Construct a translation id for library from name and a prefix.
// Ex: 'categories', 'art' -> 'I18N_LIBRARY_CATEGORIES_ART'
getLibraryId: function(prefix, name) {
return (
'I18N_LIBRARY_' + prefix.toUpperCase() + '_' +
name.toUpperCase().split(' ').join('_'));
}
};
});
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Controllers for side nav.
*/
oppia.controller('SideNav', [
'$scope', 'UrlInterpolationService',
function(
$scope, UrlInterpolationService) {
$scope.getStaticImageUrl = UrlInterpolationService.getStaticImageUrl;
}
]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directives for schema-based form builders.
*/
// NOTE TO DEVELOPERS: This forms framework accepts an external event
// named 'schemaBasedFormsShown'. This should be called by clients
// when these forms first come into view.
// The conditioning on window.GLOBALS.RTE_COMPONENT_SPECS is because, in the
// Karma tests, this value is undefined.
oppia.constant(
'RTE_COMPONENT_SPECS',
window.GLOBALS.RTE_COMPONENT_SPECS ? window.GLOBALS.RTE_COMPONENT_SPECS : {});
// Service for retrieving parameter specifications.
oppia.factory('parameterSpecsService', ['$log', function($log) {
var paramSpecs = {};
var ALLOWED_PARAM_TYPES = ['bool', 'unicode', 'float', 'int'];
return {
addParamSpec: function(paramName, paramType) {
if (ALLOWED_PARAM_TYPES.indexOf(paramType) === -1) {
$log.error('Invalid parameter type: ' + paramType);
return;
}
paramSpecs[paramName] = {
type: paramType
};
},
getParamType: function(paramName) {
if (!paramSpecs.hasOwnProperty(paramName)) {
$log.error('No parameter with name ' + paramName + ' found.');
return null;
}
return paramSpecs[paramName].type;
},
getAllParamsOfType: function(paramType) {
var names = [];
for (var paramName in paramSpecs) {
if (paramSpecs[paramName].type === paramType) {
names.push(paramName);
}
}
return names.sort();
},
getAllParams: function() {
var names = [];
for (var paramName in paramSpecs) {
names.push(paramName);
}
return names.sort();
}
};
}]);
oppia.filter('convertHtmlToUnicode', [function() {
return function(html) {
return angular.element('<div>' + html + '</div>').text();
};
}]);
// Escapes the {, } and \ characters, and then converts
// <oppia-parameter>name</oppia-parameter> tags to {{name}}.
oppia.filter('convertHtmlWithParamsToUnicode', ['$filter', function($filter) {
var escapeSpecialChars = function(str) {
// Note that order is important here! Backslashes must be replaced before
// the others, since doing either of the others first may give rise to
// extra backslashes.
return ($filter('convertHtmlToUnicode')(str))
.replace(/([\\\{\}])/g, '\\$1');
};
var PARAM_OPENING_TAG = '<oppia-parameter>';
var PARAM_CLOSING_TAG = '</oppia-parameter>';
return function(html) {
return html.split(PARAM_OPENING_TAG).map(function(value) {
return value.split(PARAM_CLOSING_TAG).map(function(value2) {
return escapeSpecialChars(value2);
}).join('}}');
}).join('{{');
};
}]);
oppia.filter('convertUnicodeToHtml', [
'$sanitize', 'oppiaHtmlEscaper', function($sanitize, oppiaHtmlEscaper) {
return function(text) {
return $sanitize(oppiaHtmlEscaper.unescapedStrToEscapedStr(text));
};
}
]);
// Converts {{name}} substrings to <oppia-parameter>name</oppia-parameter> tags
// and unescapes the {, } and \ characters. This is done by reading the given
// string from left to right: if we see a backslash, we use the following
// character; if we see a '{{', this is the start of a parameter; if
// we see a '}}'; this is the end of a parameter.
oppia.filter('convertUnicodeWithParamsToHtml', ['$filter', function($filter) {
var assert = function(b) {
if (!b) {
throw 'Invalid unicode-string-with-parameters: ' + text;
}
};
return function(text) {
// The parsing here needs to be done with more care because we are replacing
// two-character strings. We can't naively break by {{ because in strings
// like \{{{ the second and third characters will be taken as the opening
// brackets, which is wrong. We can't unescape characters because then the
// { characters that remain will be ambiguous (they may either be the
// openings of parameters or literal '{' characters entered by the user.
// So we build a standard left-to-right parser which examines each
// character of the string in turn, and processes it accordingly.
var textFragments = [];
var currentFragment = '';
var currentFragmentIsParam = false;
for (var i = 0; i < text.length; i++) {
if (text[i] === '\\') {
assert(
!currentFragmentIsParam && text.length > i + 1 &&
{
'{': true,
'}': true,
'\\': true
}[text[i + 1]]);
currentFragment += text[i + 1];
i++;
} else if (text[i] === '{') {
assert(
text.length > i + 1 && !currentFragmentIsParam &&
text[i + 1] === '{');
textFragments.push({
type: 'text',
data: currentFragment
});
currentFragment = '';
currentFragmentIsParam = true;
i++;
} else if (text[i] === '}') {
assert(
text.length > i + 1 && currentFragmentIsParam &&
text[i + 1] === '}');
textFragments.push({
type: 'parameter',
data: currentFragment
});
currentFragment = '';
currentFragmentIsParam = false;
i++;
} else {
currentFragment += text[i];
}
}
assert(!currentFragmentIsParam);
textFragments.push({
type: 'text',
data: currentFragment
});
var result = '';
textFragments.forEach(function(fragment) {
result += (
fragment.type === 'text' ?
$filter('convertUnicodeToHtml')(fragment.data) :
'<oppia-parameter>' + fragment.data + '</oppia-parameter>');
});
return result;
};
}]);
// TODO(sll): This whole directive needs to be rewritten to not rely on
// jWysiwyg.
oppia.directive('unicodeWithParametersEditor', ['$modal', function($modal) {
return {
restrict: 'E',
scope: {
allowedParameterNames: '&',
localValue: '='
},
template: (
'<div class="input-group">' +
' <textarea ng-disabled="!hasFullyLoaded"></textarea>' +
' <span class="input-group-btn">' +
' <button type="button" class="btn btn-default"' +
' ng-click="insertNewParameter()">+P</button>' +
' </span>' +
'</div>'),
controller: [
'$scope', '$element', '$filter', '$timeout',
function($scope, $element, $filter, $timeout) {
if (!$scope.allowedParameterNames().length) {
console.error(
'The unicode-with-parameters editor should not be used if there ' +
'are no unicode parameters available.');
return;
}
// This is a bit silly. It appears that in contenteditables (in Chrome,
// anyway) the cursor will stubbornly remain within the oppia-parameter
// element (even though it should be outside it). However the behavior is
// correct for images -- so we use images to delimit it. It's still hard
// to do selection before the element if it's the first thing in the doc,
// after the element if it's the last thing in the doc, or between two
// consecutive elements. See this bug for a demonstration:
//
// https://code.google.com/p/chromium/issues/detail?id=242110
var INVISIBLE_IMAGE_TAG = (
'<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAA' +
'BAAEAAAICTAEAOw=="></img>');
var PARAM_CONTAINER_CLASS = 'oppia-parameter-container';
$scope._createRteParameterTag = function(paramName) {
var el = $(
'<span class="' + PARAM_CONTAINER_CLASS + '" ' +
'contenteditable="false">' +
INVISIBLE_IMAGE_TAG +
'<oppia-parameter>' +
paramName +
'</oppia-parameter>' +
INVISIBLE_IMAGE_TAG +
'</span>');
var domNode = el.get(0);
domNode.ondblclick = function() {
$scope.openEditParameterModal(paramName, domNode);
};
return domNode;
};
// Convert a unicode string into its RTE representation.
$scope._convertUnicodeToRte = function(str) {
var html = $filter('convertUnicodeWithParamsToHtml')(str);
var elt = $('<div>' + html + '</div>');
elt.find('oppia-parameter').replaceWith(function() {
return $scope._createRteParameterTag(this.textContent);
});
return elt.html();
};
// Convert an RTE representation into a unicode string by removing all
// insertion points and replacing <oppia-parameter> tags with {{...}}.
$scope._convertRteToUnicode = function(rte) {
var elt = $('<div>' + rte + '</div>');
// Strip out all additional attributes and class names from the
// <oppia-parameter> tag before conversion to a unicode string.
elt.find('.' + PARAM_CONTAINER_CLASS).replaceWith(function() {
return $('<oppia-parameter/>').text(this.textContent).get(0);
});
return $filter('convertHtmlWithParamsToUnicode')(elt.html());
};
var rteNode = $element[0].querySelector('textarea');
// A pointer to the editorDoc in the RTE iframe. Populated when the RTE
// is initialized.
$scope.editorDoc = null;
$scope.hasFullyLoaded = false;
// If eltToReplace is null, a new element should be inserted at the
// current caret.
$scope.openEditParameterModal = function(currentParamName, eltToReplace) {
return $modal.open({
templateUrl: 'modals/editParamName',
backdrop: true,
resolve: {
allowedParameterNames: function() {
return $scope.allowedParameterNames();
}
},
controller: [
'$scope', '$modalInstance', 'allowedParameterNames',
function($scope, $modalInstance, allowedParameterNames) {
$scope.currentParamName = currentParamName;
$scope.paramOptions = allowedParameterNames.map(
function(paramName) {
return {
name: paramName,
value: paramName
};
}
);
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
$scope.save = function(paramName) {
$modalInstance.close(paramName);
};
}
]
}).result.then(function(paramName) {
var el = $scope._createRteParameterTag(paramName);
if (eltToReplace === null) {
var doc = $(rteNode).wysiwyg('document').get(0);
$(rteNode).wysiwyg(
'insertHtml', '<span class="insertionPoint"></span>');
eltToReplace = $scope.editorDoc.querySelector('.insertionPoint');
}
// Note that this removes the contenteditable="false" and ondblclick
// attributes of el (but they are eventually replaced during the
// normalization of the RTE content step). Also, we need to save the
// change explicitly because the wysiwyg editor does not auto-detect
// replaceWith() events.
$(eltToReplace).replaceWith(el);
$(rteNode).wysiwyg('save');
});
};
$scope.insertNewParameter = function() {
$scope.openEditParameterModal($scope.allowedParameterNames()[0], null);
};
var rteContentMemento = $scope._convertUnicodeToRte($scope.localValue);
$scope.currentlyEditing = false;
$scope.$watch('localValue', function() {
if (!$scope.currentlyEditing) {
// This is an external change.
rteContentMemento = $scope._convertUnicodeToRte($scope.localValue);
$(rteNode).wysiwyg('setContent', rteContentMemento);
}
}, true);
$scope._normalizeRteContent = function(content) {
// TODO(sll): Write this method to validate rather than just normalize.
// The only top-level tags should be oppia-parameter tags. Each of these
// tags should have a contenteditable=false attribute, a dblclick
// handler that opens the parameter modal, and content consisting of a
// valid parameter name of type unicode surrounded by two invisible
// image tags.
var elt = $('<div>' + content + '</div>');
elt.find('.' + PARAM_CONTAINER_CLASS).replaceWith(function() {
return $scope._createRteParameterTag(this.textContent.trim());
});
return elt.html();
};
$scope.init = function() {
$(rteNode).wysiwyg({
autoGrow: true,
autoSave: true,
controls: {},
css: '/css/rte_single_line.css',
debug: true,
events: {
// Prevent dragging, since this causes weird things to happen when
// a user selects text containing all or part of parameter tags and
// then drags that text elsewhere.
dragstart: function(e) {
e.preventDefault();
},
// Prevent use of keyboard shortcuts for bold, italics, etc. Also
// prevent pasting, newlines and tabbing.
keydown: function(e) {
var aKey = 65;
var cKey = 67;
var xKey = 88;
var zKey = 90;
var vKey = 86;
if (e.ctrlKey) {
if (e.keyCode === 86) {
e.preventDefault();
alert(
'Pasting in string input fields is currently not ' +
'supported. Sorry about that!');
} else if (
e.keyCode !== aKey && e.keyCode !== cKey &&
e.keyCode !== xKey && e.keyCode !== zKey) {
e.preventDefault();
}
}
// Disable the enter key. Contenteditable does not seem to support
// deletion of newlines. Also disable the tab key.
if (e.keyCode === 13 || e.keyCode === 9) {
e.preventDefault();
}
},
paste: function(e) {
e.preventDefault();
},
save: function() {
var currentContent = $(rteNode).wysiwyg('getContent');
if (currentContent === null || currentContent === undefined) {
return;
}
// Normalize the new content. If a validation error occurs,
// revert to the memento, and update the external and internal
// values. Otherwise, update the external and internal values
// with the normalized content, and update the memento as well.
var normalizedContent = '';
try {
normalizedContent = $scope._normalizeRteContent(currentContent);
} catch (unusedException) {
console.error('Error parsing RTE content: ' + currentContent);
normalizedContent = rteContentMemento;
}
if (normalizedContent !== currentContent) {
$(rteNode).wysiwyg('setContent', normalizedContent);
}
// Update the external value. The $timeout removes the '$apply in
// progress' errors which get triggered if a parameter was edited.
$timeout(function() {
$scope.$apply(function() {
$scope.currentlyEditing = true;
$scope.localValue = $scope._convertRteToUnicode(
normalizedContent);
// TODO(sll): This is a somewhat hacky solution. Can it be
// cleaned up?
$timeout(function() {
$scope.currentlyEditing = false;
}, 50);
});
});
// Update the memento.
rteContentMemento = normalizedContent;
}
},
iFrameClass: 'wysiwyg-content',
initialContent: rteContentMemento,
maxHeight: 30,
rmUnusedControls: true
});
$scope.editorDoc = $(rteNode).wysiwyg('document')[0].body;
// Add dblclick handlers to the various nodes, since they get stripped
// in the initialization.
var elts = Array.prototype.slice.call(
$scope.editorDoc.querySelectorAll('.' + PARAM_CONTAINER_CLASS));
elts.forEach(function(elt) {
elt.ondblclick = function() {
$scope.openEditParameterModal($(elt).text(), elt);
};
});
$scope.hasFullyLoaded = true;
};
$scope.init();
// TODO(sll): If two RTEs share the same data source, and one RTE saves
// a change to the data, the other RTE should be updated. However, if we
// just place a $scope.$watch on the data source, then typing in a single
// RTE is going to call that method, and this will replace the content of
// the RTE -- which is normally not an issue, but in this case it
// moves the cursor back to the beginning of the doc and frustrates the
// user. We should find a solution for this -- although it probably is
// not a common use case to have multiple unicode RTEs referencing the
// same data source, there is a problem in that although the Cancel
// button does update the data model, it does not update the appearance
// of the RTE.
}]
};
}]);
oppia.factory('schemaDefaultValueService', [function() {
return {
// TODO(sll): Rewrite this to take validators into account, so that
// we always start with a valid value.
getDefaultValue: function(schema) {
if (schema.choices) {
return schema.choices[0];
} else if (schema.type === 'bool') {
return false;
} else if (schema.type === 'unicode' || schema.type === 'html') {
return '';
} else if (schema.type === 'list') {
return [this.getDefaultValue(schema.items)];
} else if (schema.type === 'dict') {
var result = {};
for (var i = 0; i < schema.properties.length; i++) {
result[schema.properties[i].name] = this.getDefaultValue(
schema.properties[i].schema);
}
return result;
} else if (schema.type === 'int' || schema.type === 'float') {
return 0;
} else {
console.error('Invalid schema type: ' + schema.type);
}
}
};
}]);
oppia.factory('schemaUndefinedLastElementService', [function() {
return {
// Returns true if the input value, taken as the last element in a list,
// should be considered as 'undefined' and therefore deleted.
getUndefinedValue: function(schema) {
if (schema.type === 'unicode' || schema.type === 'html') {
return '';
} else {
return undefined;
}
}
};
}]);
oppia.filter('sanitizeHtmlForRte', ['$sanitize', function($sanitize) {
var _EXTENSION_SELECTOR = '[class^=oppia-noninteractive-]';
return function(html) {
var wrapper = document.createElement('div');
wrapper.innerHTML = html;
// Save the unsanitized extensions.
var unsanitizedExtensions = $(wrapper).find(_EXTENSION_SELECTOR);
wrapper.innerHTML = $sanitize(wrapper.innerHTML);
var sanitizedExtensions = $(wrapper).find(_EXTENSION_SELECTOR);
for (var i = 0; i < sanitizedExtensions.length; i++) {
var el = sanitizedExtensions[i];
var attrs = unsanitizedExtensions[i].attributes;
for (var j = 0; j < attrs.length; j++) {
var attr = attrs[j];
// Reinstate the sanitized widget attributes.
if (attr.name.indexOf('-with-value') !== -1 &&
!el.hasAttribute(attr.name)) {
el.setAttribute(attr.name, attr.value);
}
}
}
return wrapper.innerHTML;
};
}]);
oppia.factory('rteHelperService', [
'$filter', '$log', '$interpolate', 'explorationContextService',
'RTE_COMPONENT_SPECS', 'oppiaHtmlEscaper',
function($filter, $log, $interpolate, explorationContextService,
RTE_COMPONENT_SPECS, oppiaHtmlEscaper) {
var _RICH_TEXT_COMPONENTS = [];
Object.keys(RTE_COMPONENT_SPECS).sort().forEach(function(componentId) {
_RICH_TEXT_COMPONENTS.push({
backendName: RTE_COMPONENT_SPECS[componentId].backend_name,
customizationArgSpecs: angular.copy(
RTE_COMPONENT_SPECS[componentId].customization_arg_specs),
name: RTE_COMPONENT_SPECS[componentId].frontend_name,
iconDataUrl: RTE_COMPONENT_SPECS[componentId].icon_data_url,
previewUrlTemplate:
RTE_COMPONENT_SPECS[componentId].preview_url_template,
isComplex: RTE_COMPONENT_SPECS[componentId].is_complex,
isBlockElement: RTE_COMPONENT_SPECS[componentId].is_block_element,
requiresFs: RTE_COMPONENT_SPECS[componentId].requires_fs,
tooltip: RTE_COMPONENT_SPECS[componentId].tooltip
});
});
var _createCustomizationArgDictFromAttrs = function(attrs) {
var customizationArgsDict = {};
for (var i = 0; i < attrs.length; i++) {
var attr = attrs[i];
if (attr.name === 'class' || attr.name === 'src' ||
attr.name === '_moz_resizing') {
continue;
}
var separatorLocation = attr.name.indexOf('-with-value');
if (separatorLocation === -1) {
$log.error('RTE Error: invalid customization attribute ' + attr.name);
continue;
}
var argName = attr.name.substring(0, separatorLocation);
customizationArgsDict[argName] = oppiaHtmlEscaper.escapedJsonToObj(
attr.value);
}
return customizationArgsDict;
};
return {
createCustomizationArgDictFromAttrs: function(attrs) {
return _createCustomizationArgDictFromAttrs(attrs);
},
createToolbarIcon: function(componentDefn) {
var el = $('<img/>');
el.attr('src', componentDefn.iconDataUrl);
el.addClass('oppia-rte-toolbar-image');
return el.get(0);
},
// Returns a DOM node.
createRteElement: function(componentDefn, customizationArgsDict) {
var el = $('<img/>');
if (explorationContextService.isInExplorationContext()) {
customizationArgsDict = angular.extend(customizationArgsDict,
{
explorationId: explorationContextService.getExplorationId()
}
);
}
var interpolatedUrl = $interpolate(
componentDefn.previewUrlTemplate, false, null, true)(
customizationArgsDict);
if (!interpolatedUrl) {
$log.error(
'Error interpolating url : ' + componentDefn.previewUrlTemplate);
} else {
el.attr('src', interpolatedUrl);
}
el.addClass('oppia-noninteractive-' + componentDefn.name);
if (componentDefn.isBlockElement) {
el.addClass('block-element');
}
for (var attrName in customizationArgsDict) {
el.attr(
$filter('camelCaseToHyphens')(attrName) + '-with-value',
oppiaHtmlEscaper.objToEscapedJson(customizationArgsDict[attrName]));
}
return el.get(0);
},
// Replace <oppia-noninteractive> tags with <img> tags.
convertHtmlToRte: function(html) {
// If an undefined or empty html value is passed in, then the same type
// of value should be returned. Without this check,
// convertHtmlToRte(undefined) would return 'undefined', which is not
// ideal.
if (!html) {
return html;
}
var elt = $('<div>' + html + '</div>');
var that = this;
_RICH_TEXT_COMPONENTS.forEach(function(componentDefn) {
elt.find('oppia-noninteractive-' + componentDefn.name).replaceWith(
function() {
return that.createRteElement(
componentDefn,
_createCustomizationArgDictFromAttrs(this.attributes));
}
);
});
return elt.html();
},
// Replace <img> tags with <oppia-noninteractive> tags.
convertRteToHtml: function(rte) {
// If an undefined or empty rte value is passed in, then the same type
// of value should be returned. Without this check,
// convertRteToHtml(undefined) would return 'undefined', which is not
// ideal.
if (!rte) {
return rte;
}
var elt = $('<div>' + rte + '</div>');
_RICH_TEXT_COMPONENTS.forEach(function(componentDefn) {
elt.find(
'img.oppia-noninteractive-' + componentDefn.name
).replaceWith(function() {
// Look for a class name starting with oppia-noninteractive-*.
var tagNameMatch = /(^|\s)(oppia-noninteractive-[a-z0-9\-]+)/.exec(
this.className);
if (!tagNameMatch) {
$log.error('RTE Error: invalid class name ' + this.className);
}
var jQueryElt = $('<' + tagNameMatch[2] + '/>');
for (var i = 0; i < this.attributes.length; i++) {
var attr = this.attributes[i];
if (attr.name !== 'class' && attr.name !== 'src') {
jQueryElt.attr(attr.name, attr.value);
}
}
return jQueryElt.get(0);
});
});
return elt.html();
},
getRichTextComponents: function() {
return angular.copy(_RICH_TEXT_COMPONENTS);
}
};
}
]);
// Add RTE extensions to textAngular toolbar options.
oppia.config(['$provide', function($provide) {
$provide.decorator('taOptions', [
'$delegate', '$document', '$modal', '$timeout', 'focusService',
'taRegisterTool', 'rteHelperService', 'alertsService',
'explorationContextService', 'PAGE_CONTEXT',
function(
taOptions, $document, $modal, $timeout, focusService,
taRegisterTool, rteHelperService, alertsService,
explorationContextService, PAGE_CONTEXT) {
taOptions.disableSanitizer = true;
taOptions.forceTextAngularSanitize = false;
taOptions.classes.textEditor = 'form-control oppia-rte-content';
taOptions.setup.textEditorSetup = function($element) {
$timeout(function() {
$element.trigger('focus');
});
};
// The refocusFn arg is a function that restores focus to the text editor
// after exiting the modal, and moves the cursor back to where it was
// before the modal was opened.
var _openCustomizationModal = function(
customizationArgSpecs, attrsCustomizationArgsDict, onSubmitCallback,
onDismissCallback, refocusFn) {
$document[0].execCommand('enableObjectResizing', false, false);
var modalDialog = $modal.open({
templateUrl: 'modals/customizeRteComponent',
backdrop: 'static',
resolve: {},
controller: [
'$scope', '$modalInstance', '$timeout',
function($scope, $modalInstance, $timeout) {
$scope.customizationArgSpecs = customizationArgSpecs;
// Without this code, the focus will remain in the background RTE
// even after the modal loads. This switches the focus to a
// temporary field in the modal which is then removed from the DOM.
// TODO(sll): Make this switch to the first input field in the modal
// instead.
$scope.modalIsLoading = true;
focusService.setFocus('tmpFocusPoint');
$timeout(function() {
$scope.modalIsLoading = false;
});
$scope.tmpCustomizationArgs = [];
for (var i = 0; i < customizationArgSpecs.length; i++) {
var caName = customizationArgSpecs[i].name;
$scope.tmpCustomizationArgs.push({
name: caName,
value: (
attrsCustomizationArgsDict.hasOwnProperty(caName) ?
attrsCustomizationArgsDict[caName] :
customizationArgSpecs[i].default_value)
});
}
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
$scope.save = function() {
$scope.$broadcast('externalSave');
var customizationArgsDict = {};
for (var i = 0; i < $scope.tmpCustomizationArgs.length; i++) {
var caName = $scope.tmpCustomizationArgs[i].name;
customizationArgsDict[caName] = (
$scope.tmpCustomizationArgs[i].value);
}
$modalInstance.close(customizationArgsDict);
};
}]
});
modalDialog.result.then(onSubmitCallback, onDismissCallback);
// 'finally' is a JS keyword. If it is just used in its ".finally" form,
// the minification process throws an error.
modalDialog.result['finally'](refocusFn);
};
rteHelperService.getRichTextComponents().forEach(function(componentDefn) {
var buttonDisplay = rteHelperService.createToolbarIcon(componentDefn);
var canUseFs = explorationContextService.getPageContext() ===
PAGE_CONTEXT.EDITOR;
taRegisterTool(componentDefn.name, {
display: buttonDisplay.outerHTML,
tooltiptext: componentDefn.tooltip,
disabled: function() {
// Disable components that affect fs for non-editors.
return !canUseFs && componentDefn.requiresFs;
},
onElementSelect: {
element: 'img',
filter: function(elt) {
return elt.hasClass('oppia-noninteractive-' + componentDefn.name);
},
action: function(event, $element) {
event.preventDefault();
var textAngular = this;
if (!canUseFs && componentDefn.requiresFs) {
var FS_UNAUTHORIZED_WARNING = 'Unfortunately, only ' +
'exploration authors can make changes involving files.';
alertsService.addWarning(FS_UNAUTHORIZED_WARNING);
// Without this, the view will not update to show the warning.
textAngular.$editor().$parent.$apply();
return;
}
// Move the cursor to be immediately after the clicked widget.
// This prevents users from overwriting the widget.
var elRange = rangy.createRange();
elRange.setStartAfter($element.get(0));
elRange.setEndAfter($element.get(0));
var elSelection = rangy.getSelection();
elSelection.removeAllRanges();
elSelection.addRange(elRange);
var savedSelection = rangy.saveSelection();
// Temporarily pauses sanitizer so rangy markers save position
textAngular.$editor().$parent.isCustomizationModalOpen = true;
_openCustomizationModal(
componentDefn.customizationArgSpecs,
rteHelperService.createCustomizationArgDictFromAttrs(
$element[0].attributes),
function(customizationArgsDict) {
var el = rteHelperService.createRteElement(
componentDefn, customizationArgsDict);
$element[0].parentNode.replaceChild(el, $element[0]);
textAngular.$editor().updateTaBindtaTextElement();
},
function() {},
function() {
// Re-enables the sanitizer now that the modal is closed.
textAngular.$editor(
).$parent.isCustomizationModalOpen = false;
textAngular.$editor().displayElements.text[0].focus();
rangy.restoreSelection(savedSelection);
});
return false;
}
},
action: function() {
var textAngular = this;
var savedSelection = rangy.saveSelection();
textAngular.$editor().wrapSelection(
'insertHtml', '<span class="insertionPoint"></span>');
// Temporarily pauses sanitizer so rangy markers save position.
textAngular.$editor().$parent.isCustomizationModalOpen = true;
_openCustomizationModal(
componentDefn.customizationArgSpecs,
{},
function(customizationArgsDict) {
var el = rteHelperService.createRteElement(
componentDefn, customizationArgsDict);
var insertionPoint = (
textAngular.$editor().displayElements.text[0].querySelector(
'.insertionPoint'));
var parent = insertionPoint.parentNode;
parent.replaceChild(el, insertionPoint);
textAngular.$editor().updateTaBindtaTextElement();
},
function() {
// Clean up the insertion point if no widget was inserted.
var insertionPoint = (
textAngular.$editor().displayElements.text[0].querySelector(
'.insertionPoint'));
if (insertionPoint !== null) {
insertionPoint.remove();
}
},
function() {
// Re-enables the sanitizer now that the modal is closed.
textAngular.$editor().$parent.isCustomizationModalOpen = false;
textAngular.$editor().displayElements.text[0].focus();
rangy.restoreSelection(savedSelection);
}
);
}
});
});
return taOptions;
}
]);
}]);
oppia.directive('textAngularRte', [
'$filter', 'oppiaHtmlEscaper', 'rteHelperService', '$timeout',
function(
$filter, oppiaHtmlEscaper, rteHelperService, $timeout) {
return {
restrict: 'E',
scope: {
htmlContent: '=',
uiConfig: '&'
},
template: (
'<div text-angular="" ta-toolbar="<[toolbarOptionsJson]>" ' +
' ta-paste="stripFormatting($html)" ng-model="tempContent"' +
' placeholder="<[placeholderText]>">' +
'</div>'),
controller: ['$scope', function($scope) {
// Currently, operations affecting the filesystem are allowed only in
// the editor context.
$scope.isCustomizationModalOpen = false;
var toolbarOptions = [
['bold', 'italics'],
['ol', 'ul', 'pre', 'indent', 'outdent'],
[]
];
if ($scope.uiConfig() && $scope.uiConfig().placeholder) {
$scope.placeholderText = $scope.uiConfig().placeholder;
}
rteHelperService.getRichTextComponents().forEach(
function(componentDefn) {
if (!($scope.uiConfig() &&
$scope.uiConfig().hide_complex_extensions &&
componentDefn.isComplex)) {
toolbarOptions[2].push(componentDefn.name);
}
}
);
$scope.toolbarOptionsJson = JSON.stringify(toolbarOptions);
var _convertHtmlToRte = function(html) {
return rteHelperService.convertHtmlToRte(html);
};
$scope.stripFormatting = function(html) {
return $filter('sanitizeHtmlForRte')(html);
};
$scope.init = function() {
$scope.tempContent = _convertHtmlToRte($scope.htmlContent);
};
$scope.init();
$scope.$watch('tempContent', function(newVal) {
// Sanitizing while a modal is open would delete the markers that
// save and restore the cursor's position in the RTE.
var displayedContent = $scope.isCustomizationModalOpen ? newVal :
$filter('sanitizeHtmlForRte')(newVal);
$scope.htmlContent = rteHelperService.convertRteToHtml(
displayedContent);
});
// It is possible for the content of the RTE to be changed externally,
// e.g. if there are several RTEs in a list, and one is deleted.
$scope.$on('externalHtmlContentChange', function() {
$timeout(function() {
$scope.tempContent = _convertHtmlToRte($scope.htmlContent);
});
});
}]
};
}
]);
// The names of these filters must correspond to the names of the backend
// validators (with underscores converted to camelcase).
// WARNING: These filters do not validate the arguments supplied with the
// validator definitions in the schema; these are assumed to be correct.
oppia.filter('isAtLeast', [function() {
return function(input, args) {
return (input >= args.minValue);
};
}]);
oppia.filter('isAtMost', [function() {
return function(input, args) {
return (input <= args.maxValue);
};
}]);
oppia.filter('isNonempty', [function() {
return function(input) {
return Boolean(input);
};
}]);
oppia.filter('isFloat', [function() {
return function(input) {
var FLOAT_REGEXP = /(?=.*\d)^\-?\d*(\.|\,)?\d*\%?$/;
// This regex accepts floats in the following formats:
// 0.
// 0.55..
// -0.55..
// .555..
// -.555..
// All examples above with '.' replaced with ',' are also valid.
// Expressions containing % are also valid (5.1% etc).
var viewValue = '';
try {
var viewValue = input.toString().trim();
} catch (e) {
return undefined;
}
if (viewValue !== '' && FLOAT_REGEXP.test(viewValue)) {
if (viewValue.slice(-1) === '%') {
// This is a percentage, so the input needs to be divided by 100.
return parseFloat(
viewValue.substring(0, viewValue.length - 1).replace(',', '.')
) / 100.0;
} else {
return parseFloat(viewValue.replace(',', '.'));
}
} else {
return undefined;
}
};
}]);
oppia.directive('applyValidation', ['$filter', function($filter) {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attrs, ctrl) {
// Add validators in reverse order.
if (scope.validators()) {
scope.validators().forEach(function(validatorSpec) {
var frontendName = $filter('underscoresToCamelCase')(
validatorSpec.id);
// Note that there may not be a corresponding frontend filter for
// each backend validator.
try {
$filter(frontendName);
} catch (err) {
return;
}
var filterArgs = {};
for (key in validatorSpec) {
if (key !== 'id') {
filterArgs[$filter('underscoresToCamelCase')(key)] = angular.copy(
validatorSpec[key]);
}
}
var customValidator = function(viewValue) {
ctrl.$setValidity(
frontendName, $filter(frontendName)(viewValue, filterArgs));
return viewValue;
};
ctrl.$parsers.unshift(customValidator);
ctrl.$formatters.unshift(customValidator);
});
}
}
};
}]);
// This should come before 'apply-validation', if that is defined as
// an attribute on the HTML tag.
oppia.directive('requireIsFloat', ['$filter', function($filter) {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attrs, ctrl) {
var floatValidator = function(viewValue) {
var filteredValue = $filter('isFloat')(viewValue);
ctrl.$setValidity('isFloat', filteredValue !== undefined);
return filteredValue;
};
ctrl.$parsers.unshift(floatValidator);
ctrl.$formatters.unshift(floatValidator);
}
};
}]);
oppia.directive('requireIsValidExpression',
['parameterSpecsService', 'expressionEvaluatorService',
function(parameterSpecsService, expressionEvaluatorService) {
// Create a namescope environment from the parameter names. The values of the
// parameters do not matter.
var params = {};
parameterSpecsService.getAllParams().forEach(function(name) {
params[name] = true;
});
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attrs, ctrl) {
var validator = function(value) {
ctrl.$setValidity('isValidExpression',
expressionEvaluatorService.validateExpression(value, [params]));
return value;
};
ctrl.$parsers.unshift(validator);
ctrl.$formatters.unshift(validator);
}
};
}]);
// Prevents timeouts due to recursion in nested directives. See:
//
// http://stackoverflow.com/q/14430655
oppia.factory('recursionHelper', ['$compile', function($compile) {
return {
/**
* Manually compiles the element, fixing the recursion loop.
* @param {DOM element} element
* @param {function|object} link - A post-link function, or an object with
* function(s) registered via pre and post properties.
* @return {object} An object containing the linking functions.
*/
compile: function(element, link) {
// Normalize the link parameter
if (angular.isFunction(link)) {
link = {
post: link
};
}
// Break the recursion loop by removing the contents,
var contents = element.contents().remove();
var compiledContents;
return {
pre: (link && link.pre) ? link.pre : null,
post: function(scope, element) {
// Compile the contents.
if (!compiledContents) {
compiledContents = $compile(contents);
}
// Re-add the compiled contents to the element.
compiledContents(scope, function(clone) {
element.append(clone);
});
// Call the post-linking function, if any.
if (link && link.post) {
link.post.apply(null, arguments);
}
}
};
}
};
}]);
/*********************************************************************
*
* DIRECTIVES FOR SCHEMA-BASED EDITORS
*
*********************************************************************/
oppia.directive('schemaBasedEditor', [function() {
return {
scope: {
schema: '&',
isDisabled: '&',
localValue: '=',
allowExpressions: '&',
labelForFocusTarget: '&',
onInputBlur: '=',
onInputFocus: '='
},
templateUrl: 'schemaBasedEditor/master',
restrict: 'E'
};
}]);
oppia.directive('schemaBasedChoicesEditor', [
'recursionHelper', function(recursionHelper) {
return {
scope: {
localValue: '=',
// The choices for the object's value.
choices: '&',
// The schema for this object.
// TODO(sll): Validate each choice against the schema.
schema: '&',
isDisabled: '&'
},
templateUrl: 'schemaBasedEditor/choices',
restrict: 'E',
compile: recursionHelper.compile,
controller: ['$scope', function($scope) {
$scope.getReadonlySchema = function() {
var readonlySchema = angular.copy($scope.schema());
delete readonlySchema.choices;
return readonlySchema;
};
}]
};
}
]);
oppia.directive('schemaBasedExpressionEditor', [function() {
return {
scope: {
localValue: '=',
isDisabled: '&',
// TODO(sll): Currently only takes a string which is either 'bool', 'int'
// or 'float'. May need to generalize.
outputType: '&',
labelForFocusTarget: '&'
},
templateUrl: 'schemaBasedEditor/expression',
restrict: 'E'
};
}]);
oppia.directive('schemaBasedBoolEditor', [function() {
return {
scope: {
localValue: '=',
isDisabled: '&',
allowExpressions: '&',
labelForFocusTarget: '&'
},
templateUrl: 'schemaBasedEditor/bool',
restrict: 'E',
controller: [
'$scope', 'parameterSpecsService',
function($scope, parameterSpecsService) {
if ($scope.allowExpressions()) {
$scope.paramNames = parameterSpecsService.getAllParamsOfType('bool');
$scope.expressionMode = angular.isString($scope.localValue);
$scope.$watch('localValue', function(newValue) {
$scope.expressionMode = angular.isString(newValue);
});
$scope.toggleExpressionMode = function() {
$scope.expressionMode = !$scope.expressionMode;
$scope.localValue = (
$scope.expressionMode ? $scope.paramNames[0] : false);
};
}
}
]
};
}]);
oppia.directive('schemaBasedIntEditor', [function() {
return {
scope: {
localValue: '=',
isDisabled: '&',
allowExpressions: '&',
validators: '&',
labelForFocusTarget: '&',
onInputBlur: '=',
onInputFocus: '='
},
templateUrl: 'schemaBasedEditor/int',
restrict: 'E',
controller: [
'$scope', 'parameterSpecsService',
function($scope, parameterSpecsService) {
if ($scope.localValue === undefined) {
$scope.localValue = 0;
}
$scope.onKeypress = function(evt) {
if (evt.keyCode === 13) {
$scope.$emit('submittedSchemaBasedIntForm');
}
};
if ($scope.allowExpressions()) {
$scope.paramNames = parameterSpecsService.getAllParamsOfType('int');
$scope.expressionMode = angular.isString($scope.localValue);
$scope.$watch('localValue', function(newValue) {
$scope.expressionMode = angular.isString(newValue);
});
$scope.toggleExpressionMode = function() {
$scope.expressionMode = !$scope.expressionMode;
$scope.localValue = (
$scope.expressionMode ? $scope.paramNames[0] : 0);
};
}
}
]
};
}]);
oppia.directive('schemaBasedFloatEditor', [function() {
return {
scope: {
localValue: '=',
isDisabled: '&',
allowExpressions: '&',
validators: '&',
labelForFocusTarget: '&',
onInputBlur: '=',
onInputFocus: '='
},
templateUrl: 'schemaBasedEditor/float',
restrict: 'E',
controller: [
'$scope', '$filter', '$timeout', 'parameterSpecsService',
'focusService',
function(
$scope, $filter, $timeout, parameterSpecsService, focusService) {
$scope.hasLoaded = false;
$scope.isUserCurrentlyTyping = false;
$scope.hasFocusedAtLeastOnce = false;
$scope.labelForErrorFocusTarget = focusService.generateFocusLabel();
$scope.validate = function(localValue) {
return $filter('isFloat')(localValue) !== undefined;
};
$scope.onFocus = function() {
$scope.hasFocusedAtLeastOnce = true;
if ($scope.onInputFocus) {
$scope.onInputFocus();
}
};
$scope.onBlur = function() {
$scope.isUserCurrentlyTyping = false;
if ($scope.onInputBlur) {
$scope.onInputBlur();
}
};
// TODO(sll): Move these to ng-messages when we move to Angular 1.3.
$scope.getMinValue = function() {
for (var i = 0; i < $scope.validators().length; i++) {
if ($scope.validators()[i].id === 'is_at_least') {
return $scope.validators()[i].min_value;
}
}
};
$scope.getMaxValue = function() {
for (var i = 0; i < $scope.validators().length; i++) {
if ($scope.validators()[i].id === 'is_at_most') {
return $scope.validators()[i].max_value;
}
}
};
$scope.onKeypress = function(evt) {
if (evt.keyCode === 13) {
if (Object.keys($scope.floatForm.floatValue.$error).length !== 0) {
$scope.isUserCurrentlyTyping = false;
focusService.setFocus($scope.labelForErrorFocusTarget);
} else {
$scope.$emit('submittedSchemaBasedFloatForm');
}
} else {
$scope.isUserCurrentlyTyping = true;
}
};
if ($scope.localValue === undefined) {
$scope.localValue = 0.0;
}
if ($scope.allowExpressions()) {
$scope.paramNames = parameterSpecsService.getAllParamsOfType('float');
$scope.expressionMode = angular.isString($scope.localValue);
$scope.$watch('localValue', function(newValue) {
$scope.expressionMode = angular.isString(newValue);
});
$scope.toggleExpressionMode = function() {
$scope.expressionMode = !$scope.expressionMode;
$scope.localValue = (
$scope.expressionMode ? $scope.paramNames[0] : 0.0);
};
}
// This prevents the red 'invalid input' warning message from flashing
// at the outset.
$timeout(function() {
$scope.hasLoaded = true;
});
}
]
};
}]);
oppia.directive('schemaBasedUnicodeEditor', [function() {
return {
scope: {
localValue: '=',
isDisabled: '&',
validators: '&',
uiConfig: '&',
allowExpressions: '&',
labelForFocusTarget: '&',
onInputBlur: '=',
onInputFocus: '='
},
templateUrl: 'schemaBasedEditor/unicode',
restrict: 'E',
controller: ['$scope', '$filter', '$sce', 'parameterSpecsService',
function($scope, $filter, $sce, parameterSpecsService) {
$scope.allowedParameterNames = parameterSpecsService.getAllParamsOfType(
'unicode');
$scope.doUnicodeParamsExist = ($scope.allowedParameterNames.length > 0);
if ($scope.uiConfig() && $scope.uiConfig().rows &&
$scope.doUnicodeParamsExist) {
$scope.doUnicodeParamsExist = false;
console.log(
'Multi-row unicode fields with parameters are not currently ' +
'supported.');
}
if ($scope.uiConfig() && $scope.uiConfig().coding_mode) {
// Flag that is flipped each time the codemirror view is
// shown. (The codemirror instance needs to be refreshed
// every time it is unhidden.)
$scope.codemirrorStatus = false;
var CODING_MODE_NONE = 'none';
$scope.codemirrorOptions = {
// Convert tabs to spaces.
extraKeys: {
Tab: function(cm) {
var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');
cm.replaceSelection(spaces);
// Move the cursor to the end of the selection.
var endSelectionPos = cm.getDoc().getCursor('head');
cm.getDoc().setCursor(endSelectionPos);
}
},
indentWithTabs: false,
lineNumbers: true
};
if ($scope.isDisabled()) {
$scope.codemirrorOptions.readOnly = 'nocursor';
}
// Note that only 'coffeescript', 'javascript', 'lua', 'python', 'ruby'
// and 'scheme' have CodeMirror-supported syntax highlighting. For other
// languages, syntax highlighting will not happen.
if ($scope.uiConfig().coding_mode !== CODING_MODE_NONE) {
$scope.codemirrorOptions.mode = $scope.uiConfig().coding_mode;
}
setTimeout(function() {
$scope.codemirrorStatus = !$scope.codemirrorStatus;
}, 200);
// When the form view is opened, flip the status flag. The
// timeout seems to be needed for the line numbers etc. to display
// properly.
$scope.$on('schemaBasedFormsShown', function() {
setTimeout(function() {
$scope.codemirrorStatus = !$scope.codemirrorStatus;
}, 200);
});
}
$scope.onKeypress = function(evt) {
if (evt.keyCode === 13) {
$scope.$emit('submittedSchemaBasedUnicodeForm');
}
};
$scope.getPlaceholder = function() {
if (!$scope.uiConfig()) {
return '';
} else {
return $scope.uiConfig().placeholder;
}
};
$scope.getRows = function() {
if (!$scope.uiConfig()) {
return null;
} else {
return $scope.uiConfig().rows;
}
};
$scope.getCodingMode = function() {
if (!$scope.uiConfig()) {
return null;
} else {
return $scope.uiConfig().coding_mode;
}
};
$scope.getDisplayedValue = function() {
return $sce.trustAsHtml(
$filter('convertUnicodeWithParamsToHtml')($scope.localValue));
};
}]
};
}]);
oppia.directive('schemaBasedHtmlEditor', [function() {
return {
scope: {
localValue: '=',
isDisabled: '&',
allowExpressions: '&',
labelForFocusTarget: '&',
uiConfig: '&'
},
templateUrl: 'schemaBasedEditor/html',
restrict: 'E'
};
}]);
oppia.directive('schemaBasedListEditor', [
'schemaDefaultValueService', 'recursionHelper', 'focusService',
'schemaUndefinedLastElementService',
function(
schemaDefaultValueService, recursionHelper, focusService,
schemaUndefinedLastElementService) {
return {
scope: {
localValue: '=',
isDisabled: '&',
// Read-only property. The schema definition for each item in the list.
itemSchema: '&',
// The length of the list. If not specified, the list is of arbitrary
// length.
len: '=',
// UI configuration. May be undefined.
uiConfig: '&',
allowExpressions: '&',
validators: '&',
labelForFocusTarget: '&'
},
templateUrl: 'schemaBasedEditor/list',
restrict: 'E',
compile: recursionHelper.compile,
controller: ['$scope', function($scope) {
var baseFocusLabel = (
$scope.labelForFocusTarget() ||
Math.random().toString(36).slice(2) + '-');
$scope.getFocusLabel = function(index) {
// Treat the first item in the list as a special case -- if this list
// is contained in another list, and the outer list is opened with a
// desire to autofocus on the first input field, we can then focus on
// the given $scope.labelForFocusTarget().
// NOTE: This will cause problems for lists nested within lists, since
// sub-element 0 > 1 will have the same label as sub-element 1 > 0.
// But we will assume (for now) that nested lists won't be used -- if
// they are, this will need to be changed.
return (
index === 0 ? baseFocusLabel : baseFocusLabel + index.toString());
};
$scope.isAddItemButtonPresent = true;
$scope.addElementText = 'Add element';
if ($scope.uiConfig() && $scope.uiConfig().add_element_text) {
$scope.addElementText = $scope.uiConfig().add_element_text;
}
// Only hide the 'add item' button in the case of single-line unicode
// input.
$scope.isOneLineInput = true;
if ($scope.itemSchema().type !== 'unicode' ||
$scope.itemSchema().hasOwnProperty('choices')) {
$scope.isOneLineInput = false;
} else if ($scope.itemSchema().ui_config) {
if ($scope.itemSchema().ui_config.coding_mode) {
$scope.isOneLineInput = false;
} else if (
$scope.itemSchema().ui_config.hasOwnProperty('rows') &&
$scope.itemSchema().ui_config.rows > 2) {
$scope.isOneLineInput = false;
}
}
$scope.minListLength = null;
$scope.maxListLength = null;
$scope.showDuplicatesWarning = false;
if ($scope.validators()) {
for (var i = 0; i < $scope.validators().length; i++) {
if ($scope.validators()[i].id === 'has_length_at_most') {
$scope.maxListLength = $scope.validators()[i].max_value;
} else if ($scope.validators()[i].id === 'has_length_at_least') {
$scope.minListLength = $scope.validators()[i].min_value;
} else if ($scope.validators()[i].id === 'is_uniquified') {
$scope.showDuplicatesWarning = true;
}
}
}
while ($scope.localValue.length < $scope.minListLength) {
$scope.localValue.push(
schemaDefaultValueService.getDefaultValue($scope.itemSchema()));
}
$scope.hasDuplicates = function() {
var valuesSoFar = {};
for (var i = 0; i < $scope.localValue.length; i++) {
var value = $scope.localValue[i];
if (!valuesSoFar.hasOwnProperty(value)) {
valuesSoFar[value] = true;
} else {
return true;
}
}
return false;
};
if ($scope.len === undefined) {
$scope.addElement = function() {
if ($scope.isOneLineInput) {
$scope.hideAddItemButton();
}
$scope.localValue.push(
schemaDefaultValueService.getDefaultValue($scope.itemSchema()));
focusService.setFocus(
$scope.getFocusLabel($scope.localValue.length - 1));
};
var _deleteLastElementIfUndefined = function() {
var lastValueIndex = $scope.localValue.length - 1;
var valueToConsiderUndefined = (
schemaUndefinedLastElementService.getUndefinedValue(
$scope.itemSchema()));
if ($scope.localValue[lastValueIndex] ===
valueToConsiderUndefined) {
$scope.deleteElement(lastValueIndex);
}
};
$scope.lastElementOnBlur = function() {
_deleteLastElementIfUndefined();
$scope.showAddItemButton();
};
$scope.showAddItemButton = function() {
$scope.isAddItemButtonPresent = true;
};
$scope.hideAddItemButton = function() {
$scope.isAddItemButtonPresent = false;
};
$scope._onChildFormSubmit = function(evt) {
if (!$scope.isAddItemButtonPresent) {
/**
* If form submission happens on last element of the set (i.e the
* add item button is absent) then automatically add the element
* to the list.
*/
if (($scope.maxListLength === null ||
$scope.localValue.length < $scope.maxListLength) &&
!!$scope.localValue[$scope.localValue.length - 1]) {
$scope.addElement();
}
} else {
/**
* If form submission happens on existing element remove focus
* from it
*/
document.activeElement.blur();
}
evt.stopPropagation();
};
$scope.$on('submittedSchemaBasedIntForm', $scope._onChildFormSubmit);
$scope.$on(
'submittedSchemaBasedFloatForm', $scope._onChildFormSubmit);
$scope.$on(
'submittedSchemaBasedUnicodeForm', $scope._onChildFormSubmit);
$scope.deleteElement = function(index) {
// Need to let the RTE know that HtmlContent has been changed.
$scope.$broadcast('externalHtmlContentChange');
$scope.localValue.splice(index, 1);
};
} else {
if ($scope.len <= 0) {
throw 'Invalid length for list editor: ' + $scope.len;
}
if ($scope.len !== $scope.localValue.length) {
throw 'List editor length does not match length of input value: ' +
$scope.len + ' ' + $scope.localValue;
}
}
}]
};
}
]);
oppia.directive('schemaBasedDictEditor', [
'recursionHelper', function(recursionHelper) {
return {
scope: {
localValue: '=',
isDisabled: '&',
// Read-only property. An object whose keys and values are the dict
// properties and the corresponding schemas.
propertySchemas: '&',
allowExpressions: '&',
labelForFocusTarget: '&'
},
templateUrl: 'schemaBasedEditor/dict',
restrict: 'E',
compile: recursionHelper.compile,
controller: ['$scope', function($scope) {
$scope.getHumanReadablePropertyDescription = function(property) {
return property.description || '[' + property.name + ']';
};
$scope.fieldIds = {};
for (var i = 0; i < $scope.propertySchemas().length; i++) {
// Generate random IDs for each field.
$scope.fieldIds[$scope.propertySchemas()[i].name] = (
Math.random().toString(36).slice(2));
}
}]
};
}
]);
oppia.directive('schemaBasedCustomEditor', [
'recursionHelper', function(recursionHelper) {
return {
scope: {
localValue: '=',
// The class of the object being edited.
objType: '='
},
templateUrl: 'schemaBasedEditor/custom',
restrict: 'E',
compile: recursionHelper.compile
};
}
]);
/*********************************************************************
*
* DIRECTIVES FOR SCHEMA-BASED VIEWERS
*
*********************************************************************/
oppia.directive('schemaBasedViewer', [function() {
return {
scope: {
schema: '&',
localValue: '='
},
templateUrl: 'schemaBasedViewer/master',
restrict: 'E'
};
}]);
oppia.directive('schemaBasedPrimitiveViewer', [function() {
return {
scope: {
localValue: '='
},
templateUrl: 'schemaBasedViewer/primitive',
restrict: 'E',
controller: ['$scope', function($scope) {
$scope.isExpression = function(value) {
return angular.isString(value);
};
}]
};
}]);
oppia.directive('schemaBasedUnicodeViewer', [function() {
return {
scope: {
localValue: '='
},
templateUrl: 'schemaBasedViewer/unicode',
restrict: 'E',
controller: ['$scope', '$filter', '$sce', function($scope, $filter, $sce) {
$scope.getDisplayedValue = function() {
return $sce.trustAsHtml($filter('convertUnicodeWithParamsToHtml')(
$scope.localValue));
};
}]
};
}]);
oppia.directive('schemaBasedHtmlViewer', [function() {
return {
scope: {
localValue: '='
},
templateUrl: 'schemaBasedViewer/html',
restrict: 'E'
};
}]);
oppia.directive('schemaBasedListViewer', [
'recursionHelper', function(recursionHelper) {
return {
scope: {
localValue: '=',
// Read-only property. The schema definition for each item in the list.
itemSchema: '&'
},
templateUrl: 'schemaBasedViewer/list',
restrict: 'E',
compile: recursionHelper.compile
};
}
]);
oppia.directive('schemaBasedDictViewer', [
'recursionHelper', function(recursionHelper) {
return {
scope: {
localValue: '=',
// Read-only property. An object whose keys and values are the dict
// properties and the corresponding schemas.
propertySchemas: '&'
},
templateUrl: 'schemaBasedViewer/dict',
restrict: 'E',
compile: recursionHelper.compile,
controller: ['$scope', function($scope) {
$scope.getHumanReadablePropertyDescription = function(property) {
return property.description || '[' + property.name + ']';
};
}]
};
}
]);
oppia.directive('schemaBasedCustomViewer', [
'recursionHelper', function(recursionHelper) {
return {
scope: {
localValue: '=',
// The class of the object being edited.
objType: '='
},
templateUrl: 'schemaBasedViewer/custom',
restrict: 'E',
compile: recursionHelper.compile
};
}
]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Factory for handling warnings and info messages.
*/
oppia.factory('alertsService', ['$log', function($log) {
var alertsService = {
/**
* Each element in each of the arrays here is an object with two keys:
* - type: a string specifying the type of message or warning.
* Possible types - "warning", "info" or "success".
* - content: a string containing the warning or message.
*/
/**
* Array of "warning" messages.
*/
warnings: [],
/**
* Array of "success" or "info" messages.
*/
messages: []
};
// This is to prevent infinite loops.
var MAX_TOTAL_WARNINGS = 10;
var MAX_TOTAL_MESSAGES = 10;
/**
* Adds a warning message.
* @param {string} warning - The warning message to display.
*/
alertsService.addWarning = function(warning) {
$log.error(warning);
if (alertsService.warnings.length >= MAX_TOTAL_WARNINGS) {
return;
}
alertsService.warnings.push({
type: 'warning',
content: warning
});
};
/**
* Adds a warning in the same way as addWarning(), except it also throws an
* exception to cause a hard failure in the frontend.
* @param {string} warning - The warning message to display.
*/
alertsService.fatalWarning = function(warning) {
alertsService.addWarning(warning);
throw new Error(warning);
};
/**
* Deletes the warning from the warnings list.
* @param {Object} warningObject - The warning message to be deleted.
*/
alertsService.deleteWarning = function(warningObject) {
var warnings = alertsService.warnings;
var newWarnings = [];
for (var i = 0; i < warnings.length; i++) {
if (warnings[i].content !== warningObject.content) {
newWarnings.push(warnings[i]);
}
}
alertsService.warnings = newWarnings;
};
/**
* Clears all warnings.
*/
alertsService.clearWarnings = function() {
alertsService.warnings = [];
};
/**
* Adds a message, can be info messages or success messages.
* @param {string} type - Type of message
* @param {string} message - Message content
*/
alertsService.addMessage = function(type, message) {
if (alertsService.messages.length >= MAX_TOTAL_MESSAGES) {
return;
}
alertsService.messages.push({
type: type,
content: message
});
};
/**
* Deletes the message from the messages list.
* @param {Object} messageObject - Message to be deleted.
*/
alertsService.deleteMessage = function(messageObject) {
var messages = alertsService.messages;
var newMessages = [];
for (var i = 0; i < messages.length; i++) {
if (messages[i].type !== messageObject.type ||
messages[i].content !== messageObject.content) {
newMessages.push(messages[i]);
}
}
alertsService.messages = newMessages;
};
/**
* Adds an info message.
* @param {string} message - Info message to display.
*/
alertsService.addInfoMessage = function(message) {
alertsService.addMessage('info', message);
};
/**
* Adds a success message.
* @param {string} message - Success message to display
*/
alertsService.addSuccessMessage = function(message) {
alertsService.addMessage('success', message);
};
/**
* Clears all messages.
*/
alertsService.clearMessages = function() {
alertsService.messages = [];
};
return alertsService;
}]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Service for returning information about an exploration's
* context.
*/
oppia.constant('PAGE_CONTEXT', {
EDITOR: 'editor',
LEARNER: 'learner',
OTHER: 'other'
});
oppia.constant('EDITOR_TAB_CONTEXT', {
EDITOR: 'editor',
PREVIEW: 'preview'
});
oppia.factory('explorationContextService', [
'$window', 'PAGE_CONTEXT', 'EDITOR_TAB_CONTEXT',
function($window, PAGE_CONTEXT, EDITOR_TAB_CONTEXT) {
var _pageContext = null;
var _explorationId = null;
return {
// Returns a string representing the current tab of the editor (either
// 'editor' or 'preview'), or null if the current tab is neither of these,
// or the current page is not the editor.
getEditorTabContext: function() {
var hash = $window.location.hash;
if (hash.indexOf('#/gui') === 0) {
return EDITOR_TAB_CONTEXT.EDITOR;
} else if (hash.indexOf('#/preview') === 0) {
return EDITOR_TAB_CONTEXT.PREVIEW;
} else {
return null;
}
},
// Returns a string representing the context of the current page.
// This is either PAGE_CONTEXT.EDITOR or PAGE_CONTEXT.LEARNER.
// If the current page is not one in either EDITOR or LEARNER then
// return PAGE_CONTEXT.OTHER
getPageContext: function() {
if (_pageContext) {
return _pageContext;
} else {
var pathnameArray = $window.location.pathname.split('/');
for (var i = 0; i < pathnameArray.length; i++) {
if (pathnameArray[i] === 'explore') {
_pageContext = PAGE_CONTEXT.LEARNER;
return PAGE_CONTEXT.LEARNER;
} else if (pathnameArray[i] === 'create') {
_pageContext = PAGE_CONTEXT.EDITOR;
return PAGE_CONTEXT.EDITOR;
}
}
return PAGE_CONTEXT.OTHER;
}
},
isInExplorationContext: function() {
return (this.getPageContext() === PAGE_CONTEXT.EDITOR ||
this.getPageContext() === PAGE_CONTEXT.LEARNER);
},
// Returns a string representing the explorationId (obtained from the
// URL).
getExplorationId: function() {
if (_explorationId) {
return _explorationId;
} else {
// The pathname should be one of /explore/{exploration_id} or
// /create/{exploration_id} .
var pathnameArray = $window.location.pathname.split('/');
for (var i = 0; i < pathnameArray.length; i++) {
if (pathnameArray[i] === 'explore' ||
pathnameArray[i] === 'create') {
_explorationId = pathnameArray[i + 1];
return pathnameArray[i + 1];
}
}
throw Error(
'ERROR: explorationContextService should not be used outside the ' +
'context of an exploration.');
}
},
// Following variable helps to know whether exploration editor is
// in main editing mode or preview mode.
isInExplorationEditorMode: function() {
return (this.getPageContext() === PAGE_CONTEXT.EDITOR &&
this.getEditorTabContext() === EDITOR_TAB_CONTEXT.EDITOR);
}
};
}
]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// About this service:
// In the exploration player, a video should only autoplay when it is first seen
// on a new card, and not when the learner clicks back to previous cards in
// their exploration playthrough. This service maintains a list of videos that
// have been played, so that we know not to autoplay them on a second pass.
//
// Caveat: if the same video is shown twice in the exploration, the second and
// subsequent instances of that video will not autoplay. We believe this
// occurrence is rare, and have not accounted for it here. If it turns out
// to be an issue, we may need to instead assign a unique id to each rich-text
// component and use that id instead to determine whether to suppress
// autoplaying.
oppia.factory('autoplayedVideosService', [function() {
var autoplayedVideosDict = {};
return {
addAutoplayedVideo: function(videoId) {
autoplayedVideosDict[videoId] = true;
},
hasVideoBeenAutoplayed: function(videoId) {
return Boolean(autoplayedVideosDict[videoId]);
}
};
}
]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview search service for activityTilesInfinityGrid
*/
oppia.constant('SEARCH_DATA_URL', '/searchhandler/data');
oppia.factory('searchService', [
'$http', '$rootScope', '$translate', 'SEARCH_DATA_URL',
function($http, $rootScope, $translate, SEARCH_DATA_URL) {
var _lastQuery = null;
var _lastSelectedCategories = {};
var _lastSelectedLanguageCodes = {};
var _searchCursor = null;
// Appends a suffix to the query describing allowed category and language
// codes to filter on.
var _getSuffixForQuery = function(selectedCategories, selectedLanguageCodes) {
var querySuffix = '';
var _categories = '';
for (var key in selectedCategories) {
if (selectedCategories[key]) {
if (_categories) {
_categories += '" OR "';
}
_categories += key;
}
}
if (_categories) {
querySuffix += '&category=("' + _categories + '")';
}
var _languageCodes = '';
for (var key in selectedLanguageCodes) {
if (selectedLanguageCodes[key]) {
if (_languageCodes) {
_languageCodes += '" OR "';
}
_languageCodes += key;
}
}
if (_languageCodes) {
querySuffix += '&language_code=("' + _languageCodes + '")';
}
return querySuffix;
};
var hasReachedEndOfPage = function() {
return _searchCursor === null;
};
var updateSearchFields = function(itemsType, urlComponent,
selectionDetails) {
var itemCodeGroup = urlComponent.match(/=\("[A-Za-z%20" ]+"\)/);
var itemCodes = itemCodeGroup ? itemCodeGroup[0] : null;
var EXPECTED_PREFIX = '=("';
var EXPECTED_SUFFIX = '")';
if (!itemCodes ||
itemCodes.indexOf(EXPECTED_PREFIX) !== 0 ||
itemCodes.lastIndexOf(EXPECTED_SUFFIX) !==
itemCodes.length - EXPECTED_SUFFIX.length) {
throw Error('Invalid search query url fragment for ' +
itemsType + ': ' + urlComponent);
return;
}
var items = itemCodes.substring(
EXPECTED_PREFIX.length, itemCodes.length - EXPECTED_SUFFIX.length
).split('" OR "');
var selections = selectionDetails[itemsType].selections;
for (var i = 0; i < items.length; i++) {
selections[items[i]] = true;
}
};
var _isCurrentlyFetchingResults = false;
var numSearchesInProgress = 0;
var getQueryUrl = function(searchUrlQueryString) {
return SEARCH_DATA_URL + '?q=' + searchUrlQueryString;
};
return {
getSearchUrlQueryString: function(searchQuery, selectedCategories,
selectedLanguageCodes) {
return encodeURIComponent(searchQuery) +
_getSuffixForQuery(selectedCategories, selectedLanguageCodes);
},
// Note that an empty query results in all activities being shown.
executeSearchQuery: function(
searchQuery, selectedCategories, selectedLanguageCodes,
successCallback) {
var queryUrl = getQueryUrl(
this.getSearchUrlQueryString(
searchQuery, selectedCategories, selectedLanguageCodes));
_isCurrentlyFetchingResults = true;
numSearchesInProgress++;
$http.get(queryUrl).then(function(response) {
var data = response.data;
_lastQuery = searchQuery;
_lastSelectedCategories = angular.copy(selectedCategories);
_lastSelectedLanguageCodes = angular.copy(selectedLanguageCodes);
_searchCursor = data.search_cursor;
numSearchesInProgress--;
if ($('.oppia-search-bar-input').val() === searchQuery) {
$rootScope.$broadcast(
'initialSearchResultsLoaded', data.activity_list);
_isCurrentlyFetchingResults = false;
} else {
console.log('Mismatch');
console.log('SearchQuery: ' + searchQuery);
console.log('Input: ' + $('.oppia-search-bar-input').val());
}
}, function() {
numSearchesInProgress--;
});
// Translate the new explorations loaded.
$translate.refresh();
if (successCallback) {
successCallback();
}
},
isSearchInProgress: function() {
return numSearchesInProgress > 0;
},
// The following takes in the url search component as an argument and the
// selectionDetails. It will update selectionDetails with the relevant
// fields that were extracted from the url. It returns the unencoded search
// query string.
updateSearchFieldsBasedOnUrlQuery: function(
urlComponent, selectionDetails) {
var urlQuery = urlComponent.substring('?q='.length);
// The following will split the urlQuery into 3 components:
// 1. query
// 2. categories (optional)
// 3. language codes (default to 'en')
var querySegments = urlQuery.split('&');
if (querySegments.length > 3) {
throw Error('Invalid search query url: ' + urlQuery);
}
for (var i = 1; i < querySegments.length; i++) {
var urlComponent = decodeURIComponent(querySegments[i]);
var itemsType = null;
if (urlComponent.indexOf('category') === 0) {
itemsType = 'categories';
} else if (urlComponent.indexOf('language_code') === 0) {
itemsType = 'languageCodes';
} else {
console.error('Invalid search query component: ' + urlComponent);
continue;
}
try {
updateSearchFields(itemsType, urlComponent, selectionDetails);
} catch (error) {
selectionDetails[itemsType].selections = {};
throw error;
}
}
return decodeURIComponent(querySegments[0]);
},
loadMoreData: function(successCallback, failureCallback) {
// If a new query is still being sent, or the end of the page has been
// reached, do not fetch more results.
if (_isCurrentlyFetchingResults || hasReachedEndOfPage()) {
failureCallback(hasReachedEndOfPage());
return;
}
var queryUrl = getQueryUrl(
this.getSearchUrlQueryString(
_lastQuery, _lastSelectedCategories, _lastSelectedLanguageCodes));
if (_searchCursor) {
queryUrl += '&cursor=' + _searchCursor;
}
_isCurrentlyFetchingResults = true;
$http.get(queryUrl).then(function(response) {
_searchCursor = response.data.search_cursor;
_isCurrentlyFetchingResults = false;
if (successCallback) {
successCallback(response.data, hasReachedEndOfPage());
}
});
}
};
}]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directive for an infinitely-scrollable view of activity tiles
*/
oppia.directive('activityTilesInfinityGrid', [function() {
return {
restrict: 'E',
templateUrl: 'components/activityTilesInfinityGrid',
controller: [
'$scope', '$rootScope', 'searchService',
function($scope, $rootScope, searchService) {
$scope.endOfPageIsReached = false;
$scope.allActivitiesInOrder = [];
// Called when the first batch of search results is retrieved from the
// server.
$scope.$on(
'initialSearchResultsLoaded', function(evt, activityList) {
$scope.allActivitiesInOrder = activityList;
}
);
$scope.showMoreActivities = function() {
if (!$rootScope.loadingMessage && !$scope.endOfPageIsReached) {
$scope.searchResultsAreLoading = true;
searchService.loadMoreData(function(data, endOfPageIsReached) {
$scope.allActivitiesInOrder =
$scope.allActivitiesInOrder.concat(
data.activity_list);
$scope.endOfPageIsReached = endOfPageIsReached;
$scope.searchResultsAreLoading = false;
}, function(endOfPageIsReached) {
$scope.endOfPageIsReached = endOfPageIsReached;
$scope.searchResultsAreLoading = false;
});
}
};
}
]
};
}]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directive for Alert Messages
*/
oppia.directive('alertMessage', [function() {
return {
restrict: 'E',
scope: {
getMessage: '&messageObject',
getMessageIndex: '&messageIndex'
},
template: '<div class="oppia-alert-message"></div>',
controller: [
'$scope', 'alertsService', 'toastr',
function($scope, alertsService, toastr) {
$scope.alertsService = alertsService;
$scope.toastr = toastr;
}
],
link: function(scope) {
var message = scope.getMessage();
if (message.type === 'info') {
scope.toastr.info(message.content, {
onHidden: function() {
scope.alertsService.deleteMessage(message);
}
});
} else if (message.type === 'success') {
scope.toastr.success(message.content, {
onHidden: function() {
scope.alertsService.deleteMessage(message);
}
});
}
}
};
}]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Modal and functionality for the create collection button.
*/
// TODO(bhenning): Refactor this to match the frontend design spec and reduce
// duplicated code between CollectionCreationService and
// ExplorationCreationService.
oppia.factory('CollectionCreationService', [
'$http', '$window', '$rootScope', '$timeout', 'alertsService',
'UrlInterpolationService', 'siteAnalyticsService',
function(
$http, $window, $rootScope, $timeout, alertsService,
UrlInterpolationService, siteAnalyticsService) {
var CREATE_NEW_COLLECTION_URL_TEMPLATE = (
'/collection_editor/create/<collection_id>');
var collectionCreationInProgress = false;
return {
createNewCollection: function() {
if (collectionCreationInProgress) {
return;
}
collectionCreationInProgress = true;
alertsService.clearWarnings();
$rootScope.loadingMessage = 'Creating collection';
$http.post('/collection_editor_handler/create_new', {}).then(
function(response) {
siteAnalyticsService.registerCreateNewCollectionEvent(
response.data.collectionId);
$timeout(function() {
$window.location = UrlInterpolationService.interpolateUrl(
CREATE_NEW_COLLECTION_URL_TEMPLATE, {
collection_id: response.data.collectionId
}
);
}, 150);
}, function() {
$rootScope.loadingMessage = '';
}
);
}
};
}
]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Summary tile for collections.
*/
oppia.constant(
'COLLECTION_VIEWER_URL', '/collection/<collection_id>');
oppia.directive('collectionSummaryTile', [function() {
return {
restrict: 'E',
scope: {
getCollectionId: '&collectionId',
getCollectionTitle: '&collectionTitle',
getObjective: '&objective',
getNodeCount: '&nodeCount',
getLastUpdatedMsec: '&lastUpdatedMsec',
getThumbnailIconUrl: '&thumbnailIconUrl',
getThumbnailBgColor: '&thumbnailBgColor'
},
templateUrl: 'summaryTile/collection',
controller: [
'$scope', 'oppiaDatetimeFormatter', 'UrlInterpolationService',
'COLLECTION_VIEWER_URL', function($scope, oppiaDatetimeFormatter,
UrlInterpolationService, COLLECTION_VIEWER_URL) {
$scope.getLastUpdatedDatetime = function() {
return oppiaDatetimeFormatter.getLocaleAbbreviatedDatetimeString(
$scope.getLastUpdatedMsec());
};
$scope.wasRecentlyUpdated = function() {
return oppiaDatetimeFormatter.isRecent($scope.getLastUpdatedMsec());
};
$scope.getCollectionLink = function() {
return UrlInterpolationService.interpolateUrl(
COLLECTION_VIEWER_URL, {
collection_id: $scope.getCollectionId()
}
);
};
}
]
};
}]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directive for the Create Exploration/Collection button.
*/
oppia.directive('createActivityButton', [function() {
return {
restrict: 'E',
templateUrl: 'components/createActivityButton',
controller: [
'$scope', '$timeout', '$window', '$modal', 'ExplorationCreationService',
'CollectionCreationService', 'siteAnalyticsService', 'urlService',
function(
$scope, $timeout, $window, $modal, ExplorationCreationService,
CollectionCreationService, siteAnalyticsService, urlService) {
$scope.creationInProgress = false;
$scope.showUploadExplorationModal = (
ExplorationCreationService.showUploadExplorationModal);
$scope.onRedirectToLogin = function(destinationUrl) {
siteAnalyticsService.registerStartLoginEvent('createActivityButton');
$timeout(function() {
$window.location = destinationUrl;
}, 150);
return false;
};
$scope.initCreationProcess = function() {
// Without this, the modal keeps reopening when the window is resized.
if ($scope.creationInProgress) {
return;
}
$scope.creationInProgress = true;
if (!GLOBALS.can_create_collections) {
ExplorationCreationService.createNewExploration();
} else if (urlService.getPathname() !== '/dashboard') {
$window.location.replace('/dashboard?mode=create');
} else {
$modal.open({
templateUrl: 'modals/createActivity',
backdrop: true,
controller: [
'$scope', '$modalInstance', 'UrlInterpolationService',
function($scope, $modalInstance, UrlInterpolationService) {
$scope.chooseExploration = function() {
ExplorationCreationService.createNewExploration();
$modalInstance.close();
};
$scope.chooseCollection = function() {
CollectionCreationService.createNewCollection();
$modalInstance.close();
};
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
$scope.explorationImgUrl = (
UrlInterpolationService.getStaticImageUrl(
'/activity/exploration.svg'));
$scope.collectionImgUrl = (
UrlInterpolationService.getStaticImageUrl(
'/activity/collection.svg'));
}],
windowClass: 'oppia-creation-modal'
}).result.then(function() {}, function() {
$scope.creationInProgress = false;
});
}
};
// If the user clicked on a 'create' button to get to the dashboard,
// open the create modal immediately (or redirect to the exploration
// editor if the create modal does not need to be shown).
if (urlService.getUrlParams().mode === 'create') {
if (!GLOBALS.can_create_collections) {
ExplorationCreationService.createNewExploration();
} else {
$scope.initCreationProcess();
}
}
}
]
};
}]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Functionality for the create exploration button and upload
* modal.
*/
oppia.factory('ExplorationCreationService', [
'$http', '$modal', '$timeout', '$rootScope', '$window',
'alertsService', 'siteAnalyticsService', 'UrlInterpolationService',
function(
$http, $modal, $timeout, $rootScope, $window,
alertsService, siteAnalyticsService, UrlInterpolationService) {
var CREATE_NEW_EXPLORATION_URL_TEMPLATE = '/create/<exploration_id>?new';
var explorationCreationInProgress = false;
return {
createNewExploration: function() {
if (explorationCreationInProgress) {
return;
}
explorationCreationInProgress = true;
alertsService.clearWarnings();
$rootScope.loadingMessage = 'Creating exploration';
$http.post('/contributehandler/create_new', {
}).then(function(response) {
siteAnalyticsService.registerCreateNewExplorationEvent(
response.data.explorationId);
$timeout(function() {
$window.location = UrlInterpolationService.interpolateUrl(
CREATE_NEW_EXPLORATION_URL_TEMPLATE, {
exploration_id: response.data.explorationId
}
);
}, 150);
return false;
}, function() {
$rootScope.loadingMessage = '';
explorationCreationInProgress = false;
});
},
showUploadExplorationModal: function() {
alertsService.clearWarnings();
$modal.open({
backdrop: true,
templateUrl: 'modals/uploadActivity',
controller: [
'$scope', '$modalInstance', function($scope, $modalInstance) {
$scope.save = function() {
var returnObj = {};
var file = document.getElementById('newFileInput').files[0];
if (!file || !file.size) {
alertsService.addWarning('Empty file detected.');
return;
}
returnObj.yamlFile = file;
$modalInstance.close(returnObj);
};
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
alertsService.clearWarnings();
};
}
]
}).result.then(function(result) {
var yamlFile = result.yamlFile;
$rootScope.loadingMessage = 'Creating exploration';
var form = new FormData();
form.append('yaml_file', yamlFile);
form.append('payload', JSON.stringify({}));
form.append('csrf_token', GLOBALS.csrf_token);
$.ajax({
contentType: false,
data: form,
dataFilter: function(data) {
// Remove the XSSI prefix.
return JSON.parse(data.substring(5));
},
dataType: 'text',
processData: false,
type: 'POST',
url: 'contributehandler/upload'
}).done(function(data) {
$window.location = UrlInterpolationService.interpolateUrl(
CREATE_NEW_EXPLORATION_URL_TEMPLATE, {
exploration_id: data.explorationId
}
);
}).fail(function(data) {
var transformedData = data.responseText.substring(5);
var parsedResponse = JSON.parse(transformedData);
alertsService.addWarning(
parsedResponse.error || 'Error communicating with server.');
$rootScope.loadingMessage = '';
$scope.$apply();
});
});
}
};
}
]);
})();
(function() {// Copyright 2015 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Component for an exploration summary tile.
*/
oppia.directive('explorationSummaryTile', [function() {
return {
restrict: 'E',
scope: {
getCollectionId: '&collectionId',
getExplorationId: '&explorationId',
getExplorationTitle: '&explorationTitle',
getLastUpdatedMsec: '&lastUpdatedMsec',
getNumViews: '&numViews',
getObjective: '&objective',
getCategory: '&category',
getRatings: '&ratings',
getContributorsSummary: '&contributorsSummary',
getThumbnailIconUrl: '&thumbnailIconUrl',
getThumbnailBgColor: '&thumbnailBgColor',
// If this is not null, the new exploration opens in a new window when the
// summary tile is clicked.
openInNewWindow: '@openInNewWindow',
isCommunityOwned: '&isCommunityOwned',
// If the screen width is below the threshold defined here, the mobile
// version of the summary tile is displayed. This attribute is optional:
// if it is not specified, it is treated as 0, which means that the
// desktop version of the summary tile is always displayed.
mobileCutoffPx: '@mobileCutoffPx'
},
templateUrl: 'summaryTile/exploration',
link: function(scope, element) {
element.find('.exploration-summary-avatars').on('mouseenter',
function() {
element.find('.mask').attr('class',
'exploration-summary-tile-mask mask');
// As animation duration time may be 400ms, .stop(true) is used to
// prevent the effects queue falling behind the mouse movement.
// .hide(1) and .show(1) used to place the animation in the effects
// queue.
element.find('.avatars-num-minus-one').stop(true).hide(1,
function() {
element.find('.all-avatars').stop(true).slideDown();
}
);
}
);
element.find('.exploration-summary-avatars').on('mouseleave',
function() {
element.find('.mask').attr('class', 'top-section-mask mask');
element.find('.all-avatars').stop(true).slideUp(400, function() {
element.find('.avatars-num-minus-one').stop(true).show(1);
});
}
);
},
controller: [
'$scope', '$http',
'oppiaDatetimeFormatter', 'RatingComputationService',
'windowDimensionsService', 'UrlInterpolationService',
function(
$scope, $http,
oppiaDatetimeFormatter, RatingComputationService,
windowDimensionsService, UrlInterpolationService) {
var contributorsSummary = $scope.getContributorsSummary() || {};
$scope.contributors = Object.keys(
contributorsSummary).sort(
function(contributorUsername1, contributorUsername2) {
var commitsOfContributor1 = contributorsSummary[
contributorUsername1].num_commits;
var commitsOfContributor2 = contributorsSummary[
contributorUsername2].num_commits;
return commitsOfContributor2 - commitsOfContributor1;
}
);
$scope.avatarsList = [];
$scope.contributors.forEach(function(contributorName) {
var DEFAULT_PROFILE_IMAGE_PATH = (
UrlInterpolationService.getStaticImageUrl(
'/avatar/user_blue_72px.png'));
var avatarData = {
image: contributorsSummary[
contributorName].profile_picture_data_url ||
DEFAULT_PROFILE_IMAGE_PATH,
tooltipText: contributorName
};
if (GLOBALS.SYSTEM_USERNAMES.indexOf(contributorName) === -1) {
avatarData.link = '/profile/' + contributorName;
}
$scope.avatarsList.push(avatarData);
});
if ($scope.isCommunityOwned()) {
var COMMUNITY_OWNED_IMAGE_PATH = (
UrlInterpolationService.getStaticImageUrl(
'/avatar/fa_globe_72px.png'));
var COMMUNITY_OWNED_TOOLTIP_TEXT = 'Community Owned';
var communityOwnedAvatar = {
image: COMMUNITY_OWNED_IMAGE_PATH,
tooltipText: COMMUNITY_OWNED_TOOLTIP_TEXT
};
$scope.avatarsList.unshift(communityOwnedAvatar);
}
$scope.MAX_AVATARS_TO_DISPLAY = 5;
$scope.getAverageRating = function() {
return RatingComputationService.computeAverageRating(
$scope.getRatings());
};
$scope.getLastUpdatedDatetime = function() {
return oppiaDatetimeFormatter.getLocaleAbbreviatedDatetimeString(
$scope.getLastUpdatedMsec());
};
$scope.wasRecentlyUpdated = function() {
return oppiaDatetimeFormatter.isRecent($scope.getLastUpdatedMsec());
};
$scope.getExplorationLink = function() {
var result = '/explore/' + $scope.getExplorationId();
if ($scope.getCollectionId()) {
result += ('?collection_id=' + $scope.getCollectionId());
}
return result;
};
if (!$scope.mobileCutoffPx) {
$scope.mobileCutoffPx = 0;
}
$scope.isWindowLarge = (
windowDimensionsService.getWidth() >= $scope.mobileCutoffPx);
windowDimensionsService.registerOnResizeHook(function() {
$scope.isWindowLarge = (
windowDimensionsService.getWidth() >= $scope.mobileCutoffPx);
$scope.$apply();
});
}
]
};
}]);
})();
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directive for displaying animated loading dots.
*/
oppia.directive('loadingDots', function() {
return {
restrict: 'E',
templateUrl: 'components/loadingDots'
};
});
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directives for the object editors.
*/
// Individual object editor directives are in extensions/objects/templates.
oppia.directive('objectEditor', ['$compile', '$log', function($compile, $log) {
return {
scope: {
alwaysEditable: '@',
initArgs: '=',
isEditable: '@',
objType: '@',
value: '='
},
link: function(scope, element) {
// Converts a camel-cased string to a lower-case hyphen-separated string.
var directiveName = scope.objType.replace(
/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
if (directiveName) {
element.html(
'<' + directiveName + '-editor></' + directiveName + '-editor>');
$compile(element.contents())(scope);
} else {
$log.error('Error in objectEditor: no editor type supplied.');
}
},
restrict: 'E'
};
}]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Service for computing the average rating.
*/
oppia.factory('RatingComputationService', [function() {
var areRatingsShown = function(ratingFrequencies) {
var MINIMUM_ACCEPTABLE_NUMBER_OF_RATINGS = 1;
var totalNumber = 0;
for (var value in ratingFrequencies) {
totalNumber += ratingFrequencies[value];
}
return totalNumber >= MINIMUM_ACCEPTABLE_NUMBER_OF_RATINGS;
};
return {
computeAverageRating: function(ratingFrequencies) {
if (!areRatingsShown(ratingFrequencies)) {
return undefined;
} else {
var totalNumber = 0;
var totalValue = 0.0;
for (var value in ratingFrequencies) {
totalValue += value * ratingFrequencies[value];
totalNumber += ratingFrequencies[value];
}
if (totalNumber === 0) {
return undefined;
}
return totalValue / totalNumber;
}
}
};
}]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directive for displaying summary rating information.
*/
oppia.directive('ratingDisplay', [function() {
return {
// This will display a star-rating based on the given data. The attributes
// passed in are as follows:
// - isEditable: true or false; whether the rating is user-editable.
// - onEdit: should be supplied iff isEditable is true, and be a function
// that will be supplied with the new rating when the rating is changed.
// - ratingValue: an integer 1-5 giving the rating
restrict: 'E',
scope: {
isEditable: '=',
onEdit: '=',
ratingValue: '='
},
templateUrl: 'components/ratingSummary',
link: function(scope, element) {
// This is needed in order for the scope to be retrievable during Karma
// unit testing. See http://stackoverflow.com/a/29833832 for more
// details.
element[0].isolateScope = function() {
return scope;
};
},
controller: ['$scope', function($scope) {
var POSSIBLE_RATINGS = [1, 2, 3, 4, 5];
$scope.stars = POSSIBLE_RATINGS.map(function(starValue) {
return {
cssClass: 'fa-star-o',
value: starValue
};
});
var STATUS_ACTIVE = 'active';
var STATUS_INACTIVE = 'inactive';
var STATUS_RATING_SET = 'rating_set';
$scope.status = STATUS_INACTIVE;
var displayValue = function(ratingValue) {
for (var i = 0; i < $scope.stars.length; i++) {
$scope.stars[i].cssClass = (
ratingValue === undefined ? 'fa-star-o' :
ratingValue < $scope.stars[i].value - 0.75 ? 'fa-star-o' :
ratingValue < $scope.stars[i].value - 0.25 ? 'fa-star-half-o' :
'fa-star');
if ($scope.status === STATUS_ACTIVE &&
ratingValue >= $scope.stars[i].value) {
$scope.stars[i].cssClass += ' oppia-rating-star-active';
}
}
};
displayValue($scope.ratingValue);
$scope.$watch('ratingValue', function() {
displayValue($scope.ratingValue);
});
$scope.clickStar = function(starValue) {
if ($scope.isEditable && $scope.status === STATUS_ACTIVE) {
$scope.status = STATUS_RATING_SET;
$scope.ratingValue = starValue;
displayValue(starValue);
$scope.onEdit(starValue);
}
};
$scope.enterStar = function(starValue) {
if (
$scope.isEditable &&
($scope.status === STATUS_ACTIVE ||
$scope.status === STATUS_INACTIVE)) {
$scope.status = STATUS_ACTIVE;
displayValue(starValue);
}
};
$scope.leaveArea = function() {
$scope.status = STATUS_INACTIVE;
displayValue($scope.ratingValue);
};
$scope.getCursorStyle = function() {
return 'cursor: ' + ($scope.isEditable ? 'pointer' : 'auto');
};
}]
};
}]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Directive for the select2 autocomplete component.
*/
oppia.directive('select2Dropdown', [function() {
// Directive for incorporating select2 dropdowns.
return {
restrict: 'E',
scope: {
// Whether to allow multiple choices. In order to do so, the value of
// this attribute must be the exact string 'true'.
allowMultipleChoices: '@',
choices: '=',
// An additional CSS class to add to the select2 dropdown. May be
// undefined.
dropdownCssClass: '@',
// A function that formats a new selection. May be undefined.
formatNewSelection: '=',
// The message shown when an invalid search term is entered. May be
// undefined, in which case this defaults to 'No matches found'.
invalidSearchTermMessage: '@',
item: '=',
// The regex used to validate newly-entered choices that do not
// already exist. Use ".^" to reject all new choices.
newChoiceRegex: '@',
onSelectionChange: '&',
placeholder: '@',
// Whether select2 is in tagging mode.
tagMode: '@',
width: '@'
},
template: '<input type="hidden">',
controller: ['$scope', '$element', function($scope, $element) {
$scope.newChoiceValidator = new RegExp($scope.newChoiceRegex);
var select2Options = {
allowClear: false,
data: $scope.choices,
multiple: $scope.allowMultipleChoices === 'true',
placeholder: $scope.placeholder,
width: $scope.width || '250px',
createSearchChoice: function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return term.match($scope.newChoiceValidator) ? {
id: term,
text: term
} : null;
}
},
formatResult: function(queryResult) {
var doesChoiceMatchText = function(choice) {
return choice.id === queryResult.text;
};
if ($scope.choices && $scope.choices.some(doesChoiceMatchText)) {
return queryResult.text;
} else {
if ($scope.formatNewSelection) {
return $scope.formatNewSelection(queryResult.text);
} else {
return queryResult.text;
}
}
},
formatNoMatches: function(searchTerm) {
if ($scope.invalidSearchTermMessage &&
!searchTerm.match($scope.newChoiceValidator)) {
return $scope.invalidSearchTermMessage;
} else {
return 'No matches found';
}
}
};
if ($scope.tagMode) {
select2Options.tags = [];
}
if ($scope.dropdownCssClass) {
select2Options.dropdownCssClass = $scope.dropdownCssClass;
}
var select2Node = $element[0].firstChild;
// Initialize the dropdown.
$(select2Node).select2(select2Options);
$(select2Node).select2('val', $scope.item);
// Update $scope.item when the selection changes.
$(select2Node).on('change', function(e) {
$scope.item = e.val;
$scope.$apply();
$scope.onSelectionChange();
$scope.$apply();
});
// Respond to external changes in $scope.item
$scope.$watch('item', function(newValue) {
$(select2Node).select2('val', newValue);
});
}]
};
}]);
})();
(function() {// Copyright 2015 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Service to construct URLs by inserting variables within them as
* necessary to have a fully-qualified URL.
*/
oppia.factory('UrlInterpolationService', ['alertsService',
function(alertsService) {
// http://stackoverflow.com/questions/203739
var _isString = function(value) {
return (typeof value === 'string') || (value instanceof String);
};
var validateResourcePath = function(resourcePath) {
if (!resourcePath) {
alertsService.fatalWarning(
'Empty path passed in method.');
}
var RESOURCE_PATH_STARTS_WITH_FORWARD_SLASH = /^\//;
// Ensure that resourcePath starts with a forward slash.
if (!resourcePath.match(RESOURCE_PATH_STARTS_WITH_FORWARD_SLASH)) {
alertsService.fatalWarning(
'Path must start with \'\/\': \'' + new String(resourcePath) +
'\'.');
}
};
var getCachePrefixedUrl = function(resourcePath) {
validateResourcePath(resourcePath);
return GLOBALS.ASSET_DIR_PREFIX + resourcePath;
};
return {
/**
* Given a formatted URL, interpolates the URL by inserting values the URL
* needs using the interpolationValues object. For example, urlTemplate
* might be:
*
* /createhandler/resolved_answers/<exploration_id>/<escaped_state_name>
*
* interpolationValues is an object whose keys are variables within the URL.
* For the above example, interpolationValues may look something like:
*
* { 'exploration_id': '0', 'escaped_state_name': 'InputBinaryNumber' }
*
* If a URL requires a value which is not keyed within the
* interpolationValues object, this will return null.
*/
interpolateUrl: function(urlTemplate, interpolationValues) {
if (!urlTemplate) {
alertsService.fatalWarning(
'Invalid or empty URL template passed in: \'' +
new String(urlTemplate) + '\'');
return null;
}
// http://stackoverflow.com/questions/4775722
if (!(interpolationValues instanceof Object) || (
Object.prototype.toString.call(
interpolationValues) === '[object Array]')) {
alertsService.fatalWarning(
'Expected an object of interpolation values to be passed into ' +
'interpolateUrl.');
return null;
}
// Valid pattern: <alphanum>
var INTERPOLATION_VARIABLE_REGEX = /<(\w+)>/;
// Invalid patterns: <<stuff>>, <stuff>>>, <>
var EMPTY_VARIABLE_REGEX = /<>/;
var INVALID_VARIABLE_REGEX = /(<{2,})(\w*)(>{2,})/;
// Parameter values can only contain alphanumerical characters, spaces,
// hyphens or underscores.
var VALID_URL_PARAMETER_VALUE_REGEX = /^(\w| |_|-)+$/;
if (urlTemplate.match(INVALID_VARIABLE_REGEX) ||
urlTemplate.match(EMPTY_VARIABLE_REGEX)) {
alertsService.fatalWarning(
'Invalid URL template received: \'' + urlTemplate + '\'');
return null;
}
var escapedInterpolationValues = {};
for (var varName in interpolationValues) {
var value = interpolationValues[varName];
if (!_isString(value)) {
alertsService.fatalWarning(
'Parameters passed into interpolateUrl must be strings.');
return null;
}
// Ensure the value is valid.
if (!value.match(VALID_URL_PARAMETER_VALUE_REGEX)) {
alertsService.fatalWarning(
'Parameter values passed into interpolateUrl must only contain ' +
'alphanumerical characters, hyphens, underscores or spaces: \'' +
value + '\'');
return null;
}
escapedInterpolationValues[varName] = encodeURIComponent(value);
}
// Ensure the URL has no nested brackets (which would lead to indirection
// in the interpolated variables).
var filledUrl = angular.copy(urlTemplate);
var match = filledUrl.match(INTERPOLATION_VARIABLE_REGEX);
while (match) {
var varName = match[1];
if (!escapedInterpolationValues.hasOwnProperty(varName)) {
alertsService.fatalWarning('Expected variable \'' + varName +
'\' when interpolating URL.');
return null;
}
filledUrl = filledUrl.replace(
INTERPOLATION_VARIABLE_REGEX,
escapedInterpolationValues[varName]);
match = filledUrl.match(INTERPOLATION_VARIABLE_REGEX);
}
return filledUrl;
},
/**
* Given an resource path, returns the relative url path to that resource
* prefixing the appropriate cache_slug to it.
*/
getStaticResourceUrl: function(resourcePath) {
return getCachePrefixedUrl(resourcePath);
},
/**
* Given an image path, returns the complete url path to that image
* prefixing the appropriate cache_slug to it.
*/
getStaticImageUrl: function(imagePath) {
validateResourcePath(imagePath);
return getCachePrefixedUrl('/assets/images' + imagePath);
},
/**
* Given a gadget type, returns the complete url path to that
* gadget type image, prefixing the appropriate cache_slug to it.
*/
getGadgetImgUrl: function(gadgetType) {
if (!gadgetType) {
alertsService.fatalWarning(
'Empty gadgetType passed in getGadgetImgUrl.');
}
return getCachePrefixedUrl('/extensions/gadgets/' + gadgetType +
'/static/images/' + gadgetType + '.png');
},
/**
* Given an interaction id, returns the complete url path to the thumbnail
* image for the interaction, prefixing the appropriate cache_slug to it.
*/
getInteractionThumbnailImageUrl: function(interactionId) {
if (!interactionId) {
alertsService.fatalWarning(
'Empty interactionId passed in getInteractionThumbnailImageUrl.');
}
return getCachePrefixedUrl('/extensions/interactions/' +
interactionId + '/static/' + interactionId + '.png');
}
};
}]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
oppia.factory('expressionSyntaxTreeService', [
'$log', 'expressionParserService', 'PARAMETER_TYPES',
function($log, expressionParserService, PARAMETER_TYPES) {
// Exceptions that can be thrown from the evaluation of expressions.
var ExpressionError = function() {
};
ExpressionError.prototype = new Error();
ExpressionError.prototype.constructor = ExpressionError;
var ExprUndefinedVarError = function(varname, envs) {
this.varname = varname;
this.envs = envs;
};
ExprUndefinedVarError.prototype = new ExpressionError();
ExprUndefinedVarError.prototype.constructor = ExprUndefinedVarError;
ExprUndefinedVarError.prototype.name = 'ExprUndefinedVarError';
ExprUndefinedVarError.prototype.toString = function() {
return this.name + ': ' + this.varname + ' not found in ' + this.envs;
};
var ExprWrongNumArgsError = function(args, expectedMin, expectedMax) {
this.args = args;
this.expectedMin = expectedMin;
this.expectedMax = expectedMax;
};
ExprWrongNumArgsError.prototype = new ExpressionError();
ExprWrongNumArgsError.prototype.constructor = ExprWrongNumArgsError;
ExprWrongNumArgsError.prototype.name = 'ExprWrongNumArgsError';
ExprWrongNumArgsError.prototype.toString = function() {
return this.name + ': {' + this.args + '} not in range [' +
this.expectedMin + ',' + this.expectedMax + ']';
};
var ExprWrongArgTypeError = function(arg, actualType, expectedType) {
this.arg = arg;
this.actualType = actualType;
this.expectedType = expectedType;
};
ExprWrongArgTypeError.prototype = new ExpressionError();
ExprWrongArgTypeError.prototype.constructor = ExprWrongArgTypeError;
ExprWrongArgTypeError.prototype.name = 'ExprWrongArgTypeError';
ExprWrongArgTypeError.prototype.toString = function() {
if (this.arg === null) {
return this.name + ': Type ' + this.actualType +
' does not match expected type ' + this.expectedType;
}
return this.name + ': ' + this.arg + ' has type ' + this.actualType +
' which does not match expected type ' + this.expectedType;
};
var getParamsUsedInExpression = function(expression) {
var _findParams = function(parseTree) {
var paramsFound = [];
if (parseTree instanceof Array) {
if (parseTree[0] === '#') {
paramsFound.push(parseTree[1]);
} else {
for (var i = 1; i < parseTree.length; i++) {
paramsFound = paramsFound.concat(_findParams(parseTree[i]));
}
}
}
var uniqueParams = [];
for (var i = 0; i < paramsFound.length; i++) {
if (uniqueParams.indexOf(paramsFound[i]) === -1) {
uniqueParams.push(paramsFound[i]);
}
}
return uniqueParams.sort();
};
var parsed = expressionParserService.parse(expression);
return _findParams(parsed);
};
// Checks if the args array has the expectedNum number of elements and
// throws an error if not. If optional expectedMax is specified, it
// verifies the number of args is in [expectedNum, expectedMax] range
// inclusive.
var verifyNumArgs = function(args, expectedNum, expectedMax) {
if (expectedMax === undefined) {
expectedMax = expectedNum;
}
if (args.length >= expectedNum && args.length <= expectedMax) {
return;
}
throw new ExprWrongNumArgsError(args, expectedNum, expectedMax);
};
var _verifyArgTypesMatchExpectedType = function(argTypes, expectedType) {
for (var i = 0; i < argTypes.length; i++) {
if (argTypes[i] !== expectedType) {
throw new ExprWrongArgTypeError(null, argTypes[i], expectedType);
}
}
return true;
};
var _verifyArgTypesMatch = function(argType1, argType2) {
if (argType1 !== argType2) {
throw new ExprWrongArgTypeError(null, argType1, argType2);
}
return true;
};
var applyFunctionToParseTree = function(parsed, envs, func) {
return func(parsed, envs.concat(system));
};
/**
* Looks up a variable of the given name in the env. Here the variable
* can be system or user defined functions and parameters, as well as
* system operators.
* @param {string} name The name to look up.
* @param {!Array.<!Object>} envs Represents a nested name space
* environment to look up the name in. The first element is looked up
* first (i.e. has higher precedence).
* @throws {ExprUndefinedVarError} The named variable was not found in
* the given environment.
*/
var lookupEnvs = function(name, envs) {
// Parameter value look up.
var value;
if (envs.some(function(env) {
if (env.hasOwnProperty(name)) {
value = env[name];
return true;
}
return false;
})) {
return value;
}
throw new ExprUndefinedVarError(name, envs);
};
// Coerces the argument to a Number, and throws an error if the result
// is NaN.
var _coerceToNumber = function(originalValue) {
var coercedValue = (+originalValue);
if (!isNaN(coercedValue)) {
return coercedValue;
}
throw new ExprWrongArgTypeError(
originalValue, typeof originalValue, 'Number');
};
// Coerces all values in the given argument array to Number, and throws
// an error if the result is NaN.
var _coerceAllArgsToNumber = function(args) {
for (var i = 0; i < args.length; i++) {
args[i] = _coerceToNumber(args[i]);
}
return args;
};
// NOTE TO DEVELOPERS: When adding a new reserved word to this object,
// please first ensure that existing explorations do not use this
// parameter name. Also, to prevent future explorations using it,
// modify feconf.INVALID_PARAMETER_NAMES accordingly.
// TODO(kashida): Document all operators input and output contracts.
// Arguments:
// args: for eval(): list of values of the evaluated sub-expression
// for getType(): list of types of the evaluated sub-expression
var system = {
'+': {
eval: function(args) {
verifyNumArgs(args, 1, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs.length === 1 ? numericArgs[0] :
numericArgs[0] + numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 1, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'-': {
eval: function(args) {
verifyNumArgs(args, 1, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs.length === 1 ? -numericArgs[0] :
numericArgs[0] - numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 1, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'*': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] * numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'/': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] / numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'%': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] % numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'<=': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] <= numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'>=': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] >= numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'<': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] < numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'>': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return numericArgs[0] > numericArgs[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'!': {
eval: function(args) {
verifyNumArgs(args, 1);
return !args[0];
},
getType: function(args) {
verifyNumArgs(args, 1);
_verifyArgTypesMatchExpectedType(
args, PARAMETER_TYPES.UNICODE_STRING);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'==': {
eval: function(args) {
verifyNumArgs(args, 2);
return args[0] === args[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'!=': {
eval: function(args) {
verifyNumArgs(args, 2);
return args[0] !== args[1];
},
getType: function(args) {
verifyNumArgs(args, 2);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'&&': {
eval: function(args) {
// TODO(kashida): Make this short-circuit.
verifyNumArgs(args, 2);
return Boolean(args[0] && args[1]);
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(
args, PARAMETER_TYPES.UNICODE_STRING);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
'||': {
eval: function(args) {
// TODO(kashida): Make this short-circuit.
verifyNumArgs(args, 2);
return Boolean(args[0] || args[1]);
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(
args, PARAMETER_TYPES.UNICODE_STRING);
return PARAMETER_TYPES.UNICODE_STRING;
}
},
// Note that removing quotation marks from this key causes issues with
// minification (when running the deployment scripts).
// jscs:disable disallowQuotedKeysInObjects
'if': {
eval: function(args) {
// TODO(kashida): Make this short-circuit.
verifyNumArgs(args, 3);
return args[0] ? args[1] : args[2];
},
getType: function(args) {
verifyNumArgs(args, 3);
_verifyArgTypesMatchExpectedType(
[args[0]], PARAMETER_TYPES.UNICODE_STRING);
_verifyArgTypesMatch(args[1], args[2]);
return args[1];
}
},
'floor': {
eval: function(args) {
verifyNumArgs(args, 1);
var numericArgs = _coerceAllArgsToNumber(args);
return Math.floor(numericArgs[0]);
},
getType: function(args) {
verifyNumArgs(args, 1);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'pow': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return Math.pow(args[0], args[1]);
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'log': {
eval: function(args) {
verifyNumArgs(args, 2);
var numericArgs = _coerceAllArgsToNumber(args);
return Math.log(numericArgs[0]) / Math.log(numericArgs[1]);
},
getType: function(args) {
verifyNumArgs(args, 2);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
},
'abs': {
eval: function(args) {
verifyNumArgs(args, 1);
var numericArgs = _coerceAllArgsToNumber(args);
return Math.abs(numericArgs[0]);
},
getType: function(args) {
verifyNumArgs(args, 1);
_verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL);
return PARAMETER_TYPES.REAL;
}
}
// jscs:enable disallowQuotedKeysInObjects
};
return {
ExpressionError: ExpressionError,
ExprUndefinedVarError: ExprUndefinedVarError,
ExprWrongNumArgsError: ExprWrongNumArgsError,
ExprWrongArgTypeError: ExprWrongArgTypeError,
applyFunctionToParseTree: applyFunctionToParseTree,
getParamsUsedInExpression: getParamsUsedInExpression,
lookupEnvs: lookupEnvs
};
}
]);
})();
(function() {// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This file defines the evaluation engine as well as the system operators.
// The evaluator takes the output of the parser (i.e. parse tree) as defined in
// parser.pegjs and produces a javaScript primitive value when the evaluation is
// performed correctly.
// Two cases that can throw an exception (i.e. an Error object):
// - Variable look-up ('#' operator) failure. (ExprUndefinedVarError)
// - Wrong number of arguments in the node for the given operator.
// (ExprWrongNumArgsError)
// Both errors are children of ExpressionError, so caller can use
// ExpressionError to catch only these expected error cases.
//
// An expression is evaluated in a context consisting of predefined system
// variables, system operators, and system functions. In the input language,
// operators are predefined set of characters in infix, postfix, or ternary
// format (there is currently no postfix operators) while functions have the
// form of function calls (e.g. "abs(10)"). In the parse tree, there is no
// difference between operators and functions. User defined parameters may
// override the meaning of system variables and functions (but not operators).
// Users also can define parameters with new names. Referencing a variable which
// is not defined as a system variable, system function, or user parameter will
// result in ExprUndefinedVarError to be thrown.
//
// All system variables, system operators, and system functions are defined
// as 'system' variable in this file.
//
// TODO(kashida): Split the following section into two:
// - A general overview of operators (including some concrete examples)
// - A numbered sequence of steps which a new contributor should follow in
// order to define a new operator.
// Defining new operators and functions:
// Operators and functions are given an array of arguments which are already all
// evaluated. E.g. for an expression "1 + 2 * 3", the "+" plus operator receives
// values 1 and 6 (i.e. "2 * 3" already evaluated).
// The operators and functions should verify that the argument array
// has the required number of arguments. Operators and functions can coerse the
// input arguments to the desired typed values, or throw an exception if wrong
// type of argument is given.
// type of inputs. This does not prevent operators to eror on wrong parameter
// values (e.g. getting negative number for an index).
// When successful, operators and functions may return any valid JavaScript
// values. In general, an operator always returns the same type of value, but
// there are exceptions (e.g. "+" operator may return a number or a string
// depending on the types of the input arguments).
// Constraints on the input arguments (number, types, and any other
// constraints) as well as the output value and type should be documented.
// Service for expression evaluation.
oppia.factory('expressionEvaluatorService', [
'$log', 'expressionParserService', 'expressionSyntaxTreeService',
function($log, expressionParserService, expressionSyntaxTreeService) {
var evaluateExpression = function(expression, envs) {
return expressionSyntaxTreeService.applyFunctionToParseTree(
expressionParserService.parse(expression), envs, evaluate);
};
/**
* @param {*} parsed Parse output from the parser. See parser.pegjs for
* the data structure.
* @param {!Array.<!Object>} envs Represents a nested name space
* environment to look up the name in. The first element is looked up
* first (i.e. has higher precedence).
*/
var evaluate = function(parsed, envs) {
// The intermediate nodes of the parse tree are arrays. The terminal
// nodes are JavaScript primitives (as described in the "Parser output"
// section of parser.pegjs).
if (parsed instanceof Array) {
if (parsed.length === 0) {
throw 'Parser generated an intermediate node with zero children';
}
if (parsed[0] === '#') {
return expressionSyntaxTreeService.lookupEnvs(parsed[1], envs);
}
// Evaluate rest of the elements, i.e. the arguments.
var args = parsed.slice(1).map(function(item) {
return evaluate(item, envs);
});
// The first element should be a function name.
return expressionSyntaxTreeService.lookupEnvs(
parsed[0], envs).eval(args);
}
// This should be a terminal node with the actual value.
return parsed;
};
var validateExpression = function(expression, envs) {
try {
return validate(expressionParserService.parse(expression),
envs.concat(system));
} catch (err) {
return false;
}
};
/**
* @param {*} parsed Parse output from the parser. See parser.pegjs for
* the data structure.
* @param {!Array.<!Object>} envs Represents a nested name space
* environment to look up the name in. The first element is looked
* up first (i.e. has higher precedence).
* @return {boolean} True when validation succeeds.
*/
var validate = function(parsed, envs) {
if (!(parsed instanceof Array)) {
return true;
}
if (parsed.length === 0) {
// This should not happen.
return false;
}
// Make sure we can find the operator.
expressionSyntaxTreeService.lookupEnvs(parsed[0], envs);
// Evaluate rest of the elements, i.e. the arguments.
var args = parsed.slice(1).map(function(item) {
return validate(item, envs);
});
// If it is a name look up, make sure the name exists.
// TODO: Validate args for other operators.
if (parsed[0] === '#') {
expressionSyntaxTreeService.lookupEnvs(parsed[1], envs);
}
return true;
};
return {
evaluate: evaluate,
evaluateExpression: evaluateExpression,
validate: validate,
validateExpression: validateExpression
};
}
]);
})();
(function() {oppia.factory('expressionParserService', ['$log', function($log) {
/*
* Generated by PEG.js 0.8.0.
*
* http://pegjs.majda.cz/
*/
function peg$subclass(child, parent) {
function ctor() { this.constructor = child; }
ctor.prototype = parent.prototype;
child.prototype = new ctor();
}
function SyntaxError(message, expected, found, offset, line, column) {
this.message = message;
this.expected = expected;
this.found = found;
this.offset = offset;
this.line = line;
this.column = column;
this.name = "SyntaxError";
}
peg$subclass(SyntaxError, Error);
function parse(input) {
var options = arguments.length > 1 ? arguments[1] : {},
peg$FAILED = {},
peg$startRuleFunctions = { start: peg$parsestart },
peg$startRuleFunction = peg$parsestart,
peg$c0 = peg$FAILED,
peg$c1 = function(expression) { return expression; },
peg$c2 = { type: "any", description: "any character" },
peg$c3 = { type: "other", description: "whitespace" },
peg$c4 = /^[\t\x0B\f \xA0\uFEFF]/,
peg$c5 = { type: "class", value: "[\\t\\x0B\\f \\xA0\\uFEFF]", description: "[\\t\\x0B\\f \\xA0\\uFEFF]" },
peg$c6 = { type: "other", description: "identifier" },
peg$c7 = void 0,
peg$c8 = function(name) { return name; },
peg$c9 = [],
peg$c10 = function(start, parts) {
return start + parts.join("");
},
peg$c11 = "$",
peg$c12 = { type: "literal", value: "$", description: "\"$\"" },
peg$c13 = "_",
peg$c14 = { type: "literal", value: "_", description: "\"_\"" },
peg$c15 = "\\",
peg$c16 = { type: "literal", value: "\\", description: "\"\\\\\"" },
peg$c17 = function(sequence) { return sequence; },
peg$c18 = "\u200C",
peg$c19 = { type: "literal", value: "\u200C", description: "\"\\u200C\"" },
peg$c20 = function() { return "\u200C"; },
peg$c21 = "\u200D",
peg$c22 = { type: "literal", value: "\u200D", description: "\"\\u200D\"" },
peg$c23 = function() { return "\u200D"; },
peg$c24 = "null",
peg$c25 = { type: "literal", value: "null", description: "\"null\"" },
peg$c26 = function() { return null; },
peg$c27 = "false",
peg$c28 = { type: "literal", value: "false", description: "\"false\"" },
peg$c29 = function() { return false; },
peg$c30 = "true",
peg$c31 = { type: "literal", value: "true", description: "\"true\"" },
peg$c32 = function() { return true; },
peg$c33 = { type: "other", description: "number" },
peg$c34 = function(literal) {
return literal;
},
peg$c35 = ".",
peg$c36 = { type: "literal", value: ".", description: "\".\"" },
peg$c37 = null,
peg$c38 = function(parts) {
return parseFloat(parts);
},
peg$c39 = function(parts) { return parseFloat(parts); },
peg$c40 = "0",
peg$c41 = { type: "literal", value: "0", description: "\"0\"" },
peg$c42 = /^[0-9]/,
peg$c43 = { type: "class", value: "[0-9]", description: "[0-9]" },
peg$c44 = /^[1-9]/,
peg$c45 = { type: "class", value: "[1-9]", description: "[1-9]" },
peg$c46 = /^[eE]/,
peg$c47 = { type: "class", value: "[eE]", description: "[eE]" },
peg$c48 = /^[\-+]/,
peg$c49 = { type: "class", value: "[\\-+]", description: "[\\-+]" },
peg$c50 = /^[xX]/,
peg$c51 = { type: "class", value: "[xX]", description: "[xX]" },
peg$c52 = function(digits) { return parseInt(digits, 16); },
peg$c53 = /^[0-9a-fA-F]/,
peg$c54 = { type: "class", value: "[0-9a-fA-F]", description: "[0-9a-fA-F]" },
peg$c55 = { type: "other", description: "string" },
peg$c56 = "\"",
peg$c57 = { type: "literal", value: "\"", description: "\"\\\"\"" },
peg$c58 = "'",
peg$c59 = { type: "literal", value: "'", description: "\"'\"" },
peg$c60 = function(parts) {
return parts[1];
},
peg$c61 = function(chars) { return chars.join(""); },
peg$c62 = function(char_) { return char_; },
peg$c63 = function(sequence) { return sequence; },
peg$c64 = function() { return "\0"; },
peg$c65 = /^['"\\bfnrtv]/,
peg$c66 = { type: "class", value: "['\"\\\\bfnrtv]", description: "['\"\\\\bfnrtv]" },
peg$c67 = function(char_) {
return char_
.replace("b", "\b")
.replace("f", "\f")
.replace("n", "\n")
.replace("r", "\r")
.replace("t", "\t")
.replace("v", "\x0B") // IE does not recognize "\v".
},
peg$c68 = function(char_) { return char_; },
peg$c69 = "x",
peg$c70 = { type: "literal", value: "x", description: "\"x\"" },
peg$c71 = "u",
peg$c72 = { type: "literal", value: "u", description: "\"u\"" },
peg$c73 = function(digits) {
return String.fromCharCode(parseInt(digits, 16));
},
peg$c74 = /^[abcdefghijklmnopqrstuvwxyz\xAA\xB5\xBA\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E\u017F\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199\u019A\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD\u01BE\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025A\u025B\u025C\u025D\u025E\u025F\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026A\u026B\u026C\u026D\u026E\u026F\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027A\u027B\u027C\u027D\u027E\u027F\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028A\u028B\u028C\u028D\u028E\u028F\u0290\u0291\u0292\u0293\u0295\u0296\u0297\u0298\u0299\u029A\u029B\u029C\u029D\u029E\u029F\u02A0\u02A1\u02A2\u02A3\u02A4\u02A5\u02A6\u02A7\u02A8\u02A9\u02AA\u02AB\u02AC\u02AD\u02AE\u02AF\u0371\u0373\u0377\u037B\u037C\u037D\u0390\u03AC\u03AD\u03AE\u03AF\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\u03D0\u03D1\u03D5\u03D6\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF\u03F0\u03F1\u03F2\u03F3\u03F5\u03F8\u03FB\u03FC\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u045D\u045E\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056A\u056B\u056C\u056D\u056E\u056F\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057A\u057B\u057C\u057D\u057E\u057F\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1D00\u1D01\u1D02\u1D03\u1D04\u1D05\u1D06\u1D07\u1D08\u1D09\u1D0A\u1D0B\u1D0C\u1D0D\u1D0E\u1D0F\u1D10\u1D11\u1D12\u1D13\u1D14\u1D15\u1D16\u1D17\u1D18\u1D19\u1D1A\u1D1B\u1D1C\u1D1D\u1D1E\u1D1F\u1D20\u1D21\u1D22\u1D23\u1D24\u1D25\u1D26\u1D27\u1D28\u1D29\u1D2A\u1D2B\u1D62\u1D63\u1D64\u1D65\u1D66\u1D67\u1D68\u1D69\u1D6A\u1D6B\u1D6C\u1D6D\u1D6E\u1D6F\u1D70\u1D71\u1D72\u1D73\u1D74\u1D75\u1D76\u1D77\u1D79\u1D7A\u1D7B\u1D7C\u1D7D\u1D7E\u1D7F\u1D80\u1D81\u1D82\u1D83\u1D84\u1D85\u1D86\u1D87\u1D88\u1D89\u1D8A\u1D8B\u1D8C\u1D8D\u1D8E\u1D8F\u1D90\u1D91\u1D92\u1D93\u1D94\u1D95\u1D96\u1D97\u1D98\u1D99\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95\u1E96\u1E97\u1E98\u1E99\u1E9A\u1E9B\u1E9C\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF\u1F00\u1F01\u1F02\u1F03\u1F04\u1F05\u1F06\u1F07\u1F10\u1F11\u1F12\u1F13\u1F14\u1F15\u1F20\u1F21\u1F22\u1F23\u1F24\u1F25\u1F26\u1F27\u1F30\u1F31\u1F32\u1F33\u1F34\u1F35\u1F36\u1F37\u1F40\u1F41\u1F42\u1F43\u1F44\u1F45\u1F50\u1F51\u1F52\u1F53\u1F54\u1F55\u1F56\u1F57\u1F60\u1F61\u1F62\u1F63\u1F64\u1F65\u1F66\u1F67\u1F70\u1F71\u1F72\u1F73\u1F74\u1F75\u1F76\u1F77\u1F78\u1F79\u1F7A\u1F7B\u1F7C\u1F7D\u1F80\u1F81\u1F82\u1F83\u1F84\u1F85\u1F86\u1F87\u1F90\u1F91\u1F92\u1F93\u1F94\u1F95\u1F96\u1F97\u1FA0\u1FA1\u1FA2\u1FA3\u1FA4\u1FA5\u1FA6\u1FA7\u1FB0\u1FB1\u1FB2\u1FB3\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2\u1FC3\u1FC4\u1FC6\u1FC7\u1FD0\u1FD1\u1FD2\u1FD3\u1FD6\u1FD7\u1FE0\u1FE1\u1FE2\u1FE3\u1FE4\u1FE5\u1FE6\u1FE7\u1FF2\u1FF3\u1FF4\u1FF6\u1FF7\u2071\u207F\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146\u2147\u2148\u2149\u214E\u2184\u2C30\u2C31\u2C32\u2C33\u2C34\u2C35\u2C36\u2C37\u2C38\u2C39\u2C3A\u2C3B\u2C3C\u2C3D\u2C3E\u2C3F\u2C40\u2C41\u2C42\u2C43\u2C44\u2C45\u2C46\u2C47\u2C48\u2C49\u2C4A\u2C4B\u2C4C\u2C4D\u2C4E\u2C4F\u2C50\u2C51\u2C52\u2C53\u2C54\u2C55\u2C56\u2C57\u2C58\u2C59\u2C5A\u2C5B\u2C5C\u2C5D\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76\u2C77\u2C78\u2C79\u2C7A\u2C7B\u2C7C\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2D00\u2D01\u2D02\u2D03\u2D04\u2D05\u2D06\u2D07\u2D08\u2D09\u2D0A\u2D0B\u2D0C\u2D0D\u2D0E\u2D0F\u2D10\u2D11\u2D12\u2D13\u2D14\u2D15\u2D16\u2D17\u2D18\u2D19\u2D1A\u2D1B\u2D1C\u2D1D\u2D1E\u2D1F\u2D20\u2D21\u2D22\u2D23\u2D24\u2D25\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F\uA730\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771\uA772\uA773\uA774\uA775\uA776\uA777\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uFB00\uFB01\uFB02\uFB03\uFB04\uFB05\uFB06\uFB13\uFB14\uFB15\uFB16\uFB17\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A]/,
peg$c75 = { type: "class", value: "[abcdefghijklmnopqrstuvwxyz\\xAA\\xB5\\xBA\\xDF\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E\\u017F\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199\\u019A\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD\\u01BE\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233\\u0234\\u0235\\u0236\\u0237\\u0238\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F\\u0250\\u0251\\u0252\\u0253\\u0254\\u0255\\u0256\\u0257\\u0258\\u0259\\u025A\\u025B\\u025C\\u025D\\u025E\\u025F\\u0260\\u0261\\u0262\\u0263\\u0264\\u0265\\u0266\\u0267\\u0268\\u0269\\u026A\\u026B\\u026C\\u026D\\u026E\\u026F\\u0270\\u0271\\u0272\\u0273\\u0274\\u0275\\u0276\\u0277\\u0278\\u0279\\u027A\\u027B\\u027C\\u027D\\u027E\\u027F\\u0280\\u0281\\u0282\\u0283\\u0284\\u0285\\u0286\\u0287\\u0288\\u0289\\u028A\\u028B\\u028C\\u028D\\u028E\\u028F\\u0290\\u0291\\u0292\\u0293\\u0295\\u0296\\u0297\\u0298\\u0299\\u029A\\u029B\\u029C\\u029D\\u029E\\u029F\\u02A0\\u02A1\\u02A2\\u02A3\\u02A4\\u02A5\\u02A6\\u02A7\\u02A8\\u02A9\\u02AA\\u02AB\\u02AC\\u02AD\\u02AE\\u02AF\\u0371\\u0373\\u0377\\u037B\\u037C\\u037D\\u0390\\u03AC\\u03AD\\u03AE\\u03AF\\u03B0\\u03B1\\u03B2\\u03B3\\u03B4\\u03B5\\u03B6\\u03B7\\u03B8\\u03B9\\u03BA\\u03BB\\u03BC\\u03BD\\u03BE\\u03BF\\u03C0\\u03C1\\u03C2\\u03C3\\u03C4\\u03C5\\u03C6\\u03C7\\u03C8\\u03C9\\u03CA\\u03CB\\u03CC\\u03CD\\u03CE\\u03D0\\u03D1\\u03D5\\u03D6\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF\\u03F0\\u03F1\\u03F2\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043A\\u043B\\u043C\\u043D\\u043E\\u043F\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044A\\u044B\\u044C\\u044D\\u044E\\u044F\\u0450\\u0451\\u0452\\u0453\\u0454\\u0455\\u0456\\u0457\\u0458\\u0459\\u045A\\u045B\\u045C\\u045D\\u045E\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0561\\u0562\\u0563\\u0564\\u0565\\u0566\\u0567\\u0568\\u0569\\u056A\\u056B\\u056C\\u056D\\u056E\\u056F\\u0570\\u0571\\u0572\\u0573\\u0574\\u0575\\u0576\\u0577\\u0578\\u0579\\u057A\\u057B\\u057C\\u057D\\u057E\\u057F\\u0580\\u0581\\u0582\\u0583\\u0584\\u0585\\u0586\\u0587\\u1D00\\u1D01\\u1D02\\u1D03\\u1D04\\u1D05\\u1D06\\u1D07\\u1D08\\u1D09\\u1D0A\\u1D0B\\u1D0C\\u1D0D\\u1D0E\\u1D0F\\u1D10\\u1D11\\u1D12\\u1D13\\u1D14\\u1D15\\u1D16\\u1D17\\u1D18\\u1D19\\u1D1A\\u1D1B\\u1D1C\\u1D1D\\u1D1E\\u1D1F\\u1D20\\u1D21\\u1D22\\u1D23\\u1D24\\u1D25\\u1D26\\u1D27\\u1D28\\u1D29\\u1D2A\\u1D2B\\u1D62\\u1D63\\u1D64\\u1D65\\u1D66\\u1D67\\u1D68\\u1D69\\u1D6A\\u1D6B\\u1D6C\\u1D6D\\u1D6E\\u1D6F\\u1D70\\u1D71\\u1D72\\u1D73\\u1D74\\u1D75\\u1D76\\u1D77\\u1D79\\u1D7A\\u1D7B\\u1D7C\\u1D7D\\u1D7E\\u1D7F\\u1D80\\u1D81\\u1D82\\u1D83\\u1D84\\u1D85\\u1D86\\u1D87\\u1D88\\u1D89\\u1D8A\\u1D8B\\u1D8C\\u1D8D\\u1D8E\\u1D8F\\u1D90\\u1D91\\u1D92\\u1D93\\u1D94\\u1D95\\u1D96\\u1D97\\u1D98\\u1D99\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95\\u1E96\\u1E97\\u1E98\\u1E99\\u1E9A\\u1E9B\\u1E9C\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF\\u1F00\\u1F01\\u1F02\\u1F03\\u1F04\\u1F05\\u1F06\\u1F07\\u1F10\\u1F11\\u1F12\\u1F13\\u1F14\\u1F15\\u1F20\\u1F21\\u1F22\\u1F23\\u1F24\\u1F25\\u1F26\\u1F27\\u1F30\\u1F31\\u1F32\\u1F33\\u1F34\\u1F35\\u1F36\\u1F37\\u1F40\\u1F41\\u1F42\\u1F43\\u1F44\\u1F45\\u1F50\\u1F51\\u1F52\\u1F53\\u1F54\\u1F55\\u1F56\\u1F57\\u1F60\\u1F61\\u1F62\\u1F63\\u1F64\\u1F65\\u1F66\\u1F67\\u1F70\\u1F71\\u1F72\\u1F73\\u1F74\\u1F75\\u1F76\\u1F77\\u1F78\\u1F79\\u1F7A\\u1F7B\\u1F7C\\u1F7D\\u1F80\\u1F81\\u1F82\\u1F83\\u1F84\\u1F85\\u1F86\\u1F87\\u1F90\\u1F91\\u1F92\\u1F93\\u1F94\\u1F95\\u1F96\\u1F97\\u1FA0\\u1FA1\\u1FA2\\u1FA3\\u1FA4\\u1FA5\\u1FA6\\u1FA7\\u1FB0\\u1FB1\\u1FB2\\u1FB3\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2\\u1FC3\\u1FC4\\u1FC6\\u1FC7\\u1FD0\\u1FD1\\u1FD2\\u1FD3\\u1FD6\\u1FD7\\u1FE0\\u1FE1\\u1FE2\\u1FE3\\u1FE4\\u1FE5\\u1FE6\\u1FE7\\u1FF2\\u1FF3\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146\\u2147\\u2148\\u2149\\u214E\\u2184\\u2C30\\u2C31\\u2C32\\u2C33\\u2C34\\u2C35\\u2C36\\u2C37\\u2C38\\u2C39\\u2C3A\\u2C3B\\u2C3C\\u2C3D\\u2C3E\\u2C3F\\u2C40\\u2C41\\u2C42\\u2C43\\u2C44\\u2C45\\u2C46\\u2C47\\u2C48\\u2C49\\u2C4A\\u2C4B\\u2C4C\\u2C4D\\u2C4E\\u2C4F\\u2C50\\u2C51\\u2C52\\u2C53\\u2C54\\u2C55\\u2C56\\u2C57\\u2C58\\u2C59\\u2C5A\\u2C5B\\u2C5C\\u2C5D\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76\\u2C77\\u2C78\\u2C79\\u2C7A\\u2C7B\\u2C7C\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2D00\\u2D01\\u2D02\\u2D03\\u2D04\\u2D05\\u2D06\\u2D07\\u2D08\\u2D09\\u2D0A\\u2D0B\\u2D0C\\u2D0D\\u2D0E\\u2D0F\\u2D10\\u2D11\\u2D12\\u2D13\\u2D14\\u2D15\\u2D16\\u2D17\\u2D18\\u2D19\\u2D1A\\u2D1B\\u2D1C\\u2D1D\\u2D1E\\u2D1F\\u2D20\\u2D21\\u2D22\\u2D23\\u2D24\\u2D25\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F\\uA730\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771\\uA772\\uA773\\uA774\\uA775\\uA776\\uA777\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uFB00\\uFB01\\uFB02\\uFB03\\uFB04\\uFB05\\uFB06\\uFB13\\uFB14\\uFB15\\uFB16\\uFB17\\uFF41\\uFF42\\uFF43\\uFF44\\uFF45\\uFF46\\uFF47\\uFF48\\uFF49\\uFF4A\\uFF4B\\uFF4C\\uFF4D\\uFF4E\\uFF4F\\uFF50\\uFF51\\uFF52\\uFF53\\uFF54\\uFF55\\uFF56\\uFF57\\uFF58\\uFF59\\uFF5A]", description: "[abcdefghijklmnopqrstuvwxyz\\xAA\\xB5\\xBA\\xDF\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E\\u017F\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199\\u019A\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD\\u01BE\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233\\u0234\\u0235\\u0236\\u0237\\u0238\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F\\u0250\\u0251\\u0252\\u0253\\u0254\\u0255\\u0256\\u0257\\u0258\\u0259\\u025A\\u025B\\u025C\\u025D\\u025E\\u025F\\u0260\\u0261\\u0262\\u0263\\u0264\\u0265\\u0266\\u0267\\u0268\\u0269\\u026A\\u026B\\u026C\\u026D\\u026E\\u026F\\u0270\\u0271\\u0272\\u0273\\u0274\\u0275\\u0276\\u0277\\u0278\\u0279\\u027A\\u027B\\u027C\\u027D\\u027E\\u027F\\u0280\\u0281\\u0282\\u0283\\u0284\\u0285\\u0286\\u0287\\u0288\\u0289\\u028A\\u028B\\u028C\\u028D\\u028E\\u028F\\u0290\\u0291\\u0292\\u0293\\u0295\\u0296\\u0297\\u0298\\u0299\\u029A\\u029B\\u029C\\u029D\\u029E\\u029F\\u02A0\\u02A1\\u02A2\\u02A3\\u02A4\\u02A5\\u02A6\\u02A7\\u02A8\\u02A9\\u02AA\\u02AB\\u02AC\\u02AD\\u02AE\\u02AF\\u0371\\u0373\\u0377\\u037B\\u037C\\u037D\\u0390\\u03AC\\u03AD\\u03AE\\u03AF\\u03B0\\u03B1\\u03B2\\u03B3\\u03B4\\u03B5\\u03B6\\u03B7\\u03B8\\u03B9\\u03BA\\u03BB\\u03BC\\u03BD\\u03BE\\u03BF\\u03C0\\u03C1\\u03C2\\u03C3\\u03C4\\u03C5\\u03C6\\u03C7\\u03C8\\u03C9\\u03CA\\u03CB\\u03CC\\u03CD\\u03CE\\u03D0\\u03D1\\u03D5\\u03D6\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF\\u03F0\\u03F1\\u03F2\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043A\\u043B\\u043C\\u043D\\u043E\\u043F\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044A\\u044B\\u044C\\u044D\\u044E\\u044F\\u0450\\u0451\\u0452\\u0453\\u0454\\u0455\\u0456\\u0457\\u0458\\u0459\\u045A\\u045B\\u045C\\u045D\\u045E\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0561\\u0562\\u0563\\u0564\\u0565\\u0566\\u0567\\u0568\\u0569\\u056A\\u056B\\u056C\\u056D\\u056E\\u056F\\u0570\\u0571\\u0572\\u0573\\u0574\\u0575\\u0576\\u0577\\u0578\\u0579\\u057A\\u057B\\u057C\\u057D\\u057E\\u057F\\u0580\\u0581\\u0582\\u0583\\u0584\\u0585\\u0586\\u0587\\u1D00\\u1D01\\u1D02\\u1D03\\u1D04\\u1D05\\u1D06\\u1D07\\u1D08\\u1D09\\u1D0A\\u1D0B\\u1D0C\\u1D0D\\u1D0E\\u1D0F\\u1D10\\u1D11\\u1D12\\u1D13\\u1D14\\u1D15\\u1D16\\u1D17\\u1D18\\u1D19\\u1D1A\\u1D1B\\u1D1C\\u1D1D\\u1D1E\\u1D1F\\u1D20\\u1D21\\u1D22\\u1D23\\u1D24\\u1D25\\u1D26\\u1D27\\u1D28\\u1D29\\u1D2A\\u1D2B\\u1D62\\u1D63\\u1D64\\u1D65\\u1D66\\u1D67\\u1D68\\u1D69\\u1D6A\\u1D6B\\u1D6C\\u1D6D\\u1D6E\\u1D6F\\u1D70\\u1D71\\u1D72\\u1D73\\u1D74\\u1D75\\u1D76\\u1D77\\u1D79\\u1D7A\\u1D7B\\u1D7C\\u1D7D\\u1D7E\\u1D7F\\u1D80\\u1D81\\u1D82\\u1D83\\u1D84\\u1D85\\u1D86\\u1D87\\u1D88\\u1D89\\u1D8A\\u1D8B\\u1D8C\\u1D8D\\u1D8E\\u1D8F\\u1D90\\u1D91\\u1D92\\u1D93\\u1D94\\u1D95\\u1D96\\u1D97\\u1D98\\u1D99\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95\\u1E96\\u1E97\\u1E98\\u1E99\\u1E9A\\u1E9B\\u1E9C\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF\\u1F00\\u1F01\\u1F02\\u1F03\\u1F04\\u1F05\\u1F06\\u1F07\\u1F10\\u1F11\\u1F12\\u1F13\\u1F14\\u1F15\\u1F20\\u1F21\\u1F22\\u1F23\\u1F24\\u1F25\\u1F26\\u1F27\\u1F30\\u1F31\\u1F32\\u1F33\\u1F34\\u1F35\\u1F36\\u1F37\\u1F40\\u1F41\\u1F42\\u1F43\\u1F44\\u1F45\\u1F50\\u1F51\\u1F52\\u1F53\\u1F54\\u1F55\\u1F56\\u1F57\\u1F60\\u1F61\\u1F62\\u1F63\\u1F64\\u1F65\\u1F66\\u1F67\\u1F70\\u1F71\\u1F72\\u1F73\\u1F74\\u1F75\\u1F76\\u1F77\\u1F78\\u1F79\\u1F7A\\u1F7B\\u1F7C\\u1F7D\\u1F80\\u1F81\\u1F82\\u1F83\\u1F84\\u1F85\\u1F86\\u1F87\\u1F90\\u1F91\\u1F92\\u1F93\\u1F94\\u1F95\\u1F96\\u1F97\\u1FA0\\u1FA1\\u1FA2\\u1FA3\\u1FA4\\u1FA5\\u1FA6\\u1FA7\\u1FB0\\u1FB1\\u1FB2\\u1FB3\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2\\u1FC3\\u1FC4\\u1FC6\\u1FC7\\u1FD0\\u1FD1\\u1FD2\\u1FD3\\u1FD6\\u1FD7\\u1FE0\\u1FE1\\u1FE2\\u1FE3\\u1FE4\\u1FE5\\u1FE6\\u1FE7\\u1FF2\\u1FF3\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146\\u2147\\u2148\\u2149\\u214E\\u2184\\u2C30\\u2C31\\u2C32\\u2C33\\u2C34\\u2C35\\u2C36\\u2C37\\u2C38\\u2C39\\u2C3A\\u2C3B\\u2C3C\\u2C3D\\u2C3E\\u2C3F\\u2C40\\u2C41\\u2C42\\u2C43\\u2C44\\u2C45\\u2C46\\u2C47\\u2C48\\u2C49\\u2C4A\\u2C4B\\u2C4C\\u2C4D\\u2C4E\\u2C4F\\u2C50\\u2C51\\u2C52\\u2C53\\u2C54\\u2C55\\u2C56\\u2C57\\u2C58\\u2C59\\u2C5A\\u2C5B\\u2C5C\\u2C5D\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76\\u2C77\\u2C78\\u2C79\\u2C7A\\u2C7B\\u2C7C\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2D00\\u2D01\\u2D02\\u2D03\\u2D04\\u2D05\\u2D06\\u2D07\\u2D08\\u2D09\\u2D0A\\u2D0B\\u2D0C\\u2D0D\\u2D0E\\u2D0F\\u2D10\\u2D11\\u2D12\\u2D13\\u2D14\\u2D15\\u2D16\\u2D17\\u2D18\\u2D19\\u2D1A\\u2D1B\\u2D1C\\u2D1D\\u2D1E\\u2D1F\\u2D20\\u2D21\\u2D22\\u2D23\\u2D24\\u2D25\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F\\uA730\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771\\uA772\\uA773\\uA774\\uA775\\uA776\\uA777\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uFB00\\uFB01\\uFB02\\uFB03\\uFB04\\uFB05\\uFB06\\uFB13\\uFB14\\uFB15\\uFB16\\uFB17\\uFF41\\uFF42\\uFF43\\uFF44\\uFF45\\uFF46\\uFF47\\uFF48\\uFF49\\uFF4A\\uFF4B\\uFF4C\\uFF4D\\uFF4E\\uFF4F\\uFF50\\uFF51\\uFF52\\uFF53\\uFF54\\uFF55\\uFF56\\uFF57\\uFF58\\uFF59\\uFF5A]" },
peg$c76 = /^[\u02B0\u02B1\u02B2\u02B3\u02B4\u02B5\u02B6\u02B7\u02B8\u02B9\u02BA\u02BB\u02BC\u02BD\u02BE\u02BF\u02C0\u02C1\u02C6\u02C7\u02C8\u02C9\u02CA\u02CB\u02CC\u02CD\u02CE\u02CF\u02D0\u02D1\u02E0\u02E1\u02E2\u02E3\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1C78\u1C79\u1C7A\u1C7B\u1C7C\u1C7D\u1D2C\u1D2D\u1D2E\u1D2F\u1D30\u1D31\u1D32\u1D33\u1D34\u1D35\u1D36\u1D37\u1D38\u1D39\u1D3A\u1D3B\u1D3C\u1D3D\u1D3E\u1D3F\u1D40\u1D41\u1D42\u1D43\u1D44\u1D45\u1D46\u1D47\u1D48\u1D49\u1D4A\u1D4B\u1D4C\u1D4D\u1D4E\u1D4F\u1D50\u1D51\u1D52\u1D53\u1D54\u1D55\u1D56\u1D57\u1D58\u1D59\u1D5A\u1D5B\u1D5C\u1D5D\u1D5E\u1D5F\u1D60\u1D61\u1D78\u1D9B\u1D9C\u1D9D\u1D9E\u1D9F\u1DA0\u1DA1\u1DA2\u1DA3\u1DA4\u1DA5\u1DA6\u1DA7\u1DA8\u1DA9\u1DAA\u1DAB\u1DAC\u1DAD\u1DAE\u1DAF\u1DB0\u1DB1\u1DB2\u1DB3\u1DB4\u1DB5\u1DB6\u1DB7\u1DB8\u1DB9\u1DBA\u1DBB\u1DBC\u1DBD\u1DBE\u1DBF\u2090\u2091\u2092\u2093\u2094\u2C7D\u2D6F\u2E2F\u3005\u3031\u3032\u3033\u3034\u3035\u303B\u309D\u309E\u30FC\u30FD\u30FE\uA015\uA60C\uA67F\uA717\uA718\uA719\uA71A\uA71B\uA71C\uA71D\uA71E\uA71F\uA770\uA788\uFF70\uFF9E\uFF9F]/,
peg$c77 = { type: "class", value: "[\\u02B0\\u02B1\\u02B2\\u02B3\\u02B4\\u02B5\\u02B6\\u02B7\\u02B8\\u02B9\\u02BA\\u02BB\\u02BC\\u02BD\\u02BE\\u02BF\\u02C0\\u02C1\\u02C6\\u02C7\\u02C8\\u02C9\\u02CA\\u02CB\\u02CC\\u02CD\\u02CE\\u02CF\\u02D0\\u02D1\\u02E0\\u02E1\\u02E2\\u02E3\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1C78\\u1C79\\u1C7A\\u1C7B\\u1C7C\\u1C7D\\u1D2C\\u1D2D\\u1D2E\\u1D2F\\u1D30\\u1D31\\u1D32\\u1D33\\u1D34\\u1D35\\u1D36\\u1D37\\u1D38\\u1D39\\u1D3A\\u1D3B\\u1D3C\\u1D3D\\u1D3E\\u1D3F\\u1D40\\u1D41\\u1D42\\u1D43\\u1D44\\u1D45\\u1D46\\u1D47\\u1D48\\u1D49\\u1D4A\\u1D4B\\u1D4C\\u1D4D\\u1D4E\\u1D4F\\u1D50\\u1D51\\u1D52\\u1D53\\u1D54\\u1D55\\u1D56\\u1D57\\u1D58\\u1D59\\u1D5A\\u1D5B\\u1D5C\\u1D5D\\u1D5E\\u1D5F\\u1D60\\u1D61\\u1D78\\u1D9B\\u1D9C\\u1D9D\\u1D9E\\u1D9F\\u1DA0\\u1DA1\\u1DA2\\u1DA3\\u1DA4\\u1DA5\\u1DA6\\u1DA7\\u1DA8\\u1DA9\\u1DAA\\u1DAB\\u1DAC\\u1DAD\\u1DAE\\u1DAF\\u1DB0\\u1DB1\\u1DB2\\u1DB3\\u1DB4\\u1DB5\\u1DB6\\u1DB7\\u1DB8\\u1DB9\\u1DBA\\u1DBB\\u1DBC\\u1DBD\\u1DBE\\u1DBF\\u2090\\u2091\\u2092\\u2093\\u2094\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031\\u3032\\u3033\\u3034\\u3035\\u303B\\u309D\\u309E\\u30FC\\u30FD\\u30FE\\uA015\\uA60C\\uA67F\\uA717\\uA718\\uA719\\uA71A\\uA71B\\uA71C\\uA71D\\uA71E\\uA71F\\uA770\\uA788\\uFF70\\uFF9E\\uFF9F]", description: "[\\u02B0\\u02B1\\u02B2\\u02B3\\u02B4\\u02B5\\u02B6\\u02B7\\u02B8\\u02B9\\u02BA\\u02BB\\u02BC\\u02BD\\u02BE\\u02BF\\u02C0\\u02C1\\u02C6\\u02C7\\u02C8\\u02C9\\u02CA\\u02CB\\u02CC\\u02CD\\u02CE\\u02CF\\u02D0\\u02D1\\u02E0\\u02E1\\u02E2\\u02E3\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1C78\\u1C79\\u1C7A\\u1C7B\\u1C7C\\u1C7D\\u1D2C\\u1D2D\\u1D2E\\u1D2F\\u1D30\\u1D31\\u1D32\\u1D33\\u1D34\\u1D35\\u1D36\\u1D37\\u1D38\\u1D39\\u1D3A\\u1D3B\\u1D3C\\u1D3D\\u1D3E\\u1D3F\\u1D40\\u1D41\\u1D42\\u1D43\\u1D44\\u1D45\\u1D46\\u1D47\\u1D48\\u1D49\\u1D4A\\u1D4B\\u1D4C\\u1D4D\\u1D4E\\u1D4F\\u1D50\\u1D51\\u1D52\\u1D53\\u1D54\\u1D55\\u1D56\\u1D57\\u1D58\\u1D59\\u1D5A\\u1D5B\\u1D5C\\u1D5D\\u1D5E\\u1D5F\\u1D60\\u1D61\\u1D78\\u1D9B\\u1D9C\\u1D9D\\u1D9E\\u1D9F\\u1DA0\\u1DA1\\u1DA2\\u1DA3\\u1DA4\\u1DA5\\u1DA6\\u1DA7\\u1DA8\\u1DA9\\u1DAA\\u1DAB\\u1DAC\\u1DAD\\u1DAE\\u1DAF\\u1DB0\\u1DB1\\u1DB2\\u1DB3\\u1DB4\\u1DB5\\u1DB6\\u1DB7\\u1DB8\\u1DB9\\u1DBA\\u1DBB\\u1DBC\\u1DBD\\u1DBE\\u1DBF\\u2090\\u2091\\u2092\\u2093\\u2094\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031\\u3032\\u3033\\u3034\\u3035\\u303B\\u309D\\u309E\\u30FC\\u30FD\\u30FE\\uA015\\uA60C\\uA67F\\uA717\\uA718\\uA719\\uA71A\\uA71B\\uA71C\\uA71D\\uA71E\\uA71F\\uA770\\uA788\\uFF70\\uFF9E\\uFF9F]" },
peg$c78 = /^[\u01BB\u01C0\u01C1\u01C2\u01C3\u0294\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\u05F0\u05F1\u05F2\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063A\u063B\u063C\u063D\u063E\u063F\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064A\u066E\u066F\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067A\u067B\u067C\u067D\u067E\u067F\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068A\u068B\u068C\u068D\u068E\u068F\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069A\u069B\u069C\u069D\u069E\u069F\u06A0\u06A1\u06A2\u06A3\u06A4\u06A5\u06A6\u06A7\u06A8\u06A9\u06AA\u06AB\u06AC\u06AD\u06AE\u06AF\u06B0\u06B1\u06B2\u06B3\u06B4\u06B5\u06B6\u06B7\u06B8\u06B9\u06BA\u06BB\u06BC\u06BD\u06BE\u06BF\u06C0\u06C1\u06C2\u06C3\u06C4\u06C5\u06C6\u06C7\u06C8\u06C9\u06CA\u06CB\u06CC\u06CD\u06CE\u06CF\u06D0\u06D1\u06D2\u06D3\u06D5\u06EE\u06EF\u06FA\u06FB\u06FC\u06FF\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071A\u071B\u071C\u071D\u071E\u071F\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072A\u072B\u072C\u072D\u072E\u072F\u074D\u074E\u074F\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075A\u075B\u075C\u075D\u075E\u075F\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076A\u076B\u076C\u076D\u076E\u076F\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077A\u077B\u077C\u077D\u077E\u077F\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078A\u078B\u078C\u078D\u078E\u078F\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079A\u079B\u079C\u079D\u079E\u079F\u07A0\u07A1\u07A2\u07A3\u07A4\u07A5\u07B1\u07CA\u07CB\u07CC\u07CD\u07CE\u07CF\u07D0\u07D1\u07D2\u07D3\u07D4\u07D5\u07D6\u07D7\u07D8\u07D9\u07DA\u07DB\u07DC\u07DD\u07DE\u07DF\u07E0\u07E1\u07E2\u07E3\u07E4\u07E5\u07E6\u07E7\u07E8\u07E9\u07EA\u0904\u0905\u0906\u0907\u0908\u0909\u090A\u090B\u090C\u090D\u090E\u090F\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091A\u091B\u091C\u091D\u091E\u091F\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092A\u092B\u092C\u092D\u092E\u092F\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093D\u0950\u0958\u0959\u095A\u095B\u095C\u095D\u095E\u095F\u0960\u0961\u0972\u097B\u097C\u097D\u097E\u097F\u0985\u0986\u0987\u0988\u0989\u098A\u098B\u098C\u098F\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099A\u099B\u099C\u099D\u099E\u099F\u09A0\u09A1\u09A2\u09A3\u09A4\u09A5\u09A6\u09A7\u09A8\u09AA\u09AB\u09AC\u09AD\u09AE\u09AF\u09B0\u09B2\u09B6\u09B7\u09B8\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF\u09E0\u09E1\u09F0\u09F1\u0A05\u0A06\u0A07\u0A08\u0A09\u0A0A\u0A0F\u0A10\u0A13\u0A14\u0A15\u0A16\u0A17\u0A18\u0A19\u0A1A\u0A1B\u0A1C\u0A1D\u0A1E\u0A1F\u0A20\u0A21\u0A22\u0A23\u0A24\u0A25\u0A26\u0A27\u0A28\u0A2A\u0A2B\u0A2C\u0A2D\u0A2E\u0A2F\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59\u0A5A\u0A5B\u0A5C\u0A5E\u0A72\u0A73\u0A74\u0A85\u0A86\u0A87\u0A88\u0A89\u0A8A\u0A8B\u0A8C\u0A8D\u0A8F\u0A90\u0A91\u0A93\u0A94\u0A95\u0A96\u0A97\u0A98\u0A99\u0A9A\u0A9B\u0A9C\u0A9D\u0A9E\u0A9F\u0AA0\u0AA1\u0AA2\u0AA3\u0AA4\u0AA5\u0AA6\u0AA7\u0AA8\u0AAA\u0AAB\u0AAC\u0AAD\u0AAE\u0AAF\u0AB0\u0AB2\u0AB3\u0AB5\u0AB6\u0AB7\u0AB8\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05\u0B06\u0B07\u0B08\u0B09\u0B0A\u0B0B\u0B0C\u0B0F\u0B10\u0B13\u0B14\u0B15\u0B16\u0B17\u0B18\u0B19\u0B1A\u0B1B\u0B1C\u0B1D\u0B1E\u0B1F\u0B20\u0B21\u0B22\u0B23\u0B24\u0B25\u0B26\u0B27\u0B28\u0B2A\u0B2B\u0B2C\u0B2D\u0B2E\u0B2F\u0B30\u0B32\u0B33\u0B35\u0B36\u0B37\u0B38\u0B39\u0B3D\u0B5C\u0B5D\u0B5F\u0B60\u0B61\u0B71\u0B83\u0B85\u0B86\u0B87\u0B88\u0B89\u0B8A\u0B8E\u0B8F\u0B90\u0B92\u0B93\u0B94\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8\u0BA9\u0BAA\u0BAE\u0BAF\u0BB0\u0BB1\u0BB2\u0BB3\u0BB4\u0BB5\u0BB6\u0BB7\u0BB8\u0BB9\u0BD0\u0C05\u0C06\u0C07\u0C08\u0C09\u0C0A\u0C0B\u0C0C\u0C0E\u0C0F\u0C10\u0C12\u0C13\u0C14\u0C15\u0C16\u0C17\u0C18\u0C19\u0C1A\u0C1B\u0C1C\u0C1D\u0C1E\u0C1F\u0C20\u0C21\u0C22\u0C23\u0C24\u0C25\u0C26\u0C27\u0C28\u0C2A\u0C2B\u0C2C\u0C2D\u0C2E\u0C2F\u0C30\u0C31\u0C32\u0C33\u0C35\u0C36\u0C37\u0C38\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85\u0C86\u0C87\u0C88\u0C89\u0C8A\u0C8B\u0C8C\u0C8E\u0C8F\u0C90\u0C92\u0C93\u0C94\u0C95\u0C96\u0C97\u0C98\u0C99\u0C9A\u0C9B\u0C9C\u0C9D\u0C9E\u0C9F\u0CA0\u0CA1\u0CA2\u0CA3\u0CA4\u0CA5\u0CA6\u0CA7\u0CA8\u0CAA\u0CAB\u0CAC\u0CAD\u0CAE\u0CAF\u0CB0\u0CB1\u0CB2\u0CB3\u0CB5\u0CB6\u0CB7\u0CB8\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0D05\u0D06\u0D07\u0D08\u0D09\u0D0A\u0D0B\u0D0C\u0D0E\u0D0F\u0D10\u0D12\u0D13\u0D14\u0D15\u0D16\u0D17\u0D18\u0D19\u0D1A\u0D1B\u0D1C\u0D1D\u0D1E\u0D1F\u0D20\u0D21\u0D22\u0D23\u0D24\u0D25\u0D26\u0D27\u0D28\u0D2A\u0D2B\u0D2C\u0D2D\u0D2E\u0D2F\u0D30\u0D31\u0D32\u0D33\u0D34\u0D35\u0D36\u0D37\u0D38\u0D39\u0D3D\u0D60\u0D61\u0D7A\u0D7B\u0D7C\u0D7D\u0D7E\u0D7F\u0D85\u0D86\u0D87\u0D88\u0D89\u0D8A\u0D8B\u0D8C\u0D8D\u0D8E\u0D8F\u0D90\u0D91\u0D92\u0D93\u0D94\u0D95\u0D96\u0D9A\u0D9B\u0D9C\u0D9D\u0D9E\u0D9F\u0DA0\u0DA1\u0DA2\u0DA3\u0DA4\u0DA5\u0DA6\u0DA7\u0DA8\u0DA9\u0DAA\u0DAB\u0DAC\u0DAD\u0DAE\u0DAF\u0DB0\u0DB1\u0DB3\u0DB4\u0DB5\u0DB6\u0DB7\u0DB8\u0DB9\u0DBA\u0DBB\u0DBD\u0DC0\u0DC1\u0DC2\u0DC3\u0DC4\u0DC5\u0DC6\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E32\u0E33\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94\u0E95\u0E96\u0E97\u0E99\u0E9A\u0E9B\u0E9C\u0E9D\u0E9E\u0E9F\u0EA1\u0EA2\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EAF\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0\u0EC1\u0EC2\u0EC3\u0EC4\u0EDC\u0EDD\u0F00\u0F40\u0F41\u0F42\u0F43\u0F44\u0F45\u0F46\u0F47\u0F49\u0F4A\u0F4B\u0F4C\u0F4D\u0F4E\u0F4F\u0F50\u0F51\u0F52\u0F53\u0F54\u0F55\u0F56\u0F57\u0F58\u0F59\u0F5A\u0F5B\u0F5C\u0F5D\u0F5E\u0F5F\u0F60\u0F61\u0F62\u0F63\u0F64\u0F65\u0F66\u0F67\u0F68\u0F69\u0F6A\u0F6B\u0F6C\u0F88\u0F89\u0F8A\u0F8B\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100A\u100B\u100C\u100D\u100E\u100F\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101A\u101B\u101C\u101D\u101E\u101F\u1020\u1021\u1022\u1023\u1024\u1025\u1026\u1027\u1028\u1029\u102A\u103F\u1050\u1051\u1052\u1053\u1054\u1055\u105A\u105B\u105C\u105D\u1061\u1065\u1066\u106E\u106F\u1070\u1075\u1076\u1077\u1078\u1079\u107A\u107B\u107C\u107D\u107E\u107F\u1080\u1081\u108E\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10EF\u10F0\u10F1\u10F2\u10F3\u10F4\u10F5\u10F6\u10F7\u10F8\u10F9\u10FA\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110A\u110B\u110C\u110D\u110E\u110F\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111A\u111B\u111C\u111D\u111E\u111F\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112A\u112B\u112C\u112D\u112E\u112F\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113A\u113B\u113C\u113D\u113E\u113F\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114A\u114B\u114C\u114D\u114E\u114F\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115F\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116A\u116B\u116C\u116D\u116E\u116F\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117A\u117B\u117C\u117D\u117E\u117F\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118A\u118B\u118C\u118D\u118E\u118F\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119A\u119B\u119C\u119D\u119E\u119F\u11A0\u11A1\u11A2\u11A8\u11A9\u11AA\u11AB\u11AC\u11AD\u11AE\u11AF\u11B0\u11B1\u11B2\u11B3\u11B4\u11B5\u11B6\u11B7\u11B8\u11B9\u11BA\u11BB\u11BC\u11BD\u11BE\u11BF\u11C0\u11C1\u11C2\u11C3\u11C4\u11C5\u11C6\u11C7\u11C8\u11C9\u11CA\u11CB\u11CC\u11CD\u11CE\u11CF\u11D0\u11D1\u11D2\u11D3\u11D4\u11D5\u11D6\u11D7\u11D8\u11D9\u11DA\u11DB\u11DC\u11DD\u11DE\u11DF\u11E0\u11E1\u11E2\u11E3\u11E4\u11E5\u11E6\u11E7\u11E8\u11E9\u11EA\u11EB\u11EC\u11ED\u11EE\u11EF\u11F0\u11F1\u11F2\u11F3\u11F4\u11F5\u11F6\u11F7\u11F8\u11F9\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120A\u120B\u120C\u120D\u120E\u120F\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121A\u121B\u121C\u121D\u121E\u121F\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122A\u122B\u122C\u122D\u122E\u122F\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123A\u123B\u123C\u123D\u123E\u123F\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124A\u124B\u124C\u124D\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125A\u125B\u125C\u125D\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126A\u126B\u126C\u126D\u126E\u126F\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127A\u127B\u127C\u127D\u127E\u127F\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128A\u128B\u128C\u128D\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129A\u129B\u129C\u129D\u129E\u129F\u12A0\u12A1\u12A2\u12A3\u12A4\u12A5\u12A6\u12A7\u12A8\u12A9\u12AA\u12AB\u12AC\u12AD\u12AE\u12AF\u12B0\u12B2\u12B3\u12B4\u12B5\u12B8\u12B9\u12BA\u12BB\u12BC\u12BD\u12BE\u12C0\u12C2\u12C3\u12C4\u12C5\u12C8\u12C9\u12CA\u12CB\u12CC\u12CD\u12CE\u12CF\u12D0\u12D1\u12D2\u12D3\u12D4\u12D5\u12D6\u12D8\u12D9\u12DA\u12DB\u12DC\u12DD\u12DE\u12DF\u12E0\u12E1\u12E2\u12E3\u12E4\u12E5\u12E6\u12E7\u12E8\u12E9\u12EA\u12EB\u12EC\u12ED\u12EE\u12EF\u12F0\u12F1\u12F2\u12F3\u12F4\u12F5\u12F6\u12F7\u12F8\u12F9\u12FA\u12FB\u12FC\u12FD\u12FE\u12FF\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130A\u130B\u130C\u130D\u130E\u130F\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131A\u131B\u131C\u131D\u131E\u131F\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132A\u132B\u132C\u132D\u132E\u132F\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133A\u133B\u133C\u133D\u133E\u133F\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134A\u134B\u134C\u134D\u134E\u134F\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135A\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138A\u138B\u138C\u138D\u138E\u138F\u13A0\u13A1\u13A2\u13A3\u13A4\u13A5\u13A6\u13A7\u13A8\u13A9\u13AA\u13AB\u13AC\u13AD\u13AE\u13AF\u13B0\u13B1\u13B2\u13B3\u13B4\u13B5\u13B6\u13B7\u13B8\u13B9\u13BA\u13BB\u13BC\u13BD\u13BE\u13BF\u13C0\u13C1\u13C2\u13C3\u13C4\u13C5\u13C6\u13C7\u13C8\u13C9\u13CA\u13CB\u13CC\u13CD\u13CE\u13CF\u13D0\u13D1\u13D2\u13D3\u13D4\u13D5\u13D6\u13D7\u13D8\u13D9\u13DA\u13DB\u13DC\u13DD\u13DE\u13DF\u13E0\u13E1\u13E2\u13E3\u13E4\u13E5\u13E6\u13E7\u13E8\u13E9\u13EA\u13EB\u13EC\u13ED\u13EE\u13EF\u13F0\u13F1\u13F2\u13F3\u13F4\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140A\u140B\u140C\u140D\u140E\u140F\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141A\u141B\u141C\u141D\u141E\u141F\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142A\u142B\u142C\u142D\u142E\u142F\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143A\u143B\u143C\u143D\u143E\u143F\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144A\u144B\u144C\u144D\u144E\u144F\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145A\u145B\u145C\u145D\u145E\u145F\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146A\u146B\u146C\u146D\u146E\u146F\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147A\u147B\u147C\u147D\u147E\u147F\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148A\u148B\u148C\u148D\u148E\u148F\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149A\u149B\u149C\u149D\u149E\u149F\u14A0\u14A1\u14A2\u14A3\u14A4\u14A5\u14A6\u14A7\u14A8\u14A9\u14AA\u14AB\u14AC\u14AD\u14AE\u14AF\u14B0\u14B1\u14B2\u14B3\u14B4\u14B5\u14B6\u14B7\u14B8\u14B9\u14BA\u14BB\u14BC\u14BD\u14BE\u14BF\u14C0\u14C1\u14C2\u14C3\u14C4\u14C5\u14C6\u14C7\u14C8\u14C9\u14CA\u14CB\u14CC\u14CD\u14CE\u14CF\u14D0\u14D1\u14D2\u14D3\u14D4\u14D5\u14D6\u14D7\u14D8\u14D9\u14DA\u14DB\u14DC\u14DD\u14DE\u14DF\u14E0\u14E1\u14E2\u14E3\u14E4\u14E5\u14E6\u14E7\u14E8\u14E9\u14EA\u14EB\u14EC\u14ED\u14EE\u14EF\u14F0\u14F1\u14F2\u14F3\u14F4\u14F5\u14F6\u14F7\u14F8\u14F9\u14FA\u14FB\u14FC\u14FD\u14FE\u14FF\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150A\u150B\u150C\u150D\u150E\u150F\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151A\u151B\u151C\u151D\u151E\u151F\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152A\u152B\u152C\u152D\u152E\u152F\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153A\u153B\u153C\u153D\u153E\u153F\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154A\u154B\u154C\u154D\u154E\u154F\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155A\u155B\u155C\u155D\u155E\u155F\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156A\u156B\u156C\u156D\u156E\u156F\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157A\u157B\u157C\u157D\u157E\u157F\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158A\u158B\u158C\u158D\u158E\u158F\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159A\u159B\u159C\u159D\u159E\u159F\u15A0\u15A1\u15A2\u15A3\u15A4\u15A5\u15A6\u15A7\u15A8\u15A9\u15AA\u15AB\u15AC\u15AD\u15AE\u15AF\u15B0\u15B1\u15B2\u15B3\u15B4\u15B5\u15B6\u15B7\u15B8\u15B9\u15BA\u15BB\u15BC\u15BD\u15BE\u15BF\u15C0\u15C1\u15C2\u15C3\u15C4\u15C5\u15C6\u15C7\u15C8\u15C9\u15CA\u15CB\u15CC\u15CD\u15CE\u15CF\u15D0\u15D1\u15D2\u15D3\u15D4\u15D5\u15D6\u15D7\u15D8\u15D9\u15DA\u15DB\u15DC\u15DD\u15DE\u15DF\u15E0\u15E1\u15E2\u15E3\u15E4\u15E5\u15E6\u15E7\u15E8\u15E9\u15EA\u15EB\u15EC\u15ED\u15EE\u15EF\u15F0\u15F1\u15F2\u15F3\u15F4\u15F5\u15F6\u15F7\u15F8\u15F9\u15FA\u15FB\u15FC\u15FD\u15FE\u15FF\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160A\u160B\u160C\u160D\u160E\u160F\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161A\u161B\u161C\u161D\u161E\u161F\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162A\u162B\u162C\u162D\u162E\u162F\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163A\u163B\u163C\u163D\u163E\u163F\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164A\u164B\u164C\u164D\u164E\u164F\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165A\u165B\u165C\u165D\u165E\u165F\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166A\u166B\u166C\u166F\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168A\u168B\u168C\u168D\u168E\u168F\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169A\u16A0\u16A1\u16A2\u16A3\u16A4\u16A5\u16A6\u16A7\u16A8\u16A9\u16AA\u16AB\u16AC\u16AD\u16AE\u16AF\u16B0\u16B1\u16B2\u16B3\u16B4\u16B5\u16B6\u16B7\u16B8\u16B9\u16BA\u16BB\u16BC\u16BD\u16BE\u16BF\u16C0\u16C1\u16C2\u16C3\u16C4\u16C5\u16C6\u16C7\u16C8\u16C9\u16CA\u16CB\u16CC\u16CD\u16CE\u16CF\u16D0\u16D1\u16D2\u16D3\u16D4\u16D5\u16D6\u16D7\u16D8\u16D9\u16DA\u16DB\u16DC\u16DD\u16DE\u16DF\u16E0\u16E1\u16E2\u16E3\u16E4\u16E5\u16E6\u16E7\u16E8\u16E9\u16EA\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170A\u170B\u170C\u170E\u170F\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172A\u172B\u172C\u172D\u172E\u172F\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174A\u174B\u174C\u174D\u174E\u174F\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176A\u176B\u176C\u176E\u176F\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178A\u178B\u178C\u178D\u178E\u178F\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179A\u179B\u179C\u179D\u179E\u179F\u17A0\u17A1\u17A2\u17A3\u17A4\u17A5\u17A6\u17A7\u17A8\u17A9\u17AA\u17AB\u17AC\u17AD\u17AE\u17AF\u17B0\u17B1\u17B2\u17B3\u17DC\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182A\u182B\u182C\u182D\u182E\u182F\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183A\u183B\u183C\u183D\u183E\u183F\u1840\u1841\u1842\u1844\u1845\u1846\u1847\u1848\u1849\u184A\u184B\u184C\u184D\u184E\u184F\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185A\u185B\u185C\u185D\u185E\u185F\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186A\u186B\u186C\u186D\u186E\u186F\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188A\u188B\u188C\u188D\u188E\u188F\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189A\u189B\u189C\u189D\u189E\u189F\u18A0\u18A1\u18A2\u18A3\u18A4\u18A5\u18A6\u18A7\u18A8\u18AA\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190A\u190B\u190C\u190D\u190E\u190F\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191A\u191B\u191C\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195A\u195B\u195C\u195D\u195E\u195F\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196A\u196B\u196C\u196D\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198A\u198B\u198C\u198D\u198E\u198F\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199A\u199B\u199C\u199D\u199E\u199F\u19A0\u19A1\u19A2\u19A3\u19A4\u19A5\u19A6\u19A7\u19A8\u19A9\u19C1\u19C2\u19C3\u19C4\u19C5\u19C6\u19C7\u1A00\u1A01\u1A02\u1A03\u1A04\u1A05\u1A06\u1A07\u1A08\u1A09\u1A0A\u1A0B\u1A0C\u1A0D\u1A0E\u1A0F\u1A10\u1A11\u1A12\u1A13\u1A14\u1A15\u1A16\u1B05\u1B06\u1B07\u1B08\u1B09\u1B0A\u1B0B\u1B0C\u1B0D\u1B0E\u1B0F\u1B10\u1B11\u1B12\u1B13\u1B14\u1B15\u1B16\u1B17\u1B18\u1B19\u1B1A\u1B1B\u1B1C\u1B1D\u1B1E\u1B1F\u1B20\u1B21\u1B22\u1B23\u1B24\u1B25\u1B26\u1B27\u1B28\u1B29\u1B2A\u1B2B\u1B2C\u1B2D\u1B2E\u1B2F\u1B30\u1B31\u1B32\u1B33\u1B45\u1B46\u1B47\u1B48\u1B49\u1B4A\u1B4B\u1B83\u1B84\u1B85\u1B86\u1B87\u1B88\u1B89\u1B8A\u1B8B\u1B8C\u1B8D\u1B8E\u1B8F\u1B90\u1B91\u1B92\u1B93\u1B94\u1B95\u1B96\u1B97\u1B98\u1B99\u1B9A\u1B9B\u1B9C\u1B9D\u1B9E\u1B9F\u1BA0\u1BAE\u1BAF\u1C00\u1C01\u1C02\u1C03\u1C04\u1C05\u1C06\u1C07\u1C08\u1C09\u1C0A\u1C0B\u1C0C\u1C0D\u1C0E\u1C0F\u1C10\u1C11\u1C12\u1C13\u1C14\u1C15\u1C16\u1C17\u1C18\u1C19\u1C1A\u1C1B\u1C1C\u1C1D\u1C1E\u1C1F\u1C20\u1C21\u1C22\u1C23\u1C4D\u1C4E\u1C4F\u1C5A\u1C5B\u1C5C\u1C5D\u1C5E\u1C5F\u1C60\u1C61\u1C62\u1C63\u1C64\u1C65\u1C66\u1C67\u1C68\u1C69\u1C6A\u1C6B\u1C6C\u1C6D\u1C6E\u1C6F\u1C70\u1C71\u1C72\u1C73\u1C74\u1C75\u1C76\u1C77\u2135\u2136\u2137\u2138\u2D30\u2D31\u2D32\u2D33\u2D34\u2D35\u2D36\u2D37\u2D38\u2D39\u2D3A\u2D3B\u2D3C\u2D3D\u2D3E\u2D3F\u2D40\u2D41\u2D42\u2D43\u2D44\u2D45\u2D46\u2D47\u2D48\u2D49\u2D4A\u2D4B\u2D4C\u2D4D\u2D4E\u2D4F\u2D50\u2D51\u2D52\u2D53\u2D54\u2D55\u2D56\u2D57\u2D58\u2D59\u2D5A\u2D5B\u2D5C\u2D5D\u2D5E\u2D5F\u2D60\u2D61\u2D62\u2D63\u2D64\u2D65\u2D80\u2D81\u2D82\u2D83\u2D84\u2D85\u2D86\u2D87\u2D88\u2D89\u2D8A\u2D8B\u2D8C\u2D8D\u2D8E\u2D8F\u2D90\u2D91\u2D92\u2D93\u2D94\u2D95\u2D96\u2DA0\u2DA1\u2DA2\u2DA3\u2DA4\u2DA5\u2DA6\u2DA8\u2DA9\u2DAA\u2DAB\u2DAC\u2DAD\u2DAE\u2DB0\u2DB1\u2DB2\u2DB3\u2DB4\u2DB5\u2DB6\u2DB8\u2DB9\u2DBA\u2DBB\u2DBC\u2DBD\u2DBE\u2DC0\u2DC1\u2DC2\u2DC3\u2DC4\u2DC5\u2DC6\u2DC8\u2DC9\u2DCA\u2DCB\u2DCC\u2DCD\u2DCE\u2DD0\u2DD1\u2DD2\u2DD3\u2DD4\u2DD5\u2DD6\u2DD8\u2DD9\u2DDA\u2DDB\u2DDC\u2DDD\u2DDE\u3006\u303C\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309F\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4\u30F5\u30F6\u30F7\u30F8\u30F9\u30FA\u30FF\u3105\u3106\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312A\u312B\u312C\u312D\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313A\u313B\u313C\u313D\u313E\u313F\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314A\u314B\u314C\u314D\u314E\u314F\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315A\u315B\u315C\u315D\u315E\u315F\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316A\u316B\u316C\u316D\u316E\u316F\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317A\u317B\u317C\u317D\u317E\u317F\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318A\u318B\u318C\u318D\u318E\u31A0\u31A1\u31A2\u31A3\u31A4\u31A5\u31A6\u31A7\u31A8\u31A9\u31AA\u31AB\u31AC\u31AD\u31AE\u31AF\u31B0\u31B1\u31B2\u31B3\u31B4\u31B5\u31B6\u31B7\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3400\u4DB5\u4E00\u9FC3\uA000\uA001\uA002\uA003\uA004\uA005\uA006\uA007\uA008\uA009\uA00A\uA00B\uA00C\uA00D\uA00E\uA00F\uA010\uA011\uA012\uA013\uA014\uA016\uA017\uA018\uA019\uA01A\uA01B\uA01C\uA01D\uA01E\uA01F\uA020\uA021\uA022\uA023\uA024\uA025\uA026\uA027\uA028\uA029\uA02A\uA02B\uA02C\uA02D\uA02E\uA02F\uA030\uA031\uA032\uA033\uA034\uA035\uA036\uA037\uA038\uA039\uA03A\uA03B\uA03C\uA03D\uA03E\uA03F\uA040\uA041\uA042\uA043\uA044\uA045\uA046\uA047\uA048\uA049\uA04A\uA04B\uA04C\uA04D\uA04E\uA04F\uA050\uA051\uA052\uA053\uA054\uA055\uA056\uA057\uA058\uA059\uA05A\uA05B\uA05C\uA05D\uA05E\uA05F\uA060\uA061\uA062\uA063\uA064\uA065\uA066\uA067\uA068\uA069\uA06A\uA06B\uA06C\uA06D\uA06E\uA06F\uA070\uA071\uA072\uA073\uA074\uA075\uA076\uA077\uA078\uA079\uA07A\uA07B\uA07C\uA07D\uA07E\uA07F\uA080\uA081\uA082\uA083\uA084\uA085\uA086\uA087\uA088\uA089\uA08A\uA08B\uA08C\uA08D\uA08E\uA08F\uA090\uA091\uA092\uA093\uA094\uA095\uA096\uA097\uA098\uA099\uA09A\uA09B\uA09C\uA09D\uA09E\uA09F\uA0A0\uA0A1\uA0A2\uA0A3\uA0A4\uA0A5\uA0A6\uA0A7\uA0A8\uA0A9\uA0AA\uA0AB\uA0AC\uA0AD\uA0AE\uA0AF\uA0B0\uA0B1\uA0B2\uA0B3\uA0B4\uA0B5\uA0B6\uA0B7\uA0B8\uA0B9\uA0BA\uA0BB\uA0BC\uA0BD\uA0BE\uA0BF\uA0C0\uA0C1\uA0C2\uA0C3\uA0C4\uA0C5\uA0C6\uA0C7\uA0C8\uA0C9\uA0CA\uA0CB\uA0CC\uA0CD\uA0CE\uA0CF\uA0D0\uA0D1\uA0D2\uA0D3\uA0D4\uA0D5\uA0D6\uA0D7\uA0D8\uA0D9\uA0DA\uA0DB\uA0DC\uA0DD\uA0DE\uA0DF\uA0E0\uA0E1\uA0E2\uA0E3\uA0E4\uA0E5\uA0E6\uA0E7\uA0E8\uA0E9\uA0EA\uA0EB\uA0EC\uA0ED\uA0EE\uA0EF\uA0F0\uA0F1\uA0F2\uA0F3\uA0F4\uA0F5\uA0F6\uA0F7\uA0F8\uA0F9\uA0FA\uA0FB\uA0FC\uA0FD\uA0FE\uA0FF\uA100\uA101\uA102\uA103\uA104\uA105\uA106\uA107\uA108\uA109\uA10A\uA10B\uA10C\uA10D\uA10E\uA10F\uA110\uA111\uA112\uA113\uA114\uA115\uA116\uA117\uA118\uA119\uA11A\uA11B\uA11C\uA11D\uA11E\uA11F\uA120\uA121\uA122\uA123\uA124\uA125\uA126\uA127\uA128\uA129\uA12A\uA12B\uA12C\uA12D\uA12E\uA12F\uA130\uA131\uA132\uA133\uA134\uA135\uA136\uA137\uA138\uA139\uA13A\uA13B\uA13C\uA13D\uA13E\uA13F\uA140\uA141\uA142\uA143\uA144\uA145\uA146\uA147\uA148\uA149\uA14A\uA14B\uA14C\uA14D\uA14E\uA14F\uA150\uA151\uA152\uA153\uA154\uA155\uA156\uA157\uA158\uA159\uA15A\uA15B\uA15C\uA15D\uA15E\uA15F\uA160\uA161\uA162\uA163\uA164\uA165\uA166\uA167\uA168\uA169\uA16A\uA16B\uA16C\uA16D\uA16E\uA16F\uA170\uA171\uA172\uA173\uA174\uA175\uA176\uA177\uA178\uA179\uA17A\uA17B\uA17C\uA17D\uA17E\uA17F\uA180\uA181\uA182\uA183\uA184\uA185\uA186\uA187\uA188\uA189\uA18A\uA18B\uA18C\uA18D\uA18E\uA18F\uA190\uA191\uA192\uA193\uA194\uA195\uA196\uA197\uA198\uA199\uA19A\uA19B\uA19C\uA19D\uA19E\uA19F\uA1A0\uA1A1\uA1A2\uA1A3\uA1A4\uA1A5\uA1A6\uA1A7\uA1A8\uA1A9\uA1AA\uA1AB\uA1AC\uA1AD\uA1AE\uA1AF\uA1B0\uA1B1\uA1B2\uA1B3\uA1B4\uA1B5\uA1B6\uA1B7\uA1B8\uA1B9\uA1BA\uA1BB\uA1BC\uA1BD\uA1BE\uA1BF\uA1C0\uA1C1\uA1C2\uA1C3\uA1C4\uA1C5\uA1C6\uA1C7\uA1C8\uA1C9\uA1CA\uA1CB\uA1CC\uA1CD\uA1CE\uA1CF\uA1D0\uA1D1\uA1D2\uA1D3\uA1D4\uA1D5\uA1D6\uA1D7\uA1D8\uA1D9\uA1DA\uA1DB\uA1DC\uA1DD\uA1DE\uA1DF\uA1E0\uA1E1\uA1E2\uA1E3\uA1E4\uA1E5\uA1E6\uA1E7\uA1E8\uA1E9\uA1EA\uA1EB\uA1EC\uA1ED\uA1EE\uA1EF\uA1F0\uA1F1\uA1F2\uA1F3\uA1F4\uA1F5\uA1F6\uA1F7\uA1F8\uA1F9\uA1FA\uA1FB\uA1FC\uA1FD\uA1FE\uA1FF\uA200\uA201\uA202\uA203\uA204\uA205\uA206\uA207\uA208\uA209\uA20A\uA20B\uA20C\uA20D\uA20E\uA20F\uA210\uA211\uA212\uA213\uA214\uA215\uA216\uA217\uA218\uA219\uA21A\uA21B\uA21C\uA21D\uA21E\uA21F\uA220\uA221\uA222\uA223\uA224\uA225\uA226\uA227\uA228\uA229\uA22A\uA22B\uA22C\uA22D\uA22E\uA22F\uA230\uA231\uA232\uA233\uA234\uA235\uA236\uA237\uA238\uA239\uA23A\uA23B\uA23C\uA23D\uA23E\uA23F\uA240\uA241\uA242\uA243\uA244\uA245\uA246\uA247\uA248\uA249\uA24A\uA24B\uA24C\uA24D\uA24E\uA24F\uA250\uA251\uA252\uA253\uA254\uA255\uA256\uA257\uA258\uA259\uA25A\uA25B\uA25C\uA25D\uA25E\uA25F\uA260\uA261\uA262\uA263\uA264\uA265\uA266\uA267\uA268\uA269\uA26A\uA26B\uA26C\uA26D\uA26E\uA26F\uA270\uA271\uA272\uA273\uA274\uA275\uA276\uA277\uA278\uA279\uA27A\uA27B\uA27C\uA27D\uA27E\uA27F\uA280\uA281\uA282\uA283\uA284\uA285\uA286\uA287\uA288\uA289\uA28A\uA28B\uA28C\uA28D\uA28E\uA28F\uA290\uA291\uA292\uA293\uA294\uA295\uA296\uA297\uA298\uA299\uA29A\uA29B\uA29C\uA29D\uA29E\uA29F\uA2A0\uA2A1\uA2A2\uA2A3\uA2A4\uA2A5\uA2A6\uA2A7\uA2A8\uA2A9\uA2AA\uA2AB\uA2AC\uA2AD\uA2AE\uA2AF\uA2B0\uA2B1\uA2B2\uA2B3\uA2B4\uA2B5\uA2B6\uA2B7\uA2B8\uA2B9\uA2BA\uA2BB\uA2BC\uA2BD\uA2BE\uA2BF\uA2C0\uA2C1\uA2C2\uA2C3\uA2C4\uA2C5\uA2C6\uA2C7\uA2C8\uA2C9\uA2CA\uA2CB\uA2CC\uA2CD\uA2CE\uA2CF\uA2D0\uA2D1\uA2D2\uA2D3\uA2D4\uA2D5\uA2D6\uA2D7\uA2D8\uA2D9\uA2DA\uA2DB\uA2DC\uA2DD\uA2DE\uA2DF\uA2E0\uA2E1\uA2E2\uA2E3\uA2E4\uA2E5\uA2E6\uA2E7\uA2E8\uA2E9\uA2EA\uA2EB\uA2EC\uA2ED\uA2EE\uA2EF\uA2F0\uA2F1\uA2F2\uA2F3\uA2F4\uA2F5\uA2F6\uA2F7\uA2F8\uA2F9\uA2FA\uA2FB\uA2FC\uA2FD\uA2FE\uA2FF\uA300\uA301\uA302\uA303\uA304\uA305\uA306\uA307\uA308\uA309\uA30A\uA30B\uA30C\uA30D\uA30E\uA30F\uA310\uA311\uA312\uA313\uA314\uA315\uA316\uA317\uA318\uA319\uA31A\uA31B\uA31C\uA31D\uA31E\uA31F\uA320\uA321\uA322\uA323\uA324\uA325\uA326\uA327\uA328\uA329\uA32A\uA32B\uA32C\uA32D\uA32E\uA32F\uA330\uA331\uA332\uA333\uA334\uA335\uA336\uA337\uA338\uA339\uA33A\uA33B\uA33C\uA33D\uA33E\uA33F\uA340\uA341\uA342\uA343\uA344\uA345\uA346\uA347\uA348\uA349\uA34A\uA34B\uA34C\uA34D\uA34E\uA34F\uA350\uA351\uA352\uA353\uA354\uA355\uA356\uA357\uA358\uA359\uA35A\uA35B\uA35C\uA35D\uA35E\uA35F\uA360\uA361\uA362\uA363\uA364\uA365\uA366\uA367\uA368\uA369\uA36A\uA36B\uA36C\uA36D\uA36E\uA36F\uA370\uA371\uA372\uA373\uA374\uA375\uA376\uA377\uA378\uA379\uA37A\uA37B\uA37C\uA37D\uA37E\uA37F\uA380\uA381\uA382\uA383\uA384\uA385\uA386\uA387\uA388\uA389\uA38A\uA38B\uA38C\uA38D\uA38E\uA38F\uA390\uA391\uA392\uA393\uA394\uA395\uA396\uA397\uA398\uA399\uA39A\uA39B\uA39C\uA39D\uA39E\uA39F\uA3A0\uA3A1\uA3A2\uA3A3\uA3A4\uA3A5\uA3A6\uA3A7\uA3A8\uA3A9\uA3AA\uA3AB\uA3AC\uA3AD\uA3AE\uA3AF\uA3B0\uA3B1\uA3B2\uA3B3\uA3B4\uA3B5\uA3B6\uA3B7\uA3B8\uA3B9\uA3BA\uA3BB\uA3BC\uA3BD\uA3BE\uA3BF\uA3C0\uA3C1\uA3C2\uA3C3\uA3C4\uA3C5\uA3C6\uA3C7\uA3C8\uA3C9\uA3CA\uA3CB\uA3CC\uA3CD\uA3CE\uA3CF\uA3D0\uA3D1\uA3D2\uA3D3\uA3D4\uA3D5\uA3D6\uA3D7\uA3D8\uA3D9\uA3DA\uA3DB\uA3DC\uA3DD\uA3DE\uA3DF\uA3E0\uA3E1\uA3E2\uA3E3\uA3E4\uA3E5\uA3E6\uA3E7\uA3E8\uA3E9\uA3EA\uA3EB\uA3EC\uA3ED\uA3EE\uA3EF\uA3F0\uA3F1\uA3F2\uA3F3\uA3F4\uA3F5\uA3F6\uA3F7\uA3F8\uA3F9\uA3FA\uA3FB\uA3FC\uA3FD\uA3FE\uA3FF\uA400\uA401\uA402\uA403\uA404\uA405\uA406\uA407\uA408\uA409\uA40A\uA40B\uA40C\uA40D\uA40E\uA40F\uA410\uA411\uA412\uA413\uA414\uA415\uA416\uA417\uA418\uA419\uA41A\uA41B\uA41C\uA41D\uA41E\uA41F\uA420\uA421\uA422\uA423\uA424\uA425\uA426\uA427\uA428\uA429\uA42A\uA42B\uA42C\uA42D\uA42E\uA42F\uA430\uA431\uA432\uA433\uA434\uA435\uA436\uA437\uA438\uA439\uA43A\uA43B\uA43C\uA43D\uA43E\uA43F\uA440\uA441\uA442\uA443\uA444\uA445\uA446\uA447\uA448\uA449\uA44A\uA44B\uA44C\uA44D\uA44E\uA44F\uA450\uA451\uA452\uA453\uA454\uA455\uA456\uA457\uA458\uA459\uA45A\uA45B\uA45C\uA45D\uA45E\uA45F\uA460\uA461\uA462\uA463\uA464\uA465\uA466\uA467\uA468\uA469\uA46A\uA46B\uA46C\uA46D\uA46E\uA46F\uA470\uA471\uA472\uA473\uA474\uA475\uA476\uA477\uA478\uA479\uA47A\uA47B\uA47C\uA47D\uA47E\uA47F\uA480\uA481\uA482\uA483\uA484\uA485\uA486\uA487\uA488\uA489\uA48A\uA48B\uA48C\uA500\uA501\uA502\uA503\uA504\uA505\uA506\uA507\uA508\uA509\uA50A\uA50B\uA50C\uA50D\uA50E\uA50F\uA510\uA511\uA512\uA513\uA514\uA515\uA516\uA517\uA518\uA519\uA51A\uA51B\uA51C\uA51D\uA51E\uA51F\uA520\uA521\uA522\uA523\uA524\uA525\uA526\uA527\uA528\uA529\uA52A\uA52B\uA52C\uA52D\uA52E\uA52F\uA530\uA531\uA532\uA533\uA534\uA535\uA536\uA537\uA538\uA539\uA53A\uA53B\uA53C\uA53D\uA53E\uA53F\uA540\uA541\uA542\uA543\uA544\uA545\uA546\uA547\uA548\uA549\uA54A\uA54B\uA54C\uA54D\uA54E\uA54F\uA550\uA551\uA552\uA553\uA554\uA555\uA556\uA557\uA558\uA559\uA55A\uA55B\uA55C\uA55D\uA55E\uA55F\uA560\uA561\uA562\uA563\uA564\uA565\uA566\uA567\uA568\uA569\uA56A\uA56B\uA56C\uA56D\uA56E\uA56F\uA570\uA571\uA572\uA573\uA574\uA575\uA576\uA577\uA578\uA579\uA57A\uA57B\uA57C\uA57D\uA57E\uA57F\uA580\uA581\uA582\uA583\uA584\uA585\uA586\uA587\uA588\uA589\uA58A\uA58B\uA58C\uA58D\uA58E\uA58F\uA590\uA591\uA592\uA593\uA594\uA595\uA596\uA597\uA598\uA599\uA59A\uA59B\uA59C\uA59D\uA59E\uA59F\uA5A0\uA5A1\uA5A2\uA5A3\uA5A4\uA5A5\uA5A6\uA5A7\uA5A8\uA5A9\uA5AA\uA5AB\uA5AC\uA5AD\uA5AE\uA5AF\uA5B0\uA5B1\uA5B2\uA5B3\uA5B4\uA5B5\uA5B6\uA5B7\uA5B8\uA5B9\uA5BA\uA5BB\uA5BC\uA5BD\uA5BE\uA5BF\uA5C0\uA5C1\uA5C2\uA5C3\uA5C4\uA5C5\uA5C6\uA5C7\uA5C8\uA5C9\uA5CA\uA5CB\uA5CC\uA5CD\uA5CE\uA5CF\uA5D0\uA5D1\uA5D2\uA5D3\uA5D4\uA5D5\uA5D6\uA5D7\uA5D8\uA5D9\uA5DA\uA5DB\uA5DC\uA5DD\uA5DE\uA5DF\uA5E0\uA5E1\uA5E2\uA5E3\uA5E4\uA5E5\uA5E6\uA5E7\uA5E8\uA5E9\uA5EA\uA5EB\uA5EC\uA5ED\uA5EE\uA5EF\uA5F0\uA5F1\uA5F2\uA5F3\uA5F4\uA5F5\uA5F6\uA5F7\uA5F8\uA5F9\uA5FA\uA5FB\uA5FC\uA5FD\uA5FE\uA5FF\uA600\uA601\uA602\uA603\uA604\uA605\uA606\uA607\uA608\uA609\uA60A\uA60B\uA610\uA611\uA612\uA613\uA614\uA615\uA616\uA617\uA618\uA619\uA61A\uA61B\uA61C\uA61D\uA61E\uA61F\uA62A\uA62B\uA66E\uA7FB\uA7FC\uA7FD\uA7FE\uA7FF\uA800\uA801\uA803\uA804\uA805\uA807\uA808\uA809\uA80A\uA80C\uA80D\uA80E\uA80F\uA810\uA811\uA812\uA813\uA814\uA815\uA816\uA817\uA818\uA819\uA81A\uA81B\uA81C\uA81D\uA81E\uA81F\uA820\uA821\uA822\uA840\uA841\uA842\uA843\uA844\uA845\uA846\uA847\uA848\uA849\uA84A\uA84B\uA84C\uA84D\uA84E\uA84F\uA850\uA851\uA852\uA853\uA854\uA855\uA856\uA857\uA858\uA859\uA85A\uA85B\uA85C\uA85D\uA85E\uA85F\uA860\uA861\uA862\uA863\uA864\uA865\uA866\uA867\uA868\uA869\uA86A\uA86B\uA86C\uA86D\uA86E\uA86F\uA870\uA871\uA872\uA873\uA882\uA883\uA884\uA885\uA886\uA887\uA888\uA889\uA88A\uA88B\uA88C\uA88D\uA88E\uA88F\uA890\uA891\uA892\uA893\uA894\uA895\uA896\uA897\uA898\uA899\uA89A\uA89B\uA89C\uA89D\uA89E\uA89F\uA8A0\uA8A1\uA8A2\uA8A3\uA8A4\uA8A5\uA8A6\uA8A7\uA8A8\uA8A9\uA8AA\uA8AB\uA8AC\uA8AD\uA8AE\uA8AF\uA8B0\uA8B1\uA8B2\uA8B3\uA90A\uA90B\uA90C\uA90D\uA90E\uA90F\uA910\uA911\uA912\uA913\uA914\uA915\uA916\uA917\uA918\uA919\uA91A\uA91B\uA91C\uA91D\uA91E\uA91F\uA920\uA921\uA922\uA923\uA924\uA925\uA930\uA931\uA932\uA933\uA934\uA935\uA936\uA937\uA938\uA939\uA93A\uA93B\uA93C\uA93D\uA93E\uA93F\uA940\uA941\uA942\uA943\uA944\uA945\uA946\uAA00\uAA01\uAA02\uAA03\uAA04\uAA05\uAA06\uAA07\uAA08\uAA09\uAA0A\uAA0B\uAA0C\uAA0D\uAA0E\uAA0F\uAA10\uAA11\uAA12\uAA13\uAA14\uAA15\uAA16\uAA17\uAA18\uAA19\uAA1A\uAA1B\uAA1C\uAA1D\uAA1E\uAA1F\uAA20\uAA21\uAA22\uAA23\uAA24\uAA25\uAA26\uAA27\uAA28\uAA40\uAA41\uAA42\uAA44\uAA45\uAA46\uAA47\uAA48\uAA49\uAA4A\uAA4B\uAC00\uD7A3\uF900\uF901\uF902\uF903\uF904\uF905\uF906\uF907\uF908\uF909\uF90A\uF90B\uF90C\uF90D\uF90E\uF90F\uF910\uF911\uF912\uF913\uF914\uF915\uF916\uF917\uF918\uF919\uF91A\uF91B\uF91C\uF91D\uF91E\uF91F\uF920\uF921\uF922\uF923\uF924\uF925\uF926\uF927\uF928\uF929\uF92A\uF92B\uF92C\uF92D\uF92E\uF92F\uF930\uF931\uF932\uF933\uF934\uF935\uF936\uF937\uF938\uF939\uF93A\uF93B\uF93C\uF93D\uF93E\uF93F\uF940\uF941\uF942\uF943\uF944\uF945\uF946\uF947\uF948\uF949\uF94A\uF94B\uF94C\uF94D\uF94E\uF94F\uF950\uF951\uF952\uF953\uF954\uF955\uF956\uF957\uF958\uF959\uF95A\uF95B\uF95C\uF95D\uF95E\uF95F\uF960\uF961\uF962\uF963\uF964\uF965\uF966\uF967\uF968\uF969\uF96A\uF96B\uF96C\uF96D\uF96E\uF96F\uF970\uF971\uF972\uF973\uF974\uF975\uF976\uF977\uF978\uF979\uF97A\uF97B\uF97C\uF97D\uF97E\uF97F\uF980\uF981\uF982\uF983\uF984\uF985\uF986\uF987\uF988\uF989\uF98A\uF98B\uF98C\uF98D\uF98E\uF98F\uF990\uF991\uF992\uF993\uF994\uF995\uF996\uF997\uF998\uF999\uF99A\uF99B\uF99C\uF99D\uF99E\uF99F\uF9A0\uF9A1\uF9A2\uF9A3\uF9A4\uF9A5\uF9A6\uF9A7\uF9A8\uF9A9\uF9AA\uF9AB\uF9AC\uF9AD\uF9AE\uF9AF\uF9B0\uF9B1\uF9B2\uF9B3\uF9B4\uF9B5\uF9B6\uF9B7\uF9B8\uF9B9\uF9BA\uF9BB\uF9BC\uF9BD\uF9BE\uF9BF\uF9C0\uF9C1\uF9C2\uF9C3\uF9C4\uF9C5\uF9C6\uF9C7\uF9C8\uF9C9\uF9CA\uF9CB\uF9CC\uF9CD\uF9CE\uF9CF\uF9D0\uF9D1\uF9D2\uF9D3\uF9D4\uF9D5\uF9D6\uF9D7\uF9D8\uF9D9\uF9DA\uF9DB\uF9DC\uF9DD\uF9DE\uF9DF\uF9E0\uF9E1\uF9E2\uF9E3\uF9E4\uF9E5\uF9E6\uF9E7\uF9E8\uF9E9\uF9EA\uF9EB\uF9EC\uF9ED\uF9EE\uF9EF\uF9F0\uF9F1\uF9F2\uF9F3\uF9F4\uF9F5\uF9F6\uF9F7\uF9F8\uF9F9\uF9FA\uF9FB\uF9FC\uF9FD\uF9FE\uF9FF\uFA00\uFA01\uFA02\uFA03\uFA04\uFA05\uFA06\uFA07\uFA08\uFA09\uFA0A\uFA0B\uFA0C\uFA0D\uFA0E\uFA0F\uFA10\uFA11\uFA12\uFA13\uFA14\uFA15\uFA16\uFA17\uFA18\uFA19\uFA1A\uFA1B\uFA1C\uFA1D\uFA1E\uFA1F\uFA20\uFA21\uFA22\uFA23\uFA24\uFA25\uFA26\uFA27\uFA28\uFA29\uFA2A\uFA2B\uFA2C\uFA2D\uFA30\uFA31\uFA32\uFA33\uFA34\uFA35\uFA36\uFA37\uFA38\uFA39\uFA3A\uFA3B\uFA3C\uFA3D\uFA3E\uFA3F\uFA40\uFA41\uFA42\uFA43\uFA44\uFA45\uFA46\uFA47\uFA48\uFA49\uFA4A\uFA4B\uFA4C\uFA4D\uFA4E\uFA4F\uFA50\uFA51\uFA52\uFA53\uFA54\uFA55\uFA56\uFA57\uFA58\uFA59\uFA5A\uFA5B\uFA5C\uFA5D\uFA5E\uFA5F\uFA60\uFA61\uFA62\uFA63\uFA64\uFA65\uFA66\uFA67\uFA68\uFA69\uFA6A\uFA70\uFA71\uFA72\uFA73\uFA74\uFA75\uFA76\uFA77\uFA78\uFA79\uFA7A\uFA7B\uFA7C\uFA7D\uFA7E\uFA7F\uFA80\uFA81\uFA82\uFA83\uFA84\uFA85\uFA86\uFA87\uFA88\uFA89\uFA8A\uFA8B\uFA8C\uFA8D\uFA8E\uFA8F\uFA90\uFA91\uFA92\uFA93\uFA94\uFA95\uFA96\uFA97\uFA98\uFA99\uFA9A\uFA9B\uFA9C\uFA9D\uFA9E\uFA9F\uFAA0\uFAA1\uFAA2\uFAA3\uFAA4\uFAA5\uFAA6\uFAA7\uFAA8\uFAA9\uFAAA\uFAAB\uFAAC\uFAAD\uFAAE\uFAAF\uFAB0\uFAB1\uFAB2\uFAB3\uFAB4\uFAB5\uFAB6\uFAB7\uFAB8\uFAB9\uFABA\uFABB\uFABC\uFABD\uFABE\uFABF\uFAC0\uFAC1\uFAC2\uFAC3\uFAC4\uFAC5\uFAC6\uFAC7\uFAC8\uFAC9\uFACA\uFACB\uFACC\uFACD\uFACE\uFACF\uFAD0\uFAD1\uFAD2\uFAD3\uFAD4\uFAD5\uFAD6\uFAD7\uFAD8\uFAD9\uFB1D\uFB1F\uFB20\uFB21\uFB22\uFB23\uFB24\uFB25\uFB26\uFB27\uFB28\uFB2A\uFB2B\uFB2C\uFB2D\uFB2E\uFB2F\uFB30\uFB31\uFB32\uFB33\uFB34\uFB35\uFB36\uFB38\uFB39\uFB3A\uFB3B\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46\uFB47\uFB48\uFB49\uFB4A\uFB4B\uFB4C\uFB4D\uFB4E\uFB4F\uFB50\uFB51\uFB52\uFB53\uFB54\uFB55\uFB56\uFB57\uFB58\uFB59\uFB5A\uFB5B\uFB5C\uFB5D\uFB5E\uFB5F\uFB60\uFB61\uFB62\uFB63\uFB64\uFB65\uFB66\uFB67\uFB68\uFB69\uFB6A\uFB6B\uFB6C\uFB6D\uFB6E\uFB6F\uFB70\uFB71\uFB72\uFB73\uFB74\uFB75\uFB76\uFB77\uFB78\uFB79\uFB7A\uFB7B\uFB7C\uFB7D\uFB7E\uFB7F\uFB80\uFB81\uFB82\uFB83\uFB84\uFB85\uFB86\uFB87\uFB88\uFB89\uFB8A\uFB8B\uFB8C\uFB8D\uFB8E\uFB8F\uFB90\uFB91\uFB92\uFB93\uFB94\uFB95\uFB96\uFB97\uFB98\uFB99\uFB9A\uFB9B\uFB9C\uFB9D\uFB9E\uFB9F\uFBA0\uFBA1\uFBA2\uFBA3\uFBA4\uFBA5\uFBA6\uFBA7\uFBA8\uFBA9\uFBAA\uFBAB\uFBAC\uFBAD\uFBAE\uFBAF\uFBB0\uFBB1\uFBD3\uFBD4\uFBD5\uFBD6\uFBD7\uFBD8\uFBD9\uFBDA\uFBDB\uFBDC\uFBDD\uFBDE\uFBDF\uFBE0\uFBE1\uFBE2\uFBE3\uFBE4\uFBE5\uFBE6\uFBE7\uFBE8\uFBE9\uFBEA\uFBEB\uFBEC\uFBED\uFBEE\uFBEF\uFBF0\uFBF1\uFBF2\uFBF3\uFBF4\uFBF5\uFBF6\uFBF7\uFBF8\uFBF9\uFBFA\uFBFB\uFBFC\uFBFD\uFBFE\uFBFF\uFC00\uFC01\uFC02\uFC03\uFC04\uFC05\uFC06\uFC07\uFC08\uFC09\uFC0A\uFC0B\uFC0C\uFC0D\uFC0E\uFC0F\uFC10\uFC11\uFC12\uFC13\uFC14\uFC15\uFC16\uFC17\uFC18\uFC19\uFC1A\uFC1B\uFC1C\uFC1D\uFC1E\uFC1F\uFC20\uFC21\uFC22\uFC23\uFC24\uFC25\uFC26\uFC27\uFC28\uFC29\uFC2A\uFC2B\uFC2C\uFC2D\uFC2E\uFC2F\uFC30\uFC31\uFC32\uFC33\uFC34\uFC35\uFC36\uFC37\uFC38\uFC39\uFC3A\uFC3B\uFC3C\uFC3D\uFC3E\uFC3F\uFC40\uFC41\uFC42\uFC43\uFC44\uFC45\uFC46\uFC47\uFC48\uFC49\uFC4A\uFC4B\uFC4C\uFC4D\uFC4E\uFC4F\uFC50\uFC51\uFC52\uFC53\uFC54\uFC55\uFC56\uFC57\uFC58\uFC59\uFC5A\uFC5B\uFC5C\uFC5D\uFC5E\uFC5F\uFC60\uFC61\uFC62\uFC63\uFC64\uFC65\uFC66\uFC67\uFC68\uFC69\uFC6A\uFC6B\uFC6C\uFC6D\uFC6E\uFC6F\uFC70\uFC71\uFC72\uFC73\uFC74\uFC75\uFC76\uFC77\uFC78\uFC79\uFC7A\uFC7B\uFC7C\uFC7D\uFC7E\uFC7F\uFC80\uFC81\uFC82\uFC83\uFC84\uFC85\uFC86\uFC87\uFC88\uFC89\uFC8A\uFC8B\uFC8C\uFC8D\uFC8E\uFC8F\uFC90\uFC91\uFC92\uFC93\uFC94\uFC95\uFC96\uFC97\uFC98\uFC99\uFC9A\uFC9B\uFC9C\uFC9D\uFC9E\uFC9F\uFCA0\uFCA1\uFCA2\uFCA3\uFCA4\uFCA5\uFCA6\uFCA7\uFCA8\uFCA9\uFCAA\uFCAB\uFCAC\uFCAD\uFCAE\uFCAF\uFCB0\uFCB1\uFCB2\uFCB3\uFCB4\uFCB5\uFCB6\uFCB7\uFCB8\uFCB9\uFCBA\uFCBB\uFCBC\uFCBD\uFCBE\uFCBF\uFCC0\uFCC1\uFCC2\uFCC3\uFCC4\uFCC5\uFCC6\uFCC7\uFCC8\uFCC9\uFCCA\uFCCB\uFCCC\uFCCD\uFCCE\uFCCF\uFCD0\uFCD1\uFCD2\uFCD3\uFCD4\uFCD5\uFCD6\uFCD7\uFCD8\uFCD9\uFCDA\uFCDB\uFCDC\uFCDD\uFCDE\uFCDF\uFCE0\uFCE1\uFCE2\uFCE3\uFCE4\uFCE5\uFCE6\uFCE7\uFCE8\uFCE9\uFCEA\uFCEB\uFCEC\uFCED\uFCEE\uFCEF\uFCF0\uFCF1\uFCF2\uFCF3\uFCF4\uFCF5\uFCF6\uFCF7\uFCF8\uFCF9\uFCFA\uFCFB\uFCFC\uFCFD\uFCFE\uFCFF\uFD00\uFD01\uFD02\uFD03\uFD04\uFD05\uFD06\uFD07\uFD08\uFD09\uFD0A\uFD0B\uFD0C\uFD0D\uFD0E\uFD0F\uFD10\uFD11\uFD12\uFD13\uFD14\uFD15\uFD16\uFD17\uFD18\uFD19\uFD1A\uFD1B\uFD1C\uFD1D\uFD1E\uFD1F\uFD20\uFD21\uFD22\uFD23\uFD24\uFD25\uFD26\uFD27\uFD28\uFD29\uFD2A\uFD2B\uFD2C\uFD2D\uFD2E\uFD2F\uFD30\uFD31\uFD32\uFD33\uFD34\uFD35\uFD36\uFD37\uFD38\uFD39\uFD3A\uFD3B\uFD3C\uFD3D\uFD50\uFD51\uFD52\uFD53\uFD54\uFD55\uFD56\uFD57\uFD58\uFD59\uFD5A\uFD5B\uFD5C\uFD5D\uFD5E\uFD5F\uFD60\uFD61\uFD62\uFD63\uFD64\uFD65\uFD66\uFD67\uFD68\uFD69\uFD6A\uFD6B\uFD6C\uFD6D\uFD6E\uFD6F\uFD70\uFD71\uFD72\uFD73\uFD74\uFD75\uFD76\uFD77\uFD78\uFD79\uFD7A\uFD7B\uFD7C\uFD7D\uFD7E\uFD7F\uFD80\uFD81\uFD82\uFD83\uFD84\uFD85\uFD86\uFD87\uFD88\uFD89\uFD8A\uFD8B\uFD8C\uFD8D\uFD8E\uFD8F\uFD92\uFD93\uFD94\uFD95\uFD96\uFD97\uFD98\uFD99\uFD9A\uFD9B\uFD9C\uFD9D\uFD9E\uFD9F\uFDA0\uFDA1\uFDA2\uFDA3\uFDA4\uFDA5\uFDA6\uFDA7\uFDA8\uFDA9\uFDAA\uFDAB\uFDAC\uFDAD\uFDAE\uFDAF\uFDB0\uFDB1\uFDB2\uFDB3\uFDB4\uFDB5\uFDB6\uFDB7\uFDB8\uFDB9\uFDBA\uFDBB\uFDBC\uFDBD\uFDBE\uFDBF\uFDC0\uFDC1\uFDC2\uFDC3\uFDC4\uFDC5\uFDC6\uFDC7\uFDF0\uFDF1\uFDF2\uFDF3\uFDF4\uFDF5\uFDF6\uFDF7\uFDF8\uFDF9\uFDFA\uFDFB\uFE70\uFE71\uFE72\uFE73\uFE74\uFE76\uFE77\uFE78\uFE79\uFE7A\uFE7B\uFE7C\uFE7D\uFE7E\uFE7F\uFE80\uFE81\uFE82\uFE83\uFE84\uFE85\uFE86\uFE87\uFE88\uFE89\uFE8A\uFE8B\uFE8C\uFE8D\uFE8E\uFE8F\uFE90\uFE91\uFE92\uFE93\uFE94\uFE95\uFE96\uFE97\uFE98\uFE99\uFE9A\uFE9B\uFE9C\uFE9D\uFE9E\uFE9F\uFEA0\uFEA1\uFEA2\uFEA3\uFEA4\uFEA5\uFEA6\uFEA7\uFEA8\uFEA9\uFEAA\uFEAB\uFEAC\uFEAD\uFEAE\uFEAF\uFEB0\uFEB1\uFEB2\uFEB3\uFEB4\uFEB5\uFEB6\uFEB7\uFEB8\uFEB9\uFEBA\uFEBB\uFEBC\uFEBD\uFEBE\uFEBF\uFEC0\uFEC1\uFEC2\uFEC3\uFEC4\uFEC5\uFEC6\uFEC7\uFEC8\uFEC9\uFECA\uFECB\uFECC\uFECD\uFECE\uFECF\uFED0\uFED1\uFED2\uFED3\uFED4\uFED5\uFED6\uFED7\uFED8\uFED9\uFEDA\uFEDB\uFEDC\uFEDD\uFEDE\uFEDF\uFEE0\uFEE1\uFEE2\uFEE3\uFEE4\uFEE5\uFEE6\uFEE7\uFEE8\uFEE9\uFEEA\uFEEB\uFEEC\uFEED\uFEEE\uFEEF\uFEF0\uFEF1\uFEF2\uFEF3\uFEF4\uFEF5\uFEF6\uFEF7\uFEF8\uFEF9\uFEFA\uFEFB\uFEFC\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF71\uFF72\uFF73\uFF74\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C\uFF9D\uFFA0\uFFA1\uFFA2\uFFA3\uFFA4\uFFA5\uFFA6\uFFA7\uFFA8\uFFA9\uFFAA\uFFAB\uFFAC\uFFAD\uFFAE\uFFAF\uFFB0\uFFB1\uFFB2\uFFB3\uFFB4\uFFB5\uFFB6\uFFB7\uFFB8\uFFB9\uFFBA\uFFBB\uFFBC\uFFBD\uFFBE\uFFC2\uFFC3\uFFC4\uFFC5\uFFC6\uFFC7\uFFCA\uFFCB\uFFCC\uFFCD\uFFCE\uFFCF\uFFD2\uFFD3\uFFD4\uFFD5\uFFD6\uFFD7\uFFDA\uFFDB\uFFDC]/,
peg$c79 = { type: "class", value: "[\\u01BB\\u01C0\\u01C1\\u01C2\\u01C3\\u0294\\u05D0\\u05D1\\u05D2\\u05D3\\u05D4\\u05D5\\u05D6\\u05D7\\u05D8\\u05D9\\u05DA\\u05DB\\u05DC\\u05DD\\u05DE\\u05DF\\u05E0\\u05E1\\u05E2\\u05E3\\u05E4\\u05E5\\u05E6\\u05E7\\u05E8\\u05E9\\u05EA\\u05F0\\u05F1\\u05F2\\u0621\\u0622\\u0623\\u0624\\u0625\\u0626\\u0627\\u0628\\u0629\\u062A\\u062B\\u062C\\u062D\\u062E\\u062F\\u0630\\u0631\\u0632\\u0633\\u0634\\u0635\\u0636\\u0637\\u0638\\u0639\\u063A\\u063B\\u063C\\u063D\\u063E\\u063F\\u0641\\u0642\\u0643\\u0644\\u0645\\u0646\\u0647\\u0648\\u0649\\u064A\\u066E\\u066F\\u0671\\u0672\\u0673\\u0674\\u0675\\u0676\\u0677\\u0678\\u0679\\u067A\\u067B\\u067C\\u067D\\u067E\\u067F\\u0680\\u0681\\u0682\\u0683\\u0684\\u0685\\u0686\\u0687\\u0688\\u0689\\u068A\\u068B\\u068C\\u068D\\u068E\\u068F\\u0690\\u0691\\u0692\\u0693\\u0694\\u0695\\u0696\\u0697\\u0698\\u0699\\u069A\\u069B\\u069C\\u069D\\u069E\\u069F\\u06A0\\u06A1\\u06A2\\u06A3\\u06A4\\u06A5\\u06A6\\u06A7\\u06A8\\u06A9\\u06AA\\u06AB\\u06AC\\u06AD\\u06AE\\u06AF\\u06B0\\u06B1\\u06B2\\u06B3\\u06B4\\u06B5\\u06B6\\u06B7\\u06B8\\u06B9\\u06BA\\u06BB\\u06BC\\u06BD\\u06BE\\u06BF\\u06C0\\u06C1\\u06C2\\u06C3\\u06C4\\u06C5\\u06C6\\u06C7\\u06C8\\u06C9\\u06CA\\u06CB\\u06CC\\u06CD\\u06CE\\u06CF\\u06D0\\u06D1\\u06D2\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA\\u06FB\\u06FC\\u06FF\\u0710\\u0712\\u0713\\u0714\\u0715\\u0716\\u0717\\u0718\\u0719\\u071A\\u071B\\u071C\\u071D\\u071E\\u071F\\u0720\\u0721\\u0722\\u0723\\u0724\\u0725\\u0726\\u0727\\u0728\\u0729\\u072A\\u072B\\u072C\\u072D\\u072E\\u072F\\u074D\\u074E\\u074F\\u0750\\u0751\\u0752\\u0753\\u0754\\u0755\\u0756\\u0757\\u0758\\u0759\\u075A\\u075B\\u075C\\u075D\\u075E\\u075F\\u0760\\u0761\\u0762\\u0763\\u0764\\u0765\\u0766\\u0767\\u0768\\u0769\\u076A\\u076B\\u076C\\u076D\\u076E\\u076F\\u0770\\u0771\\u0772\\u0773\\u0774\\u0775\\u0776\\u0777\\u0778\\u0779\\u077A\\u077B\\u077C\\u077D\\u077E\\u077F\\u0780\\u0781\\u0782\\u0783\\u0784\\u0785\\u0786\\u0787\\u0788\\u0789\\u078A\\u078B\\u078C\\u078D\\u078E\\u078F\\u0790\\u0791\\u0792\\u0793\\u0794\\u0795\\u0796\\u0797\\u0798\\u0799\\u079A\\u079B\\u079C\\u079D\\u079E\\u079F\\u07A0\\u07A1\\u07A2\\u07A3\\u07A4\\u07A5\\u07B1\\u07CA\\u07CB\\u07CC\\u07CD\\u07CE\\u07CF\\u07D0\\u07D1\\u07D2\\u07D3\\u07D4\\u07D5\\u07D6\\u07D7\\u07D8\\u07D9\\u07DA\\u07DB\\u07DC\\u07DD\\u07DE\\u07DF\\u07E0\\u07E1\\u07E2\\u07E3\\u07E4\\u07E5\\u07E6\\u07E7\\u07E8\\u07E9\\u07EA\\u0904\\u0905\\u0906\\u0907\\u0908\\u0909\\u090A\\u090B\\u090C\\u090D\\u090E\\u090F\\u0910\\u0911\\u0912\\u0913\\u0914\\u0915\\u0916\\u0917\\u0918\\u0919\\u091A\\u091B\\u091C\\u091D\\u091E\\u091F\\u0920\\u0921\\u0922\\u0923\\u0924\\u0925\\u0926\\u0927\\u0928\\u0929\\u092A\\u092B\\u092C\\u092D\\u092E\\u092F\\u0930\\u0931\\u0932\\u0933\\u0934\\u0935\\u0936\\u0937\\u0938\\u0939\\u093D\\u0950\\u0958\\u0959\\u095A\\u095B\\u095C\\u095D\\u095E\\u095F\\u0960\\u0961\\u0972\\u097B\\u097C\\u097D\\u097E\\u097F\\u0985\\u0986\\u0987\\u0988\\u0989\\u098A\\u098B\\u098C\\u098F\\u0990\\u0993\\u0994\\u0995\\u0996\\u0997\\u0998\\u0999\\u099A\\u099B\\u099C\\u099D\\u099E\\u099F\\u09A0\\u09A1\\u09A2\\u09A3\\u09A4\\u09A5\\u09A6\\u09A7\\u09A8\\u09AA\\u09AB\\u09AC\\u09AD\\u09AE\\u09AF\\u09B0\\u09B2\\u09B6\\u09B7\\u09B8\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1\\u09F0\\u09F1\\u0A05\\u0A06\\u0A07\\u0A08\\u0A09\\u0A0A\\u0A0F\\u0A10\\u0A13\\u0A14\\u0A15\\u0A16\\u0A17\\u0A18\\u0A19\\u0A1A\\u0A1B\\u0A1C\\u0A1D\\u0A1E\\u0A1F\\u0A20\\u0A21\\u0A22\\u0A23\\u0A24\\u0A25\\u0A26\\u0A27\\u0A28\\u0A2A\\u0A2B\\u0A2C\\u0A2D\\u0A2E\\u0A2F\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74\\u0A85\\u0A86\\u0A87\\u0A88\\u0A89\\u0A8A\\u0A8B\\u0A8C\\u0A8D\\u0A8F\\u0A90\\u0A91\\u0A93\\u0A94\\u0A95\\u0A96\\u0A97\\u0A98\\u0A99\\u0A9A\\u0A9B\\u0A9C\\u0A9D\\u0A9E\\u0A9F\\u0AA0\\u0AA1\\u0AA2\\u0AA3\\u0AA4\\u0AA5\\u0AA6\\u0AA7\\u0AA8\\u0AAA\\u0AAB\\u0AAC\\u0AAD\\u0AAE\\u0AAF\\u0AB0\\u0AB2\\u0AB3\\u0AB5\\u0AB6\\u0AB7\\u0AB8\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05\\u0B06\\u0B07\\u0B08\\u0B09\\u0B0A\\u0B0B\\u0B0C\\u0B0F\\u0B10\\u0B13\\u0B14\\u0B15\\u0B16\\u0B17\\u0B18\\u0B19\\u0B1A\\u0B1B\\u0B1C\\u0B1D\\u0B1E\\u0B1F\\u0B20\\u0B21\\u0B22\\u0B23\\u0B24\\u0B25\\u0B26\\u0B27\\u0B28\\u0B2A\\u0B2B\\u0B2C\\u0B2D\\u0B2E\\u0B2F\\u0B30\\u0B32\\u0B33\\u0B35\\u0B36\\u0B37\\u0B38\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61\\u0B71\\u0B83\\u0B85\\u0B86\\u0B87\\u0B88\\u0B89\\u0B8A\\u0B8E\\u0B8F\\u0B90\\u0B92\\u0B93\\u0B94\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8\\u0BA9\\u0BAA\\u0BAE\\u0BAF\\u0BB0\\u0BB1\\u0BB2\\u0BB3\\u0BB4\\u0BB5\\u0BB6\\u0BB7\\u0BB8\\u0BB9\\u0BD0\\u0C05\\u0C06\\u0C07\\u0C08\\u0C09\\u0C0A\\u0C0B\\u0C0C\\u0C0E\\u0C0F\\u0C10\\u0C12\\u0C13\\u0C14\\u0C15\\u0C16\\u0C17\\u0C18\\u0C19\\u0C1A\\u0C1B\\u0C1C\\u0C1D\\u0C1E\\u0C1F\\u0C20\\u0C21\\u0C22\\u0C23\\u0C24\\u0C25\\u0C26\\u0C27\\u0C28\\u0C2A\\u0C2B\\u0C2C\\u0C2D\\u0C2E\\u0C2F\\u0C30\\u0C31\\u0C32\\u0C33\\u0C35\\u0C36\\u0C37\\u0C38\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85\\u0C86\\u0C87\\u0C88\\u0C89\\u0C8A\\u0C8B\\u0C8C\\u0C8E\\u0C8F\\u0C90\\u0C92\\u0C93\\u0C94\\u0C95\\u0C96\\u0C97\\u0C98\\u0C99\\u0C9A\\u0C9B\\u0C9C\\u0C9D\\u0C9E\\u0C9F\\u0CA0\\u0CA1\\u0CA2\\u0CA3\\u0CA4\\u0CA5\\u0CA6\\u0CA7\\u0CA8\\u0CAA\\u0CAB\\u0CAC\\u0CAD\\u0CAE\\u0CAF\\u0CB0\\u0CB1\\u0CB2\\u0CB3\\u0CB5\\u0CB6\\u0CB7\\u0CB8\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05\\u0D06\\u0D07\\u0D08\\u0D09\\u0D0A\\u0D0B\\u0D0C\\u0D0E\\u0D0F\\u0D10\\u0D12\\u0D13\\u0D14\\u0D15\\u0D16\\u0D17\\u0D18\\u0D19\\u0D1A\\u0D1B\\u0D1C\\u0D1D\\u0D1E\\u0D1F\\u0D20\\u0D21\\u0D22\\u0D23\\u0D24\\u0D25\\u0D26\\u0D27\\u0D28\\u0D2A\\u0D2B\\u0D2C\\u0D2D\\u0D2E\\u0D2F\\u0D30\\u0D31\\u0D32\\u0D33\\u0D34\\u0D35\\u0D36\\u0D37\\u0D38\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A\\u0D7B\\u0D7C\\u0D7D\\u0D7E\\u0D7F\\u0D85\\u0D86\\u0D87\\u0D88\\u0D89\\u0D8A\\u0D8B\\u0D8C\\u0D8D\\u0D8E\\u0D8F\\u0D90\\u0D91\\u0D92\\u0D93\\u0D94\\u0D95\\u0D96\\u0D9A\\u0D9B\\u0D9C\\u0D9D\\u0D9E\\u0D9F\\u0DA0\\u0DA1\\u0DA2\\u0DA3\\u0DA4\\u0DA5\\u0DA6\\u0DA7\\u0DA8\\u0DA9\\u0DAA\\u0DAB\\u0DAC\\u0DAD\\u0DAE\\u0DAF\\u0DB0\\u0DB1\\u0DB3\\u0DB4\\u0DB5\\u0DB6\\u0DB7\\u0DB8\\u0DB9\\u0DBA\\u0DBB\\u0DBD\\u0DC0\\u0DC1\\u0DC2\\u0DC3\\u0DC4\\u0DC5\\u0DC6\\u0E01\\u0E02\\u0E03\\u0E04\\u0E05\\u0E06\\u0E07\\u0E08\\u0E09\\u0E0A\\u0E0B\\u0E0C\\u0E0D\\u0E0E\\u0E0F\\u0E10\\u0E11\\u0E12\\u0E13\\u0E14\\u0E15\\u0E16\\u0E17\\u0E18\\u0E19\\u0E1A\\u0E1B\\u0E1C\\u0E1D\\u0E1E\\u0E1F\\u0E20\\u0E21\\u0E22\\u0E23\\u0E24\\u0E25\\u0E26\\u0E27\\u0E28\\u0E29\\u0E2A\\u0E2B\\u0E2C\\u0E2D\\u0E2E\\u0E2F\\u0E30\\u0E32\\u0E33\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94\\u0E95\\u0E96\\u0E97\\u0E99\\u0E9A\\u0E9B\\u0E9C\\u0E9D\\u0E9E\\u0E9F\\u0EA1\\u0EA2\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD\\u0EAE\\u0EAF\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\u0EDC\\u0EDD\\u0F00\\u0F40\\u0F41\\u0F42\\u0F43\\u0F44\\u0F45\\u0F46\\u0F47\\u0F49\\u0F4A\\u0F4B\\u0F4C\\u0F4D\\u0F4E\\u0F4F\\u0F50\\u0F51\\u0F52\\u0F53\\u0F54\\u0F55\\u0F56\\u0F57\\u0F58\\u0F59\\u0F5A\\u0F5B\\u0F5C\\u0F5D\\u0F5E\\u0F5F\\u0F60\\u0F61\\u0F62\\u0F63\\u0F64\\u0F65\\u0F66\\u0F67\\u0F68\\u0F69\\u0F6A\\u0F6B\\u0F6C\\u0F88\\u0F89\\u0F8A\\u0F8B\\u1000\\u1001\\u1002\\u1003\\u1004\\u1005\\u1006\\u1007\\u1008\\u1009\\u100A\\u100B\\u100C\\u100D\\u100E\\u100F\\u1010\\u1011\\u1012\\u1013\\u1014\\u1015\\u1016\\u1017\\u1018\\u1019\\u101A\\u101B\\u101C\\u101D\\u101E\\u101F\\u1020\\u1021\\u1022\\u1023\\u1024\\u1025\\u1026\\u1027\\u1028\\u1029\\u102A\\u103F\\u1050\\u1051\\u1052\\u1053\\u1054\\u1055\\u105A\\u105B\\u105C\\u105D\\u1061\\u1065\\u1066\\u106E\\u106F\\u1070\\u1075\\u1076\\u1077\\u1078\\u1079\\u107A\\u107B\\u107C\\u107D\\u107E\\u107F\\u1080\\u1081\\u108E\\u10D0\\u10D1\\u10D2\\u10D3\\u10D4\\u10D5\\u10D6\\u10D7\\u10D8\\u10D9\\u10DA\\u10DB\\u10DC\\u10DD\\u10DE\\u10DF\\u10E0\\u10E1\\u10E2\\u10E3\\u10E4\\u10E5\\u10E6\\u10E7\\u10E8\\u10E9\\u10EA\\u10EB\\u10EC\\u10ED\\u10EE\\u10EF\\u10F0\\u10F1\\u10F2\\u10F3\\u10F4\\u10F5\\u10F6\\u10F7\\u10F8\\u10F9\\u10FA\\u1100\\u1101\\u1102\\u1103\\u1104\\u1105\\u1106\\u1107\\u1108\\u1109\\u110A\\u110B\\u110C\\u110D\\u110E\\u110F\\u1110\\u1111\\u1112\\u1113\\u1114\\u1115\\u1116\\u1117\\u1118\\u1119\\u111A\\u111B\\u111C\\u111D\\u111E\\u111F\\u1120\\u1121\\u1122\\u1123\\u1124\\u1125\\u1126\\u1127\\u1128\\u1129\\u112A\\u112B\\u112C\\u112D\\u112E\\u112F\\u1130\\u1131\\u1132\\u1133\\u1134\\u1135\\u1136\\u1137\\u1138\\u1139\\u113A\\u113B\\u113C\\u113D\\u113E\\u113F\\u1140\\u1141\\u1142\\u1143\\u1144\\u1145\\u1146\\u1147\\u1148\\u1149\\u114A\\u114B\\u114C\\u114D\\u114E\\u114F\\u1150\\u1151\\u1152\\u1153\\u1154\\u1155\\u1156\\u1157\\u1158\\u1159\\u115F\\u1160\\u1161\\u1162\\u1163\\u1164\\u1165\\u1166\\u1167\\u1168\\u1169\\u116A\\u116B\\u116C\\u116D\\u116E\\u116F\\u1170\\u1171\\u1172\\u1173\\u1174\\u1175\\u1176\\u1177\\u1178\\u1179\\u117A\\u117B\\u117C\\u117D\\u117E\\u117F\\u1180\\u1181\\u1182\\u1183\\u1184\\u1185\\u1186\\u1187\\u1188\\u1189\\u118A\\u118B\\u118C\\u118D\\u118E\\u118F\\u1190\\u1191\\u1192\\u1193\\u1194\\u1195\\u1196\\u1197\\u1198\\u1199\\u119A\\u119B\\u119C\\u119D\\u119E\\u119F\\u11A0\\u11A1\\u11A2\\u11A8\\u11A9\\u11AA\\u11AB\\u11AC\\u11AD\\u11AE\\u11AF\\u11B0\\u11B1\\u11B2\\u11B3\\u11B4\\u11B5\\u11B6\\u11B7\\u11B8\\u11B9\\u11BA\\u11BB\\u11BC\\u11BD\\u11BE\\u11BF\\u11C0\\u11C1\\u11C2\\u11C3\\u11C4\\u11C5\\u11C6\\u11C7\\u11C8\\u11C9\\u11CA\\u11CB\\u11CC\\u11CD\\u11CE\\u11CF\\u11D0\\u11D1\\u11D2\\u11D3\\u11D4\\u11D5\\u11D6\\u11D7\\u11D8\\u11D9\\u11DA\\u11DB\\u11DC\\u11DD\\u11DE\\u11DF\\u11E0\\u11E1\\u11E2\\u11E3\\u11E4\\u11E5\\u11E6\\u11E7\\u11E8\\u11E9\\u11EA\\u11EB\\u11EC\\u11ED\\u11EE\\u11EF\\u11F0\\u11F1\\u11F2\\u11F3\\u11F4\\u11F5\\u11F6\\u11F7\\u11F8\\u11F9\\u1200\\u1201\\u1202\\u1203\\u1204\\u1205\\u1206\\u1207\\u1208\\u1209\\u120A\\u120B\\u120C\\u120D\\u120E\\u120F\\u1210\\u1211\\u1212\\u1213\\u1214\\u1215\\u1216\\u1217\\u1218\\u1219\\u121A\\u121B\\u121C\\u121D\\u121E\\u121F\\u1220\\u1221\\u1222\\u1223\\u1224\\u1225\\u1226\\u1227\\u1228\\u1229\\u122A\\u122B\\u122C\\u122D\\u122E\\u122F\\u1230\\u1231\\u1232\\u1233\\u1234\\u1235\\u1236\\u1237\\u1238\\u1239\\u123A\\u123B\\u123C\\u123D\\u123E\\u123F\\u1240\\u1241\\u1242\\u1243\\u1244\\u1245\\u1246\\u1247\\u1248\\u124A\\u124B\\u124C\\u124D\\u1250\\u1251\\u1252\\u1253\\u1254\\u1255\\u1256\\u1258\\u125A\\u125B\\u125C\\u125D\\u1260\\u1261\\u1262\\u1263\\u1264\\u1265\\u1266\\u1267\\u1268\\u1269\\u126A\\u126B\\u126C\\u126D\\u126E\\u126F\\u1270\\u1271\\u1272\\u1273\\u1274\\u1275\\u1276\\u1277\\u1278\\u1279\\u127A\\u127B\\u127C\\u127D\\u127E\\u127F\\u1280\\u1281\\u1282\\u1283\\u1284\\u1285\\u1286\\u1287\\u1288\\u128A\\u128B\\u128C\\u128D\\u1290\\u1291\\u1292\\u1293\\u1294\\u1295\\u1296\\u1297\\u1298\\u1299\\u129A\\u129B\\u129C\\u129D\\u129E\\u129F\\u12A0\\u12A1\\u12A2\\u12A3\\u12A4\\u12A5\\u12A6\\u12A7\\u12A8\\u12A9\\u12AA\\u12AB\\u12AC\\u12AD\\u12AE\\u12AF\\u12B0\\u12B2\\u12B3\\u12B4\\u12B5\\u12B8\\u12B9\\u12BA\\u12BB\\u12BC\\u12BD\\u12BE\\u12C0\\u12C2\\u12C3\\u12C4\\u12C5\\u12C8\\u12C9\\u12CA\\u12CB\\u12CC\\u12CD\\u12CE\\u12CF\\u12D0\\u12D1\\u12D2\\u12D3\\u12D4\\u12D5\\u12D6\\u12D8\\u12D9\\u12DA\\u12DB\\u12DC\\u12DD\\u12DE\\u12DF\\u12E0\\u12E1\\u12E2\\u12E3\\u12E4\\u12E5\\u12E6\\u12E7\\u12E8\\u12E9\\u12EA\\u12EB\\u12EC\\u12ED\\u12EE\\u12EF\\u12F0\\u12F1\\u12F2\\u12F3\\u12F4\\u12F5\\u12F6\\u12F7\\u12F8\\u12F9\\u12FA\\u12FB\\u12FC\\u12FD\\u12FE\\u12FF\\u1300\\u1301\\u1302\\u1303\\u1304\\u1305\\u1306\\u1307\\u1308\\u1309\\u130A\\u130B\\u130C\\u130D\\u130E\\u130F\\u1310\\u1312\\u1313\\u1314\\u1315\\u1318\\u1319\\u131A\\u131B\\u131C\\u131D\\u131E\\u131F\\u1320\\u1321\\u1322\\u1323\\u1324\\u1325\\u1326\\u1327\\u1328\\u1329\\u132A\\u132B\\u132C\\u132D\\u132E\\u132F\\u1330\\u1331\\u1332\\u1333\\u1334\\u1335\\u1336\\u1337\\u1338\\u1339\\u133A\\u133B\\u133C\\u133D\\u133E\\u133F\\u1340\\u1341\\u1342\\u1343\\u1344\\u1345\\u1346\\u1347\\u1348\\u1349\\u134A\\u134B\\u134C\\u134D\\u134E\\u134F\\u1350\\u1351\\u1352\\u1353\\u1354\\u1355\\u1356\\u1357\\u1358\\u1359\\u135A\\u1380\\u1381\\u1382\\u1383\\u1384\\u1385\\u1386\\u1387\\u1388\\u1389\\u138A\\u138B\\u138C\\u138D\\u138E\\u138F\\u13A0\\u13A1\\u13A2\\u13A3\\u13A4\\u13A5\\u13A6\\u13A7\\u13A8\\u13A9\\u13AA\\u13AB\\u13AC\\u13AD\\u13AE\\u13AF\\u13B0\\u13B1\\u13B2\\u13B3\\u13B4\\u13B5\\u13B6\\u13B7\\u13B8\\u13B9\\u13BA\\u13BB\\u13BC\\u13BD\\u13BE\\u13BF\\u13C0\\u13C1\\u13C2\\u13C3\\u13C4\\u13C5\\u13C6\\u13C7\\u13C8\\u13C9\\u13CA\\u13CB\\u13CC\\u13CD\\u13CE\\u13CF\\u13D0\\u13D1\\u13D2\\u13D3\\u13D4\\u13D5\\u13D6\\u13D7\\u13D8\\u13D9\\u13DA\\u13DB\\u13DC\\u13DD\\u13DE\\u13DF\\u13E0\\u13E1\\u13E2\\u13E3\\u13E4\\u13E5\\u13E6\\u13E7\\u13E8\\u13E9\\u13EA\\u13EB\\u13EC\\u13ED\\u13EE\\u13EF\\u13F0\\u13F1\\u13F2\\u13F3\\u13F4\\u1401\\u1402\\u1403\\u1404\\u1405\\u1406\\u1407\\u1408\\u1409\\u140A\\u140B\\u140C\\u140D\\u140E\\u140F\\u1410\\u1411\\u1412\\u1413\\u1414\\u1415\\u1416\\u1417\\u1418\\u1419\\u141A\\u141B\\u141C\\u141D\\u141E\\u141F\\u1420\\u1421\\u1422\\u1423\\u1424\\u1425\\u1426\\u1427\\u1428\\u1429\\u142A\\u142B\\u142C\\u142D\\u142E\\u142F\\u1430\\u1431\\u1432\\u1433\\u1434\\u1435\\u1436\\u1437\\u1438\\u1439\\u143A\\u143B\\u143C\\u143D\\u143E\\u143F\\u1440\\u1441\\u1442\\u1443\\u1444\\u1445\\u1446\\u1447\\u1448\\u1449\\u144A\\u144B\\u144C\\u144D\\u144E\\u144F\\u1450\\u1451\\u1452\\u1453\\u1454\\u1455\\u1456\\u1457\\u1458\\u1459\\u145A\\u145B\\u145C\\u145D\\u145E\\u145F\\u1460\\u1461\\u1462\\u1463\\u1464\\u1465\\u1466\\u1467\\u1468\\u1469\\u146A\\u146B\\u146C\\u146D\\u146E\\u146F\\u1470\\u1471\\u1472\\u1473\\u1474\\u1475\\u1476\\u1477\\u1478\\u1479\\u147A\\u147B\\u147C\\u147D\\u147E\\u147F\\u1480\\u1481\\u1482\\u1483\\u1484\\u1485\\u1486\\u1487\\u1488\\u1489\\u148A\\u148B\\u148C\\u148D\\u148E\\u148F\\u1490\\u1491\\u1492\\u1493\\u1494\\u1495\\u1496\\u1497\\u1498\\u1499\\u149A\\u149B\\u149C\\u149D\\u149E\\u149F\\u14A0\\u14A1\\u14A2\\u14A3\\u14A4\\u14A5\\u14A6\\u14A7\\u14A8\\u14A9\\u14AA\\u14AB\\u14AC\\u14AD\\u14AE\\u14AF\\u14B0\\u14B1\\u14B2\\u14B3\\u14B4\\u14B5\\u14B6\\u14B7\\u14B8\\u14B9\\u14BA\\u14BB\\u14BC\\u14BD\\u14BE\\u14BF\\u14C0\\u14C1\\u14C2\\u14C3\\u14C4\\u14C5\\u14C6\\u14C7\\u14C8\\u14C9\\u14CA\\u14CB\\u14CC\\u14CD\\u14CE\\u14CF\\u14D0\\u14D1\\u14D2\\u14D3\\u14D4\\u14D5\\u14D6\\u14D7\\u14D8\\u14D9\\u14DA\\u14DB\\u14DC\\u14DD\\u14DE\\u14DF\\u14E0\\u14E1\\u14E2\\u14E3\\u14E4\\u14E5\\u14E6\\u14E7\\u14E8\\u14E9\\u14EA\\u14EB\\u14EC\\u14ED\\u14EE\\u14EF\\u14F0\\u14F1\\u14F2\\u14F3\\u14F4\\u14F5\\u14F6\\u14F7\\u14F8\\u14F9\\u14FA\\u14FB\\u14FC\\u14FD\\u14FE\\u14FF\\u1500\\u1501\\u1502\\u1503\\u1504\\u1505\\u1506\\u1507\\u1508\\u1509\\u150A\\u150B\\u150C\\u150D\\u150E\\u150F\\u1510\\u1511\\u1512\\u1513\\u1514\\u1515\\u1516\\u1517\\u1518\\u1519\\u151A\\u151B\\u151C\\u151D\\u151E\\u151F\\u1520\\u1521\\u1522\\u1523\\u1524\\u1525\\u1526\\u1527\\u1528\\u1529\\u152A\\u152B\\u152C\\u152D\\u152E\\u152F\\u1530\\u1531\\u1532\\u1533\\u1534\\u1535\\u1536\\u1537\\u1538\\u1539\\u153A\\u153B\\u153C\\u153D\\u153E\\u153F\\u1540\\u1541\\u1542\\u1543\\u1544\\u1545\\u1546\\u1547\\u1548\\u1549\\u154A\\u154B\\u154C\\u154D\\u154E\\u154F\\u1550\\u1551\\u1552\\u1553\\u1554\\u1555\\u1556\\u1557\\u1558\\u1559\\u155A\\u155B\\u155C\\u155D\\u155E\\u155F\\u1560\\u1561\\u1562\\u1563\\u1564\\u1565\\u1566\\u1567\\u1568\\u1569\\u156A\\u156B\\u156C\\u156D\\u156E\\u156F\\u1570\\u1571\\u1572\\u1573\\u1574\\u1575\\u1576\\u1577\\u1578\\u1579\\u157A\\u157B\\u157C\\u157D\\u157E\\u157F\\u1580\\u1581\\u1582\\u1583\\u1584\\u1585\\u1586\\u1587\\u1588\\u1589\\u158A\\u158B\\u158C\\u158D\\u158E\\u158F\\u1590\\u1591\\u1592\\u1593\\u1594\\u1595\\u1596\\u1597\\u1598\\u1599\\u159A\\u159B\\u159C\\u159D\\u159E\\u159F\\u15A0\\u15A1\\u15A2\\u15A3\\u15A4\\u15A5\\u15A6\\u15A7\\u15A8\\u15A9\\u15AA\\u15AB\\u15AC\\u15AD\\u15AE\\u15AF\\u15B0\\u15B1\\u15B2\\u15B3\\u15B4\\u15B5\\u15B6\\u15B7\\u15B8\\u15B9\\u15BA\\u15BB\\u15BC\\u15BD\\u15BE\\u15BF\\u15C0\\u15C1\\u15C2\\u15C3\\u15C4\\u15C5\\u15C6\\u15C7\\u15C8\\u15C9\\u15CA\\u15CB\\u15CC\\u15CD\\u15CE\\u15CF\\u15D0\\u15D1\\u15D2\\u15D3\\u15D4\\u15D5\\u15D6\\u15D7\\u15D8\\u15D9\\u15DA\\u15DB\\u15DC\\u15DD\\u15DE\\u15DF\\u15E0\\u15E1\\u15E2\\u15E3\\u15E4\\u15E5\\u15E6\\u15E7\\u15E8\\u15E9\\u15EA\\u15EB\\u15EC\\u15ED\\u15EE\\u15EF\\u15F0\\u15F1\\u15F2\\u15F3\\u15F4\\u15F5\\u15F6\\u15F7\\u15F8\\u15F9\\u15FA\\u15FB\\u15FC\\u15FD\\u15FE\\u15FF\\u1600\\u1601\\u1602\\u1603\\u1604\\u1605\\u1606\\u1607\\u1608\\u1609\\u160A\\u160B\\u160C\\u160D\\u160E\\u160F\\u1610\\u1611\\u1612\\u1613\\u1614\\u1615\\u1616\\u1617\\u1618\\u1619\\u161A\\u161B\\u161C\\u161D\\u161E\\u161F\\u1620\\u1621\\u1622\\u1623\\u1624\\u1625\\u1626\\u1627\\u1628\\u1629\\u162A\\u162B\\u162C\\u162D\\u162E\\u162F\\u1630\\u1631\\u1632\\u1633\\u1634\\u1635\\u1636\\u1637\\u1638\\u1639\\u163A\\u163B\\u163C\\u163D\\u163E\\u163F\\u1640\\u1641\\u1642\\u1643\\u1644\\u1645\\u1646\\u1647\\u1648\\u1649\\u164A\\u164B\\u164C\\u164D\\u164E\\u164F\\u1650\\u1651\\u1652\\u1653\\u1654\\u1655\\u1656\\u1657\\u1658\\u1659\\u165A\\u165B\\u165C\\u165D\\u165E\\u165F\\u1660\\u1661\\u1662\\u1663\\u1664\\u1665\\u1666\\u1667\\u1668\\u1669\\u166A\\u166B\\u166C\\u166F\\u1670\\u1671\\u1672\\u1673\\u1674\\u1675\\u1676\\u1681\\u1682\\u1683\\u1684\\u1685\\u1686\\u1687\\u1688\\u1689\\u168A\\u168B\\u168C\\u168D\\u168E\\u168F\\u1690\\u1691\\u1692\\u1693\\u1694\\u1695\\u1696\\u1697\\u1698\\u1699\\u169A\\u16A0\\u16A1\\u16A2\\u16A3\\u16A4\\u16A5\\u16A6\\u16A7\\u16A8\\u16A9\\u16AA\\u16AB\\u16AC\\u16AD\\u16AE\\u16AF\\u16B0\\u16B1\\u16B2\\u16B3\\u16B4\\u16B5\\u16B6\\u16B7\\u16B8\\u16B9\\u16BA\\u16BB\\u16BC\\u16BD\\u16BE\\u16BF\\u16C0\\u16C1\\u16C2\\u16C3\\u16C4\\u16C5\\u16C6\\u16C7\\u16C8\\u16C9\\u16CA\\u16CB\\u16CC\\u16CD\\u16CE\\u16CF\\u16D0\\u16D1\\u16D2\\u16D3\\u16D4\\u16D5\\u16D6\\u16D7\\u16D8\\u16D9\\u16DA\\u16DB\\u16DC\\u16DD\\u16DE\\u16DF\\u16E0\\u16E1\\u16E2\\u16E3\\u16E4\\u16E5\\u16E6\\u16E7\\u16E8\\u16E9\\u16EA\\u1700\\u1701\\u1702\\u1703\\u1704\\u1705\\u1706\\u1707\\u1708\\u1709\\u170A\\u170B\\u170C\\u170E\\u170F\\u1710\\u1711\\u1720\\u1721\\u1722\\u1723\\u1724\\u1725\\u1726\\u1727\\u1728\\u1729\\u172A\\u172B\\u172C\\u172D\\u172E\\u172F\\u1730\\u1731\\u1740\\u1741\\u1742\\u1743\\u1744\\u1745\\u1746\\u1747\\u1748\\u1749\\u174A\\u174B\\u174C\\u174D\\u174E\\u174F\\u1750\\u1751\\u1760\\u1761\\u1762\\u1763\\u1764\\u1765\\u1766\\u1767\\u1768\\u1769\\u176A\\u176B\\u176C\\u176E\\u176F\\u1770\\u1780\\u1781\\u1782\\u1783\\u1784\\u1785\\u1786\\u1787\\u1788\\u1789\\u178A\\u178B\\u178C\\u178D\\u178E\\u178F\\u1790\\u1791\\u1792\\u1793\\u1794\\u1795\\u1796\\u1797\\u1798\\u1799\\u179A\\u179B\\u179C\\u179D\\u179E\\u179F\\u17A0\\u17A1\\u17A2\\u17A3\\u17A4\\u17A5\\u17A6\\u17A7\\u17A8\\u17A9\\u17AA\\u17AB\\u17AC\\u17AD\\u17AE\\u17AF\\u17B0\\u17B1\\u17B2\\u17B3\\u17DC\\u1820\\u1821\\u1822\\u1823\\u1824\\u1825\\u1826\\u1827\\u1828\\u1829\\u182A\\u182B\\u182C\\u182D\\u182E\\u182F\\u1830\\u1831\\u1832\\u1833\\u1834\\u1835\\u1836\\u1837\\u1838\\u1839\\u183A\\u183B\\u183C\\u183D\\u183E\\u183F\\u1840\\u1841\\u1842\\u1844\\u1845\\u1846\\u1847\\u1848\\u1849\\u184A\\u184B\\u184C\\u184D\\u184E\\u184F\\u1850\\u1851\\u1852\\u1853\\u1854\\u1855\\u1856\\u1857\\u1858\\u1859\\u185A\\u185B\\u185C\\u185D\\u185E\\u185F\\u1860\\u1861\\u1862\\u1863\\u1864\\u1865\\u1866\\u1867\\u1868\\u1869\\u186A\\u186B\\u186C\\u186D\\u186E\\u186F\\u1870\\u1871\\u1872\\u1873\\u1874\\u1875\\u1876\\u1877\\u1880\\u1881\\u1882\\u1883\\u1884\\u1885\\u1886\\u1887\\u1888\\u1889\\u188A\\u188B\\u188C\\u188D\\u188E\\u188F\\u1890\\u1891\\u1892\\u1893\\u1894\\u1895\\u1896\\u1897\\u1898\\u1899\\u189A\\u189B\\u189C\\u189D\\u189E\\u189F\\u18A0\\u18A1\\u18A2\\u18A3\\u18A4\\u18A5\\u18A6\\u18A7\\u18A8\\u18AA\\u1900\\u1901\\u1902\\u1903\\u1904\\u1905\\u1906\\u1907\\u1908\\u1909\\u190A\\u190B\\u190C\\u190D\\u190E\\u190F\\u1910\\u1911\\u1912\\u1913\\u1914\\u1915\\u1916\\u1917\\u1918\\u1919\\u191A\\u191B\\u191C\\u1950\\u1951\\u1952\\u1953\\u1954\\u1955\\u1956\\u1957\\u1958\\u1959\\u195A\\u195B\\u195C\\u195D\\u195E\\u195F\\u1960\\u1961\\u1962\\u1963\\u1964\\u1965\\u1966\\u1967\\u1968\\u1969\\u196A\\u196B\\u196C\\u196D\\u1970\\u1971\\u1972\\u1973\\u1974\\u1980\\u1981\\u1982\\u1983\\u1984\\u1985\\u1986\\u1987\\u1988\\u1989\\u198A\\u198B\\u198C\\u198D\\u198E\\u198F\\u1990\\u1991\\u1992\\u1993\\u1994\\u1995\\u1996\\u1997\\u1998\\u1999\\u199A\\u199B\\u199C\\u199D\\u199E\\u199F\\u19A0\\u19A1\\u19A2\\u19A3\\u19A4\\u19A5\\u19A6\\u19A7\\u19A8\\u19A9\\u19C1\\u19C2\\u19C3\\u19C4\\u19C5\\u19C6\\u19C7\\u1A00\\u1A01\\u1A02\\u1A03\\u1A04\\u1A05\\u1A06\\u1A07\\u1A08\\u1A09\\u1A0A\\u1A0B\\u1A0C\\u1A0D\\u1A0E\\u1A0F\\u1A10\\u1A11\\u1A12\\u1A13\\u1A14\\u1A15\\u1A16\\u1B05\\u1B06\\u1B07\\u1B08\\u1B09\\u1B0A\\u1B0B\\u1B0C\\u1B0D\\u1B0E\\u1B0F\\u1B10\\u1B11\\u1B12\\u1B13\\u1B14\\u1B15\\u1B16\\u1B17\\u1B18\\u1B19\\u1B1A\\u1B1B\\u1B1C\\u1B1D\\u1B1E\\u1B1F\\u1B20\\u1B21\\u1B22\\u1B23\\u1B24\\u1B25\\u1B26\\u1B27\\u1B28\\u1B29\\u1B2A\\u1B2B\\u1B2C\\u1B2D\\u1B2E\\u1B2F\\u1B30\\u1B31\\u1B32\\u1B33\\u1B45\\u1B46\\u1B47\\u1B48\\u1B49\\u1B4A\\u1B4B\\u1B83\\u1B84\\u1B85\\u1B86\\u1B87\\u1B88\\u1B89\\u1B8A\\u1B8B\\u1B8C\\u1B8D\\u1B8E\\u1B8F\\u1B90\\u1B91\\u1B92\\u1B93\\u1B94\\u1B95\\u1B96\\u1B97\\u1B98\\u1B99\\u1B9A\\u1B9B\\u1B9C\\u1B9D\\u1B9E\\u1B9F\\u1BA0\\u1BAE\\u1BAF\\u1C00\\u1C01\\u1C02\\u1C03\\u1C04\\u1C05\\u1C06\\u1C07\\u1C08\\u1C09\\u1C0A\\u1C0B\\u1C0C\\u1C0D\\u1C0E\\u1C0F\\u1C10\\u1C11\\u1C12\\u1C13\\u1C14\\u1C15\\u1C16\\u1C17\\u1C18\\u1C19\\u1C1A\\u1C1B\\u1C1C\\u1C1D\\u1C1E\\u1C1F\\u1C20\\u1C21\\u1C22\\u1C23\\u1C4D\\u1C4E\\u1C4F\\u1C5A\\u1C5B\\u1C5C\\u1C5D\\u1C5E\\u1C5F\\u1C60\\u1C61\\u1C62\\u1C63\\u1C64\\u1C65\\u1C66\\u1C67\\u1C68\\u1C69\\u1C6A\\u1C6B\\u1C6C\\u1C6D\\u1C6E\\u1C6F\\u1C70\\u1C71\\u1C72\\u1C73\\u1C74\\u1C75\\u1C76\\u1C77\\u2135\\u2136\\u2137\\u2138\\u2D30\\u2D31\\u2D32\\u2D33\\u2D34\\u2D35\\u2D36\\u2D37\\u2D38\\u2D39\\u2D3A\\u2D3B\\u2D3C\\u2D3D\\u2D3E\\u2D3F\\u2D40\\u2D41\\u2D42\\u2D43\\u2D44\\u2D45\\u2D46\\u2D47\\u2D48\\u2D49\\u2D4A\\u2D4B\\u2D4C\\u2D4D\\u2D4E\\u2D4F\\u2D50\\u2D51\\u2D52\\u2D53\\u2D54\\u2D55\\u2D56\\u2D57\\u2D58\\u2D59\\u2D5A\\u2D5B\\u2D5C\\u2D5D\\u2D5E\\u2D5F\\u2D60\\u2D61\\u2D62\\u2D63\\u2D64\\u2D65\\u2D80\\u2D81\\u2D82\\u2D83\\u2D84\\u2D85\\u2D86\\u2D87\\u2D88\\u2D89\\u2D8A\\u2D8B\\u2D8C\\u2D8D\\u2D8E\\u2D8F\\u2D90\\u2D91\\u2D92\\u2D93\\u2D94\\u2D95\\u2D96\\u2DA0\\u2DA1\\u2DA2\\u2DA3\\u2DA4\\u2DA5\\u2DA6\\u2DA8\\u2DA9\\u2DAA\\u2DAB\\u2DAC\\u2DAD\\u2DAE\\u2DB0\\u2DB1\\u2DB2\\u2DB3\\u2DB4\\u2DB5\\u2DB6\\u2DB8\\u2DB9\\u2DBA\\u2DBB\\u2DBC\\u2DBD\\u2DBE\\u2DC0\\u2DC1\\u2DC2\\u2DC3\\u2DC4\\u2DC5\\u2DC6\\u2DC8\\u2DC9\\u2DCA\\u2DCB\\u2DCC\\u2DCD\\u2DCE\\u2DD0\\u2DD1\\u2DD2\\u2DD3\\u2DD4\\u2DD5\\u2DD6\\u2DD8\\u2DD9\\u2DDA\\u2DDB\\u2DDC\\u2DDD\\u2DDE\\u3006\\u303C\\u3041\\u3042\\u3043\\u3044\\u3045\\u3046\\u3047\\u3048\\u3049\\u304A\\u304B\\u304C\\u304D\\u304E\\u304F\\u3050\\u3051\\u3052\\u3053\\u3054\\u3055\\u3056\\u3057\\u3058\\u3059\\u305A\\u305B\\u305C\\u305D\\u305E\\u305F\\u3060\\u3061\\u3062\\u3063\\u3064\\u3065\\u3066\\u3067\\u3068\\u3069\\u306A\\u306B\\u306C\\u306D\\u306E\\u306F\\u3070\\u3071\\u3072\\u3073\\u3074\\u3075\\u3076\\u3077\\u3078\\u3079\\u307A\\u307B\\u307C\\u307D\\u307E\\u307F\\u3080\\u3081\\u3082\\u3083\\u3084\\u3085\\u3086\\u3087\\u3088\\u3089\\u308A\\u308B\\u308C\\u308D\\u308E\\u308F\\u3090\\u3091\\u3092\\u3093\\u3094\\u3095\\u3096\\u309F\\u30A1\\u30A2\\u30A3\\u30A4\\u30A5\\u30A6\\u30A7\\u30A8\\u30A9\\u30AA\\u30AB\\u30AC\\u30AD\\u30AE\\u30AF\\u30B0\\u30B1\\u30B2\\u30B3\\u30B4\\u30B5\\u30B6\\u30B7\\u30B8\\u30B9\\u30BA\\u30BB\\u30BC\\u30BD\\u30BE\\u30BF\\u30C0\\u30C1\\u30C2\\u30C3\\u30C4\\u30C5\\u30C6\\u30C7\\u30C8\\u30C9\\u30CA\\u30CB\\u30CC\\u30CD\\u30CE\\u30CF\\u30D0\\u30D1\\u30D2\\u30D3\\u30D4\\u30D5\\u30D6\\u30D7\\u30D8\\u30D9\\u30DA\\u30DB\\u30DC\\u30DD\\u30DE\\u30DF\\u30E0\\u30E1\\u30E2\\u30E3\\u30E4\\u30E5\\u30E6\\u30E7\\u30E8\\u30E9\\u30EA\\u30EB\\u30EC\\u30ED\\u30EE\\u30EF\\u30F0\\u30F1\\u30F2\\u30F3\\u30F4\\u30F5\\u30F6\\u30F7\\u30F8\\u30F9\\u30FA\\u30FF\\u3105\\u3106\\u3107\\u3108\\u3109\\u310A\\u310B\\u310C\\u310D\\u310E\\u310F\\u3110\\u3111\\u3112\\u3113\\u3114\\u3115\\u3116\\u3117\\u3118\\u3119\\u311A\\u311B\\u311C\\u311D\\u311E\\u311F\\u3120\\u3121\\u3122\\u3123\\u3124\\u3125\\u3126\\u3127\\u3128\\u3129\\u312A\\u312B\\u312C\\u312D\\u3131\\u3132\\u3133\\u3134\\u3135\\u3136\\u3137\\u3138\\u3139\\u313A\\u313B\\u313C\\u313D\\u313E\\u313F\\u3140\\u3141\\u3142\\u3143\\u3144\\u3145\\u3146\\u3147\\u3148\\u3149\\u314A\\u314B\\u314C\\u314D\\u314E\\u314F\\u3150\\u3151\\u3152\\u3153\\u3154\\u3155\\u3156\\u3157\\u3158\\u3159\\u315A\\u315B\\u315C\\u315D\\u315E\\u315F\\u3160\\u3161\\u3162\\u3163\\u3164\\u3165\\u3166\\u3167\\u3168\\u3169\\u316A\\u316B\\u316C\\u316D\\u316E\\u316F\\u3170\\u3171\\u3172\\u3173\\u3174\\u3175\\u3176\\u3177\\u3178\\u3179\\u317A\\u317B\\u317C\\u317D\\u317E\\u317F\\u3180\\u3181\\u3182\\u3183\\u3184\\u3185\\u3186\\u3187\\u3188\\u3189\\u318A\\u318B\\u318C\\u318D\\u318E\\u31A0\\u31A1\\u31A2\\u31A3\\u31A4\\u31A5\\u31A6\\u31A7\\u31A8\\u31A9\\u31AA\\u31AB\\u31AC\\u31AD\\u31AE\\u31AF\\u31B0\\u31B1\\u31B2\\u31B3\\u31B4\\u31B5\\u31B6\\u31B7\\u31F0\\u31F1\\u31F2\\u31F3\\u31F4\\u31F5\\u31F6\\u31F7\\u31F8\\u31F9\\u31FA\\u31FB\\u31FC\\u31FD\\u31FE\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000\\uA001\\uA002\\uA003\\uA004\\uA005\\uA006\\uA007\\uA008\\uA009\\uA00A\\uA00B\\uA00C\\uA00D\\uA00E\\uA00F\\uA010\\uA011\\uA012\\uA013\\uA014\\uA016\\uA017\\uA018\\uA019\\uA01A\\uA01B\\uA01C\\uA01D\\uA01E\\uA01F\\uA020\\uA021\\uA022\\uA023\\uA024\\uA025\\uA026\\uA027\\uA028\\uA029\\uA02A\\uA02B\\uA02C\\uA02D\\uA02E\\uA02F\\uA030\\uA031\\uA032\\uA033\\uA034\\uA035\\uA036\\uA037\\uA038\\uA039\\uA03A\\uA03B\\uA03C\\uA03D\\uA03E\\uA03F\\uA040\\uA041\\uA042\\uA043\\uA044\\uA045\\uA046\\uA047\\uA048\\uA049\\uA04A\\uA04B\\uA04C\\uA04D\\uA04E\\uA04F\\uA050\\uA051\\uA052\\uA053\\uA054\\uA055\\uA056\\uA057\\uA058\\uA059\\uA05A\\uA05B\\uA05C\\uA05D\\uA05E\\uA05F\\uA060\\uA061\\uA062\\uA063\\uA064\\uA065\\uA066\\uA067\\uA068\\uA069\\uA06A\\uA06B\\uA06C\\uA06D\\uA06E\\uA06F\\uA070\\uA071\\uA072\\uA073\\uA074\\uA075\\uA076\\uA077\\uA078\\uA079\\uA07A\\uA07B\\uA07C\\uA07D\\uA07E\\uA07F\\uA080\\uA081\\uA082\\uA083\\uA084\\uA085\\uA086\\uA087\\uA088\\uA089\\uA08A\\uA08B\\uA08C\\uA08D\\uA08E\\uA08F\\uA090\\uA091\\uA092\\uA093\\uA094\\uA095\\uA096\\uA097\\uA098\\uA099\\uA09A\\uA09B\\uA09C\\uA09D\\uA09E\\uA09F\\uA0A0\\uA0A1\\uA0A2\\uA0A3\\uA0A4\\uA0A5\\uA0A6\\uA0A7\\uA0A8\\uA0A9\\uA0AA\\uA0AB\\uA0AC\\uA0AD\\uA0AE\\uA0AF\\uA0B0\\uA0B1\\uA0B2\\uA0B3\\uA0B4\\uA0B5\\uA0B6\\uA0B7\\uA0B8\\uA0B9\\uA0BA\\uA0BB\\uA0BC\\uA0BD\\uA0BE\\uA0BF\\uA0C0\\uA0C1\\uA0C2\\uA0C3\\uA0C4\\uA0C5\\uA0C6\\uA0C7\\uA0C8\\uA0C9\\uA0CA\\uA0CB\\uA0CC\\uA0CD\\uA0CE\\uA0CF\\uA0D0\\uA0D1\\uA0D2\\uA0D3\\uA0D4\\uA0D5\\uA0D6\\uA0D7\\uA0D8\\uA0D9\\uA0DA\\uA0DB\\uA0DC\\uA0DD\\uA0DE\\uA0DF\\uA0E0\\uA0E1\\uA0E2\\uA0E3\\uA0E4\\uA0E5\\uA0E6\\uA0E7\\uA0E8\\uA0E9\\uA0EA\\uA0EB\\uA0EC\\uA0ED\\uA0EE\\uA0EF\\uA0F0\\uA0F1\\uA0F2\\uA0F3\\uA0F4\\uA0F5\\uA0F6\\uA0F7\\uA0F8\\uA0F9\\uA0FA\\uA0FB\\uA0FC\\uA0FD\\uA0FE\\uA0FF\\uA100\\uA101\\uA102\\uA103\\uA104\\uA105\\uA106\\uA107\\uA108\\uA109\\uA10A\\uA10B\\uA10C\\uA10D\\uA10E\\uA10F\\uA110\\uA111\\uA112\\uA113\\uA114\\uA115\\uA116\\uA117\\uA118\\uA119\\uA11A\\uA11B\\uA11C\\uA11D\\uA11E\\uA11F\\uA120\\uA121\\uA122\\uA123\\uA124\\uA125\\uA126\\uA127\\uA128\\uA129\\uA12A\\uA12B\\uA12C\\uA12D\\uA12E\\uA12F\\uA130\\uA131\\uA132\\uA133\\uA134\\uA135\\uA136\\uA137\\uA138\\uA139\\uA13A\\uA13B\\uA13C\\uA13D\\uA13E\\uA13F\\uA140\\uA141\\uA142\\uA143\\uA144\\uA145\\uA146\\uA147\\uA148\\uA149\\uA14A\\uA14B\\uA14C\\uA14D\\uA14E\\uA14F\\uA150\\uA151\\uA152\\uA153\\uA154\\uA155\\uA156\\uA157\\uA158\\uA159\\uA15A\\uA15B\\uA15C\\uA15D\\uA15E\\uA15F\\uA160\\uA161\\uA162\\uA163\\uA164\\uA165\\uA166\\uA167\\uA168\\uA169\\uA16A\\uA16B\\uA16C\\uA16D\\uA16E\\uA16F\\uA170\\uA171\\uA172\\uA173\\uA174\\uA175\\uA176\\uA177\\uA178\\uA179\\uA17A\\uA17B\\uA17C\\uA17D\\uA17E\\uA17F\\uA180\\uA181\\uA182\\uA183\\uA184\\uA185\\uA186\\uA187\\uA188\\uA189\\uA18A\\uA18B\\uA18C\\uA18D\\uA18E\\uA18F\\uA190\\uA191\\uA192\\uA193\\uA194\\uA195\\uA196\\uA197\\uA198\\uA199\\uA19A\\uA19B\\uA19C\\uA19D\\uA19E\\uA19F\\uA1A0\\uA1A1\\uA1A2\\uA1A3\\uA1A4\\uA1A5\\uA1A6\\uA1A7\\uA1A8\\uA1A9\\uA1AA\\uA1AB\\uA1AC\\uA1AD\\uA1AE\\uA1AF\\uA1B0\\uA1B1\\uA1B2\\uA1B3\\uA1B4\\uA1B5\\uA1B6\\uA1B7\\uA1B8\\uA1B9\\uA1BA\\uA1BB\\uA1BC\\uA1BD\\uA1BE\\uA1BF\\uA1C0\\uA1C1\\uA1C2\\uA1C3\\uA1C4\\uA1C5\\uA1C6\\uA1C7\\uA1C8\\uA1C9\\uA1CA\\uA1CB\\uA1CC\\uA1CD\\uA1CE\\uA1CF\\uA1D0\\uA1D1\\uA1D2\\uA1D3\\uA1D4\\uA1D5\\uA1D6\\uA1D7\\uA1D8\\uA1D9\\uA1DA\\uA1DB\\uA1DC\\uA1DD\\uA1DE\\uA1DF\\uA1E0\\uA1E1\\uA1E2\\uA1E3\\uA1E4\\uA1E5\\uA1E6\\uA1E7\\uA1E8\\uA1E9\\uA1EA\\uA1EB\\uA1EC\\uA1ED\\uA1EE\\uA1EF\\uA1F0\\uA1F1\\uA1F2\\uA1F3\\uA1F4\\uA1F5\\uA1F6\\uA1F7\\uA1F8\\uA1F9\\uA1FA\\uA1FB\\uA1FC\\uA1FD\\uA1FE\\uA1FF\\uA200\\uA201\\uA202\\uA203\\uA204\\uA205\\uA206\\uA207\\uA208\\uA209\\uA20A\\uA20B\\uA20C\\uA20D\\uA20E\\uA20F\\uA210\\uA211\\uA212\\uA213\\uA214\\uA215\\uA216\\uA217\\uA218\\uA219\\uA21A\\uA21B\\uA21C\\uA21D\\uA21E\\uA21F\\uA220\\uA221\\uA222\\uA223\\uA224\\uA225\\uA226\\uA227\\uA228\\uA229\\uA22A\\uA22B\\uA22C\\uA22D\\uA22E\\uA22F\\uA230\\uA231\\uA232\\uA233\\uA234\\uA235\\uA236\\uA237\\uA238\\uA239\\uA23A\\uA23B\\uA23C\\uA23D\\uA23E\\uA23F\\uA240\\uA241\\uA242\\uA243\\uA244\\uA245\\uA246\\uA247\\uA248\\uA249\\uA24A\\uA24B\\uA24C\\uA24D\\uA24E\\uA24F\\uA250\\uA251\\uA252\\uA253\\uA254\\uA255\\uA256\\uA257\\uA258\\uA259\\uA25A\\uA25B\\uA25C\\uA25D\\uA25E\\uA25F\\uA260\\uA261\\uA262\\uA263\\uA264\\uA265\\uA266\\uA267\\uA268\\uA269\\uA26A\\uA26B\\uA26C\\uA26D\\uA26E\\uA26F\\uA270\\uA271\\uA272\\uA273\\uA274\\uA275\\uA276\\uA277\\uA278\\uA279\\uA27A\\uA27B\\uA27C\\uA27D\\uA27E\\uA27F\\uA280\\uA281\\uA282\\uA283\\uA284\\uA285\\uA286\\uA287\\uA288\\uA289\\uA28A\\uA28B\\uA28C\\uA28D\\uA28E\\uA28F\\uA290\\uA291\\uA292\\uA293\\uA294\\uA295\\uA296\\uA297\\uA298\\uA299\\uA29A\\uA29B\\uA29C\\uA29D\\uA29E\\uA29F\\uA2A0\\uA2A1\\uA2A2\\uA2A3\\uA2A4\\uA2A5\\uA2A6\\uA2A7\\uA2A8\\uA2A9\\uA2AA\\uA2AB\\uA2AC\\uA2AD\\uA2AE\\uA2AF\\uA2B0\\uA2B1\\uA2B2\\uA2B3\\uA2B4\\uA2B5\\uA2B6\\uA2B7\\uA2B8\\uA2B9\\uA2BA\\uA2BB\\uA2BC\\uA2BD\\uA2BE\\uA2BF\\uA2C0\\uA2C1\\uA2C2\\uA2C3\\uA2C4\\uA2C5\\uA2C6\\uA2C7\\uA2C8\\uA2C9\\uA2CA\\uA2CB\\uA2CC\\uA2CD\\uA2CE\\uA2CF\\uA2D0\\uA2D1\\uA2D2\\uA2D3\\uA2D4\\uA2D5\\uA2D6\\uA2D7\\uA2D8\\uA2D9\\uA2DA\\uA2DB\\uA2DC\\uA2DD\\uA2DE\\uA2DF\\uA2E0\\uA2E1\\uA2E2\\uA2E3\\uA2E4\\uA2E5\\uA2E6\\uA2E7\\uA2E8\\uA2E9\\uA2EA\\uA2EB\\uA2EC\\uA2ED\\uA2EE\\uA2EF\\uA2F0\\uA2F1\\uA2F2\\uA2F3\\uA2F4\\uA2F5\\uA2F6\\uA2F7\\uA2F8\\uA2F9\\uA2FA\\uA2FB\\uA2FC\\uA2FD\\uA2FE\\uA2FF\\uA300\\uA301\\uA302\\uA303\\uA304\\uA305\\uA306\\uA307\\uA308\\uA309\\uA30A\\uA30B\\uA30C\\uA30D\\uA30E\\uA30F\\uA310\\uA311\\uA312\\uA313\\uA314\\uA315\\uA316\\uA317\\uA318\\uA319\\uA31A\\uA31B\\uA31C\\uA31D\\uA31E\\uA31F\\uA320\\uA321\\uA322\\uA323\\uA324\\uA325\\uA326\\uA327\\uA328\\uA329\\uA32A\\uA32B\\uA32C\\uA32D\\uA32E\\uA32F\\uA330\\uA331\\uA332\\uA333\\uA334\\uA335\\uA336\\uA337\\uA338\\uA339\\uA33A\\uA33B\\uA33C\\uA33D\\uA33E\\uA33F\\uA340\\uA341\\uA342\\uA343\\uA344\\uA345\\uA346\\uA347\\uA348\\uA349\\uA34A\\uA34B\\uA34C\\uA34D\\uA34E\\uA34F\\uA350\\uA351\\uA352\\uA353\\uA354\\uA355\\uA356\\uA357\\uA358\\uA359\\uA35A\\uA35B\\uA35C\\uA35D\\uA35E\\uA35F\\uA360\\uA361\\uA362\\uA363\\uA364\\uA365\\uA366\\uA367\\uA368\\uA369\\uA36A\\uA36B\\uA36C\\uA36D\\uA36E\\uA36F\\uA370\\uA371\\uA372\\uA373\\uA374\\uA375\\uA376\\uA377\\uA378\\uA379\\uA37A\\uA37B\\uA37C\\uA37D\\uA37E\\uA37F\\uA380\\uA381\\uA382\\uA383\\uA384\\uA385\\uA386\\uA387\\uA388\\uA389\\uA38A\\uA38B\\uA38C\\uA38D\\uA38E\\uA38F\\uA390\\uA391\\uA392\\uA393\\uA394\\uA395\\uA396\\uA397\\uA398\\uA399\\uA39A\\uA39B\\uA39C\\uA39D\\uA39E\\uA39F\\uA3A0\\uA3A1\\uA3A2\\uA3A3\\uA3A4\\uA3A5\\uA3A6\\uA3A7\\uA3A8\\uA3A9\\uA3AA\\uA3AB\\uA3AC\\uA3AD\\uA3AE\\uA3AF\\uA3B0\\uA3B1\\uA3B2\\uA3B3\\uA3B4\\uA3B5\\uA3B6\\uA3B7\\uA3B8\\uA3B9\\uA3BA\\uA3BB\\uA3BC\\uA3BD\\uA3BE\\uA3BF\\uA3C0\\uA3C1\\uA3C2\\uA3C3\\uA3C4\\uA3C5\\uA3C6\\uA3C7\\uA3C8\\uA3C9\\uA3CA\\uA3CB\\uA3CC\\uA3CD\\uA3CE\\uA3CF\\uA3D0\\uA3D1\\uA3D2\\uA3D3\\uA3D4\\uA3D5\\uA3D6\\uA3D7\\uA3D8\\uA3D9\\uA3DA\\uA3DB\\uA3DC\\uA3DD\\uA3DE\\uA3DF\\uA3E0\\uA3E1\\uA3E2\\uA3E3\\uA3E4\\uA3E5\\uA3E6\\uA3E7\\uA3E8\\uA3E9\\uA3EA\\uA3EB\\uA3EC\\uA3ED\\uA3EE\\uA3EF\\uA3F0\\uA3F1\\uA3F2\\uA3F3\\uA3F4\\uA3F5\\uA3F6\\uA3F7\\uA3F8\\uA3F9\\uA3FA\\uA3FB\\uA3FC\\uA3FD\\uA3FE\\uA3FF\\uA400\\uA401\\uA402\\uA403\\uA404\\uA405\\uA406\\uA407\\uA408\\uA409\\uA40A\\uA40B\\uA40C\\uA40D\\uA40E\\uA40F\\uA410\\uA411\\uA412\\uA413\\uA414\\uA415\\uA416\\uA417\\uA418\\uA419\\uA41A\\uA41B\\uA41C\\uA41D\\uA41E\\uA41F\\uA420\\uA421\\uA422\\uA423\\uA424\\uA425\\uA426\\uA427\\uA428\\uA429\\uA42A\\uA42B\\uA42C\\uA42D\\uA42E\\uA42F\\uA430\\uA431\\uA432\\uA433\\uA434\\uA435\\uA436\\uA437\\uA438\\uA439\\uA43A\\uA43B\\uA43C\\uA43D\\uA43E\\uA43F\\uA440\\uA441\\uA442\\uA443\\uA444\\uA445\\uA446\\uA447\\uA448\\uA449\\uA44A\\uA44B\\uA44C\\uA44D\\uA44E\\uA44F\\uA450\\uA451\\uA452\\uA453\\uA454\\uA455\\uA456\\uA457\\uA458\\uA459\\uA45A\\uA45B\\uA45C\\uA45D\\uA45E\\uA45F\\uA460\\uA461\\uA462\\uA463\\uA464\\uA465\\uA466\\uA467\\uA468\\uA469\\uA46A\\uA46B\\uA46C\\uA46D\\uA46E\\uA46F\\uA470\\uA471\\uA472\\uA473\\uA474\\uA475\\uA476\\uA477\\uA478\\uA479\\uA47A\\uA47B\\uA47C\\uA47D\\uA47E\\uA47F\\uA480\\uA481\\uA482\\uA483\\uA484\\uA485\\uA486\\uA487\\uA488\\uA489\\uA48A\\uA48B\\uA48C\\uA500\\uA501\\uA502\\uA503\\uA504\\uA505\\uA506\\uA507\\uA508\\uA509\\uA50A\\uA50B\\uA50C\\uA50D\\uA50E\\uA50F\\uA510\\uA511\\uA512\\uA513\\uA514\\uA515\\uA516\\uA517\\uA518\\uA519\\uA51A\\uA51B\\uA51C\\uA51D\\uA51E\\uA51F\\uA520\\uA521\\uA522\\uA523\\uA524\\uA525\\uA526\\uA527\\uA528\\uA529\\uA52A\\uA52B\\uA52C\\uA52D\\uA52E\\uA52F\\uA530\\uA531\\uA532\\uA533\\uA534\\uA535\\uA536\\uA537\\uA538\\uA539\\uA53A\\uA53B\\uA53C\\uA53D\\uA53E\\uA53F\\uA540\\uA541\\uA542\\uA543\\uA544\\uA545\\uA546\\uA547\\uA548\\uA549\\uA54A\\uA54B\\uA54C\\uA54D\\uA54E\\uA54F\\uA550\\uA551\\uA552\\uA553\\uA554\\uA555\\uA556\\uA557\\uA558\\uA559\\uA55A\\uA55B\\uA55C\\uA55D\\uA55E\\uA55F\\uA560\\uA561\\uA562\\uA563\\uA564\\uA565\\uA566\\uA567\\uA568\\uA569\\uA56A\\uA56B\\uA56C\\uA56D\\uA56E\\uA56F\\uA570\\uA571\\uA572\\uA573\\uA574\\uA575\\uA576\\uA577\\uA578\\uA579\\uA57A\\uA57B\\uA57C\\uA57D\\uA57E\\uA57F\\uA580\\uA581\\uA582\\uA583\\uA584\\uA585\\uA586\\uA587\\uA588\\uA589\\uA58A\\uA58B\\uA58C\\uA58D\\uA58E\\uA58F\\uA590\\uA591\\uA592\\uA593\\uA594\\uA595\\uA596\\uA597\\uA598\\uA599\\uA59A\\uA59B\\uA59C\\uA59D\\uA59E\\uA59F\\uA5A0\\uA5A1\\uA5A2\\uA5A3\\uA5A4\\uA5A5\\uA5A6\\uA5A7\\uA5A8\\uA5A9\\uA5AA\\uA5AB\\uA5AC\\uA5AD\\uA5AE\\uA5AF\\uA5B0\\uA5B1\\uA5B2\\uA5B3\\uA5B4\\uA5B5\\uA5B6\\uA5B7\\uA5B8\\uA5B9\\uA5BA\\uA5BB\\uA5BC\\uA5BD\\uA5BE\\uA5BF\\uA5C0\\uA5C1\\uA5C2\\uA5C3\\uA5C4\\uA5C5\\uA5C6\\uA5C7\\uA5C8\\uA5C9\\uA5CA\\uA5CB\\uA5CC\\uA5CD\\uA5CE\\uA5CF\\uA5D0\\uA5D1\\uA5D2\\uA5D3\\uA5D4\\uA5D5\\uA5D6\\uA5D7\\uA5D8\\uA5D9\\uA5DA\\uA5DB\\uA5DC\\uA5DD\\uA5DE\\uA5DF\\uA5E0\\uA5E1\\uA5E2\\uA5E3\\uA5E4\\uA5E5\\uA5E6\\uA5E7\\uA5E8\\uA5E9\\uA5EA\\uA5EB\\uA5EC\\uA5ED\\uA5EE\\uA5EF\\uA5F0\\uA5F1\\uA5F2\\uA5F3\\uA5F4\\uA5F5\\uA5F6\\uA5F7\\uA5F8\\uA5F9\\uA5FA\\uA5FB\\uA5FC\\uA5FD\\uA5FE\\uA5FF\\uA600\\uA601\\uA602\\uA603\\uA604\\uA605\\uA606\\uA607\\uA608\\uA609\\uA60A\\uA60B\\uA610\\uA611\\uA612\\uA613\\uA614\\uA615\\uA616\\uA617\\uA618\\uA619\\uA61A\\uA61B\\uA61C\\uA61D\\uA61E\\uA61F\\uA62A\\uA62B\\uA66E\\uA7FB\\uA7FC\\uA7FD\\uA7FE\\uA7FF\\uA800\\uA801\\uA803\\uA804\\uA805\\uA807\\uA808\\uA809\\uA80A\\uA80C\\uA80D\\uA80E\\uA80F\\uA810\\uA811\\uA812\\uA813\\uA814\\uA815\\uA816\\uA817\\uA818\\uA819\\uA81A\\uA81B\\uA81C\\uA81D\\uA81E\\uA81F\\uA820\\uA821\\uA822\\uA840\\uA841\\uA842\\uA843\\uA844\\uA845\\uA846\\uA847\\uA848\\uA849\\uA84A\\uA84B\\uA84C\\uA84D\\uA84E\\uA84F\\uA850\\uA851\\uA852\\uA853\\uA854\\uA855\\uA856\\uA857\\uA858\\uA859\\uA85A\\uA85B\\uA85C\\uA85D\\uA85E\\uA85F\\uA860\\uA861\\uA862\\uA863\\uA864\\uA865\\uA866\\uA867\\uA868\\uA869\\uA86A\\uA86B\\uA86C\\uA86D\\uA86E\\uA86F\\uA870\\uA871\\uA872\\uA873\\uA882\\uA883\\uA884\\uA885\\uA886\\uA887\\uA888\\uA889\\uA88A\\uA88B\\uA88C\\uA88D\\uA88E\\uA88F\\uA890\\uA891\\uA892\\uA893\\uA894\\uA895\\uA896\\uA897\\uA898\\uA899\\uA89A\\uA89B\\uA89C\\uA89D\\uA89E\\uA89F\\uA8A0\\uA8A1\\uA8A2\\uA8A3\\uA8A4\\uA8A5\\uA8A6\\uA8A7\\uA8A8\\uA8A9\\uA8AA\\uA8AB\\uA8AC\\uA8AD\\uA8AE\\uA8AF\\uA8B0\\uA8B1\\uA8B2\\uA8B3\\uA90A\\uA90B\\uA90C\\uA90D\\uA90E\\uA90F\\uA910\\uA911\\uA912\\uA913\\uA914\\uA915\\uA916\\uA917\\uA918\\uA919\\uA91A\\uA91B\\uA91C\\uA91D\\uA91E\\uA91F\\uA920\\uA921\\uA922\\uA923\\uA924\\uA925\\uA930\\uA931\\uA932\\uA933\\uA934\\uA935\\uA936\\uA937\\uA938\\uA939\\uA93A\\uA93B\\uA93C\\uA93D\\uA93E\\uA93F\\uA940\\uA941\\uA942\\uA943\\uA944\\uA945\\uA946\\uAA00\\uAA01\\uAA02\\uAA03\\uAA04\\uAA05\\uAA06\\uAA07\\uAA08\\uAA09\\uAA0A\\uAA0B\\uAA0C\\uAA0D\\uAA0E\\uAA0F\\uAA10\\uAA11\\uAA12\\uAA13\\uAA14\\uAA15\\uAA16\\uAA17\\uAA18\\uAA19\\uAA1A\\uAA1B\\uAA1C\\uAA1D\\uAA1E\\uAA1F\\uAA20\\uAA21\\uAA22\\uAA23\\uAA24\\uAA25\\uAA26\\uAA27\\uAA28\\uAA40\\uAA41\\uAA42\\uAA44\\uAA45\\uAA46\\uAA47\\uAA48\\uAA49\\uAA4A\\uAA4B\\uAC00\\uD7A3\\uF900\\uF901\\uF902\\uF903\\uF904\\uF905\\uF906\\uF907\\uF908\\uF909\\uF90A\\uF90B\\uF90C\\uF90D\\uF90E\\uF90F\\uF910\\uF911\\uF912\\uF913\\uF914\\uF915\\uF916\\uF917\\uF918\\uF919\\uF91A\\uF91B\\uF91C\\uF91D\\uF91E\\uF91F\\uF920\\uF921\\uF922\\uF923\\uF924\\uF925\\uF926\\uF927\\uF928\\uF929\\uF92A\\uF92B\\uF92C\\uF92D\\uF92E\\uF92F\\uF930\\uF931\\uF932\\uF933\\uF934\\uF935\\uF936\\uF937\\uF938\\uF939\\uF93A\\uF93B\\uF93C\\uF93D\\uF93E\\uF93F\\uF940\\uF941\\uF942\\uF943\\uF944\\uF945\\uF946\\uF947\\uF948\\uF949\\uF94A\\uF94B\\uF94C\\uF94D\\uF94E\\uF94F\\uF950\\uF951\\uF952\\uF953\\uF954\\uF955\\uF956\\uF957\\uF958\\uF959\\uF95A\\uF95B\\uF95C\\uF95D\\uF95E\\uF95F\\uF960\\uF961\\uF962\\uF963\\uF964\\uF965\\uF966\\uF967\\uF968\\uF969\\uF96A\\uF96B\\uF96C\\uF96D\\uF96E\\uF96F\\uF970\\uF971\\uF972\\uF973\\uF974\\uF975\\uF976\\uF977\\uF978\\uF979\\uF97A\\uF97B\\uF97C\\uF97D\\uF97E\\uF97F\\uF980\\uF981\\uF982\\uF983\\uF984\\uF985\\uF986\\uF987\\uF988\\uF989\\uF98A\\uF98B\\uF98C\\uF98D\\uF98E\\uF98F\\uF990\\uF991\\uF992\\uF993\\uF994\\uF995\\uF996\\uF997\\uF998\\uF999\\uF99A\\uF99B\\uF99C\\uF99D\\uF99E\\uF99F\\uF9A0\\uF9A1\\uF9A2\\uF9A3\\uF9A4\\uF9A5\\uF9A6\\uF9A7\\uF9A8\\uF9A9\\uF9AA\\uF9AB\\uF9AC\\uF9AD\\uF9AE\\uF9AF\\uF9B0\\uF9B1\\uF9B2\\uF9B3\\uF9B4\\uF9B5\\uF9B6\\uF9B7\\uF9B8\\uF9B9\\uF9BA\\uF9BB\\uF9BC\\uF9BD\\uF9BE\\uF9BF\\uF9C0\\uF9C1\\uF9C2\\uF9C3\\uF9C4\\uF9C5\\uF9C6\\uF9C7\\uF9C8\\uF9C9\\uF9CA\\uF9CB\\uF9CC\\uF9CD\\uF9CE\\uF9CF\\uF9D0\\uF9D1\\uF9D2\\uF9D3\\uF9D4\\uF9D5\\uF9D6\\uF9D7\\uF9D8\\uF9D9\\uF9DA\\uF9DB\\uF9DC\\uF9DD\\uF9DE\\uF9DF\\uF9E0\\uF9E1\\uF9E2\\uF9E3\\uF9E4\\uF9E5\\uF9E6\\uF9E7\\uF9E8\\uF9E9\\uF9EA\\uF9EB\\uF9EC\\uF9ED\\uF9EE\\uF9EF\\uF9F0\\uF9F1\\uF9F2\\uF9F3\\uF9F4\\uF9F5\\uF9F6\\uF9F7\\uF9F8\\uF9F9\\uF9FA\\uF9FB\\uF9FC\\uF9FD\\uF9FE\\uF9FF\\uFA00\\uFA01\\uFA02\\uFA03\\uFA04\\uFA05\\uFA06\\uFA07\\uFA08\\uFA09\\uFA0A\\uFA0B\\uFA0C\\uFA0D\\uFA0E\\uFA0F\\uFA10\\uFA11\\uFA12\\uFA13\\uFA14\\uFA15\\uFA16\\uFA17\\uFA18\\uFA19\\uFA1A\\uFA1B\\uFA1C\\uFA1D\\uFA1E\\uFA1F\\uFA20\\uFA21\\uFA22\\uFA23\\uFA24\\uFA25\\uFA26\\uFA27\\uFA28\\uFA29\\uFA2A\\uFA2B\\uFA2C\\uFA2D\\uFA30\\uFA31\\uFA32\\uFA33\\uFA34\\uFA35\\uFA36\\uFA37\\uFA38\\uFA39\\uFA3A\\uFA3B\\uFA3C\\uFA3D\\uFA3E\\uFA3F\\uFA40\\uFA41\\uFA42\\uFA43\\uFA44\\uFA45\\uFA46\\uFA47\\uFA48\\uFA49\\uFA4A\\uFA4B\\uFA4C\\uFA4D\\uFA4E\\uFA4F\\uFA50\\uFA51\\uFA52\\uFA53\\uFA54\\uFA55\\uFA56\\uFA57\\uFA58\\uFA59\\uFA5A\\uFA5B\\uFA5C\\uFA5D\\uFA5E\\uFA5F\\uFA60\\uFA61\\uFA62\\uFA63\\uFA64\\uFA65\\uFA66\\uFA67\\uFA68\\uFA69\\uFA6A\\uFA70\\uFA71\\uFA72\\uFA73\\uFA74\\uFA75\\uFA76\\uFA77\\uFA78\\uFA79\\uFA7A\\uFA7B\\uFA7C\\uFA7D\\uFA7E\\uFA7F\\uFA80\\uFA81\\uFA82\\uFA83\\uFA84\\uFA85\\uFA86\\uFA87\\uFA88\\uFA89\\uFA8A\\uFA8B\\uFA8C\\uFA8D\\uFA8E\\uFA8F\\uFA90\\uFA91\\uFA92\\uFA93\\uFA94\\uFA95\\uFA96\\uFA97\\uFA98\\uFA99\\uFA9A\\uFA9B\\uFA9C\\uFA9D\\uFA9E\\uFA9F\\uFAA0\\uFAA1\\uFAA2\\uFAA3\\uFAA4\\uFAA5\\uFAA6\\uFAA7\\uFAA8\\uFAA9\\uFAAA\\uFAAB\\uFAAC\\uFAAD\\uFAAE\\uFAAF\\uFAB0\\uFAB1\\uFAB2\\uFAB3\\uFAB4\\uFAB5\\uFAB6\\uFAB7\\uFAB8\\uFAB9\\uFABA\\uFABB\\uFABC\\uFABD\\uFABE\\uFABF\\uFAC0\\uFAC1\\uFAC2\\uFAC3\\uFAC4\\uFAC5\\uFAC6\\uFAC7\\uFAC8\\uFAC9\\uFACA\\uFACB\\uFACC\\uFACD\\uFACE\\uFACF\\uFAD0\\uFAD1\\uFAD2\\uFAD3\\uFAD4\\uFAD5\\uFAD6\\uFAD7\\uFAD8\\uFAD9\\uFB1D\\uFB1F\\uFB20\\uFB21\\uFB22\\uFB23\\uFB24\\uFB25\\uFB26\\uFB27\\uFB28\\uFB2A\\uFB2B\\uFB2C\\uFB2D\\uFB2E\\uFB2F\\uFB30\\uFB31\\uFB32\\uFB33\\uFB34\\uFB35\\uFB36\\uFB38\\uFB39\\uFB3A\\uFB3B\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46\\uFB47\\uFB48\\uFB49\\uFB4A\\uFB4B\\uFB4C\\uFB4D\\uFB4E\\uFB4F\\uFB50\\uFB51\\uFB52\\uFB53\\uFB54\\uFB55\\uFB56\\uFB57\\uFB58\\uFB59\\uFB5A\\uFB5B\\uFB5C\\uFB5D\\uFB5E\\uFB5F\\uFB60\\uFB61\\uFB62\\uFB63\\uFB64\\uFB65\\uFB66\\uFB67\\uFB68\\uFB69\\uFB6A\\uFB6B\\uFB6C\\uFB6D\\uFB6E\\uFB6F\\uFB70\\uFB71\\uFB72\\uFB73\\uFB74\\uFB75\\uFB76\\uFB77\\uFB78\\uFB79\\uFB7A\\uFB7B\\uFB7C\\uFB7D\\uFB7E\\uFB7F\\uFB80\\uFB81\\uFB82\\uFB83\\uFB84\\uFB85\\uFB86\\uFB87\\uFB88\\uFB89\\uFB8A\\uFB8B\\uFB8C\\uFB8D\\uFB8E\\uFB8F\\uFB90\\uFB91\\uFB92\\uFB93\\uFB94\\uFB95\\uFB96\\uFB97\\uFB98\\uFB99\\uFB9A\\uFB9B\\uFB9C\\uFB9D\\uFB9E\\uFB9F\\uFBA0\\uFBA1\\uFBA2\\uFBA3\\uFBA4\\uFBA5\\uFBA6\\uFBA7\\uFBA8\\uFBA9\\uFBAA\\uFBAB\\uFBAC\\uFBAD\\uFBAE\\uFBAF\\uFBB0\\uFBB1\\uFBD3\\uFBD4\\uFBD5\\uFBD6\\uFBD7\\uFBD8\\uFBD9\\uFBDA\\uFBDB\\uFBDC\\uFBDD\\uFBDE\\uFBDF\\uFBE0\\uFBE1\\uFBE2\\uFBE3\\uFBE4\\uFBE5\\uFBE6\\uFBE7\\uFBE8\\uFBE9\\uFBEA\\uFBEB\\uFBEC\\uFBED\\uFBEE\\uFBEF\\uFBF0\\uFBF1\\uFBF2\\uFBF3\\uFBF4\\uFBF5\\uFBF6\\uFBF7\\uFBF8\\uFBF9\\uFBFA\\uFBFB\\uFBFC\\uFBFD\\uFBFE\\uFBFF\\uFC00\\uFC01\\uFC02\\uFC03\\uFC04\\uFC05\\uFC06\\uFC07\\uFC08\\uFC09\\uFC0A\\uFC0B\\uFC0C\\uFC0D\\uFC0E\\uFC0F\\uFC10\\uFC11\\uFC12\\uFC13\\uFC14\\uFC15\\uFC16\\uFC17\\uFC18\\uFC19\\uFC1A\\uFC1B\\uFC1C\\uFC1D\\uFC1E\\uFC1F\\uFC20\\uFC21\\uFC22\\uFC23\\uFC24\\uFC25\\uFC26\\uFC27\\uFC28\\uFC29\\uFC2A\\uFC2B\\uFC2C\\uFC2D\\uFC2E\\uFC2F\\uFC30\\uFC31\\uFC32\\uFC33\\uFC34\\uFC35\\uFC36\\uFC37\\uFC38\\uFC39\\uFC3A\\uFC3B\\uFC3C\\uFC3D\\uFC3E\\uFC3F\\uFC40\\uFC41\\uFC42\\uFC43\\uFC44\\uFC45\\uFC46\\uFC47\\uFC48\\uFC49\\uFC4A\\uFC4B\\uFC4C\\uFC4D\\uFC4E\\uFC4F\\uFC50\\uFC51\\uFC52\\uFC53\\uFC54\\uFC55\\uFC56\\uFC57\\uFC58\\uFC59\\uFC5A\\uFC5B\\uFC5C\\uFC5D\\uFC5E\\uFC5F\\uFC60\\uFC61\\uFC62\\uFC63\\uFC64\\uFC65\\uFC66\\uFC67\\uFC68\\uFC69\\uFC6A\\uFC6B\\uFC6C\\uFC6D\\uFC6E\\uFC6F\\uFC70\\uFC71\\uFC72\\uFC73\\uFC74\\uFC75\\uFC76\\uFC77\\uFC78\\uFC79\\uFC7A\\uFC7B\\uFC7C\\uFC7D\\uFC7E\\uFC7F\\uFC80\\uFC81\\uFC82\\uFC83\\uFC84\\uFC85\\uFC86\\uFC87\\uFC88\\uFC89\\uFC8A\\uFC8B\\uFC8C\\uFC8D\\uFC8E\\uFC8F\\uFC90\\uFC91\\uFC92\\uFC93\\uFC94\\uFC95\\uFC96\\uFC97\\uFC98\\uFC99\\uFC9A\\uFC9B\\uFC9C\\uFC9D\\uFC9E\\uFC9F\\uFCA0\\uFCA1\\uFCA2\\uFCA3\\uFCA4\\uFCA5\\uFCA6\\uFCA7\\uFCA8\\uFCA9\\uFCAA\\uFCAB\\uFCAC\\uFCAD\\uFCAE\\uFCAF\\uFCB0\\uFCB1\\uFCB2\\uFCB3\\uFCB4\\uFCB5\\uFCB6\\uFCB7\\uFCB8\\uFCB9\\uFCBA\\uFCBB\\uFCBC\\uFCBD\\uFCBE\\uFCBF\\uFCC0\\uFCC1\\uFCC2\\uFCC3\\uFCC4\\uFCC5\\uFCC6\\uFCC7\\uFCC8\\uFCC9\\uFCCA\\uFCCB\\uFCCC\\uFCCD\\uFCCE\\uFCCF\\uFCD0\\uFCD1\\uFCD2\\uFCD3\\uFCD4\\uFCD5\\uFCD6\\uFCD7\\uFCD8\\uFCD9\\uFCDA\\uFCDB\\uFCDC\\uFCDD\\uFCDE\\uFCDF\\uFCE0\\uFCE1\\uFCE2\\uFCE3\\uFCE4\\uFCE5\\uFCE6\\uFCE7\\uFCE8\\uFCE9\\uFCEA\\uFCEB\\uFCEC\\uFCED\\uFCEE\\uFCEF\\uFCF0\\uFCF1\\uFCF2\\uFCF3\\uFCF4\\uFCF5\\uFCF6\\uFCF7\\uFCF8\\uFCF9\\uFCFA\\uFCFB\\uFCFC\\uFCFD\\uFCFE\\uFCFF\\uFD00\\uFD01\\uFD02\\uFD03\\uFD04\\uFD05\\uFD06\\uFD07\\uFD08\\uFD09\\uFD0A\\uFD0B\\uFD0C\\uFD0D\\uFD0E\\uFD0F\\uFD10\\uFD11\\uFD12\\uFD13\\uFD14\\uFD15\\uFD16\\uFD17\\uFD18\\uFD19\\uFD1A\\uFD1B\\uFD1C\\uFD1D\\uFD1E\\uFD1F\\uFD20\\uFD21\\uFD22\\uFD23\\uFD24\\uFD25\\uFD26\\uFD27\\uFD28\\uFD29\\uFD2A\\uFD2B\\uFD2C\\uFD2D\\uFD2E\\uFD2F\\uFD30\\uFD31\\uFD32\\uFD33\\uFD34\\uFD35\\uFD36\\uFD37\\uFD38\\uFD39\\uFD3A\\uFD3B\\uFD3C\\uFD3D\\uFD50\\uFD51\\uFD52\\uFD53\\uFD54\\uFD55\\uFD56\\uFD57\\uFD58\\uFD59\\uFD5A\\uFD5B\\uFD5C\\uFD5D\\uFD5E\\uFD5F\\uFD60\\uFD61\\uFD62\\uFD63\\uFD64\\uFD65\\uFD66\\uFD67\\uFD68\\uFD69\\uFD6A\\uFD6B\\uFD6C\\uFD6D\\uFD6E\\uFD6F\\uFD70\\uFD71\\uFD72\\uFD73\\uFD74\\uFD75\\uFD76\\uFD77\\uFD78\\uFD79\\uFD7A\\uFD7B\\uFD7C\\uFD7D\\uFD7E\\uFD7F\\uFD80\\uFD81\\uFD82\\uFD83\\uFD84\\uFD85\\uFD86\\uFD87\\uFD88\\uFD89\\uFD8A\\uFD8B\\uFD8C\\uFD8D\\uFD8E\\uFD8F\\uFD92\\uFD93\\uFD94\\uFD95\\uFD96\\uFD97\\uFD98\\uFD99\\uFD9A\\uFD9B\\uFD9C\\uFD9D\\uFD9E\\uFD9F\\uFDA0\\uFDA1\\uFDA2\\uFDA3\\uFDA4\\uFDA5\\uFDA6\\uFDA7\\uFDA8\\uFDA9\\uFDAA\\uFDAB\\uFDAC\\uFDAD\\uFDAE\\uFDAF\\uFDB0\\uFDB1\\uFDB2\\uFDB3\\uFDB4\\uFDB5\\uFDB6\\uFDB7\\uFDB8\\uFDB9\\uFDBA\\uFDBB\\uFDBC\\uFDBD\\uFDBE\\uFDBF\\uFDC0\\uFDC1\\uFDC2\\uFDC3\\uFDC4\\uFDC5\\uFDC6\\uFDC7\\uFDF0\\uFDF1\\uFDF2\\uFDF3\\uFDF4\\uFDF5\\uFDF6\\uFDF7\\uFDF8\\uFDF9\\uFDFA\\uFDFB\\uFE70\\uFE71\\uFE72\\uFE73\\uFE74\\uFE76\\uFE77\\uFE78\\uFE79\\uFE7A\\uFE7B\\uFE7C\\uFE7D\\uFE7E\\uFE7F\\uFE80\\uFE81\\uFE82\\uFE83\\uFE84\\uFE85\\uFE86\\uFE87\\uFE88\\uFE89\\uFE8A\\uFE8B\\uFE8C\\uFE8D\\uFE8E\\uFE8F\\uFE90\\uFE91\\uFE92\\uFE93\\uFE94\\uFE95\\uFE96\\uFE97\\uFE98\\uFE99\\uFE9A\\uFE9B\\uFE9C\\uFE9D\\uFE9E\\uFE9F\\uFEA0\\uFEA1\\uFEA2\\uFEA3\\uFEA4\\uFEA5\\uFEA6\\uFEA7\\uFEA8\\uFEA9\\uFEAA\\uFEAB\\uFEAC\\uFEAD\\uFEAE\\uFEAF\\uFEB0\\uFEB1\\uFEB2\\uFEB3\\uFEB4\\uFEB5\\uFEB6\\uFEB7\\uFEB8\\uFEB9\\uFEBA\\uFEBB\\uFEBC\\uFEBD\\uFEBE\\uFEBF\\uFEC0\\uFEC1\\uFEC2\\uFEC3\\uFEC4\\uFEC5\\uFEC6\\uFEC7\\uFEC8\\uFEC9\\uFECA\\uFECB\\uFECC\\uFECD\\uFECE\\uFECF\\uFED0\\uFED1\\uFED2\\uFED3\\uFED4\\uFED5\\uFED6\\uFED7\\uFED8\\uFED9\\uFEDA\\uFEDB\\uFEDC\\uFEDD\\uFEDE\\uFEDF\\uFEE0\\uFEE1\\uFEE2\\uFEE3\\uFEE4\\uFEE5\\uFEE6\\uFEE7\\uFEE8\\uFEE9\\uFEEA\\uFEEB\\uFEEC\\uFEED\\uFEEE\\uFEEF\\uFEF0\\uFEF1\\uFEF2\\uFEF3\\uFEF4\\uFEF5\\uFEF6\\uFEF7\\uFEF8\\uFEF9\\uFEFA\\uFEFB\\uFEFC\\uFF66\\uFF67\\uFF68\\uFF69\\uFF6A\\uFF6B\\uFF6C\\uFF6D\\uFF6E\\uFF6F\\uFF71\\uFF72\\uFF73\\uFF74\\uFF75\\uFF76\\uFF77\\uFF78\\uFF79\\uFF7A\\uFF7B\\uFF7C\\uFF7D\\uFF7E\\uFF7F\\uFF80\\uFF81\\uFF82\\uFF83\\uFF84\\uFF85\\uFF86\\uFF87\\uFF88\\uFF89\\uFF8A\\uFF8B\\uFF8C\\uFF8D\\uFF8E\\uFF8F\\uFF90\\uFF91\\uFF92\\uFF93\\uFF94\\uFF95\\uFF96\\uFF97\\uFF98\\uFF99\\uFF9A\\uFF9B\\uFF9C\\uFF9D\\uFFA0\\uFFA1\\uFFA2\\uFFA3\\uFFA4\\uFFA5\\uFFA6\\uFFA7\\uFFA8\\uFFA9\\uFFAA\\uFFAB\\uFFAC\\uFFAD\\uFFAE\\uFFAF\\uFFB0\\uFFB1\\uFFB2\\uFFB3\\uFFB4\\uFFB5\\uFFB6\\uFFB7\\uFFB8\\uFFB9\\uFFBA\\uFFBB\\uFFBC\\uFFBD\\uFFBE\\uFFC2\\uFFC3\\uFFC4\\uFFC5\\uFFC6\\uFFC7\\uFFCA\\uFFCB\\uFFCC\\uFFCD\\uFFCE\\uFFCF\\uFFD2\\uFFD3\\uFFD4\\uFFD5\\uFFD6\\uFFD7\\uFFDA\\uFFDB\\uFFDC]", description: "[\\u01BB\\u01C0\\u01C1\\u01C2\\u01C3\\u0294\\u05D0\\u05D1\\u05D2\\u05D3\\u05D4\\u05D5\\u05D6\\u05D7\\u05D8\\u05D9\\u05DA\\u05DB\\u05DC\\u05DD\\u05DE\\u05DF\\u05E0\\u05E1\\u05E2\\u05E3\\u05E4\\u05E5\\u05E6\\u05E7\\u05E8\\u05E9\\u05EA\\u05F0\\u05F1\\u05F2\\u0621\\u0622\\u0623\\u0624\\u0625\\u0626\\u0627\\u0628\\u0629\\u062A\\u062B\\u062C\\u062D\\u062E\\u062F\\u0630\\u0631\\u0632\\u0633\\u0634\\u0635\\u0636\\u0637\\u0638\\u0639\\u063A\\u063B\\u063C\\u063D\\u063E\\u063F\\u0641\\u0642\\u0643\\u0644\\u0645\\u0646\\u0647\\u0648\\u0649\\u064A\\u066E\\u066F\\u0671\\u0672\\u0673\\u0674\\u0675\\u0676\\u0677\\u0678\\u0679\\u067A\\u067B\\u067C\\u067D\\u067E\\u067F\\u0680\\u0681\\u0682\\u0683\\u0684\\u0685\\u0686\\u0687\\u0688\\u0689\\u068A\\u068B\\u068C\\u068D\\u068E\\u068F\\u0690\\u0691\\u0692\\u0693\\u0694\\u0695\\u0696\\u0697\\u0698\\u0699\\u069A\\u069B\\u069C\\u069D\\u069E\\u069F\\u06A0\\u06A1\\u06A2\\u06A3\\u06A4\\u06A5\\u06A6\\u06A7\\u06A8\\u06A9\\u06AA\\u06AB\\u06AC\\u06AD\\u06AE\\u06AF\\u06B0\\u06B1\\u06B2\\u06B3\\u06B4\\u06B5\\u06B6\\u06B7\\u06B8\\u06B9\\u06BA\\u06BB\\u06BC\\u06BD\\u06BE\\u06BF\\u06C0\\u06C1\\u06C2\\u06C3\\u06C4\\u06C5\\u06C6\\u06C7\\u06C8\\u06C9\\u06CA\\u06CB\\u06CC\\u06CD\\u06CE\\u06CF\\u06D0\\u06D1\\u06D2\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA\\u06FB\\u06FC\\u06FF\\u0710\\u0712\\u0713\\u0714\\u0715\\u0716\\u0717\\u0718\\u0719\\u071A\\u071B\\u071C\\u071D\\u071E\\u071F\\u0720\\u0721\\u0722\\u0723\\u0724\\u0725\\u0726\\u0727\\u0728\\u0729\\u072A\\u072B\\u072C\\u072D\\u072E\\u072F\\u074D\\u074E\\u074F\\u0750\\u0751\\u0752\\u0753\\u0754\\u0755\\u0756\\u0757\\u0758\\u0759\\u075A\\u075B\\u075C\\u075D\\u075E\\u075F\\u0760\\u0761\\u0762\\u0763\\u0764\\u0765\\u0766\\u0767\\u0768\\u0769\\u076A\\u076B\\u076C\\u076D\\u076E\\u076F\\u0770\\u0771\\u0772\\u0773\\u0774\\u0775\\u0776\\u0777\\u0778\\u0779\\u077A\\u077B\\u077C\\u077D\\u077E\\u077F\\u0780\\u0781\\u0782\\u0783\\u0784\\u0785\\u0786\\u0787\\u0788\\u0789\\u078A\\u078B\\u078C\\u078D\\u078E\\u078F\\u0790\\u0791\\u0792\\u0793\\u0794\\u0795\\u0796\\u0797\\u0798\\u0799\\u079A\\u079B\\u079C\\u079D\\u079E\\u079F\\u07A0\\u07A1\\u07A2\\u07A3\\u07A4\\u07A5\\u07B1\\u07CA\\u07CB\\u07CC\\u07CD\\u07CE\\u07CF\\u07D0\\u07D1\\u07D2\\u07D3\\u07D4\\u07D5\\u07D6\\u07D7\\u07D8\\u07D9\\u07DA\\u07DB\\u07DC\\u07DD\\u07DE\\u07DF\\u07E0\\u07E1\\u07E2\\u07E3\\u07E4\\u07E5\\u07E6\\u07E7\\u07E8\\u07E9\\u07EA\\u0904\\u0905\\u0906\\u0907\\u0908\\u0909\\u090A\\u090B\\u090C\\u090D\\u090E\\u090F\\u0910\\u0911\\u0912\\u0913\\u0914\\u0915\\u0916\\u0917\\u0918\\u0919\\u091A\\u091B\\u091C\\u091D\\u091E\\u091F\\u0920\\u0921\\u0922\\u0923\\u0924\\u0925\\u0926\\u0927\\u0928\\u0929\\u092A\\u092B\\u092C\\u092D\\u092E\\u092F\\u0930\\u0931\\u0932\\u0933\\u0934\\u0935\\u0936\\u0937\\u0938\\u0939\\u093D\\u0950\\u0958\\u0959\\u095A\\u095B\\u095C\\u095D\\u095E\\u095F\\u0960\\u0961\\u0972\\u097B\\u097C\\u097D\\u097E\\u097F\\u0985\\u0986\\u0987\\u0988\\u0989\\u098A\\u098B\\u098C\\u098F\\u0990\\u0993\\u0994\\u0995\\u0996\\u0997\\u0998\\u0999\\u099A\\u099B\\u099C\\u099D\\u099E\\u099F\\u09A0\\u09A1\\u09A2\\u09A3\\u09A4\\u09A5\\u09A6\\u09A7\\u09A8\\u09AA\\u09AB\\u09AC\\u09AD\\u09AE\\u09AF\\u09B0\\u09B2\\u09B6\\u09B7\\u09B8\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1\\u09F0\\u09F1\\u0A05\\u0A06\\u0A07\\u0A08\\u0A09\\u0A0A\\u0A0F\\u0A10\\u0A13\\u0A14\\u0A15\\u0A16\\u0A17\\u0A18\\u0A19\\u0A1A\\u0A1B\\u0A1C\\u0A1D\\u0A1E\\u0A1F\\u0A20\\u0A21\\u0A22\\u0A23\\u0A24\\u0A25\\u0A26\\u0A27\\u0A28\\u0A2A\\u0A2B\\u0A2C\\u0A2D\\u0A2E\\u0A2F\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74\\u0A85\\u0A86\\u0A87\\u0A88\\u0A89\\u0A8A\\u0A8B\\u0A8C\\u0A8D\\u0A8F\\u0A90\\u0A91\\u0A93\\u0A94\\u0A95\\u0A96\\u0A97\\u0A98\\u0A99\\u0A9A\\u0A9B\\u0A9C\\u0A9D\\u0A9E\\u0A9F\\u0AA0\\u0AA1\\u0AA2\\u0AA3\\u0AA4\\u0AA5\\u0AA6\\u0AA7\\u0AA8\\u0AAA\\u0AAB\\u0AAC\\u0AAD\\u0AAE\\u0AAF\\u0AB0\\u0AB2\\u0AB3\\u0AB5\\u0AB6\\u0AB7\\u0AB8\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05\\u0B06\\u0B07\\u0B08\\u0B09\\u0B0A\\u0B0B\\u0B0C\\u0B0F\\u0B10\\u0B13\\u0B14\\u0B15\\u0B16\\u0B17\\u0B18\\u0B19\\u0B1A\\u0B1B\\u0B1C\\u0B1D\\u0B1E\\u0B1F\\u0B20\\u0B21\\u0B22\\u0B23\\u0B24\\u0B25\\u0B26\\u0B27\\u0B28\\u0B2A\\u0B2B\\u0B2C\\u0B2D\\u0B2E\\u0B2F\\u0B30\\u0B32\\u0B33\\u0B35\\u0B36\\u0B37\\u0B38\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61\\u0B71\\u0B83\\u0B85\\u0B86\\u0B87\\u0B88\\u0B89\\u0B8A\\u0B8E\\u0B8F\\u0B90\\u0B92\\u0B93\\u0B94\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8\\u0BA9\\u0BAA\\u0BAE\\u0BAF\\u0BB0\\u0BB1\\u0BB2\\u0BB3\\u0BB4\\u0BB5\\u0BB6\\u0BB7\\u0BB8\\u0BB9\\u0BD0\\u0C05\\u0C06\\u0C07\\u0C08\\u0C09\\u0C0A\\u0C0B\\u0C0C\\u0C0E\\u0C0F\\u0C10\\u0C12\\u0C13\\u0C14\\u0C15\\u0C16\\u0C17\\u0C18\\u0C19\\u0C1A\\u0C1B\\u0C1C\\u0C1D\\u0C1E\\u0C1F\\u0C20\\u0C21\\u0C22\\u0C23\\u0C24\\u0C25\\u0C26\\u0C27\\u0C28\\u0C2A\\u0C2B\\u0C2C\\u0C2D\\u0C2E\\u0C2F\\u0C30\\u0C31\\u0C32\\u0C33\\u0C35\\u0C36\\u0C37\\u0C38\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85\\u0C86\\u0C87\\u0C88\\u0C89\\u0C8A\\u0C8B\\u0C8C\\u0C8E\\u0C8F\\u0C90\\u0C92\\u0C93\\u0C94\\u0C95\\u0C96\\u0C97\\u0C98\\u0C99\\u0C9A\\u0C9B\\u0C9C\\u0C9D\\u0C9E\\u0C9F\\u0CA0\\u0CA1\\u0CA2\\u0CA3\\u0CA4\\u0CA5\\u0CA6\\u0CA7\\u0CA8\\u0CAA\\u0CAB\\u0CAC\\u0CAD\\u0CAE\\u0CAF\\u0CB0\\u0CB1\\u0CB2\\u0CB3\\u0CB5\\u0CB6\\u0CB7\\u0CB8\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05\\u0D06\\u0D07\\u0D08\\u0D09\\u0D0A\\u0D0B\\u0D0C\\u0D0E\\u0D0F\\u0D10\\u0D12\\u0D13\\u0D14\\u0D15\\u0D16\\u0D17\\u0D18\\u0D19\\u0D1A\\u0D1B\\u0D1C\\u0D1D\\u0D1E\\u0D1F\\u0D20\\u0D21\\u0D22\\u0D23\\u0D24\\u0D25\\u0D26\\u0D27\\u0D28\\u0D2A\\u0D2B\\u0D2C\\u0D2D\\u0D2E\\u0D2F\\u0D30\\u0D31\\u0D32\\u0D33\\u0D34\\u0D35\\u0D36\\u0D37\\u0D38\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A\\u0D7B\\u0D7C\\u0D7D\\u0D7E\\u0D7F\\u0D85\\u0D86\\u0D87\\u0D88\\u0D89\\u0D8A\\u0D8B\\u0D8C\\u0D8D\\u0D8E\\u0D8F\\u0D90\\u0D91\\u0D92\\u0D93\\u0D94\\u0D95\\u0D96\\u0D9A\\u0D9B\\u0D9C\\u0D9D\\u0D9E\\u0D9F\\u0DA0\\u0DA1\\u0DA2\\u0DA3\\u0DA4\\u0DA5\\u0DA6\\u0DA7\\u0DA8\\u0DA9\\u0DAA\\u0DAB\\u0DAC\\u0DAD\\u0DAE\\u0DAF\\u0DB0\\u0DB1\\u0DB3\\u0DB4\\u0DB5\\u0DB6\\u0DB7\\u0DB8\\u0DB9\\u0DBA\\u0DBB\\u0DBD\\u0DC0\\u0DC1\\u0DC2\\u0DC3\\u0DC4\\u0DC5\\u0DC6\\u0E01\\u0E02\\u0E03\\u0E04\\u0E05\\u0E06\\u0E07\\u0E08\\u0E09\\u0E0A\\u0E0B\\u0E0C\\u0E0D\\u0E0E\\u0E0F\\u0E10\\u0E11\\u0E12\\u0E13\\u0E14\\u0E15\\u0E16\\u0E17\\u0E18\\u0E19\\u0E1A\\u0E1B\\u0E1C\\u0E1D\\u0E1E\\u0E1F\\u0E20\\u0E21\\u0E22\\u0E23\\u0E24\\u0E25\\u0E26\\u0E27\\u0E28\\u0E29\\u0E2A\\u0E2B\\u0E2C\\u0E2D\\u0E2E\\u0E2F\\u0E30\\u0E32\\u0E33\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94\\u0E95\\u0E96\\u0E97\\u0E99\\u0E9A\\u0E9B\\u0E9C\\u0E9D\\u0E9E\\u0E9F\\u0EA1\\u0EA2\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD\\u0EAE\\u0EAF\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\u0EDC\\u0EDD\\u0F00\\u0F40\\u0F41\\u0F42\\u0F43\\u0F44\\u0F45\\u0F46\\u0F47\\u0F49\\u0F4A\\u0F4B\\u0F4C\\u0F4D\\u0F4E\\u0F4F\\u0F50\\u0F51\\u0F52\\u0F53\\u0F54\\u0F55\\u0F56\\u0F57\\u0F58\\u0F59\\u0F5A\\u0F5B\\u0F5C\\u0F5D\\u0F5E\\u0F5F\\u0F60\\u0F61\\u0F62\\u0F63\\u0F64\\u0F65\\u0F66\\u0F67\\u0F68\\u0F69\\u0F6A\\u0F6B\\u0F6C\\u0F88\\u0F89\\u0F8A\\u0F8B\\u1000\\u1001\\u1002\\u1003\\u1004\\u1005\\u1006\\u1007\\u1008\\u1009\\u100A\\u100B\\u100C\\u100D\\u100E\\u100F\\u1010\\u1011\\u1012\\u1013\\u1014\\u1015\\u1016\\u1017\\u1018\\u1019\\u101A\\u101B\\u101C\\u101D\\u101E\\u101F\\u1020\\u1021\\u1022\\u1023\\u1024\\u1025\\u1026\\u1027\\u1028\\u1029\\u102A\\u103F\\u1050\\u1051\\u1052\\u1053\\u1054\\u1055\\u105A\\u105B\\u105C\\u105D\\u1061\\u1065\\u1066\\u106E\\u106F\\u1070\\u1075\\u1076\\u1077\\u1078\\u1079\\u107A\\u107B\\u107C\\u107D\\u107E\\u107F\\u1080\\u1081\\u108E\\u10D0\\u10D1\\u10D2\\u10D3\\u10D4\\u10D5\\u10D6\\u10D7\\u10D8\\u10D9\\u10DA\\u10DB\\u10DC\\u10DD\\u10DE\\u10DF\\u10E0\\u10E1\\u10E2\\u10E3\\u10E4\\u10E5\\u10E6\\u10E7\\u10E8\\u10E9\\u10EA\\u10EB\\u10EC\\u10ED\\u10EE\\u10EF\\u10F0\\u10F1\\u10F2\\u10F3\\u10F4\\u10F5\\u10F6\\u10F7\\u10F8\\u10F9\\u10FA\\u1100\\u1101\\u1102\\u1103\\u1104\\u1105\\u1106\\u1107\\u1108\\u1109\\u110A\\u110B\\u110C\\u110D\\u110E\\u110F\\u1110\\u1111\\u1112\\u1113\\u1114\\u1115\\u1116\\u1117\\u1118\\u1119\\u111A\\u111B\\u111C\\u111D\\u111E\\u111F\\u1120\\u1121\\u1122\\u1123\\u1124\\u1125\\u1126\\u1127\\u1128\\u1129\\u112A\\u112B\\u112C\\u112D\\u112E\\u112F\\u1130\\u1131\\u1132\\u1133\\u1134\\u1135\\u1136\\u1137\\u1138\\u1139\\u113A\\u113B\\u113C\\u113D\\u113E\\u113F\\u1140\\u1141\\u1142\\u1143\\u1144\\u1145\\u1146\\u1147\\u1148\\u1149\\u114A\\u114B\\u114C\\u114D\\u114E\\u114F\\u1150\\u1151\\u1152\\u1153\\u1154\\u1155\\u1156\\u1157\\u1158\\u1159\\u115F\\u1160\\u1161\\u1162\\u1163\\u1164\\u1165\\u1166\\u1167\\u1168\\u1169\\u116A\\u116B\\u116C\\u116D\\u116E\\u116F\\u1170\\u1171\\u1172\\u1173\\u1174\\u1175\\u1176\\u1177\\u1178\\u1179\\u117A\\u117B\\u117C\\u117D\\u117E\\u117F\\u1180\\u1181\\u1182\\u1183\\u1184\\u1185\\u1186\\u1187\\u1188\\u1189\\u118A\\u118B\\u118C\\u118D\\u118E\\u118F\\u1190\\u1191\\u1192\\u1193\\u1194\\u1195\\u1196\\u1197\\u1198\\u1199\\u119A\\u119B\\u119C\\u119D\\u119E\\u119F\\u11A0\\u11A1\\u11A2\\u11A8\\u11A9\\u11AA\\u11AB\\u11AC\\u11AD\\u11AE\\u11AF\\u11B0\\u11B1\\u11B2\\u11B3\\u11B4\\u11B5\\u11B6\\u11B7\\u11B8\\u11B9\\u11BA\\u11BB\\u11BC\\u11BD\\u11BE\\u11BF\\u11C0\\u11C1\\u11C2\\u11C3\\u11C4\\u11C5\\u11C6\\u11C7\\u11C8\\u11C9\\u11CA\\u11CB\\u11CC\\u11CD\\u11CE\\u11CF\\u11D0\\u11D1\\u11D2\\u11D3\\u11D4\\u11D5\\u11D6\\u11D7\\u11D8\\u11D9\\u11DA\\u11DB\\u11DC\\u11DD\\u11DE\\u11DF\\u11E0\\u11E1\\u11E2\\u11E3\\u11E4\\u11E5\\u11E6\\u11E7\\u11E8\\u11E9\\u11EA\\u11EB\\u11EC\\u11ED\\u11EE\\u11EF\\u11F0\\u11F1\\u11F2\\u11F3\\u11F4\\u11F5\\u11F6\\u11F7\\u11F8\\u11F9\\u1200\\u1201\\u1202\\u1203\\u1204\\u1205\\u1206\\u1207\\u1208\\u1209\\u120A\\u120B\\u120C\\u120D\\u120E\\u120F\\u1210\\u1211\\u1212\\u1213\\u1214\\u1215\\u1216\\u1217\\u1218\\u1219\\u121A\\u121B\\u121C\\u121D\\u121E\\u121F\\u1220\\u1221\\u1222\\u1223\\u1224\\u1225\\u1226\\u1227\\u1228\\u1229\\u122A\\u122B\\u122C\\u122D\\u122E\\u122F\\u1230\\u1231\\u1232\\u1233\\u1234\\u1235\\u1236\\u1237\\u1238\\u1239\\u123A\\u123B\\u123C\\u123D\\u123E\\u123F\\u1240\\u1241\\u1242\\u1243\\u1244\\u1245\\u1246\\u1247\\u1248\\u124A\\u124B\\u124C\\u124D\\u1250\\u1251\\u1252\\u1253\\u1254\\u1255\\u1256\\u1258\\u125A\\u125B\\u125C\\u125D\\u1260\\u1261\\u1262\\u1263\\u1264\\u1265\\u1266\\u1267\\u1268\\u1269\\u126A\\u126B\\u126C\\u126D\\u126E\\u126F\\u1270\\u1271\\u1272\\u1273\\u1274\\u1275\\u1276\\u1277\\u1278\\u1279\\u127A\\u127B\\u127C\\u127D\\u127E\\u127F\\u1280\\u1281\\u1282\\u1283\\u1284\\u1285\\u1286\\u1287\\u1288\\u128A\\u128B\\u128C\\u128D\\u1290\\u1291\\u1292\\u1293\\u1294\\u1295\\u1296\\u1297\\u1298\\u1299\\u129A\\u129B\\u129C\\u129D\\u129E\\u129F\\u12A0\\u12A1\\u12A2\\u12A3\\u12A4\\u12A5\\u12A6\\u12A7\\u12A8\\u12A9\\u12AA\\u12AB\\u12AC\\u12AD\\u12AE\\u12AF\\u12B0\\u12B2\\u12B3\\u12B4\\u12B5\\u12B8\\u12B9\\u12BA\\u12BB\\u12BC\\u12BD\\u12BE\\u12C0\\u12C2\\u12C3\\u12C4\\u12C5\\u12C8\\u12C9\\u12CA\\u12CB\\u12CC\\u12CD\\u12CE\\u12CF\\u12D0\\u12D1\\u12D2\\u12D3\\u12D4\\u12D5\\u12D6\\u12D8\\u12D9\\u12DA\\u12DB\\u12DC\\u12DD\\u12DE\\u12DF\\u12E0\\u12E1\\u12E2\\u12E3\\u12E4\\u12E5\\u12E6\\u12E7\\u12E8\\u12E9\\u12EA\\u12EB\\u12EC\\u12ED\\u12EE\\u12EF\\u12F0\\u12F1\\u12F2\\u12F3\\u12F4\\u12F5\\u12F6\\u12F7\\u12F8\\u12F9\\u12FA\\u12FB\\u12FC\\u12FD\\u12FE\\u12FF\\u1300\\u1301\\u1302\\u1303\\u1304\\u1305\\u1306\\u1307\\u1308\\u1309\\u130A\\u130B\\u130C\\u130D\\u130E\\u130F\\u1310\\u1312\\u1313\\u1314\\u1315\\u1318\\u1319\\u131A\\u131B\\u131C\\u131D\\u131E\\u131F\\u1320\\u1321\\u1322\\u1323\\u1324\\u1325\\u1326\\u1327\\u1328\\u1329\\u132A\\u132B\\u132C\\u132D\\u132E\\u132F\\u1330\\u1331\\u1332\\u1333\\u1334\\u1335\\u1336\\u1337\\u1338\\u1339\\u133A\\u133B\\u133C\\u133D\\u133E\\u133F\\u1340\\u1341\\u1342\\u1343\\u1344\\u1345\\u1346\\u1347\\u1348\\u1349\\u134A\\u134B\\u134C\\u134D\\u134E\\u134F\\u1350\\u1351\\u1352\\u1353\\u1354\\u1355\\u1356\\u1357\\u1358\\u1359\\u135A\\u1380\\u1381\\u1382\\u1383\\u1384\\u1385\\u1386\\u1387\\u1388\\u1389\\u138A\\u138B\\u138C\\u138D\\u138E\\u138F\\u13A0\\u13A1\\u13A2\\u13A3\\u13A4\\u13A5\\u13A6\\u13A7\\u13A8\\u13A9\\u13AA\\u13AB\\u13AC\\u13AD\\u13AE\\u13AF\\u13B0\\u13B1\\u13B2\\u13B3\\u13B4\\u13B5\\u13B6\\u13B7\\u13B8\\u13B9\\u13BA\\u13BB\\u13BC\\u13BD\\u13BE\\u13BF\\u13C0\\u13C1\\u13C2\\u13C3\\u13C4\\u13C5\\u13C6\\u13C7\\u13C8\\u13C9\\u13CA\\u13CB\\u13CC\\u13CD\\u13CE\\u13CF\\u13D0\\u13D1\\u13D2\\u13D3\\u13D4\\u13D5\\u13D6\\u13D7\\u13D8\\u13D9\\u13DA\\u13DB\\u13DC\\u13DD\\u13DE\\u13DF\\u13E0\\u13E1\\u13E2\\u13E3\\u13E4\\u13E5\\u13E6\\u13E7\\u13E8\\u13E9\\u13EA\\u13EB\\u13EC\\u13ED\\u13EE\\u13EF\\u13F0\\u13F1\\u13F2\\u13F3\\u13F4\\u1401\\u1402\\u1403\\u1404\\u1405\\u1406\\u1407\\u1408\\u1409\\u140A\\u140B\\u140C\\u140D\\u140E\\u140F\\u1410\\u1411\\u1412\\u1413\\u1414\\u1415\\u1416\\u1417\\u1418\\u1419\\u141A\\u141B\\u141C\\u141D\\u141E\\u141F\\u1420\\u1421\\u1422\\u1423\\u1424\\u1425\\u1426\\u1427\\u1428\\u1429\\u142A\\u142B\\u142C\\u142D\\u142E\\u142F\\u1430\\u1431\\u1432\\u1433\\u1434\\u1435\\u1436\\u1437\\u1438\\u1439\\u143A\\u143B\\u143C\\u143D\\u143E\\u143F\\u1440\\u1441\\u1442\\u1443\\u1444\\u1445\\u1446\\u1447\\u1448\\u1449\\u144A\\u144B\\u144C\\u144D\\u144E\\u144F\\u1450\\u1451\\u1452\\u1453\\u1454\\u1455\\u1456\\u1457\\u1458\\u1459\\u145A\\u145B\\u145C\\u145D\\u145E\\u145F\\u1460\\u1461\\u1462\\u1463\\u1464\\u1465\\u1466\\u1467\\u1468\\u1469\\u146A\\u146B\\u146C\\u146D\\u146E\\u146F\\u1470\\u1471\\u1472\\u1473\\u1474\\u1475\\u1476\\u1477\\u1478\\u1479\\u147A\\u147B\\u147C\\u147D\\u147E\\u147F\\u1480\\u1481\\u1482\\u1483\\u1484\\u1485\\u1486\\u1487\\u1488\\u1489\\u148A\\u148B\\u148C\\u148D\\u148E\\u148F\\u1490\\u1491\\u1492\\u1493\\u1494\\u1495\\u1496\\u1497\\u1498\\u1499\\u149A\\u149B\\u149C\\u149D\\u149E\\u149F\\u14A0\\u14A1\\u14A2\\u14A3\\u14A4\\u14A5\\u14A6\\u14A7\\u14A8\\u14A9\\u14AA\\u14AB\\u14AC\\u14AD\\u14AE\\u14AF\\u14B0\\u14B1\\u14B2\\u14B3\\u14B4\\u14B5\\u14B6\\u14B7\\u14B8\\u14B9\\u14BA\\u14BB\\u14BC\\u14BD\\u14BE\\u14BF\\u14C0\\u14C1\\u14C2\\u14C3\\u14C4\\u14C5\\u14C6\\u14C7\\u14C8\\u14C9\\u14CA\\u14CB\\u14CC\\u14CD\\u14CE\\u14CF\\u14D0\\u14D1\\u14D2\\u14D3\\u14D4\\u14D5\\u14D6\\u14D7\\u14D8\\u14D9\\u14DA\\u14DB\\u14DC\\u14DD\\u14DE\\u14DF\\u14E0\\u14E1\\u14E2\\u14E3\\u14E4\\u14E5\\u14E6\\u14E7\\u14E8\\u14E9\\u14EA\\u14EB\\u14EC\\u14ED\\u14EE\\u14EF\\u14F0\\u14F1\\u14F2\\u14F3\\u14F4\\u14F5\\u14F6\\u14F7\\u14F8\\u14F9\\u14FA\\u14FB\\u14FC\\u14FD\\u14FE\\u14FF\\u1500\\u1501\\u1502\\u1503\\u1504\\u1505\\u1506\\u1507\\u1508\\u1509\\u150A\\u150B\\u150C\\u150D\\u150E\\u150F\\u1510\\u1511\\u1512\\u1513\\u1514\\u1515\\u1516\\u1517\\u1518\\u1519\\u151A\\u151B\\u151C\\u151D\\u151E\\u151F\\u1520\\u1521\\u1522\\u1523\\u1524\\u1525\\u1526\\u1527\\u1528\\u1529\\u152A\\u152B\\u152C\\u152D\\u152E\\u152F\\u1530\\u1531\\u1532\\u1533\\u1534\\u1535\\u1536\\u1537\\u1538\\u1539\\u153A\\u153B\\u153C\\u153D\\u153E\\u153F\\u1540\\u1541\\u1542\\u1543\\u1544\\u1545\\u1546\\u1547\\u1548\\u1549\\u154A\\u154B\\u154C\\u154D\\u154E\\u154F\\u1550\\u1551\\u1552\\u1553\\u1554\\u1555\\u1556\\u1557\\u1558\\u1559\\u155A\\u155B\\u155C\\u155D\\u155E\\u155F\\u1560\\u1561\\u1562\\u1563\\u1564\\u1565\\u1566\\u1567\\u1568\\u1569\\u156A\\u156B\\u156C\\u156D\\u156E\\u156F\\u1570\\u1571\\u1572\\u1573\\u1574\\u1575\\u1576\\u1577\\u1578\\u1579\\u157A\\u157B\\u157C\\u157D\\u157E\\u157F\\u1580\\u1581\\u1582\\u1583\\u1584\\u1585\\u1586\\u1587\\u1588\\u1589\\u158A\\u158B\\u158C\\u158D\\u158E\\u158F\\u1590\\u1591\\u1592\\u1593\\u1594\\u1595\\u1596\\u1597\\u1598\\u1599\\u159A\\u159B\\u159C\\u159D\\u159E\\u159F\\u15A0\\u15A1\\u15A2\\u15A3\\u15A4\\u15A5\\u15A6\\u15A7\\u15A8\\u15A9\\u15AA\\u15AB\\u15AC\\u15AD\\u15AE\\u15AF\\u15B0\\u15B1\\u15B2\\u15B3\\u15B4\\u15B5\\u15B6\\u15B7\\u15B8\\u15B9\\u15BA\\u15BB\\u15BC\\u15BD\\u15BE\\u15BF\\u15C0\\u15C1\\u15C2\\u15C3\\u15C4\\u15C5\\u15C6\\u15C7\\u15C8\\u15C9\\u15CA\\u15CB\\u15CC\\u15CD\\u15CE\\u15CF\\u15D0\\u15D1\\u15D2\\u15D3\\u15D4\\u15D5\\u15D6\\u15D7\\u15D8\\u15D9\\u15DA\\u15DB\\u15DC\\u15DD\\u15DE\\u15DF\\u15E0\\u15E1\\u15E2\\u15E3\\u15E4\\u15E5\\u15E6\\u15E7\\u15E8\\u15E9\\u15EA\\u15EB\\u15EC\\u15ED\\u15EE\\u15EF\\u15F0\\u15F1\\u15F2\\u15F3\\u15F4\\u15F5\\u15F6\\u15F7\\u15F8\\u15F9\\u15FA\\u15FB\\u15FC\\u15FD\\u15FE\\u15FF\\u1600\\u1601\\u1602\\u1603\\u1604\\u1605\\u1606\\u1607\\u1608\\u1609\\u160A\\u160B\\u160C\\u160D\\u160E\\u160F\\u1610\\u1611\\u1612\\u1613\\u1614\\u1615\\u1616\\u1617\\u1618\\u1619\\u161A\\u161B\\u161C\\u161D\\u161E\\u161F\\u1620\\u1621\\u1622\\u1623\\u1624\\u1625\\u1626\\u1627\\u1628\\u1629\\u162A\\u162B\\u162C\\u162D\\u162E\\u162F\\u1630\\u1631\\u1632\\u1633\\u1634\\u1635\\u1636\\u1637\\u1638\\u1639\\u163A\\u163B\\u163C\\u163D\\u163E\\u163F\\u1640\\u1641\\u1642\\u1643\\u1644\\u1645\\u1646\\u1647\\u1648\\u1649\\u164A\\u164B\\u164C\\u164D\\u164E\\u164F\\u1650\\u1651\\u1652\\u1653\\u1654\\u1655\\u1656\\u1657\\u1658\\u1659\\u165A\\u165B\\u165C\\u165D\\u165E\\u165F\\u1660\\u1661\\u1662\\u1663\\u1664\\u1665\\u1666\\u1667\\u1668\\u1669\\u166A\\u166B\\u166C\\u166F\\u1670\\u1671\\u1672\\u1673\\u1674\\u1675\\u1676\\u1681\\u1682\\u1683\\u1684\\u1685\\u1686\\u1687\\u1688\\u1689\\u168A\\u168B\\u168C\\u168D\\u168E\\u168F\\u1690\\u1691\\u1692\\u1693\\u1694\\u1695\\u1696\\u1697\\u1698\\u1699\\u169A\\u16A0\\u16A1\\u16A2\\u16A3\\u16A4\\u16A5\\u16A6\\u16A7\\u16A8\\u16A9\\u16AA\\u16AB\\u16AC\\u16AD\\u16AE\\u16AF\\u16B0\\u16B1\\u16B2\\u16B3\\u16B4\\u16B5\\u16B6\\u16B7\\u16B8\\u16B9\\u16BA\\u16BB\\u16BC\\u16BD\\u16BE\\u16BF\\u16C0\\u16C1\\u16C2\\u16C3\\u16C4\\u16C5\\u16C6\\u16C7\\u16C8\\u16C9\\u16CA\\u16CB\\u16CC\\u16CD\\u16CE\\u16CF\\u16D0\\u16D1\\u16D2\\u16D3\\u16D4\\u16D5\\u16D6\\u16D7\\u16D8\\u16D9\\u16DA\\u16DB\\u16DC\\u16DD\\u16DE\\u16DF\\u16E0\\u16E1\\u16E2\\u16E3\\u16E4\\u16E5\\u16E6\\u16E7\\u16E8\\u16E9\\u16EA\\u1700\\u1701\\u1702\\u1703\\u1704\\u1705\\u1706\\u1707\\u1708\\u1709\\u170A\\u170B\\u170C\\u170E\\u170F\\u1710\\u1711\\u1720\\u1721\\u1722\\u1723\\u1724\\u1725\\u1726\\u1727\\u1728\\u1729\\u172A\\u172B\\u172C\\u172D\\u172E\\u172F\\u1730\\u1731\\u1740\\u1741\\u1742\\u1743\\u1744\\u1745\\u1746\\u1747\\u1748\\u1749\\u174A\\u174B\\u174C\\u174D\\u174E\\u174F\\u1750\\u1751\\u1760\\u1761\\u1762\\u1763\\u1764\\u1765\\u1766\\u1767\\u1768\\u1769\\u176A\\u176B\\u176C\\u176E\\u176F\\u1770\\u1780\\u1781\\u1782\\u1783\\u1784\\u1785\\u1786\\u1787\\u1788\\u1789\\u178A\\u178B\\u178C\\u178D\\u178E\\u178F\\u1790\\u1791\\u1792\\u1793\\u1794\\u1795\\u1796\\u1797\\u1798\\u1799\\u179A\\u179B\\u179C\\u179D\\u179E\\u179F\\u17A0\\u17A1\\u17A2\\u17A3\\u17A4\\u17A5\\u17A6\\u17A7\\u17A8\\u17A9\\u17AA\\u17AB\\u17AC\\u17AD\\u17AE\\u17AF\\u17B0\\u17B1\\u17B2\\u17B3\\u17DC\\u1820\\u1821\\u1822\\u1823\\u1824\\u1825\\u1826\\u1827\\u1828\\u1829\\u182A\\u182B\\u182C\\u182D\\u182E\\u182F\\u1830\\u1831\\u1832\\u1833\\u1834\\u1835\\u1836\\u1837\\u1838\\u1839\\u183A\\u183B\\u183C\\u183D\\u183E\\u183F\\u1840\\u1841\\u1842\\u1844\\u1845\\u1846\\u1847\\u1848\\u1849\\u184A\\u184B\\u184C\\u184D\\u184E\\u184F\\u1850\\u1851\\u1852\\u1853\\u1854\\u1855\\u1856\\u1857\\u1858\\u1859\\u185A\\u185B\\u185C\\u185D\\u185E\\u185F\\u1860\\u1861\\u1862\\u1863\\u1864\\u1865\\u1866\\u1867\\u1868\\u1869\\u186A\\u186B\\u186C\\u186D\\u186E\\u186F\\u1870\\u1871\\u1872\\u1873\\u1874\\u1875\\u1876\\u1877\\u1880\\u1881\\u1882\\u1883\\u1884\\u1885\\u1886\\u1887\\u1888\\u1889\\u188A\\u188B\\u188C\\u188D\\u188E\\u188F\\u1890\\u1891\\u1892\\u1893\\u1894\\u1895\\u1896\\u1897\\u1898\\u1899\\u189A\\u189B\\u189C\\u189D\\u189E\\u189F\\u18A0\\u18A1\\u18A2\\u18A3\\u18A4\\u18A5\\u18A6\\u18A7\\u18A8\\u18AA\\u1900\\u1901\\u1902\\u1903\\u1904\\u1905\\u1906\\u1907\\u1908\\u1909\\u190A\\u190B\\u190C\\u190D\\u190E\\u190F\\u1910\\u1911\\u1912\\u1913\\u1914\\u1915\\u1916\\u1917\\u1918\\u1919\\u191A\\u191B\\u191C\\u1950\\u1951\\u1952\\u1953\\u1954\\u1955\\u1956\\u1957\\u1958\\u1959\\u195A\\u195B\\u195C\\u195D\\u195E\\u195F\\u1960\\u1961\\u1962\\u1963\\u1964\\u1965\\u1966\\u1967\\u1968\\u1969\\u196A\\u196B\\u196C\\u196D\\u1970\\u1971\\u1972\\u1973\\u1974\\u1980\\u1981\\u1982\\u1983\\u1984\\u1985\\u1986\\u1987\\u1988\\u1989\\u198A\\u198B\\u198C\\u198D\\u198E\\u198F\\u1990\\u1991\\u1992\\u1993\\u1994\\u1995\\u1996\\u1997\\u1998\\u1999\\u199A\\u199B\\u199C\\u199D\\u199E\\u199F\\u19A0\\u19A1\\u19A2\\u19A3\\u19A4\\u19A5\\u19A6\\u19A7\\u19A8\\u19A9\\u19C1\\u19C2\\u19C3\\u19C4\\u19C5\\u19C6\\u19C7\\u1A00\\u1A01\\u1A02\\u1A03\\u1A04\\u1A05\\u1A06\\u1A07\\u1A08\\u1A09\\u1A0A\\u1A0B\\u1A0C\\u1A0D\\u1A0E\\u1A0F\\u1A10\\u1A11\\u1A12\\u1A13\\u1A14\\u1A15\\u1A16\\u1B05\\u1B06\\u1B07\\u1B08\\u1B09\\u1B0A\\u1B0B\\u1B0C\\u1B0D\\u1B0E\\u1B0F\\u1B10\\u1B11\\u1B12\\u1B13\\u1B14\\u1B15\\u1B16\\u1B17\\u1B18\\u1B19\\u1B1A\\u1B1B\\u1B1C\\u1B1D\\u1B1E\\u1B1F\\u1B20\\u1B21\\u1B22\\u1B23\\u1B24\\u1B25\\u1B26\\u1B27\\u1B28\\u1B29\\u1B2A\\u1B2B\\u1B2C\\u1B2D\\u1B2E\\u1B2F\\u1B30\\u1B31\\u1B32\\u1B33\\u1B45\\u1B46\\u1B47\\u1B48\\u1B49\\u1B4A\\u1B4B\\u1B83\\u1B84\\u1B85\\u1B86\\u1B87\\u1B88\\u1B89\\u1B8A\\u1B8B\\u1B8C\\u1B8D\\u1B8E\\u1B8F\\u1B90\\u1B91\\u1B92\\u1B93\\u1B94\\u1B95\\u1B96\\u1B97\\u1B98\\u1B99\\u1B9A\\u1B9B\\u1B9C\\u1B9D\\u1B9E\\u1B9F\\u1BA0\\u1BAE\\u1BAF\\u1C00\\u1C01\\u1C02\\u1C03\\u1C04\\u1C05\\u1C06\\u1C07\\u1C08\\u1C09\\u1C0A\\u1C0B\\u1C0C\\u1C0D\\u1C0E\\u1C0F\\u1C10\\u1C11\\u1C12\\u1C13\\u1C14\\u1C15\\u1C16\\u1C17\\u1C18\\u1C19\\u1C1A\\u1C1B\\u1C1C\\u1C1D\\u1C1E\\u1C1F\\u1C20\\u1C21\\u1C22\\u1C23\\u1C4D\\u1C4E\\u1C4F\\u1C5A\\u1C5B\\u1C5C\\u1C5D\\u1C5E\\u1C5F\\u1C60\\u1C61\\u1C62\\u1C63\\u1C64\\u1C65\\u1C66\\u1C67\\u1C68\\u1C69\\u1C6A\\u1C6B\\u1C6C\\u1C6D\\u1C6E\\u1C6F\\u1C70\\u1C71\\u1C72\\u1C73\\u1C74\\u1C75\\u1C76\\u1C77\\u2135\\u2136\\u2137\\u2138\\u2D30\\u2D31\\u2D32\\u2D33\\u2D34\\u2D35\\u2D36\\u2D37\\u2D38\\u2D39\\u2D3A\\u2D3B\\u2D3C\\u2D3D\\u2D3E\\u2D3F\\u2D40\\u2D41\\u2D42\\u2D43\\u2D44\\u2D45\\u2D46\\u2D47\\u2D48\\u2D49\\u2D4A\\u2D4B\\u2D4C\\u2D4D\\u2D4E\\u2D4F\\u2D50\\u2D51\\u2D52\\u2D53\\u2D54\\u2D55\\u2D56\\u2D57\\u2D58\\u2D59\\u2D5A\\u2D5B\\u2D5C\\u2D5D\\u2D5E\\u2D5F\\u2D60\\u2D61\\u2D62\\u2D63\\u2D64\\u2D65\\u2D80\\u2D81\\u2D82\\u2D83\\u2D84\\u2D85\\u2D86\\u2D87\\u2D88\\u2D89\\u2D8A\\u2D8B\\u2D8C\\u2D8D\\u2D8E\\u2D8F\\u2D90\\u2D91\\u2D92\\u2D93\\u2D94\\u2D95\\u2D96\\u2DA0\\u2DA1\\u2DA2\\u2DA3\\u2DA4\\u2DA5\\u2DA6\\u2DA8\\u2DA9\\u2DAA\\u2DAB\\u2DAC\\u2DAD\\u2DAE\\u2DB0\\u2DB1\\u2DB2\\u2DB3\\u2DB4\\u2DB5\\u2DB6\\u2DB8\\u2DB9\\u2DBA\\u2DBB\\u2DBC\\u2DBD\\u2DBE\\u2DC0\\u2DC1\\u2DC2\\u2DC3\\u2DC4\\u2DC5\\u2DC6\\u2DC8\\u2DC9\\u2DCA\\u2DCB\\u2DCC\\u2DCD\\u2DCE\\u2DD0\\u2DD1\\u2DD2\\u2DD3\\u2DD4\\u2DD5\\u2DD6\\u2DD8\\u2DD9\\u2DDA\\u2DDB\\u2DDC\\u2DDD\\u2DDE\\u3006\\u303C\\u3041\\u3042\\u3043\\u3044\\u3045\\u3046\\u3047\\u3048\\u3049\\u304A\\u304B\\u304C\\u304D\\u304E\\u304F\\u3050\\u3051\\u3052\\u3053\\u3054\\u3055\\u3056\\u3057\\u3058\\u3059\\u305A\\u305B\\u305C\\u305D\\u305E\\u305F\\u3060\\u3061\\u3062\\u3063\\u3064\\u3065\\u3066\\u3067\\u3068\\u3069\\u306A\\u306B\\u306C\\u306D\\u306E\\u306F\\u3070\\u3071\\u3072\\u3073\\u3074\\u3075\\u3076\\u3077\\u3078\\u3079\\u307A\\u307B\\u307C\\u307D\\u307E\\u307F\\u3080\\u3081\\u3082\\u3083\\u3084\\u3085\\u3086\\u3087\\u3088\\u3089\\u308A\\u308B\\u308C\\u308D\\u308E\\u308F\\u3090\\u3091\\u3092\\u3093\\u3094\\u3095\\u3096\\u309F\\u30A1\\u30A2\\u30A3\\u30A4\\u30A5\\u30A6\\u30A7\\u30A8\\u30A9\\u30AA\\u30AB\\u30AC\\u30AD\\u30AE\\u30AF\\u30B0\\u30B1\\u30B2\\u30B3\\u30B4\\u30B5\\u30B6\\u30B7\\u30B8\\u30B9\\u30BA\\u30BB\\u30BC\\u30BD\\u30BE\\u30BF\\u30C0\\u30C1\\u30C2\\u30C3\\u30C4\\u30C5\\u30C6\\u30C7\\u30C8\\u30C9\\u30CA\\u30CB\\u30CC\\u30CD\\u30CE\\u30CF\\u30D0\\u30D1\\u30D2\\u30D3\\u30D4\\u30D5\\u30D6\\u30D7\\u30D8\\u30D9\\u30DA\\u30DB\\u30DC\\u30DD\\u30DE\\u30DF\\u30E0\\u30E1\\u30E2\\u30E3\\u30E4\\u30E5\\u30E6\\u30E7\\u30E8\\u30E9\\u30EA\\u30EB\\u30EC\\u30ED\\u30EE\\u30EF\\u30F0\\u30F1\\u30F2\\u30F3\\u30F4\\u30F5\\u30F6\\u30F7\\u30F8\\u30F9\\u30FA\\u30FF\\u3105\\u3106\\u3107\\u3108\\u3109\\u310A\\u310B\\u310C\\u310D\\u310E\\u310F\\u3110\\u3111\\u3112\\u3113\\u3114\\u3115\\u3116\\u3117\\u3118\\u3119\\u311A\\u311B\\u311C\\u311D\\u311E\\u311F\\u3120\\u3121\\u3122\\u3123\\u3124\\u3125\\u3126\\u3127\\u3128\\u3129\\u312A\\u312B\\u312C\\u312D\\u3131\\u3132\\u3133\\u3134\\u3135\\u3136\\u3137\\u3138\\u3139\\u313A\\u313B\\u313C\\u313D\\u313E\\u313F\\u3140\\u3141\\u3142\\u3143\\u3144\\u3145\\u3146\\u3147\\u3148\\u3149\\u314A\\u314B\\u314C\\u314D\\u314E\\u314F\\u3150\\u3151\\u3152\\u3153\\u3154\\u3155\\u3156\\u3157\\u3158\\u3159\\u315A\\u315B\\u315C\\u315D\\u315E\\u315F\\u3160\\u3161\\u3162\\u3163\\u3164\\u3165\\u3166\\u3167\\u3168\\u3169\\u316A\\u316B\\u316C\\u316D\\u316E\\u316F\\u3170\\u3171\\u3172\\u3173\\u3174\\u3175\\u3176\\u3177\\u3178\\u3179\\u317A\\u317B\\u317C\\u317D\\u317E\\u317F\\u3180\\u3181\\u3182\\u3183\\u3184\\u3185\\u3186\\u3187\\u3188\\u3189\\u318A\\u318B\\u318C\\u318D\\u318E\\u31A0\\u31A1\\u31A2\\u31A3\\u31A4\\u31A5\\u31A6\\u31A7\\u31A8\\u31A9\\u31AA\\u31AB\\u31AC\\u31AD\\u31AE\\u31AF\\u31B0\\u31B1\\u31B2\\u31B3\\u31B4\\u31B5\\u31B6\\u31B7\\u31F0\\u31F1\\u31F2\\u31F3\\u31F4\\u31F5\\u31F6\\u31F7\\u31F8\\u31F9\\u31FA\\u31FB\\u31FC\\u31FD\\u31FE\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000\\uA001\\uA002\\uA003\\uA004\\uA005\\uA006\\uA007\\uA008\\uA009\\uA00A\\uA00B\\uA00C\\uA00D\\uA00E\\uA00F\\uA010\\uA011\\uA012\\uA013\\uA014\\uA016\\uA017\\uA018\\uA019\\uA01A\\uA01B\\uA01C\\uA01D\\uA01E\\uA01F\\uA020\\uA021\\uA022\\uA023\\uA024\\uA025\\uA026\\uA027\\uA028\\uA029\\uA02A\\uA02B\\uA02C\\uA02D\\uA02E\\uA02F\\uA030\\uA031\\uA032\\uA033\\uA034\\uA035\\uA036\\uA037\\uA038\\uA039\\uA03A\\uA03B\\uA03C\\uA03D\\uA03E\\uA03F\\uA040\\uA041\\uA042\\uA043\\uA044\\uA045\\uA046\\uA047\\uA048\\uA049\\uA04A\\uA04B\\uA04C\\uA04D\\uA04E\\uA04F\\uA050\\uA051\\uA052\\uA053\\uA054\\uA055\\uA056\\uA057\\uA058\\uA059\\uA05A\\uA05B\\uA05C\\uA05D\\uA05E\\uA05F\\uA060\\uA061\\uA062\\uA063\\uA064\\uA065\\uA066\\uA067\\uA068\\uA069\\uA06A\\uA06B\\uA06C\\uA06D\\uA06E\\uA06F\\uA070\\uA071\\uA072\\uA073\\uA074\\uA075\\uA076\\uA077\\uA078\\uA079\\uA07A\\uA07B\\uA07C\\uA07D\\uA07E\\uA07F\\uA080\\uA081\\uA082\\uA083\\uA084\\uA085\\uA086\\uA087\\uA088\\uA089\\uA08A\\uA08B\\uA08C\\uA08D\\uA08E\\uA08F\\uA090\\uA091\\uA092\\uA093\\uA094\\uA095\\uA096\\uA097\\uA098\\uA099\\uA09A\\uA09B\\uA09C\\uA09D\\uA09E\\uA09F\\uA0A0\\uA0A1\\uA0A2\\uA0A3\\uA0A4\\uA0A5\\uA0A6\\uA0A7\\uA0A8\\uA0A9\\uA0AA\\uA0AB\\uA0AC\\uA0AD\\uA0AE\\uA0AF\\uA0B0\\uA0B1\\uA0B2\\uA0B3\\uA0B4\\uA0B5\\uA0B6\\uA0B7\\uA0B8\\uA0B9\\uA0BA\\uA0BB\\uA0BC\\uA0BD\\uA0BE\\uA0BF\\uA0C0\\uA0C1\\uA0C2\\uA0C3\\uA0C4\\uA0C5\\uA0C6\\uA0C7\\uA0C8\\uA0C9\\uA0CA\\uA0CB\\uA0CC\\uA0CD\\uA0CE\\uA0CF\\uA0D0\\uA0D1\\uA0D2\\uA0D3\\uA0D4\\uA0D5\\uA0D6\\uA0D7\\uA0D8\\uA0D9\\uA0DA\\uA0DB\\uA0DC\\uA0DD\\uA0DE\\uA0DF\\uA0E0\\uA0E1\\uA0E2\\uA0E3\\uA0E4\\uA0E5\\uA0E6\\uA0E7\\uA0E8\\uA0E9\\uA0EA\\uA0EB\\uA0EC\\uA0ED\\uA0EE\\uA0EF\\uA0F0\\uA0F1\\uA0F2\\uA0F3\\uA0F4\\uA0F5\\uA0F6\\uA0F7\\uA0F8\\uA0F9\\uA0FA\\uA0FB\\uA0FC\\uA0FD\\uA0FE\\uA0FF\\uA100\\uA101\\uA102\\uA103\\uA104\\uA105\\uA106\\uA107\\uA108\\uA109\\uA10A\\uA10B\\uA10C\\uA10D\\uA10E\\uA10F\\uA110\\uA111\\uA112\\uA113\\uA114\\uA115\\uA116\\uA117\\uA118\\uA119\\uA11A\\uA11B\\uA11C\\uA11D\\uA11E\\uA11F\\uA120\\uA121\\uA122\\uA123\\uA124\\uA125\\uA126\\uA127\\uA128\\uA129\\uA12A\\uA12B\\uA12C\\uA12D\\uA12E\\uA12F\\uA130\\uA131\\uA132\\uA133\\uA134\\uA135\\uA136\\uA137\\uA138\\uA139\\uA13A\\uA13B\\uA13C\\uA13D\\uA13E\\uA13F\\uA140\\uA141\\uA142\\uA143\\uA144\\uA145\\uA146\\uA147\\uA148\\uA149\\uA14A\\uA14B\\uA14C\\uA14D\\uA14E\\uA14F\\uA150\\uA151\\uA152\\uA153\\uA154\\uA155\\uA156\\uA157\\uA158\\uA159\\uA15A\\uA15B\\uA15C\\uA15D\\uA15E\\uA15F\\uA160\\uA161\\uA162\\uA163\\uA164\\uA165\\uA166\\uA167\\uA168\\uA169\\uA16A\\uA16B\\uA16C\\uA16D\\uA16E\\uA16F\\uA170\\uA171\\uA172\\uA173\\uA174\\uA175\\uA176\\uA177\\uA178\\uA179\\uA17A\\uA17B\\uA17C\\uA17D\\uA17E\\uA17F\\uA180\\uA181\\uA182\\uA183\\uA184\\uA185\\uA186\\uA187\\uA188\\uA189\\uA18A\\uA18B\\uA18C\\uA18D\\uA18E\\uA18F\\uA190\\uA191\\uA192\\uA193\\uA194\\uA195\\uA196\\uA197\\uA198\\uA199\\uA19A\\uA19B\\uA19C\\uA19D\\uA19E\\uA19F\\uA1A0\\uA1A1\\uA1A2\\uA1A3\\uA1A4\\uA1A5\\uA1A6\\uA1A7\\uA1A8\\uA1A9\\uA1AA\\uA1AB\\uA1AC\\uA1AD\\uA1AE\\uA1AF\\uA1B0\\uA1B1\\uA1B2\\uA1B3\\uA1B4\\uA1B5\\uA1B6\\uA1B7\\uA1B8\\uA1B9\\uA1BA\\uA1BB\\uA1BC\\uA1BD\\uA1BE\\uA1BF\\uA1C0\\uA1C1\\uA1C2\\uA1C3\\uA1C4\\uA1C5\\uA1C6\\uA1C7\\uA1C8\\uA1C9\\uA1CA\\uA1CB\\uA1CC\\uA1CD\\uA1CE\\uA1CF\\uA1D0\\uA1D1\\uA1D2\\uA1D3\\uA1D4\\uA1D5\\uA1D6\\uA1D7\\uA1D8\\uA1D9\\uA1DA\\uA1DB\\uA1DC\\uA1DD\\uA1DE\\uA1DF\\uA1E0\\uA1E1\\uA1E2\\uA1E3\\uA1E4\\uA1E5\\uA1E6\\uA1E7\\uA1E8\\uA1E9\\uA1EA\\uA1EB\\uA1EC\\uA1ED\\uA1EE\\uA1EF\\uA1F0\\uA1F1\\uA1F2\\uA1F3\\uA1F4\\uA1F5\\uA1F6\\uA1F7\\uA1F8\\uA1F9\\uA1FA\\uA1FB\\uA1FC\\uA1FD\\uA1FE\\uA1FF\\uA200\\uA201\\uA202\\uA203\\uA204\\uA205\\uA206\\uA207\\uA208\\uA209\\uA20A\\uA20B\\uA20C\\uA20D\\uA20E\\uA20F\\uA210\\uA211\\uA212\\uA213\\uA214\\uA215\\uA216\\uA217\\uA218\\uA219\\uA21A\\uA21B\\uA21C\\uA21D\\uA21E\\uA21F\\uA220\\uA221\\uA222\\uA223\\uA224\\uA225\\uA226\\uA227\\uA228\\uA229\\uA22A\\uA22B\\uA22C\\uA22D\\uA22E\\uA22F\\uA230\\uA231\\uA232\\uA233\\uA234\\uA235\\uA236\\uA237\\uA238\\uA239\\uA23A\\uA23B\\uA23C\\uA23D\\uA23E\\uA23F\\uA240\\uA241\\uA242\\uA243\\uA244\\uA245\\uA246\\uA247\\uA248\\uA249\\uA24A\\uA24B\\uA24C\\uA24D\\uA24E\\uA24F\\uA250\\uA251\\uA252\\uA253\\uA254\\uA255\\uA256\\uA257\\uA258\\uA259\\uA25A\\uA25B\\uA25C\\uA25D\\uA25E\\uA25F\\uA260\\uA261\\uA262\\uA263\\uA264\\uA265\\uA266\\uA267\\uA268\\uA269\\uA26A\\uA26B\\uA26C\\uA26D\\uA26E\\uA26F\\uA270\\uA271\\uA272\\uA273\\uA274\\uA275\\uA276\\uA277\\uA278\\uA279\\uA27A\\uA27B\\uA27C\\uA27D\\uA27E\\uA27F\\uA280\\uA281\\uA282\\uA283\\uA284\\uA285\\uA286\\uA287\\uA288\\uA289\\uA28A\\uA28B\\uA28C\\uA28D\\uA28E\\uA28F\\uA290\\uA291\\uA292\\uA293\\uA294\\uA295\\uA296\\uA297\\uA298\\uA299\\uA29A\\uA29B\\uA29C\\uA29D\\uA29E\\uA29F\\uA2A0\\uA2A1\\uA2A2\\uA2A3\\uA2A4\\uA2A5\\uA2A6\\uA2A7\\uA2A8\\uA2A9\\uA2AA\\uA2AB\\uA2AC\\uA2AD\\uA2AE\\uA2AF\\uA2B0\\uA2B1\\uA2B2\\uA2B3\\uA2B4\\uA2B5\\uA2B6\\uA2B7\\uA2B8\\uA2B9\\uA2BA\\uA2BB\\uA2BC\\uA2BD\\uA2BE\\uA2BF\\uA2C0\\uA2C1\\uA2C2\\uA2C3\\uA2C4\\uA2C5\\uA2C6\\uA2C7\\uA2C8\\uA2C9\\uA2CA\\uA2CB\\uA2CC\\uA2CD\\uA2CE\\uA2CF\\uA2D0\\uA2D1\\uA2D2\\uA2D3\\uA2D4\\uA2D5\\uA2D6\\uA2D7\\uA2D8\\uA2D9\\uA2DA\\uA2DB\\uA2DC\\uA2DD\\uA2DE\\uA2DF\\uA2E0\\uA2E1\\uA2E2\\uA2E3\\uA2E4\\uA2E5\\uA2E6\\uA2E7\\uA2E8\\uA2E9\\uA2EA\\uA2EB\\uA2EC\\uA2ED\\uA2EE\\uA2EF\\uA2F0\\uA2F1\\uA2F2\\uA2F3\\uA2F4\\uA2F5\\uA2F6\\uA2F7\\uA2F8\\uA2F9\\uA2FA\\uA2FB\\uA2FC\\uA2FD\\uA2FE\\uA2FF\\uA300\\uA301\\uA302\\uA303\\uA304\\uA305\\uA306\\uA307\\uA308\\uA309\\uA30A\\uA30B\\uA30C\\uA30D\\uA30E\\uA30F\\uA310\\uA311\\uA312\\uA313\\uA314\\uA315\\uA316\\uA317\\uA318\\uA319\\uA31A\\uA31B\\uA31C\\uA31D\\uA31E\\uA31F\\uA320\\uA321\\uA322\\uA323\\uA324\\uA325\\uA326\\uA327\\uA328\\uA329\\uA32A\\uA32B\\uA32C\\uA32D\\uA32E\\uA32F\\uA330\\uA331\\uA332\\uA333\\uA334\\uA335\\uA336\\uA337\\uA338\\uA339\\uA33A\\uA33B\\uA33C\\uA33D\\uA33E\\uA33F\\uA340\\uA341\\uA342\\uA343\\uA344\\uA345\\uA346\\uA347\\uA348\\uA349\\uA34A\\uA34B\\uA34C\\uA34D\\uA34E\\uA34F\\uA350\\uA351\\uA352\\uA353\\uA354\\uA355\\uA356\\uA357\\uA358\\uA359\\uA35A\\uA35B\\uA35C\\uA35D\\uA35E\\uA35F\\uA360\\uA361\\uA362\\uA363\\uA364\\uA365\\uA366\\uA367\\uA368\\uA369\\uA36A\\uA36B\\uA36C\\uA36D\\uA36E\\uA36F\\uA370\\uA371\\uA372\\uA373\\uA374\\uA375\\uA376\\uA377\\uA378\\uA379\\uA37A\\uA37B\\uA37C\\uA37D\\uA37E\\uA37F\\uA380\\uA381\\uA382\\uA383\\uA384\\uA385\\uA386\\uA387\\uA388\\uA389\\uA38A\\uA38B\\uA38C\\uA38D\\uA38E\\uA38F\\uA390\\uA391\\uA392\\uA393\\uA394\\uA395\\uA396\\uA397\\uA398\\uA399\\uA39A\\uA39B\\uA39C\\uA39D\\uA39E\\uA39F\\uA3A0\\uA3A1\\uA3A2\\uA3A3\\uA3A4\\uA3A5\\uA3A6\\uA3A7\\uA3A8\\uA3A9\\uA3AA\\uA3AB\\uA3AC\\uA3AD\\uA3AE\\uA3AF\\uA3B0\\uA3B1\\uA3B2\\uA3B3\\uA3B4\\uA3B5\\uA3B6\\uA3B7\\uA3B8\\uA3B9\\uA3BA\\uA3BB\\uA3BC\\uA3BD\\uA3BE\\uA3BF\\uA3C0\\uA3C1\\uA3C2\\uA3C3\\uA3C4\\uA3C5\\uA3C6\\uA3C7\\uA3C8\\uA3C9\\uA3CA\\uA3CB\\uA3CC\\uA3CD\\uA3CE\\uA3CF\\uA3D0\\uA3D1\\uA3D2\\uA3D3\\uA3D4\\uA3D5\\uA3D6\\uA3D7\\uA3D8\\uA3D9\\uA3DA\\uA3DB\\uA3DC\\uA3DD\\uA3DE\\uA3DF\\uA3E0\\uA3E1\\uA3E2\\uA3E3\\uA3E4\\uA3E5\\uA3E6\\uA3E7\\uA3E8\\uA3E9\\uA3EA\\uA3EB\\uA3EC\\uA3ED\\uA3EE\\uA3EF\\uA3F0\\uA3F1\\uA3F2\\uA3F3\\uA3F4\\uA3F5\\uA3F6\\uA3F7\\uA3F8\\uA3F9\\uA3FA\\uA3FB\\uA3FC\\uA3FD\\uA3FE\\uA3FF\\uA400\\uA401\\uA402\\uA403\\uA404\\uA405\\uA406\\uA407\\uA408\\uA409\\uA40A\\uA40B\\uA40C\\uA40D\\uA40E\\uA40F\\uA410\\uA411\\uA412\\uA413\\uA414\\uA415\\uA416\\uA417\\uA418\\uA419\\uA41A\\uA41B\\uA41C\\uA41D\\uA41E\\uA41F\\uA420\\uA421\\uA422\\uA423\\uA424\\uA425\\uA426\\uA427\\uA428\\uA429\\uA42A\\uA42B\\uA42C\\uA42D\\uA42E\\uA42F\\uA430\\uA431\\uA432\\uA433\\uA434\\uA435\\uA436\\uA437\\uA438\\uA439\\uA43A\\uA43B\\uA43C\\uA43D\\uA43E\\uA43F\\uA440\\uA441\\uA442\\uA443\\uA444\\uA445\\uA446\\uA447\\uA448\\uA449\\uA44A\\uA44B\\uA44C\\uA44D\\uA44E\\uA44F\\uA450\\uA451\\uA452\\uA453\\uA454\\uA455\\uA456\\uA457\\uA458\\uA459\\uA45A\\uA45B\\uA45C\\uA45D\\uA45E\\uA45F\\uA460\\uA461\\uA462\\uA463\\uA464\\uA465\\uA466\\uA467\\uA468\\uA469\\uA46A\\uA46B\\uA46C\\uA46D\\uA46E\\uA46F\\uA470\\uA471\\uA472\\uA473\\uA474\\uA475\\uA476\\uA477\\uA478\\uA479\\uA47A\\uA47B\\uA47C\\uA47D\\uA47E\\uA47F\\uA480\\uA481\\uA482\\uA483\\uA484\\uA485\\uA486\\uA487\\uA488\\uA489\\uA48A\\uA48B\\uA48C\\uA500\\uA501\\uA502\\uA503\\uA504\\uA505\\uA506\\uA507\\uA508\\uA509\\uA50A\\uA50B\\uA50C\\uA50D\\uA50E\\uA50F\\uA510\\uA511\\uA512\\uA513\\uA514\\uA515\\uA516\\uA517\\uA518\\uA519\\uA51A\\uA51B\\uA51C\\uA51D\\uA51E\\uA51F\\uA520\\uA521\\uA522\\uA523\\uA524\\uA525\\uA526\\uA527\\uA528\\uA529\\uA52A\\uA52B\\uA52C\\uA52D\\uA52E\\uA52F\\uA530\\uA531\\uA532\\uA533\\uA534\\uA535\\uA536\\uA537\\uA538\\uA539\\uA53A\\uA53B\\uA53C\\uA53D\\uA53E\\uA53F\\uA540\\uA541\\uA542\\uA543\\uA544\\uA545\\uA546\\uA547\\uA548\\uA549\\uA54A\\uA54B\\uA54C\\uA54D\\uA54E\\uA54F\\uA550\\uA551\\uA552\\uA553\\uA554\\uA555\\uA556\\uA557\\uA558\\uA559\\uA55A\\uA55B\\uA55C\\uA55D\\uA55E\\uA55F\\uA560\\uA561\\uA562\\uA563\\uA564\\uA565\\uA566\\uA567\\uA568\\uA569\\uA56A\\uA56B\\uA56C\\uA56D\\uA56E\\uA56F\\uA570\\uA571\\uA572\\uA573\\uA574\\uA575\\uA576\\uA577\\uA578\\uA579\\uA57A\\uA57B\\uA57C\\uA57D\\uA57E\\uA57F\\uA580\\uA581\\uA582\\uA583\\uA584\\uA585\\uA586\\uA587\\uA588\\uA589\\uA58A\\uA58B\\uA58C\\uA58D\\uA58E\\uA58F\\uA590\\uA591\\uA592\\uA593\\uA594\\uA595\\uA596\\uA597\\uA598\\uA599\\uA59A\\uA59B\\uA59C\\uA59D\\uA59E\\uA59F\\uA5A0\\uA5A1\\uA5A2\\uA5A3\\uA5A4\\uA5A5\\uA5A6\\uA5A7\\uA5A8\\uA5A9\\uA5AA\\uA5AB\\uA5AC\\uA5AD\\uA5AE\\uA5AF\\uA5B0\\uA5B1\\uA5B2\\uA5B3\\uA5B4\\uA5B5\\uA5B6\\uA5B7\\uA5B8\\uA5B9\\uA5BA\\uA5BB\\uA5BC\\uA5BD\\uA5BE\\uA5BF\\uA5C0\\uA5C1\\uA5C2\\uA5C3\\uA5C4\\uA5C5\\uA5C6\\uA5C7\\uA5C8\\uA5C9\\uA5CA\\uA5CB\\uA5CC\\uA5CD\\uA5CE\\uA5CF\\uA5D0\\uA5D1\\uA5D2\\uA5D3\\uA5D4\\uA5D5\\uA5D6\\uA5D7\\uA5D8\\uA5D9\\uA5DA\\uA5DB\\uA5DC\\uA5DD\\uA5DE\\uA5DF\\uA5E0\\uA5E1\\uA5E2\\uA5E3\\uA5E4\\uA5E5\\uA5E6\\uA5E7\\uA5E8\\uA5E9\\uA5EA\\uA5EB\\uA5EC\\uA5ED\\uA5EE\\uA5EF\\uA5F0\\uA5F1\\uA5F2\\uA5F3\\uA5F4\\uA5F5\\uA5F6\\uA5F7\\uA5F8\\uA5F9\\uA5FA\\uA5FB\\uA5FC\\uA5FD\\uA5FE\\uA5FF\\uA600\\uA601\\uA602\\uA603\\uA604\\uA605\\uA606\\uA607\\uA608\\uA609\\uA60A\\uA60B\\uA610\\uA611\\uA612\\uA613\\uA614\\uA615\\uA616\\uA617\\uA618\\uA619\\uA61A\\uA61B\\uA61C\\uA61D\\uA61E\\uA61F\\uA62A\\uA62B\\uA66E\\uA7FB\\uA7FC\\uA7FD\\uA7FE\\uA7FF\\uA800\\uA801\\uA803\\uA804\\uA805\\uA807\\uA808\\uA809\\uA80A\\uA80C\\uA80D\\uA80E\\uA80F\\uA810\\uA811\\uA812\\uA813\\uA814\\uA815\\uA816\\uA817\\uA818\\uA819\\uA81A\\uA81B\\uA81C\\uA81D\\uA81E\\uA81F\\uA820\\uA821\\uA822\\uA840\\uA841\\uA842\\uA843\\uA844\\uA845\\uA846\\uA847\\uA848\\uA849\\uA84A\\uA84B\\uA84C\\uA84D\\uA84E\\uA84F\\uA850\\uA851\\uA852\\uA853\\uA854\\uA855\\uA856\\uA857\\uA858\\uA859\\uA85A\\uA85B\\uA85C\\uA85D\\uA85E\\uA85F\\uA860\\uA861\\uA862\\uA863\\uA864\\uA865\\uA866\\uA867\\uA868\\uA869\\uA86A\\uA86B\\uA86C\\uA86D\\uA86E\\uA86F\\uA870\\uA871\\uA872\\uA873\\uA882\\uA883\\uA884\\uA885\\uA886\\uA887\\uA888\\uA889\\uA88A\\uA88B\\uA88C\\uA88D\\uA88E\\uA88F\\uA890\\uA891\\uA892\\uA893\\uA894\\uA895\\uA896\\uA897\\uA898\\uA899\\uA89A\\uA89B\\uA89C\\uA89D\\uA89E\\uA89F\\uA8A0\\uA8A1\\uA8A2\\uA8A3\\uA8A4\\uA8A5\\uA8A6\\uA8A7\\uA8A8\\uA8A9\\uA8AA\\uA8AB\\uA8AC\\uA8AD\\uA8AE\\uA8AF\\uA8B0\\uA8B1\\uA8B2\\uA8B3\\uA90A\\uA90B\\uA90C\\uA90D\\uA90E\\uA90F\\uA910\\uA911\\uA912\\uA913\\uA914\\uA915\\uA916\\uA917\\uA918\\uA919\\uA91A\\uA91B\\uA91C\\uA91D\\uA91E\\uA91F\\uA920\\uA921\\uA922\\uA923\\uA924\\uA925\\uA930\\uA931\\uA932\\uA933\\uA934\\uA935\\uA936\\uA937\\uA938\\uA939\\uA93A\\uA93B\\uA93C\\uA93D\\uA93E\\uA93F\\uA940\\uA941\\uA942\\uA943\\uA944\\uA945\\uA946\\uAA00\\uAA01\\uAA02\\uAA03\\uAA04\\uAA05\\uAA06\\uAA07\\uAA08\\uAA09\\uAA0A\\uAA0B\\uAA0C\\uAA0D\\uAA0E\\uAA0F\\uAA10\\uAA11\\uAA12\\uAA13\\uAA14\\uAA15\\uAA16\\uAA17\\uAA18\\uAA19\\uAA1A\\uAA1B\\uAA1C\\uAA1D\\uAA1E\\uAA1F\\uAA20\\uAA21\\uAA22\\uAA23\\uAA24\\uAA25\\uAA26\\uAA27\\uAA28\\uAA40\\uAA41\\uAA42\\uAA44\\uAA45\\uAA46\\uAA47\\uAA48\\uAA49\\uAA4A\\uAA4B\\uAC00\\uD7A3\\uF900\\uF901\\uF902\\uF903\\uF904\\uF905\\uF906\\uF907\\uF908\\uF909\\uF90A\\uF90B\\uF90C\\uF90D\\uF90E\\uF90F\\uF910\\uF911\\uF912\\uF913\\uF914\\uF915\\uF916\\uF917\\uF918\\uF919\\uF91A\\uF91B\\uF91C\\uF91D\\uF91E\\uF91F\\uF920\\uF921\\uF922\\uF923\\uF924\\uF925\\uF926\\uF927\\uF928\\uF929\\uF92A\\uF92B\\uF92C\\uF92D\\uF92E\\uF92F\\uF930\\uF931\\uF932\\uF933\\uF934\\uF935\\uF936\\uF937\\uF938\\uF939\\uF93A\\uF93B\\uF93C\\uF93D\\uF93E\\uF93F\\uF940\\uF941\\uF942\\uF943\\uF944\\uF945\\uF946\\uF947\\uF948\\uF949\\uF94A\\uF94B\\uF94C\\uF94D\\uF94E\\uF94F\\uF950\\uF951\\uF952\\uF953\\uF954\\uF955\\uF956\\uF957\\uF958\\uF959\\uF95A\\uF95B\\uF95C\\uF95D\\uF95E\\uF95F\\uF960\\uF961\\uF962\\uF963\\uF964\\uF965\\uF966\\uF967\\uF968\\uF969\\uF96A\\uF96B\\uF96C\\uF96D\\uF96E\\uF96F\\uF970\\uF971\\uF972\\uF973\\uF974\\uF975\\uF976\\uF977\\uF978\\uF979\\uF97A\\uF97B\\uF97C\\uF97D\\uF97E\\uF97F\\uF980\\uF981\\uF982\\uF983\\uF984\\uF985\\uF986\\uF987\\uF988\\uF989\\uF98A\\uF98B\\uF98C\\uF98D\\uF98E\\uF98F\\uF990\\uF991\\uF992\\uF993\\uF994\\uF995\\uF996\\uF997\\uF998\\uF999\\uF99A\\uF99B\\uF99C\\uF99D\\uF99E\\uF99F\\uF9A0\\uF9A1\\uF9A2\\uF9A3\\uF9A4\\uF9A5\\uF9A6\\uF9A7\\uF9A8\\uF9A9\\uF9AA\\uF9AB\\uF9AC\\uF9AD\\uF9AE\\uF9AF\\uF9B0\\uF9B1\\uF9B2\\uF9B3\\uF9B4\\uF9B5\\uF9B6\\uF9B7\\uF9B8\\uF9B9\\uF9BA\\uF9BB\\uF9BC\\uF9BD\\uF9BE\\uF9BF\\uF9C0\\uF9C1\\uF9C2\\uF9C3\\uF9C4\\uF9C5\\uF9C6\\uF9C7\\uF9C8\\uF9C9\\uF9CA\\uF9CB\\uF9CC\\uF9CD\\uF9CE\\uF9CF\\uF9D0\\uF9D1\\uF9D2\\uF9D3\\uF9D4\\uF9D5\\uF9D6\\uF9D7\\uF9D8\\uF9D9\\uF9DA\\uF9DB\\uF9DC\\uF9DD\\uF9DE\\uF9DF\\uF9E0\\uF9E1\\uF9E2\\uF9E3\\uF9E4\\uF9E5\\uF9E6\\uF9E7\\uF9E8\\uF9E9\\uF9EA\\uF9EB\\uF9EC\\uF9ED\\uF9EE\\uF9EF\\uF9F0\\uF9F1\\uF9F2\\uF9F3\\uF9F4\\uF9F5\\uF9F6\\uF9F7\\uF9F8\\uF9F9\\uF9FA\\uF9FB\\uF9FC\\uF9FD\\uF9FE\\uF9FF\\uFA00\\uFA01\\uFA02\\uFA03\\uFA04\\uFA05\\uFA06\\uFA07\\uFA08\\uFA09\\uFA0A\\uFA0B\\uFA0C\\uFA0D\\uFA0E\\uFA0F\\uFA10\\uFA11\\uFA12\\uFA13\\uFA14\\uFA15\\uFA16\\uFA17\\uFA18\\uFA19\\uFA1A\\uFA1B\\uFA1C\\uFA1D\\uFA1E\\uFA1F\\uFA20\\uFA21\\uFA22\\uFA23\\uFA24\\uFA25\\uFA26\\uFA27\\uFA28\\uFA29\\uFA2A\\uFA2B\\uFA2C\\uFA2D\\uFA30\\uFA31\\uFA32\\uFA33\\uFA34\\uFA35\\uFA36\\uFA37\\uFA38\\uFA39\\uFA3A\\uFA3B\\uFA3C\\uFA3D\\uFA3E\\uFA3F\\uFA40\\uFA41\\uFA42\\uFA43\\uFA44\\uFA45\\uFA46\\uFA47\\uFA48\\uFA49\\uFA4A\\uFA4B\\uFA4C\\uFA4D\\uFA4E\\uFA4F\\uFA50\\uFA51\\uFA52\\uFA53\\uFA54\\uFA55\\uFA56\\uFA57\\uFA58\\uFA59\\uFA5A\\uFA5B\\uFA5C\\uFA5D\\uFA5E\\uFA5F\\uFA60\\uFA61\\uFA62\\uFA63\\uFA64\\uFA65\\uFA66\\uFA67\\uFA68\\uFA69\\uFA6A\\uFA70\\uFA71\\uFA72\\uFA73\\uFA74\\uFA75\\uFA76\\uFA77\\uFA78\\uFA79\\uFA7A\\uFA7B\\uFA7C\\uFA7D\\uFA7E\\uFA7F\\uFA80\\uFA81\\uFA82\\uFA83\\uFA84\\uFA85\\uFA86\\uFA87\\uFA88\\uFA89\\uFA8A\\uFA8B\\uFA8C\\uFA8D\\uFA8E\\uFA8F\\uFA90\\uFA91\\uFA92\\uFA93\\uFA94\\uFA95\\uFA96\\uFA97\\uFA98\\uFA99\\uFA9A\\uFA9B\\uFA9C\\uFA9D\\uFA9E\\uFA9F\\uFAA0\\uFAA1\\uFAA2\\uFAA3\\uFAA4\\uFAA5\\uFAA6\\uFAA7\\uFAA8\\uFAA9\\uFAAA\\uFAAB\\uFAAC\\uFAAD\\uFAAE\\uFAAF\\uFAB0\\uFAB1\\uFAB2\\uFAB3\\uFAB4\\uFAB5\\uFAB6\\uFAB7\\uFAB8\\uFAB9\\uFABA\\uFABB\\uFABC\\uFABD\\uFABE\\uFABF\\uFAC0\\uFAC1\\uFAC2\\uFAC3\\uFAC4\\uFAC5\\uFAC6\\uFAC7\\uFAC8\\uFAC9\\uFACA\\uFACB\\uFACC\\uFACD\\uFACE\\uFACF\\uFAD0\\uFAD1\\uFAD2\\uFAD3\\uFAD4\\uFAD5\\uFAD6\\uFAD7\\uFAD8\\uFAD9\\uFB1D\\uFB1F\\uFB20\\uFB21\\uFB22\\uFB23\\uFB24\\uFB25\\uFB26\\uFB27\\uFB28\\uFB2A\\uFB2B\\uFB2C\\uFB2D\\uFB2E\\uFB2F\\uFB30\\uFB31\\uFB32\\uFB33\\uFB34\\uFB35\\uFB36\\uFB38\\uFB39\\uFB3A\\uFB3B\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46\\uFB47\\uFB48\\uFB49\\uFB4A\\uFB4B\\uFB4C\\uFB4D\\uFB4E\\uFB4F\\uFB50\\uFB51\\uFB52\\uFB53\\uFB54\\uFB55\\uFB56\\uFB57\\uFB58\\uFB59\\uFB5A\\uFB5B\\uFB5C\\uFB5D\\uFB5E\\uFB5F\\uFB60\\uFB61\\uFB62\\uFB63\\uFB64\\uFB65\\uFB66\\uFB67\\uFB68\\uFB69\\uFB6A\\uFB6B\\uFB6C\\uFB6D\\uFB6E\\uFB6F\\uFB70\\uFB71\\uFB72\\uFB73\\uFB74\\uFB75\\uFB76\\uFB77\\uFB78\\uFB79\\uFB7A\\uFB7B\\uFB7C\\uFB7D\\uFB7E\\uFB7F\\uFB80\\uFB81\\uFB82\\uFB83\\uFB84\\uFB85\\uFB86\\uFB87\\uFB88\\uFB89\\uFB8A\\uFB8B\\uFB8C\\uFB8D\\uFB8E\\uFB8F\\uFB90\\uFB91\\uFB92\\uFB93\\uFB94\\uFB95\\uFB96\\uFB97\\uFB98\\uFB99\\uFB9A\\uFB9B\\uFB9C\\uFB9D\\uFB9E\\uFB9F\\uFBA0\\uFBA1\\uFBA2\\uFBA3\\uFBA4\\uFBA5\\uFBA6\\uFBA7\\uFBA8\\uFBA9\\uFBAA\\uFBAB\\uFBAC\\uFBAD\\uFBAE\\uFBAF\\uFBB0\\uFBB1\\uFBD3\\uFBD4\\uFBD5\\uFBD6\\uFBD7\\uFBD8\\uFBD9\\uFBDA\\uFBDB\\uFBDC\\uFBDD\\uFBDE\\uFBDF\\uFBE0\\uFBE1\\uFBE2\\uFBE3\\uFBE4\\uFBE5\\uFBE6\\uFBE7\\uFBE8\\uFBE9\\uFBEA\\uFBEB\\uFBEC\\uFBED\\uFBEE\\uFBEF\\uFBF0\\uFBF1\\uFBF2\\uFBF3\\uFBF4\\uFBF5\\uFBF6\\uFBF7\\uFBF8\\uFBF9\\uFBFA\\uFBFB\\uFBFC\\uFBFD\\uFBFE\\uFBFF\\uFC00\\uFC01\\uFC02\\uFC03\\uFC04\\uFC05\\uFC06\\uFC07\\uFC08\\uFC09\\uFC0A\\uFC0B\\uFC0C\\uFC0D\\uFC0E\\uFC0F\\uFC10\\uFC11\\uFC12\\uFC13\\uFC14\\uFC15\\uFC16\\uFC17\\uFC18\\uFC19\\uFC1A\\uFC1B\\uFC1C\\uFC1D\\uFC1E\\uFC1F\\uFC20\\uFC21\\uFC22\\uFC23\\uFC24\\uFC25\\uFC26\\uFC27\\uFC28\\uFC29\\uFC2A\\uFC2B\\uFC2C\\uFC2D\\uFC2E\\uFC2F\\uFC30\\uFC31\\uFC32\\uFC33\\uFC34\\uFC35\\uFC36\\uFC37\\uFC38\\uFC39\\uFC3A\\uFC3B\\uFC3C\\uFC3D\\uFC3E\\uFC3F\\uFC40\\uFC41\\uFC42\\uFC43\\uFC44\\uFC45\\uFC46\\uFC47\\uFC48\\uFC49\\uFC4A\\uFC4B\\uFC4C\\uFC4D\\uFC4E\\uFC4F\\uFC50\\uFC51\\uFC52\\uFC53\\uFC54\\uFC55\\uFC56\\uFC57\\uFC58\\uFC59\\uFC5A\\uFC5B\\uFC5C\\uFC5D\\uFC5E\\uFC5F\\uFC60\\uFC61\\uFC62\\uFC63\\uFC64\\uFC65\\uFC66\\uFC67\\uFC68\\uFC69\\uFC6A\\uFC6B\\uFC6C\\uFC6D\\uFC6E\\uFC6F\\uFC70\\uFC71\\uFC72\\uFC73\\uFC74\\uFC75\\uFC76\\uFC77\\uFC78\\uFC79\\uFC7A\\uFC7B\\uFC7C\\uFC7D\\uFC7E\\uFC7F\\uFC80\\uFC81\\uFC82\\uFC83\\uFC84\\uFC85\\uFC86\\uFC87\\uFC88\\uFC89\\uFC8A\\uFC8B\\uFC8C\\uFC8D\\uFC8E\\uFC8F\\uFC90\\uFC91\\uFC92\\uFC93\\uFC94\\uFC95\\uFC96\\uFC97\\uFC98\\uFC99\\uFC9A\\uFC9B\\uFC9C\\uFC9D\\uFC9E\\uFC9F\\uFCA0\\uFCA1\\uFCA2\\uFCA3\\uFCA4\\uFCA5\\uFCA6\\uFCA7\\uFCA8\\uFCA9\\uFCAA\\uFCAB\\uFCAC\\uFCAD\\uFCAE\\uFCAF\\uFCB0\\uFCB1\\uFCB2\\uFCB3\\uFCB4\\uFCB5\\uFCB6\\uFCB7\\uFCB8\\uFCB9\\uFCBA\\uFCBB\\uFCBC\\uFCBD\\uFCBE\\uFCBF\\uFCC0\\uFCC1\\uFCC2\\uFCC3\\uFCC4\\uFCC5\\uFCC6\\uFCC7\\uFCC8\\uFCC9\\uFCCA\\uFCCB\\uFCCC\\uFCCD\\uFCCE\\uFCCF\\uFCD0\\uFCD1\\uFCD2\\uFCD3\\uFCD4\\uFCD5\\uFCD6\\uFCD7\\uFCD8\\uFCD9\\uFCDA\\uFCDB\\uFCDC\\uFCDD\\uFCDE\\uFCDF\\uFCE0\\uFCE1\\uFCE2\\uFCE3\\uFCE4\\uFCE5\\uFCE6\\uFCE7\\uFCE8\\uFCE9\\uFCEA\\uFCEB\\uFCEC\\uFCED\\uFCEE\\uFCEF\\uFCF0\\uFCF1\\uFCF2\\uFCF3\\uFCF4\\uFCF5\\uFCF6\\uFCF7\\uFCF8\\uFCF9\\uFCFA\\uFCFB\\uFCFC\\uFCFD\\uFCFE\\uFCFF\\uFD00\\uFD01\\uFD02\\uFD03\\uFD04\\uFD05\\uFD06\\uFD07\\uFD08\\uFD09\\uFD0A\\uFD0B\\uFD0C\\uFD0D\\uFD0E\\uFD0F\\uFD10\\uFD11\\uFD12\\uFD13\\uFD14\\uFD15\\uFD16\\uFD17\\uFD18\\uFD19\\uFD1A\\uFD1B\\uFD1C\\uFD1D\\uFD1E\\uFD1F\\uFD20\\uFD21\\uFD22\\uFD23\\uFD24\\uFD25\\uFD26\\uFD27\\uFD28\\uFD29\\uFD2A\\uFD2B\\uFD2C\\uFD2D\\uFD2E\\uFD2F\\uFD30\\uFD31\\uFD32\\uFD33\\uFD34\\uFD35\\uFD36\\uFD37\\uFD38\\uFD39\\uFD3A\\uFD3B\\uFD3C\\uFD3D\\uFD50\\uFD51\\uFD52\\uFD53\\uFD54\\uFD55\\uFD56\\uFD57\\uFD58\\uFD59\\uFD5A\\uFD5B\\uFD5C\\uFD5D\\uFD5E\\uFD5F\\uFD60\\uFD61\\uFD62\\uFD63\\uFD64\\uFD65\\uFD66\\uFD67\\uFD68\\uFD69\\uFD6A\\uFD6B\\uFD6C\\uFD6D\\uFD6E\\uFD6F\\uFD70\\uFD71\\uFD72\\uFD73\\uFD74\\uFD75\\uFD76\\uFD77\\uFD78\\uFD79\\uFD7A\\uFD7B\\uFD7C\\uFD7D\\uFD7E\\uFD7F\\uFD80\\uFD81\\uFD82\\uFD83\\uFD84\\uFD85\\uFD86\\uFD87\\uFD88\\uFD89\\uFD8A\\uFD8B\\uFD8C\\uFD8D\\uFD8E\\uFD8F\\uFD92\\uFD93\\uFD94\\uFD95\\uFD96\\uFD97\\uFD98\\uFD99\\uFD9A\\uFD9B\\uFD9C\\uFD9D\\uFD9E\\uFD9F\\uFDA0\\uFDA1\\uFDA2\\uFDA3\\uFDA4\\uFDA5\\uFDA6\\uFDA7\\uFDA8\\uFDA9\\uFDAA\\uFDAB\\uFDAC\\uFDAD\\uFDAE\\uFDAF\\uFDB0\\uFDB1\\uFDB2\\uFDB3\\uFDB4\\uFDB5\\uFDB6\\uFDB7\\uFDB8\\uFDB9\\uFDBA\\uFDBB\\uFDBC\\uFDBD\\uFDBE\\uFDBF\\uFDC0\\uFDC1\\uFDC2\\uFDC3\\uFDC4\\uFDC5\\uFDC6\\uFDC7\\uFDF0\\uFDF1\\uFDF2\\uFDF3\\uFDF4\\uFDF5\\uFDF6\\uFDF7\\uFDF8\\uFDF9\\uFDFA\\uFDFB\\uFE70\\uFE71\\uFE72\\uFE73\\uFE74\\uFE76\\uFE77\\uFE78\\uFE79\\uFE7A\\uFE7B\\uFE7C\\uFE7D\\uFE7E\\uFE7F\\uFE80\\uFE81\\uFE82\\uFE83\\uFE84\\uFE85\\uFE86\\uFE87\\uFE88\\uFE89\\uFE8A\\uFE8B\\uFE8C\\uFE8D\\uFE8E\\uFE8F\\uFE90\\uFE91\\uFE92\\uFE93\\uFE94\\uFE95\\uFE96\\uFE97\\uFE98\\uFE99\\uFE9A\\uFE9B\\uFE9C\\uFE9D\\uFE9E\\uFE9F\\uFEA0\\uFEA1\\uFEA2\\uFEA3\\uFEA4\\uFEA5\\uFEA6\\uFEA7\\uFEA8\\uFEA9\\uFEAA\\uFEAB\\uFEAC\\uFEAD\\uFEAE\\uFEAF\\uFEB0\\uFEB1\\uFEB2\\uFEB3\\uFEB4\\uFEB5\\uFEB6\\uFEB7\\uFEB8\\uFEB9\\uFEBA\\uFEBB\\uFEBC\\uFEBD\\uFEBE\\uFEBF\\uFEC0\\uFEC1\\uFEC2\\uFEC3\\uFEC4\\uFEC5\\uFEC6\\uFEC7\\uFEC8\\uFEC9\\uFECA\\uFECB\\uFECC\\uFECD\\uFECE\\uFECF\\uFED0\\uFED1\\uFED2\\uFED3\\uFED4\\uFED5\\uFED6\\uFED7\\uFED8\\uFED9\\uFEDA\\uFEDB\\uFEDC\\uFEDD\\uFEDE\\uFEDF\\uFEE0\\uFEE1\\uFEE2\\uFEE3\\uFEE4\\uFEE5\\uFEE6\\uFEE7\\uFEE8\\uFEE9\\uFEEA\\uFEEB\\uFEEC\\uFEED\\uFEEE\\uFEEF\\uFEF0\\uFEF1\\uFEF2\\uFEF3\\uFEF4\\uFEF5\\uFEF6\\uFEF7\\uFEF8\\uFEF9\\uFEFA\\uFEFB\\uFEFC\\uFF66\\uFF67\\uFF68\\uFF69\\uFF6A\\uFF6B\\uFF6C\\uFF6D\\uFF6E\\uFF6F\\uFF71\\uFF72\\uFF73\\uFF74\\uFF75\\uFF76\\uFF77\\uFF78\\uFF79\\uFF7A\\uFF7B\\uFF7C\\uFF7D\\uFF7E\\uFF7F\\uFF80\\uFF81\\uFF82\\uFF83\\uFF84\\uFF85\\uFF86\\uFF87\\uFF88\\uFF89\\uFF8A\\uFF8B\\uFF8C\\uFF8D\\uFF8E\\uFF8F\\uFF90\\uFF91\\uFF92\\uFF93\\uFF94\\uFF95\\uFF96\\uFF97\\uFF98\\uFF99\\uFF9A\\uFF9B\\uFF9C\\uFF9D\\uFFA0\\uFFA1\\uFFA2\\uFFA3\\uFFA4\\uFFA5\\uFFA6\\uFFA7\\uFFA8\\uFFA9\\uFFAA\\uFFAB\\uFFAC\\uFFAD\\uFFAE\\uFFAF\\uFFB0\\uFFB1\\uFFB2\\uFFB3\\uFFB4\\uFFB5\\uFFB6\\uFFB7\\uFFB8\\uFFB9\\uFFBA\\uFFBB\\uFFBC\\uFFBD\\uFFBE\\uFFC2\\uFFC3\\uFFC4\\uFFC5\\uFFC6\\uFFC7\\uFFCA\\uFFCB\\uFFCC\\uFFCD\\uFFCE\\uFFCF\\uFFD2\\uFFD3\\uFFD4\\uFFD5\\uFFD6\\uFFD7\\uFFDA\\uFFDB\\uFFDC]" },
peg$c80 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88\u1F89\u1F8A\u1F8B\u1F8C\u1F8D\u1F8E\u1F8F\u1F98\u1F99\u1F9A\u1F9B\u1F9C\u1F9D\u1F9E\u1F9F\u1FA8\u1FA9\u1FAA\u1FAB\u1FAC\u1FAD\u1FAE\u1FAF\u1FBC\u1FCC\u1FFC]/,
peg$c81 = { type: "class", value: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88\\u1F89\\u1F8A\\u1F8B\\u1F8C\\u1F8D\\u1F8E\\u1F8F\\u1F98\\u1F99\\u1F9A\\u1F9B\\u1F9C\\u1F9D\\u1F9E\\u1F9F\\u1FA8\\u1FA9\\u1FAA\\u1FAB\\u1FAC\\u1FAD\\u1FAE\\u1FAF\\u1FBC\\u1FCC\\u1FFC]", description: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88\\u1F89\\u1F8A\\u1F8B\\u1F8C\\u1F8D\\u1F8E\\u1F8F\\u1F98\\u1F99\\u1F9A\\u1F9B\\u1F9C\\u1F9D\\u1F9E\\u1F9F\\u1FA8\\u1FA9\\u1FAA\\u1FAB\\u1FAC\\u1FAD\\u1FAE\\u1FAF\\u1FBC\\u1FCC\\u1FFC]" },
peg$c82 = /^[ABCDEFGHIJKLMNOPQRSTUVWXYZ\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189\u018A\u018B\u018E\u018F\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1\u01B2\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6\u01F7\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243\u0244\u0245\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u0386\u0388\u0389\u038A\u038C\u038E\u038F\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03AA\u03AB\u03CF\u03D2\u03D3\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD\u03FE\u03FF\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040A\u040B\u040C\u040D\u040E\u040F\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053A\u053B\u053C\u053D\u053E\u053F\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054A\u054B\u054C\u054D\u054E\u054F\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10A0\u10A1\u10A2\u10A3\u10A4\u10A5\u10A6\u10A7\u10A8\u10A9\u10AA\u10AB\u10AC\u10AD\u10AE\u10AF\u10B0\u10B1\u10B2\u10B3\u10B4\u10B5\u10B6\u10B7\u10B8\u10B9\u10BA\u10BB\u10BC\u10BD\u10BE\u10BF\u10C0\u10C1\u10C2\u10C3\u10C4\u10C5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08\u1F09\u1F0A\u1F0B\u1F0C\u1F0D\u1F0E\u1F0F\u1F18\u1F19\u1F1A\u1F1B\u1F1C\u1F1D\u1F28\u1F29\u1F2A\u1F2B\u1F2C\u1F2D\u1F2E\u1F2F\u1F38\u1F39\u1F3A\u1F3B\u1F3C\u1F3D\u1F3E\u1F3F\u1F48\u1F49\u1F4A\u1F4B\u1F4C\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68\u1F69\u1F6A\u1F6B\u1F6C\u1F6D\u1F6E\u1F6F\u1FB8\u1FB9\u1FBA\u1FBB\u1FC8\u1FC9\u1FCA\u1FCB\u1FD8\u1FD9\u1FDA\u1FDB\u1FE8\u1FE9\u1FEA\u1FEB\u1FEC\u1FF8\u1FF9\u1FFA\u1FFB\u2102\u2107\u210B\u210C\u210D\u2110\u2111\u2112\u2115\u2119\u211A\u211B\u211C\u211D\u2124\u2126\u2128\u212A\u212B\u212C\u212D\u2130\u2131\u2132\u2133\u213E\u213F\u2145\u2183\u2C00\u2C01\u2C02\u2C03\u2C04\u2C05\u2C06\u2C07\u2C08\u2C09\u2C0A\u2C0B\u2C0C\u2C0D\u2C0E\u2C0F\u2C10\u2C11\u2C12\u2C13\u2C14\u2C15\u2C16\u2C17\u2C18\u2C19\u2C1A\u2C1B\u2C1C\u2C1D\u2C1E\u2C1F\u2C20\u2C21\u2C22\u2C23\u2C24\u2C25\u2C26\u2C27\u2C28\u2C29\u2C2A\u2C2B\u2C2C\u2C2D\u2C2E\u2C60\u2C62\u2C63\u2C64\u2C67\u2C69\u2C6B\u2C6D\u2C6E\u2C6F\u2C72\u2C75\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A]/,
peg$c83 = { type: "class", value: "[ABCDEFGHIJKLMNOPQRSTUVWXYZ\\xC0\\xC1\\xC2\\xC3\\xC4\\xC5\\xC6\\xC7\\xC8\\xC9\\xCA\\xCB\\xCC\\xCD\\xCE\\xCF\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD8\\xD9\\xDA\\xDB\\xDC\\xDD\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189\\u018A\\u018B\\u018E\\u018F\\u0190\\u0191\\u0193\\u0194\\u0196\\u0197\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1\\u01B2\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6\\u01F7\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243\\u0244\\u0245\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u0386\\u0388\\u0389\\u038A\\u038C\\u038E\\u038F\\u0391\\u0392\\u0393\\u0394\\u0395\\u0396\\u0397\\u0398\\u0399\\u039A\\u039B\\u039C\\u039D\\u039E\\u039F\\u03A0\\u03A1\\u03A3\\u03A4\\u03A5\\u03A6\\u03A7\\u03A8\\u03A9\\u03AA\\u03AB\\u03CF\\u03D2\\u03D3\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD\\u03FE\\u03FF\\u0400\\u0401\\u0402\\u0403\\u0404\\u0405\\u0406\\u0407\\u0408\\u0409\\u040A\\u040B\\u040C\\u040D\\u040E\\u040F\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041A\\u041B\\u041C\\u041D\\u041E\\u041F\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042A\\u042B\\u042C\\u042D\\u042E\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0531\\u0532\\u0533\\u0534\\u0535\\u0536\\u0537\\u0538\\u0539\\u053A\\u053B\\u053C\\u053D\\u053E\\u053F\\u0540\\u0541\\u0542\\u0543\\u0544\\u0545\\u0546\\u0547\\u0548\\u0549\\u054A\\u054B\\u054C\\u054D\\u054E\\u054F\\u0550\\u0551\\u0552\\u0553\\u0554\\u0555\\u0556\\u10A0\\u10A1\\u10A2\\u10A3\\u10A4\\u10A5\\u10A6\\u10A7\\u10A8\\u10A9\\u10AA\\u10AB\\u10AC\\u10AD\\u10AE\\u10AF\\u10B0\\u10B1\\u10B2\\u10B3\\u10B4\\u10B5\\u10B6\\u10B7\\u10B8\\u10B9\\u10BA\\u10BB\\u10BC\\u10BD\\u10BE\\u10BF\\u10C0\\u10C1\\u10C2\\u10C3\\u10C4\\u10C5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08\\u1F09\\u1F0A\\u1F0B\\u1F0C\\u1F0D\\u1F0E\\u1F0F\\u1F18\\u1F19\\u1F1A\\u1F1B\\u1F1C\\u1F1D\\u1F28\\u1F29\\u1F2A\\u1F2B\\u1F2C\\u1F2D\\u1F2E\\u1F2F\\u1F38\\u1F39\\u1F3A\\u1F3B\\u1F3C\\u1F3D\\u1F3E\\u1F3F\\u1F48\\u1F49\\u1F4A\\u1F4B\\u1F4C\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68\\u1F69\\u1F6A\\u1F6B\\u1F6C\\u1F6D\\u1F6E\\u1F6F\\u1FB8\\u1FB9\\u1FBA\\u1FBB\\u1FC8\\u1FC9\\u1FCA\\u1FCB\\u1FD8\\u1FD9\\u1FDA\\u1FDB\\u1FE8\\u1FE9\\u1FEA\\u1FEB\\u1FEC\\u1FF8\\u1FF9\\u1FFA\\u1FFB\\u2102\\u2107\\u210B\\u210C\\u210D\\u2110\\u2111\\u2112\\u2115\\u2119\\u211A\\u211B\\u211C\\u211D\\u2124\\u2126\\u2128\\u212A\\u212B\\u212C\\u212D\\u2130\\u2131\\u2132\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00\\u2C01\\u2C02\\u2C03\\u2C04\\u2C05\\u2C06\\u2C07\\u2C08\\u2C09\\u2C0A\\u2C0B\\u2C0C\\u2C0D\\u2C0E\\u2C0F\\u2C10\\u2C11\\u2C12\\u2C13\\u2C14\\u2C15\\u2C16\\u2C17\\u2C18\\u2C19\\u2C1A\\u2C1B\\u2C1C\\u2C1D\\u2C1E\\u2C1F\\u2C20\\u2C21\\u2C22\\u2C23\\u2C24\\u2C25\\u2C26\\u2C27\\u2C28\\u2C29\\u2C2A\\u2C2B\\u2C2C\\u2C2D\\u2C2E\\u2C60\\u2C62\\u2C63\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D\\u2C6E\\u2C6F\\u2C72\\u2C75\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uFF21\\uFF22\\uFF23\\uFF24\\uFF25\\uFF26\\uFF27\\uFF28\\uFF29\\uFF2A\\uFF2B\\uFF2C\\uFF2D\\uFF2E\\uFF2F\\uFF30\\uFF31\\uFF32\\uFF33\\uFF34\\uFF35\\uFF36\\uFF37\\uFF38\\uFF39\\uFF3A]", description: "[ABCDEFGHIJKLMNOPQRSTUVWXYZ\\xC0\\xC1\\xC2\\xC3\\xC4\\xC5\\xC6\\xC7\\xC8\\xC9\\xCA\\xCB\\xCC\\xCD\\xCE\\xCF\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD8\\xD9\\xDA\\xDB\\xDC\\xDD\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189\\u018A\\u018B\\u018E\\u018F\\u0190\\u0191\\u0193\\u0194\\u0196\\u0197\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1\\u01B2\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6\\u01F7\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243\\u0244\\u0245\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u0386\\u0388\\u0389\\u038A\\u038C\\u038E\\u038F\\u0391\\u0392\\u0393\\u0394\\u0395\\u0396\\u0397\\u0398\\u0399\\u039A\\u039B\\u039C\\u039D\\u039E\\u039F\\u03A0\\u03A1\\u03A3\\u03A4\\u03A5\\u03A6\\u03A7\\u03A8\\u03A9\\u03AA\\u03AB\\u03CF\\u03D2\\u03D3\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD\\u03FE\\u03FF\\u0400\\u0401\\u0402\\u0403\\u0404\\u0405\\u0406\\u0407\\u0408\\u0409\\u040A\\u040B\\u040C\\u040D\\u040E\\u040F\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041A\\u041B\\u041C\\u041D\\u041E\\u041F\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042A\\u042B\\u042C\\u042D\\u042E\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0531\\u0532\\u0533\\u0534\\u0535\\u0536\\u0537\\u0538\\u0539\\u053A\\u053B\\u053C\\u053D\\u053E\\u053F\\u0540\\u0541\\u0542\\u0543\\u0544\\u0545\\u0546\\u0547\\u0548\\u0549\\u054A\\u054B\\u054C\\u054D\\u054E\\u054F\\u0550\\u0551\\u0552\\u0553\\u0554\\u0555\\u0556\\u10A0\\u10A1\\u10A2\\u10A3\\u10A4\\u10A5\\u10A6\\u10A7\\u10A8\\u10A9\\u10AA\\u10AB\\u10AC\\u10AD\\u10AE\\u10AF\\u10B0\\u10B1\\u10B2\\u10B3\\u10B4\\u10B5\\u10B6\\u10B7\\u10B8\\u10B9\\u10BA\\u10BB\\u10BC\\u10BD\\u10BE\\u10BF\\u10C0\\u10C1\\u10C2\\u10C3\\u10C4\\u10C5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08\\u1F09\\u1F0A\\u1F0B\\u1F0C\\u1F0D\\u1F0E\\u1F0F\\u1F18\\u1F19\\u1F1A\\u1F1B\\u1F1C\\u1F1D\\u1F28\\u1F29\\u1F2A\\u1F2B\\u1F2C\\u1F2D\\u1F2E\\u1F2F\\u1F38\\u1F39\\u1F3A\\u1F3B\\u1F3C\\u1F3D\\u1F3E\\u1F3F\\u1F48\\u1F49\\u1F4A\\u1F4B\\u1F4C\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68\\u1F69\\u1F6A\\u1F6B\\u1F6C\\u1F6D\\u1F6E\\u1F6F\\u1FB8\\u1FB9\\u1FBA\\u1FBB\\u1FC8\\u1FC9\\u1FCA\\u1FCB\\u1FD8\\u1FD9\\u1FDA\\u1FDB\\u1FE8\\u1FE9\\u1FEA\\u1FEB\\u1FEC\\u1FF8\\u1FF9\\u1FFA\\u1FFB\\u2102\\u2107\\u210B\\u210C\\u210D\\u2110\\u2111\\u2112\\u2115\\u2119\\u211A\\u211B\\u211C\\u211D\\u2124\\u2126\\u2128\\u212A\\u212B\\u212C\\u212D\\u2130\\u2131\\u2132\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00\\u2C01\\u2C02\\u2C03\\u2C04\\u2C05\\u2C06\\u2C07\\u2C08\\u2C09\\u2C0A\\u2C0B\\u2C0C\\u2C0D\\u2C0E\\u2C0F\\u2C10\\u2C11\\u2C12\\u2C13\\u2C14\\u2C15\\u2C16\\u2C17\\u2C18\\u2C19\\u2C1A\\u2C1B\\u2C1C\\u2C1D\\u2C1E\\u2C1F\\u2C20\\u2C21\\u2C22\\u2C23\\u2C24\\u2C25\\u2C26\\u2C27\\u2C28\\u2C29\\u2C2A\\u2C2B\\u2C2C\\u2C2D\\u2C2E\\u2C60\\u2C62\\u2C63\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D\\u2C6E\\u2C6F\\u2C72\\u2C75\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uFF21\\uFF22\\uFF23\\uFF24\\uFF25\\uFF26\\uFF27\\uFF28\\uFF29\\uFF2A\\uFF2B\\uFF2C\\uFF2D\\uFF2E\\uFF2F\\uFF30\\uFF31\\uFF32\\uFF33\\uFF34\\uFF35\\uFF36\\uFF37\\uFF38\\uFF39\\uFF3A]" },
peg$c84 = /^[\u0903\u093E\u093F\u0940\u0949\u094A\u094B\u094C\u0982\u0983\u09BE\u09BF\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E\u0A3F\u0A40\u0A83\u0ABE\u0ABF\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6\u0BC7\u0BC8\u0BCA\u0BCB\u0BCC\u0BD7\u0C01\u0C02\u0C03\u0C41\u0C42\u0C43\u0C44\u0C82\u0C83\u0CBE\u0CC0\u0CC1\u0CC2\u0CC3\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E\u0D3F\u0D40\u0D46\u0D47\u0D48\u0D4A\u0D4B\u0D4C\u0D57\u0D82\u0D83\u0DCF\u0DD0\u0DD1\u0DD8\u0DD9\u0DDA\u0DDB\u0DDC\u0DDD\u0DDE\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062\u1063\u1064\u1067\u1068\u1069\u106A\u106B\u106C\u106D\u1083\u1084\u1087\u1088\u1089\u108A\u108B\u108C\u108F\u17B6\u17BE\u17BF\u17C0\u17C1\u17C2\u17C3\u17C4\u17C5\u17C7\u17C8\u1923\u1924\u1925\u1926\u1929\u192A\u192B\u1930\u1931\u1933\u1934\u1935\u1936\u1937\u1938\u19B0\u19B1\u19B2\u19B3\u19B4\u19B5\u19B6\u19B7\u19B8\u19B9\u19BA\u19BB\u19BC\u19BD\u19BE\u19BF\u19C0\u19C8\u19C9\u1A19\u1A1A\u1A1B\u1B04\u1B35\u1B3B\u1B3D\u1B3E\u1B3F\u1B40\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1C24\u1C25\u1C26\u1C27\u1C28\u1C29\u1C2A\u1C2B\u1C34\u1C35\uA823\uA824\uA827\uA880\uA881\uA8B4\uA8B5\uA8B6\uA8B7\uA8B8\uA8B9\uA8BA\uA8BB\uA8BC\uA8BD\uA8BE\uA8BF\uA8C0\uA8C1\uA8C2\uA8C3\uA952\uA953\uAA2F\uAA30\uAA33\uAA34\uAA4D]/,
peg$c85 = { type: "class", value: "[\\u0903\\u093E\\u093F\\u0940\\u0949\\u094A\\u094B\\u094C\\u0982\\u0983\\u09BE\\u09BF\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E\\u0A3F\\u0A40\\u0A83\\u0ABE\\u0ABF\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6\\u0BC7\\u0BC8\\u0BCA\\u0BCB\\u0BCC\\u0BD7\\u0C01\\u0C02\\u0C03\\u0C41\\u0C42\\u0C43\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0\\u0CC1\\u0CC2\\u0CC3\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E\\u0D3F\\u0D40\\u0D46\\u0D47\\u0D48\\u0D4A\\u0D4B\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF\\u0DD0\\u0DD1\\u0DD8\\u0DD9\\u0DDA\\u0DDB\\u0DDC\\u0DDD\\u0DDE\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062\\u1063\\u1064\\u1067\\u1068\\u1069\\u106A\\u106B\\u106C\\u106D\\u1083\\u1084\\u1087\\u1088\\u1089\\u108A\\u108B\\u108C\\u108F\\u17B6\\u17BE\\u17BF\\u17C0\\u17C1\\u17C2\\u17C3\\u17C4\\u17C5\\u17C7\\u17C8\\u1923\\u1924\\u1925\\u1926\\u1929\\u192A\\u192B\\u1930\\u1931\\u1933\\u1934\\u1935\\u1936\\u1937\\u1938\\u19B0\\u19B1\\u19B2\\u19B3\\u19B4\\u19B5\\u19B6\\u19B7\\u19B8\\u19B9\\u19BA\\u19BB\\u19BC\\u19BD\\u19BE\\u19BF\\u19C0\\u19C8\\u19C9\\u1A19\\u1A1A\\u1A1B\\u1B04\\u1B35\\u1B3B\\u1B3D\\u1B3E\\u1B3F\\u1B40\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24\\u1C25\\u1C26\\u1C27\\u1C28\\u1C29\\u1C2A\\u1C2B\\u1C34\\u1C35\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4\\uA8B5\\uA8B6\\uA8B7\\uA8B8\\uA8B9\\uA8BA\\uA8BB\\uA8BC\\uA8BD\\uA8BE\\uA8BF\\uA8C0\\uA8C1\\uA8C2\\uA8C3\\uA952\\uA953\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D]", description: "[\\u0903\\u093E\\u093F\\u0940\\u0949\\u094A\\u094B\\u094C\\u0982\\u0983\\u09BE\\u09BF\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E\\u0A3F\\u0A40\\u0A83\\u0ABE\\u0ABF\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6\\u0BC7\\u0BC8\\u0BCA\\u0BCB\\u0BCC\\u0BD7\\u0C01\\u0C02\\u0C03\\u0C41\\u0C42\\u0C43\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0\\u0CC1\\u0CC2\\u0CC3\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E\\u0D3F\\u0D40\\u0D46\\u0D47\\u0D48\\u0D4A\\u0D4B\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF\\u0DD0\\u0DD1\\u0DD8\\u0DD9\\u0DDA\\u0DDB\\u0DDC\\u0DDD\\u0DDE\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062\\u1063\\u1064\\u1067\\u1068\\u1069\\u106A\\u106B\\u106C\\u106D\\u1083\\u1084\\u1087\\u1088\\u1089\\u108A\\u108B\\u108C\\u108F\\u17B6\\u17BE\\u17BF\\u17C0\\u17C1\\u17C2\\u17C3\\u17C4\\u17C5\\u17C7\\u17C8\\u1923\\u1924\\u1925\\u1926\\u1929\\u192A\\u192B\\u1930\\u1931\\u1933\\u1934\\u1935\\u1936\\u1937\\u1938\\u19B0\\u19B1\\u19B2\\u19B3\\u19B4\\u19B5\\u19B6\\u19B7\\u19B8\\u19B9\\u19BA\\u19BB\\u19BC\\u19BD\\u19BE\\u19BF\\u19C0\\u19C8\\u19C9\\u1A19\\u1A1A\\u1A1B\\u1B04\\u1B35\\u1B3B\\u1B3D\\u1B3E\\u1B3F\\u1B40\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24\\u1C25\\u1C26\\u1C27\\u1C28\\u1C29\\u1C2A\\u1C2B\\u1C34\\u1C35\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4\\uA8B5\\uA8B6\\uA8B7\\uA8B8\\uA8B9\\uA8BA\\uA8BB\\uA8BC\\uA8BD\\uA8BE\\uA8BF\\uA8C0\\uA8C1\\uA8C2\\uA8C3\\uA952\\uA953\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D]" },
peg$c86 = /^[\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030A\u030B\u030C\u030D\u030E\u030F\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031A\u031B\u031C\u031D\u031E\u031F\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032A\u032B\u032C\u032D\u032E\u032F\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033A\u033B\u033C\u033D\u033E\u033F\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034A\u034B\u034C\u034D\u034E\u034F\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035A\u035B\u035C\u035D\u035E\u035F\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036A\u036B\u036C\u036D\u036E\u036F\u0483\u0484\u0485\u0486\u0487\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059A\u059B\u059C\u059D\u059E\u059F\u05A0\u05A1\u05A2\u05A3\u05A4\u05A5\u05A6\u05A7\u05A8\u05A9\u05AA\u05AB\u05AC\u05AD\u05AE\u05AF\u05B0\u05B1\u05B2\u05B3\u05B4\u05B5\u05B6\u05B7\u05B8\u05B9\u05BA\u05BB\u05BC\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610\u0611\u0612\u0613\u0614\u0615\u0616\u0617\u0618\u0619\u061A\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065A\u065B\u065C\u065D\u065E\u0670\u06D6\u06D7\u06D8\u06D9\u06DA\u06DB\u06DC\u06DF\u06E0\u06E1\u06E2\u06E3\u06E4\u06E7\u06E8\u06EA\u06EB\u06EC\u06ED\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073A\u073B\u073C\u073D\u073E\u073F\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074A\u07A6\u07A7\u07A8\u07A9\u07AA\u07AB\u07AC\u07AD\u07AE\u07AF\u07B0\u07EB\u07EC\u07ED\u07EE\u07EF\u07F0\u07F1\u07F2\u07F3\u0901\u0902\u093C\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u094D\u0951\u0952\u0953\u0954\u0962\u0963\u0981\u09BC\u09C1\u09C2\u09C3\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1\u0AC2\u0AC3\u0AC4\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41\u0B42\u0B43\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C3E\u0C3F\u0C40\u0C46\u0C47\u0C48\u0C4A\u0C4B\u0C4C\u0C4D\u0C55\u0C56\u0C62\u0C63\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D41\u0D42\u0D43\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2\u0DD3\u0DD4\u0DD6\u0E31\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0EB1\u0EB4\u0EB5\u0EB6\u0EB7\u0EB8\u0EB9\u0EBB\u0EBC\u0EC8\u0EC9\u0ECA\u0ECB\u0ECC\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71\u0F72\u0F73\u0F74\u0F75\u0F76\u0F77\u0F78\u0F79\u0F7A\u0F7B\u0F7C\u0F7D\u0F7E\u0F80\u0F81\u0F82\u0F83\u0F84\u0F86\u0F87\u0F90\u0F91\u0F92\u0F93\u0F94\u0F95\u0F96\u0F97\u0F99\u0F9A\u0F9B\u0F9C\u0F9D\u0F9E\u0F9F\u0FA0\u0FA1\u0FA2\u0FA3\u0FA4\u0FA5\u0FA6\u0FA7\u0FA8\u0FA9\u0FAA\u0FAB\u0FAC\u0FAD\u0FAE\u0FAF\u0FB0\u0FB1\u0FB2\u0FB3\u0FB4\u0FB5\u0FB6\u0FB7\u0FB8\u0FB9\u0FBA\u0FBB\u0FBC\u0FC6\u102D\u102E\u102F\u1030\u1032\u1033\u1034\u1035\u1036\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E\u105F\u1060\u1071\u1072\u1073\u1074\u1082\u1085\u1086\u108D\u135F\u1712\u1713\u1714\u1732\u1733\u1734\u1752\u1753\u1772\u1773\u17B7\u17B8\u17B9\u17BA\u17BB\u17BC\u17BD\u17C6\u17C9\u17CA\u17CB\u17CC\u17CD\u17CE\u17CF\u17D0\u17D1\u17D2\u17D3\u17DD\u180B\u180C\u180D\u18A9\u1920\u1921\u1922\u1927\u1928\u1932\u1939\u193A\u193B\u1A17\u1A18\u1B00\u1B01\u1B02\u1B03\u1B34\u1B36\u1B37\u1B38\u1B39\u1B3A\u1B3C\u1B42\u1B6B\u1B6C\u1B6D\u1B6E\u1B6F\u1B70\u1B71\u1B72\u1B73\u1B80\u1B81\u1BA2\u1BA3\u1BA4\u1BA5\u1BA8\u1BA9\u1C2C\u1C2D\u1C2E\u1C2F\u1C30\u1C31\u1C32\u1C33\u1C36\u1C37\u1DC0\u1DC1\u1DC2\u1DC3\u1DC4\u1DC5\u1DC6\u1DC7\u1DC8\u1DC9\u1DCA\u1DCB\u1DCC\u1DCD\u1DCE\u1DCF\u1DD0\u1DD1\u1DD2\u1DD3\u1DD4\u1DD5\u1DD6\u1DD7\u1DD8\u1DD9\u1DDA\u1DDB\u1DDC\u1DDD\u1DDE\u1DDF\u1DE0\u1DE1\u1DE2\u1DE3\u1DE4\u1DE5\u1DE6\u1DFE\u1DFF\u20D0\u20D1\u20D2\u20D3\u20D4\u20D5\u20D6\u20D7\u20D8\u20D9\u20DA\u20DB\u20DC\u20E1\u20E5\u20E6\u20E7\u20E8\u20E9\u20EA\u20EB\u20EC\u20ED\u20EE\u20EF\u20F0\u2DE0\u2DE1\u2DE2\u2DE3\u2DE4\u2DE5\u2DE6\u2DE7\u2DE8\u2DE9\u2DEA\u2DEB\u2DEC\u2DED\u2DEE\u2DEF\u2DF0\u2DF1\u2DF2\u2DF3\u2DF4\u2DF5\u2DF6\u2DF7\u2DF8\u2DF9\u2DFA\u2DFB\u2DFC\u2DFD\u2DFE\u2DFF\u302A\u302B\u302C\u302D\u302E\u302F\u3099\u309A\uA66F\uA67C\uA67D\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA926\uA927\uA928\uA929\uA92A\uA92B\uA92C\uA92D\uA947\uA948\uA949\uA94A\uA94B\uA94C\uA94D\uA94E\uA94F\uA950\uA951\uAA29\uAA2A\uAA2B\uAA2C\uAA2D\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uFB1E\uFE00\uFE01\uFE02\uFE03\uFE04\uFE05\uFE06\uFE07\uFE08\uFE09\uFE0A\uFE0B\uFE0C\uFE0D\uFE0E\uFE0F\uFE20\uFE21\uFE22\uFE23\uFE24\uFE25\uFE26]/,
peg$c87 = { type: "class", value: "[\\u0300\\u0301\\u0302\\u0303\\u0304\\u0305\\u0306\\u0307\\u0308\\u0309\\u030A\\u030B\\u030C\\u030D\\u030E\\u030F\\u0310\\u0311\\u0312\\u0313\\u0314\\u0315\\u0316\\u0317\\u0318\\u0319\\u031A\\u031B\\u031C\\u031D\\u031E\\u031F\\u0320\\u0321\\u0322\\u0323\\u0324\\u0325\\u0326\\u0327\\u0328\\u0329\\u032A\\u032B\\u032C\\u032D\\u032E\\u032F\\u0330\\u0331\\u0332\\u0333\\u0334\\u0335\\u0336\\u0337\\u0338\\u0339\\u033A\\u033B\\u033C\\u033D\\u033E\\u033F\\u0340\\u0341\\u0342\\u0343\\u0344\\u0345\\u0346\\u0347\\u0348\\u0349\\u034A\\u034B\\u034C\\u034D\\u034E\\u034F\\u0350\\u0351\\u0352\\u0353\\u0354\\u0355\\u0356\\u0357\\u0358\\u0359\\u035A\\u035B\\u035C\\u035D\\u035E\\u035F\\u0360\\u0361\\u0362\\u0363\\u0364\\u0365\\u0366\\u0367\\u0368\\u0369\\u036A\\u036B\\u036C\\u036D\\u036E\\u036F\\u0483\\u0484\\u0485\\u0486\\u0487\\u0591\\u0592\\u0593\\u0594\\u0595\\u0596\\u0597\\u0598\\u0599\\u059A\\u059B\\u059C\\u059D\\u059E\\u059F\\u05A0\\u05A1\\u05A2\\u05A3\\u05A4\\u05A5\\u05A6\\u05A7\\u05A8\\u05A9\\u05AA\\u05AB\\u05AC\\u05AD\\u05AE\\u05AF\\u05B0\\u05B1\\u05B2\\u05B3\\u05B4\\u05B5\\u05B6\\u05B7\\u05B8\\u05B9\\u05BA\\u05BB\\u05BC\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610\\u0611\\u0612\\u0613\\u0614\\u0615\\u0616\\u0617\\u0618\\u0619\\u061A\\u064B\\u064C\\u064D\\u064E\\u064F\\u0650\\u0651\\u0652\\u0653\\u0654\\u0655\\u0656\\u0657\\u0658\\u0659\\u065A\\u065B\\u065C\\u065D\\u065E\\u0670\\u06D6\\u06D7\\u06D8\\u06D9\\u06DA\\u06DB\\u06DC\\u06DF\\u06E0\\u06E1\\u06E2\\u06E3\\u06E4\\u06E7\\u06E8\\u06EA\\u06EB\\u06EC\\u06ED\\u0711\\u0730\\u0731\\u0732\\u0733\\u0734\\u0735\\u0736\\u0737\\u0738\\u0739\\u073A\\u073B\\u073C\\u073D\\u073E\\u073F\\u0740\\u0741\\u0742\\u0743\\u0744\\u0745\\u0746\\u0747\\u0748\\u0749\\u074A\\u07A6\\u07A7\\u07A8\\u07A9\\u07AA\\u07AB\\u07AC\\u07AD\\u07AE\\u07AF\\u07B0\\u07EB\\u07EC\\u07ED\\u07EE\\u07EF\\u07F0\\u07F1\\u07F2\\u07F3\\u0901\\u0902\\u093C\\u0941\\u0942\\u0943\\u0944\\u0945\\u0946\\u0947\\u0948\\u094D\\u0951\\u0952\\u0953\\u0954\\u0962\\u0963\\u0981\\u09BC\\u09C1\\u09C2\\u09C3\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1\\u0AC2\\u0AC3\\u0AC4\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41\\u0B42\\u0B43\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E\\u0C3F\\u0C40\\u0C46\\u0C47\\u0C48\\u0C4A\\u0C4B\\u0C4C\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41\\u0D42\\u0D43\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2\\u0DD3\\u0DD4\\u0DD6\\u0E31\\u0E34\\u0E35\\u0E36\\u0E37\\u0E38\\u0E39\\u0E3A\\u0E47\\u0E48\\u0E49\\u0E4A\\u0E4B\\u0E4C\\u0E4D\\u0E4E\\u0EB1\\u0EB4\\u0EB5\\u0EB6\\u0EB7\\u0EB8\\u0EB9\\u0EBB\\u0EBC\\u0EC8\\u0EC9\\u0ECA\\u0ECB\\u0ECC\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71\\u0F72\\u0F73\\u0F74\\u0F75\\u0F76\\u0F77\\u0F78\\u0F79\\u0F7A\\u0F7B\\u0F7C\\u0F7D\\u0F7E\\u0F80\\u0F81\\u0F82\\u0F83\\u0F84\\u0F86\\u0F87\\u0F90\\u0F91\\u0F92\\u0F93\\u0F94\\u0F95\\u0F96\\u0F97\\u0F99\\u0F9A\\u0F9B\\u0F9C\\u0F9D\\u0F9E\\u0F9F\\u0FA0\\u0FA1\\u0FA2\\u0FA3\\u0FA4\\u0FA5\\u0FA6\\u0FA7\\u0FA8\\u0FA9\\u0FAA\\u0FAB\\u0FAC\\u0FAD\\u0FAE\\u0FAF\\u0FB0\\u0FB1\\u0FB2\\u0FB3\\u0FB4\\u0FB5\\u0FB6\\u0FB7\\u0FB8\\u0FB9\\u0FBA\\u0FBB\\u0FBC\\u0FC6\\u102D\\u102E\\u102F\\u1030\\u1032\\u1033\\u1034\\u1035\\u1036\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E\\u105F\\u1060\\u1071\\u1072\\u1073\\u1074\\u1082\\u1085\\u1086\\u108D\\u135F\\u1712\\u1713\\u1714\\u1732\\u1733\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7\\u17B8\\u17B9\\u17BA\\u17BB\\u17BC\\u17BD\\u17C6\\u17C9\\u17CA\\u17CB\\u17CC\\u17CD\\u17CE\\u17CF\\u17D0\\u17D1\\u17D2\\u17D3\\u17DD\\u180B\\u180C\\u180D\\u18A9\\u1920\\u1921\\u1922\\u1927\\u1928\\u1932\\u1939\\u193A\\u193B\\u1A17\\u1A18\\u1B00\\u1B01\\u1B02\\u1B03\\u1B34\\u1B36\\u1B37\\u1B38\\u1B39\\u1B3A\\u1B3C\\u1B42\\u1B6B\\u1B6C\\u1B6D\\u1B6E\\u1B6F\\u1B70\\u1B71\\u1B72\\u1B73\\u1B80\\u1B81\\u1BA2\\u1BA3\\u1BA4\\u1BA5\\u1BA8\\u1BA9\\u1C2C\\u1C2D\\u1C2E\\u1C2F\\u1C30\\u1C31\\u1C32\\u1C33\\u1C36\\u1C37\\u1DC0\\u1DC1\\u1DC2\\u1DC3\\u1DC4\\u1DC5\\u1DC6\\u1DC7\\u1DC8\\u1DC9\\u1DCA\\u1DCB\\u1DCC\\u1DCD\\u1DCE\\u1DCF\\u1DD0\\u1DD1\\u1DD2\\u1DD3\\u1DD4\\u1DD5\\u1DD6\\u1DD7\\u1DD8\\u1DD9\\u1DDA\\u1DDB\\u1DDC\\u1DDD\\u1DDE\\u1DDF\\u1DE0\\u1DE1\\u1DE2\\u1DE3\\u1DE4\\u1DE5\\u1DE6\\u1DFE\\u1DFF\\u20D0\\u20D1\\u20D2\\u20D3\\u20D4\\u20D5\\u20D6\\u20D7\\u20D8\\u20D9\\u20DA\\u20DB\\u20DC\\u20E1\\u20E5\\u20E6\\u20E7\\u20E8\\u20E9\\u20EA\\u20EB\\u20EC\\u20ED\\u20EE\\u20EF\\u20F0\\u2DE0\\u2DE1\\u2DE2\\u2DE3\\u2DE4\\u2DE5\\u2DE6\\u2DE7\\u2DE8\\u2DE9\\u2DEA\\u2DEB\\u2DEC\\u2DED\\u2DEE\\u2DEF\\u2DF0\\u2DF1\\u2DF2\\u2DF3\\u2DF4\\u2DF5\\u2DF6\\u2DF7\\u2DF8\\u2DF9\\u2DFA\\u2DFB\\u2DFC\\u2DFD\\u2DFE\\u2DFF\\u302A\\u302B\\u302C\\u302D\\u302E\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA926\\uA927\\uA928\\uA929\\uA92A\\uA92B\\uA92C\\uA92D\\uA947\\uA948\\uA949\\uA94A\\uA94B\\uA94C\\uA94D\\uA94E\\uA94F\\uA950\\uA951\\uAA29\\uAA2A\\uAA2B\\uAA2C\\uAA2D\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uFB1E\\uFE00\\uFE01\\uFE02\\uFE03\\uFE04\\uFE05\\uFE06\\uFE07\\uFE08\\uFE09\\uFE0A\\uFE0B\\uFE0C\\uFE0D\\uFE0E\\uFE0F\\uFE20\\uFE21\\uFE22\\uFE23\\uFE24\\uFE25\\uFE26]", description: "[\\u0300\\u0301\\u0302\\u0303\\u0304\\u0305\\u0306\\u0307\\u0308\\u0309\\u030A\\u030B\\u030C\\u030D\\u030E\\u030F\\u0310\\u0311\\u0312\\u0313\\u0314\\u0315\\u0316\\u0317\\u0318\\u0319\\u031A\\u031B\\u031C\\u031D\\u031E\\u031F\\u0320\\u0321\\u0322\\u0323\\u0324\\u0325\\u0326\\u0327\\u0328\\u0329\\u032A\\u032B\\u032C\\u032D\\u032E\\u032F\\u0330\\u0331\\u0332\\u0333\\u0334\\u0335\\u0336\\u0337\\u0338\\u0339\\u033A\\u033B\\u033C\\u033D\\u033E\\u033F\\u0340\\u0341\\u0342\\u0343\\u0344\\u0345\\u0346\\u0347\\u0348\\u0349\\u034A\\u034B\\u034C\\u034D\\u034E\\u034F\\u0350\\u0351\\u0352\\u0353\\u0354\\u0355\\u0356\\u0357\\u0358\\u0359\\u035A\\u035B\\u035C\\u035D\\u035E\\u035F\\u0360\\u0361\\u0362\\u0363\\u0364\\u0365\\u0366\\u0367\\u0368\\u0369\\u036A\\u036B\\u036C\\u036D\\u036E\\u036F\\u0483\\u0484\\u0485\\u0486\\u0487\\u0591\\u0592\\u0593\\u0594\\u0595\\u0596\\u0597\\u0598\\u0599\\u059A\\u059B\\u059C\\u059D\\u059E\\u059F\\u05A0\\u05A1\\u05A2\\u05A3\\u05A4\\u05A5\\u05A6\\u05A7\\u05A8\\u05A9\\u05AA\\u05AB\\u05AC\\u05AD\\u05AE\\u05AF\\u05B0\\u05B1\\u05B2\\u05B3\\u05B4\\u05B5\\u05B6\\u05B7\\u05B8\\u05B9\\u05BA\\u05BB\\u05BC\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610\\u0611\\u0612\\u0613\\u0614\\u0615\\u0616\\u0617\\u0618\\u0619\\u061A\\u064B\\u064C\\u064D\\u064E\\u064F\\u0650\\u0651\\u0652\\u0653\\u0654\\u0655\\u0656\\u0657\\u0658\\u0659\\u065A\\u065B\\u065C\\u065D\\u065E\\u0670\\u06D6\\u06D7\\u06D8\\u06D9\\u06DA\\u06DB\\u06DC\\u06DF\\u06E0\\u06E1\\u06E2\\u06E3\\u06E4\\u06E7\\u06E8\\u06EA\\u06EB\\u06EC\\u06ED\\u0711\\u0730\\u0731\\u0732\\u0733\\u0734\\u0735\\u0736\\u0737\\u0738\\u0739\\u073A\\u073B\\u073C\\u073D\\u073E\\u073F\\u0740\\u0741\\u0742\\u0743\\u0744\\u0745\\u0746\\u0747\\u0748\\u0749\\u074A\\u07A6\\u07A7\\u07A8\\u07A9\\u07AA\\u07AB\\u07AC\\u07AD\\u07AE\\u07AF\\u07B0\\u07EB\\u07EC\\u07ED\\u07EE\\u07EF\\u07F0\\u07F1\\u07F2\\u07F3\\u0901\\u0902\\u093C\\u0941\\u0942\\u0943\\u0944\\u0945\\u0946\\u0947\\u0948\\u094D\\u0951\\u0952\\u0953\\u0954\\u0962\\u0963\\u0981\\u09BC\\u09C1\\u09C2\\u09C3\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1\\u0AC2\\u0AC3\\u0AC4\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41\\u0B42\\u0B43\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E\\u0C3F\\u0C40\\u0C46\\u0C47\\u0C48\\u0C4A\\u0C4B\\u0C4C\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41\\u0D42\\u0D43\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2\\u0DD3\\u0DD4\\u0DD6\\u0E31\\u0E34\\u0E35\\u0E36\\u0E37\\u0E38\\u0E39\\u0E3A\\u0E47\\u0E48\\u0E49\\u0E4A\\u0E4B\\u0E4C\\u0E4D\\u0E4E\\u0EB1\\u0EB4\\u0EB5\\u0EB6\\u0EB7\\u0EB8\\u0EB9\\u0EBB\\u0EBC\\u0EC8\\u0EC9\\u0ECA\\u0ECB\\u0ECC\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71\\u0F72\\u0F73\\u0F74\\u0F75\\u0F76\\u0F77\\u0F78\\u0F79\\u0F7A\\u0F7B\\u0F7C\\u0F7D\\u0F7E\\u0F80\\u0F81\\u0F82\\u0F83\\u0F84\\u0F86\\u0F87\\u0F90\\u0F91\\u0F92\\u0F93\\u0F94\\u0F95\\u0F96\\u0F97\\u0F99\\u0F9A\\u0F9B\\u0F9C\\u0F9D\\u0F9E\\u0F9F\\u0FA0\\u0FA1\\u0FA2\\u0FA3\\u0FA4\\u0FA5\\u0FA6\\u0FA7\\u0FA8\\u0FA9\\u0FAA\\u0FAB\\u0FAC\\u0FAD\\u0FAE\\u0FAF\\u0FB0\\u0FB1\\u0FB2\\u0FB3\\u0FB4\\u0FB5\\u0FB6\\u0FB7\\u0FB8\\u0FB9\\u0FBA\\u0FBB\\u0FBC\\u0FC6\\u102D\\u102E\\u102F\\u1030\\u1032\\u1033\\u1034\\u1035\\u1036\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E\\u105F\\u1060\\u1071\\u1072\\u1073\\u1074\\u1082\\u1085\\u1086\\u108D\\u135F\\u1712\\u1713\\u1714\\u1732\\u1733\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7\\u17B8\\u17B9\\u17BA\\u17BB\\u17BC\\u17BD\\u17C6\\u17C9\\u17CA\\u17CB\\u17CC\\u17CD\\u17CE\\u17CF\\u17D0\\u17D1\\u17D2\\u17D3\\u17DD\\u180B\\u180C\\u180D\\u18A9\\u1920\\u1921\\u1922\\u1927\\u1928\\u1932\\u1939\\u193A\\u193B\\u1A17\\u1A18\\u1B00\\u1B01\\u1B02\\u1B03\\u1B34\\u1B36\\u1B37\\u1B38\\u1B39\\u1B3A\\u1B3C\\u1B42\\u1B6B\\u1B6C\\u1B6D\\u1B6E\\u1B6F\\u1B70\\u1B71\\u1B72\\u1B73\\u1B80\\u1B81\\u1BA2\\u1BA3\\u1BA4\\u1BA5\\u1BA8\\u1BA9\\u1C2C\\u1C2D\\u1C2E\\u1C2F\\u1C30\\u1C31\\u1C32\\u1C33\\u1C36\\u1C37\\u1DC0\\u1DC1\\u1DC2\\u1DC3\\u1DC4\\u1DC5\\u1DC6\\u1DC7\\u1DC8\\u1DC9\\u1DCA\\u1DCB\\u1DCC\\u1DCD\\u1DCE\\u1DCF\\u1DD0\\u1DD1\\u1DD2\\u1DD3\\u1DD4\\u1DD5\\u1DD6\\u1DD7\\u1DD8\\u1DD9\\u1DDA\\u1DDB\\u1DDC\\u1DDD\\u1DDE\\u1DDF\\u1DE0\\u1DE1\\u1DE2\\u1DE3\\u1DE4\\u1DE5\\u1DE6\\u1DFE\\u1DFF\\u20D0\\u20D1\\u20D2\\u20D3\\u20D4\\u20D5\\u20D6\\u20D7\\u20D8\\u20D9\\u20DA\\u20DB\\u20DC\\u20E1\\u20E5\\u20E6\\u20E7\\u20E8\\u20E9\\u20EA\\u20EB\\u20EC\\u20ED\\u20EE\\u20EF\\u20F0\\u2DE0\\u2DE1\\u2DE2\\u2DE3\\u2DE4\\u2DE5\\u2DE6\\u2DE7\\u2DE8\\u2DE9\\u2DEA\\u2DEB\\u2DEC\\u2DED\\u2DEE\\u2DEF\\u2DF0\\u2DF1\\u2DF2\\u2DF3\\u2DF4\\u2DF5\\u2DF6\\u2DF7\\u2DF8\\u2DF9\\u2DFA\\u2DFB\\u2DFC\\u2DFD\\u2DFE\\u2DFF\\u302A\\u302B\\u302C\\u302D\\u302E\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA926\\uA927\\uA928\\uA929\\uA92A\\uA92B\\uA92C\\uA92D\\uA947\\uA948\\uA949\\uA94A\\uA94B\\uA94C\\uA94D\\uA94E\\uA94F\\uA950\\uA951\\uAA29\\uAA2A\\uAA2B\\uAA2C\\uAA2D\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uFB1E\\uFE00\\uFE01\\uFE02\\uFE03\\uFE04\\uFE05\\uFE06\\uFE07\\uFE08\\uFE09\\uFE0A\\uFE0B\\uFE0C\\uFE0D\\uFE0E\\uFE0F\\uFE20\\uFE21\\uFE22\\uFE23\\uFE24\\uFE25\\uFE26]" },
peg$c88 = /^[0123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06F0\u06F1\u06F2\u06F3\u06F4\u06F5\u06F6\u06F7\u06F8\u06F9\u07C0\u07C1\u07C2\u07C3\u07C4\u07C5\u07C6\u07C7\u07C8\u07C9\u0966\u0967\u0968\u0969\u096A\u096B\u096C\u096D\u096E\u096F\u09E6\u09E7\u09E8\u09E9\u09EA\u09EB\u09EC\u09ED\u09EE\u09EF\u0A66\u0A67\u0A68\u0A69\u0A6A\u0A6B\u0A6C\u0A6D\u0A6E\u0A6F\u0AE6\u0AE7\u0AE8\u0AE9\u0AEA\u0AEB\u0AEC\u0AED\u0AEE\u0AEF\u0B66\u0B67\u0B68\u0B69\u0B6A\u0B6B\u0B6C\u0B6D\u0B6E\u0B6F\u0BE6\u0BE7\u0BE8\u0BE9\u0BEA\u0BEB\u0BEC\u0BED\u0BEE\u0BEF\u0C66\u0C67\u0C68\u0C69\u0C6A\u0C6B\u0C6C\u0C6D\u0C6E\u0C6F\u0CE6\u0CE7\u0CE8\u0CE9\u0CEA\u0CEB\u0CEC\u0CED\u0CEE\u0CEF\u0D66\u0D67\u0D68\u0D69\u0D6A\u0D6B\u0D6C\u0D6D\u0D6E\u0D6F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0ED0\u0ED1\u0ED2\u0ED3\u0ED4\u0ED5\u0ED6\u0ED7\u0ED8\u0ED9\u0F20\u0F21\u0F22\u0F23\u0F24\u0F25\u0F26\u0F27\u0F28\u0F29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u17E0\u17E1\u17E2\u17E3\u17E4\u17E5\u17E6\u17E7\u17E8\u17E9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1946\u1947\u1948\u1949\u194A\u194B\u194C\u194D\u194E\u194F\u19D0\u19D1\u19D2\u19D3\u19D4\u19D5\u19D6\u19D7\u19D8\u19D9\u1B50\u1B51\u1B52\u1B53\u1B54\u1B55\u1B56\u1B57\u1B58\u1B59\u1BB0\u1BB1\u1BB2\u1BB3\u1BB4\u1BB5\u1BB6\u1BB7\u1BB8\u1BB9\u1C40\u1C41\u1C42\u1C43\u1C44\u1C45\u1C46\u1C47\u1C48\u1C49\u1C50\u1C51\u1C52\u1C53\u1C54\u1C55\u1C56\u1C57\u1C58\u1C59\uA620\uA621\uA622\uA623\uA624\uA625\uA626\uA627\uA628\uA629\uA8D0\uA8D1\uA8D2\uA8D3\uA8D4\uA8D5\uA8D6\uA8D7\uA8D8\uA8D9\uA900\uA901\uA902\uA903\uA904\uA905\uA906\uA907\uA908\uA909\uAA50\uAA51\uAA52\uAA53\uAA54\uAA55\uAA56\uAA57\uAA58\uAA59\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19]/,
peg$c89 = { type: "class", value: "[0123456789\\u0660\\u0661\\u0662\\u0663\\u0664\\u0665\\u0666\\u0667\\u0668\\u0669\\u06F0\\u06F1\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u06F7\\u06F8\\u06F9\\u07C0\\u07C1\\u07C2\\u07C3\\u07C4\\u07C5\\u07C6\\u07C7\\u07C8\\u07C9\\u0966\\u0967\\u0968\\u0969\\u096A\\u096B\\u096C\\u096D\\u096E\\u096F\\u09E6\\u09E7\\u09E8\\u09E9\\u09EA\\u09EB\\u09EC\\u09ED\\u09EE\\u09EF\\u0A66\\u0A67\\u0A68\\u0A69\\u0A6A\\u0A6B\\u0A6C\\u0A6D\\u0A6E\\u0A6F\\u0AE6\\u0AE7\\u0AE8\\u0AE9\\u0AEA\\u0AEB\\u0AEC\\u0AED\\u0AEE\\u0AEF\\u0B66\\u0B67\\u0B68\\u0B69\\u0B6A\\u0B6B\\u0B6C\\u0B6D\\u0B6E\\u0B6F\\u0BE6\\u0BE7\\u0BE8\\u0BE9\\u0BEA\\u0BEB\\u0BEC\\u0BED\\u0BEE\\u0BEF\\u0C66\\u0C67\\u0C68\\u0C69\\u0C6A\\u0C6B\\u0C6C\\u0C6D\\u0C6E\\u0C6F\\u0CE6\\u0CE7\\u0CE8\\u0CE9\\u0CEA\\u0CEB\\u0CEC\\u0CED\\u0CEE\\u0CEF\\u0D66\\u0D67\\u0D68\\u0D69\\u0D6A\\u0D6B\\u0D6C\\u0D6D\\u0D6E\\u0D6F\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\\u0ED0\\u0ED1\\u0ED2\\u0ED3\\u0ED4\\u0ED5\\u0ED6\\u0ED7\\u0ED8\\u0ED9\\u0F20\\u0F21\\u0F22\\u0F23\\u0F24\\u0F25\\u0F26\\u0F27\\u0F28\\u0F29\\u1040\\u1041\\u1042\\u1043\\u1044\\u1045\\u1046\\u1047\\u1048\\u1049\\u1090\\u1091\\u1092\\u1093\\u1094\\u1095\\u1096\\u1097\\u1098\\u1099\\u17E0\\u17E1\\u17E2\\u17E3\\u17E4\\u17E5\\u17E6\\u17E7\\u17E8\\u17E9\\u1810\\u1811\\u1812\\u1813\\u1814\\u1815\\u1816\\u1817\\u1818\\u1819\\u1946\\u1947\\u1948\\u1949\\u194A\\u194B\\u194C\\u194D\\u194E\\u194F\\u19D0\\u19D1\\u19D2\\u19D3\\u19D4\\u19D5\\u19D6\\u19D7\\u19D8\\u19D9\\u1B50\\u1B51\\u1B52\\u1B53\\u1B54\\u1B55\\u1B56\\u1B57\\u1B58\\u1B59\\u1BB0\\u1BB1\\u1BB2\\u1BB3\\u1BB4\\u1BB5\\u1BB6\\u1BB7\\u1BB8\\u1BB9\\u1C40\\u1C41\\u1C42\\u1C43\\u1C44\\u1C45\\u1C46\\u1C47\\u1C48\\u1C49\\u1C50\\u1C51\\u1C52\\u1C53\\u1C54\\u1C55\\u1C56\\u1C57\\u1C58\\u1C59\\uA620\\uA621\\uA622\\uA623\\uA624\\uA625\\uA626\\uA627\\uA628\\uA629\\uA8D0\\uA8D1\\uA8D2\\uA8D3\\uA8D4\\uA8D5\\uA8D6\\uA8D7\\uA8D8\\uA8D9\\uA900\\uA901\\uA902\\uA903\\uA904\\uA905\\uA906\\uA907\\uA908\\uA909\\uAA50\\uAA51\\uAA52\\uAA53\\uAA54\\uAA55\\uAA56\\uAA57\\uAA58\\uAA59\\uFF10\\uFF11\\uFF12\\uFF13\\uFF14\\uFF15\\uFF16\\uFF17\\uFF18\\uFF19]", description: "[0123456789\\u0660\\u0661\\u0662\\u0663\\u0664\\u0665\\u0666\\u0667\\u0668\\u0669\\u06F0\\u06F1\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u06F7\\u06F8\\u06F9\\u07C0\\u07C1\\u07C2\\u07C3\\u07C4\\u07C5\\u07C6\\u07C7\\u07C8\\u07C9\\u0966\\u0967\\u0968\\u0969\\u096A\\u096B\\u096C\\u096D\\u096E\\u096F\\u09E6\\u09E7\\u09E8\\u09E9\\u09EA\\u09EB\\u09EC\\u09ED\\u09EE\\u09EF\\u0A66\\u0A67\\u0A68\\u0A69\\u0A6A\\u0A6B\\u0A6C\\u0A6D\\u0A6E\\u0A6F\\u0AE6\\u0AE7\\u0AE8\\u0AE9\\u0AEA\\u0AEB\\u0AEC\\u0AED\\u0AEE\\u0AEF\\u0B66\\u0B67\\u0B68\\u0B69\\u0B6A\\u0B6B\\u0B6C\\u0B6D\\u0B6E\\u0B6F\\u0BE6\\u0BE7\\u0BE8\\u0BE9\\u0BEA\\u0BEB\\u0BEC\\u0BED\\u0BEE\\u0BEF\\u0C66\\u0C67\\u0C68\\u0C69\\u0C6A\\u0C6B\\u0C6C\\u0C6D\\u0C6E\\u0C6F\\u0CE6\\u0CE7\\u0CE8\\u0CE9\\u0CEA\\u0CEB\\u0CEC\\u0CED\\u0CEE\\u0CEF\\u0D66\\u0D67\\u0D68\\u0D69\\u0D6A\\u0D6B\\u0D6C\\u0D6D\\u0D6E\\u0D6F\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\\u0ED0\\u0ED1\\u0ED2\\u0ED3\\u0ED4\\u0ED5\\u0ED6\\u0ED7\\u0ED8\\u0ED9\\u0F20\\u0F21\\u0F22\\u0F23\\u0F24\\u0F25\\u0F26\\u0F27\\u0F28\\u0F29\\u1040\\u1041\\u1042\\u1043\\u1044\\u1045\\u1046\\u1047\\u1048\\u1049\\u1090\\u1091\\u1092\\u1093\\u1094\\u1095\\u1096\\u1097\\u1098\\u1099\\u17E0\\u17E1\\u17E2\\u17E3\\u17E4\\u17E5\\u17E6\\u17E7\\u17E8\\u17E9\\u1810\\u1811\\u1812\\u1813\\u1814\\u1815\\u1816\\u1817\\u1818\\u1819\\u1946\\u1947\\u1948\\u1949\\u194A\\u194B\\u194C\\u194D\\u194E\\u194F\\u19D0\\u19D1\\u19D2\\u19D3\\u19D4\\u19D5\\u19D6\\u19D7\\u19D8\\u19D9\\u1B50\\u1B51\\u1B52\\u1B53\\u1B54\\u1B55\\u1B56\\u1B57\\u1B58\\u1B59\\u1BB0\\u1BB1\\u1BB2\\u1BB3\\u1BB4\\u1BB5\\u1BB6\\u1BB7\\u1BB8\\u1BB9\\u1C40\\u1C41\\u1C42\\u1C43\\u1C44\\u1C45\\u1C46\\u1C47\\u1C48\\u1C49\\u1C50\\u1C51\\u1C52\\u1C53\\u1C54\\u1C55\\u1C56\\u1C57\\u1C58\\u1C59\\uA620\\uA621\\uA622\\uA623\\uA624\\uA625\\uA626\\uA627\\uA628\\uA629\\uA8D0\\uA8D1\\uA8D2\\uA8D3\\uA8D4\\uA8D5\\uA8D6\\uA8D7\\uA8D8\\uA8D9\\uA900\\uA901\\uA902\\uA903\\uA904\\uA905\\uA906\\uA907\\uA908\\uA909\\uAA50\\uAA51\\uAA52\\uAA53\\uAA54\\uAA55\\uAA56\\uAA57\\uAA58\\uAA59\\uFF10\\uFF11\\uFF12\\uFF13\\uFF14\\uFF15\\uFF16\\uFF17\\uFF18\\uFF19]" },
peg$c90 = /^[\u16EE\u16EF\u16F0\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216A\u216B\u216C\u216D\u216E\u216F\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217A\u217B\u217C\u217D\u217E\u217F\u2180\u2181\u2182\u2185\u2186\u2187\u2188\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3038\u3039\u303A]/,
peg$c91 = { type: "class", value: "[\\u16EE\\u16EF\\u16F0\\u2160\\u2161\\u2162\\u2163\\u2164\\u2165\\u2166\\u2167\\u2168\\u2169\\u216A\\u216B\\u216C\\u216D\\u216E\\u216F\\u2170\\u2171\\u2172\\u2173\\u2174\\u2175\\u2176\\u2177\\u2178\\u2179\\u217A\\u217B\\u217C\\u217D\\u217E\\u217F\\u2180\\u2181\\u2182\\u2185\\u2186\\u2187\\u2188\\u3007\\u3021\\u3022\\u3023\\u3024\\u3025\\u3026\\u3027\\u3028\\u3029\\u3038\\u3039\\u303A]", description: "[\\u16EE\\u16EF\\u16F0\\u2160\\u2161\\u2162\\u2163\\u2164\\u2165\\u2166\\u2167\\u2168\\u2169\\u216A\\u216B\\u216C\\u216D\\u216E\\u216F\\u2170\\u2171\\u2172\\u2173\\u2174\\u2175\\u2176\\u2177\\u2178\\u2179\\u217A\\u217B\\u217C\\u217D\\u217E\\u217F\\u2180\\u2181\\u2182\\u2185\\u2186\\u2187\\u2188\\u3007\\u3021\\u3022\\u3023\\u3024\\u3025\\u3026\\u3027\\u3028\\u3029\\u3038\\u3039\\u303A]" },
peg$c92 = /^[_\u203F\u2040\u2054\uFE33\uFE34\uFE4D\uFE4E\uFE4F\uFF3F]/,
peg$c93 = { type: "class", value: "[_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D\\uFE4E\\uFE4F\\uFF3F]", description: "[_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D\\uFE4E\\uFE4F\\uFF3F]" },
peg$c94 = /^[ \xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000]/,
peg$c95 = { type: "class", value: "[ \\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000]", description: "[ \\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000]" },
peg$c96 = function(name) { return ['#', name]; },
peg$c97 = "(",
peg$c98 = { type: "literal", value: "(", description: "\"(\"" },
peg$c99 = ")",
peg$c100 = { type: "literal", value: ")", description: "\")\"" },
peg$c101 = function(name, args) {
var result = [name].concat(args.shift());
while (args.length > 0) {
result = [result].concat(args.shift());
}
return result;
},
peg$c102 = function(args) {
return args !== null ? args : [];
},
peg$c103 = ",",
peg$c104 = { type: "literal", value: ",", description: "\",\"" },
peg$c105 = function(head, tail) {
var result = [head];
for (var i = 0; i < tail.length; i++) {
result.push(tail[i][3]);
}
return result;
},
peg$c106 = function(operator, expression) {
return [operator, expression];
},
peg$c107 = "+",
peg$c108 = { type: "literal", value: "+", description: "\"+\"" },
peg$c109 = "-",
peg$c110 = { type: "literal", value: "-", description: "\"-\"" },
peg$c111 = "!",
peg$c112 = { type: "literal", value: "!", description: "\"!\"" },
peg$c113 = function(head, tail) {
var result = head;
for (var i = 0; i < tail.length; i++) {
result = [tail[i][1], result, tail[i][3]];
}
return result;
},
peg$c114 = "*",
peg$c115 = { type: "literal", value: "*", description: "\"*\"" },
peg$c116 = "/",
peg$c117 = { type: "literal", value: "/", description: "\"/\"" },
peg$c118 = "%",
peg$c119 = { type: "literal", value: "%", description: "\"%\"" },
peg$c120 = "=",
peg$c121 = { type: "literal", value: "=", description: "\"=\"" },
peg$c122 = function(operator) { return operator; },
peg$c123 = function() { return "+"; },
peg$c124 = function() { return "-"; },
peg$c125 = "<=",
peg$c126 = { type: "literal", value: "<=", description: "\"<=\"" },
peg$c127 = ">=",
peg$c128 = { type: "literal", value: ">=", description: "\">=\"" },
peg$c129 = "<",
peg$c130 = { type: "literal", value: "<", description: "\"<\"" },
peg$c131 = ">",
peg$c132 = { type: "literal", value: ">", description: "\">\"" },
peg$c133 = "==",
peg$c134 = { type: "literal", value: "==", description: "\"==\"" },
peg$c135 = "!=",
peg$c136 = { type: "literal", value: "!=", description: "\"!=\"" },
peg$c137 = "&&",
peg$c138 = { type: "literal", value: "&&", description: "\"&&\"" },
peg$c139 = function() { return "&&"; },
peg$c140 = "||",
peg$c141 = { type: "literal", value: "||", description: "\"||\"" },
peg$c142 = function() { return "||"; },
peg$c143 = "if",
peg$c144 = { type: "literal", value: "if", description: "\"if\"" },
peg$c145 = "then",
peg$c146 = { type: "literal", value: "then", description: "\"then\"" },
peg$c147 = "else",
peg$c148 = { type: "literal", value: "else", description: "\"else\"" },
peg$c149 = function(condition, trueExpression, falseExpression) {
return ['if', condition, trueExpression, falseExpression];
},
peg$currPos = 0,
peg$reportedPos = 0,
peg$cachedPos = 0,
peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },
peg$maxFailPos = 0,
peg$maxFailExpected = [],
peg$silentFails = 0,
peg$result;
if ("startRule" in options) {
if (!(options.startRule in peg$startRuleFunctions)) {
throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
}
peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
}
function text() {
return input.substring(peg$reportedPos, peg$currPos);
}
function offset() {
return peg$reportedPos;
}
function line() {
return peg$computePosDetails(peg$reportedPos).line;
}
function column() {
return peg$computePosDetails(peg$reportedPos).column;
}
function expected(description) {
throw peg$buildException(
null,
[{ type: "other", description: description }],
peg$reportedPos
);
}
function error(message) {
throw peg$buildException(message, null, peg$reportedPos);
}
function peg$computePosDetails(pos) {
function advance(details, startPos, endPos) {
var p, ch;
for (p = startPos; p < endPos; p++) {
ch = input.charAt(p);
if (ch === "\n") {
if (!details.seenCR) { details.line++; }
details.column = 1;
details.seenCR = false;
} else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
details.line++;
details.column = 1;
details.seenCR = true;
} else {
details.column++;
details.seenCR = false;
}
}
}
if (peg$cachedPos !== pos) {
if (peg$cachedPos > pos) {
peg$cachedPos = 0;
peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };
}
advance(peg$cachedPosDetails, peg$cachedPos, pos);
peg$cachedPos = pos;
}
return peg$cachedPosDetails;
}
function peg$fail(expected) {
if (peg$currPos < peg$maxFailPos) { return; }
if (peg$currPos > peg$maxFailPos) {
peg$maxFailPos = peg$currPos;
peg$maxFailExpected = [];
}
peg$maxFailExpected.push(expected);
}
function peg$buildException(message, expected, pos) {
function cleanupExpected(expected) {
var i = 1;
expected.sort(function(a, b) {
if (a.description < b.description) {
return -1;
} else if (a.description > b.description) {
return 1;
} else {
return 0;
}
});
while (i < expected.length) {
if (expected[i - 1] === expected[i]) {
expected.splice(i, 1);
} else {
i++;
}
}
}
function buildMessage(expected, found) {
function stringEscape(s) {
function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }
return s
.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"')
.replace(/\x08/g, '\\b')
.replace(/\t/g, '\\t')
.replace(/\n/g, '\\n')
.replace(/\f/g, '\\f')
.replace(/\r/g, '\\r')
.replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
.replace(/[\x10-\x1F\x80-\xFF]/g, function(ch) { return '\\x' + hex(ch); })
.replace(/[\u0180-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); })
.replace(/[\u1080-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); });
}
var expectedDescs = new Array(expected.length),
expectedDesc, foundDesc, i;
for (i = 0; i < expected.length; i++) {
expectedDescs[i] = expected[i].description;
}
expectedDesc = expected.length > 1
? expectedDescs.slice(0, -1).join(", ")
+ " or "
+ expectedDescs[expected.length - 1]
: expectedDescs[0];
foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";
return "Expected " + expectedDesc + " but " + foundDesc + " found.";
}
var posDetails = peg$computePosDetails(pos),
found = pos < input.length ? input.charAt(pos) : null;
if (expected !== null) {
cleanupExpected(expected);
}
return new SyntaxError(
message !== null ? message : buildMessage(expected, found),
expected,
found,
pos,
posDetails.line,
posDetails.column
);
}
function peg$parsestart() {
var s0, s1, s2, s3;
s0 = peg$currPos;
s1 = peg$parse__();
if (s1 !== peg$FAILED) {
s2 = peg$parseExpression();
if (s2 !== peg$FAILED) {
s3 = peg$parse__();
if (s3 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c1(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseSourceCharacter() {
var s0;
if (input.length > peg$currPos) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c2); }
}
return s0;
}
function peg$parseWhiteSpace() {
var s0, s1;
peg$silentFails++;
if (peg$c4.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c5); }
}
if (s0 === peg$FAILED) {
s0 = peg$parseZs();
}
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c3); }
}
return s0;
}
function peg$parseIdentifier() {
var s0, s1, s2;
peg$silentFails++;
s0 = peg$currPos;
s1 = peg$currPos;
peg$silentFails++;
s2 = peg$parseReservedWord();
peg$silentFails--;
if (s2 === peg$FAILED) {
s1 = peg$c7;
} else {
peg$currPos = s1;
s1 = peg$c0;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseIdentifierName();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c8(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c6); }
}
return s0;
}
function peg$parseIdentifierName() {
var s0, s1, s2, s3;
peg$silentFails++;
s0 = peg$currPos;
s1 = peg$parseIdentifierStart();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$parseIdentifierPart();
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$parseIdentifierPart();
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c10(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c6); }
}
return s0;
}
function peg$parseIdentifierStart() {
var s0, s1, s2;
s0 = peg$parseUnicodeLetter();
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 36) {
s0 = peg$c11;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c12); }
}
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 95) {
s0 = peg$c13;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c14); }
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 92) {
s1 = peg$c15;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c16); }
}
if (s1 !== peg$FAILED) {
s2 = peg$parseUnicodeEscapeSequence();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c17(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
}
}
return s0;
}
function peg$parseIdentifierPart() {
var s0, s1;
s0 = peg$parseIdentifierStart();
if (s0 === peg$FAILED) {
s0 = peg$parseUnicodeCombiningMark();
if (s0 === peg$FAILED) {
s0 = peg$parseNd();
if (s0 === peg$FAILED) {
s0 = peg$parsePc();
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 8204) {
s1 = peg$c18;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c19); }
}
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c20();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 8205) {
s1 = peg$c21;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c22); }
}
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c23();
}
s0 = s1;
}
}
}
}
}
return s0;
}
function peg$parseUnicodeLetter() {
var s0;
s0 = peg$parseLu();
if (s0 === peg$FAILED) {
s0 = peg$parseLl();
if (s0 === peg$FAILED) {
s0 = peg$parseLt();
if (s0 === peg$FAILED) {
s0 = peg$parseLm();
if (s0 === peg$FAILED) {
s0 = peg$parseLo();
if (s0 === peg$FAILED) {
s0 = peg$parseNl();
}
}
}
}
}
return s0;
}
function peg$parseUnicodeCombiningMark() {
var s0;
s0 = peg$parseMn();
if (s0 === peg$FAILED) {
s0 = peg$parseMc();
}
return s0;
}
function peg$parseReservedWord() {
var s0;
s0 = peg$parseNullLiteral();
if (s0 === peg$FAILED) {
s0 = peg$parseBooleanLiteral();
}
return s0;
}
function peg$parseLiteral() {
var s0;
s0 = peg$parseNullLiteral();
if (s0 === peg$FAILED) {
s0 = peg$parseBooleanLiteral();
if (s0 === peg$FAILED) {
s0 = peg$parseNumericLiteral();
if (s0 === peg$FAILED) {
s0 = peg$parseStringLiteral();
}
}
}
return s0;
}
function peg$parseNullLiteral() {
var s0, s1, s2, s3;
s0 = peg$currPos;
if (input.substr(peg$currPos, 4) === peg$c24) {
s1 = peg$c24;
peg$currPos += 4;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c25); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
s3 = peg$parseIdentifierPart();
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c26();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseBooleanLiteral() {
var s0, s1, s2, s3;
s0 = peg$currPos;
if (input.substr(peg$currPos, 5) === peg$c27) {
s1 = peg$c27;
peg$currPos += 5;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c28); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
s3 = peg$parseIdentifierPart();
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c29();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 4) === peg$c30) {
s1 = peg$c30;
peg$currPos += 4;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c31); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
s3 = peg$parseIdentifierPart();
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c32();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
return s0;
}
function peg$parseNumericLiteral() {
var s0, s1, s2, s3;
peg$silentFails++;
s0 = peg$currPos;
s1 = peg$parseHexIntegerLiteral();
if (s1 === peg$FAILED) {
s1 = peg$parseDecimalLiteral();
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
s3 = peg$parseIdentifierStart();
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c34(s1);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c33); }
}
return s0;
}
function peg$parseDecimalLiteral() {
var s0, s1, s2, s3, s4, s5, s6;
s0 = peg$currPos;
s1 = peg$currPos;
s2 = peg$currPos;
s3 = peg$parseDecimalIntegerLiteral();
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 46) {
s4 = peg$c35;
peg$currPos++;
} else {
s4 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c36); }
}
if (s4 !== peg$FAILED) {
s5 = peg$parseDecimalDigits();
if (s5 === peg$FAILED) {
s5 = peg$c37;
}
if (s5 !== peg$FAILED) {
s6 = peg$parseExponentPart();
if (s6 === peg$FAILED) {
s6 = peg$c37;
}
if (s6 !== peg$FAILED) {
s3 = [s3, s4, s5, s6];
s2 = s3;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
} else {
peg$currPos = s2;
s2 = peg$c0;
}
} else {
peg$currPos = s2;
s2 = peg$c0;
}
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
s2 = input.substring(s1, peg$currPos);
}
s1 = s2;
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c38(s1);
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$currPos;
s2 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 46) {
s3 = peg$c35;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c36); }
}
if (s3 !== peg$FAILED) {
s4 = peg$parseDecimalDigits();
if (s4 !== peg$FAILED) {
s5 = peg$parseExponentPart();
if (s5 === peg$FAILED) {
s5 = peg$c37;
}
if (s5 !== peg$FAILED) {
s3 = [s3, s4, s5];
s2 = s3;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
} else {
peg$currPos = s2;
s2 = peg$c0;
}
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
s2 = input.substring(s1, peg$currPos);
}
s1 = s2;
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c39(s1);
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$currPos;
s2 = peg$currPos;
s3 = peg$parseDecimalIntegerLiteral();
if (s3 !== peg$FAILED) {
s4 = peg$parseExponentPart();
if (s4 === peg$FAILED) {
s4 = peg$c37;
}
if (s4 !== peg$FAILED) {
s3 = [s3, s4];
s2 = s3;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
s2 = input.substring(s1, peg$currPos);
}
s1 = s2;
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c39(s1);
}
s0 = s1;
}
}
return s0;
}
function peg$parseDecimalIntegerLiteral() {
var s0, s1, s2;
if (input.charCodeAt(peg$currPos) === 48) {
s0 = peg$c40;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c41); }
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseNonZeroDigit();
if (s1 !== peg$FAILED) {
s2 = peg$parseDecimalDigits();
if (s2 === peg$FAILED) {
s2 = peg$c37;
}
if (s2 !== peg$FAILED) {
s1 = [s1, s2];
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
return s0;
}
function peg$parseDecimalDigits() {
var s0, s1;
s0 = [];
s1 = peg$parseDecimalDigit();
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
s1 = peg$parseDecimalDigit();
}
} else {
s0 = peg$c0;
}
return s0;
}
function peg$parseDecimalDigit() {
var s0;
if (peg$c42.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c43); }
}
return s0;
}
function peg$parseNonZeroDigit() {
var s0;
if (peg$c44.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c45); }
}
return s0;
}
function peg$parseExponentPart() {
var s0, s1, s2;
s0 = peg$currPos;
s1 = peg$parseExponentIndicator();
if (s1 !== peg$FAILED) {
s2 = peg$parseSignedInteger();
if (s2 !== peg$FAILED) {
s1 = [s1, s2];
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseExponentIndicator() {
var s0;
if (peg$c46.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c47); }
}
return s0;
}
function peg$parseSignedInteger() {
var s0, s1, s2;
s0 = peg$currPos;
if (peg$c48.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c49); }
}
if (s1 === peg$FAILED) {
s1 = peg$c37;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseDecimalDigits();
if (s2 !== peg$FAILED) {
s1 = [s1, s2];
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseHexIntegerLiteral() {
var s0, s1, s2, s3, s4, s5;
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 48) {
s1 = peg$c40;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c41); }
}
if (s1 !== peg$FAILED) {
if (peg$c50.test(input.charAt(peg$currPos))) {
s2 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c51); }
}
if (s2 !== peg$FAILED) {
s3 = peg$currPos;
s4 = [];
s5 = peg$parseHexDigit();
if (s5 !== peg$FAILED) {
while (s5 !== peg$FAILED) {
s4.push(s5);
s5 = peg$parseHexDigit();
}
} else {
s4 = peg$c0;
}
if (s4 !== peg$FAILED) {
s4 = input.substring(s3, peg$currPos);
}
s3 = s4;
if (s3 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c52(s3);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseHexDigit() {
var s0;
if (peg$c53.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c54); }
}
return s0;
}
function peg$parseStringLiteral() {
var s0, s1, s2, s3, s4;
peg$silentFails++;
s0 = peg$currPos;
s1 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 34) {
s2 = peg$c56;
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c57); }
}
if (s2 !== peg$FAILED) {
s3 = peg$parseDoubleStringCharacters();
if (s3 === peg$FAILED) {
s3 = peg$c37;
}
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 34) {
s4 = peg$c56;
peg$currPos++;
} else {
s4 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c57); }
}
if (s4 !== peg$FAILED) {
s2 = [s2, s3, s4];
s1 = s2;
} else {
peg$currPos = s1;
s1 = peg$c0;
}
} else {
peg$currPos = s1;
s1 = peg$c0;
}
} else {
peg$currPos = s1;
s1 = peg$c0;
}
if (s1 === peg$FAILED) {
s1 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 39) {
s2 = peg$c58;
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c59); }
}
if (s2 !== peg$FAILED) {
s3 = peg$parseSingleStringCharacters();
if (s3 === peg$FAILED) {
s3 = peg$c37;
}
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 39) {
s4 = peg$c58;
peg$currPos++;
} else {
s4 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c59); }
}
if (s4 !== peg$FAILED) {
s2 = [s2, s3, s4];
s1 = s2;
} else {
peg$currPos = s1;
s1 = peg$c0;
}
} else {
peg$currPos = s1;
s1 = peg$c0;
}
} else {
peg$currPos = s1;
s1 = peg$c0;
}
}
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c60(s1);
}
s0 = s1;
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c55); }
}
return s0;
}
function peg$parseDoubleStringCharacters() {
var s0, s1, s2;
s0 = peg$currPos;
s1 = [];
s2 = peg$parseDoubleStringCharacter();
if (s2 !== peg$FAILED) {
while (s2 !== peg$FAILED) {
s1.push(s2);
s2 = peg$parseDoubleStringCharacter();
}
} else {
s1 = peg$c0;
}
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c61(s1);
}
s0 = s1;
return s0;
}
function peg$parseSingleStringCharacters() {
var s0, s1, s2;
s0 = peg$currPos;
s1 = [];
s2 = peg$parseSingleStringCharacter();
if (s2 !== peg$FAILED) {
while (s2 !== peg$FAILED) {
s1.push(s2);
s2 = peg$parseSingleStringCharacter();
}
} else {
s1 = peg$c0;
}
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c61(s1);
}
s0 = s1;
return s0;
}
function peg$parseDoubleStringCharacter() {
var s0, s1, s2;
s0 = peg$currPos;
s1 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 34) {
s2 = peg$c56;
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c57); }
}
if (s2 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 92) {
s2 = peg$c15;
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c16); }
}
}
peg$silentFails--;
if (s2 === peg$FAILED) {
s1 = peg$c7;
} else {
peg$currPos = s1;
s1 = peg$c0;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseSourceCharacter();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c62(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 92) {
s1 = peg$c15;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c16); }
}
if (s1 !== peg$FAILED) {
s2 = peg$parseEscapeSequence();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c63(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
return s0;
}
function peg$parseSingleStringCharacter() {
var s0, s1, s2;
s0 = peg$currPos;
s1 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 39) {
s2 = peg$c58;
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c59); }
}
if (s2 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 92) {
s2 = peg$c15;
peg$currPos++;
} else {
s2 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c16); }
}
}
peg$silentFails--;
if (s2 === peg$FAILED) {
s1 = peg$c7;
} else {
peg$currPos = s1;
s1 = peg$c0;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseSourceCharacter();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c62(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 92) {
s1 = peg$c15;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c16); }
}
if (s1 !== peg$FAILED) {
s2 = peg$parseEscapeSequence();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c63(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
return s0;
}
function peg$parseEscapeSequence() {
var s0, s1, s2, s3;
s0 = peg$parseCharacterEscapeSequence();
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 48) {
s1 = peg$c40;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c41); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
s3 = peg$parseDecimalDigit();
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c64();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
if (s0 === peg$FAILED) {
s0 = peg$parseHexEscapeSequence();
if (s0 === peg$FAILED) {
s0 = peg$parseUnicodeEscapeSequence();
}
}
}
return s0;
}
function peg$parseCharacterEscapeSequence() {
var s0;
s0 = peg$parseSingleEscapeCharacter();
if (s0 === peg$FAILED) {
s0 = peg$parseNonEscapeCharacter();
}
return s0;
}
function peg$parseSingleEscapeCharacter() {
var s0, s1;
s0 = peg$currPos;
if (peg$c65.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c66); }
}
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c67(s1);
}
s0 = s1;
return s0;
}
function peg$parseNonEscapeCharacter() {
var s0, s1, s2;
s0 = peg$currPos;
s1 = peg$currPos;
peg$silentFails++;
s2 = peg$parseEscapeCharacter();
peg$silentFails--;
if (s2 === peg$FAILED) {
s1 = peg$c7;
} else {
peg$currPos = s1;
s1 = peg$c0;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseSourceCharacter();
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c68(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseEscapeCharacter() {
var s0;
s0 = peg$parseSingleEscapeCharacter();
if (s0 === peg$FAILED) {
s0 = peg$parseDecimalDigit();
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 120) {
s0 = peg$c69;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c70); }
}
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 117) {
s0 = peg$c71;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c72); }
}
}
}
}
return s0;
}
function peg$parseHexEscapeSequence() {
var s0, s1, s2, s3, s4, s5;
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 120) {
s1 = peg$c69;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c70); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
s3 = peg$currPos;
s4 = peg$parseHexDigit();
if (s4 !== peg$FAILED) {
s5 = peg$parseHexDigit();
if (s5 !== peg$FAILED) {
s4 = [s4, s5];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
if (s3 !== peg$FAILED) {
s3 = input.substring(s2, peg$currPos);
}
s2 = s3;
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c73(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseUnicodeEscapeSequence() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 117) {
s1 = peg$c71;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c72); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
s3 = peg$currPos;
s4 = peg$parseHexDigit();
if (s4 !== peg$FAILED) {
s5 = peg$parseHexDigit();
if (s5 !== peg$FAILED) {
s6 = peg$parseHexDigit();
if (s6 !== peg$FAILED) {
s7 = peg$parseHexDigit();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
if (s3 !== peg$FAILED) {
s3 = input.substring(s2, peg$currPos);
}
s2 = s3;
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c73(s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseLl() {
var s0;
if (peg$c74.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c75); }
}
return s0;
}
function peg$parseLm() {
var s0;
if (peg$c76.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c77); }
}
return s0;
}
function peg$parseLo() {
var s0;
if (peg$c78.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c79); }
}
return s0;
}
function peg$parseLt() {
var s0;
if (peg$c80.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c81); }
}
return s0;
}
function peg$parseLu() {
var s0;
if (peg$c82.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c83); }
}
return s0;
}
function peg$parseMc() {
var s0;
if (peg$c84.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c85); }
}
return s0;
}
function peg$parseMn() {
var s0;
if (peg$c86.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c87); }
}
return s0;
}
function peg$parseNd() {
var s0;
if (peg$c88.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c89); }
}
return s0;
}
function peg$parseNl() {
var s0;
if (peg$c90.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c91); }
}
return s0;
}
function peg$parsePc() {
var s0;
if (peg$c92.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c93); }
}
return s0;
}
function peg$parseZs() {
var s0;
if (peg$c94.test(input.charAt(peg$currPos))) {
s0 = input.charAt(peg$currPos);
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c95); }
}
return s0;
}
function peg$parse__() {
var s0, s1;
s0 = [];
s1 = peg$parseWhiteSpace();
while (s1 !== peg$FAILED) {
s0.push(s1);
s1 = peg$parseWhiteSpace();
}
return s0;
}
function peg$parsePrimaryExpression() {
var s0, s1, s2, s3, s4, s5;
s0 = peg$currPos;
s1 = peg$parseIdentifier();
if (s1 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c96(s1);
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$parseLiteral();
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 40) {
s1 = peg$c97;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c98); }
}
if (s1 !== peg$FAILED) {
s2 = peg$parse__();
if (s2 !== peg$FAILED) {
s3 = peg$parseExpression();
if (s3 !== peg$FAILED) {
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 41) {
s5 = peg$c99;
peg$currPos++;
} else {
s5 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c100); }
}
if (s5 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c1(s3);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
}
return s0;
}
function peg$parseCallExpression() {
var s0, s1, s2, s3, s4;
s0 = peg$currPos;
s1 = peg$parseIdentifier();
if (s1 !== peg$FAILED) {
s2 = peg$parse__();
if (s2 !== peg$FAILED) {
s3 = [];
s4 = peg$parseArguments();
if (s4 !== peg$FAILED) {
while (s4 !== peg$FAILED) {
s3.push(s4);
s4 = peg$parseArguments();
}
} else {
s3 = peg$c0;
}
if (s3 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c101(s1, s3);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseArguments() {
var s0, s1, s2, s3, s4, s5;
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 40) {
s1 = peg$c97;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c98); }
}
if (s1 !== peg$FAILED) {
s2 = peg$parse__();
if (s2 !== peg$FAILED) {
s3 = peg$parseArgumentList();
if (s3 === peg$FAILED) {
s3 = peg$c37;
}
if (s3 !== peg$FAILED) {
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 41) {
s5 = peg$c99;
peg$currPos++;
} else {
s5 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c100); }
}
if (s5 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c102(s3);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseArgumentList() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 44) {
s5 = peg$c103;
peg$currPos++;
} else {
s5 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c104); }
}
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 44) {
s5 = peg$c103;
peg$currPos++;
} else {
s5 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c104); }
}
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c105(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseUnaryExpression() {
var s0, s1, s2, s3;
s0 = peg$parseCallExpression();
if (s0 === peg$FAILED) {
s0 = peg$parsePrimaryExpression();
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseUnaryOperator();
if (s1 !== peg$FAILED) {
s2 = peg$parse__();
if (s2 !== peg$FAILED) {
s3 = peg$parseUnaryExpression();
if (s3 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c106(s1, s3);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
}
return s0;
}
function peg$parseUnaryOperator() {
var s0;
if (input.charCodeAt(peg$currPos) === 43) {
s0 = peg$c107;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c108); }
}
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 45) {
s0 = peg$c109;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c110); }
}
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 33) {
s0 = peg$c111;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c112); }
}
}
}
return s0;
}
function peg$parseMultiplicativeExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseUnaryExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseMultiplicativeOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseUnaryExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseMultiplicativeOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseUnaryExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c113(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseMultiplicativeOperator() {
var s0, s1, s2, s3;
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 42) {
s1 = peg$c114;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c115); }
}
if (s1 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 47) {
s1 = peg$c116;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c117); }
}
if (s1 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 37) {
s1 = peg$c118;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c119); }
}
}
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 61) {
s3 = peg$c120;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c121); }
}
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c122(s1);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseAdditiveExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseMultiplicativeExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseAdditiveOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseMultiplicativeExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseAdditiveOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseMultiplicativeExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c113(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseAdditiveOperator() {
var s0, s1, s2, s3;
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 43) {
s1 = peg$c107;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c108); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 43) {
s3 = peg$c107;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c108); }
}
if (s3 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 61) {
s3 = peg$c120;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c121); }
}
}
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c123();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 45) {
s1 = peg$c109;
peg$currPos++;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c110); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 45) {
s3 = peg$c109;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c110); }
}
if (s3 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 61) {
s3 = peg$c120;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c121); }
}
}
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c124();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
}
return s0;
}
function peg$parseRelationalExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseAdditiveExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseRelationalOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseAdditiveExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseRelationalOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseAdditiveExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c113(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseRelationalOperator() {
var s0;
if (input.substr(peg$currPos, 2) === peg$c125) {
s0 = peg$c125;
peg$currPos += 2;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c126); }
}
if (s0 === peg$FAILED) {
if (input.substr(peg$currPos, 2) === peg$c127) {
s0 = peg$c127;
peg$currPos += 2;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c128); }
}
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 60) {
s0 = peg$c129;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c130); }
}
if (s0 === peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 62) {
s0 = peg$c131;
peg$currPos++;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c132); }
}
}
}
}
return s0;
}
function peg$parseEqualityExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseRelationalExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseEqualityOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseRelationalExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseEqualityOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseRelationalExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c113(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseEqualityOperator() {
var s0;
if (input.substr(peg$currPos, 2) === peg$c133) {
s0 = peg$c133;
peg$currPos += 2;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c134); }
}
if (s0 === peg$FAILED) {
if (input.substr(peg$currPos, 2) === peg$c135) {
s0 = peg$c135;
peg$currPos += 2;
} else {
s0 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c136); }
}
}
return s0;
}
function peg$parseLogicalANDExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseEqualityExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseLogicalANDOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseEqualityExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseLogicalANDOperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseEqualityExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c113(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseLogicalANDOperator() {
var s0, s1, s2, s3;
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c137) {
s1 = peg$c137;
peg$currPos += 2;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c138); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 61) {
s3 = peg$c120;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c121); }
}
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c139();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseLogicalORExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7;
s0 = peg$currPos;
s1 = peg$parseLogicalANDExpression();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseLogicalOROperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseLogicalANDExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
s5 = peg$parseLogicalOROperator();
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseLogicalANDExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
} else {
peg$currPos = s3;
s3 = peg$c0;
}
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c113(s1, s2);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseLogicalOROperator() {
var s0, s1, s2, s3;
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c140) {
s1 = peg$c140;
peg$currPos += 2;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c141); }
}
if (s1 !== peg$FAILED) {
s2 = peg$currPos;
peg$silentFails++;
if (input.charCodeAt(peg$currPos) === 61) {
s3 = peg$c120;
peg$currPos++;
} else {
s3 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c121); }
}
peg$silentFails--;
if (s3 === peg$FAILED) {
s2 = peg$c7;
} else {
peg$currPos = s2;
s2 = peg$c0;
}
if (s2 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c142();
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
return s0;
}
function peg$parseExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c143) {
s1 = peg$c143;
peg$currPos += 2;
} else {
s1 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c144); }
}
if (s1 !== peg$FAILED) {
s2 = peg$parse__();
if (s2 !== peg$FAILED) {
s3 = peg$parseLogicalORExpression();
if (s3 !== peg$FAILED) {
s4 = peg$parse__();
if (s4 !== peg$FAILED) {
if (input.substr(peg$currPos, 4) === peg$c145) {
s5 = peg$c145;
peg$currPos += 4;
} else {
s5 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c146); }
}
if (s5 !== peg$FAILED) {
s6 = peg$parse__();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s8 = peg$parse__();
if (s8 !== peg$FAILED) {
if (input.substr(peg$currPos, 4) === peg$c147) {
s9 = peg$c147;
peg$currPos += 4;
} else {
s9 = peg$FAILED;
if (peg$silentFails === 0) { peg$fail(peg$c148); }
}
if (s9 !== peg$FAILED) {
s10 = peg$parse__();
if (s10 !== peg$FAILED) {
s11 = peg$parseExpression();
if (s11 !== peg$FAILED) {
peg$reportedPos = s0;
s1 = peg$c149(s3, s7, s11);
s0 = s1;
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
} else {
peg$currPos = s0;
s0 = peg$c0;
}
if (s0 === peg$FAILED) {
s0 = peg$parseLogicalORExpression();
}
return s0;
}
peg$result = peg$startRuleFunction();
if (peg$result !== peg$FAILED && peg$currPos === input.length) {
return peg$result;
} else {
if (peg$result !== peg$FAILED && peg$currPos < input.length) {
peg$fail({ type: "end", description: "end of input" });
}
throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos);
}
}
return {
SyntaxError: SyntaxError,
parse: parse
};
}]);
})();
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This directive can only be used in the context of an exploration.
oppia.directive('filepathEditor', [
'$compile', '$http', '$sce', 'alertsService', 'explorationContextService',
'OBJECT_EDITOR_URL_PREFIX',
function(
$compile, $http, $sce, alertsService, explorationContextService,
OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'Filepath';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: function($scope) {
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function(newValue) {
$scope.localValue = {
label: newValue || ''
};
$scope.imageUploaderIsActive = false;
});
$scope.explorationId = explorationContextService.getExplorationId();
$scope.validate = function(localValue) {
return localValue.label && localValue.label.length > 0;
};
$scope.$watch('localValue.label', function(newValue) {
if (newValue) {
alertsService.clearWarnings();
$scope.localValue = {
label: newValue
};
$scope.$parent.value = newValue;
}
});
$scope.getPreviewUrl = function(filepath) {
var encodedFilepath = window.encodeURIComponent(filepath);
return $sce.trustAsResourceUrl(
'/imagehandler/' + $scope.explorationId + '/' + encodedFilepath);
};
$scope.resetImageUploader = function() {
$scope.currentFile = null;
$scope.currentFilename = null;
$scope.imagePreview = null;
};
$scope.openImageUploader = function() {
$scope.resetImageUploader();
$scope.uploadWarning = null;
$scope.imageUploaderIsActive = true;
};
$scope.closeImageUploader = function() {
$scope.imageUploaderIsActive = false;
};
$scope.onFileChanged = function(file, filename) {
if (!file || !file.size || !file.type.match('image.*')) {
$scope.uploadWarning = 'This file is not recognized as an image.';
$scope.resetImageUploader();
$scope.$apply();
return;
}
$scope.currentFile = file;
$scope.currentFilename = filename;
$scope.uploadWarning = null;
var reader = new FileReader();
reader.onload = function(e) {
$scope.$apply(function() {
$scope.imagePreview = e.target.result;
});
};
reader.readAsDataURL(file);
$scope.$apply();
};
$scope.saveUploadedFile = function(file, filename) {
alertsService.clearWarnings();
if (!file || !file.size) {
alertsService.addWarning('Empty file detected.');
return;
}
if (!file.type.match('image.*')) {
alertsService.addWarning(
'This file is not recognized as an image.');
return;
}
if (!filename) {
alertsService.addWarning('Filename must not be empty.');
return;
}
var form = new FormData();
form.append('image', file);
form.append('payload', JSON.stringify({
filename: filename
}));
form.append('csrf_token', GLOBALS.csrf_token);
$.ajax({
url: '/createhandler/imageupload/' + $scope.explorationId,
data: form,
processData: false,
contentType: false,
type: 'POST',
dataFilter: function(data) {
// Remove the XSSI prefix.
var transformedData = data.substring(5);
return JSON.parse(transformedData);
},
dataType: 'text'
}).done(function(data) {
var inputElement = $('#newImage');
$scope.filepaths.push(data.filepath);
$scope.closeImageUploader();
$scope.localValue.label = data.filepath;
$scope.$apply();
}).fail(function(data) {
// Remove the XSSI prefix.
var transformedData = data.responseText.substring(5);
var parsedResponse = JSON.parse(transformedData);
alertsService.addWarning(
parsedResponse.error || 'Error communicating with server.');
$scope.$apply();
});
};
$scope.filepathsLoaded = false;
$http.get(
'/createhandler/resource_list/' + $scope.explorationId
).then(function(response) {
$scope.filepaths = response.data.filepaths;
$scope.filepathsLoaded = true;
});
}
};
}
]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('graphEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'Graph';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: function($scope) {
$scope.alwaysEditable = true;
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
//
// This directive is based on the UnicodeString directive.
oppia.directive('htmlEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'Html';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: function($scope) {
$scope.schema = {
type: 'html'
};
}
};
}]);
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('nonnegativeIntEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'NonnegativeInt';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.SCHEMA = {
type: 'int',
validators: [{
id: 'is_at_least',
min_value: 0
}]
};
if (!$scope.$parent.value) {
$scope.$parent.value = 0;
}
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
oppia.directive('coordTwoDimEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
controller: function($scope, $timeout) {
$scope.schemaLatitude = {
type: 'float',
validators: [{
id: 'is_at_least',
min_value: -90.0
}, {
id: 'is_at_most',
max_value: 90.0
}]
};
$scope.schemaLongitude = {
type: 'float',
validators: [{
id: 'is_at_least',
min_value: -180.0
}, {
id: 'is_at_most',
max_value: 180.0
}]
};
var updateMarker = function(lat, lng) {
var latLng = new google.maps.LatLng(lat, lng);
$timeout(function() {
if ($scope.mapMarker) {
$scope.mapMarker.setPosition(latLng);
} else {
$scope.mapMarker = new google.maps.Marker({
map: $scope.map,
position: latLng
});
}
}, 10);
};
$scope.$watch('$parent.value', function(newValue, oldValue) {
// A new rule has just been created.
if ($scope.$parent.value === '') {
$scope.$parent.value = [0.0, 0.0];
}
if (!angular.equals(newValue, oldValue)) {
updateMarker(newValue[0], newValue[1]);
}
});
// A new rule has just been created.
if ($scope.$parent.value === '') {
$scope.$parent.value = [0.0, 0.0];
}
// This is required in order to avoid the following bug:
// http://stackoverflow.com/q/18769287
$timeout(function() {
updateMarker($scope.$parent.value[0], $scope.$parent.value[1]);
if ($scope.map) {
google.maps.event.trigger($scope.map, 'resize');
}
}, 100);
$scope.mapOptions = {
center: new google.maps.LatLng(
$scope.$parent.value[0],
$scope.$parent.value[1]
),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 0
};
$scope.registerClick = function($event, $params) {
var latLng = $params[0].latLng;
updateMarker(latLng.lat(), latLng.lng());
$scope.$parent.value = [latLng.lat(), latLng.lng()];
};
},
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'CoordTwoDim';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>'
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('graphPropertyEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'GraphProperty';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = true;
$scope.graphProperties = [{
name: 'regular',
humanReadableName: 'regular'
}, {
name: 'acyclic',
humanReadableName: 'acyclic'
}, {
name: 'strongly_connected',
humanReadableName: 'strongly connected'
}, {
name: 'weakly_connected',
humanReadableName: 'weakly connected'
}];
$scope.localValue = {
property: $scope.graphProperties[0]
};
for (var i = 0; i < $scope.graphProperties.length; i++) {
if ($scope.graphProperties[i].name === $scope.$parent.value) {
$scope.localValue.property = $scope.graphProperties[i];
}
}
$scope.$watch('localValue.property', function() {
$scope.$parent.value = $scope.localValue.property.name;
});
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
oppia.directive('realEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'Real';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.schema = {
type: 'float'
};
$scope.$watch('$parent.value', function() {
if ($scope.$parent.value === '') {
// A new rule
$scope.$parent.value = 0.0;
}
});
if ($scope.$parent.value === '') {
$scope.$parent.value = 0.0;
}
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('logicErrorCategoryEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'LogicErrorCategory';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = true;
$scope.errorCategories = [{
name: 'parsing',
humanReadable: 'Unparseable'
}, {
name: 'typing',
humanReadable: 'Ill-typed'
}, {
name: 'line',
humanReadable: 'Incorrect line'
}, {
name: 'layout',
humanReadable: 'Wrong indenting'
}, {
name: 'variables',
humanReadable: 'Variables error'
}, {
name: 'logic',
humanReadable: 'Invalid deduction'
}, {
name: 'target',
humanReadable: 'Target not proved'
}, {
name: 'mistake',
humanReadable: 'Unspecified'
}];
$scope.localValue = {
category: $scope.errorCategories[0]
};
for (var i = 0; i < $scope.errorCategories.length; i++) {
if ($scope.errorCategories[i].name === $scope.$parent.value) {
$scope.localValue.category = $scope.errorCategories[i];
}
}
$scope.$watch('localValue.category', function() {
$scope.$parent.value = $scope.localValue.category.name;
});
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('logicQuestionEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'LogicQuestion';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = true;
$scope.localValue = {
assumptionsString: logicProofShared.displayExpressionArray(
$scope.$parent.value.assumptions,
logicProofData.BASE_STUDENT_LANGUAGE.operators),
targetString: logicProofShared.displayExpression(
$scope.$parent.value.results[0],
logicProofData.BASE_STUDENT_LANGUAGE.operators),
errorMessage: '',
proofString: $scope.$parent.value.default_proof_string
};
// NOTE: we use ng-change rather than $watch because the latter runs in
// response to any change to the watched value, and we only want to
// respond to changes made by the user.
$scope.changeAssumptions = function() {
$scope.convertThenBuild(
'logicQuestionAssumptions', 'assumptionsString');
};
$scope.changeTarget = function() {
$scope.convertThenBuild('logicQuestionTarget', 'targetString');
};
$scope.changeProof = function() {
$scope.convertThenBuild('logicQuestionProof', 'proofString');
};
$scope.convertThenBuild = function(elementID, nameOfString) {
var element = document.getElementById(elementID);
var cursorPosition = element.selectionEnd;
$scope.localValue[nameOfString] =
logicProofConversion.convertToLogicCharacters(
$scope.localValue[nameOfString]);
$scope.buildQuestion();
// NOTE: angular will reset the position of the cursor after this
// function runs, so we need to delay our re-resetting.
setTimeout(function() {
element.selectionEnd = cursorPosition;
}, 2);
};
$scope.buildQuestion = function() {
try {
builtQuestion = angular.copy(
logicProofTeacher.buildQuestion(
$scope.localValue.assumptionsString,
$scope.localValue.targetString,
LOGIC_PROOF_DEFAULT_QUESTION_DATA.vocabulary));
$scope.$parent.value = {
assumptions: builtQuestion.assumptions,
results: builtQuestion.results,
default_proof_string: $scope.localValue.proofString
};
$scope.localValue.errorMessage = '';
} catch (err) {
$scope.localValue.errorMessage = err.message;
}
};
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This is a copy of the UnicodeStringEditor.
oppia.directive('normalizedStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'NormalizedString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = $scope.$parent.alwaysEditable;
$scope.largeInput = false;
$scope.$watch('$parent.initArgs', function(newValue) {
$scope.largeInput = false;
if (newValue && newValue.largeInput) {
$scope.largeInput = newValue.largeInput;
}
});
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function() {
$scope.localValue = {
label: $scope.$parent.value || ''
};
}, true);
if ($scope.alwaysEditable) {
$scope.$watch('localValue.label', function(newValue) {
$scope.$parent.value = newValue;
});
} else {
$scope.openEditor = function() {
$scope.active = true;
};
$scope.closeEditor = function() {
$scope.active = false;
};
$scope.replaceValue = function(newValue) {
$scope.localValue = {
label: newValue
};
$scope.$parent.value = newValue;
$scope.closeEditor();
};
$scope.$on('externalSave', function() {
if ($scope.active) {
$scope.replaceValue($scope.localValue.label);
// The $scope.$apply() call is needed to propagate the replaced
// value.
$scope.$apply();
}
});
$scope.closeEditor();
}
}
};
}]);
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This directive is always editable.
oppia.directive('musicPhraseEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX', 'alertsService',
function($compile, OBJECT_EDITOR_URL_PREFIX, alertsService) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'MusicPhrase';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: ['$scope', function($scope) {
// The maximum number of notes allowed in a music phrase.
var _MAX_NOTES_IN_PHRASE = 8;
$scope.schema = {
type: 'list',
items: {
type: 'unicode',
choices: [
'C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5', 'D5', 'E5', 'F5',
'G5', 'A5'
]
},
ui_config: {
add_element_text: 'Add Note \u2669'
},
validators: [{
id: 'has_length_at_most',
max_value: _MAX_NOTES_IN_PHRASE
}]
};
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function(newValue) {
// TODO(sll): Check that $scope.$parent.value is a list.
$scope.localValue = [];
if (newValue) {
for (var i = 0; i < newValue.length; i++) {
$scope.localValue.push(newValue[i].readableNoteName);
}
}
}, true);
$scope.$watch('localValue', function(newValue, oldValue) {
if (newValue && oldValue) {
if (newValue.length > _MAX_NOTES_IN_PHRASE) {
alertsService.addWarning('There are too many notes on the staff.');
} else {
var parentValues = [];
for (var i = 0; i < newValue.length; i++) {
parentValues.push({
readableNoteName: newValue[i],
noteDuration: {
num: 1,
den: 1
}
});
}
$scope.$parent.value = parentValues;
}
}
}, true);
}]
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('listOfUnicodeStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'ListOfUnicodeString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: function($scope) {
$scope.SCHEMA = {
type: 'list',
items: {
type: 'unicode'
}
};
if (!$scope.$parent.value) {
$scope.$parent.value = [];
}
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('mathLatexStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'MathLatexString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = $scope.$parent.alwaysEditable;
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function() {
$scope.localValue = {
label: $scope.$parent.value || ''
};
}, true);
if ($scope.alwaysEditable) {
$scope.$watch('localValue.label', function(newValue) {
$scope.$parent.value = newValue;
});
} else {
$scope.openEditor = function() {
$scope.active = true;
};
$scope.closeEditor = function() {
$scope.active = false;
};
$scope.replaceValue = function(newValue) {
$scope.localValue = {
label: newValue
};
$scope.$parent.value = newValue;
$scope.closeEditor();
};
$scope.$on('externalSave', function() {
if ($scope.active) {
$scope.replaceValue($scope.localValue.label);
// The $scope.$apply() call is needed to propagate the replaced
// value.
$scope.$apply();
}
});
$scope.closeEditor();
}
}
};
}
]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This directive is based on the unicodeStringEditor one.
oppia.directive('sanitizedUrlEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
// Editable URL directive.
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'SanitizedUrl';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.$watch('$parent.initArgs', function(newValue) {
$scope.largeInput = false;
if (newValue && newValue.largeInput) {
$scope.largeInput = newValue.largeInput;
}
});
$scope.$watch('$parent.value', function(newValue) {
$scope.localValue = {
label: String(newValue) || ''
};
}, true);
$scope.alwaysEditable = true;
$scope.$watch('localValue.label', function(newValue) {
$scope.$parent.value = newValue;
});
$scope.$on('externalSave', function() {
var currentValue = String($scope.localValue.label);
if ($scope.active) {
$scope.replaceValue(currentValue);
// The $scope.$apply() call is needed to propagate the replaced
// value.
$scope.$apply();
}
});
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('setOfUnicodeStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'SetOfUnicodeString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: function($scope) {
$scope.SCHEMA = {
type: 'list',
items: {
type: 'unicode'
},
validators: [{
id: 'is_uniquified'
}]
};
if (!$scope.$parent.value) {
$scope.$parent.value = [];
}
}
};
}]);
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('setOfHtmlStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'SetOfHtmlString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.SCHEMA = {
type: 'list',
items: {
type: 'html'
}
};
if (!$scope.$parent.value) {
$scope.$parent.value = [];
}
$scope.choices = $scope.initArgs.choices;
$scope.selections = $scope.choices.map(function(choice) {
return $scope.$parent.value.indexOf(choice.id) !== -1;
});
// The following function is necessary to insert elements into the answer
// groups for the Item Selection Widget.
$scope.toggleSelection = function(choiceListIndex) {
var choiceHtml = $scope.choices[choiceListIndex].id;
var selectedChoicesIndex = $scope.$parent.value.indexOf(choiceHtml);
if (selectedChoicesIndex > -1) {
$scope.$parent.value.splice(selectedChoicesIndex, 1);
} else {
$scope.$parent.value.push(choiceHtml);
}
};
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// NOTE TO DEVELOPERS: This editor requires explorationParamSpecsService to be
// available in the context in which it is used.
oppia.directive('parameterNameEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'ParameterName';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: [
'$scope', '$attrs', 'explorationParamSpecsService',
function($scope, $attrs, explorationParamSpecsService) {
$scope.availableParamNames = Object.keys(
explorationParamSpecsService.savedMemento);
if ($scope.availableParamNames.length === 0) {
$scope.localValue = null;
} else {
$scope.localValue = $scope.availableParamNames[0];
}
$scope.validate = function() {
return ($scope.availableParamNames.length === 0) ? false : true;
};
$scope.SCHEMA = {
type: 'unicode',
choices: $scope.availableParamNames
};
// Reset the component each time the value changes (e.g. if this is
// part of an editable list).
$scope.$watch('$parent.value', function(newValue) {
if (newValue) {
$scope.localValue = newValue;
}
}, true);
$scope.$watch('localValue', function(newValue) {
$scope.$parent.value = newValue;
});
}
]
};
}
]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
// TODO(czx): Uniquify the labels of image regions
oppia.directive('imageWithRegionsEditor', [
'$sce', '$compile', 'alertsService', '$document', 'explorationContextService',
'OBJECT_EDITOR_URL_PREFIX',
function($sce, $compile, alertsService, $document, explorationContextService,
OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'ImageWithRegions';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<div ng-include="getTemplateUrl()"></div>',
controller: function($scope, $element) {
$scope.alwaysEditable = true;
$scope.REGION_LABEL_OFFSET_X = 6;
$scope.REGION_LABEL_OFFSET_Y = 18;
$scope.REGION_LABEL_STYLE = (
'fill: white; font-size: large; pointer-events: none;');
$scope.SELECTED_REGION_STYLE = 'fill: orange; opacity: 0.5;';
$scope.UNSELECTED_REGION_STYLE = 'fill: blue; opacity: 0.5;';
$scope.getRegionStyle = function(index) {
if (index === $scope.selectedRegion) {
return $scope.SELECTED_REGION_STYLE;
} else {
return $scope.UNSELECTED_REGION_STYLE;
}
};
// All coordinates have origin at top-left,
// increasing in x to the right and increasing in y down
// Current mouse position in SVG coordinates
$scope.mouseX = 0;
$scope.mouseY = 0;
// Original mouse click position for rectangle drawing
$scope.originalMouseX = 0;
$scope.originalMouseY = 0;
// Original position and dimensions for dragged rectangle
$scope.originalRectArea = {
x: 0,
y: 0,
width: 0,
height: 0
};
// Coordinates for currently drawn rectangle (when user is dragging)
$scope.rectX = 0;
$scope.rectY = 0;
$scope.rectWidth = 0;
$scope.rectHeight = 0;
// Is user currently drawing a new region?
$scope.userIsCurrentlyDrawing = false;
// Is user currently dragging an existing region?
$scope.userIsCurrentlyDragging = false;
// Dimensions of original image
$scope.originalImageWidth = 0;
$scope.originalImageHeight = 0;
// Is the user preparing to draw a rectangle?
$scope.regionDrawMode = false;
// Index of region currently hovered over
$scope.hoveredRegion = null;
// Index of region currently selected
$scope.selectedRegion = null;
// Temporary label list
var labelList = $scope.$parent.value.labeledRegions.map(
function(region) {
return region.label;
}
);
// Calculates the dimensions of the image, assuming that the width
// of the image is scaled down to fit the svg element if necessary
var _calculateImageDimensions = function() {
var svgElement = $($element).find(
'.oppia-image-with-regions-editor-svg');
var displayedImageWidth = Math.min(
svgElement.width(), $scope.originalImageWidth);
var scalingRatio = displayedImageWidth / $scope.originalImageWidth;
// Note that scalingRatio may be NaN if $scope.originalImageWidth is
// zero.
var displayedImageHeight = (
$scope.originalImageWidth === 0 ? 0.0 :
$scope.originalImageHeight * scalingRatio);
return {
width: displayedImageWidth,
height: displayedImageHeight
};
};
// Use these two functions to get the calculated image width and height
$scope.getImageWidth = function() {
return _calculateImageDimensions().width;
};
$scope.getImageHeight = function() {
return _calculateImageDimensions().height;
};
$scope.getPreviewUrl = function(imageUrl) {
return $sce.trustAsResourceUrl(
'/imagehandler/' + explorationContextService.getExplorationId() +
'/' + encodeURIComponent(imageUrl)
);
};
// Called when the image is changed to calculate the required
// width and height, especially for large images
$scope.$watch('$parent.value.imagePath', function(newVal) {
if (newVal !== '') {
// Loads the image in hanging <img> tag so as to get the
// width and height
$('<img/>').attr('src', $scope.getPreviewUrl(newVal)).load(
function() {
$scope.originalImageWidth = this.width;
$scope.originalImageHeight = this.height;
$scope.$apply();
}
);
}
});
var hasDuplicates = function(originalArray) {
var array = originalArray.slice(0).sort();
for (var i = 1; i < array.length; i++) {
if (array[i - 1] === array[i]) {
return true;
}
}
return false;
};
$scope.regionLabelGetterSetter = function(index) {
return function(label) {
if (angular.isDefined(label)) {
labelList[index] = label;
if (hasDuplicates(labelList)) {
$scope.errorText = 'ERROR: Duplicate labels!';
} else {
$scope.errorText = '';
for (var i = 0; i < labelList.length; i++) {
$scope.$parent.value.labeledRegions[i].label = labelList[i];
}
}
}
return labelList[index];
};
};
var convertCoordsToFraction = function(coords, dimensions) {
return [coords[0] / dimensions[0], coords[1] / dimensions[1]];
};
// Convert to and from region area (which is stored as a fraction of
// image width and height) and actual width and height
var regionAreaFromCornerAndDimensions = function(x, y, width, height) {
return [
convertCoordsToFraction(
[x, y],
[$scope.getImageWidth(), $scope.getImageHeight()]
),
convertCoordsToFraction(
[x + width, y + height],
[$scope.getImageWidth(), $scope.getImageHeight()]
)
];
};
var cornerAndDimensionsFromRegionArea = function(area) {
return {
x: area[0][0] * $scope.getImageWidth(),
y: area[0][1] * $scope.getImageHeight(),
width: (area[1][0] - area[0][0]) * $scope.getImageWidth(),
height: (area[1][1] - area[0][1]) * $scope.getImageHeight()
};
};
$scope.onSvgMouseMove = function(evt) {
var svgElement = $($element).find(
'.oppia-image-with-regions-editor-svg');
$scope.mouseX = evt.pageX - svgElement.offset().left;
$scope.mouseY = evt.pageY - svgElement.offset().top;
if ($scope.userIsCurrentlyDrawing) {
$scope.rectX = Math.min($scope.originalMouseX, $scope.mouseX);
$scope.rectY = Math.min($scope.originalMouseY, $scope.mouseY);
$scope.rectWidth = Math.abs($scope.originalMouseX - $scope.mouseX);
$scope.rectHeight = Math.abs($scope.originalMouseY - $scope.mouseY);
} else if ($scope.userIsCurrentlyDragging) {
var labeledRegions = $scope.$parent.value.labeledRegions;
var draggedRegion = labeledRegions[$scope.selectedRegion].region;
var deltaX = $scope.mouseX - $scope.originalMouseX;
var deltaY = $scope.mouseY - $scope.originalMouseY;
draggedRegion.area = regionAreaFromCornerAndDimensions(
$scope.originalRectArea.x + deltaX,
$scope.originalRectArea.y + deltaY,
$scope.originalRectArea.width,
$scope.originalRectArea.height
);
}
};
$scope.onSvgMouseDown = function(evt) {
evt.preventDefault();
$scope.originalMouseX = $scope.mouseX;
$scope.originalMouseY = $scope.mouseY;
if ($scope.regionDrawMode) {
$scope.rectWidth = $scope.rectHeight = 0;
$scope.userIsCurrentlyDrawing = true;
}
};
$scope.onSvgMouseUp = function() {
if ($scope.hoveredRegion === null) {
$scope.selectedRegion = null;
}
$scope.userIsCurrentlyDrawing = false;
$scope.userIsCurrentlyDragging = false;
if ($scope.regionDrawMode) {
$scope.regionDrawMode = false;
if ($scope.rectWidth !== 0 && $scope.rectHeight !== 0) {
var labels = $scope.$parent.value.labeledRegions.map(
function(region) {
return region.label;
}
);
// Searches numbers starting from 1 to find a valid label
// that doesn't overlap with currently existing labels
var newLabel = null;
for (var i = 1; i <= labels.length + 1; i++) {
if (labels.indexOf(i.toString()) === -1) {
newLabel = i.toString();
break;
}
}
var newRegion = {
label: newLabel,
region: {
regionType: 'Rectangle',
area: regionAreaFromCornerAndDimensions(
$scope.rectX,
$scope.rectY,
$scope.rectWidth,
$scope.rectHeight
)
}
};
$scope.$parent.value.labeledRegions.push(newRegion);
labelList.push(newLabel);
$scope.selectedRegion = (
$scope.$parent.value.labeledRegions.length - 1);
}
}
};
$scope.onMouseoverRegion = function(index) {
if ($scope.hoveredRegion === null) {
$scope.hoveredRegion = index;
}
};
$scope.onMouseoutRegion = function(index) {
if ($scope.hoveredRegion === index) {
$scope.hoveredRegion = null;
}
};
$scope.onMousedownRegion = function() {
$scope.userIsCurrentlyDragging = true;
$scope.selectedRegion = $scope.hoveredRegion;
$scope.originalRectArea = cornerAndDimensionsFromRegionArea(
$scope.$parent.value.labeledRegions[
$scope.hoveredRegion].region.area
);
};
$scope.onDocumentMouseUp = function() {
if ($scope.regionDrawMode && !$scope.userIsCurrentlyDrawing) {
$scope.regionDrawMode = false;
}
};
$document.on('mouseup', $scope.onDocumentMouseUp);
$scope.setDrawMode = function() {
$scope.regionDrawMode = true;
};
$scope.getCursorStyle = function() {
return ($scope.regionDrawMode) ? 'crosshair' : 'default';
};
$scope.resetEditor = function() {
$scope.$parent.value.imagePath = '';
$scope.$parent.value.labeledRegions = [];
};
$scope.deleteRegion = function(index) {
if ($scope.selectedRegion === index) {
$scope.selectedRegion = null;
} else if ($scope.selectedRegion > index) {
$scope.selectedRegion--;
}
if ($scope.hoveredRegion === index) {
$scope.hoveredRegion = null;
} else if ($scope.hoveredRegion > index) {
$scope.hoveredRegion--;
}
$scope.$parent.value.labeledRegions.splice(index, 1);
labelList.splice(index, 1);
};
}
};
}
]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('intEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'Int';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.SCHEMA = {
type: 'int'
};
if (!$scope.$parent.value) {
$scope.$parent.value = 0;
}
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('codeStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'CodeString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = $scope.$parent.alwaysEditable;
$scope.getWarningText = function() {
if ($scope.localValue.label.indexOf('\t') !== -1) {
return 'Code may not contain tab characters.';
}
return '';
};
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function() {
$scope.localValue = {
label: $scope.$parent.value || ''
};
}, true);
$scope.$watch('localValue.label', function(newValue) {
$scope.$parent.value = newValue;
});
}
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// The value for this editor is always editable.
oppia.directive('booleanEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
controller: function($scope) {
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function(newValue) {
$scope.localValue = {
label: newValue || false
};
}, true);
$scope.$watch('localValue.label', function(newValue) {
$scope.$parent.value = newValue;
});
},
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'Boolean';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>'
};
}]);
// Copyright 2014 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Every editor directive should implement an alwaysEditable option. There
// may be additional customization options for the editor that should be passed
// in via initArgs.
oppia.directive('unicodeStringEditor', [
'$compile', 'OBJECT_EDITOR_URL_PREFIX',
function($compile, OBJECT_EDITOR_URL_PREFIX) {
return {
link: function(scope, element) {
scope.getTemplateUrl = function() {
return OBJECT_EDITOR_URL_PREFIX + 'UnicodeString';
};
$compile(element.contents())(scope);
},
restrict: 'E',
scope: true,
template: '<span ng-include="getTemplateUrl()"></span>',
controller: function($scope) {
$scope.alwaysEditable = $scope.$parent.alwaysEditable;
$scope.largeInput = false;
$scope.$watch('$parent.initArgs', function(newValue) {
$scope.largeInput = false;
if (newValue && newValue.largeInput) {
$scope.largeInput = newValue.largeInput;
}
});
// Reset the component each time the value changes (e.g. if this is part
// of an editable list).
$scope.$watch('$parent.value', function() {
$scope.localValue = {
label: $scope.$parent.value || ''
};
}, true);
if ($scope.alwaysEditable) {
$scope.$watch('localValue.label', function(newValue) {
$scope.$parent.value = newValue;
});
} else {
$scope.openEditor = function() {
$scope.active = true;
};
$scope.closeEditor = function() {
$scope.active = false;
};
$scope.replaceValue = function(newValue) {
$scope.localValue = {
label: newValue
};
$scope.$parent.value = newValue;
$scope.closeEditor();
};
$scope.$on('externalSave', function() {
if ($scope.active) {
$scope.replaceValue($scope.localValue.label);
// The $scope.$apply() call is needed to propagate the replaced
// value.
$scope.$apply();
}
});
$scope.closeEditor();
}
}
};
}]);
</script>
<script>
(function() {// Copyright 2016 The Oppia Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Controllers for the error page.
*/
oppia.controller('Error', [
'$scope', 'UrlInterpolationService',
function(
$scope, UrlInterpolationService) {
$scope.oopsMintImgUrl = UrlInterpolationService.getStaticImageUrl(
'/general/oops_mint.png');
}
]);
})();
</script>
</body>
</html>
----------------------------------------------------------------------
Ran 2 tests in 1.892s
FAILED (errors=1)
Traceback (most recent call last):
File "/Users/aviato/github/oppia/oppia/core/tests/gae_suite.py", line 121, in <module>
main()
File "/Users/aviato/github/oppia/oppia/core/tests/gae_suite.py", line 114, in main
result.testsRun, len(result.errors), len(result.failures)))
Exception: Test suite failed: 2 tests run, 1 errors, 0 failures.
+------------------+
| SUMMARY OF TESTS |
+------------------+
======================================================================
ERROR: test_one_rating_for_single_exploration (core.controllers.dashboard_test.DashboardStatisticsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/aviato/github/oppia/oppia/core/controllers/dashboard_test.py", line 189, in test_one_rating_for_single_exploration
response = self.get_json(feconf.DASHBOARD_DATA_URL)
File "/Users/aviato/github/oppia/oppia/core/tests/test_utils.py", line 234, in get_json
json_response = self.testapp.get(url, params)
File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 758, in get
expect_errors=expect_errors)
File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1120, in do_request
self._check_status(status, res)
File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1156, in _check_status
res)
AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for http://localhost/dashboardhandler/data)
<!DOCTYPE html>
<html ng-app="oppia" ng-controller="Base" itemscope itemtype="http://schema.org/Organization">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<!-- Tiles for Internet Explorer. -->
<meta name="application-name" content="SITE_NAME">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-square70x70logo" content="http://localhost/assets/images/logo/msapplication-tiny.png">
<meta name="msapplication-square150x150logo" content="http://localhost/assets/images/logo/msapplication-square.png">
<meta name="msapplication-wide310x150logo" content="http://localhost/assets/images/logo/msapplication-wide.png">
<meta name="msapplication-square310x310logo" content="http://localhost/assets/images/logo/msapplication-large.png">
<!-- The itemprops are for G+ sharing. -->
<meta itemprop="name" content="Personalized Online Learning from Oppia">
<meta itemprop="description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!">
<!-- The og tags are for Facebook sharing. -->
<meta property="og:title" content="Personalized Online Learning from Oppia">
<meta property="og:site_name" content="Oppia">
<meta property="og:url" content="http://localhost/dashboardhandler/data">
<meta property="og:description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!">
<meta property="og:type" content="article">
<meta property="og:image" content="http://localhost/assets/images/logo/288x288_logo_mint.png">
<link rel="apple-touch-icon" href="/assets/images/logo/favicon.png">
<!-- The title is bound to the rootScope. The content of the block
maintitle can be a string or a translation id. If it is a translation it
will be replaced by its translation when the page is loading. If it is a
string it would be displayed as is. This is the only way to translate
the page title because the head of the file is outside the scope of
any other controller. -->
<title itemprop="name" translate="
I18N_ERROR_PAGE_TITLE_500
"></title>
<link rel="stylesheet" type="text/css" media="screen"
href="https://fonts.googleapis.com/css?family=Capriola|Rubik|Roboto|Material+Icons|Open+Sans:400,600">
<link rel="stylesheet" type="text/css" media="screen"
href="/third_party/generated/css/third_party.css">
<link rel="stylesheet" type="text/css" media="screen"
href="/css/oppia.css">
<script>
var GLOBALS = {
ACTIVITY_STATUS_PRIVATE: JSON.parse(
'\"private\"'),
ACTIVITY_STATUS_PUBLIC: JSON.parse(
'\"public\"'),
ACTIVITY_STATUS_PUBLICIZED: JSON.parse(
'\"publicized\"'),
ADDITIONAL_ANGULAR_MODULES: [],
ALL_CATEGORIES: JSON.parse('[\"Algebra\", \"Algorithms\", \"Architecture\", \"Arithmetic\", \"Art\", \"Astronomy\", \"Biology\", \"Business\", \"Calculus\", \"Chemistry\", \"Combinatorics\", \"Computing\", \"Economics\", \"Education\", \"Engineering\", \"English\", \"Environment\", \"Gaulish\", \"Geography\", \"Geometry\", \"Government\", \"Graph Theory\", \"History\", \"Languages\", \"Latin\", \"Law\", \"Logic\", \"Mathematics\", \"Medicine\", \"Music\", \"Philosophy\", \"Physics\", \"Poetry\", \"Probability\", \"Programming\", \"Puzzles\", \"Reading\", \"Spanish\", \"Sport\", \"Statistics\", \"Trigonometry\", \"Welcome\"]'),
ALL_LANGUAGE_CODES: JSON.parse('[{\"code\": \"en\", \"description\": \"English\"}, {\"code\": \"ar\", \"description\": \"\\u0627\\u0644\\u0639\\u0631\\u0628\\u064a\\u0629 (Arabic)\"}, {\"code\": \"bg\", \"description\": \"\\u0431\\u044a\\u043b\\u0433\\u0430\\u0440\\u0441\\u043a\\u0438 (Bulgarian)\"}, {\"code\": \"ca\", \"description\": \"catal\\u00e0 (Catalan)\"}, {\"code\": \"zh\", \"description\": \"\\u4e2d\\u6587 (Chinese)\"}, {\"code\": \"hr\", \"description\": \"hrvatski (Croatian)\"}, {\"code\": \"cs\", \"description\": \"\\u010de\\u0161tina (Czech)\"}, {\"code\": \"da\", \"description\": \"dansk (Danish)\"}, {\"code\": \"nl\", \"description\": \"Nederlands (Dutch)\"}, {\"code\": \"tl\", \"description\": \"Filipino (Filipino)\"}, {\"code\": \"fi\", \"description\": \"suomi (Finnish)\"}, {\"code\": \"fr\", \"description\": \"fran\\u00e7ais (French)\"}, {\"code\": \"de\", \"description\": \"Deutsch (German)\"}, {\"code\": \"el\", \"description\": \"\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (Greek)\"}, {\"code\": \"he\", \"description\": \"\\u05e2\\u05d1\\u05e8\\u05d9\\u05ea (Hebrew)\"}, {\"code\": \"hi\", \"description\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940 (Hindi)\"}, {\"code\": \"hu\", \"description\": \"magyar (Hungarian)\"}, {\"code\": \"id\", \"description\": \"Bahasa Indonesia (Indonesian)\"}, {\"code\": \"it\", \"description\": \"italiano (Italian)\"}, {\"code\": \"ja\", \"description\": \"\\u65e5\\u672c\\u8a9e (Japanese)\"}, {\"code\": \"ko\", \"description\": \"\\ud55c\\uad6d\\uc5b4 (Korean)\"}, {\"code\": \"lv\", \"description\": \"latvie\\u0161u (Latvian)\"}, {\"code\": \"lt\", \"description\": \"lietuvi\\u0173 (Lithuanian)\"}, {\"code\": \"no\", \"description\": \"Norsk (Norwegian)\"}, {\"code\": \"fa\", \"description\": \"\\u0641\\u0627\\u0631\\u0633\\u06cc (Persian)\"}, {\"code\": \"pl\", \"description\": \"polski (Polish)\"}, {\"code\": \"pt\", \"description\": \"portugu\\u00eas (Portuguese)\"}, {\"code\": \"ro\", \"description\": \"rom\\u00e2n\\u0103 (Romanian)\"}, {\"code\": \"ru\", \"description\": \"\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 (Russian)\"}, {\"code\": \"sr\", \"description\": \"\\u0441\\u0440\\u043f\\u0441\\u043a\\u0438 (Serbian)\"}, {\"code\": \"sk\", \"description\": \"sloven\\u010dina (Slovak)\"}, {\"code\": \"sl\", \"description\": \"sloven\\u0161\\u010dina (Slovenian)\"}, {\"code\": \"es\", \"description\": \"espa\\u00f1ol (Spanish)\"}, {\"code\": \"sv\", \"description\": \"svenska (Swedish)\"}, {\"code\": \"th\", \"description\": \"\\u0e20\\u0e32\\u0e29\\u0e32\\u0e44\\u0e17\\u0e22 (Thai)\"}, {\"code\": \"tr\", \"description\": \"T\\u00fcrk\\u00e7e (Turkish)\"}, {\"code\": \"uk\", \"description\": \"\\u0443\\u043a\\u0440\\u0430\\u0457\\u043d\\u0441\\u044c\\u043a\\u0430 (Ukrainian)\"}, {\"code\": \"vi\", \"description\": \"Ti\\u1ebfng Vi\\u1ec7t (Vietnamese)\"}]'),
ASSET_DIR_PREFIX: JSON.parse('\"\"'),
can_create_collections: JSON.parse(
'false'),
CAN_SEND_ANALYTICS_EVENTS: JSON.parse(
'false'),
csrf_token: JSON.parse('\"1471535014/kOieX0euygOcLEDTb_qbXQ==\"'),
DEFAULT_LANGUAGE_CODE: JSON.parse(
'\"en\"'),
DEV_MODE: JSON.parse('true'),
INVALID_NAME_CHARS: JSON.parse('\":#/|_%\u003c\u003e[]{}\\ufffd\\\\\\u007f\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\"'),
MINIFICATION: JSON.parse('false'),
/* A list of functions to be called when an exploration is completed */
POST_COMPLETION_HOOKS: [],
preferredSiteLanguageCode: JSON.parse(
'null'),
RTE_COMPONENT_SPECS: JSON.parse('{\"Collapsible\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAABoCAIAAAC2bTrDAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMDQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjA5PC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4KzNxgGQAAJwlJREFUeAHtnc2upVW1hg8IFGgsQSuCmNgmsUGDFoREGtCwyTUQ%0AL4C%2BaAT6tNFwBV4AMaFJoGXDhgltG4im%2BJGjAQqE8%2Bz1VL01zvzW3rXdVXtVYr2zMXjnmONnfs8u%0Ak2%2B49s9d33zzzf90lUAJlEAJlEAJlEAJlEAJlEAJlMB5Erj7PIu3dgmUQAmUQAmUQAmUQAmUQAmU%0AQAkcEejw2X8HJVACJVACJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9%0AN1ACJVACJVACJVACJVACJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBEujw2X8DJVACJVAC%0AJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9N1ACJVACJVACJVACJVAC%0AJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBErjn9AiuXLnyr3/967PPPkN8/fXXp09sZAmU%0AQAmUQAmUQAmUQAmUQAmUwH8lgbvvvvu%2B%2B%2B574IEHvvOd7yBOeMa7vvnmmxOOc/SPf/zjww8/zLai%0ABEqgBEqgBEqgBEqgBEqgBEqgBEKAKfShhx763ve%2BF88iTjV8/vWvf%2BUDTzKpdeHChaVEtyVQAiVQ%0AAiVQAiVQAiVQAiVQAncygS%2B%2B%2BOLjjz%2BGAB%2BB/uhHP9qL4sbD5yeffPLRRx/dc889ly5d2luizhIo%0AgRIogRIogRIogRIogRIogRK4fPnyV1999f3vf//BBx/c0rjBLxxifmXyJK2T55ZdPSVQAiVQAiVQ%0AAiVQAiVQAiVQAiHg2MjnlwyScUacNHzy46D//Oc/CeW7bZNQUQIlUAIlUAIlUAIlUAIlUAIlUAJ7%0ACTA88utpGSS3v13oBsPn559/TsX%2BnOderHWWQAmUQAmUQAmUQAmUQAmUQAlMAg6PDJL/wfBJKOvL%0AL7%2BchapLoARKoARKoARKoARKoARKoARK4GQCDJJOlDPspE8%2Bievf85ywqkugBEqgBEqgBEqgBEqg%0ABEqgBG5IYO8gedLwyah6w6INKIESKIESKIESKIESKIESKIESKIGFwHacPGn4XJK7LYESKIESKIES%0AKIESKIESKIESKIGzETh2%2BNzOqWdr0KwSKIESKIESKIESKIESKIESKIE7kMAyVB47fN6BaPrIJVAC%0AJVACJVACJVACJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVAC%0AJVACJVACJVACJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhOoMPndRZVJVACJVACJVACJVAC%0AJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVACJVACJVACJVAC%0AJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhO4J7r8vwVf2P0rrvu%2Bvrrr23F1sX2mvxGPe9C%0ACltsVraG4Z/xWz0DaLQNOLMnlU8u62lsRPpa5zibsAgjt01n5e0p6blwSiFOiEx8xEyM3p7urbk3%0Afol0GxuRXITtsBFxzrCpjVx6bQPwGDPj0Ti1BNx9990n1Jk1q0ugBEqgBEqgBEqgBEqgBELgcMOn%0A7%2Bt5id%2BOoBzpRLByRV76T1iEEUxA4iPinNWMT8yZhcVTOWJb0KNYhGvexAfEo5g3j7ayWyrMRm4X%0Au8TM9JmLTiQi7RRYxTxKukezQo4iUlxPqiUAMWPQLv3Xdv/veY/uNBYx7LSzLBq/Hk6Xo2WbAEt5%0AmvRZP5FLhW5LoARKoARKoARKoARKoAROIHC44dPXd1/ctYyaCJYiW66LU%2BvbP5aPm7BTuNUaTwrb%0APG2c8ewVJ4fNgjP9hKzlyC12u2bB%2BTh%2Btrb30Sgys6L1zxYcxZmnUGSbgAQjEqMgBsEyOAEzBX3K%0AlSLb%2BFwGkeW/CoLxmOJlFrtU41RPspaAvVuzTNFOjx3xI2L31qmzBEqgBEqgBEqgBEqgBA5D4N//%0A/vcHH3zw4YcfXr58mY6XLl36wQ9%2B8PDDD99zz%2BEGvdM/6eHu5Nu8N2OiQOBBsECGZetCzwfgXZ9h%0ADCeWxZGeGaMTS4X4CYueYsZM/169N3hbeW9YnIis%2BaQ4bUpBlw9IDNvcR03wdOY0Ii2m4NQu1reI%0AHhMNThgikVzGeCM9WiJzdJyYvVJhG2yYl9ECgTU9Znk97oYQV/wE42SLiFNxGpt0g7dFuA/19atP%0AU7YxJVACJVACJVACJVACJXBrCXz55ZfvvPPO22%2B//e6773766adL8YsXLz755JNPP/30U089de%2B9%0A9y6nt3F7/eOs5RJHL/5ff/2Xv/wF/yOPPLKcnmFLNbJ4cXexZeZEY1lHza4tnKnvpOGYwaTB%2Bta3%0AvqXIkWKmRCsIUMzKx3mW3GxTJJ69YmnhFuviERGxVGCbB%2BG50No47aslPmLqq9Wv/Sf1cdjCYGvu%0ATUzYjDR%2BWk5de69x7fDqf%2B2%2BOLfpeq7d/ep/r/1buI4r1WjtP4C9uI6rv/caS3AeCkG7ZUuwfvp6%0AywScULxHJVACJVACJVACJVACJXALCfAi%2BtZbb73xxhvvv//%2BDcs%2B%2BuijL7zwwrPPPnvgF1c%2BjOVu%0AP/nJT3xvzz0PN3yCiYmCxohMm1999dVu9jyaQtHL1EQwmDJjOHbG5kiUE%2Bhx2u4%2BPB0V0xmPYtY5%0AzjNT9tbEmbXMVORyRBeXX5s8r05iEHvt0ppSAWij9DX9apvdf8xNgEJnwo67idUSrMiWUvFMHaeP%0Ak61i3iSU8u8k1/NuARVhTU8tOLtEb%2B%2BTI0UsguB5aq4eNK231ZaH6rYESqAESqAESqAESqAEbiGB%0Av/3tby%2B99NJ77733H9V87LHHXnnlFb4X9z/Kupng2z98Zi7ild2hApvh08kTy6mRCF70WRkwGDtd%0AeBBYT%2BGCiA0mnYvfgUHLUUSy9oqUWqrN4JRahFtsZqqIjz76CD/fkP3ggw/mMRV0zErTvR5OKeJK%0A5Tm2ecnkKnQmS5HIsFUkNwEInLFTGENBhDbClARna3ftfIQ8Bc6PP/4YSwrfyC4i/w0suOy%2B3E3n%0AXpvICB%2BZy%2BDRmZo6tXur1VkCJVACJVACJVACJVAC50TgT3/6E5PnJ598cob6Dz300Msvv/z444%2Bf%0AIfcMKccNn4f7mU8uzVt7LINERlC%2BZTmD6GeffYZmEeBcwbcpX7hwAUu6i6nDOswGeNAZEiLinJ50%0AN2tajvauma6enpkyq6k9RWfxUCyfDmcKMnX7sFiejhhHIAISQzW301ok9RGpTxfAfvHFFzipCUMS%0AU5ZqySIFDXks/gceeCCXUdjRC2AjFj9bjiyiUMdjwLRHtXaLGK8x73/07%2BDat2RfC/wfHopb8USk%0AzHsSsNxHTxL3ClNiieECqUMLNUJ9mpp7G9VZAiVQAiVQAiVQAiVQAmcmwOT54osvMjWcrQIf5JD%2B%0A2muvHWz%2B3HvPww2fvLt7AwTv9y5GCwhimSgYfq5cuaJ/RjqaMnzef//9eQaKOHgQz3gQPyJbRbaJ%0AIdeFBxGbgIjkzlJTG5lqlrJmjuLkqhxhM1Cl%2Bxw%2BcdKCp8OySI%2BIU08sKS7p2UK20PMCTGvEp4LX%0Ay5UQRFIEP5F8GCte47XexERKufUO88gA74OO0J87zxRjsN6fmy/LIyxZ3JP76OGq3nNbNjdcGnkN%0ArTE%2BHVph8WxtarzaLLRiFqwugRIogRIogRIogRIogVtOwO%2B2PfPk6X1I/9WvfvXb3/72kN9/u6A4%0A3PBp4zntoJ0xAPH55587/PhO72v9fLknkg/xKEIAyw%2B%2BqDBj5rPh9yiWLNNTZFfpyKlHEWsi21RQ%0Azy2epeziYavHXg5XWp7IXIQDFWMPz%2BVDOQiRS7t0zHSEB%2B0WbZ0UpyBIsSz7UocWZmFd2ytZh1yE%0A9W2B9Saxudi1Ykf/xZll8dj4l3izDJv35%2BZ5hImLm8gKp6y8p2XpYsFYRfw0mjfRnwqcolOKUzwp%0ANXOnTsGKEiiBEiiBEiiBEiiBErjlBHjzPPN32y6X4fNPSr3%2B%2But5SV4Cznt70OHTV3bGBsScNPjA%0Ak4lCD2//PDM6L/1BQ5YTFIKF3%2BAwwhm9pLvd5V0dQdXTk1xEmm7rxGO8TZc6OlPQU20eXGGMAxWP%0Aw9CFZdFlNnLr0WINs/jRuHltObzRxSMfalbG46k3Id7L8OXIJ4rGY003QO2VcrEZMJ833c2dWd5c%0Af25y7frr8Mn1iKea1yOeyNzTUoudW7tMy6lLnpSiOB4q%2B9RuY5fcua0ugRIogRIogRIogRIogXMi%0AwO%2B2Pfk3DD3xxBO//OUv%2BfOeXIA/%2BPnqq6/%2B8Y9/PO4ylKLgc889d1zAufoPN3zyEs%2BTTOvMg2Wu%0AwM/y1R%2BRSAcD/HiIRDBy7GKPglnSmSnWwZ%2BAhFnW9FidsQiWKYtdCnqa1hYkV8%2BuzFWTGB4BnQfn%0AWYjgGZ2s8rAOPxzNC3iqZVJixWMby87hjbJs5aa1smXJyk0iOOKGZKU4Hpdd5q1SLcIYKrgoe01e%0A/f8FLLXEk0WYd8j9EdwfJ8JTLIkE45EAIqWobHeFjaI9mtYA0iXJER4KKuhlLls01tZqtl0lUAIl%0AUAIlUAIlUAIlcN4E%2BIzqjTfeOLnLz3/%2BcydPwhBsTxg%2BiaHgM888c1v%2B/ufhhk%2BeMy/uiKxMFzLN%0AuOJswFa/W7IcRRBzNkg1hPFYU7Q6PZ3Bak5nosHWj001K2tT0Apza5FYj3y6WJ/OCcohKqOU9U1P%0AayclhiUSWQ5gVPaSOrXUzMJjNcJmfZwzBW0pEglzpbU3We6TggQbaQB1XNZUL7mmpCwxuYw3z%2BTM%0A1lNaWJBcRO45W1MwWwU2XdCU0uMFYIgHq5P/EVKZI5wsq5nOlhjD8LhN5YoSKIESKIESKIESKIES%0AuOUE3nnnnRv%2BPc9ljFy22ytRkLI/%2B9nPtkfn7Tno8Ll9GN/v43e00Kmd7/qcssVvmEdsXY4oags6%0AXRBmpE4Ckm4wW47Q2hmfRJ1uLWu1JC41c6ow0XZpirC1RdCzS1I4jZ8ZiV8FZK/ZIsEeYbPAgqaX%0ARcLEpt4hwWzxE2OY1uK2MyD3QXClXfj%2B4TPdTaQIKXuLz5vkA0/SWRx5ajqaCtx59qUsfi%2BJno3U%0AsQgic3PhJJ6tpaxmqeTaejnitKsESqAESqAESqAESqAEzoPA22%2B/fU5l/8uHT1/ZtRBERDNFMGPo%0AjJUyw4AC68iBYCRwKrAIljCXHlMMM1KrP1ls0Ys1BptE60xP9N50nbOjNdN3EUTy%2BEsXU7QeSYnH%0AZN7DWoQABEfEIK5S2P3naG7bTZ5Yjoi0ThpZISluZ5hlvcO0qUMAgyLWhd%2BwVEZYH5EKBFtBMVMS%0Av7v70djsI1iQSBJxXu13rU76WsqtLaaep1SwDsO8kXpwgje3RVhBgfYofmvWlkAJlEAJlEAJlEAJ%0AlMAtJ8Cb8LvvvnvLy1KQsrzG8yZ8HsVPqHnofrmKb/zT5ijCV3xsFrMBp84DCPx4sBlR3OIxLPWX%0ALHP3Wpwuc9FTuL0a8f9nV5z2XWJmMAFzJSVPFEGYiXqwfsZoelokHuERBFxsr8mj/5pCGMvK2Bkw%0AKxtmZOIJMDGnGQIVibTyvMDe4mTNFGNmll9WLpl0KpOCx1xv4q1irelRrIlanfBkoSmV1gSkF8LI%0A5CJY%2BBW1JVACJVACJVACJVACJXB%2BBD744INPP/10W5/fMMQPdubba3/605/OGLa/%2Bc1v9PAjo2%2B%2B%0A%2Beb2R0Apy59v%2BfGPfzwTD6APPXzyNp%2BnUmOZuR0z0L7x5/1egc34ZIBFHEuwrO2gkvoIV1pHbBt5%0ARDziWt7VO%2Bs0YElMwZm%2BOElZFgF4ljC3009fBiSekWHJUz04eWovaalZf0fluuHIyBl//Xgz4BFG%0ATa3Fba0Tv%2BMfNiPcrEy7k4ubbopdfGQTYxHR8wIUN0ubI6%2BXS8760Qi6G0MdW2Atsi2of7HEnzJy%0ASey2BEqgBEqgBEqgBEqgBE5DgF9duzcsv9t27%2BkPdytHTKrPP/98thEU/28ePnlTn%2B/3bLMcYJxV%0AcCYMNOo5aRAgMo5YZmG3wydhaWGW2xA3AEudWE/xEKw1V39OZ7zpeNIl2niDCXPNrXqGLR62lAUR%0Ay7BsdQoHfa381WfJdgpyXXbxSIYJs6O99lor0BHB5EkimiJY42fZvcVJNN1S2pmbyyByB51siY9z%0ACv3a1Dc%2BLfCzdFpcO2smeFt8eqpLoARKoARKoARKoARK4PwIXL58eW/x/G7bvaeL87jg44ov6bd2%0Ae%2BhPPrm9b/m%2B3zsJoBGOMUwCBmTSyAM7ZVnBgcHBRpvhk62nRtposTlKZLpEcORNpgeN36XWGhm7%0ATbyWdPTfvUXinGXRlGKZ5eeceerUTApi0W5N3x1eD1jS2VLZeDoanMSI3XWuXskpzjq5pBWslqv6%0ARbFIKpCO1iLsmL7pOD0659HURKY4/miLu7Wanr25BqSUIs6KEiiBEiiBEiiBEiiBEiiBsxG4DcMn%0AF/XVX%2BFIEJsRNM/DhMAyYObidKRx7JzDJ2GczvqZcKzj1GQLPAptEpO%2BnBKwLCP3xpu7xLPFr3Mr%0AcmrufHCunVJLImEpaGKsFThVYHMUYTpbuzuFZqvT4OOKWMHixM8vDdqtdVKBbbLizJXSbnb3SvFE%0AJCt1tsKYmUIMTixgWUtKalaUQAmUQAmUQAmUQAmUwOEJXLp0aW9TvmP2uM8zt/HHfe/uccW3FW6h%0A59DDp6/7PIAv%2BhEOAJ565JCQUQHhqSlsXQ420147uT58MlcQgDUXm6XTLfXJnV3wZ4vm1Mi0jnMm%0AGoM11%2BBpzcKzFQlLkdQxePoXTTs7KrbWUnnk2Qtt/OxiwPSkI8Gcuk1YIvVk4FRoicnFCMsXJbfi%0A1LIKu5iiTtO00zNtikwn2joRbOnL0j/tkthtCZRACZRACZRACZRACRyYwHET5quvvrr8wiF%2BzDN3%0A%2B/vf//7nP//Zrb9wKEdTHFd8xtxyfejhc3kAXvfxzJf%2BqR02MnJEWIQti5HG5VYPdjZyi13azakj%0AKRHeJHXwE08vA2ITn0i7sN0e4eRU/1akwnHCK2kthVYkZcYczVW7D0tx0tQjPAbj4XGiFVtPKi/C%0A1jgjDKBsVr40csOfGK9hJM4cLQW9M6cRVmA7U3TmyCKmnGC5A6fYCLdLyixeXQIlUAIlUAIlUAIl%0AUAKHIfDII49cvHhx%2Bwtv%2Be218xfY8rtt5/DJ5PnrX//65BtS9uGHHz455jxOb%2BfwySs%2Bj5QX/UW7%0AdcDYO2bg3Lv2YkqXCEcOp46kUDDaC3hJGzFBJR2R4AhTsjVXZ8pyGv8Sn5gp0tELz220wmpx5gHx%0Ae6UcIXQ6HOr3B0rRGRTJcu29z6ymnmHbxJxyRHy2Uyx12BocwUNxvZkytelYv6xTeBQmEXybd7Qx%0AFIyYxRdNzOLptgRKoARKoARKoARKoARuIQHeVJ988sk//OEPt7CmpSh7%2BD/ySevbOXz65Px5U39c%0A063v9L79M3jo3Fpnm23AMhJYZ7EOG04dObLFUnBWmzMPYSbOeLV2Ji7PNcM4YhsPwsFPfxK58JyR%0AvD8t9k5NcSpIJNIWeMyy8lHj3Z9IxenK/OlRptDtfYhPI7U1Uxnn9Gy3eLbLFPxLHTy080uA4HoE%0AeMmlizXzpLNFnDBx4XFZH238co3ZoroESqAESqAESqAESqAEDkbg6aefPo/hk7IHe4TZ6DYMn/P9%0Anqs4/3gn3v4ZMBIQ4akjR27PqelYI/XMAP1XJ4wxwjF74MQuibPFrIbfSIuzjQeRjgj9WrazCDr%2B%0A1DFFyym3wrqMISv3985ufQRvpSXedFMIoA5OtpYyMcGchrZOLB6WR1bzMpayGmGWwqqxtjDMrelo%0AtwbMCvitoziK29XRJh5BGLeyIFu7TGvwrsCRITJ2CnW%2B%2BorcgVOX6eh5h2j8oRFnRQmUQAmUQAmU%0AQAmUQAnccgJPPfXUo48%2B%2Bv77759QmR/snKfLdh6pKUjZrf8AnsMNn77W563dLU/oqz%2Bfufm0%2BrH4%0AM11ETCI4GUhmJBqnK9WokxlDQZiCz5rRrlSmpprEOK3pB4N8VMs2RwinNQR%2Bs6jJ9lrt6zOn/uTm%0AqvjVWFEgZhGfggtzc6wC7eKUlQo41d7BJ6KaYQiWt%2BWIYDryUDgJsDt%2BlkUizLJmSiGOyu0W8ZwS%0Ar%2BXIYA5zHzxx0tr0RHKk3kUd8cyKh2po/Fh7oXXubnFkKMJyG6FfexxDg%2B2FJVg9RdolrKIESqAE%0ASqAESqAESqAEzoPAvffe%2B8ILL7zyyisnFH/zzTefeOIJf4EQv9uW7QnBHFGQsifHnNPp4YZPp4Xl%0AMXjXZwKZTjxEshCMFtnicQDAoknRsnU6isgRgnT8DjnoCLRbThHLBdxyFD%2B9bGdN9c539RPRnCJm%0AInq7Zlm0KVbDckmfiCNy7ehtOWJZEA9iWrYhZryN0JZCsEzHY0cnap1oAvR7B6wCp0W0trZaPNbk%0ASA%2BJlsVaMwGm%2Byy5EjHJNdI6%2BClFcNIRWRypk4tgpSw60HYnR1sWAQqdWOpMbVlvlbshpl9dWwIl%0AUAIlUAIlUAIlUALnRODZZ5/9/e9//9577x1Xn18%2B9Pzzzx93uvgfe%2BwxCi7Og20PN3wuL/d5y2cG%0AYPLmnZ6FU4szW4cfiThRcMQWy7CENcD5xK3BtsiModDp1OEEgod4WyMyzBBvHaxl7W5wZjaEYcQo%0A0gJhSmwqGJle3oEKLvwsNGEz12vnY8%2BIlLX1vAYe65DrfRKMny74eQQWp2g8pNtdSxinWBZHtqBI%0A9PQYhodcF5EI/fNi%2BLm/uVrrE4PAkxTSbWc6mlO1MQQsldmaYjA2wl48aT783GJMNQV2dlTHk5iK%0AEiiBEiiBEiiBEiiBErjlBHjt5JPPX/ziF5988slNFn/ooYcodRvfYw83fIYUAwOTgBPFbii4Pnw6%0AdYCDhSYFQYy5BqudOvAwF2Gt5hBiPNZGVHC6wOOiAsLxY9a3MgUVBCiwlKI4S4HF6SXRLI7YLk48%0ALJtSjaUHa6S9SOdoV%2Ba6ybxn8NWrX/vPrtj1X9OK2zDyvS3WpYdTuxtpMAG7Z7r%2BrctuTfRhSUeQ%0A6308In1ZFufUB%2BDU7%2BNFkI71GgSgsV6D/9OBLTr%2BXCDXRlgcYS5fTeLnCiucxMxFcdZ8dmN04mft%0AQq5%2BIDxz7ahntqsugRIogRIogRIogRIogUMS4M%2BiMDS%2B%2BOKLvGOfuS9v0S%2B//PJt%2BQsrufP6Hp%2BD%0A8xC%2Bx/Ou70DC1hmAt3y/7ZifjnWQ8Ai/12ALLNP1eIQlnsWXgZpUw5OyeNxSnOWMQbqReKiJk/jl%0AYZM1e5HFsiOWRLa5EnfA6TBjukdYnLNX/IRZHw8BbJdFfcvi9/JY7nzfffdZ0HYeUYRqRFqfRD3e%0A2Tt4RDyRaNsRgAfLMosW8yb43QqZrZXtmzuEFQFUYPHVJIUw08kimC1dvABPgcdbJZ1TFkXwkMgp%0AKYRRyi2P7wVMMYx4stLImt6Nm7i1FJGEUXN3xyPjrfCwjLQyOi3sMj1eZgZUl0AJlEAJlEAJlEAJ%0AlMA5EXj88cdfe%2B21l1566Wyff/KZJ5MnRc7peqcse7jhkxd339d9v8fy0u8YgOC6aqcILAunwYpY%0ABIv4LMcVUmZ8GjlU7IaLqwOGmgAEpRC7kkeGaUQd5%2BxCPAG0YxZi2YIAgzlloJrFnRLx8IzEIEwx%0A/sKFC%2BmLSKOIOBEWcViiWoTtUicQEBxxAY/SF2eCaWQYlprYtJ5aJ1NfThHE29pnSU0TsbTGsgjm%0A1DAtiQjtkm4LsoBsgJWdOQl2pR3CFD2282Kpj%2BB0bg3gEbJyap15Zz21JVACJVACJVACJVACJXAb%0ACTA6/u53v2P%2BPOHnP/dej5/z5IPT2/uZpxc73PBJP8YG3umxvvozJ/Dqr9%2BJwpEDp%2BOEA4ABCUO4%0AErMITymIsJfFbbp4PLpa8Zj/pD7B3DApijjJ5uYZPjPVKJbu3m029GHTK8IYe1GEalpFyhKQapbC%0Aw6l1PLWI1mBODeO5WGl6gkiXbbXUtNRSkFNStDZNhdS0L9splkSzkjKD1bNLWiCgka3cYuNHzHbR%0A3AedLUK2O19NCZRACZRACZRACZRACRyCAAPk66%2B//tZbb73xxhsn//0Vb8NfVeF32/IbhnzLPcQV%0AT%2Bxx0OGTm/jYvMozO82L%2BfbPuII/Q8s2IBUQzieL3aZYGZvZI8KjWdOyFuE0W7uQyMdxKRiBMynL%0A8Mnnk2RtB0WLmxVLFzvOh0pl21HNta1pLqekE5wiswLaOjqJIR7gZkneOqajcS4ec7GWwqpJmZHz%0A6%2BjRTEmu6SbO9HgSsE0hxrC0Zmu8wW5noprnRWDnwkM8nhRBsCjuUYTO3WFNCZRACZRACZRACZRA%0ACRyOAO%2Blzz333DPPPPPOO%2B%2B8/fbb77777qeffrq0v3jx4pNPPvn000/z9zzzjZBLzG3ZHm745J2e%0AacSXeO2cP/EYwPt9pp0QmVlqhw0CEHMlBUHkDZdhM2vRFMdjCy6WWYXKaL7zFssPNzpoofnuUGN4%0AOtYyfM77LI3c2igdFVgStRS3tV3cWpYA1qTh5fVjE2Y1T7EUmVkpMsX2i2LBWdb4ZKVm/AlebrLc%0AJxcjPssUI7U5Oi6egCUrW0XoRehP5eMEHYV2XED9JVACJVACJVACJVACJXB%2BBBgpf7ZbfAz2wQcf%0A8Oc9L1%2B%2BTLtLly7xBz/5gJQx5Py6n7ny4e7E%2Bzpv9s4JvLg7zDCe4XTraEdAVp4qIwEiTsLQBk%2BR%0AgJmlXjxEzoJJ3Aq7JN0At1yexRTqffzkk%2BfCeTR97tYu5MiYYlPt7JUnwjmfi21SENaZ1XCyzFKY%0AYkG0y6MlgO3sNe9A1glHnM6C6qTPROvkDsmK8MiwVEiWYWwRau3MSnCciYxIhXgQrIWkF/DIamic%0AeiL454on7SpKoARKoARKoARKoARK4PAEmDZ%2BvFuHb32GjocbPr2cb/BzzsTjIMoMwJs9i8gIdF7x%0AFdkmcom3URKTFbE9SspWpAuCG3pzRJbj5ZUrV8zldwgtR9lyAbTd8xRLx7TDP7VZybUU1pXTJcUt%0Ap1nER0cQZqQW/yKOjq99XZKFsNpSc0bu8o6%2BoFkzZWoClsSkKGbwCR1n1jYlninQy3beJEfzGrNL%0AdQmUQAmUQAmUQAmUQAmUwGkIHG745CXed3qu5Qu995sv984qCZsPsKTMGPX0JHEWT9/FmeC9wmCK%0Au2YRjhgm%2BaT729/%2B9g9/%2BEOOvvvd7%2BZnPp05GU0VBM%2B1t5dOGk2RLen4LRIRpylu1Vt7wqlH6RVB%0AEXU8ERylYMTJ8V4pwVOk7FZsGyXRgqdJSZHkKrARVtPqnJ5F82VN3%2BWo2xIogRIogRIogRIogRIo%0AgS2Bww2fszdv9ry4H73170Te432bxypMISa5U%2BOcYVPvjU9uBGFTJ2sKyxKGUGvxsPwglJ/oZew0%0AS78DZyxOtEc3bGp9q009E5dSbI3HkpItIhXiTGREwoyZFSxoZEolUbGtnMiImTLjpyZmxk89w6ZO%0A2RkcJ2IGb3U8ETN30bSYYcd1XLK6LYESKIESKIESKIESKIESkMBBh0/e3fPKzjDmd9v6Qu%2BRmpiE%0AcUude79gOSI%2Beomc/qkN23qW9GXLtb0bia48SO7gnLm1lDJlqblsicGTLsspWwO02SYs/r0Vcpr4%0AbRgxOo0xBc82N0UWkchZJzE5jSdiHi2584j4bA3LNqWm2J7GEzFrztzofKERy90SU1ECJVACJVAC%0AJVACJVACJXAcgYMOn1xivuvzEn/cteovgdtIYP4rzTUYOPV38gyTihIogRIogRIogRIogRI4PYGO%0Af6dn1cgSKIESKIESKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fV%0AyBIogRIogRIogRIogRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BDp%2BnZ9XIEiiB%0AEiiBEiiBEiiBEiiBEiiBMxLo8HlGcE0rgRIogRIogRIogRIogRIogRI4PYEOn6dn1cgSKIESKIES%0AKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fVyBIogRIogRIogRIo%0AgRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BGwyfd999g4DTd2pkCZRACZRACZRA%0ACZRACZRACZTAnUBg7yB5g9nynnvuuRPQ9BlLoARKoARKoARKoARKoARKoARuFYG9g%2BSxw%2Bddd91F%0A4/vvv/9WtW%2BdEiiBEiiBEiiBEiiBEiiBEiiBO4GAg6RDZZ732OGTCEIfeOCBJSGZFSVQAiVQAiVQ%0AAiVQAiVQAiVQAiWwEDhukDxp%2BKTEfffdd/HixaVWtyVQAiVQAiVQAiVQAiVQAiVQAiWwlwAjJIPk%0A9uiub775ZuvV8/Vu/Xu3joupvwRKoARKoARKoARKoARKoARKoARC4Fu7xe8cWn7t0Em/T4hPS1km%0A/O9unTCpplNFCZRACZRACZRACZRACZRACZTAnUaA4fG7u8UIuRslj36L0FwnffJJHNOmn39ir1y5%0A8tlnn33xxRdfffVVp9AJsboESqAESqAESqAESqAESqAE7kwCzJn8btsLFy7wC4P4btujjzt3C/8C%0A5AbDJ9GMnRlBEaylRLclUAIlUAIlUAIlUAIlUAIlUAJ3MgE/6szYidjSOOnbbo0mzYGTcrvZ82j4%0A7Ai6RVlPCZRACZRACZRACZRACZRACdxpBPyE0%2BETy/yoZ8vhxp98muPY6czZyXPLsZ4SKIESKIES%0AKIESKIESKIESuDMJLPPncRBOO3yan7Ez4ri69ZdACZRACZRACZRACZRACZRACfzXE8jkecMn/c%2BG%0AzxuWa0AJlEAJlEAJlEAJlEAJlEAJlEAJbAns%2BTHQbVA9JVACJVACJVACJVACJVACJVACJXAzBDp8%0A3gy95pZACZRACZRACZRACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q6PB5M/Sa%0AWwIlUAIlUAIlUAIlUAIlUAIlcCoCHT5PhalBJVACJVACJVACJVACJVACJVACN0Ogw%2BfN0GtuCZRA%0ACZRACZRACZRACZRACZTAqQh0%2BDwVpgaVQAmUQAmUQAmUQAmUQAmUQAncDIEOnzdDr7klUAIlUAIl%0AUAIlUAIlUAIlUAKnItDh81SYGlQCJVACJVACJVACJVACJVACJXAzBDp83gy95pZACZRACZRACZRA%0ACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q%2BD9kSf0dBz/9NQAAAABJRU5ErkJg%0Agg%3D%3D%0A\", \"frontend_name\": \"collapsible\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAGhJREFUeNpinDp16n8GCgALlGYkU/9/JgYKwTAwABaIDK9fv25gYGCo%0AJ1Jfo6ioaAO6CxoYGBgaidEMVYvVC4QMQdGMKwxwGYKhGV8gohuCVTNKIOIwBBsbuwGioqKEDBnk%0ACYnsLA0YAIp6E64EMj9YAAAAAElFTkSuQmCC%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert collapsible block\", \"customization_arg_specs\": [{\"default_value\": \"Sample Header\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"heading\", \"description\": \"The heading for the collapsible block\"}, {\"default_value\": \"You have opened the collapsible block.\", \"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"The content of the collapsible block\"}], \"backend_name\": \"Collapsible\", \"requires_fs\": false}, \"Tabs\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAAFgCAIAAAD8SbMaAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zNTI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjMxPC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4K6FkWAQAAQABJREFUeAHsnWGTXEmSVbvVPewu7IJhGBif%2Bf%2B/ic%2BYYRgGBsva%0ATEviRJzMW673slKpklRSSzdG7eXhcf26x30vc14oq0q/vn///peOKlAFqkAVqAJVoApUgSpQBapA%0AFagCX1OBN1%2BTvNxVoApUgSpQBapAFagCVaAKVIEqUAWWAj189j6oAlWgClSBKlAFqkAVqAJVoApU%0Aga%2BuQA%2BfX13iFqgCVaAKVIEqUAWqQBWoAlWgClSBHj57D1SBKlAFqkAVqAJVoApUgSpQBarAV1eg%0Ah8%2BvLnELVIEqUAWqQBWoAlWgClSBKlAFqkAPn70HqkAVqAJVoApUgSpQBapAFagCVeCrK9DD51eX%0AuAWqQBWoAlWgClSBKlAFqkAVqAJV4PfHJfjrX//6f//v//1//%2B//4bx79%2B7xxCKrQBV4UIE3b978%0Aq3/1r/7hH/7h3/ybf4PzYFZhVaAKVIEqUAWqQBWoAlXg%2B1fg1/fv3z/S5f/6X//rf/yP//EIspgq%0AUAU%2BXwFOof/%2B3//7f/fv/t3nU5WhClSBKlAFqkAVqAJVoAp8Dwo8dPj8b//tv/3zP/8z7f7jP/7j%0Av/23/5YPZHgy/h66bw9V4AdTgO8p4DsL/vf//t//5//8H7b2r//1v/7P//k//2B77HaqQBWoAlWg%0AClSBKlAFfk4FPn749DNPTps8BP/93//9zylTd10FXlmBf/mXf%2BEvfTiL/of/8B/6%2Becri99yVaAK%0AVIEqUAWqQBWoAl9DgY98gMmHMH63bU%2BeX0P9claB5xTgL3r8zPN//s//ycvwOVjjVaAKVIEqUAWq%0AQBWoAlXgz6LARw6f/IYhdvJP//RP/czzz3JF2%2BcPowAvOl56fPjpy/CH2Vc3UgWqQBWoAlWgClSB%0AKvBzKvCRwye/2xZdeAL%2BOdXprqvAt1XAl54vw2/bSatXgSpQBapAFagCVaAKVIHPVOAjh0%2B/36//%0A5MNnqtz0KvAyBXzp9dtuX6Zes6pAFagCVaAKVIEqUAW%2BKwU%2Bcvj03/Ps77b9rq5Zm/l5FPCl58vw%0A59l1d1oFqkAVqAJVoApUgSrwQyrwkcPnD7nnbqoKVIEqUAWqQBWoAlWgClSBKlAFXlmBHj5fWfCW%0AqwJVoApUgSpQBapAFagCVaAK/IwK9PD5M1717rkKVIEqUAWqQBWoAlWgClSBKvDKCvTw%2BcqCt1wV%0AqAJVoApUgSpQBapAFagCVeBnVKCHz5/xqnfPVaAKVIEqUAWqQBWoAlWgClSBV1agh89XFrzlqkAV%0AqAJVoApUgSpQBapAFagCP6MCPXz%2BjFe9e64CVaAKVIEqUAWqQBWoAlWgCryyAj18vrLgLVcFqkAV%0AqAJVoApUgSpQBapAFfgZFejh82e86t1zFagCVaAKVIEqUAWqQBWoAlXglRX47g6f79%2B/f2UJWq4K%0AVAEV%2BFKvPl7DfRn3pqoCVaAKVIEqUAWqQBU4KPD7Yf6aU590f/31V5zY12ygtT5JgXky4Xp9Um7B%0AfxIFXnhZbx41E3wh6deR7Pvs6uvstaxVoApUgSpQBapAFfi%2BFHi9w6cnTHev74EzR5qcPxP5fKle%0A54x0p%2BHXaeDzhbrJcGdf56XX3%2Bm5h8MuXr%2BlQwN/uil/pbBVfdlpMce6ue9FdVz49ZeXFZi8j/ir%0A7ge1z5MPGunfqDyiajFVoApUgSpQBapAFXixAq90%2BOSJdp4E8A8nh0zjvHhLSZwVE6zzOQrk6lTb%0Az5Hxe8jl29v3UXNZxz6qfXA8e7zPO2lX%2BsfJvgxyb%2BeJ6rkOv1V7T53VqwJVoApUgSpQBarAT6PA%0AKx0%2BD2eVnGHiILgYIgfwzWsxEwU8knWTqsFHFDgI7vRbaX5o5pH%2Bi5kKXE%2BenMj8a6D9WeT79TGh%0An0rePKqdz2lPsCdv1ll0WTmnfwj9yCw84h5nuyau7V39xSHD%2B/ExLKuP036k3S5XgSpQBapAFagC%0AVaAKnBR4pcMndTkwcFbR2oZHiEScijz1uQIB3F/NiSjMN/EfDT6efqexx0lu9vOp6dn7TbaPBg8b%0AcTrtZPBqEjkXPUdm4k3/UPrFmJkI5/1O7q9Oqh/M99NOtr9lXzJcfs8XxzP8d%2BuMNs9pTDmVsXQc%0Al%2BPcxh8S1o2xXrQ7Zbs7XQ6iY3Zkvc4vjB8QXzMNymaJbT9Msb1lV/zSy5WdrwjArhbJOIKmtUE%2B%0AcupWgSpQBapAFagCVaAKvFSB1zt8%2BqB/fd699JuDzTx7gGGAmMH4cQ5bNsWs%2BMGcI1nSuUl7M3hI%0AZHoHRt2s3u8hsAP/zfhzVDfBB8KPTkOig40zc%2B3h0IlT8RP8Mv/Ac5iGc8ZnP/hZmvGbiQk%2B7oST%0AKtZK5HGSb4jcn38i0bqBPZgte3F/eWdo98ercZ/e9nny2vElhentkx0fqrK2T3aryJ7u2ZVgZ67I%0AM2Olb27X9/QpdEjcxQSaA9ytUHu3qrkQ2siv63PPdabeZFfGHQGXghdaYPt9KdM6VaAKVIEqUAWq%0AQBWoAp%2BkwCsdPnkK9Onc5pgyzn5az%2BohkngcAD4REjk8GqZinLA950zaM%2BbALyApcZKYuiaeAUHG%0A%2BSjmQHWzpbC9wEkDOPo68eV0a6meKbAEX1CdFAvN3BmZvphzxLgt4dtPYJ/Z3rmxSWiVGZn478en%0AT5r0JLUOWR609ld%2BFPT9u8tHn75EOZP5mec6qO1z2vWle8lken01H7e4PlrcKYtkH10pgn858%2BFc%0AuI6JT%2BFrdyBSZXV%2BQayPLJldp4vHFfYIHv/ibD%2B310pZAqDDL2/2ZJ1C1/88iC6e3eacGqytAlWg%0AClSBKlAFqkAVeKECr3T45DFvPQnuB0HtfiK8RFxyByIvz8VjU0mfYNeNHBIP08H0rJsSZ8S5nwPm%0AnDsbYPWjDBBKMp1ZRYYHqWbiC/zZyTuOInvMxmjGfkJ%2BmBq/GQx5cu84AetkmpRzJEs4NAAgbcSZ%0AmM/05U%2BV2U%2BCn1niy6Z7hPPluM5Xl1PZ5aPOfbH3%2Bc34Qqzz3DqobX%2B9aPe4Hu3WKv%2BT9rq4szxi%0ALrvSF4MHUA90V05TVpU9Jj%2BB/R4BwQ5f1/jq6REAzp5eT40LYzMri4qcpN%2B/W7uz4d0EWastjp2m%0A7X/v%2BDpZlKvbjipQBapAFagCVaAKVIEvq8BrHD59Ekzf6yHwNLKqwyFhnhOAE0%2BSflJExq7MPQDw%0ANXY6yZWZaUq4lPhkmP6E2VhIXJpgfAkNCohNLZ1pgzmwpURyg8QRfHMpqxM/fbIOI4dP42Ggyps3%0Ab2JxHMBwhOGHfPoJ6pyXEtGJTfzAMKepTjAt6Z/TBc/0g39OkeoAO09J/Cj5OesVIvsQyAVaR7Z1%0APNslsXic0C6HtH1uW0sLtU5jS0kmntV2mNm7lbUU2izLcezrv7Drk899piOCz3yf99a5c3Ne8Ocv%0AlsZKukoAkn/3sEtwetxEq73r6ua67mJ9iMvhc1t8STaLnax7eJH89obPP9/T3Ju119Xzhu7Wz801%0AUgWqQBWoAlWgClSBKvAiBV7j8JnG1mPqdcwjDT6PkKyAvDxL%2BrDrA%2Bb1wfaaur6GU2c9gu4hw3W2%0AvoYT/5zIqsHYYHAO6Ytuk2BnIkhGIjgMMdMmuNefjLnMN80TT%2BImhipOAEbCmHgi03H1kCLAJSzD%0ACxSrEx7SGcA4f2qZ4geAQ5zgZJ6rN%2BOkBKOPPTvBHBzLxeKQm6k8pBgx1%2BCMzPiBP9OZZe6M4BM0%0AnpTvz9kHLPTe5zqPZ8jPCS2%2BN7V6oaVb4pLue3TliefLotl2rV0Oh4sf8D4fKsgvb0BtFuLrzth3%0AxzYfyLP4F%2BGFU8fIWrjyc45d3yW7/qymwiN%2BnTnXbfz%2B7f6zNsXh0yb3PUDOb%2Bum/fW33xbr%2Bze/%0A/MbeOYVaY2GWNJeD8gp2VIEqUAWqQBWoAlWgCnyWAq93%2BFyPfR8OzjMeaQy7j/UYeXk03I%2BU%2B6GW%0ACJgz%2BGbKSvtwCINB52xdsg1tMDDhY3Oywg/VISW5Yg4WniSGP85zVFbXQpgBHt/06YfwBY7tRed1%0Aecaww9mJkd9%2B%2Bw2Up1BX04%2BEh05m8KZvMBYnAyr8A6FFDaqPkfgHPAyR7rCU6awy/STiyDNX9V2y%0AhxB%2Bf85FR9SkbayfEHJU24fPdQRdQvPfOnauIxl2/%2BFMdslZpzuOZ/vTRQ9qC87q5Xy4Tp7vTN%2B5%0A%2B%2BS5zQ5iliyXu3i5l7G5KL//rOagXU2uwqsHzPpLD16VUKyPK/e48oDiI9m9nV/evvvl7dtf/tib%0AwvcTUdAkrt7e/JJ3QBp899sv%2BxxqV7vMldMKtVWgClSBKlAFqkAVqAKfo0AevT6H5NNyeYQcJ5qL%0AC4WPljy4Z4R3PXZ%2BePhk6ipgnKRwBIofR0DYDo5Uq8CHI1nweLIKIY4kH2asGXFsAKaEyqyzPfNI%0AFeQsHX/SpmJS7jiCzylpY16gt2/fOmX1X/7lXyz693//92jC4ORJHIe4znPk9gMmjekncnCYPjfC%0AcKjFNBH92KToCDv7E0Z1p3GYhl9ffgCJT7D%2BrDX5v5VvV26OHTLF3x8MvudSv33Pae3dOqetg9r6%0A5G8dG/fRcb%2B0Lgpcstar8vJ9rZtq7Wm/IIH5meewnBIvB9FNuE6oS%2BHD%2BU7R5V%2BNLW81yWEyg888%0AaYbX%2BvrckrXF/CSzWTT2x9v1sSf2D3a0fbulIgdWUn777dd379/85TcCUK5Wll0ffvL16Ztvry/3%0A1K9TBapAFagCVaAKVIEq8BIFXvXwuR4jryPHG842f/zxx1//%2Blfa5yTz%2B%2B%2B/e5JZD5PXhz6SwGsB%0AkwIYJFaMFgC5MqzkPQ4YpnOQwhR7HsLggNNVHKdhSJbt0RsOGDaSdKbxkxgHBnytJOE0yCoMc9iG%0A8djp4N8fsAGQM8hZl04YHjtz%2BDQIjER2ShsMpp4/4XGKlTzMcbKjg%2BP0pqUocUYc2JimxNwFGKY0%0AQEs6wvDTg04iZweA/NPOdFLOIwCW8LWhyup343jM8p/05ADG0W4dI/d3qP6yzmxv3//1j3c4NPzb%0Am19/X3Ii7Lr01%2B%2B6XblvVxaHVcC466T6F9AbtC3LS8w3v/36d39582ZdHM%2Bim2efPOGf12bV22Ox%0Ara724fP6ieWqsPB0cjk6/sbvp33/63qxEd11QaxEutrnZ3rj5PnHH%2B//tk7Ua4ObeYFI%2BYe/%2B51t%0A7KZoaTGsMygUqzf7ughlV7VVoApUgSpQBapAFagCn6PAVz98rme9MZgyPEhgOdgw/va3v3GYWU%2Bm%0Ae6xHwA8PMKaANwW7aRbzeuDcgyBZLnn2MC5G5ptWqlgZgoQEWgacWpA4Aswyxb2EBwC5sSE8O6QQ%0AnFQSGpfBNmJxGC4dLNPzkMoUVnf2hcFperA0lu1o3ZdxfJBkcsmiBhHPn0okwB5AyuxUPxEc/TjA%0AZsQ4pa2ODQAHcu3ayfbB48iAA964FnBGIjcB6QH89APGceROQw2Q3hgs4WMtN/008K2c%2BWp0a76W%0AeEntkx4nz3Xm5G9R1p99VHv7hoPc2hnHyn2yXL1zz7LIWY5EYH/7A7J1Ntyar0vDKQ4LZmVx0Hv/%0AjiOoQYR5undvCbG5LiVsjOZoj/%2BRuMnXh5a/v%2BMbZX99zy8LYtAeZ2P%2Bty/Z2gv38OptbYeT59/2%0AWXp9BLo3Bclf3vz6N37Kc99Hq6X1Ql9VoNjfDwwT0cVI4Hoxb7W7K34EcTuv0SpQBapAFagCVaAK%0A/FwKfN3DJw%2BRPJOtR8k9lFZ/PRruzzx18IPE4TFwPsyBIQvL8PzjVMwEGwGGk3H/ktpPuopDlgx%2B%0AlEqckwbB9Rh%2BHQFTUV9Lk1fIx7%2BSAggrSah07ME9TmucRJyDTUmZM52wZOnMHqjrYBcZRoSZQjME%0AiTg8fxJkCJh1wTjVMYXIdJzOoPwpHQeMVSg0B3Gmch7iLJ0HGILTMk2H%2Bk6TK9jq3g9EmALAnsHi%0Ak/7NHTbMUWod/i6Xbt94u28u5v6ccH%2BfKufJ9X2qnMX4Uchf3755u86Q67tbL3KRsT9d9MPSdVhd%0AZ09OgpdX3v6Ekxzq8NOVWx54dnoEvy2GdwrWBqmCQyO0wt98QAgpn6/uk%2Bebv6yfReUAuQqwL76t%0Adznr5Lnwy%2B5NsReOx39bbzjEF2a1xo7WX3mxLTqk8wWmAO9Z7O5y4db%2BN%2BVKunS%2BvA/H93aVP%2Byu%0AsypQBapAFagCVaAKfC8KfMXDpw9wWAbb1ZnWswTHG7%2BTlgc4Dxv7eXA9TeaRTmTwEroqGMsgjgW2%0AZ8tMkuckP7Q0pzB4psq3%2BMoZWsCzN/ykH8oRP0QyTYps04rxqIONs/a2BwC%2BHmyYdVL6gJTBoBj7%0Ad0c5duoYFEYKU5UhkmGEJfqcPQBgerBmGT8sJUjcuqmOI1gp3ML0jQDT0Z6bIcLSwQaWfnDiBy8n%0ARanCludmWbKZA5W5CX5D53Ibrk/zngZB/qAsp7v1aeHbd3zP7fo%2B1bfrqvHCQqp98vzw8MlpcB/t%0Alt2XBfDbBV7bveD356VcjXf7m25RnKWL8E/1P2jGO2W3dD1A7oPufmmtHJj3/cDrfU13qfW9s5C/%0A28fddc3WjkxfTfKTrLtVjqOcYKmwfrftL3/88ofHTj7wXIfVNd6tnwYle5GvbzDeva4ynzig%2Bn4u%0A%2Bif2XngVqAJVoApUgSpQBb6WAl/x8Dlb5lEs0/WINw4VnG14lMTuZ9Z1gATJE3we4jf8cggRbEQ8%0AlnTBxBOEBD8WR2acwzAOibRxgMFAkAOGtCzphMqUJAJgJJhCwROZvgAjWHM3xyLBEbDF4LF6HWwY%0A9hALBl%2BrY5b2UG4iZTARWAZ1c1FwHOnqgJ%2B18CGBFjvjMrvqkpHpuzqtGOtOS5wS0QGH1UzdVCyE%0A%2BFiHFfWNTzsxVtdekvcX8NbCetjGBqBvP9aa1QP7ho5iXHV4ulLctpdD2vohyf0R6PphTsLrUEcW%0Af5%2Bwfl0QH36us9n6j3uUT0rXoW4fQdclB8zv6tm/SPbNO1Lec%2BQkcUXWS2dBLoKP8%2BYH98oiufDz%0A1U8v17d6X3/sk2Z4BXAL7A8v1yeWVOd3Dr2jNcgvylqL8%2BiFmy%2BQrj9xSPh1f6a6q1xXF8E%2BHcOw%0AjrOXbq%2B8F/oHvpj4ALCQKlAFqkAVqAJVoAr8RAp8xcPnzccvnstRF7ueJ6%2BHHD/5JE6KT/YceHQI%0AghQM3sE0l0hYEnEcsgUmz5xOf1e4nP30sfI4FXzl3k%2Bo%2BymeVVuaJzQiIUldIqk4/QkIm45LKcpO%0A3ayWOIDYOAkeqhB3hHCmsASecZH4emkuR8/9FwQCQNKASCNaE1eL1%2BOxnGFO%2Bh0H8AGffnTMnVtI%0AxdR1FZ7zBjf9kzkAsmCV2MRT16K05GkzcSKAWSVX8jgh%2BeYOLa0T1r7gNMMBb%2B10n8rWYe/9%2BuST%0Ajz3Xz3y%2B5X64oPk7Dy5svu2WMEuePHHY9zrZbWI2vsH7Z0TXX5Xsb8FdR7ldlsuyJdivhyejLHtO%0AK4tpvYrWB5KX76G1SRrYh08UXoROf3vLT5byQ6XkXNg3%2BNLRtRoZsLkjPvjk51EvH4q%2B%2B20FLzq8%0A3z%2BnCnTxr5/3pN3rxbTH2ipQBapAFagCVaAKVIEXKvAVD5/njvYj7uXkuZ4O9/BQwSGHGU/tHjvJ%0A9SyBM2E5gUjOgy0RkThMM87VpUqiDuTGrYKFxwhUMAvDcclyZiWRoIPmr%2B56cnYIi50OvuOKXdXx%0AtTisZkduU2swq3GISzitPGKMh3MG7cHSbmTa2RI%2BbXjuktxcLHFG2suq6ZQLUv9gmTqEzWbwnQqw%0ABLVEMmU1%2B8IBpr0wji92ldU4QiTE1xHsEkjG3uIyk4d4MDMuT1bFfEM7t5M2uNH2fcdhjLH8yw9/%0A/rGOl%2BsAtrTk4t44fC7wTvHcuA%2BE%2BwPS9ZmnH3jue3hdjhRczn7hfRC5BPeXdfq7Hjt3b/vFsK/p%0A7%2BtFuX5%2BlJ/S/H2XXufGdb1YvhJuxemZovvPmmdxVVgF9h8v9A4thtVWRxWoAlWgClSBKlAFqsBX%0AUeAbHD7dB4%2BWjPWsuwfnHCOsEuBRUcvUuDBsYCwBYxDR0RrHOli9us9%2BlXNaoDLrWP0AYCld4bAF%0Ahg5InOBB4mOn4zQRwcnCCYBOOOoQ0WazAPC1BhNJburOpWQlKCw9UCvDTTF11ZRJSyTpnEhBphlT%0Aznam4J9HUmxj9iCYEh7/RFoxdXGAac/k9yMpDUxffEpQl%2BHZmyWrEMHHkiIeZzZwmIr5FhZlPnxF%0A2PE%2B7dE7l5nDpN9Jy6%2BK3a9L2lynuP23CuvzwDXnDr8iuTX4417WGY9Lc/2e2338I7C%2BTTbjg/J7%0AghGQpc2/q%2Bx/rGXTLxQC8/OaVHnLD2ryiSW4S%2BcXDtvbvzZod0Jx%2BtldLY%2B9TwFMX9tRFL9ev1v3%0A0rGUab9OFagCVaAKVIEqUAWqwAsVeNXDJz2uh70PRw45hsGsZ8Q9sidPPiIDC5LINWM9weIn8RGH%0AdGDSHsiJe5zIapAyG88WcNYB9PpNqrYNxixTDjarKTEdwG6NoJ2cd3qOHErM6UGcTA9t2PncV/ZC%0AiuBJq895zD4nLRFG0p2Kx8cJOE5W00AYiLgqWMsqjuMOoYl3rP1g4wDWh1xmrgI9uFOpiLBKcN4q%0AggVgJcn0%2B3G4AOsabLv8faTkRMdh0vMnh0%2BmAJa87/axbx/NiInx5Olnj2iETtwgKLL/TdDlMN0V%0APjj0rYqX8FrMSzbBxU83%2B2C5yPfCvvXA8kOe65tjjW%2BUFbbdr36MpUF78tzW9qj94XnSTi7nz63F%0A4KtbBapAFagCVaAKVIEq8KUUeO3DZ/pej4zXwYM7LpYHVQCxOqJYZQgLCQAGQR1s0sWwdIgcpgKw%0AB0cqwC656hTryBKO7WE9eWINigGPc8278VXYwaaKu2N63ma2PDE3CtwNpTcbAIsTtQ9dMaUWq2dK%0AlvLJp6vmSoVvFs7MnZ27nZkrgynTgoHNo6AM5k4GeWZk%2BqmCM5mtmCBOmHFYpai5XGUitDGHR1CR%0A0ppuyndq17lrNXv9s85163S3PwLFRyH%2B4/zGv5vidlxd588F27mX785dBzwOd2RNfDb%2B4cVf4PPY%0AbdgPv2lodbX/2xdi/b6jNVZH68sHA7b9FkBwXYF1BuYP36C7/hXQ5aw/bG2fh32zWPm3eviAt5Mq%0AUAWqQBWoAlWgClSBL6HAtzl8%2BtC4HiH3YCNXdz1M8tjIMOgeebgXEEcYQcGx4g9WNlOwZE2AU/nn%0AKlkH5MyKb6LWQ4jnz7QaZlLSSdJxJgN%2BIhMzmwGTKY6%2Bjv5MvOlbxUICUvcwJe6YPESYskEsFbMk%0AktNXgkTU4ayGGGyGPExD6FKmOJZOZE6nHwBOCM9sEpqIdRg8MJDLKtbjrrRM2Zfjmv30ldVJ8j37%0A%2B55bDeJwbfcfNrLPn9uuhcuB7fKqYPl6QM3hk0McEi3B%2BQc/OXnuHxVdtAqxquxD7DVwOSheZJqg%0AdbS0gcsVp5m1vv5b7qZadA5Tt1X11QKt7H/Ac58/PYVe7FoicbW67ZWmX6tAFagCVaAKVIEqUAW%2B%0ArgLf5vB52JMP7AbXI%2Bd1%2BCBpJJhMr6inrzPXaBhwGACwTwnrSXaVw8aZq4JX5odZSTFRm0PI9Txy%0AOTDLTAok%2BAcqc2fRc8RyJsqADaGOGOxzw%2BqsmmsV/QRnbpYIJjeAkLBZAXMprVoFDI4WGL4ALMMP%0AEnHCEN8qC7RXdQwGLGGm51WWTBQplXjAhyHGVW3wOuDjHHIznel/Yj8vxP0pIwe%2BS2BfKHzuQV%2Bs%0Ay7/cV%2BtYyKlz/S7ZdfbkmIghdhlXb0XBLcDlf0%2BoRbvY/LMyUmVlrYu5Enfydi9mM%2B0Fb5b9%2B2/5%0A6VM%2Bqc7Hnjh0tg6lEm3kZpMQ21EFqkAVqAJVoApUgSrw1RT4Lg6fPE4yeHZnm/nczGA27tRHf22W%0ATMz07JBrcDp3sqwleKZAkmmqwDOHR6wZCfI5B07wc3VG8B0TcNMHlngIEzQSO4%2BCASc9WYfIAcnU%0AARtIsphiGSYyZYlxwe0vIrEeO00Rb27SccAIwIFnLpmiBYOjnQ5%2BUvSDEcb0PFhikDhzDWpJiTPT%0AJ%2BZP73s45ErqXARBlnVQJMbVvvrruDi12vqseyAn1qMaK3sxM5bZJfi6dN38a%2BHDQS1WtiV5VV6%2B%0AwfV1cSS4Onz6aU8//Fw/Bbq/C3d1S6WF3iT7i2aHlttRBapAFagCVaAKVIEq8OUV%2BDaHz/3oyNPh%0AceSkkQWeYvE5deSgogZ5%2Bo8kRgAnMp0QEjxgLEE8jmCRdxIn/8G3mdhUnMyuWjfpItMJ8dmAU8Ei%0As%2Bp08oQ/QR3iLunos4QTzvjEDQrDD36yEWR4OATDkDBxHS2rOFpJtCvtOox44Lx5VwAAO9P1YcbR%0AnleJnLPsKvacdW3qg68HWOre4TmkfD/TpePWEoOo%2B8/eLGc1fsZ162wcHweNOTrujw%2Bvm%2BCvF3DX%0Af45Ft2CbdvmX/54im5DTIJHF6eAr59X1Nxk7ZR0tF8vubsM2/trhU7er/0WykYtsOYuWDzlXIT78%0AXH%2BRsSiI8MGrrW3KZXbqrlpTBapAFagCVaAKVIEq8NUU%2BDaHT7azn/g%2BMJwxGC5h9XF4mgfHwQaf%0AgTOf7/dzoyv7YfPiri8uYaHCZghh6oHhpkPwkEVkcB9dqQ5RmbEMlrBzgwazlzgiQ7iS9zCOaxUd%0Al2JZMhEbpPiDDX9SdMiauU5ZOrAd0pkyDn9HYNC4fmrJRvBAm0KJ4zDQTXCcmQuAKblfcOyyH5iP%0A3g9fvIcvuJ2PUF2Oavuctg9tnPF%2BW/%2BcyS/8Xll8BvfduhDbslP05mc%2BWXm7qVldL9DLvXnB75WL%0AWSvX1S3rhc0fEF6RDYTWK%2Bnl3LO9tDrkPWEB1zHy2glBE5/sCvEfP3a6loLf508Y/LbbdcTdSwvr%0An51Fyq40W69fBapAFagCVaAKVIEq8IUUeO3D53p4/HDwTO9gR6xgmQbClOfc%2BZEaSzl/HkQwPcGQ%0A4Bw4xexn6P0cvUvjhcHcQ1YISccHP2vFd/UwTa5OVu2BHSUiM3ZGnCZ3Tg0aIQXHjcz2ph/aOKaY%0AGztX4%2BvIb93gLeGVCp5gBkH8LJmYtufUYKyFuBZgItRMNFdy4jha49jHR2hxGN4A0xKEbS9ejORO%0AHi/0nSDX8ezayvIv5zo2vv78vn9tEH/Zc13axz%2BuI596vl//Fuj6XPHd%2B1/551j4pz73C%2BKDC3xl%0Anl831focktPgb0thvK3nBkG7zrQXy%2B80Wp9RwrmaXB9j2hj4yx%2B/rNUx9pTOcpZeKN9TFgN97iY8%0ASC%2BqlctX/9uTwVa3ClSBKlAFqkAVqAJV4Esp8NqHz/TtwzqP9Y75T0RmaT2WXg%2BfnDoY/uMWxOeR%0AJpxxTNTCjxMLxngYdCw0GUwBLF4rYEbW8hhkQQiMbrGsaIXImXh6YBW8iekHmGOSEJlTaWNZnZwh%0ANIXpwbkUuHIeyjmVxMQJwJ9Bl7DineLPqXisIymHKXEirqJYYDoHzrlKVsqFAYD82onXDxLH9OC9%0AXlidxEk8BEMVtnOh7zSyOvactjz%2B4x8m%2BY1/nuS39X21a23fNTjrRMoyV2YfDn/b/xbor2/fcYp7%0A%2B44b3lflOiuOsc6Oiaxcvgf2coy8EK4X6AqvJF46659C4fzJLyziQ9d1sVe6AIDrvLr/0Mc%2BPV6W%0ATN/9Lh7G5gO1ut%2BD8%2Bfl%2BLr6ocSaXg6l%2BLuJa%2BJOvnKuYEcVqAJVoApUgSpQBarA5yvwGodPnvzy%0ATE/Hl0fB6xcf4jl8soSvZdHHfabkrnPn9eSpj13PpfuYB%2BbmuFZ4OnkmYuImeDKQGAeGb2O2kUSX%0AUm7GxdMYjoADm2BX8V3FuhcjTBnp5FCIqSRxmKZDwTJok45DJEUlCXLC9AGcg1mSKlPBcs4sYJlO%0AQpHYQ%2BdnsFkTD8a2A45juZurkyf46QCY3bJExPawDttwSV8Mq5nKyXSSf3/%2BpT3a9FyH4591unvD%0Ar4ddJ8/9sec7/iVTJF875ZyWwyd/t8IRkcPn2/W7ZLF/8Mknf/i0cY3Ljrez0ocCSxv%2BrAPk%2Buc3%0AL7SroV2IFO5TXtvv1qF3VQnbTtyHz/WpLM2sa0Ti%2Bg97dZ5qrWU%2B41w2x07%2BaujN%2Btxz0ZLopVts%0AC8y4HFk332a6kj/R1qsCVaAKVIEqUAWqQBV4qQKvcfikNx7rfCbdT3gX4zM9cT/2BJYjKAif6QkC%0A8MBJxH9CE4tP3PHc3lPLQpniSHsleOLBk02wiTOdVdNjRWKFuQVhsgUgBjtXwZCYs7StAEgn%2BI4k%0ATsJwugpSBu081gKQM45T7bXIB1%2BzlJRUObQ0p/rkmoVlhFd/xy6XmO07zRJgfbMAhBMHZoaRaROM%0AM1fxJ6dLRBbXlQ0nPeAwvKY6O3C5drK5GowA7M1aVvxO7W79crzcZ8Lf0fw3frfwGz7e3MohxeXE%0A6MXkc/11%2BOQs9/aXP5b18On5k4u0/8dulzOv/tLmeo7dp9l9/lz1F3adhtfJc/07oYuQC0J5LxAI%0A/reOrL95avWTz6its/jt0MIra/1Zif75bTfk4XN9wOu%2BrjDxmwXTUQWqQBWoAlWgClSBKvAlFXil%0AwyctXx8JV/f4DJ7aPap5%2BCRy//DJUQoMlsR5WlOPHCFSa9XYAzxftTjBk5JBED9LJpqVxAR1LBQM%0A6SBlwKFD/QkLg0upDj6%2BDgAcLVnikx5n9nbgVK5JS1Y4BU/rEpGD81zK7OomD8FgBKRt407nFmY8%0AKTbA0twRq4mLTNtZMn7HkmLFiTFiV9MSdykWB8ABA5WAyfkd%2BtxS61i5ml0fBe4D4fo4kfPY73z6%0AuX7jLK8a7ul1E65j281PPte/ovnrm7fvOIWuTz7Xh59cF5j53zo3bu9p9%2Btot/XJUZYa%2BFGMK8I1%0AWafOd7%2B%2BW6%2BJdZVzfCUd/D4x7vOnXSXZOpfXypqscn7Kuj78XCl8i7B0a%2B/rlypdeRbVOM3ubPlq%0Aq0AVqAJVoApUgSpQBb6UAq93%2BKRjnhIdPK/zSLmf29dp7fffVxssffTwSYoffubwSeJ6Or01rtWe%0Ajp2JmILNCA8RydKqfSY3DjA3QoqdE/GnUmmPJXmwSSGIb8RCaeDsABMjTxIPbHK6agpZOac9IpT8%0AKWdR%2BzkERaaTJMZJbiJx0nbSjQDIUvaSJVbhZBqbxsJ8dmwj8ftTYZSIc%2BgnXQEQFssSg6uvY2Jg%0AEn6Plr2u23ydBXHZOp1zvOQw9u7NL7%2Bvn/bkRn3HZ5/rGLl3vX850DqFmsqrZH3yuQ6f7/nwEIc/%0A6%2BPQdXm4ZCRdVL%2B8nLYKs9Y%2B0F5OnquB1cjK2cfXi91UTzzA1hGR4/H%2B/HMx7NfT7v/CsFjWxtZ/%0AnFr30j4h0yfnYX6HL98zfP1%2BY9Ivn6Puc%2By6fFuNna9ZbB1VoApUgSpQBapAFagCX0SBVz180vF6%0AvNvDh3We2pnl5OaUpQtoPQquwQkqg1V9nkkdYvB1sKTHTjZpA7sSXJ6Uw6Aj2D6xhwOGq3TCUhIt%0ASnAypxk7SWO2EeR0WHKqIzI8lsZKGCeEdqVKYOxnUuGHzazkzrrTnzAbCAkOyJvWLPEza1aPP2EB%0Ay2AnSn3oynRhZ2tjxGeHmc7cVNSJjcgB6wQwb4yAKRH8uatvGuFK7ZcVpz1fMfvYuT4R5ADGj3ou%0ArRaA2bqR2cfeSz6r3MlgfnnL37lw%2BHzLN9/yW4fmJ5/eDfvYmguw97xydznEmR%2BlXl/oa/ly%2BFy/%0AcGjx8N/kMHH9SOpvb/wI9PpusRqVxypsaHe%2Bz6ucq/dnnm6N76BYKozPUdfuLufPzcNqGt5OTRWo%0AAlWgClSBKlAFqsDnK/B6h08f1umYB3T79ixB3MOnznq4vD5O4oPk0ZOIR6nY9WB6HVGBAL5ZBvEd%0A4QwYR/yVZuUaCSa5pDsSEUNQhzgO1g7lPPCYKzJLqW7pTAEcSOTXSkV1HG1oyfK0mU6cSohlCJbE%0AiDbV4xDH16ZEEhMJJs6kFR/LUhIPTjA6IsOJkzH59UM1l8AzjdVJxJTY6eCfx6GQgBw%2BcyGMA8Yx%0A5fuxtLRF2I1h9re0rmPY%2BjuUd5zofuH22R8Pcm/xja92zkGRwyKR5eyTGyT85h5Op5zpPHlyFt1/%0A64LasPq/lb2vwEUA9Vjllkae95YTmai30tdYdv3A6b58lz6QlD98XLneNDh/Xr9p9koIeJXYhBw9%0Al7tPz7xM18eei4XK79e%2B8HfWOsHCc93a7svMVXoPGllNdlSBKlAFqkAVqAJVoAp8pgKvdPjk2W09%0ATu6xHu/24HmXAPG/%2B7u/wzIIE7ks7y8CWALsacqj1IZfzGZdhrm%2BPPiTSl%2BAVrwsRDINJulUP58x%0ATAkGJx2GTSqWcII0qJ3V08AMAjN%2BIAkbvWVJsBJNG8KUTnoi5oqMNTgxJhKxqEt2OLPOKak4Ew8w%0AaW8iQ55ayQ1hnCwFfHACsFbqxjn0EJiJFjKo/tiMrKbKd%2BXQ3nqh7GMnjXH78AOey%2BwDGIexHbt8%0AAy03375xAXhidHMrzMeinDb9ac998lw3KvFtFsCxvupfD5m8GmDxHKsFsl4i%2B0h4Idm3/Wbb4b0k%0AjOx1mOTQuH88dR1B13c9Q7mOx3vsY6ef7K73mE29Nrz%2BSVJO2esDXVraOyJRKj71xd88e6fXO3y/%0AdiHpqAJVoApUgSpQBapAFfhcBV7p8GmbPBfG4WkRnwjPmlodglkSvx9GlyF%2BOFABJi7nTQuDJDr6%0AEyl5eM5sJvpsy/mTqb5USRfmaoKyiRRAIafpQcxMScSunIqfVBLOZiZnhNKZnAcSsowEg8Mw0R7C%0APHMT1DELe06x1Tu5kyrg4Ce/5FY5ZDk1K0vpx/ZMzyqO5eKk6HTiHxLNmvfGZDuAzz1PwKv5%2B/Kw%0A61VwXat1LvPbUznC7SknLz7T5LfX7mPkUuiiklqRsZJZXJ98cn57w3fFr9%2BMu38/0Ho5r0PeflF6%0AKxy2dhXTo%2ByFE8xqZENpZ5Mwvzi7wcuqyHUS9tD42%2BJZJ1gbXQzuanNBseLrn1rZHr9Qm%2B/rZX%2Bu%0ArurrHLtOob/wfrTAO31vApe3pq3SBb7wV/cjX2F4HPwRri5XgSpQBapAFagCVeBHUeCrHz59AvNR%0ALA9kPK%2Bvx7s9ssQMMFNW9QVgCTpM5FyUoBhWA9bJkx%2BOfpwgzUruYRoeE7FUZ4QHhxSGjgAj2FSZ%0APPjA5pLI2Dhgpp8U0mXQmVYMWQz6xObkuWOXlg7pYZ4VxceKSSLT6QM75GYaGI4juTgZMjAFoz2D%0AUyVgHVOSK6fBicR3qhWWLMuZFRtnwpKoAwap8XNjEGEcYN/PdOv71A5TLh79cvr6hVfV8tapkrt8%0A3zx7I5ej3dpW9sZdz/mT307kr6VdJ9X1eeI6ql10tgjTp2rrdMd/2262XTCcLO47Cbs49m012K5U%0Au4195rx%2BaMlHl%2BtDy72L1eOmvWyMSwPvOm7uivxKpHGeJLSyVu6FYTWTbe7dj/Y/wV0sHVWgClSB%0AKlAFqkAVqAIfKvDVD5%2BznA9kPFfq%2BNQOgAgDhziOq1gdlxbiOjxZmTj5b/qSTDthUDo9O4GtPvaY%0ABwxXCV%2BbuhxB5QnbJMEHn0icmZLEm0HTY3EckzmJHB4UiojBVCTLlKQzFbOxFzODpph1sEkU7xTf%0Aca4VKgAHcFKSRQQ/sFlLcGxo47A08fhzKrM25eJIe3PqUgBgGN7MuUNCa8WZ8s19bnnPV5ct7C/0%0AyQFsf/zHX1vw8SD/KMnlA0JvWVP2fWPCOtzxYl3nz/3DmVhfTNtqbu/1evetU2h8oevVuGjWB5Cb%0A/xK%2BMO%2BZWUvzcW5c508Pjfv0Ccaf%2BTRjnz/9%2BU92xVj78Bgsz76C606b29ygDdxdbqrbZjF%2BDHM7%0As9EqUAWqQBWoAlWgCvxMCrzq4VNh51Oaj%2BzraXM/c7KEbzBXQTxxhrA4wRjJVCeFzk6QMzF%2BHGDm%0AYudIHAeweB1941gHuVf3QpgpziHlMJ2A8NgMS9OR03QsMmIzXNXKk9y5JJ7IdGYWftKTCNiU2Czh%0ApNBziRMs/mCZWmI6%2BHNIPiPx015IsjRbmj6AEMZJ1mEVgJjYc6GZ%2B5343JVcN86c%2B6C3LAdJtsBP%0AcvJzkE%2BKI8VVjXEjs04KnykyeNmu0%2BK%2BCxbnHvvLps5%2B18tg/6fzZHf0mrXYGMtc0o9y0sY%2Baa7m%0Af%2BUX1e7PLQmu8%2Bflf4sRhmX3NumVj2f3Vj/86HNtbfNsxs2c3a70R4bX/RFkMVWgClSBKlAFqkAV%0A%2BJkVeL3D53w%2B41mSo5HfPUvcR0usvsgDfsK4YMen0VNkpoM/TM%2BXfBJOP7kwSBJHEqbisTrE46SQ%0AuZmenaTEuclDMFSzkwTNkgQb51BR/LQiD%2BlOzU2JgzMTJ35mzULGpw3DnZSJmX540lUiccQnK87s%0AKulxSH/OD3Mw/o1J8NNJuZn1Tf10tM5Wa7La3Qc%2BPP5w8Fzhp5PX8jzVjb732RPc9ayYc%2BbFeUof%0ASRf3Srin1Fz0a/iZ52pqT1cfy1mLy71EL9eFvHX4XB2vP/PkaTZp6/NPsljmaI3dLG5tkbqpZRfn%0A4rkEV84qt%2BYdVaAKVIEqUAWqQBWoAl9GgVc6fK7HujGcroe9EXe6nnn3ce6wZByO9ay8R5xB/Kw7%0A2W6CPsomw7QHHpZCEieYT23gzBAqnUMn4ScxnUhyk%2BqQHvKZcicx%2BOlMPH5aAhM/ThJnlsFg4twB%0AZ%2BmQm3j4D84k158R0g/TEB6WgLlZ%2Bc9ZRs7xSfiavp1cXkaevvYHnryuLh8SsqN19Lq80HZvN9tf%0Ax7rLC3Id6vZr/OmEONMP%2B9tHvPGWMFwPmJfAtYVdx9PgpRu%2BrJY20T43rvnFmcUA7PPnuh0X2zpR%0A7lOlIBnMJR7CSVG/ClSBKlAFqkAVqAJV4Asp8EqHz9ntzcdYAS5NOxMnxsf98%2BqdyHN1nzsznKnC%0AECcthSTOOZ3IIVHMzRSDN0kMhirOjJsekjgTg3/IJRJkHFMO9pB4AM9pkHEOVE6TMmHTP8BukhC8%0An5IqSZ/46d8EJDgdsw6WQjfZZuK39f1rH093tKoyOJzM%2BM1BHupGh%2BvcdjkR%2BuVytNxHzn2ou4Q9%0Av63VC3yQDHcv3kQkeCk5qPysdVNf8gXT8%2BUUuXT/oPDKvo61gTW/HJMNL/il5BV7OT%2Bv6HXPV4p%2B%0ArQJVoApUgSpQBapAFfgMBb7B4dNufTQ/PKMbnFbwAfay/Up7ziXuk/d56RCZDPHNzfQOWzBn2nMD%0AAR%2BWEg/JOXJYguGMOUfMMn4zJbRn58CWng9xEg%2BR55AHWCo%2BFw/g7CTlzqaCOaQ/F5%2BwYOLM1e/W%0A59i5TlbrPLbcfWFw1gFsfXuqx7Rr92vuiLcSVxoJlxPaTr6sB3bNu/n1NnifARftoeKaHnnXPIfH%0Ai/MB5kqySTehPW/3ShcGA09TUbVVoApUgSpQBapAFagCX0aB1z588oCe8wY7YMqYW3F6MyjM9ANg%0AMrzAf5ztjJyRF/c2SQ7931kK8oChjRnBn5qTNVdDMp1zylw9MzzCf7OowZl%2BE3ao/rLpc5v6pIo3%0AwQQZU3amL2vydbIuJ899mHs6ln14Y9zewCmawOEjx8c3EgZT9qeu12PhZFmNptmnA%2BJT%2BlNspuk/%0AoZh/MLnOj8EzRyNVoApUgSpQBapAFagCn6fAax8%2B73ebJ/h5GjmkfM%2BP9V%2Bjt7MUH60yAabPiHqe%0AI9H5uZQAzs4dtgP4gHyu1gF2IHnZlFrP0T4Xf6QQue7iEfB3gjkejT3XEd0fh97bTk5/33gnTx%2Bz%0A0tHl3Di%2BXfZWd8%2B3vle22Uz3DrG3iBurAlWgClSBKlAFqkAVeEyBb3P49Fk/T%2B1OD4%2B8BrOLw2ri%0A38qZ7X3V3mahF2z2BekvSHlBY6b8qLVeLMjrJ3oJ1sH8%2BsHiNfL8ae1Wl1/qk8NneZ5dOHTzaW1/%0AmHw5ht6iWOWPh/YPkzurAlWgClSBKlAFqkAVuK/Atzl8pqfnzh7n%2BDkiyf2D33NZaeDgvIztU6sc%0AimZ6v3pg03mu9AuoJm3954Q9KDN1fjDlwPCdTD1Wafmm3DU%2BPGk9d/S7nNNuHdc%2BYWuyfw5JP678%0ABLkLrQJVoApUgSpQBarAt1HgGxw%2Bn3tGN/7c6nPyfCr%2BOR7jX5btfq3z6hes/gWpzn02EgXU%2BQdT%0A%2B8NTZ/Z627kcSp87m95Oeib6RUie4W64ClSBKlAFqkAVqAJV4Jsr8OY1O/jBntFfU7rWqgJVoApU%0AgSpQBapAFagCVaAK/KkVeNXD559aqTZfBapAFagCVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapA%0AFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWoAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWq%0AQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAVqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAF%0AqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapAFagCVaAKVIEqUAVerMB3dPh8//79i7fRxCrw%0AzRXoDfzNL0EbqAJVoApUgSpQBapAFfieFfiODp%2B//vrr96xUe6sC9xXoDXxfn65WgSpQBapAFagC%0AVaAK/OQKfEeHz5/8SnT7VaAKVIEqUAWqQBWoAlWgClSBH1iBHj5/4IvbrVWBKlAFqkAVqAJVoApU%0AgSpQBb4XBXr4/F6uRPuoAlWgClSBKlAFqkAVqAJVoAr8wAr08PkDX9xurQpUgSpQBapAFagCVaAK%0AVIEq8L0o8N0dPvsrQ7%2BXW6N9PKxAb9qHpSqwClSBKlAFqkAVqAJV4OdV4Ls7fPZXhv68N%2BOfdue9%0Aaf%2B0l66NV4EqUAWqQBWoAlWgCryeAt/d4fP1tt5KVaAKVIEqUAWqQBWoAlWgClSBKvBaCvTw%2BVpK%0At04VqAJVoApUgSpQBapAFagCVeAnVuD3j%2B79H//xHz%2BKKaAKVIGvpMB//I//8b//9//%2BX//rf/1K%0A/KWtAlWgClSBKlAFqkAVqAJfQ4H/8l/%2By4H2I598cvL8T//pPx1yOq0CVeDVFPinf/onzp%2BvVq6F%0AqkAVqAJVoApUgSpQBarAV1Lg1/6izq%2BkbGmrQBWoAlWgClSBKlAFqkAVqAJVIAp85JPP4OpUgSpQ%0ABapAFagCVaAKVIEqUAWqQBV4sQI9fL5YuiZWgSpQBapAFagCVaAKVIEqUAWqwKMK9PD5qFLFVYEq%0AUAWqQBWoAlWgClSBKlAFqsCLFejh88XSNbEKVIEqUAWqQBWoAlWgClSBKlAFHlWgh89HlSquClSB%0AKlAFqkAVqAJVoApUgSpQBV6sQA%2BfL5auiVWgClSBKlAFqkAVqAJVoApUgSrwqAI9fD6qVHFVoApU%0AgSpQBapAFagCVaAKVIEq8GIFevh8sXRNrAJVoApUgSpQBapAFagCVaAKVIFHFejh81GliqsCVaAK%0AVIEqUAWqQBWoAlWgClSBFyvQw%2BeLpWtiFagCVaAKVIEqUAWqQBWoAlWgCjyqQA%2BfjypVXBWoAlWg%0AClSBKlAFqkAVqAJVoAq8WIEePl8sXROrQBWoAlWgClSBKlAFqkAVqAJV4FEFevh8VKniqkAVqAJV%0AoApUgSpQBapAFagCVeDFCvTw%2BWLpmlgFqkAVqAJVoApUgSpQBapAFagCjyrQw%2BejShVXBapAFagC%0AVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapAFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWo%0AAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWqQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAV%0AqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAFqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapA%0AFagCVaAKVIEqUAVerEAPny%2BWrolVoApUgSpQBapAFagCVaAKVIEq8KgCPXw%2BqlRxVaAKVIEqUAWq%0AQBWoAlWgClSBKvBiBXr4fLF0TawCVaAKVIEqUAWqQBWoAlWgClSBRxXo4fNRpYqrAlWgClSBKlAF%0AqkAVqAJVoApUgRcr0MPni6VrYhWoAlWgClSBKlAFqkAVqAJVoAo8qkAPn48qVVwVqAJVoApUgSpQ%0ABapAFagCVaAKvFiBHj5fLF0Tq0AVqAJVoApUgSpQBapAFagCVeBRBXr4fFSp4qpAFagCVaAKVIEq%0AUAWqQBWoAlXgxQr08Pli6ZpYBapAFagCVaAKVIEqUAWqQBWoAo8q0MPno0oVVwWqQBWoAlWgClSB%0AKlAFqkAVqAIvVqCHzxdL18QqUAWqQBWoAlWgClSBKlAFqkAVeFSBHj4fVaq4KlAFqkAVqAJVoApU%0AgSpQBapAFXixAj18vli6JlaBKlAFqkAVqAJVoApUgSpQBarAowr08PmoUsVVgSpQBapAFagCVaAK%0AVIEqUAWqwIsV6OHzxdI1sQpUgSpQBapAFagCVaAKVIEqUAUeVaCHz0eVKq4KVIEqUAWqQBWoAlWg%0AClSBKlAFXqxAD58vlq6JVaAKVIEqUAWqQBWoAlWgClSBKvCoAj18PqpUcVWgClSBKlAFqkAVqAJV%0AoApUgSrwYgV6%2BHyxdE2sAlWgClSBKlAFqkAVqAJVoApUgUcV6OHzUaWKqwJVoApUgSpQBapAFagC%0AVaAKVIEXK9DD54ula2IVqAJVoApUgSpQBapAFagCVaAKPKpAD5%2BPKlVcFagCVaAKVIEqUAWqQBWo%0AAlWgCrxYgR4%2BXyxdE6tAFagCVaAKVIEqUAWqQBWoAlXgUQV6%2BHxUqeKqQBWoAlWgClSBKlAFqkAV%0AqAJV4MUK9PD5YumaWAWqQBWoAlWgClSBKlAFqkAVqAKPKtDD56NKFVcFqkAVqAJVoApUgSpQBapA%0AFagCL1agh88XS9fEKlAFqkAVqAJVoApUgSpQBarAN1Pg/fv336z2iwr/%2Bqfr%2BEXbbFIVqAJVoApU%0AgSpQBapAFagCVaAKfEsF%2Bsnnt1S/tatAFagCVaAKVIEqUAWqQBWoAj%2BJAj18/iQXutusAlWgClSB%0AKlAFqkAVqAJVoAp8SwV6%2BPyW6rd2FagCVaAKVIEqUAWqQBWoAlXgJ1Ggh8%2Bf5EJ3m1WgClSBKlAF%0AqkAVqAJVoApUgW%2BpQA%2Bf31L91q4CVaAKVIEqUAWqQBWoAlWgCvwkCvTw%2BZNc6G6zClSBKlAFqkAV%0AqAJVoApUgSrwLRXo4fNbqt/aVaAKVIEqUAWqQBWoAlWgClSBmwr8eP8oZv%2Bdz5sXusEqUAWqQBWo%0AAlWgClSBKlAFqkAV%2BJIK9JPPL6lmuapAFagCVaAKVIEqUAWqQBWoAlXgpgKfcPj88T72valIg1Wg%0AClSBKlAFqkAVqAJVoApUgSrwxRW4ffj81HOm%2BOfsF2%2B6hM8pwCU4j%2BfAjVeBKlAFqkAVqAJVoApU%0AgSpQBV5NgYd%2B5pPzzK%2B/PoR8pG%2BoHoEV84gCXJpHYMF8PfHvdPL1imZfL3Zutv09N/zinTbxOQV6%0AD9xU5qYsN5EfDb74BXW/hxfTfrThbwi4ueU/6U5v7gVt/6Tb%2BaS74mfee4R6ToQAdF75frjf1Ss3%0Ac5DiPP1zdXvu/07k5ta%2BN/3v9N%2Blz1Hg3pHycGdwTxwin1P4Zbm9L7/sJfgcPT%2Bnk8%2Bp%2B7I758/V%0A7cv22Kz7CnzOPXCf%2Bbz6%2Bnf4uYdHIq%2Bpybmfs0qf08%2BZ7Vzx%2B4n8eDv9nB15Xf5cV9Cef85dP/c6%0A%2Bnw1JvOXuh8%2Bp6sv1cPc133/z9Xt/b24%2BuPt6JFdF3Nfgd9zc/Aa4xbJK23eLsaxjPt0z62G9jlA%0A45%2BvwHNX547455Q74M/vsAxVoAr86RTwXaLvDF/kwp3fcr8I7Tcn%2BVH39c2FbQM/iQJ9Bf0kF/pl%0A2%2BT2%2BMH%2BL/iDDzPdnq8B9qmjVa/p31fwOZmei99nc/Vzch/h/xNhDhdiTqc/FZv%2Bndtv0M8AAEAA%0ASURBVJ0%2BCJNh1roZucl2M3inpS%2B1dO4W5kPw3Ns58qX6Kc/rK3C43DZwCH7%2BFf98hldT5rD3m4J8%0AZjPPqfFc/NzSIXIz8WbwMzv/GumHvRxKnFfP%2BzpHDiTfZHruPG2cl85bOEeS/qdwzns8R857PEf%2B%0AFJu93%2BR54%2BfIZHhOhOfiM/dx/9zDIXKz3M3g40U/CXno55B7Xj33do4cSL7h9Nw/zRyC5/7PkW%2B4%0AhZb%2Bsgr8%2Bu7dOy8w90Eca3hn5P6I83gH89Z5zn%2BcTeTk%2BdTcr41/RKLP739W0U8kzkGrFI3zUSnu%0AIw%2BFDtMz%2BYHtMD3jv3jk0OFhei536PAwPeMb%2Bf4VOFz0w/Tc/2de9EfSv3YP503NyKF6pnEm%2BAX%2B%0AQYHDVMIZPNc9R2YbM5f4YTqR34P/3F6eix96PuzuMD2AX236XPPPxQ%2BNzV1M/wD7etNH%2BvxoY5Nk%0A%2BjfbPrAdpjdTPjX4qT18Kv9z%2BHPdROLM3MPeD1OQ58hMf9A/lz5HJtWh6GE6kV/Kf66f5%2BKz7rm9%0Ac2Tiv4l/2Mhhem7psIXD9Iz/3iIf3SAN/%2Bk29cVFXh9vMhQChwLaODeDz/VxFtRI4ofpczw34yG5%0AufpdBaNhuvqyzc%2BLcvYPRafmH23jo4CQ42SbZyewEJ6dYF7HSZPpfEbSg31%2B827TT50vq0Auuk6m%0As8rhHphLj/i5eR4Bizm08QKGx2tNZOoe1DjESfmkliY4fpz7bOfSiaTzUJ2dYL5P57CXOZ3%2BbN49%0Afs87PXQ%2Bp9PPps57SSSY13dmq5/aT3LPTjYi52SefmBf0EkzcH7tWmk7Re84s5lH/JC/2LnTTDjT%0AydkJ5us56dASczr9NHBuMpFgvh9nbkF/Ruwz/Z%2Bd72cjn9TJYY/Z1yeR/KjgDz75ZJMRS4fPRRPB%0An4CbihzEdRobh9wDcrKl4sRMP%2BCbwax%2BbSd93iw0V2/2eTN4k4rgZBNDxKCOdiLlx56d56qIfG71%0AHE8DqWskyJQmMn0Bn1outI87h36%2B/4Yf31qRjytwvg3Od0LY5o16/xYN7YRNP5yPOGEDfIfkztIj%0AVcDMQk6jRpwzTPLHqweJM314MpXzbGnDTliavkjTz3aunjm/VSQbSQOJHJxMg8Q5b3OqN/2Z9TX8%0Am%2B2lUFYPTqZB4nzzTd3sisYS/1RhTTzb7Pprbzmdp%2BInOZ%2B63wP5oTpTI2ebxFQ8KwMmq8E/F5yA%0A%2BNbNVOfczISd2zj3cI4cSjw%2BnaVnewd/9nwgPzR86O0wPeS%2BwvS5Dc4dHTD0nLZ1Mk3D50iWXtk5%0ANH%2BnepA3m78ZvMP2wyw9/cIhthSNcDJy/ozD0s39R8SDw3QO0pnKEGdyTv9cKCmz4cDmaoIH5z7/%0AAfz49EB7mIYnHQrIVMBzWUnHEYOd43x1YJ7DRCKT6o5/H0lpc9OD/Im7KoltzFrGD%2BAJeM6/35VZ%0AN2kNxh6clPviDYcZ55HmJ376Nzc1AWf/kXIvoD0Xev2IW3tB8/O6T39u4eY9cLPi/Qbu63/IPUzP%0A/STyODIpzzlSYecAnOk5MZuKI34iXYqFLf6E4U%2BSyWMDRvDnUrLInenxxWcK/jAEHIKvME3duaOz%0ATycG3ULsYUdOw/lg/weSO1mPME%2BM/n1LuWxHP1MS09ukvdPhF1mataZ/IE9vhzjTZOE4DOJPcHZ6%0AoHJ6AM/E5/w7iWGLA8nNuiGfyAR1DomHVaYzVx/rcDX%2BIVdmLAMMVoBT/ESMgzkwPDg1MRYnfhio%0AxSCOTRBnTs2aq9OfyBnXv5N7aGZOzz5sFsIyAGBTLr6JiX/USeJzyE8lnDyHXWQ6ObOXdGIEnkTw%0AZ8oscYAdlu4nnsGfE5kdTv/AmU2BiX/A/NjTde%2Byw4Nl6mFG6zT%2BBJOrcJFvTuPjvHnzBnsYB3Fl%0APgRJSZXpBCYg01dwzn3OyPRnM3Mjj/d8YHOKzThcKeIWpQQjssdhlfhs7OBnNc4BwNQq9uDUNrJk%0ACgznwRLBWJFfw0YKyGfDth07S5%2B7na3qT3x8%2Be8Agvwazp%2Bouq0%2BLsKXkjR1cW6OtETFOYgzzaoO%0ADIdIYAHHOSOJhCHOGSbDczzPxcNzBsxa%2BE6x8719%2BukzVDqZptbBASBGRwtmOk5nYvohuJr7cIg8%0A06bEBEzaL%2BvT1CS0nxk5%2BMHrxN5xwpCtHRwA1v1o9VB9jpMtHEiyBeIHP9M4yT3sJVMAj2xKws/Z%0AuAz2c24vfaaf6cxV/TDozP8fnIWyzemE%2BXO2M9vAT9E4ArQpFGeu4j8XP8DOU8vF4sx3EqaMZFkF%0A67Dudfb0bEAkKTrnyATMEokbjMXJAIOPlTYNxMlS2G5G5urjvqXB24/OR6cAnuvWtgEEo/%2BV7JRu%0Alsi%2BEjTiNqcFEHA0j8NqdhqqBGfk833bsNxH2dLzGZmlOAdMSrza1g4NfD/TyyefaQjJGLxrOKZP%0AxCkWvBZnioh/nhoE7/kHm3KmhyrOBMSXGYxO4mfnDuBcIpE7WbNE8AkmojMtGGmxxM8lZiQ8Z%2BZE%0AcIBlXC/U0/ViyaIwM5giOAMEdvJIlQhgE0nRz9LBsYSWJW8MpnHEr/JjpDqxA%2BEnTe%2Bkp6UDYRrG%0AyUi3RM4Np1uW7lQ0MQw6H8Uf2nvxNHXTxrn0OZJyh3TiidzJSnqKxvloVvgPJHempHyU9k56liCB%0AikFEJzcAjkEssDkOt4HpATsFT%2BQwCD63epMkQXgklCH2wM%2BUFJFz6Rw5r85a%2BBno4EgEZxaSfNpJ%0ADjjVcW4O8SzpJMVC1tISoRlshilYmc%2BXxriwlEgWDlRzqj%2BDN7NmygQn/X4Wq8nCcZB7dW9EZJYW%0Ay0616cSlTD/VuZ9OQ48QCot1GyTqTGtQTku7HW1q3e8qsM93KJS2YTv7sxN9MDOYHpKLM0duXZHm%0Aeh3xc%2Bve5Ax5epskc3X6UNGAEZ1pic9agmckVGSd4%2BdI8Dipa5ApQwWmnUgI5Ywmk5AlGGLnkvEZ%0Aic9S/DgziO/I1WEa5GpoXBrjRMBgA/viTnqwNy1Vbk7T1ep1j8O9RBbhFzd5MxfOO4T3V92Idu4I%0A36sQZrejdVM3mwn%2BSzmzf/37dSf%2B0EOWdKYFOWmnf1g6cP7A0/Uzn2wvqjFlMMW%2Bfft2z5ajj3Up%0AeKVBSgfTg%2BOUm%2BkwLgnX10kI40T0icRPxQk4%2B0FmaTLf9M8pyZ3OzCXuNDbOTMkWdFiKM2H6k3/6%0ArIYcx0uTC5SpGPnR/LfffpvKz7oHcrvSBoZjV7HJwnFYGh/nGlvvVpJg04ARplkN7XQgcXqonmmc%0Am1lJn04a0zn0nHIw0542DlMGGO0sqp9C4TljPrr0XArxA3%2BQ5/jsMH6cm4mTJP45JbkHJynEP5o1%0AwQeeO9OP0t7JPSzRACMvFu9YbZCUO1x6IgwBpONMy9TVjXq6T5IS5umEIc5cnYTxJ0B/logf54w3%0AQsU5ooZv8k4nILXSSRyWQB4KsZqhkkzjZAnnkCiVpeelwU%2BhpEMopzbx0MaxSvqMc4gzPaQImPaQ%0A69LMmj6r4rGfNFIRtuxx7fb61kScAUwb/H1ngqefLJr8qC9AZOzN3XkFgwkzpbORvafL%2By1xBjBt%0A8AdHwvuYQ8p5mq7sHEAcwenk4EyqkJh%2BuGMlFAOJw/26fSI6pONP5vimO52Y6bN66CSlZzowshz6%0AsThzgMn0OT%2BAc%2BnogOMAgzObufSxvxzUmEtWmT0QOUwPnWSKk4o4GXaiNSindb1A8V2KxTn4RmKf%0A6y0AHerixKY3ndlbloLHsT2s3SpgZLSHBzuxnwmevh2Kmf5zEePTmhU7xc82wVt0buT%2BdmaTs9xz%0AcTDn/k08xz%2BHJDuNc2gP8jlYZRobsMFM7zgUOoDPkTvp33Dpd/q2V6yDbrgtvDPWoXOPP/74gwju%0AXrmcMUBGOJwM45lyG2VwFrIKEQHZPHF8bYJgiIRKXxjBwHAO07l08A%2BFDhUFn9kCiwNyUuHPkaJp%0AXseNm/tIFTil0kkJL8Tl8uwvuTSpiNppQ8elA2GWcJKrQzkcAYesQydWxxoPFfsN0tsAzIFz8uOD%0AP0TEE7%2BfmFwZDpYpI33qGMSSCzkdEo9uTrGuApsNmGWr0zcS%2B1xKAJ/kHArNKYWcWhF/lr5ZRXxI%0A4kzwmWTCpj%2BzbvoBx7kJO1cUdjN%2Bh%2BqABznH4U5IJ7nogPEhcQQgCVOc2dgV%2BPSOSiRZccyKlS1U%0AIQybjoCbhKQQB3BenZFDCbKIRATfSZge3uSTBVWGFW01Ng0EFiVxWFVMrCnBZ4pD0JHGmOIbhBmM%0APET0dVySIT7TwxBM8OyQleAhK9P7ABlSfYLxHe4r/jX8tJre4GGwWYbLLOHDgMVnlbhOsnBuDsHY%0Am6uHoLRaluIIy6pOrg7T5/ww0ABjbenupsCkpeTO6ll93AmnhNgM24aKCFYkNsMlpikn0rg8kmAz%0AjEtIbrZMfAuwLqUlpJU/zAadshTHotKKiQUDJ3YOVy2UcjrAcJJ%2BcFi6D5h4K1pdBfJO4lQAKZbW%0Aqgk%2BTpYSJE7wwR6ApZ%2BDb2nsbC/BWddy8%2BrICdhmUmI6WQI24x/17SFdMdU3PlfxYcNayw4DUz0t%0AMDBBmnWnkwP4JtLqH6UyN%2BDg02d2iqMfsG2wBSJzO0zvd8hqeg5bImfnjDlHzllGDsibU4IZZOGb%0AS59zuEcirGqnY8ojNrkBnyNZ%2Bq6cp2%2B7jV7eE1jfO7CcPB34jHXXXP8qmn0%2BN9inS6jM4IGeQboO%0AkSSC9ApNa3pIBCcYh/j0M4VKn1XGZMY/TMUEH8d47My6ybmJn0xoIdwarC2znL2H%2BSabqxadACJe%0Agn01luHqYA2Kt1wiaE6cQQP2ICGRMLuknR0SsZMgkwU/PjbVUxGwVJSGTWtXIRdwIE8VGaYF7xa0%0ASUwKcYbTs2/EDmfPQcJvh2xntg3AVrGzaOpOBz%2BwOGYdpgYftPQwkZnGYVX%2BWBw71ybdlNg4APRD%0ANZ2k6wQZZ%2B5u%2BuCD0cn0wHmYhkTnMD3T3kxPlnhKM7xdsY7zTZsbNQ7pUpEeqlmRVQE6%2BskKcqav%0AVsYIJgw4vljCE1rBTsWLwYcycfzQ4jjFsmUtCvha8D1kCiIm6VaZtbIU5tTFiXRuIVNoD5uS59wb%0AyAxWBUxmIqHVT3uzt7QnAzbOLG3zRqaf9OkIm%2BCUnrnW0mYvcRLHIRhwaKFig3kvAqMP8ma5xzuU%0AYe6CSNLtZE6DFOaSMDt3U0SykemIt%2BePbgpAyunMokbOmEPKnAasI1taTf%2BpQi7IjPu3K%2BBJ5QsK%0AThzijLB5KQ//V3iH3C2EwaldyelSYEyzlzisEifLFBwrTh4ZYgNOik4AcWwA66BoRt5JIghLSbQH%0A7GHYHkjbsxOz4scJmw49JBJfJ%2B3hQG5L%2BiGH9tAMU2tNC3428JyfTg54pmkJn2ZsAyfDCHY6TqWl%0AaFrNm0MirDoEa0mf0/gg8YPHERmHVSNp4DmqcAaQREnYIBG3mUsQMBWzhTg2hrXJlDDyXDCwg5Na%0AxJ/zD5wPMoQQ2vOQxL1ka8DwCWIDIBhfB0sw%2B03wB3A%2B%2BG237kftvEV8IvHk%2Bbe//e18yCFF%2BaKs%0AEcVKkFcIdxuWITOOieIVfVqbkSFWcJYyDUDHuGyCse7rYF0lSKK%2BTqaHdHnONrS%2BwJyamzsMh10n%0AqBMbBiIHXwzBLFEFPR1eHX2r0zy1GKbMveiHP47xJMJDeoKzyfRgLkhGquMYNwUSIl50LFMsAAvJ%0AH3KZY3HSAE6GcUhwMix6tgBm0G5tOBZHHkvQIYMgllx6dswGxLMqf2x4pkOiU%2Bz0E8SRysgZM1dn%0A0ZuJ6VMHDM5kMIvIYVidYBrQyVSA6QfLNLA4wR/AlHApTpCHXKexh9UDbUhwnkuhIleW4R2LzXta%0Amrle8A/%2BxuRQGrB47SyHn%2BlsKf5OfTI04wQAjulY2og1KAN%2BqIzHBiCPNmAda2G3DBcp8h4SNVwV%0ATKJFU0gnhLNEMJERx5eSbABwJkN4BGDTGw7XCOuSncgspzYNQMtqpnFIxw9/2BJnlVzxcZJubqxO%0AYDgZLOnjMCyU7bgXrUEA2V0cc%2BVhg%2BCxrLrZCJtCONaKlSFWZGziB8duDxYMEZHTCcyNxBJ3I9pM%0AYUgD3hJ3NuWOZlFLa41PjJGbVti0kqTJ2Xn4wdOkFgCOY7aEDz4D2Ly%2B%2BC6Z4lWzFhtXAQFhxpEz%0ANo5LIqcv%2BezBEnYyG0iu%2B8oUBgmlCrnxCZsAfMi1OBTVRgEcxuH9JAzQKog6xMeBZxa1HxLvOHYy%0AW7KQcW06xKExVWLJ1UM/xsHMTtLDnU6yZANOLWEkNiXsJF3ZG6tEYgVjQ6ti8xXkmwOY9JxmTEx6%0AehBwxhOZKfhzkM40JGcnqzoz181Gf/cow7wHDnsBkFYF358Gn07MyjSNHeKTPCQ4h8QZmT6wDLfm%0AVCp1ZpvuDoc4FowArMPdXWdPd34iP4azDp9u3v3oK5k3is8lnjzzjDJvGpTyvlFcrWz6rqI44/ff%0Af5cWSzwpqTv7YZVpMJlKflhidRKaFaQ7yr7mFAzTST59GcSLnP6MEFcWLVNWbYPG3D5BHDldspac%0A00IScvESYuXPO3suDXGX4LRcCoUh5QLGCYxVL5ZKal3FpgF9O5GHZhyhZTVsue44ALAw4wBgyH8g%0ANygg1n4yFZN0%2B4nFOQwqEsFem7185mMcHpgpoXS2ypLdEmcAEIaFShuHqWPCpj9Xr9gPXn0J4pho%0AxBL4sxa%2B02SRMocNJxKYiVr3noglSME5Wxksaop44xOf9AAOeEmyOvH4mYYTJ74A7Zk2sJ1xMUkB%0Az5Yd3AZ5Q8MnKGxf6nUbEJxXPyQ4h7qHogCMzJT47p1yNhNr3I7tAT/OJIwvWFisQXuAk6ml5cfH%0AcdBDRFAKLBGG7QFL29LKFs4DM1OWvPEiIw5sU0mmsoXcQpe2rtfINrSkCJZfTvEwsySDjR3IXZ3k%0A8c065KaQzsSYaBw7y9mYpY0DEE/zDDYy5c2%2BwLAaJI78ErJTNsjI/3Xiqy02PZhibqxtpCUdsnRM%0AibUBbfpJcPLjT5hbw84BgGlgpqSB%2B5sCBl4rg%2BmxOAwBBx%2B8kcTDFkdOLB0e7jHTQTIUCqtjUFph%0AsVK5fQgzjJMiGzy5jjisbu6np6B0HmYi%2Bqk%2BmyGYFNWmtJvSsSUxMlhxkrA6efQFYyfSYCrSWEb2%0AbnXv81iDgiezdzKrVJl3dTDP9XaIM4Vcq5NIgla3k1iDYNypPRBUpXMbRACL1xo5xANY0OsIxgBV%0AaMORGyaXj7iAWByGubanaPScdwYjFMI5l0s6jqvYDFOcBkk5fIctXWcfvMquW1xfATjVicW57HZ/%0Ayf0ZPA042BEQLM0QgQ3nvp2AIG0DmxJpJsEZCf7AZnwip39YZcmhXFowcDLYDvsCgDWRIFN9YfF/%0AeOf3ufPzbtEudwkO7ya%2BoeAn0TtGZZfA19dnpMwtlbsKxwHY28vScoZZqsW4hxjc9GkcBhwsiTqT%0AM8y5G3Dip1bI5WSKk0LADoOlQ4Tpmdl%2B2KxLvE2E0ybJCtXsSj%2BrYiYyl4Mr4vnTEmAoarp7UR98%0A2LS26pXFZ5jFKmC6xTJMZykjYB0rYqHKmG3I4/a94vrGw28Dk5yKrGrtBAsgflrCSTM4aQnHeKwR%0AbFrVMZ5a6TPv6UQODafowZFk2uyCYOL6WtqbU32zEg/GvRCfTmDqGYnA6BuXU6pIgRPfpQObWVqX%0AhGEdwetY6xC8Yp9udQAED7BMU3Q6MhsRKcMknwzZu05S3LKXfr%2BfPb2niaFE7gFg8%2BqHBMe6RrCz%0A1UyzGmf2bCfqP9lo%2BDDce0jkN4gFDAkWEhODZJUg1ohVtKTkhaAOvI0QwbcxYSbKgI0TQhyQTrFi%0AbAPpoFLAOABYDU9yLae1AZrB0eKINF1mIsZxiFAd5ti0JGfAkieIE2S6SkRHMH4c4%2BLdDhZmfeIu%0AiT/onCkOgNmP2wk5bOzLwVLekYxbxUL2NjuE2SVhpDDwiesYt5Z92ozWThLHSYlUsXOs10hrMFQ6%0ApqST657W7ZFNEbQxLHhbTa1DAwKw03EqknSXLBorhrrA5oWw%2BeSCp405JDQdC1IwVjasJLyCZDae%0ANnIdddh4%2BG1P8tDGsbQYUnC0M4tajOzIHgxKm/RDUeICJixgGMQTwQFjV4Ldu1Xm3n0/IRJndpIG%0AJMciiDa17OrcG3XtTSf9RKs46VAMcQZV7FPHIADrppN0mAamox97cGCbYNuYQSOWPojG1EEnDmH4%0AaRVyBh16F0U6bid9lsRgZy18SLQuyaNlKVNXRRK3%2Buwnzcg/bUqYHhJTJMGyzRCaHs2JuxHayBDj%0AFB9HOyMJBmAzTKeTDm1pruIzJo8R7cRPwqziEKd/rY5I%2B3RfRAyCn/3L8/PYp7PQec8RCMcbBctN%0AwxuKU7VbQu7/P8NGSnxWE/HG4uVBui8SLgMjr5NUNzHTEOIkqOOSFh7ZcGBgTGYjcwvxXQohzkxM%0AxTDoxAKIH04cg7LZG7smKOF5U6ZMhpCYNa0w36Q8dvrUSESYIqS6%2BBQFQ8R0U5gCBmCrBHEcBO05%0ADUxH5skmLRhGCLk0xFGAITiX3rqAcXbSMvo2LInNkMUqvln2Zha0OFSxpTiuxrpqD/7fs0gAcDIg%0ApwrDVvWxNoC1KMhwmhsGlsRgHTOCfxgzMUskxtdJFRwH8ThiyEqfbgSAPWPxQzV1iD/ZbMBcfa0Y%0AqaafBiY45XACjmNQTKzpTHH0sWljx56UCZXOJBFJoiOJIt0yl57BbZC/u2HV0mTl0uvIgLVKKppi%0A0NVp0xJOkDr2gD/1B0a6PR/uupQWow3YhmFjhIRVplqCjg15KqoCPiNqidCSsGvS%2BgoPwwiOhQJz%0AGphbgAdHy3Z0iGymp%2BtI1mTDB8lYl2cPp2LIdbO8Qolk2BjTdJhuxUgyLXGmqS5%2B2smZQinBKmCH%0A%2B53WVUu4C%2BX1ZsMneGjmUAJmd4p0eefE8YYknVWrp88wEMFnFUeYvZEr5mbu7EcfMI4pqSK5S6y6%0Au%2BnMLNPTz/1N2SQWPEh4TJwkRBzuTnuNffCVJYeb1YqwQzr3QmiZEmeQlU5QTJ9g2IUdrApgw4bP%0AICuEXD6qYBksTfLwT9pUZNVhMyQyzY5M8UJQ3eGUKqzOHrI1HOOHKkxlFuk9gw%2BPcfFM1/b2sBaW%0A0trc50ZA2YbkYYZcBh3jbA2Y1lpaFTivyox1AMaJ1XHJWliatCWR1sUSjG85S2NTdzo3/Qk2PTCX%0AbAarbpcLdv1ib7aatu0TCxWDJlGMkRsJPFPjYrBWl0RLJCTyZL84cwkfsG0crEtaS8TOJfxM9bFQ%0AuUGsU3Jt2P4F0Ex2kY3oHOJzqp9m4sw2CKaZOEHipEr8mR5fniSGCidyGZTHS8P1kmG2zcYJEpk2%0AzD%2Bqsw6f7tkdqnt8pujCi8K4UmIRV3/iEZfEYHTkl4e7Dem10DJIYUwSGdKA6U7PlkQZsLQkZ2Cs%0AMpjasDcE1R1McdKtSJvZeZdc02UQnL0zPaxaIgBWIbQrwUQkN5HVyUA/dnXgSa7grPpmlXd568Iv%0ALRZCqotPXaYqQLoVidiY3caagnXjadWpVnIJY12yE9l8iwSAQ0s4xNMS%2BAO5/QgALwkwfMlNT5ab%0Aytbg1xeMLxLHYatRQJgNU4IhwG6NzIZhk9BErUEsPNpsME5WSQl%2B%2BgZlEJxVqzhlF07B4KSiQh3k%0AYppaOFcNLrfBQauwZb%2BzectZOjbkQab/m/hzYhhwJok%2BdjYjJiTTkUc8KQyunY5UgNm%2BFzf3gK8j%0AdZDcRK97GAhCYgmL4uMY0QYwg9MXbxta6mYKMs3nrrPugZmpw/awkGCt5ZQIGC1xnDkOt0FEUAeQ%0AUsFgV4mcqUIrWMGxlKCT2MTDKZWFQqJjG1gHJDZALjzSuoW//OUvYVABkGCsYgmRWNhicVJUBlLM%0A0oY2MB3j2A2//H8QpRnpDQcAeEtTF4V5r3b4zmMzaSOO/JBDwvD/NAH7LppCLNmA%2BJtNpkOzKKED%0A2PTk2if2INGhKxKzL3zAGclNymxpbsoeTDxvKo3N9PjyYNnawTIFJsCNY2HLMCjM6t72ufmtkiz6%0ABIZNouRpJg5bdkQNHCOkmC6b%2B2UVh0h6ExbCOFacLZHCqpa4gFndOy33GGDJSZkVmRqXQd9WLSfY%0AWtMXT/xQdIrJfZ6pUtgGuWnD9FjiDjuxyrRuNh1mSWZsBkv4E5Cl9IxjUEJKs0eCWLdvuZDgGBE/%0ArUuJTORcShzH0iijSnlbyFWzvTQpnkQGheyWVmFgcC9pjc9OsvHJEBIFh8cBhgjpu84Hb1/w00wG%0AAMDCYo2kUKaCjcsQNjE2TJA2sHY1d2EJI/hZ0rHnuZqWdNKJPdy0KRH%2BSWIKkeS6yjQwlyIRTrLc%0AEZdJfNomLoYIDjZsP7xz45NPdTnbgxaKOIOJ4Ki7Fgxs3lhEvL24DOiOzxKOGGxIZGZVJzYAO/Si%0AwpMrDYApliXT8VmlAUde3kzTIfwSYk1MLkvCsHFsA5txWCUuFc2w2fDb8CQHae61wafHo5C7faY2%0AIz5v7tmRVVRVEcJACkWtRSFSeL%2BzIksm0htZDOJY8AyWQnJ27ASb5nGEmb751tUh7lukEVYpB7nj%0AwEww6TYTAOmmpDd7sAGl0BpPos4Em2JETq8OJWiVuD0zNY61KOADrRGsAJvXziD%2BHJAw1SYehkR0%0ADhWZ0qHpKUeHyhuwcjGVFrz7mnJFB2DWktD96hu3XMh1smSJaSWk4iEl0%2BTqJNei2rQx9bcTmbWh%0AIksdtAqSXMAZEcHXAnEaS7qJWHIdLKWKW3CKn/gdJzCc9KATtkP1c135gU2knYffVaf4ietgLer2%0ADzZUJM5ac18wOGbzRMTQc3oDwFSbvdie4GTpTNrcljgWImUyE0zWbE8//ZuLfW6n6cGUQ3u2NG1q%0A2Qz74iaxCg5IIuGcdX3XzXN59jXJ9bNTqIDl7Qjf21IxsWnGRMpZGutGRJoFjzD7FJDE2apauSkB%0AWGtlKl7L1jINYDruyIo2I7mFiNCbrYpJLWDwaAniSxXCTHEyDnuHmRJhhsS6WC9K/i%2BDJWBTNDBM%0AYSbO6s2RJkOL4wZNJDe7ZskLalfYNAZY/rlfVwWTCw8Yp0kEb2k24vA2IwjYHkgxSye5OADEpBYY%0Aa8FsRSxB2MCkyUNRSls3NzkRMNkOuZAw1cqDNULQBuyHuI7WpdgshSQOS4fcLFHIQQRHEuoymGpn%0AiQMPS6QAC%2BbsADAYJxgSrYil3FQPxRTNoE0Ks3l8nFDN24kU7iis18j2ZiEZwiMJsJBQjlUjrgpO%0Ak5BzKe1KsP2kSqapNSP64TzwpB%2Bq0IODFOJYh77IWJBnH7xgEymKY%2Bk4boFgHMFYCXUSNP1MFQCO%0AmLk1ySVEaqbS0rZTIvgmzp4n7Y/qf3D4nKLr59LixH9Oi2h3uAbiSUdoXx7znZcsmW/ShpNVaXWw%0A6ZCrKGEAoTKdOHUdvjni5z3RG2IS2lJISAfj0LdQLEhWAzMuIVujPSJyMnXYmFbmtKdzqbdpSbcZ%0AHWsF70aYEgcGP7T2MC1LToEBJsuRRDu0LiTEsalLrnUnZwjllAprHEKGhFhfbFhGRACQxiYzQZaE%0AHS6uKQLMTXV2lLdvfPsJbQoFD0AMEVYZkNMeUwZLeUO3Z1YdIEMbZxNcSIDJFryRYHTMjR/MOQsk%0AMPH0FsegeOWiVdqezGBYkpy4W2N3Z61YshnApmjNdUlmebA2gBUzrUvBJ8VIEnEyko6TcbOT0EYN%0AIvCYRYo6sCqACAOAbRBc134MbhiRYECyAgMDX4sDeVqVyqL6h6U51Z9ga2EzxFDCirv40yslbJDY%0ABrAgveJg3L6WKQCDWKtjM1JaGTIF7CA9hNfY5SZkeuBhKgYessjFUTocpoyw4QhOloRaO6ErHK8L%0AvuVkhlZMepANawkdgyDdINa3hUxJZzW5yZrtpUQc8RZyX16svFMxBQxAfstROiMvvcMuUsIGJBcD%0AiW9HWOKUsAGRSQSMnx3JgCWLERgAfOIiUyIS0SpBphKaaJbWFDFuUPAZbz/YNJxcHC8llnS7FWYV%0A68qJTQPBxGEpw6Bs4YdK0YDhw2bbuShuOX2aCAyeVJn9SGIk8dDiOOwKEsqlGZacEjnzh9lWqZ69%0AgLcWV5NVc1PdHWHdFLcZPrVAhoQUSJxibU8H60g5ciUXhs%2BSvrtLLSpSjqETa0vyhJxpNiKPFa/1%0AV1ezbpoMQCcwwbHGzYrNqhUnP9Uh9FqwOslDBR7/0ICJh%2BCckiJmWgCwUUhxDhoinR1iLWqr2pAH%0AQ9tS4TAoZC03bpZUshkXBn6/May/amfVt4ikW4J%2B0qENg2RJHmxoceaYS/EtNC1Lbsq6NkbEOHaO%0AbF8w02RlSSdZtIQfa4dpQMegKZNnkogJTzjPGDgdptgkEZDuThkR/8AJMmw/vPN0%2BGTbyqr0ajSt%0AChrJBTgAJMEiHJhcAKb4ycVfr5Lr/99YEYyJz4k%2Br5MYCeGB0PdiSQ6EtuHrZ7455oWUjUNIrjZt%0AkJ69SJVOTJxTwcahojd8Od2v3QKzVVbl5BWeF7mNzVo2I21S3JFgrIVA0j8%2BI1vAcYqVNlkUJULc%0AJl1VWCIMlhhpRjAROffiE6cwrKXhSUSH7TNUWP7JI5vkrIok8XBxQ26ue9n6LeMlxiFuUWEplJZM%0AdEpR%2B8mqzu736Q2dzq1uq%2BG0Z5fgwcnuMnU1djIQtAETtWEwRbyW3uZUJL3Rrf//YYrx2QBZN%2BUy%0AKKfV/z97b7jm5pEjWX8729/9X/DO7LOHPMVTUL4kVbYld1tC/oAikYEAMsgqO0fdPaixqDUqSDwG%0AMGOJHNuJ55DgxraKjLRiowJYtp4APJX9jOrCkWQK8YFLEfmPZULwc4TgGE5iuXfPgUQ4JUkhEUGW%0A3Y0Ob2tliRMc%2BH74QbBqzmAGZRaNGozuJg81k17q%2BOnwCJE0AXY3Y7TFEWM6hlfu4s4gh8JD0wyn%0ADgBQnHKXmlRJsHxGlYksaufnAjYPHzUurjjJBJVNHMDRlOpXxPzlkKyTWCW2XMKMMZkEfp9CUgA/%0AOJjOyfyBxvCCUzkFW%2BibhUZkqSLaumkTgQa2nKhX8C2PxhHJmJ7OwaZFakpOAWCVt%2BiCB5lGFTKt%0Ay0Ij316AN/K%2BcqxSTWY6aD6UvvlNS94jolLzjpSYJ87hEWd47247aTYlZjVVro4eic88aFoBEzWn%0AdRgIlrNlzSs7mFpwAGRc0ORjlwTzYO8FaCo/kT7NOYM6EKjyXuoo4pwe0U7B2gFI2rF2dulfqwDi%0AujuM11HfKytr5NSkBEYibxQ0pLNFi6m%2BaiWtKnpapKSjRkrfo8iAyHaPqY0lD%2BCp%2BrkHR2Vm0J/r%0AR8YRy76N4Qy2kFD062EjCfMKSnULCDL96eO0f4g0JOXkHWx%2BpnWEkOCc8%2BjlGJG7S0CCM2vXnL/y%0AaHEE1wgThaPwOmEX4QgMH2ChAxwic2DVZgszRK%2BfCWTQYcgADs/TCo92U/yXxB%2BPT66tNYC5sKyF%0AZWG8A1dinkI9CrCF4xJrOnwACzDbwZm1qhkfMp9qMO3rr2NrTSYioNH8Cb//evz4LySQbzzIrDkS%0AR8jeJ/0mVCIBjpkZVSOjpvUR2DowGXC/qQVOO0sgsyATyVsFDRyZZE2hgW81A4DhsKaCIiTh3w9v%0AQWNVYOskRTJJCTpS%2BSZxF2SLlFuiNDpmMuWuWWiG7v4%2BpZAMW9a1UFlNmP8gFNuRckUEcxII1JJh%0AcYq%2Bk1joad98Z4DmsmTGx8mH%2BfDNBCLc%2Bg0bxdLsUqwEcC%2B6hYasED7D97MA%2BVBgq4KXyqv%2BuTJ9%0AUM2o543RDAI1O7WL24M5t1WRrBZA%2BXeXtar5MaVsLQPzkXEdn531Uh%2ByVdPDMgBpnvp9ILIaDILL%0A4e1Opu3j/MmfcQANIJBtLzXBHNlXfcvBJDnljvMTt9YqC9WBbHki5onQWiW7aYIqWA5fMJPVAjjl%0ACJqTENkaAS45xLk4SodybjcXmcT5fOdWzaalClmSREoU6QsvIImCIjatpJEaJqCgzJpOnWoBzEPs%0AVGCc90ocAN%2BtOmD4XDYOW2q9qQNMpnyiSQgwKWfZ1zwxcwBWIaszxSyi1gEoFBjV9C4ONpmS7Qhf%0A4MxTBGzt00t5qixRkSmlIBlvJAB78dmXcvJmiC3yLi%2BiOBlMk4OU4m450hm24HQCqnWkICIRBNIU%0AR/9oEdkbeZ1%2B2OVbwhEc1agSeJc%2BGvJwYLIgEFNQpGheGkwLvYKRDBwbqd9P1vw3q%2Bu3yEJqkc1b%0Addg2Ur04apF0MOLBjBNI4QARBJwCVNYTlYkV6gA0QMljkuYpL0gN4AXR6aaooclSHOCX6p77xNAg%0AuMRE9R/p259VzWFmrY1gkmShwCQsm5on6SlbsVP1UfqvCpVAY1XitkZuPU35IFtOlEBsyYyfjoS8%0AZQueWwnwAVME7EhGHSt2VKE6UwSOIkXAXIkA8gECIlhNZM46ToLKU%2Bp3wJ9/8%2Bltc1yn7h/rx7/J%0Agf2ymtToSQMjUj77zLDF7skhz3YuOGwrFEMjo0hRZpO4hW%2BGmCxHfd782Lz6QUpwFpKkY%2BWBRoLg%0AKhNwGGJVAgWZEOBiKlezAaqSQxeA0YwECmPSy2G8AlhQVEGOIkkBoEUAIGtGzLZeZFgOYzQDB0C0%0ABZFriiWw5ZTIQpyjmlorzTxHdDz%2BcWuhtSlTy5oe9qDyCCbK8sXO%2BfRGtIgPjS0idLy2VnAq1%2BIA%0Ax8DqU9iafMiupx0pYZ4iwFrILAXJoMC3iEjyQ%2B7x46lXRr9yxz9U4KNw17vVqtCEdqxRAxwEtnKK%0AZQRHZGvfpj1ABAuRPXwgYwkD87Xxm0MSPktxjsCNdAAF04FJJh%2Ba5yZ3X4orQqLtx/GLP%2BQb62it%0AIldM66pSZTB%2BIUuGwJbvc0n5ClYiOSnBMUPX9OK0AJBURAVlKZx5jpSSyZEEy5MVwLH2Gp3KH%2Bd%2B%0AqAV2p4RtvZqTJNOSJ2Pr5uRo/nYFq6CIHR3bFhYaPTVvbGZbNwl8jloJpgDTRWaCxGVaSISDGiCC%0AHV%2B1gD8VcsbvCUcVJgsgTyGGsKZLZjxVlugwNiK6YD7gbYDmb3KBvWwdR/15r%2BMIZTlTGZEWfLCx%0ApFd2i7jjARQhHssuJAFWIciWaCb%2BvGxVnQY8opyFoFJu5TgVRwDiPErWpJwE2c41C%2BsuoITFwHYH%0A08t2RnQoLybLKWRF1I9GEppHKM8vjD9WZjhi3do/ljNQizhqbol%2BUnOejiiN6QDRHDUmwDX54GM9%0AWB9fY0%2BTop0XNw/Z2QXEyfciR1SqiBrLX0rEZEmCGybwsOrjz/KRU6CF2CMEHb7W5o0cTSmSt7HG%0APyXJsKwFMCqnlFDo50jsgzYzBcM2qt1d9SM4sBE%2BWatecSR4Kr%2BrCe43%2BPj3E3BJW7id4knZlyFd%0AfUubZyqIrzrXjEMqQkTcDEzHM2OMfNX5fTKfj09dxhQ/Nr98YD/jI/rjBHnmVcDcqsDTSh03CWbZ%0AC84ElSgIjcyd/hnk0N0facvZ8k0iQyxDDR1d/tgY%2BxXJkS0sKdb0Uf35p/zmDMw8w7B1KSWNjNvH%0A4ed/H5XBmgoModmmjvhzmsf8yDY8oI%2BmpATHMDYDwAyyAqoA5G3EPABjVRLkl0wKhakmVpDZqKoF%0AmNMUPHJ%2BxcG0LsqkxBYAF5yWTpqfIyFYeadmUOvIvmzh0Jcjl7N5WuQIDLlM4Jq0xREtV4dox6Ov%0AmhUyWNgS%2BHIAXJ/ozylMCZx6ZWJGAfrWqQkNviVFlY30PQBbk0dswoMwy1OjF/lb47HMyC9S4qhe%0Axy4yuTXrmiGJqgqexgGQv0bELeHIiWyRyKya5RImuYwlkFt5Pjm1g9YMYMjRvCZbCGA/0D5xmJNg%0A3xkboCTApSDlqBFdHjWA%2BkTH4zRBAFvzRDkAl0eP3Td/WgiBEtUA3ouvKMAkNQymDrOBWZxCbsGB%0AwCKjAkARo0kFi/DBxgnCN8XxFa2wazzcun0cMuPcSz9CggKyARls0SwCmJ8ogNMFTRahffQY/4rJ%0AqRM2HsAJJeuG0d8GRK2zY/rw5yTguaI1nvrkAUTz0ag1D2Ak8JUAmVNLVJPmjYozyffBLTcCX2vJ%0AJAVwK83IMADHs4V5BEkW5RCfitQCBQRTM2/tnF8RG3llmXC8BVulUCMDh0XGwhkVKUKz1qYOU2sV%0A5tZCSqzyiCq2HMlH0y/MjP5weURkNQPgrnf7/giKHJG0iy2Is5btHM9JHCP9CgHXZXfJnLoFJEsG%0A2fIcOQDRZa1NiZCP2NHM%2BzEpS97FFmByRscm0yojIHJErUAa47kFeCQ5EQBHRPPOMH8uuAuLz47o%0AqWQvPj9fsL8ZaloXyTYy1g6grJmiXeZgr47MK%2BKQt4mffQRwINfOrZnaOR53ARjNeJepEG4AgYJh%0AQOKKGCOgc2TkR/gNwe3xqS9eXkx0zQ9YbOSjAmAftPJgRchDSEGXJUcAwCFaNWNJyUbKWX1F5JAR%0AOEM/JP1c2eJeeqttxfQHKR1nVpNox6oEkonHzPBbHEGYyyMygJlPvJEE9bqWVA4nrD59%2BzgO4LTQ%0AAgeuEbKqEUmybSTAMVhMycZaBNThlAwLEaK1s6/YPPPzOd7pt7/oYPl73AHIQ4DvMmmUXJSgpk3J%0AsIX8UXz/Q0LRIziUGK19FSsU2GJG8m0BR3eP4KDP4mrGgEeKQGZNBchsp13TK47QIVpuIdGVUQKU%0Ar2OgT/LNsuo21ljw272qhdARmEZGAIsj4sFh63L%2Bx%2B5jbG7K3dWkli33yg01KalpgCOXp3HoQt5J%0AIgtiBiIcJW6jAa7r6C4BQYCRSaqCbB7gHf349OQpc0qJU%2BsIwHISI%2BIuj4hU2ZQuJQUJNht5dQJT%0AXB2jBOIUAXcjLui94AeYjQ%2BXv%2BX2VLIKSh3lujS9muSj9TxCzTXnf%2BT%2BPwS9Re0YjPIIB4BMxugR%0AWL7gSvDURpaYIbI0REy0XHPY2ott1wfXwvKOBAgCvE6yE3QkIHZKO7D63S5AviNoFJoByCEJUHBG%0AT9PxCtaSFBDJywE4UqeCtpBlBtwSHQwFxyvDNqPALgc2qjCxg5ExSaRKQY9m9zvrmwDTiwBgghnA%0AX2jxUgg4hlEaGACBBUBHrKy4WIkZyUQFSUJ43P7TEL8wHqVgXwvDckzKRDN9MzPKbDyZbBWEmbLM%0A%2BAKl5EgWq2BrIkdmYnLH%2BVOgGrGSnLGQ2OKIhYKy5N0Sj%2B4KTnFFpHna2B3JN08X8imQPBYE1Sxn%0ABgjywfxrMN8oFpdlC0cCVS2OXGVmi5ICj5rHpsaSAsdoGJIzM/OJMBuLRoGOagFA6tjWEVnn7EYA%0Akq4KZ/kUDCs4ZcEPmQ97JU%2Bm%2BFX%2ByvxVM59/89kNMwXg8jM%2BIh/e4/z2TWWxxXeA8Z77%2BIr0odIF%0AGpGMHQMdSWgbDSZNk7KdNHrxk%2BP3SRqY5Ky10KiOfKNMNF1s408a2CNizIBJoutD6/EHSeDj8FO/%0AgY9GDUBJOABZnCz3RV/bZ3z0v/1JiRyT1pp3MAmIm2T78Svn8YdD1rrulhcpDwOUtep6JMFTIttG%0AAnAXmmdONJlzC9aWyE2rZrEqMiXpNVf6k/OUXFLmFBeTDzgh20BH6jBDHyXfardkPJV8lHMUQbty%0ATD69JFRe3jGIlpjXB6uIbO1OdJl57G5/TmU1zXgkU1nwUQ7TJKAjk0XAXLRwmVSfO7JVCvyg3P6s%0AFn05lkh2MOPMgyML2nZ0zacpiCmAfyzyra5PBlr5eVny0QDHJz5vnSHpqDmVj0ZTGdySNrdk2KqM%0AoJqCsKfSqhUwW%2BPBT%2Boqy%2Bm8FEz5/k7i6Pi2c8pCR0Cc5RNHmADC3IK7xTHkQbsqO2o3Yntdis8I%0Ap44AXCrDli5EW89Rw5zaxcnB%2BNM/Hx2yyZUy%2BTTGnCARgHl0XI0aeJzc/nSwGUmmMFuAFX/aAgXy%0AOqMaOhlFhvuicGs5vqX1pVY8FTqtcALn8StXbLaYdjQqeGCY5OWLZwmYZLIeSaYphU8/x0OhiwA4%0AMioSMwc8LR9wDJpikXGWeEqGI2LLfCICWszuYLcCIuVyGnUeSUaKU5f8ukgwQpBJrBAgniAaF1RQ%0AcQtlHrfjyGXJjLOvOpzyYcFnK3YGFUiylfkqfjR7/AHtAT%2BtKMkVOHXsGcm3hWCvORh37EsFE773%0AeqqW1ASUsK5ewblerSsI4NhoRsXLANJhNk8BEjgSA8iwBJUIzFtLbGbGbvL6SrYQ8UMqwVuzx6IW%0AmL4YpucHcHskH0q/y5/fPD7xQge5PfjN8sOWdnw2fKgUmiSyoM0PdVpbOwGFntq60xTUMU9E3O9Q%0AkSR40hQ0c9WZfE4dwGhJyldZh/SCdqnco2uUZmzIwGxREnJ4gqRsyhZws/u%2B%2BG3ygB9/ckq5nMkE%0AuxKU5jDz%2Bk9/Sqm19RHdeqoysgeY2%2BNqFDL37H5gTp3TQqSmwhVLIM6RHOC4AluXpxWiWeZB%2Bfyz%0AI/nHADM5jY0mATmAF/eCEPznBHlOncGqqQlGFkIuwZnYkkNhqklwNnCTiNmacQyjGaPliaRDxjkr%0AZ8vVVFAc7EoQICafsprFgASYlNhOMGdIRMJHv3vJrdPjB8fTgyN5HkV4mlSwFg6WCKfgFKKZLwYq%0ADHCvqcD2utB3cTSlSNZxAjkzI44PkFPmIMxaONEAFLoFsGDyBRAQJVRuvvK6kGFxHQF58PEvDR4V%0A4cySXDoIbGcXaXEETiWtyd0WZwlJZYnwKwFwd69PpBexQk5nFSK3yvELtl4UwiwK0rEQZcFxWov4%0AAZguMoDy9QXMJNjMJICPmd3Kud3n25XCbPpmjKo1sC3AeRpmHkF2mQRDDk8mOAVng%2BlyKv852D8N%0AH4cf3yLLp8jEKVMlBkQwScx8OUxLBppHjhFnKsCHdiyTRJgsNb8bn3ZsEtWc4ZjHI6JjTFB3AKe3%0Aae6XRRZay7xHYU7nvdwSIRTjkITM1pXIQfbUm/aVICnfex2/ZDh1cmNVsx2Y5aUECOqVHRUxSjBS%0AwgK7JIMpJ7INfDDGHT2tke1mTK0WXpCSuepCMk0Jc6vazMBR0OhRc07AEdv0p8jEEsiwKgczv/NE%0AoKMcokn5kqu1qbWU9CMsJnpEFasqkmBNM3paBMghgltUgdU5gNsi4Ddc3zw%2BuT9O6aPGmdG%2BIh8A%0An5OEkgC/E0YIAv7VmSO2mtvHA2BxJDhO3do9HIeSiVUw9gVyiz7M%2BFNqVokPZgQ0XdFgqjwFyczF%0A9ecW/LSqLgAHEKR8bMsLlAUD6Oibc748zXMk36nmbGBuB202Arcet//mT04RJFJoLdExbOTWzI1x%0AXx4VFWFbr6cZT2k/aTLjpznB5M/8xMzF1pgtZVRgO9tBZgtZHWvFr2KTaCLbCdJX6hCHaccaubUX%0A5Mrrov7cTrJ4xphKuaWLrQEuTgGcEi13m1Q6E3SqSFE1T%2BEL5mmFnSqrdUS2xpjNU0myAE6LAtv5%0AuROpUmGWg90WA4iIAdeleBGm4jABr/h9CeXEnI0aAMDKkCtAjSTx2s4x0LeFkaSaRcpJas71lMyx%0AKDRzBeRJ0sjoVvJtiPti%2B4DffFjSKkHh1ZLD6UEub2Gn5QMSuLgi5pkKUHTIPiyO5qp7zsMHs2Yh%0AW6p0mDxVxKkjeSYlw2lIMiy3Rvni1OYWrMJxGkfCPBUfeZNzvLBgRshsj0WyYQLeyEt1NXsV0YFP%0ALCMwU5e75WfgFFmiBwG25g9NGrE4ero8JVKFFIAoLgpmnkzLWreqHUcmiQ1QBhAZ/RZ3mVg%2BmbrM%0AqvA8hTy7THwcUdUYgTQlH7FT%2BB1NnbB95xY%2BiwyxduqQdHkkLY5HCU4OR9KKgNwWzEJqcViOYPYC%0Au%2BV545dK2WaLICBCc4nl13GWIzLLu9S8QgMDqCVKi3wIztM4gEmjKRlbiyWEK6SqQsBBUMQYzVoi%0AGWf2yJiCgOhSBGw5ZPnGycFbxY0Q6gJo3erv66PB/Q9KKCddo07tSyRTYUmBZBSqElgVmWT4NwGf%0Aj88uD8BHrdGmGTPRz4PYksYHWcbPQykNVdl8pyUPJoJWzWhylky1MCXiRARFgDjm7FKS66QJmBzK%0AuWnxJjdWJsgZJzc4dcR2CV8JR2aKKH68PI8nKBxbNLMTkgfMq4kle31/OM3M2EhzGJJuia5oE9il%0ADExx%2BdnoiiGTrOqqU0amW/hVVQu4LvmQuXs4AJ8jtgKiR1%2BM1LYoAVsIUKrTjiRwyiLJR8ZgbQHq%0AzEI/u5mxNqmAOp7a0SjBSMYuVQGOpBkJ12iXvnWpHb2kWe4RmYPTqXliagJFivDLiztyHn5YkgKI%0AYYqJfg3KO8A1HrJs0bdjakiRTNPBlKp8gldNyR8L5bk4ZYsUQP2A%2BiaJtYtgLXOiAIGtOuZJAliH%0AglIlJyERwXFkCS2iNWGzBeDINN7muE8iECuoWqclzc/tgQ%2BRWgP8whBNBtxOHTJszRcrBziwAOab%0ApspK8DOdjaxVTVxraXUPkJcjYUZ1UptHlDiDyUNhbsVHZDuXIjY6vqgdAexIpJbtVHiKdZijafXE%0AiOg58Uqr3WzdkH3zzRDJxHQ84lwOaQZ8gMl8heslgFamEpRJXq/DHfXW1nAoaQyl5jZBmRJM2nRm%0AyguKCB6LIzJOKJZMcm6jBaxymDmSeWhHkoxrtjvKbfog3v6UYB7cun7cyco5tmpyRJ7l16xGJmfk%0ACM51ocCRH5xqVxEySJmfc5Z0QqWMHVl1TDJPxTPazhIGpiMZAdEhPZU5O1Z1CDqGTPE1WqImmF6q%0ATTx1UJuCYmNSJQFzaeOcoZIGsG9jkFcBoA8ySVYimSgoDxALfrf4L82dFk8LOgWw9E7gD8Y9/XlU%0ALUz%2Bfc4tx34SbAXEfloAkCPAgW9UXJEZIU9Nj0iywALxrAore8SDf2yphX8oMLaLI8AhyPb6/EtB%0AwdnFcgngjibudAIIbJ3EjkTBHM8S5zRf9CMgyqk1wEV%2BAmlPY7cQONtMKkX06KkIvSqUT6ZCS8zM%0AcrtcIxySBz/9%2BDrDFlCL%2BmaOR5UrblJsiYTygdoJygdSPph%2BWJ0yTwRqaeqReMZXF4ejwhVUEpBD%0APFZNy5O5Vtmo7xtb3bZq8slI7mg6D5PT2YutSauMihvJ2HcSUDA5Iz8ycFBzwXnA259uG4aMZGLz%0AAOwyZc3IUZAMOikoLoGjp9OmnFpVaiKopiCMmgQV7FKvo12nlhD5v9yTBNi3vF3cVgVovJmcWEI0%0AgFUHp47TSe8i85VLnl4Hm/piWkO75sk0XqdmbOqvVjJszR%2B4pFJGySoUnbNIoR0F6ZTH9rBVV47t%0AytuLbaAjAfzDh0nwiEwcsC0a1UkilI9WCYAxiC6ZFHIvMZHt4/z2p9spRVKR643MGG//CLz/d0%2BM%0AkQF2UXmW1HcOI4Z8XVdaGUBqT8FkiqFdk0%2BPnMQjcFVHo3k1aZHtFT%2BFCa7zyJ8c8cwfVR6ZFDPD%0A3EYQIOhpyvEb3ozbkteplJKAZlVTv3YlEwSED3HJxFaEWXIXePLp9LlY1XaCQyf9OgrMQ2br73wy%0AbJEySb5aANvZxW3JtgCWMwAotAqssuLEfiOB3UoofxMaP7Bgx3Aqq2akEAWihPiKOAaxH2ryLBTg%0AV2VtUQ6xzAR2n5krTqEBACYlK8IAqQHsSLQqEfPXLr9b5vNvPufNtcmMThG1Wx9xttPpLEm2RL4c%0AfQxkwhyJEQT4dTFDVJPoALWuyhIFPZVc4VOQ2hUgxQzm7aJC4hKOK3BKhjh/BsxYSGSRaZmZkUZz%0AO7FHXJaktgAazLyckjZinlatAYpTyJr5MHlbCG68x8cRltAktVa8Lmwnji%2BQrHhHtmDr96H8bCFu%0AKreToPKMjOGHG1nlyRHrA9jJ60U7kooQZ/dEIIOPODtaRfR2HQFIukymA3CkI9qUEoFVKZgkzhav%0AcGSvzBZwtSuaALXAVZkjCUg1VRlO%2BXJ6o0MEsmqx2XOEAABAAElEQVQpuO2m5ieNjNPOpF9%2BWtio%0ArU1rnawZaIqgCRAb/dBtRGSq%2B/k3HEc1IojI0c7hZ63DK2WeKG0qmCE6DBHMslfArTpqEpnWJQ3Z%0AaICbyuPbHoBjuVKUW3Ln3gKnZJQVT0ItFElKTkyAd0x2HtmlIwBkVp8RGGUzfspgaLPLxEqRmZry%0AiUiJIYg78lQpWxBZNuUUTGzdD7/JeGRrZ5ZTJMkpfgqMVFkCsMVU6EMheSzKU7DWRgzszPUVzPFs%0AZDRPRN%2BYbB1hmry1vN9ixgpnC/HR4l798a22Vy0EJOW0bdSAykQyLO/rla8Xr0t8q4q002QAHOIx%0A0rGdghwpS5zALbHacMAjtt7XMdwSWynEB3gK4Bbg7hLwFiqnkGblaZKZ%2BGB6ek1e83SU5mxuwdU6%0AMFtBTeeofedJSgiwndhTopO0LWOekghX8FRwKlCisQDXbDTLObUQ0Gch7qi8gG9svxCSbWCq5opA%0ACfm2AMcgqVrb2e76MwJfgmpEFhkjfHWILvKA%2BobLz3IxZIAlHyqPP7yF0Zw0C/Nn/lBzxIIGH9Bl%0A2ZJ08jvlI5i3JPG2E4Dt2PWPASCwFEF2jm0XjuRMHTMVBtT5reLzx6cWZFMgEzGXpLGkND4Dyjni%0AK0KG/9s5mKWmAA5Vflrq3CmfX2LIqhErjCMgcopOzMiWKCKW06gBFWpxKNiIZB3VfKM2CdD8OQE0%0Ap72kHWRpMGnXV5kkNC8LFlQY4IheLP6/DhARMXZTmKy2B0CWU%2BOdePO/puAWhcdsZDoNPE1ymnjY%0ADL1sJzDpkJMZPgDbllUOQFSQOFtPMvgoaaS%2BqF2ZI%2BcEJAJwayHbOGacgS7ouPxvg5gnVqiOyvBv%0An%2BhjsTUPH5FKwCp4WkwqZpn01SQG4CAI4SBfMxKIx0LKe5lvnnuTz6CgnKsD5BWpnAwY38oAamQS%0AddzyR0DbPvvdUbWoeQSN%2BxLVt68RcTi6AbbWjvUFVJj4tSkcFmQ/LJhwDikIKnCUFMAW8u8ynx9Q%0ATPNT8Irl1KVe3N1vI7MhSIRjudOStKq8p2xZ6MzZ2E4FOUVOK3GA4lMOyiwmpCMEsOJUkXTdKbeg%0A%2BNSxinwcaWaQAshxKluQOfKHgmok5zLJSJ3WC0GTM8KsdaAxUK4c7KUc2KZ8ZJJJuhBJx0YfBl3%2B%0AmGOoTKHtZlMwyhKIcJpEUDvBjBKKANbRotbO74%2B28eNK9z%2BQVVkRdaZUMwNYXNffAK9%2BD3gXNOUX%0AKaShvQDXizeAMzT/MV40lGWWOYAKJAHGugPIEFmcKjXLrS0m0nUA80YwU7Oqkrbqt23%2BoztbpCAf%0AeTMeKUVEDRp%2Bgr1LR4JDBL5zSnYY8FQoeQC3xBqBnWECadc8VST96J3NyIRqliTTUk1CX5unzEo4%0ABVtI0/ICPrXmF8hM03LiVPAHh2SAYVhoIqKOCugfaw4gx%2Bil5imFHClIVLwS%2BGAGMO%2BWDNuiZJWN%0AqjUqIH0ILEsQcWwB0SXHciLLcgsfrI9/OnRU08Thd1qScpoaAfxKKQOAVhXb2RopByByNJfiRk5/%0A2/Xu8Zkp85PARD4DjjCayFG2gs0Iwn2iZPxI/JCILfPGCgVEliJExMPk6w7giBUAQyjezu5rlngX%0AaXWvqkYeRZg6fjWPpirUCA4lk6PCQYtvX7aC5gG4KAcoYrSWRq3UoqnGtiPIfATdS4LbquYYNIXP%0A0ccc385QSYDasMCxi%2BnUOiBfhQZOTQW2AXA07sVvQKJ36Y6VCw5xy9VE1knmVxRsnuhSB1zVgd3O%0AMRDpt7MtlCqqSWQeP02B00KjCtw/Y2A6mCXSiILUnMQo06hXkAHOQJ4WRMnpVCuYZDNdB%2BCp%2BaPd%0AFJQWv6bkVSNyUy5Ilb6BW3EoZHkLLsI/JFi6RyTfgmZTMhwhBdM5wfad3eulPlunnVFNoqteApJ2%0ApMTyGeso56Fxu4uF3VECkbzd05dpVLCqQKcqsG1OfVCTU8ZThMhyW7k0tgAU5BDJlJSTYJxokole%0As60EI0cMZq1Mfev0/iF/fNDeJR2AtDIS1GQwlpriI9q01jJTmL3qovLk1BqAvkfciOVFnMHTOlYF%0AP%2BwpVS7yqrH1p2PObxUEez2NlhNVdjwHQzM1pOZgDlwmQB5sVUmAkwjo1djlrepSAGjeyGSTKGuh%0Awx9q6XMLvxhdPP7sW7mnRkq8i4OJOXIwtmBHap74ZNSfEb6NTLqNUIlATbvQ0UbqK0L5VJgYgiJ3%0AysdHn4cpz2lNVmh5s6lTxJkwQB0iebrwkQnIuBwYzbaAOtoFnQkcoBL4DUMLsArFMpYofsQUAB5d%0AQSUosyDYrtrZ3eS0wnJrwQAitMl5iivkFPdc9FIKhTRl1lpxYgowEfGfjwGkVCPKJDqJvfoxATz6%0Af/7fzhJ3vKZSky0EIls1G4%2BtHAglm9lM4uqkqSCxpQiaFM4hwSbJS0bE5bbCaGQ6EiMCYDmVp2Ay%0AVLXqi1EkbQ2QaRWR7uG76qfyLLEqwm8L3j0%2B/TyIfgYBPzAdLAlw4f4D3n6G/Tzwl/yMHhnnB2Y5%0ATESKFnIEn2HUlAmtz/WYkyMy1LIciS1kf0QB6ngKvhM/yGFA4wHMp2bHInkIRoEdjVUJpHGErMN0%0ALxsd29k6hQnsMn%2BPTGcsh%2BPiiEWLukDwpmZStpBohvJ8KMkR%2BbmdOKlApwCXrWckD985iR9z3/%2Bw%0AnWrQyDFzBMj%2Bs9A5/bibuVr4E9tCTSKylNzcuf9CCaiTmsPLn9iMauanIL2UReeQgmYV0Rs5GDE1%0Aq9giwu1kkjxKLLeqiH5GBZrH7uo3CTTLzRBdJAXzChNzWl9A7QSeEq8lynrEHeHrf0D3TFZei/6Z%0Ayr3mj4N9G5tTaom2U615OHLNXuLHycdvA8uVbQZ7Ecmw5ByC6QAkJGWVsapOzbCFwPxvesWEDHYS%0AZa2i3It3NbtAtsTtNSKCgpoJskXHQhWuhWTmGNbOaInWSeaUOfmqo6ksGQgkWX7EXseq1CgnQ0mn%0A8JmQqHK3vgt/iDuAMakUBOXVcR6ObgONT4QMRw7QGBDsS60/vwBOk1Lc2hrdhnv8RuIIBWNqaarD%0AKYtTfxz6oTBfhOxS3JJ7q495suhB/PiTwWamEsDMNz/KYPuWtIrYdQDeCMDyCEFlLTyk3CbOtisj%0AxdYIYKmAMtgIgMCyHY3kAFzk543EtpNQxkIjybmt9UweWB00HUxAVAoFlqMSwZbf0x8YJnwz3shL%0AqcARSw5xLqTYznkSsSNbmxKhoWOMRkajbMFpWzO1swuFAqLYAYjwWZRHAJjslC3YFoDrslblekEj%0Af0S2qtmCiCyr7pR7ZGGayXpqCViavh2RkhY0FnwzMhFRYf66gzaHAVNiRoXbuOMrjZTl5h3v1uz%2B%0A%2B5BCCP1CaMLGUFy%2B48FxqgQ5VZZoa6r%2B%2B7//WxEy8ufYyja2ClNHKWVTcAxrGQMwB1atksab3R1J%0AHZlU4Y8ZoltoVpkhaa/Z8doasprXqL4TJgVgmZTw28aXj0/c8ZOY3vHR4r5m4SCg07ZUmST2Vchf%0ANf1iderWo5iUq088qthSIhOaX4j5s%2BSn22dsOVsXfMgkzTunOE27u70TP8IkwHlIfvxpVbUAluPB%0AABDJyAbYlOhpjejiv5TMDMmb3GMp9djd/lTE29V00mxHxgWnjwDxMKcw2SYOJhlBnWMeySZnTIQk%0AIm3jk2d1U7qIJVDiXeaN1DFChgl2eSk/X2QVUbCt/Fn1qP4cjxL4DjMvrpSnRmgtNME2nVGCtaoZ%0AyR8iKijSVFxKnA7lZPySgBMh%2BdQuyxGHSXQ7vVKBo6nGlgVZ4FTNIHi6hR85BZuqRpTQ5KlZm6xG%0AGR3YCc1Q7lLNXnz6MP//%2B8oNOoLtTkn6FSo7j1Q%2B2rmlSqax%2BwJYdGmZqR38BNWfOtIoaaoaUdWy%0AUA6NuJdXtqkdZ19ljYk3IeUqKyuhFk9rS0pDSjBjnDegYZzWKD9lZjsmhADT%2Bb071786AAEmOsbr%0AbLYrH1l9Y4OhVlOxR9BkNg8jsdzKbAbyXMeOViFCBkwSXNJCo3k5flLqgK//imkvZ6Mcpuboj5ik%0Aq46Ik2m2Y8K20FiKT2BTaeHE5ROZx1WmElo7gBd0EnGcOiqVoGoom/m427j4o%2B0HAR0yRoB9ccbJ%0AydfXMeCYIdKCaOY62JwQ5tyGqXVg49zCcQb7GpsKZlcLkGQhRaRcBU6bDeApaiwJd%2BJHL7FxDlaL%0AvjlmbAcftaNRo/oPJvs6SV1qoY4ck3Ea/j7yZ1C/UwCFHJdBYerTYq6Ojnb2TUTBz65Dn0LIaAKM%0AZkjCJ2OtY2RgAAKY6KovSdv1JXRCR1LNSKGtBSoQYaqA86mZ6V4Ap7U7NNr5T0kAiwzL0%2B6luI1I%0AekGkzCtOkkJfngzAklZVY6Pg8sg4J0yw5BRBxwlvgz7%2BaY4gHPjed05oL7uDEy9DEkwJ0VOkrPKI%0AfL0EbaXZumkncHIF03FstnWJ9ruBJ49PTMEFTMwdgfZpEBkI4I4EFsK8fg8stIroV0QaW5ecIpqz%0AqpIH/WMAvw3%2B/PQjND9j%2BOiQAczBSNLCaeWY6S4A80QXBIAEayl3lYTjMsOpEz6In7%2B5lHrQb3%2BS%0AIVrofeubPgCpp1sbEfWhjgBlifkwlSH0WdQ3rwKVoMOaM4BLCiRcacfwELz17KuCN/U63ohIOZkp%0AIhmRFBSsnHyCzmw5cQKxBKdKcyqTZEUQpA84WrD1lKgOUaBOpwEViPcBP0I6VFHOr3gP3FpLZtoF%0AZiWCQpPLvA/y8Xa1HQQXWxdMQeMB4BRnHgzZ%2BFH/%2BMMx2CkYU6lELHfLkUY15xU4rXzFvTVflZaZ%0ABqDEoapiqw6RZNHkbGomjgpTxxm8o5GMBGuJXqptmqlZMgstaRJKINvL281IniVhapZkMPKUzBlk%0A8r2CZjsyEKoCTOypMZ2ZBD9dDt/R1BR3BDOvAOStvc1x/yJ1az5rsZ9yzsufN0XE8mnmHInTODLt%0AZUw5WmRbNxLAcglEurRMUtK9Erw2IlOhYxfJg4uA5qHKYTCHf8vMIpNexKmIgRQg9O%2BRJuGgOde9%0A7iPAaZWfZP2xr3n4MJvfS5GcmUPTQkVmJJ9%2BtxZ0X/nOFp/T%2BnJEft7aYZonshnnT9DZjEp15HYS%0AjuE5kux9G8kWFtLd32ndCNCtLSemUC2cBjYprY4CZ0iwdvOb49jwj4GTddRj/vQ9JarTVgBNHadV%0AZEpx6roSrFXZK%2BQSW/DR1JGKD%2BHbd2%2Bu8gAU4B%2BTkydpCQS3dtTAIsDBjDABRo5QALNQc9S5LekR%0AhQ5jR5iWz8nLqJOyCnRk%2BXXy8yUiS5JIOzsSyVPimlIcubUphfzguGx9dHRmdRSXUFTNOBUgsyh3%0A3eYeTiKogmPMQntRBVAEJgSGJPkY9vYndyQvhwj/o9n9jzoG1FR2ji1GwZGMjmHtMbm91DE2wy8P%0Anjw%2B552xw88AEwEY56kfMFhb/STc6j4EOW7T9MOIA3hKU2pWWXLlOyGD8e1x%2BRk7toNRhRSRI3XU%0At5ZvXsny3ssBKp80jhSfjahSwUKxBKeas0nm%2BpEFTkXV4Ywj1dTtjE3ytBdM5ic2T9cxSbvZUXzP%0AfeQ7beDZHdz8OsbW5EHzCiWtoiR9QFJO6yfLvz9xNTBJgDpeCj4Zb2R39Ukm6zzkLSweAEIjJfge%0AwJ9NbZ2sWznqNJJVtpvRGYiITJ1EUOBqfHW7oOWQybBwaf7r5l3m9iuYjoo7iQOQYcG5/izYXQLR%0AARqjrd0lRBZwlEigIwunD4qUd04dm5H83DYALVg64NfGeHfl8x%2BrlNcIHUqIiDSJ4OjCtjXJShmR%0AAswIkwyFljh2OoKpBmapBrBwXrYSG3lfL0h0S2RBaE1NMKfowFefKJM8X4OGhOlKJ/A4uf3ZSIF5%0AOnHtTLpFk63Kgnmq5lRuBqb1ynzKOWBGDlWKK1ghgDt2zesYkynWTyOZOWdk53ESMMu%2BXcdbJNgA%0A1/GohWac5ZbcRh9vTrHiXfnW/vKz0GwAbxG/Ued1UuZUflO1RYHTurtVTQ5jVCVmy5pV1%2BvUGiCT%0AaKFxypJh2/KafSvK11RBaI2tuMxae8rWjEDskVVzsDITTMLT4R0M2tGRbbVdyt/t3o6B%2BygV6VI1%0A8hc7Y6t/xLaWIwiwF9Hfn0bNkaZ4tQAzztM/Spyf00mIKSB6SvT6xFeGzyN/U/mh2Cjl5hc4uVcz%0A3gZ6LGv7WBVMFgARTnPahSSAPKsSMHlNmB/TnMcBrFX5rnErZJGHoKYZkza1NgUJko1MMrfguRQh%0AOs/8cKdREFD24mIiTRVvKpSlkeezcIFZNuWUQlczuz1E4lfb2DKpQoHFnMUpZWHlszU0RThlofAY%0A9vYnmdlLzaNdHe3u6bxCCgDybiPI12EVbjd5/AM62m8FXj4%2BMQsjivilp2RY01kzRr3jdH6cFnYE%0AsNwYMwJS4uJTPsla%2B6H2g9RnLEFm%2BkchA7DqleYcYw4wmX577t%2Bij3/P6xSggpxGYgs2KceOFbKV%0A42C09kiahUYzM5J3zXZk4DQPgNOjHRzazWu2bQwzFSo4u8%2BjOfZkOgxVTWWVrWvK1pmhsfhkmdnP%0A16uZh2PhFKkdnIaX4LTkJ3Bb0r5T0BZvImRO7WtETUFjmop0Tbs8jU4454yGiPfq9yZb%2B8Kn47RL%0AjGnkVZCcWo3gKDuPmh9a%2Bawg48U9kpPgFaQG/xCcCmJijSZgSLcBt2oiSxe/JMT5nWHrSDCpdQCi%0At07E7mznANdeEiQTU7MF8bjsIWg7Y40ESqXcKeTG6JQurq4cID/HULaIFIR0AByxVKuRY3t0REuI%0AcmYsCbiuyRTLQR9gl1k1%2BZPZBZ15XtyMZMunOKf%2By0fXTDYaHJIOQ2QbFnhqoVgOYwCMMCVUItMt%0AHAZgJTJ1ZkcJXKRF1RWbTI0uTkKj%2BTuBLUt9yXO8ZtCiukzm%2B9komTOA4wtma05r8eZSciAzqnFK%0AeVNvQZ7lHY1mPLXckdSEI1DE2jkJp26P6ORzJFuUARyrGeo1M5IdZg5gHmaXOn6tMTOn0KitY8re%0ASFljjSy5VumY7frmsDVvL/WVmr382uSq4rPEaSsJNFWjYoKLDOCap4v/EOwUtTk8BOcn6fy1A9gx%0AE9RX6to3soWVT74Ypu38mPqwHIxCgOV0hMxgiQM4IpOURyRblrv1NGcAzVPSjL3Up9YJacRqQrcc%0AXZsicujM1hz5QRwfx9SZYzOAR0XHu848x0bhupSqMICyR0QBGa/QqE1r3mHkE49emFNGzhzeOe1O%0APjA1Kdfhq1QTpvnLg/PxiQWamGUALCOJX2BNn86aMULwyJJJU5BMHE/jeCTtiJM5MTT6%2BoXwQ/UX%0Ajdh87dJsYAh85%2BbXTsEIgFlea6WkIQIwWu7p5EjwC2eMj6Y61sb0p8KOU2q2s5BYreVw6gJmyUEN%0ArNqhCV8fuqOgZKDyo68zECmME4Dccp62ldTC1uTl5JsfrjERaBTWyCpOWYeHqHVad2gHluMtio50%0A3R75pAAqp%2B%2BE8ZMyf40oOIlSYqIKXJmFM2wBqnFKOxdH2UWGrYJpAsK2uEt%2BSpE8liVN7iS1nmrX%0AwiPDVrXvxro8Bd7dGYh16TuTDw9jPv%2BxKr9bqz/vCDZ5RPPXyb1UM0yQbF2mZo2umkfhUWWLrtat%0A%2Bw4I5iRgNTky7/aQotH8XsE5RGZtQx7A7RFRJuNFBEYEAUUBmWNR2BGA5UWOK3c7G0Hjt4FkmUTs%0A6o7J3hTfLubxXNB4Ju1bC5NdVnLMvntTRFl1ZBIjKHWNXqR8jZqkHwSAK3GqxLYGz6qp6SRPZ4NG%0AeWS3CdZLcbcOeVRNhSuuRIVjkrbO7zXBADP1BeAYyQQBJKUdZjZGecFRqwIigk6zIoJj0GuCybdj%0AXdjG/PjwHr/e50epgswiXeA0ucM0ko0oLFMjrVC/f%2BaafNqIQk75KWPR7ujYPE8BguSVdSSjIjOW%0AJ2mje8Nv/kuGXvlqlMMTncGmXby%2Bs53YI8c7Ikdw5iKDvjNc/%2BZzzoAU5EOQWibnUkdTZ77GyuUT%0AGSZ8BfAToZFzAp5%2BxJLheMHUagowCQGRwweOZNYRgJqyHUUTKHhESyzPQ4DKSs0SM1YVAZpD7Mvj%0AzNbGtNGM16a1ppbCFCYwD1NlRTCK1fDpwPmt1vn49PKaBcbHrMEsMmwB%2BWsmjuWexgGYL86jiSMc%0AQM4R5dh6fqh9tH660viGwQTLJ3IK0%2B8iynWMIN98rdlGnsxwOoLyADs6qvnEo3nKVNfZJiccQCqs%0ACJGMESCh4ed4/vhpBfku%2BxRYqJrRvuUFTxs14QTwJfdZVCvN6/jjeny4EI4ZyMTvN7iCB1kmcS7V%0AvEKDUa5C8Z74JlSS2vQ/WWtUVq3CK0DKQjUl1NVPjW0fnLSuD7ja1QBTWWb%2BNwmC3sJJyjcDgKRR%0AjjMccfYSFwEsFcSzV/oThBuYjEkUbJ0JfW3MTHHKI6eQTlN5ZP4pzbFt3QA2Uj8C4KpzzUx%2B2NZF%0A8%2BoTvd0RzR%2BRQjLoEHGAkqsUpk1vD4KC6oA99RbggPlrlEA8AEzViIFruZlJuNM/vqg5YFKavcD8%0AQojsHb3m7FLhARzPpPioisAM0IzyG4DtpB0mz1MLi/VSiq3gVZRveZ7428CfCJN2bLw5G4Tr10D%2B%0AvJqZ5gmg2QzJQp61EiwxOsnEZPqM0oSA1KtlC%2BJ1UUKti9MH/MzwDSHvGDPCaJLys1xlR5r5MFWT%0AI5NIu6Mq/YAikuH3Oc6PEg4ESuqoLHwMPDyMZgtLTFplL/Vth45LgoViWz/OP742syM0OQHI4QAc%0AZ1DcqA44IO7xABCT9yKIZ5Fvqrb2paNLvoXEY82OHsmvyiQ0BwCwOEXcGeh%2BvD/Js%2BoOmJoWIsLA%0ADaOg0cIZK48PIDm3E8tXwWH6fAFmPFUETDmRo3RqKiDPzMabBfclebZTtniIJAWwFhmAW2KFDnOM%0AGm32tYrY4lTZPrIy9kIcsr1oMcHsaD5ZQH3VmVEaJQrq83S7jlPwl8fPH59dG7/AWNYHQyaXpckx%0Amsn3QIIHge1Uk3%2BQ5cSUH5O%2BLL8WxvmhcqQagO8c%2BMZ%2B8BHxi3ioRbOWKIEYmBy/UmaM0mampoLb%0AEI/ZILslMg9qRNat2X2ho1S02VGdohwJxo4QQ6ckeX4CieSPdvUVFO%2BDfIaUBR3ADwfgXFentbDW%0AGJ%2BZWX2ybjm1HHJMLgKGAICvbF2ksY0/gfmiM7BNxEzRfKcwWQgSGUBlQflZe2N/b6mmlNya%2BpEZ%0Ak6kpfadd5omWtwXAZJFXygkRnBy3DQBoDHGEWQU2H5g08FeW8xQP0PXNK0g7bkScDphxkmhUeXcA%0Ai7yxwUoGrpzIgOOmc1vhVYrMTE5B8STETBzg7a6xI4DLIcHoeHdbeEoGS101nYQPlW8/2YYUvIkN%0ADyd9k1ahD7DLzIiL0mQaLZkOxLGRBK72/o5TzZLZpVPAXPaSf0RontLaozlDJqgm86owe2lXhYIi%0AzI7S4cotfyg4IuNs8AFM5ZajJuQILMHTOJWTcdlX8tOS5oEPftTd/pxV6pgUFytJSkD%2ByDAeGW8t%0AiJmIV3DL6bz1MQOcZphH1QJQKJovUiKO4zBHlHM0stZCr2Ocv9w8pfwQZOvHl2YtJrAFUR1FZq9w%0A%2BpYgbkYAjanArKPjVE7EgYvHSCpMqTL3DrcnHwtsBCjltD07%2Bzs9ZqM1pw5gu6LibK8dOwJAKDoG%0AEU0iY3hkF9rR2gVmOVgDQIPPFk1HQgEwB2g88tEkm4kAQI11BeY7SspJ5mBztnQopEQRk8S50tcQ%0Atl5hcpq57pyKo1EILiZrciqAj1EVqTbNaws4jMetBbl9lBwtrlv4ituU7ex%2BJCXDZzF5ywzR7gG3%0Av3Z89/jMCA3CCAwFE1n5MmlyPDpo8asVzBjnAHEA4TgMwGdp9EMtAwdsiRy2LGnkjx8SjiwJsJ0d%0AwW7tftO6r1nl0YwP1jc/MCTlqMmWqZjHkYz2IkpOJ2BfdV5xyktGDXF6ua2RY9SR07BHZSwkBmxh%0AxmjtzBwzu40wW8xaaX5e4AmqJW%2BJZOL0EBqnJOXHYXtgM9JmVLypAGJB2JI0D5DgwS//CqDDkRFQ%0A0wPEgTldAjeJHAtLSiapaXBcdoz2SH/zrSBJYUeS2c4qdUwWJ5gKMw/uSDC3ZQDhyr31NTaM4rNW%0AEfKtMlO/ZLQD2GLGgzDVOJrbp%2BIlAWIjtXSx0fyUTRrJRzPjlihAKj5kvgN%2BDYxwjl6QLUztJjRW%0A/JE7oRxiIEb6ZMQTRDuSDnPEOHbhRhK8JsnjjrYrSk7E/HVLpmXJVQEC7ehLjOOWDCsFgIQDTIL8%0AI7YNWKIavQDEQGPYiCqPpOGM5hAhcMriSPIVyInZVv6M9i0DcKE/gdtb18fiFPjBvv%2Bh1BzmwGy7%0A1CRPkUkAe%2BtHz1s7mxYPoJR9wQ1QC/lt4zdPJYKpH55VDkx0UQWAUHmC5G%2Bf4uMdCKdhAiVnBgXX%0AbAF%2BpD//eUQG/fL3bh/PTnDijSfTLXjmwa5uDXi67ELs5SmAjAKyjn177d0Xzz8ywK7TGI%2Betz8t%0Af9qxI2lxjknQl%2BkMdHy8Pb/5H%2BL2lGh3QYVogomNNGmQ5Qc8NSpyRLZlBJAVYWBAUTCVwbO28qdN%0AOWU5v5go03YqhxMxE1kwFTpK4QBJASLPJPxD9pjzqDr03SI481NfnMgVSKgcq3XbmH60q/ivl/n4%0ASK4X66PCF38S%2BnnI2VkFrW2EQEeC8ldwMCdf8oyezk9U7CfKaVNRNdfxzaup/BlfDVBru1xL0owJ%0AZy4LiXOw8OE2hfETKXMFTznQWLUQZIVHxQC0A7NlzZHaAuTfGANP8pxNmtF5ZhU4MmD%2BoJqvENBF%0A0JlYTrFCAMlrjDlBl5pAPOMUtFHtnqrN5CvshJ3WDuDiCCBhNn1j16P09uf0Kh3U7DvjdYbZ%2Blpy%0ArTUTU8FrU/PHabQJxDMqTqPW9MFT4iyZ2KZG8xPPzGQemNZkjMeR23TegKNQ5uSn300Fti7ZVnCV%0ARbN1fBnIx7fdbHEVnPwKryCafQ9CjcqbaSuYyVkCdh18e10v2DDwKTQGSk5wYLauo8rt4/D8xes8%0AhwOHArWHiGrNLHgVLUehNX8WSDYbwEmMh0ueqma0tugA0dqSccUMPE6%2B%2BbNCQTEw2UkFOAW3FRc9%0ATQFNZY/LmvfISMncTqyaHQ/9GlU%2ByU5lieXGKQ52W6FVxlcfpVXXqMgUJOP2SM4u117OXCHAlY2C%0AxO1rVE2F4gRg1GZ8yH/zJy1YvDl9drq10BY%2BNe9vz4%2BAXa8co93sKLZf%2BAB0hGDfpzPQy8a9PwFm%0AGgPNZLueyt7FKI17Aa7R02IlUyHcqVJ6ZWyq2QIaJVYZzdgO5kzeeGNNJtgugiLg6VKGI0AR0Gyq%0ApXmIWGXSkghjwG9ghFmVfu04VfCQrXy2njhCUtPwQ/OVeCK/Bvj89lzvk3cCYuBKJpNl0sgEnvI7%0ADTylmZQzY%2BQ%2BTjJ8osSZiUbtdXFKMo61xZkHy5z8rixoexQmOAeb5DmYjczUdCqIKw%2BQ9%2BhpvB/e%0AQre4Nu30PbipjI/7wGxtcSN9uxyVKPj28LZrto5k3ivOEMfC63XMTBo4wfBTUNVxl7aCGS059OdW%0AQgq1%2BApQp1qAeEZ0agc4Vl0quUmMBYFdNMrFAmMEQdvJBM%2BSdA6O2y/G2Sh8zFC%2B7oC5Gsymr8qP%0AkZIlP/FBm1uaug3M0ynyCsOfR5U/TXpHOLa7budRUgIFidcFgeTkH/ocmYlz8Mtfgcw3/JQDU%2BSa%0ALAOY2Coa2UtQ5NS8NAtnJJ/a5IiPOAuPKpjXAUq%2B0eHokJoDhxNXqnwjAea6ypKh6rrMK4tChWK3%0AVEm4gqf8klYRKzTTVjBjJXMYknMbPkC1swvic3HEtngw51ZstNGB1Zm0MHxLZvR0dp8KMW%2BV365k%0AU6DQ2gkmzdP48whttt92uO1MFqe%2BXWaENltUNXVIlhcbU2arZoBtD79efYBojs2/B/bSA7BlcWRE%0AzTFsVzz62tTYkY2IvjyJjeERfBvRywdnz845iTRla5G4GeKxHLvhA9CSsqStYEYJSQHm4pStHOKh%0AU36CxK8gmpopByIcICnyzTBFwHNbeeQy0tKBIEcg7jTyFL9i%2BDFtlI7bBNsKkgK0OAJPwlH1S27f%0APT65MIZiCj9gRD8qXZhG59ph0OQcR1eRp4QrLc1A3QEuqgDFlC0hHgCCmVmiQrWCaILJmfiouspe%0AxztGakvt0etae21d5gpUU/bapVOvMLcTe0pMv8wBqop5BZVEJiOeZDExUGF8qiwMdCTZWvAVHAS3%0ARjWfZjoKTOWJn5bP5BucTl0ExzYaQDxB%2BrM2/EqKKqUqFxx8kzGv4CAcat/d1i5mmQBH4KM1WzMz%0AKnIUpnyASevoadIWcQDXDMlr7ZE5tlPwelSLecEjOSfpaE6iLNHVEdvZfbaYmpPzXTw1Jz4K55wT%0AH7S2k3PMCcdGxUBHgBQCMwm%2Bbk3OWG2g02tTMxAEs%2BQVVq3CYzvz4EQExACFYhWmDoUsMgHx5E%2Bd%0AFKyaUuJrIfmZvJYcmZQDszz8CpjvVHGiasXA0T3mNW/GeNWfp9fJX011dDkKqaowMBuB50UmPpSr%0AqoWZKXtr9vi3KUFVUw0FF0lA8SCzTSRw5ZiZOlO8x2fPPzPykWXd3pr3Nd97JDhqBvHsNbFqZK5j%0AOMzs7uuXjAoN4APYSHeAR9Bmd7scjZQyOcmvsCJWFS2fR4egasQAZPEbkY4m%2BKPzH12Sus7M0aux%0AObrqpHCclhcQBekDWFNQXOYKLCEmVUYw87N8KpenZOJD6hfbfunxqX3TxC%2B68MWSL9Jo%2BorZBzY/%0AUfjlKxTMeL1LVcdRIkd%2BNroemUkzcGUeUz1tV3ng0Jn5iSct5aMjnI7iXzMdCa5dXpXEDBxS7wut%0AqjZQleDYHi2ezpzUU/KRTJ/8xJOWYGCe/kVc08AhaNMZITRJVYIZD51ZdRwlcuTd1uuNwtPCLyaP%0A7sd2ztAkBzhKju2rMb5Iq9crnfJvBN8cVR6YHb%2BCKwTUSDDjpIVf6UtILf4b8IY8u0yFV/k47wnz%0Adq%2B6HwrHtkZXcDCPbe3mDFeRMkd5%2BQMkS37iSUtKMGO0aud4JaMBUpvJA8/Cg39sj0K3s5zMsT1K%0ApuBTPJNHbcqCtk%2BbztNDp%2B3R61VJtEAKgveFVlUboLbCK5gtOp3JiWeL9AMyExHMCKFTybN24tl0%0A4sqTDfja7PlH3kU5yixfngGfnfeTz8fn7DUxUm3DArsY694w5u1ia5%2B%2Bxka6jqE4TQVtG%2BMAKByZ%0A6/YQObbxlUrwANeqmZE8M%2BFAjQTpH/lX2%2B/q/FFBGqV5BXOMqfwKT/6BEz/ySV0BzJJH1S%2B5/QOP%0Az3n/w9mrZQdh1v4J/EW1xggcvdIJHISftL3Oc83MkSZ%2BOtK1fNLen8acXSaOAHiVn5xru1dVV%2BbU%0AeY9n7cRVzaYTR7iCpzpX2tPMV1r8Ff2nTUt%2Bt/tsPfFV4btSlijyRfIsqeMPB18ZZt594jnMV3Qm%0A/2fgr88wmdcbfSXzdP5kA09pJa%2BNOvoK%2BGIXpP5Eo1cls%2BnETwd%2BJfKUPJPvC2ffiacC%2BL3IQWb7%0ARipymoGOAlNn4ggTXHXel1z5U%2B0pvgqaeSp1TV4z3%2B1y7VjJm6M4s%2BMb/qRZa%2BZNydMWVx1ph86x%0ATeq7IP3AtWSKhwPxXynM/LWqjIDYOl59NkKt5Zvz6csTToMFUA4LygiKs/XEVjmAr80ZG%2By73et7%0AzMP2ae2VVuaNVJypOXEEwFd0vk6D%2BarR10XeKCDyZs27TDxLruLXzOS/wof%2BFJmY8mP7SvCXyX/1%0A8Ykvh4l/gwV/ouMXP78/ofzX7/tjZ/uiGmNP5tOLP00e971ypuxB/knbL3a8jvp%2Bni/KJvKH9P%2Bo%0AeF3egC8O8MXWX1R7M8%2Bboy/O8Ebh1dHXx/5JMzwd4I/2eiry6spfzL%2Bf4Ti9DnDNvOl7qL1hzqM/%0A1MLCP9doNp34iwP82KZzAPB3Z/h69%2B9K1fpnaCb%2BRfBTZ3gjfj26%2BnbNXC915VyVr1U/NvOHOl4H%0A/vowf1ujNyM1v4D4dKXAzK757CQDwTiZYNTKXEGngqJvTraBmLO7M1wnuTYqk06ZAxy3OE7n9rtS%0Akb%2BuWckVfL3drJ2t/6jCrJ2ab/AfbTGlvt7uTZeryDUzm/6q%2BEtPSnzEnTdu/me6Mz/Rf9zwP8TS%0A6cAU/ENuvCd/vcUr5hzsD%2BEp%2BH7IPyT7S5LXqz5WrfgNvzDzO5Abgt/QjcOBH769uv2fZvJ//oQ/%0A6kO53nQqf/1zecV8rz97/Qx87f5qzr/Y/doIwZ/Uq1EPfbfEljOwrYQ55yLvVgI45nfBlIXsttYH%0AmGp2PN6ccwzITXJ0mTr/Luxs/4GD/bsM%2BXl9%2Bxr8vBb/mcpfelLyFcQg41%2B/xs/%2BQr//LH9296/4%0A82rCvzLbK8338/yVju%2BVf97pm5v%2BE6/z84xS%2BR9ql2P/wA/0jQ/zI/iBHZP94XdJ%2BSvgixdX6mdc%0A/ytD/ljOmyv/2Au%2BafTmRj92hjeNXh29H/vfPt6rsf9Q/v0dr1L/xFu/v%2BOPutH7Ljr5o3pdP5eZ%0AqYuAGJg0MDM7dsDkQftDW3tRUtNb%2B/sqmaB96952EsIBxML/FsCcf6Lvv31sZ341/M8bz45/Wv/V%0AwH/iI/gnlnzp8flPvNjO/KMceP%2Bj9ern51r1ivmj5lyddWAdWAfWgXXgZzhw/SeaXfafaz/DbTWf%0Ael5S0HaO0YciaPtHP7Kn4vUNIDuZs2l4zjDxHHvxOvD7OLCPz9/ns96brgPrwDqwDqwD68A68E9y%0AYD7tnLtMYN6n113A02M7S97jo0tbQdtEaiRoC2Hi%2BAvWgd/NgX18/m6f%2BN53HVgH1oF1YB1YB9aB%0Af5gD12feNcOVrg%2B8a%2BbP3Xy2e4XnAEffY/vnZtiqdeAXcGAfn7/Ah7hXWAfWgXVgHVgH1oF14Nd3%0AYL76vnLbH/vku3a/Zpjq2vSa%2Bcrwy1kHfkkH9vH5S36se6l1YB1YB9aBdWAdWAd%2BTQeePvnmVX/q%0AY%2B%2B73f%2B2SWajxevAP8WBfXz%2BUz6pnXMdWAfWgXVgHVgH1oF14NOB6zvwpz47a3zt21Hg75mkdgvW%0AgX%2BKA/v4/Kd8UjvnOrAOrAPrwDqwDqwD68A6sA6sA/9gB/7rK7N/5f/A8xWd5awD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvyeDnzn8TmfnRP/nmbtrdeBdWAdWAfWgXVgHVgH1oF1YB1YB/6cA//lk/KLD0to%0AX2T%2BuWm2ah1YB9aBdWAdWAfWgXVgHVgH1oF14Jd04F/XW/G85L8kfTwy53bip/916klI/ymz0wXr%0AwDqwDqwD68A6sA6sA%2BvAOrAOrAO/sANPHp/ztj4jiT5Hrw/Ip%2B/MqRCWeVWIsGAdWAfWgXVgHVgH%0A1oF1YB1YB9aBdeBXdeDz8dkLk6v6UCwGpgt/7hmp1Ndr5c%2B%2BE39dZ1YtXgfWgXVgHVgH1oF1YB1Y%0AB9aBdWAd%2BJsd%2BHx8Ho3ng3Niabz63jwjn74Y50PxTa36TxWOCdl%2BV%2Bdaspl1YB1YB9aBdWAdWAfW%0AgXVgHVgH1oG/34Enj09fdEec2/mMfDOxJRJ6rLKtfBK%2BqBMtETJvdCat2gXrwDqwDqwD68A6sA6s%0AA%2BvAOrAOrAN/swP/6//%2B3/87W/KQ8y0nCMfxOUcMdDSBhWUks72COBMc5cc2EUuO7dSZ%2BIu0WbJ4%0AHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhwPj55i/rSE4RrxhNuLvJsOxUcb0WT0iIHjtq2iQQ6AlQe%0AmKeTcOTfH13Jm1kH1oF1YB1YB9aBdWAdWAfWgXVgHfjrDnw8PnvgAXp2Alj0MNqMx57rv/7rvwTk%0AAY2iVIJVRZM8S6oNTJFDKp3AlJo4tZhlXtEiLFgH1oF1YB1YB9aBdWAdWAfWgXVgHfiBDnzz3/nk%0Amdf6n//5n/vb8/YXocfj02cneZ5wrWYiDzaWBMgMSCA5OeBZHj7UrlLpxCxz6JuX9opzlOx2HVgH%0A1oF1YB1YB9aBdWAdWAfWgXXgLzrw%2Bfj0PTYfnL0/fXxC4LXG8vFJdJl0DkVmNB9ngo66g4VsAa6w%0AgHKAIkUzxAkoPzKekleE7cSSN64D68A6sA6sA%2BvAOrAOrAPrwDqwDvwMB26Pz95pABevTV6eLrE0%0A33uPV%2Bfnn5zOFx0iU9ZTCSpEDsBhWSj4GOXx964dpSBgCPjqTLWwNMrL3Do9Sq55TzeuA%2BvAOrAO%0ArAPrwDqwDqwD68A6sA78QAc%2B/uazlx7Av/z0zfnf//3fgP/zf/4PLX2n8YTjvfe///f/LgJ81xHh%0AyAyw7RQw8dNrVAigNbElXxEifVlwzHSabPlKZgZZtpADFS5YB9aBdWAdWAfWgXVgHVgH1oF1YB34%0AsQ78i6dXij3zenny%2BOTvP3l8RuPBxpOPxyeLIyLbHnVKqQO2yjdenEB9D2C5L8%2BiatYSb%2B/O%2BxJz%0ACkhHTGzBBRMnh0YkyyxYB9aBdWAdWAfWgXVgHVgH1oF1YB34SQ48/5vPj//E7f/8T49PHoFO4BPu%0A/va8BfK%2B63zmyTkenyR9413jcSsfq8fj0/enR0rdX523wADOUwsFa%2BRsRMqLgEkDc2qJ%2BY3rwDqw%0ADqwD68A6sA6sA%2BvAOrAOrAM/1oHP/8EhdXv48eTjCcrjk8XffPoChONjj/fbv/71L5%2BgYBZ51hQB%0A92K0sDgBmDWZYNsRXU5FpIXtjD0%2Ba63abZTHggmtKIGtgAiRqHjJBevAOrAOrAPrwDqwDqwD68A6%0AsA6sAz/Qgc//waEeeLz3wPMvP3l/siVPY990POfI%2BPj0afd463085GAqOGf1mTczB6akwo935%2BMP%0Aj1Do2dl70tZTqmEko8GQKBCjceQ85AUdLVgH1oF1YB1YB9aBdWAdWAfWgXVgHfixDnzzN588w1y8%0A1gBEn6D3v/68/S8P2Ztn23x5Xh%2Bf0Cg/4pu5JUewtZGmLjm8En1P0tS%2BbqsV%2BPiMiQLlKkQo08uT%0ATPgQ3O06sA6sA%2BvAOrAOrAPrwDqwDqwD68BfceCb/84nQj7JiD75enwKyMPxBejzzxcg0ffefLxJ%0ANqrcoCXNXLdkPh6d9z/YsmrNq7LuDnMoO4w0/uPBPj4tb04AmkTygXQWrAPrwDqwDqwD68A6sA6s%0AA%2BvAOrAO/EAHvvmbz3RvT73Hf/GSZyePNx%2BfADg82HjX3V%2BFtzzvQKJJT4mUv4kcdSou3jt/BFsQ%0A3cPxLzNnd7APyENQJrNRzvuTU2gtTmvkEZFFEo544zqwDqwD68A6sA6sA%2BvAOrAOrAPrwI9y4JvH%0AJ08vdHuVAXz4%2BQjkhekRzzMyvgB93ZHxEThfbqmpecTrBeQ3wGzdkU/Kno6zqbMly5GzWctgLMu9%0ATiLkbSpIYcE6sA6sA%2BvAOrAOrAPrwDqwDqwD68CPcuCbxyeiPfMEvuiIPQXBt2fc/T%2Bz6mkvQPNN%0AxmmCMtvGuQKZRfsqZXlSbDml%2BzVPhjyv5fl3nmaILESoZWBriWLArnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgR/uwPn4nA168s0k2OcfT7hehr7cZowmOCJb1tP3nuJFW8gvUujTEeCQ8QXk72/M27sU7Ja3%0AKIu/DoVDuU9QMKcpA66Zebp4HVgH1oF1YB1YB9aBdWAdWAfWgXXgTzjw7vF5f7V9PMyOFxqdeKTZ%0Aj4cc4BVB2oyRKxHEAVxXnI56QDoM244gs%2BWdCfAVyrOTTCumABqgwQC71oF1YB1YB9aBdWAdWAfW%0AgXVgHVgHfqADLx%2BfPvboBHDximPra828c/hsm/F93lo0pQGsZav4EaVZFRbAtNwS3pYCTpmWI96c%0AAP/Ln999fyaubNsF68A6sA6sA%2BvAOrAOrAPrwDqwDqwDf9GB8/Hpm7AIcPGE40lGs153s3FHEopX%0AoFq1c9uTT7U4AGhu5R9VHDlVkQwPUWmA49nZ3396KavUJ9qLpKD8gnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgT/twPn4TMiXG5EXGosHG5FTXmVFgRkLe8gdNE9nTL83HsCqMq/4R%2B3TAah1ZiKEHpwCMia5%0AlLimbMWBOcbidWAdWAfWgXVgHVgH1oF1YB1YB9aBP%2BHAN49PH13zacfbjC2R/%2BQq6mCeZIAiwMWj%0A7rvtD33FTVqLFDo%2BCAG185QtRyxAq6MyiDRJs6GmuJEtCykihdKSqnzBOrAOrAPrwDqwDqwD68A6%0AsA6sA%2BvAD3Hgm8enir3iBLzQ/F%2BI5bRHGqDt/R338ZBTgVNfdEQzxgQBt0fkfcVRnC2CKdholitS%0AnEfhqtQ0KlucY6NWSSIAkhyZ2bgOrAPrwDqwDqwD68A6sA6sA%2BvAOvCnHfh8fPrKKgJ8HPLyBBDJ%0A%2BEIrAnjCkWcBGIKMS3yMBQ0po%2BJupT1KPx6uvhLToQo8y81YC2ZxytZJ2IKNAMXVPCIcMld%2BtbbY%0AuA6sA%2BvAOrAOrAPrwDqwDqwD68A68Kcd%2BHh88tDieUZs%2BTjkzcnDzJenbzZoNDOSgebLzULfeMZo%0AHIGNyhZrJ5lC1QBwUuOUFZmjMHlo9/NbqBBsR%2BMkwPEuzj%2B7JFUVmXAiC9aBdWAdWAfWgXVgHVgH%0A1oF1YB1YB/6QA59/81kZby2XT0Renj4%2Bew3C9JHWEw7gIg%2BQ0EOOrYIANYuPVrfXKXxWOm6NnLri%0AowA2CedxfvsTBTMQpFk1yVM8nOBUW7wOrAPrwDqwDqwD68A6sA6sA%2BvAOvDXHbg9Pnl08QDzhWbs%0Accizk6N//etfvuh8p9lV7FuxaHLSJPuuO8Tt4hG0BAFHOzLqEBUpWtVWIB9MC67QdTxNylrJYTgR%0AFqwD68A6sA6sA%2BvAOrAOrAPrwDqwDvwQB578x255qvH2483mk5I2PMx6Ddq1B5scYzRLij7nfPgR%0A0Tf6JvRUcgqAY9nXmJRbmAzg2E3CUV14PPcEPWpTEBBRc6RARwvWgXVgHVgH1oF1YB1YB9aBdWAd%0AWAf%2BnAOf/7FbXlw%2Bt3qz%2Bf40z5HLNmAAkceeMdDRMRA6LZ%2BdvkJJpkmtSzWxjcAJWnIU9uy0FrLt%0AuAXL96e4vimkvGAdWAfWgXVgHVgH1oF1YB1YB9aBdeBnOPAvHmC963yt8TYjQ%2BSpBugdSPuYAiJL%0AQjSTk9wbL33A0xegtU%2BlOJr3T9NG1zHI1843Z%2B9PWh/dp9rEs%2BPidWAdWAfWgXVgHVgH1oF1YB1Y%0AB9aBP%2B3A53/sVgleZTzkiDzYzPAU5D3m6642PgWJrflihEY%2BMsAXHXEuX4CTlppAnZKTOXEEgGN0%0ASjvvYvQVWnQAo4NVuGAdWAfWgXVgHVgH1oF1YB1YB9aBdeAHOvD5PziEqA8wHmNgHnK28W0G5l1n%0AptP56gt3GjkwX55hTsG2Kx5q5ZOaIPIEyqLM/C2enWBjyWOSlMmHF6wD68A6sA6sA%2BvAOrAOrAPr%0AwDqwDvwVB17%2Bdz4R9fXFiy7gI7B%2BPvbYHq%2B%2BgyZfkSLAlZo6qb0Ckx9%2BOgD6EHxkgn12CubLE%2Bwk%0AM6a8YB1YB9aBdWAdWAfWgXVgHVgH1oF14K878Pkfu%2BX9xusLRd9gU9q/8/SBN/M%2BMsu3nZyJ0ydZ%0AF5NkZvlTbHIKiiMDwvWykS/Ma%2BR0Pj4Tb6pARwvWgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BqAPf/M0n%0AxTzefG71KiNpxnddDdr23rM8wiuAmoLGg/ZGtqOnJdcx6nLr9%2B0j08yreOjvdh1YB9aBdWAdWAfW%0AgXVgHVgH1oF14C868Pn4VIj3mIC/D%2BQ554uODPlwLctcQZwrsEWNroTUOBKXCRxVV1r6ABclD/gk%0A06lAfXiCjevAOrAOrAPrwDqwDqwD68A6sA6sA3/FgdvjkyeWj7frW6tMnGuz%2BSCc%2BMo0k6atD9pU%0AeIUtmaevMrWgqX2LgckJK7hxHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhw/s0nor7KBD7w%2BFvQmT8a%0AXx%2BBEK7JZGf5NXktPDLHdqq96TufmtDq%2Byo/OUeL3a4D68A6sA6sA%2BvAOrAOrAPrwDqwDvxRB548%0APpXgVcYzbz7SXr364lAYZyaPmd4cwZynqs3MlKrXTL7CiQSOXjN/HL3S3Pw6sA6sA%2BvAOrAOrAPr%0AwDqwDqwD68AXHfh8fPr6IvKoOyJax9vslfoXaa/Kj3xqT9%2BZnR5Vka%2BEa4baa/KaOVrsdh1YB9aB%0AdWAdWAfWgXVgHVgH1oF14A858Pn4fFrGM6yXWOAp02QPv4PzldqjZAr%2BofL35L9y%2BnTCTa4D68A6%0AsA6sA%2BvAOrAOrAPrwDqwDnzXgSePT59nxh6TbMNvRN8/7d4Uvjr64YL/9kavBtj8OrAOrAPrwDqw%0ADqwD68A6sA6sA7%2BwA//ydff1N57MrzxEv%2B7az9D8YvevX/yLgktbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB24OvClv8/kqbmPtKt3m1kH1oF1YB1YB9aBdWAdWAfWgXVgHfiiA196fH5Ra2nrwDqwDqwD68A6%0AsA6sA%2BvAOrAOrAPrwFMHbv8PPHetA%2BvAOrAOrAPrwDqwDqwD68A6sA6sAz/VgX18/lR7V3wdWAfW%0AgXVgHVgH1oF1YB1YB9aBdeDmwD4%2B93uwDqwD68A6sA6sA%2BvAOrAOrAPrwDrw0x3Yx%2BdPt3gbrAPr%0AwDqwDqwD68A6sA6sA%2BvAOvCjHLj%2Bfx65Zn5Urx%2Brs/%2BDQz/Wz1VbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB144sB3/ubzn/KGfnKzTa0D68A6sA6sA%2BvAOrAOrAPrwDqwDvzHOLB/8/kf81HsIOvAOrAOrAPr%0AwDqwDqwD68A6sA78ug58528%2Bf92L783WgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BPgf28fn3eb2d1oF1%0AYB1YB9aBdWAdWAfWgXVgHfhtHdjH52/70e/F14F1YB1YB9aBdWAdWAfWgXVgHfj7HNjH59/n9XZa%0AB9aBdWAdWAfWgXVgHVgH1oF14Ld14EuPz/3fvP1tvx978XVgHVgH1oF1YB1YB9aBdWAd%2BLc48Ou9%0AwvZ/7fbf8kXapuvAOrAOrAPrwDqwDqwD68A6sA78Xg586W8%2Bfy9L9rbrwDqwDqwD68A6sA6sA%2BvA%0AOrAOrAM/2oF9fP5oR1dvHVgH1oF1YB1YB9aBdWAdWAfWgXXg4sA%2BPi%2BWbGIdWAfWgXVgHVgH1oF1%0AYB1YB9aBdeBHO7CPzx/t6OqtA%2BvAOrAOrAPrwDqwDqwD68A6sA5cHNjH58WSTawD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvxoB/bx%2BaMdXb11YB1YB9aBdWAdWAfWgXVgHVgH/rID%2B/9q5S9buALrwDqwDqwD%0A68A6sA6sA%2BvAOrAOrAO/nwP7N5%2B/32e%2BN14H1oF1YB1YB9aBdWAdWAfWgXXgb3dgH59/u%2BXbcB1Y%0AB9aBdWAdWAfWgXVgHVgH1oHfz4F9fP5%2Bn/neeB1YB9aBdWAdWAfWgXVgHVgH1oG/3YF9fP7tlm/D%0AdWAdWAfWgXVgHVgH1oF1YB1YB34/B/bx%2Bft95nvjdWAdWAfWgXVgHVgH1oF1YB1YB/52B/bx%2Bbdb%0Avg3XgXVgHVgH1oF1YB1YB9aBdWAd%2BP0c2Mfn7/eZ743XgXVgHVgH1oF1YB1YB9aBdeCf78A/7v8R%0A6P/6x038z/%2BS/L/27B1XQiAGoqhGYgPsf5EsgUlLBESUE5/M7yO3%2BnR0hRsQIECAAAECBAgQIEBg%0AnYAvn%2Bue3IUJECBAgAABAgQIECAwLyA%2B582dSIAAAQIECBAgQIAAgXUC4nPdk7swAQIECBAgQIAA%0AAQIE5gXE57y5EwkQIECAAAECBAgQILBOQHyue3IXJkCAAAECBAgQIECAwLyA%2BJw3dyIBAgQIECBA%0AgAABAgTWCYjPATiAYgAAA/xJREFUdU/uwgQIECBAgAABAgQIEJgXEJ/z5k4kQIAAAQIECBAgQIDA%0AOgHxue7JXZgAAQIECBAgQIAAAQLzAuJz3tyJBAgQIECAAAECBAgQWCcgPtc9uQsTIECAAAECBAgQ%0AIEBgXkB8zps7kQABAgQIECBAgAABAusExOe6J3dhAgQIECBAgAABAgQIzAuIz3lzJxIgQIAAAQIE%0ACBAgQGCdgPhc9%2BQuTIAAAQIECBAgQIAAgXmB4/3I67re/8FfCRAgQIAAAQIECBAgQIDAQ%2BA8z8dv%0AfPl8gPiRAAECBAgQIECAAAECBL4X%2BN33/f1WGwkQIECAAAECBAgQIECAQAj48hkYRgIECBAgQIAA%0AAQIECBDoCIjPjqutBAgQIECAAAECBAgQIBAC4jMwjAQIECBAgAABAgQIECDQERCfHVdbCRAgQIAA%0AAQIECBAgQCAExGdgGAkQIECAAAECBAgQIECgIyA%2BO662EiBAgAABAgQIECBAgEAIiM/AMBIgQIAA%0AAQIECBAgQIBAR0B8dlxtJUCAAAECBAgQIECAAIEQEJ%2BBYSRAgAABAgQIECBAgACBjoD47LjaSoAA%0AAQIECBAgQIAAAQIhID4Dw0iAAAECBAgQIECAAAECHQHx2XG1lQABAgQIECBAgAABAgRCQHwGhpEA%0AAQIECBAgQIAAAQIEOgLis%2BNqKwECBAgQIECAAAECBAiEgPgMDCMBAgQIECBAgAABAgQIdATEZ8fV%0AVgIECBAgQIAAAQIECBAIAfEZGEYCBAgQIECAAAECBAgQ6AiIz46rrQQIECBAgAABAgQIECAQAuIz%0AMIwECBAgQIAAAQIECBAg0BEQnx1XWwkQIECAAAECBAgQIEAgBMRnYBgJECBAgAABAgQIECBAoCMg%0APjuuthIgQIAAAQIECBAgQIBACIjPwDASIECAAAECBAgQIECAQEdAfHZcbSVAgAABAgQIECBAgACB%0AEBCfgWEkQIAAAQIECBAgQIAAgY6A%2BOy42kqAAAECBAgQIECAAAECISA%2BA8NIgAABAgQIECBAgAAB%0AAh0B8dlxtZUAAQIECBAgQIAAAQIEQkB8BoaRAAECBAgQIECAAAECBDoC4rPjaisBAgQIECBAgAAB%0AAgQIhID4DAwjAQIECBAgQIAAAQIECHQExGfH1VYCBAgQIECAAAECBAgQCAHxGRhGAgQIECBAgAAB%0AAgQIEOgIiM%2BOq60ECBAgQIAAAQIECBAgEALiMzCMBAgQIECAAAECBAgQINAREJ8dV1sJECBAgAAB%0AAgQIECBAIATEZ2AYCRAgQIAAAQIECBAgQKAjID47rrYSIECAAAECBAgQIECAQAiIz8AwEiBAgAAB%0AAgQIECBAgEBH4A9xf67VNlopBgAAAABJRU5ErkJggg%3D%3D%0A\", \"frontend_name\": \"tabs\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD%0AGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6e%0AgY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBFTAyMHy7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBw%0AgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJ%0AAwMDg3N%2BQWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8%0AEgX3xMw8BSMDVQYqg4jIKAUICxE%2BCDEESC4tKoMHJQODAIMCgwGDA0MAQyJDPcMChqMMbxjFGV0Y%0ASxlXMN5jEmMKYprAdIFZmDmSeSHzGxZLlg6WW6x6rK2s99gs2aaxfWMPZ9/NocTRxfGFM5HzApcj%0A1xZuTe4FPFI8U3mFeCfxCfNN45fhXyygI7BD0FXwilCq0A/hXhEVkb2i4aJfxCaJG4lfkaiQlJM8%0AJpUvLS19QqZMVl32llyfvIv8H4WtioVKekpvldeqFKiaqP5UO6jepRGqqaT5QeuA9iSdVF0rPUG9%0AV/pHDBYY1hrFGNuayJsym740u2C%2B02KJ5QSrOutcmzjbQDtXe2sHY0cdJzVnJRcFV3k3BXdlD3VP%0AXS8Tbxsfd99gvwT//ID6wIlBS4N3hVwMfRnOFCEXaRUVEV0RMzN2T9yDBLZE3aSw5IaUNak30zky%0ALDIzs%2BZmX8xlz7PPryjYVPiuWLskq3RV2ZsK/cqSql01jLVedVPrHzbqNdU0n22VaytsP9op3VXU%0AfbpXta%2Bx/%2B5Em0mzJ/%2BdGj/t8AyNmf2zvs9JmHt6vvmCpYtEFrcu%2BbYsc/m9lSGrTq9xWbtvveWG%0AbZtMNm/ZarJt%2Bw6rnft3u%2B45uy9s/4ODOYd%2BHmk/Jn58xUnrU%2BfOJJ/9dX7SRe1LR68kXv13fc5N%0Am1t379TfU75/4mHeY7En%2B59lvhB5efB1/lv5dxc%2BNH0y/fzq64Lv4T8Ffp360/rP8f9/AA0ADzT6%0AlvFdAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAD8SURBVHja%0ApNHNKsRhFMfxz/OfZ4QG5X1hRUKRl4S9O2AnJTfhDmzYKJcg2chGyg1QsmUzgxIbGRYshshjM14W%0AYuEsz%2B%2B8/M73hOT3yP7QxZ/TW7OV7YJbzwvhpxU7c3WbHXoV7d9EVqctm0wCSOpNaVGS06ylKZLW%0AJwa6Pu08eNXnSp1jlben4YjWdmdeJDkvuvS7lFdA5XWpmBEEUSavrLkqPzowzlt1bibKKysYda3G%0Ag0OD2r44ZKIztZJjyZ0jQxplAuJK6lXQYM%2B8DUc6PZupdvfVrqYYlJQE506MKTvVYxcfZ3%2BCGql0%0AxyG5w/vFtYvv0MK/n/VnwfsAqHVGROrL2mcAAAAASUVORK5CYII%3D%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert tabs (e.g. for hints)\", \"customization_arg_specs\": [{\"default_value\": [{\"content\": \"This set of tabs shows some hints. Click on the other tabs to display the relevant hints.\", \"title\": \"Hint introduction\"}, {\"content\": \"This is a first hint.\", \"title\": \"Hint 1\"}], \"schema\": {\"items\": {\"type\": \"dict\", \"properties\": [{\"schema\": {\"type\": \"unicode\", \"validators\": [{\"id\": \"is_nonempty\"}]}, \"name\": \"title\", \"description\": \"Tab title\"}, {\"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"Tab content\"}]}, \"type\": \"list\", \"ui_config\": {\"add_element_text\": \"Add new tab\"}}, \"name\": \"tab_contents\", \"description\": \"The tab titles and contents.\"}], \"backend_name\": \"Tabs\", \"requires_fs\": false}, \"Image\": {\"preview_url_template\": \"/imagehandler/\u003c[explorationId]\u003e/\u003c[filepath]\u003e\", \"frontend_name\": \"image\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAANNJREFUeNqk07FKA0EUBdCzScQEU9hMYy/4GWls9AfMD4QUYiFCChuL%0AiI1YLLidln6B4BcFkS2DYLc2E1gnUeLuheExb95c7rszL6uqShv0iqJoxdCLMWt4v%2BokiVssY9wK%0AKcEVhrhoSnCPT%2BT/9WCF67hAWZb1sxzvuIMQwk%2BCpDjFMc7xhWd8/NZCFy9YYBRzu3iMLzXA5V8e%0AzDDGAd5wijkOazUT7G3y4Ag3tX0frxva2ccZnlIFD9jZ0vzpmoIQwkmTr9jREisFjQcqazvO3wMA%0A9cMlpZdjmFYAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert image\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"obj_type\": \"Filepath\", \"type\": \"custom\"}, \"name\": \"filepath\", \"description\": \"The name of the image file. (Allowed extensions: gif, jpeg, jpg, png.)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"caption\", \"description\": \"Caption for image (optional)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"alt\", \"description\": \"Alternative text (for screen readers)\"}], \"backend_name\": \"Image\", \"requires_fs\": true}, \"Video\": {\"preview_url_template\": \"https://img.youtube.com/vi/\u003c[video_id]\u003e/hqdefault.jpg\", \"frontend_name\": \"video\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAFxJREFUeNrskVEKwDAIQ%2BPYaXOgXNf9zGKZ3YT9Nj%2BWGsLDmLvjj854%0ASHIABiBmpeEhaVNAMuS5CnkS3GoTrALGguS0kFQSHAXBl%2BwtoFNJ6wYZGSvPbmG3EB/XAJZSMar4%0AdzYxAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert video\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"video_id\", \"description\": \"The YouTube id for this video. This is the 11-character string after \'v=\' in the video URL.\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"start\", \"description\": \"Video start time in seconds: (leave at 0 to start at the beginning.)\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"end\", \"description\": \"Video end time in seconds: (leave at 0 to play until the end.)\"}, {\"default_value\": false, \"schema\": {\"type\": \"bool\"}, \"name\": \"autoplay\", \"description\": \"Autoplay this video once the question has loaded?\"}], \"backend_name\": \"Video\", \"requires_fs\": false}, \"Link\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"frontend_name\": \"link\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert link\", \"customization_arg_specs\": [{\"default_value\": \"https://www.example.com\", \"schema\": {\"obj_type\": \"SanitizedUrl\", \"type\": \"custom\"}, \"name\": \"url\", \"description\": \"The link URL. If no protocol is specified, HTTPS will be used.\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"text\", \"description\": \"The link text. If left blank, the link URL will be used.\"}], \"backend_name\": \"Link\", \"requires_fs\": false}, \"Math\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"frontend_name\": \"math\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert mathematical formula\", \"customization_arg_specs\": [{\"default_value\": \"\\\\frac{x}{y}\", \"schema\": {\"obj_type\": \"MathLatexString\", \"type\": \"custom\"}, \"name\": \"raw_latex\", \"description\": \"The raw string to be displayed as LaTeX.\"}], \"backend_name\": \"Math\", \"requires_fs\": false}}'),
SYSTEM_USERNAMES: JSON.parse('[\"admin\", \"OppiaMigrationBot\"]'),
SUPPORTED_SITE_LANGUAGES: JSON.parse(
'{\"en\": \"English\", \"pt\": \"Portugu\\u00eas\", \"vi\": \"Ti\\u1ebfng Vi\\u1ec7t\", \"hi\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940\", \"id\": \"Bahasa Indonesia\", \"es\": \"Espa\\u00f1ol\"}'),
userIsLoggedIn: JSON.parse('true')
};
</script>
<!--[if lt IE 9]>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
<!-- jquery.js, angular.js and jquery-ui.js are removed from bundled js because they need to be at the header. Including
bundled js at the header will block rendering.-->
<script src="/third_party/static/jquery-2.1.1/jquery.min.js">
</script>
<!--<![endif]-->
<script src="/third_party/static/jqueryui-1.10.3/jquery-ui.min.js">
</script>
<script src="/third_party/static/angularjs-1.4.7/angular.min.js"></script>
<script src="/third_party/static/jquery-ui-touch-punch-0.3.1/jquery.ui.touch-punch-improved.js"></script>
<!-- See http://docs.mathjax.org/en/latest/start.html#mathjax-cdn -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
skipStartupTypeset: true,
messageStyle: 'none',
'HTML-CSS': {
showMathMenu: false
}
});
MathJax.Hub.Configured();
</script>
<script src="/third_party/static/MathJax-2.6.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
</head>
<body>
<div class="oppia-base-container" ng-class="{'oppia-sidebar-menu-open': sidebarIsShown, 'oppia-sidebar-menu-closed': !sidebarIsShown}" ng-swipe-left="closeSidebarOnSwipe()" ng-swipe-right="openSidebarOnSwipe()">
<div class="oppia-content-container">
<div id="wrapper">
<div class="oppia-main-body">
<!-- Top navigation. -->
<nav class="navbar navbar-default oppia-navbar oppia-prevent-selection" role="navigation">
<div class="navbar-container">
<div class="navbar-header protractor-test-navbar-header pull-left">
<a ng-if="windowIsNarrow" ng-click="openSidebar()" class="navbar-brand oppia-navbar-menu oppia-transition-200">
<i class="material-icons oppia-navbar-menu-icon">&#xE5D2;</i>
</a>
<a class="oppia-navbar-brand-name oppia-transition-200" href="/" focus-on="<[LABEL_FOR_CLEARING_FOCUS]>">
<img ng-src="<[getStaticImageUrl('/logo/288x128_logo_white.png')]>" class="oppia-logo" ng-class="windowIsNarrow ? 'oppia-logo-small' : 'oppia-logo-wide'">
</a>
<!-- This is needed for the correct image to appear when an exploration is shared using G+. -->
<a style="display: none;">
<img ng-src="<[getStaticImageUrl('/logo/288x128_logo_mint.png')]>" itemprop="image">
</a>
</div>
<div ng-cloak class="navbar-header pull-right">
<ul class="nav oppia-navbar-nav oppia-navbar-profile">
<li class="dropdown pull-right">
<a class="dropdown-toggle oppia-navbar-dropdown-toggle" data-toggle="dropdown" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)">
<div class="oppia-navbar-profile-picture-container" ng-cloak>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAYAAADHl1ErAAAAAXNSR0IArs4c6QAADhtJREFUeAHt%0AXHlwVdUZ/859jyxmIQESyCaglC0iAgkJIntrIpvKphSwY2ttxbFOp9R/cGGqdhykLaMVO2OtoyRS%0ACEKNEpYKyBIVQ1iNkBhNMCtb8shiQpJ3b7/fTW7m5uUlecu9L4nTM5Pce8895zvf93vnnPud833f%0AEdQLKXb5jsC6%2BuZERZbHKaSMYRbGKERxgpQQUkSIIigEbAmFavlfrUKiVhCVcFa%2BIJEvJOlCcNCA%0AnNKMFQ0o58vEfPgmhS5Mn0ot8n2KIs8lIZJJUfy8almIJqbxhRDSIbJKe2s%2BXvWlV/RcrGwqYGGp%0A20bI1LyaeVmjKMrodp4EycGBAy6MjgsrSxozqG7O5GgxcVREeEigNDAwwBpmsUiRKGu3y1caGlts%0AtQ3yjbOFV6sPnypXTuRXBReU2GLqGprHkUKSRlMIUcD3WyUakGbbt7JYyzf6agpgYfe9O8kui/U8%0AnB7UhJIkUTljwrBTTz449mZKUlyCEBTnjTCKQiX7T5ScfGP3Rf9j5ysny7IyTKXHPwYP690WSXnZ%0AtvcXp71pw1ldQwELm59%2BlyzbX%2BbeNL%2Btscb4EYOyNz2ZWD99wtAFnGdxxoQBefbs85f3rHsjJyiv%0AuGo60wsATe51WZJkWW/LWnXGgDZUEoYAFr58x0B7beOLPHGv5XnFIpGoS0mKOfze%2Bpmj/f2smNR9%0Alm42teQ/8vLRgv0nyuZwVwtm1Ows5BZLSMBz1RkrbnjLiNeAhaWmPWgn%2BxYeejwkRMu9idH7tm%2BY%0AE8/z0EhvmfOmPs9/RQ9tOJx3IKc8lUixkqBKC1nW2vat3u0NXY8Bi1%2B%2Bw6%2BktnETD7%2BnwEB4iP/p%0AL/5xf03U4IBZ3jBkdN2K641Hkn/7YWh17c1JoM3D9PW4kIB1eRkrmjxpyyPAeK4aLttbPuAhOIU5%0AaHpm1cTMZ1ffuRT8eMKED%2BooL6Wd%2B2Bj%2BtnFUGeYyVzJYl3Kc9sld9t2W8Dw%2BWkTWuz2fdxQ9ACr%0A9P3Jfy7%2BZuSw0HnuNtwb5Ysqaw4mPJb5k%2BYW%2BVZuv9xqsaRWZ60%2B7w4vbgEWnrJ1hp3kTO5ZYUPC%0AAnK%2B3bYiitWDWHca7O2yrI6U3r5yR8U1W2MiC2%2BzkLS4ev%2BaY67y1a749VQBYLUIZT/AGhUTduS7%0Af68Y39/AgozgGbxDBsgCmSBbT/Jr710CDMMQPYvHf2DC2Mj9p95efA8TCNKI9MNrEGSALJAJskFG%0AV%2BTocUhigrfbWz5jYtH4VdrAMksBdYVnI8vYJ/8q83hhmW0WEy23WKx39/Qh6LaHQXXA1xBgYc5i%0AsBL4/scCFoC3QCbIBhkhK2TGi65St4CpeharDvgaYoJnIv15GHaFQRBkg4w8p02BzF0VRH6XgEGD%0AV5VS1rOgOvTHCb47wfXvIBtkhE4JmSG7/r3%2B3ilg6toQyx1OUEr7i56lF8zde8gIWVEPSz1g4IyG%0AU8CwkMbaEMudNg3eWd0fXR5khcyQXcXAiYSdAMMWDY/ltVhIY23IdXr8kjqh21%2BzRKvMogUYAAtH%0AQToBhv0sbNFg16GvLaQdmTfjGTJDdmCgYuHQSIfe07pTSqewn3V9z6qrvb1F48Crzx6xNTR4QXoE%0A9tN4c2%2ByfufWqudC3VbmAYzNPwZrkf6dL%2B4LSm5Q9vkrVH79B6qs%2BoH8B1goatAtNCIqmOZOiabw%0A4G5VJMNYREdhDD7ae6J0USsmtEwj3t7DYLCwK83f8WbbzauZP7/kq53SxiY7vfmfC5R24Fv6prTr%0ADVEWgqbfEUlPLY2nlKkxGv%2BmXbFzG7H4/eE8g/tZyO92zbDSPoe1WncUgT14X4G189Nimvjobnrh%0AX6e6BQuo8DCho2crafnzB2n%2BMwe4PL5H5iVgACx4wEltli%2B1sXbA%2BGkNcmCwUN%2BY%2BI%2B3WOjZt3Lp%0Al68cpQoefu6m4%2Bcqae7TWfTfk%2BXuVnWrvA4LFRtUVockjKxKc8sJmMJsWWsiON/U9eJvNmXTtk%2B%2B%0AdYt5Z4WZX0p/bjYtmBbn7LURefaw%2BVuvwoQnBliTYCxu7WFskQb1WROjcvliKlibM/IMAQv8siD0%0A643H6etiGx7NSBbYUlXCbRipgKnme859Ysl4jwwDrnKaV2SjDe%2B0tu9qnZ7KsQWch/YxVpt6KunZ%0AexieUVPDSIJjCC86k3lwyikJ0di%2BMS09/3au2iuMbuDr4mpKN2CIO%2BMLVnpgA4yAlVRX1ziV4fOD%0ArwOv2k2bDM4UVvEkXeaMJ0PyXn3/nCF0HIkAE2ADjICVpChiLArBMcSxsJHPmdmXjCTXiVZRRS19%0AVVTdKd%2BIDA0bYCW1%2BWcRvGiMIN4Vjb1flHb1yrD8rM9LDKOlJ6RhA6ww6au%2BD3A50hcy%2Bt5sRRP8%0AFpSYo8zqsBnDPax13oJ/ltEgafSqam5SU7NdezTtWsHrTzOShg2wYtWP3SQ5wZnNjMZA80Z9s1mk%0AO9CtMakdDRtgJcGnFK3C869D6wY%2BRISp7loGUnROKtKkdtqxYawkzQGXdwNUN0nnrHiXGxxoJf40%0Ae0fEhdpRg29xoZT7RTRsgJV%2B8e0%2BJTdqJIwd4kZpz4pOGWN%2BG5Lq2s38wQHXMzZdq2XiAlllgP2%2B%0AaH6yOX4xGjbAinejlVq0CG9l10T3rNT99wwnf96KMyvNuHMoDR0UaAr5dmwYK1YrhAoYXLtNaa2N%0A6DAW5vFF6qLClGZeeHSyKXRBVMMGWLFaoUZYEPzgTWuxjfC6lROI/RgMb2bZ7JGUaOIcqWEDrDDp%0A50MCBA0YLokDQRgx0p%2BdTezH4PDG88dxI8LotaeneU7AhZo6bPK5hwkVMERYuFDX6yLT2JDx99/f%0ATVY2anibYiOCaPuGuayydDB%2BeUu2U30NG2AlCaFcRAmEo3QqaVLGynm30a6X5sHz2uMWksZH0pHX%0AF9CIYeb/zho2CAqTgoMDvoTXCmJ3EI7isQRuVpw9KYqytyykhxk8qASuJoD84mNTKGvjveSLFQQw%0AUeOaGCNE0Flqvs5o8b/9gZ8xwyMmj404NComZJyrzHtbLjTIjxZNv1X9C/S30pXqRrLVdd4lh7Ej%0AOX4oPfHAOHrzD9Np9l1RZMHnygeJ45kOZXxaPJ6byr6WueotdfAjhI73rGdu2ZXnn5oY7QM2OjZx%0Ax8hw%2BvPjCepf2bUfqJz/Llc1qHpb1OBAiosMpoFB5i%2BtOnLV%2BoTgL9ypYYZ8bZ0tOd6QmuUNbCiF%0AMoN9GPM0TCbeXYoZcgvhr48kOyLlVF6AESf1UwV7G88jBbC/ISqsjzDb62wAC9UmydhoAaz6b/tW%0AcIgQul7ntI8woMNCxQZstQOGSFYeqQriDeGI0Ud47jU2gIEae8kmtlZsWllpB6zNO2UXZwcg3rDX%0AOO0jDbdhEIDoXs1zB6y1A4YHhP3iiuBMOJXh3tfJzuZ/qBbfX65nR5UGqmto8TUL2OoqAgZoWMNE%0AY6KTMhOa%2Bt4ehCDfmxjz8c4X5y3UChp5hVk/j63Vpwuu0zdlNVTIrkuFfC1hkOobO%2B//Qw8LD/an%0A26JDaFRsKI2KCWU76kCaOi6CoHYYnZY9d/DjAzllC/lDmFWz75EFevqdFmGIkbbL9hREsiI40yg/%0A11wGhxex9PlXV%2BjEhatUU99ZQdUzpr%2BH08n1mkb1L%2BfiVf0rGs5Lo2nxkXT3HUPZ0S7WawAhsxrF%0Ay6HPwKJDY/zQqYehAPey1%2BDgDxfsSxkPwZPYaTmU7S7BPWDXkWLafayYLlWaaidW2cASK5nBWzJz%0AOD3AG5YebCgqw5dvP4PoXab1Oveu3znK5xQIOPW31DZchL/6M6vv2sn%2B68scK3b1jDlo%2B6Hv6G87%0A8ij/e1M3cbtiQc3HML4vKZbWrbyTpowe3G1Z7SVH7e7cmHZmGXePSmtI4FhnQfVOAQMBNfhdse/C%0AwvzsO/cf6ykapKlZpq0HCmlzxlc%2B6U2akK5c2XJNf3x4At3D29hdJUTrTnz0wxlwOrEIy5Kugum7%0ABAyEtaGJwKVrH63mrSDn0besEdNTmz9XJ%2B6uGOoL%2BbAr/OXJJIoM77jryx%2Bh0iGL0mSENnc1FDX%2B%0AO6gVWqZ2RfQ9I5oLQgj75fxO/q%2BvpJ9TnXTxlevr6cPjlyj5iUx2bb%2BsZ7UesqlgsayQWf/S8b7b%0AHobC3QWYrv3rZ%2BwuXuhIs88/Y4v8vfWz4BvrdoBpj4BBejWE2W4/yupTGMJ%2BD21O/emf3j1t2bTN%0ArYD8PgWkv7/FflvUwE8uFFelMAg2i8Uy05UTBlwCTAWtLUieJ8XA2MiQIxXX6xNYI%2B6XC3Wep%2Br5%0Axz/Jsszij1qDVREprp4s4DJgGmjaMQzcUA5bgaNkRTbH3GxSf5SEVMoxRBUMlrnHMIB//Arounxb%0AjgZZuWWtSzlokmyGkwWv4Bm8QwZ1GLpxZgUYcquHaRLgQ6A/SobJ4IiGpeyc7RE9ja55V/aKEOID%0A5s/3R8loQjkeVsTzwmmeF2oYuFlamT5xFeII/4qh3LMmgR/oWT4/rEgPhONxWEKifUJW4mWikfpy%0Avr5nBbNIkUQeD8BU7lm9fxyWHgDHA9fYQlzHg/0w/6qjuZzqdKwvb/J9PveiAl4Hz%2BE5q%2B8duKYX%0AHjHSjkf6sXkqWyEZK4QFLIQ51iihWrr2CJKCeE6fzm2pax8Grm8e6acHDffth0YSLdF9CCoZvFye%0A55okRU7gIetV1AkPuRJZSCfZUdefezJMYf3v0MhOwHVzLKlQxAWSRJlQlDr%2BzrPcUjjbGwbyBB2m%0ACKH62/K7KwywjWM8b5CQq%2BH9x%2B%2BCSVZiFKH8eI4ldQQOz4jJ/P/Bt86QcSFPPVqZA50Qu4NwFK7i%0A3tHK7HEEJ5reOFr5fwkK97jkk8ywAAAAAElFTkSuQmCC%0A" class="oppia-navbar-profile-picture img-circle">
<span class="caret" style="margin-top: 10px;"></span>
<div class="oppia-navbar-dashboard-indicator ng-cloak" ng-if="numUnseenNotifications > 0">
<span class="oppia-navbar-dashboard-indicator-text">
<[numUnseenNotifications]>
</span>
</div>
<div style="display: none;" class="oppia-user-email">
owner1@example.com
</div>
</div>
</a>
<ul class="dropdown-menu ng-cloak oppia-navbar-dropdown" role="menu" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)" ng-show="profileDropdownIsActive">
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/profile/owner1">
<strong>owner1</strong>
</a>
</li>
<hr class="oppia-top-right-menu-item-separator">
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/dashboard">
<span translate="I18N_TOPNAV_DASHBOARD"></span>
</a>
</li>
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/notifications_dashboard">
<span translate="I18N_TOPNAV_NOTIFICATIONS"></span>
<span ng-if="numUnseenNotifications > 0">
(<[numUnseenNotifications]>)
</span>
</a>
</li>
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/preferences">
<span translate="I18N_TOPNAV_PREFERENCES"></span>
</a>
</li>
<hr class="oppia-top-right-menu-item-separator">
<li>
<a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/logout?return_url=http%3A%2F%2Flocalhost%2Fdashboardhandler%2Fdata">
<span translate="I18N_TOPNAV_LOGOUT"></span>
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav oppia-navbar-nav">
<ul ng-if="windowIsNarrow" class="nav oppia-navbar-tabs-narrow">
<create-activity-button></create-activity-button>
</ul>
<ul ng-if="!windowIsNarrow" class="nav oppia-navbar-tabs">
<create-activity-button></create-activity-button>
<li>
<div class="pull-right oppia-navbar-button-container">
<a href="/donate" class="btn oppia-navbar-button oppia-navbar-hide-on-small-width protractor-test-create-activity oppia-transition-200"
<span translate="I18N_TOPNAV_DONATE"></span>
</a>
</div>
</li>
<li class="dropdown oppia-navbar-clickable-dropdown pull-right">
<a class="oppia-navbar-tab">
<span translate="I18N_TOPNAV_ABOUT"></span>
<span class="caret"></span>
</a>
<ul class="dropdown-menu oppia-navbar-dropdown" ng-mouseover="onMouseoverDropdownMenu($event)" ng-mouseleave="onMouseoutDropdownMenu($event)">
<li><a href="/about" translate="I18N_TOPNAV_ABOUT_OPPIA"></a></li>
<li><a href="/teach" translate="I18N_TOPNAV_TEACH_WITH_OPPIA"></a></li>
<li><a href="https://oppiablog.blogspot.com" translate="I18N_TOPNAV_BLOG" target="_blank"></a></li>
<li><a href="/forum" translate="I18N_TOPNAV_FORUM"></a></li>
<li><a href="/contact" translate="I18N_TOPNAV_CONTACT_US"></a></li>
</ul>
</li>
<li class="oppia-clickable-navbar-element pull-right">
<a class="oppia-navbar-tab" href="/library" translate="I18N_TOPNAV_LIBRARY"></a>
</li>
</ul>
</ul>
</div>
<div class="collapse navbar-collapse ng-cloak">
</div>
</div>
</nav>
<div class="oppia-top-of-page-padding">
</div>
<div ng-cloak>
<div class="oppia-toast-container toast-top-center">
<div ng-repeat="warning in (alertsService.warnings | limitTo:5) track by $index" class="toast toast-warning oppia-toast">
<button type="button" class="toast-close-button" ng-click="alertsService.deleteWarning(warning)" role="button">&times;</button>
<div class="toast-message">
<[warning.content]>
</div>
</div>
</div>
<div>
<div ng-repeat="message in alertsService.messages track by $index">
<alert-message message-object="message" message-index="$index"></alert-message>
</div>
</div>
<div ng-show="loadingMessage" class="oppia-loading-fullpage">
<div class="oppia-align-center">
<span translate="<[loadingMessage]>"></span>
<span class="oppia-loading-dot-one">.</span>
<span class="oppia-loading-dot-two">.</span>
<span class="oppia-loading-dot-three">.</span>
</div>
</div>
<div ng-show="!loadingMessage">
<div class="oppia-content" ng-controller="Error">
<br>
<div class="oppia-wide-panel oppia-error-wide-container">
<div class="oppia-wide-panel-content protractor-test-error-container">
<h4>
<span translate="I18N_ERROR_HEADER_500"></span>
- System Error
</h4>
<br>
<img ng-src="<[oopsMintImgUrl]>" alt="Oops!" width="299" height="142"/>
<p><h3>
<h3 translate="I18N_ERROR_MESSAGE_500"></h3>
</p>
<p><span translate="I18N_ERROR_NEXT_STEPS" translate-values="{issueTrackerUrl: 'https://github.com/oppia/oppia/issues/new', homeUrl: '/'}"></span></p>
</div>
</div>
</div>
<div class="oppia-footer-padding">
</div>
<footer class="oppia-footer">
<div class="oppia-footer-container">
<div class="row">
<div class="col-sm-3">
<h4 translate="I18N_FOOTER_ABOUT_ALL_CAPS"></h4>
<ul>
<li><a href="/about" translate="I18N_FOOTER_ABOUT"></a></li>
<li><a href="/about#foundation" translate="I18N_FOOTER_OPPIA_FOUNDATION"></a></li>
<li><a href="/terms" translate="I18N_FOOTER_TERMS_OF_SERVICE"></a></li>
<li><a href="/privacy" translate="I18N_FOOTER_PRIVACY_POLICY"></a></li>
<li><a href="/contact" translate="I18N_FOOTER_CONTACT_US"></a></li>
</ul>
</div>
<div class="col-sm-3">
<h4 translate="I18N_FOOTER_TEACH_LEARN_ALL_CAPS"></h4>
<ul>
<li><a href="/teach#teach" translate="I18N_FOOTER_TEACH"></a></li>
<li><a href="/teach#playbook" translate="I18N_FOOTER_PARTICIPATION_PLAYBOOK"></a></li>
<li><a href="/library" translate="I18N_FOOTER_BROWSE_LIBRARY"></a></li>
<li><a href="/forum" translate="I18N_FOOTER_FORUM"></a></li>
</ul>
</div>
<div class="col-sm-3">
<h4 translate="I18N_FOOTER_CONTRIBUTE_ALL_CAPS"></h4>
<ul>
<li><a href="/contact" translate="I18N_FOOTER_GET_INVOLVED"></a></li>
<li><a href="/donate" translate="I18N_FOOTER_DONATE"></a></li>
<li><a href="/about#credits" translate="I18N_FOOTER_CREDITS"></a></li>
</ul>
</div>
<div class="col-sm-3">
<h4><span translate="I18N_LANGUAGE_FOOTER_VIEW_IN"></span></h4>
<ul ng-controller="I18nFooter">
<select ng-model="currentLanguageCode"
ng-change="changeLanguage()"
ng-options="langCode as langName for (langCode, langName) in supportedSiteLanguages"
class="protractor-test-i18n-language-selector"
style="color: black;">
</select>
</ul>
</div>
</div>
</div>
</footer>
</div>
</div>
</div>
<noscript>
<div class="oppia-page-cards-container">
<div class="md-default-theme oppia-page-card oppia-long-text">
<h2>
<span translate="I18N_SPLASH_JAVASCRIPT_ERROR_TITLE"></span>
<i class="material-icons">&#xE811;</i>
</h2>
<p translate="I18N_SPLASH_JAVASCRIPT_ERROR_DESCRIPTION"
translate-values="{hrefUrl: 'http://www.enable-javascript.com/'}"></p>
<p translate="I18N_SPLASH_JAVASCRIPT_ERROR_THANKS"></p>
</div>
</div>
</noscript>
<nav class="oppia-sidebar-menu" ng-controller="SideNav" ng-class="{'oppia-sidebar-menu-transition': pageHasLoaded}">
<div class="oppia-sidebar-header">
<div class="oppia-sidebar-logo-container">
</div>
</div>
<ul>
<li >
<a href="/library">
<i class="material-icons oppia-sidebar-menu-icon">&#xE88A;</i>
<span translate="I18N_SIDEBAR_LIBRARY_LINK"></span>
</a>
</li>
<li >
<a href="/about">
<i class="material-icons oppia-sidebar-menu-icon">&#xE887;</i>
<span translate="I18N_SIDEBAR_ABOUT_LINK"></span>
</a>
</li>
<li >
<a href="/teach">
<i class="material-icons oppia-sidebar-menu-icon">&#xE88E;</i>
<span translate="I18N_SIDEBAR_TEACH_WITH_OPPIA"></span>
</a>
</li>
<li >
<a href="/donate">
<i class="material-icons oppia-sidebar-menu-icon">&#xE87D;</i>
<span translate="I18N_SIDEBAR_DONATE"></span>
</a>
</li>
<li>
<a href="https://oppiablog.blogspot.com" target="_blank">
<img ng-src="<[getStaticImageUrl('/sidebar/blogger.png')]>" class="oppia-sidebar-menu-icon">
<span translate="I18N_SIDEBAR_BLOG"></span>
</a>
</li>
<li >
<a href="/contact">
<i class="material-icons oppia-sidebar-menu-icon">&#xE87F;</i>
<span translate="I18N_SIDEBAR_CONTACT_US"></span>
</a>
</li>
</ul>
<div class="oppia-sidebar-footer">
<div>
<span="I18N_SIDEBAR_FOLLOW_US"></span>:
</div>
<a href="https://plus.google.com/109898456505810251700/about" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/gplus.png')]>">
</a>
<a href="https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/youtube.png')]>">
</a>
<a href="https://www.facebook.com/oppiaorg" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/fb.png')]>">
</a>
<a href="https://twitter.com/oppiaorg" target="_blank">
<img ng-src="<[getStaticImageUrl('/social/twitter.png')]>">
</a>
</div>
</nav>
</div>
</div>
</div>
<div class="oppia-dev-mode">
Dev Mode
</div>
<script type="text/ng-template" id="components/imageUploader">
<style>
.image-uploader-drop-area {
background: #eee;
height: 200px;
width: 100%;
}
.image-uploader-text {
color: #888;
font-size: 2em;
height: 100%;
margin: 0 auto;
padding-top: 80px;
text-align: center;
width: 100%;
}
.image-uploader-is-active {
background: red;
}
.image-uploader-file-input-container {
margin-top: 20px;
}
.image-uploader-file-input {
margin-top: 10px;
}
</style>
<div class="image-uploader-drop-area">
<div class="image-uploader-text" translate="I18N_DIRECTIVES_DRAG_IMAGE_HERE"></div>
</div>
<div class="image-uploader-file-input-container">
<span translate="I18N_DIRECTIVES_OR_SELECT_FILE"></span>
<input type="file" class="image-uploader-file-input" ng-class="fileInputClassName">
</div>
</script>
<!-- SCHEMA-BASED EDITOR TEMPLATES -->
<script type="text/ng-template" id="schemaBasedEditor/master">
<schema-based-choices-editor ng-if="schema().choices" local-value="$parent.localValue"
schema="schema()" choices="schema().choices"
is-disabled="isDisabled()">
</schema-based-choices-editor>
<schema-based-bool-editor ng-if="schema().type === 'bool' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()">
</schema-based-bool-editor>
<schema-based-int-editor ng-if="schema().type === 'int' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
validators="schema().validators"
label-for-focus-target="labelForFocusTarget()"
on-input-blur="onInputBlur"
on-input-focus="onInputFocus">
</schema-based-int-editor>
<schema-based-float-editor ng-if="schema().type === 'float' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
validators="schema().validators"
label-for-focus-target="labelForFocusTarget()"
on-input-blur="onInputBlur"
on-input-focus="onInputFocus">
</schema-based-float-editor>
<schema-based-unicode-editor ng-if="schema().type === 'unicode' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
validators="schema().validators" ui-config="schema().ui_config"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()"
on-input-blur="onInputBlur"
on-input-focus="onInputFocus">
</schema-based-unicode-editor>
<schema-based-html-editor ng-if="schema().type === 'html' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()"
ui-config="schema().ui_config">
</schema-based-html-editor>
<schema-based-list-editor ng-if="schema().type === 'list' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
item-schema="schema().items" len="schema().len"
ui-config="schema().ui_config" validators="schema().validators"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()">
</schema-based-list-editor>
<schema-based-dict-editor ng-if="schema().type === 'dict' && !schema().choices"
local-value="$parent.localValue" is-disabled="isDisabled()"
property-schemas="schema().properties"
allow-expressions="allowExpressions()"
label-for-focus-target="labelForFocusTarget()">
</schema-based-dict-editor>
<schema-based-custom-editor ng-if="schema().type === 'custom' && !schema().choices"
obj-type="schema().obj_type" local-value="$parent.localValue"
is-disabled="isDisabled()">
</schema-based-custom-editor>
</script>
<script type="text/ng-template" id="schemaBasedEditor/choices">
<select class="form-control" ng-model="$parent.$parent.localValue"
ng-options="choice as choice for choice in choices()" required
ng-disabled="isDisabled()">
</select>
</script>
<script type="text/ng-template" id="schemaBasedEditor/expression">
<input type="text" ng-model="localValue" class="form-control" ng-disabled="isDisabled()"
required require-is-valid-expression focus-on="<[labelForFocusTarget()]>">
</script>
<script type="text/ng-template" id="schemaBasedEditor/bool">
<div class="input-group">
<span ng-if="!expressionMode">
<input type="checkbox" ng-model="$parent.localValue" ng-disabled="isDisabled()"
focus-on="<[labelForFocusTarget()]>">
</span>
<span ng-if="allowExpressions()">
<schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()"
local-value="$parent.$parent.localValue"
param-names="paramNames" output-type="bool"
label-for-focus-target="labelForFocusTarget()">
</schema-based-expression-editor>
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()">
<span ng-if="!expressionMode">E</span>
<span ng-if="expressionMode"><del>E</del></span>
</button>
</span>
</span>
</div>
</script>
<script type="text/ng-template" id="schemaBasedEditor/int">
<div class="input-group">
<span ng-if="!expressionMode">
<md-input-group class="long oppia-blue-on-focus md-default-theme" style="margin: 0px;">
<input type="number" ng-model="$parent.localValue" ng-disabled="isDisabled()"
required apply-validation="validators()" focus-on="<[labelForFocusTarget()]>"
ng-blur="onInputBlur()" ng-focus="onInputFocus()">
</md-input-group>
</span>
<span ng-if="allowExpressions()">
<schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()"
local-value="$parent.$parent.localValue"
param-names="paramNames" output-type="int"
ng-keypress="onKeypress($event)"
label-for-focus-target="labelForFocusTarget()">
</schema-based-expression-editor>
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()">
<span ng-if="!expressionMode">E</span>
<span ng-if="expressionMode"><del>E</del></span>
</button>
</span>
</span>
</div>
</script>
<script type="text/ng-template" id="schemaBasedEditor/float">
<span ng-model="localValue" ui-validate="'validate($value)'">
<span ng-form="floatForm">
<span ng-if="!expressionMode">
<input type="text" ng-model="$parent.localValue" class="form-control protractor-test-float-form-input"
name="floatValue" ng-attr-placeholder="<['I18N_FORMS_TYPE_NUMBER' | translate]>" ng-disabled="isDisabled()"
require-is-float apply-validation="validators()"
focus-on="<[labelForFocusTarget()]>" ng-keypress="onKeypress($event)"
ng-blur="onBlur()" ng-focus="onFocus()" style="display: inline;">
<span ng-if="hasLoaded && !isUserCurrentlyTyping && hasFocusedAtLeastOnce"
style="font-size: 0.85em; position: absolute;"
tabindex="-1" focus-on="<[labelForErrorFocusTarget]>">
<span ng-if="floatForm.floatValue.$error.isFloat && floatForm.floatValue.$viewValue" class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_INVALID_DECIMAL"></span>
<span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtLeast"
class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_LEAST" translate-values="{minValue: <[minValue]>}"></span>
<span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtMost"
class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_MOST" translate-values="{maxValue: <[maxValue]>}"></span>
</span>
</span>
<span ng-if="allowExpressions()">
<schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()"
local-value="$parent.$parent.localValue"
param-names="paramNames" output-type="float"
label-for-focus-target="labelForFocusTarget()">
</schema-based-expression-editor>
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()">
<span ng-if="!expressionMode">E</span>
<span ng-if="expressionMode"><del>E</del></span>
</button>
</span>
</span>
</span>
</sp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment