MediaWiki REL1_41
EditPage.php
Go to the documentation of this file.
1<?php
21namespace MediaWiki\EditPage;
22
23use Article;
24use CategoryPage;
25use Content;
28use DeprecationHelper;
32use LogPage;
61use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
94use Message;
97use MWException;
99use OOUI;
100use OOUI\ButtonWidget;
101use OOUI\CheckboxInputWidget;
102use OOUI\DropdownInputWidget;
103use OOUI\FieldLayout;
104use ParserOptions;
105use ParserOutput;
107use ReadOnlyError;
108use RecentChange;
109use RuntimeException;
110use Skin;
111use stdClass;
112use TextContent;
115use WatchAction;
117use Wikimedia\Assert\Assert;
120use WikiPage;
121use Xml;
122
145#[\AllowDynamicProperties]
146class EditPage implements IEditObject {
147 use DeprecationHelper;
148 use ProtectedHookAccessorTrait;
149
153 public const UNICODE_CHECK = UnicodeConstraint::VALID_UNICODE;
154
158 public const EDITFORM_ID = 'editform';
159
164 public const POST_EDIT_COOKIE_KEY_PREFIX = 'PostEditRevision';
165
182 public const POST_EDIT_COOKIE_DURATION = 1200;
183
187 private $mArticle;
188
190 private $page;
191
195 private $mTitle;
196
198 private $mContextTitle = null;
199
204 public $action = 'submit';
205
210 public $isConflict = false;
211
213 private $isNew = false;
214
216 private $deletedSinceEdit;
217
219 public $formtype;
220
226
228 private $lastDelete;
229
231 private $mTokenOk = false;
232
234 private $mTriedSave = false;
235
237 private $incompleteForm = false;
238
240 private $tooBig = false;
241
243 private $missingComment = false;
244
246 private $missingSummary = false;
247
249 private $allowBlankSummary = false;
250
252 protected $blankArticle = false;
253
255 private $allowBlankArticle = false;
256
258 private $selfRedirect = false;
259
261 private $allowSelfRedirect = false;
262
264 private $autoSumm = '';
265
267 private $hookError = '';
268
270 private $mParserOutput;
271
277 private $mExpectedParentRevision = false;
278
280 public $mShowSummaryField = true;
281
282 # Form values
283
285 public $save = false;
286
288 public $preview = false;
289
291 private $diff = false;
292
294 private $minoredit = false;
295
297 private $watchthis = false;
298
300 private $watchlistExpiryEnabled;
301
302 private WatchedItemStoreInterface $watchedItemStore;
303
305 private $watchlistExpiry;
306
308 private $recreate = false;
309
313 public $textbox1 = '';
314
316 public $textbox2 = '';
317
319 public $summary = '';
320
325 private $nosummary = false;
326
331 public $edittime = '';
332
344 private $editRevId = null;
345
347 public $section = '';
348
350 public $sectiontitle = null;
351
353 private $newSectionAnchor = null;
354
358 public $starttime = '';
359
365 public $oldid = 0;
366
373 private $parentRevId = 0;
374
376 private $scrolltop = null;
377
379 private $markAsBot = true;
380
383
385 public $contentFormat = null;
386
388 private $changeTags = null;
389
390 # Placeholders for text injection by hooks (must be HTML)
391 # extensions should take care to _append_ to the present value
392
394 public $editFormPageTop = '';
395 public $editFormTextTop = '';
402
403 /* $didSave should be set to true whenever an article was successfully altered. */
404 public $didSave = false;
405 public $undidRev = 0;
406 private $undoAfter = 0;
407
408 public $suppressIntro = false;
409
411 private $edit;
412
414 private $contentLength = false;
415
419 private $enableApiEditOverride = false;
420
424 protected $context;
425
429 private $isOldRev = false;
430
434 private $unicodeCheck;
435
441 private $editConflictHelperFactory;
442
446 private $editConflictHelper;
447
448 private IContentHandlerFactory $contentHandlerFactory;
449 private PermissionManager $permManager;
450 private RevisionStore $revisionStore;
451 private WikiPageFactory $wikiPageFactory;
452 private WatchlistManager $watchlistManager;
453 private UserNameUtils $userNameUtils;
454 private RedirectLookup $redirectLookup;
455 private UserOptionsLookup $userOptionsLookup;
456 private TempUserCreator $tempUserCreator;
457 private UserFactory $userFactory;
458
460 private $placeholderTempUser;
461
463 private $unsavedTempUser;
464
466 private $savedTempUser;
467
469 private $tempUserCreateActive = false;
470
472 private $tempUserName;
473
475 private $tempUserCreateDone = false;
476
477 private LinkRenderer $linkRenderer;
478 private LinkBatchFactory $linkBatchFactory;
479 private RestrictionStore $restrictionStore;
480 private CommentStore $commentStore;
481 private BlockErrorFormatter $blockErrorFormatter;
482
487 public function __construct( Article $article ) {
488 $this->mArticle = $article;
489 $this->page = $article->getPage(); // model object
490 $this->mTitle = $article->getTitle();
491
492 // Make sure the local context is in sync with other member variables.
493 // Particularly make sure everything is using the same WikiPage instance.
494 // This should probably be the case in Article as well, but it's
495 // particularly important for EditPage, to make use of the in-place caching
496 // facility in WikiPage::prepareContentForEdit.
497 $this->context = new DerivativeContext( $article->getContext() );
498 $this->context->setWikiPage( $this->page );
499 $this->context->setTitle( $this->mTitle );
500
501 $this->contentModel = $this->mTitle->getContentModel();
502
503 $services = MediaWikiServices::getInstance();
504 $this->contentHandlerFactory = $services->getContentHandlerFactory();
505 $this->contentFormat = $this->contentHandlerFactory
506 ->getContentHandler( $this->contentModel )
507 ->getDefaultFormat();
508 $this->editConflictHelperFactory = [ $this, 'newTextConflictHelper' ];
509 $this->permManager = $services->getPermissionManager();
510 $this->revisionStore = $services->getRevisionStore();
511 $this->watchlistExpiryEnabled = $this->getContext()->getConfig() instanceof Config
512 && $this->getContext()->getConfig()->get( MainConfigNames::WatchlistExpiry );
513 $this->watchedItemStore = $services->getWatchedItemStore();
514 $this->wikiPageFactory = $services->getWikiPageFactory();
515 $this->watchlistManager = $services->getWatchlistManager();
516 $this->userNameUtils = $services->getUserNameUtils();
517 $this->redirectLookup = $services->getRedirectLookup();
518 $this->userOptionsLookup = $services->getUserOptionsLookup();
519 $this->tempUserCreator = $services->getTempUserCreator();
520 $this->userFactory = $services->getUserFactory();
521 $this->linkRenderer = $services->getLinkRenderer();
522 $this->linkBatchFactory = $services->getLinkBatchFactory();
523 $this->restrictionStore = $services->getRestrictionStore();
524 $this->commentStore = $services->getCommentStore();
525 $this->blockErrorFormatter = $services->getBlockErrorFormatter();
526
527 // XXX: Restore this deprecation as soon as TwoColConflict is fixed (T305028)
528 // $this->deprecatePublicProperty( 'textbox2', '1.38', __CLASS__ );
529 }
530
534 public function getArticle() {
535 return $this->mArticle;
536 }
537
542 public function getContext() {
543 return $this->context;
544 }
545
550 public function getTitle() {
551 return $this->mTitle;
552 }
553
557 public function setContextTitle( $title ) {
558 $this->mContextTitle = $title;
559 }
560
565 public function getContextTitle() {
566 if ( $this->mContextTitle === null ) {
567 throw new RuntimeException( "EditPage does not have a context title set" );
568 } else {
569 return $this->mContextTitle;
570 }
571 }
572
580 private function isSupportedContentModel( string $modelId ): bool {
581 return $this->enableApiEditOverride === true ||
582 $this->contentHandlerFactory->getContentHandler( $modelId )->supportsDirectEditing();
583 }
584
592 public function setApiEditOverride( $enableOverride ) {
593 $this->enableApiEditOverride = $enableOverride;
594 }
595
607 public function edit() {
608 // Allow extensions to modify/prevent this form or submission
609 if ( !$this->getHookRunner()->onAlternateEdit( $this ) ) {
610 return;
611 }
612
613 wfDebug( __METHOD__ . ": enter" );
614
615 $request = $this->context->getRequest();
616 // If they used redlink=1 and the page exists, redirect to the main article
617 if ( $request->getBool( 'redlink' ) && $this->mTitle->exists() ) {
618 $this->context->getOutput()->redirect( $this->mTitle->getFullURL() );
619 return;
620 }
621
622 $this->importFormData( $request );
623 $this->firsttime = false;
624
625 $readOnlyMode = MediaWikiServices::getInstance()->getReadOnlyMode();
626 if ( $this->save && $readOnlyMode->isReadOnly() ) {
627 // Force preview
628 $this->save = false;
629 $this->preview = true;
630 }
631
632 if ( $this->save ) {
633 $this->formtype = 'save';
634 } elseif ( $this->preview ) {
635 $this->formtype = 'preview';
636 } elseif ( $this->diff ) {
637 $this->formtype = 'diff';
638 } else { # First time through
639 $this->firsttime = true;
640 if ( $this->previewOnOpen() ) {
641 $this->formtype = 'preview';
642 } else {
643 $this->formtype = 'initial';
644 }
645 }
646
647 // Check permissions after possibly creating a placeholder temp user.
648 // This allows anonymous users to edit via a temporary account, if the site is
649 // configured to (1) disallow anonymous editing and (2) autocreate temporary
650 // accounts on edit.
651 $this->maybeActivateTempUserCreate( !$this->firsttime );
652
653 $permErrors = $this->getEditPermissionErrors(
654 $this->save ? PermissionManager::RIGOR_SECURE : PermissionManager::RIGOR_FULL
655 );
656 if ( $permErrors ) {
657 wfDebug( __METHOD__ . ": User can't edit" );
658
659 $user = $this->context->getUser();
660 if ( $user->getBlock() && !$readOnlyMode->isReadOnly() ) {
661 // Auto-block user's IP if the account was "hard" blocked
662 DeferredUpdates::addCallableUpdate( static function () use ( $user ) {
663 $user->spreadAnyEditBlock();
664 } );
665 }
666 $this->displayPermissionsError( $permErrors );
667
668 return;
669 }
670
671 $revRecord = $this->mArticle->fetchRevisionRecord();
672 // Disallow editing revisions with content models different from the current one
673 // Undo edits being an exception in order to allow reverting content model changes.
674 $revContentModel = $revRecord ?
675 $revRecord->getSlot( SlotRecord::MAIN, RevisionRecord::RAW )->getModel() :
676 false;
677 if ( $revContentModel && $revContentModel !== $this->contentModel ) {
678 $prevRevRecord = null;
679 $prevContentModel = false;
680 if ( $this->undidRev ) {
681 $undidRevRecord = $this->revisionStore
682 ->getRevisionById( $this->undidRev );
683 $prevRevRecord = $undidRevRecord ?
684 $this->revisionStore->getPreviousRevision( $undidRevRecord ) :
685 null;
686
687 $prevContentModel = $prevRevRecord ?
688 $prevRevRecord
689 ->getSlot( SlotRecord::MAIN, RevisionRecord::RAW )
690 ->getModel() :
691 '';
692 }
693
694 if ( !$this->undidRev
695 || !$prevRevRecord
696 || $prevContentModel !== $this->contentModel
697 ) {
698 $this->displayViewSourcePage(
699 $this->getContentObject(),
700 $this->context->msg(
701 'contentmodelediterror',
702 $revContentModel,
703 $this->contentModel
704 )->plain()
705 );
706 return;
707 }
708 }
709
710 $this->isConflict = false;
711
712 # Attempt submission here. This will check for edit conflicts,
713 # and redundantly check for locked database, blocked IPs, etc.
714 # that edit() already checked just in case someone tries to sneak
715 # in the back door with a hand-edited submission URL.
716
717 if ( $this->formtype === 'save' ) {
718 $resultDetails = null;
719 $status = $this->attemptSave( $resultDetails );
720 if ( !$this->handleStatus( $status, $resultDetails ) ) {
721 return;
722 }
723 }
724
725 # First time through: get contents, set time for conflict
726 # checking, etc.
727 if ( $this->formtype === 'initial' || $this->firsttime ) {
728 if ( !$this->initialiseForm() ) {
729 return;
730 }
731
732 if ( $this->mTitle->getArticleID() ) {
733 $this->getHookRunner()->onEditFormInitialText( $this );
734 }
735 }
736
737 // If we're displaying an old revision, and there are differences between it and the
738 // current revision outside the main slot, then we can't allow the old revision to be
739 // editable, as what would happen to the non-main-slot data if someone saves the old
740 // revision is undefined.
741 // When this is the case, display a read-only version of the page instead, with a link
742 // to a diff page from which the old revision can be restored
743 $curRevisionRecord = $this->page->getRevisionRecord();
744 if ( $curRevisionRecord
745 && $revRecord
746 && $curRevisionRecord->getId() !== $revRecord->getId()
747 && ( WikiPage::hasDifferencesOutsideMainSlot(
748 $revRecord,
749 $curRevisionRecord
750 ) || !$this->isSupportedContentModel(
751 $revRecord->getSlot(
752 SlotRecord::MAIN,
753 RevisionRecord::RAW
754 )->getModel()
755 ) )
756 ) {
757 $restoreLink = $this->mTitle->getFullURL(
758 [
759 'action' => 'mcrrestore',
760 'restore' => $revRecord->getId(),
761 ]
762 );
763 $this->displayViewSourcePage(
764 $this->getContentObject(),
765 $this->context->msg(
766 'nonmain-slot-differences-therefore-readonly',
767 $restoreLink
768 )->plain()
769 );
770 return;
771 }
772
773 $this->showEditForm();
774 }
775
784 public function maybeActivateTempUserCreate( $doAcquire ) {
785 if ( $this->tempUserCreateActive ) {
786 // Already done
787 return;
788 }
789 $user = $this->context->getUser();
790 if ( $this->tempUserCreator->shouldAutoCreate( $user, 'edit' ) ) {
791 if ( $doAcquire ) {
792 $name = $this->tempUserCreator->acquireAndStashName(
793 $this->context->getRequest()->getSession() );
794 $this->unsavedTempUser = $this->userFactory->newUnsavedTempUser( $name );
795 $this->tempUserName = $name;
796 } else {
797 $this->placeholderTempUser = $this->userFactory->newTempPlaceholder();
798 }
799 $this->tempUserCreateActive = true;
800 }
801 }
802
816 private function createTempUser( PageUpdater $pageUpdater ) {
817 if ( !$this->tempUserCreateActive ) {
818 return Status::newGood();
819 }
820 if ( !$pageUpdater->isChange() ) {
821 $pageUpdater->preventChange();
822 return Status::newGood();
823 }
824 $status = $this->tempUserCreator->create(
825 $this->tempUserName, // acquire if null
826 $this->context->getRequest()
827 );
828 if ( $status->isOK() ) {
829 $this->placeholderTempUser = null;
830 $this->unsavedTempUser = null;
831 $this->savedTempUser = $status->getUser();
832 $pageUpdater->updateAuthor( $status->getUser() );
833 $this->tempUserCreateDone = true;
834 }
835 return $status;
836 }
837
849 private function getAuthority(): Authority {
850 return $this->getUserForPermissions();
851 }
852
859 private function getUserForPermissions() {
860 if ( $this->savedTempUser ) {
861 return $this->savedTempUser;
862 } elseif ( $this->unsavedTempUser ) {
863 return $this->unsavedTempUser;
864 } elseif ( $this->placeholderTempUser ) {
865 return $this->placeholderTempUser;
866 } else {
867 return $this->context->getUser();
868 }
869 }
870
877 private function getUserForPreview() {
878 if ( $this->savedTempUser ) {
879 return $this->savedTempUser;
880 } elseif ( $this->unsavedTempUser ) {
881 return $this->unsavedTempUser;
882 } elseif ( $this->firsttime && $this->placeholderTempUser ) {
883 // Mostly a GET request and no temp user was aquired,
884 // but needed for pst or content transform for preview,
885 // fallback to a placeholder for this situation (T330943)
886 return $this->placeholderTempUser;
887 } elseif ( $this->tempUserCreateActive ) {
888 throw new MWException(
889 "Can't use the request user for preview with IP masking enabled" );
890 } else {
891 return $this->context->getUser();
892 }
893 }
894
901 private function getUserForSave() {
902 if ( $this->savedTempUser ) {
903 return $this->savedTempUser;
904 } elseif ( $this->tempUserCreateActive ) {
905 throw new MWException(
906 "Can't use the request user for storage with IP masking enabled" );
907 } else {
908 return $this->context->getUser();
909 }
910 }
911
916 private function getEditPermissionErrors( string $rigor = PermissionManager::RIGOR_SECURE ): array {
917 $user = $this->getUserForPermissions();
918
919 $ignoredErrors = [];
920 if ( $this->preview || $this->diff ) {
921 $ignoredErrors = [ 'blockedtext', 'autoblockedtext', 'systemblockedtext' ];
922 }
923 $permErrors = $this->permManager->getPermissionErrors(
924 'edit',
925 $user,
926 $this->mTitle,
927 $rigor,
928 $ignoredErrors
929 );
930
931 // Check if the user is blocked from editing.
932 // This check must be done on the context user, in order to trigger
933 // checks for blocks against IP address, XFF, etc, until T221067
934 if ( !$user->getBlock() ) {
935 $contextUser = $this->context->getUser();
936 if (
937 $user->getName() !== $contextUser->getName() &&
938 $this->permManager->isBlockedFrom(
939 $contextUser,
940 $this->mTitle,
941 $rigor !== PermissionManager::RIGOR_SECURE
942 )
943 ) {
944 $message = $this->blockErrorFormatter->getMessage(
945 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable User must have a block
946 $contextUser->getBlock(),
947 $contextUser,
948 $this->context->getLanguage(),
949 $this->context->getRequest()->getIP()
950 );
951 $permErrors[] = array_merge( [ $message->getKey() ], $message->getParams() );
952 }
953 }
954
955 return $permErrors;
956 }
957
969 private function displayPermissionsError( array $permErrors ): void {
970 $out = $this->context->getOutput();
971 if ( $this->context->getRequest()->getBool( 'redlink' ) ) {
972 // The edit page was reached via a red link.
973 // Redirect to the article page and let them click the edit tab if
974 // they really want a permission error.
975 $out->redirect( $this->mTitle->getFullURL() );
976 return;
977 }
978
979 $content = $this->getContentObject();
980
981 // Use the normal message if there's nothing to display
982 // We used to only do this if $this->firsttime was truthy, and there was no content
983 // or the content was empty, but sometimes there was no content even if it not the
984 // first time, we can't use displayViewSourcePage if there is no content (T281400)
985 if ( !$content || ( $this->firsttime && $content->isEmpty() ) ) {
986 $action = $this->mTitle->exists() ? 'edit' :
987 ( $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage' );
988 throw new PermissionsError( $action, $permErrors );
989 }
990
991 $this->displayViewSourcePage(
992 $content,
993 $out->formatPermissionsErrorMessage( $permErrors, 'edit' )
994 );
995 }
996
1002 private function displayViewSourcePage( Content $content, string $errorMessage ): void {
1003 $out = $this->context->getOutput();
1004 $this->getHookRunner()->onEditPage__showReadOnlyForm_initial( $this, $out );
1005
1006 $out->setRobotPolicy( 'noindex,nofollow' );
1007 $out->setPageTitleMsg( $this->context->msg(
1008 'viewsource-title'
1009 )->plaintextParams(
1010 $this->getContextTitle()->getPrefixedText()
1011 ) );
1012 $out->addBacklinkSubtitle( $this->getContextTitle() );
1013 $out->addHTML( $this->editFormPageTop );
1014 $out->addHTML( $this->editFormTextTop );
1015
1016 if ( $errorMessage !== '' ) {
1017 $out->addWikiTextAsInterface( $errorMessage );
1018 $out->addHTML( "<hr />\n" );
1019 }
1020
1021 # If the user made changes, preserve them when showing the markup
1022 # (This happens when a user is blocked during edit, for instance)
1023 if ( !$this->firsttime ) {
1024 $text = $this->textbox1;
1025 $out->addWikiMsg( 'viewyourtext' );
1026 } else {
1027 try {
1028 $text = $this->toEditText( $content );
1029 } catch ( MWException $e ) {
1030 # Serialize using the default format if the content model is not supported
1031 # (e.g. for an old revision with a different model)
1032 $text = $content->serialize();
1033 }
1034 $out->addWikiMsg( 'viewsourcetext' );
1035 }
1036
1037 $out->addHTML( $this->editFormTextBeforeContent );
1038 $this->showTextbox( $text, 'wpTextbox1', [ 'readonly' ] );
1039 $out->addHTML( $this->editFormTextAfterContent );
1040
1041 $out->addHTML( $this->makeTemplatesOnThisPageList( $this->getTemplates() ) );
1042
1043 $out->addModules( 'mediawiki.action.edit.collapsibleFooter' );
1044
1045 $out->addHTML( $this->editFormTextBottom );
1046 if ( $this->mTitle->exists() ) {
1047 $out->returnToMain( null, $this->mTitle );
1048 }
1049 }
1050
1056 protected function previewOnOpen() {
1057 $config = $this->context->getConfig();
1058 $previewOnOpenNamespaces = $config->get( MainConfigNames::PreviewOnOpenNamespaces );
1059 $request = $this->context->getRequest();
1060 if ( $config->get( MainConfigNames::RawHtml ) ) {
1061 // If raw HTML is enabled, disable preview on open
1062 // since it has to be posted with a token for
1063 // security reasons
1064 return false;
1065 }
1066 if ( $request->getVal( 'preview' ) === 'yes' ) {
1067 // Explicit override from request
1068 return true;
1069 } elseif ( $request->getVal( 'preview' ) === 'no' ) {
1070 // Explicit override from request
1071 return false;
1072 } elseif ( $this->section === 'new' ) {
1073 // Nothing *to* preview for new sections
1074 return false;
1075 } elseif ( ( $request->getCheck( 'preload' ) || $this->mTitle->exists() )
1076 && $this->userOptionsLookup->getOption( $this->context->getUser(), 'previewonfirst' )
1077 ) {
1078 // Standard preference behavior
1079 return true;
1080 } elseif ( !$this->mTitle->exists()
1081 && isset( $previewOnOpenNamespaces[$this->mTitle->getNamespace()] )
1082 && $previewOnOpenNamespaces[$this->mTitle->getNamespace()]
1083 ) {
1084 // Categories are special
1085 return true;
1086 } else {
1087 return false;
1088 }
1089 }
1090
1097 private function isSectionEditSupported(): bool {
1098 $currentRev = $this->page->getRevisionRecord();
1099
1100 // $currentRev is null for non-existing pages, use the page default content model.
1101 $revContentModel = $currentRev
1102 ? $currentRev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW )->getModel()
1103 : $this->page->getContentModel();
1104
1105 return (
1106 ( $this->mArticle->getRevIdFetched() === $this->page->getLatest() ) &&
1107 $this->contentHandlerFactory->getContentHandler( $revContentModel )->supportsSections()
1108 );
1109 }
1110
1116 public function importFormData( &$request ) {
1117 # Section edit can come from either the form or a link
1118 $this->section = $request->getVal( 'wpSection', $request->getVal( 'section', '' ) );
1119
1120 if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
1121 throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
1122 }
1123
1124 $this->isNew = !$this->mTitle->exists() || $this->section === 'new';
1125
1126 if ( $request->wasPosted() ) {
1127 # These fields need to be checked for encoding.
1128 # Also remove trailing whitespace, but don't remove _initial_
1129 # whitespace from the text boxes. This may be significant formatting.
1130 $this->textbox1 = rtrim( $request->getText( 'wpTextbox1' ) );
1131 if ( !$request->getCheck( 'wpTextbox2' ) ) {
1132 // Skip this if wpTextbox2 has input, it indicates that we came
1133 // from a conflict page with raw page text, not a custom form
1134 // modified by subclasses
1135 $textbox1 = $this->importContentFormData( $request );
1136 if ( $textbox1 !== null ) {
1137 $this->textbox1 = $textbox1;
1138 }
1139 }
1140
1141 $this->unicodeCheck = $request->getText( 'wpUnicodeCheck' );
1142
1143 if ( $this->section === 'new' ) {
1144 # Allow setting sectiontitle different from the edit summary.
1145 # Note that wpSectionTitle is not yet a part of the actual edit form, as wpSummary is
1146 # currently doing double duty as both edit summary and section title. Right now this
1147 # is just to allow API edits to work around this limitation, but this should be
1148 # incorporated into the actual edit form when EditPage is rewritten (T20654, T28312).
1149 if ( $request->getCheck( 'wpSectionTitle' ) ) {
1150 $this->sectiontitle = $request->getText( 'wpSectionTitle' );
1151 if ( $request->getCheck( 'wpSummary' ) ) {
1152 $this->summary = $request->getText( 'wpSummary' );
1153 }
1154 } else {
1155 $this->sectiontitle = $request->getText( 'wpSummary' );
1156 }
1157 } else {
1158 $this->sectiontitle = null;
1159 $this->summary = $request->getText( 'wpSummary' );
1160 }
1161
1162 # If the summary consists of a heading, e.g. '==Foobar==', extract the title from the
1163 # header syntax, e.g. 'Foobar'. This is mainly an issue when we are using wpSummary for
1164 # section titles. (T3600)
1165 # It is weird to modify 'sectiontitle', even when it is provided when using the API, but API
1166 # users have come to rely on it: https://github.com/wikimedia-gadgets/twinkle/issues/1625
1167 $this->summary = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->summary );
1168 if ( $this->sectiontitle !== null ) {
1169 $this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle );
1170 }
1171
1172 if ( $this->section === 'new' ) {
1173 $this->setNewSectionSummary();
1174 }
1175
1176 $this->edittime = $request->getVal( 'wpEdittime' );
1177 $this->editRevId = $request->getIntOrNull( 'editRevId' );
1178 $this->starttime = $request->getVal( 'wpStarttime' );
1179
1180 $undidRev = $request->getInt( 'wpUndidRevision' );
1181 if ( $undidRev ) {
1182 $this->undidRev = $undidRev;
1183 }
1184 $undoAfter = $request->getInt( 'wpUndoAfter' );
1185 if ( $undoAfter ) {
1186 $this->undoAfter = $undoAfter;
1187 }
1188
1189 $this->scrolltop = $request->getIntOrNull( 'wpScrolltop' );
1190
1191 if ( $this->textbox1 === '' && !$request->getCheck( 'wpTextbox1' ) ) {
1192 // wpTextbox1 field is missing, possibly due to being "too big"
1193 // according to some filter rules that may have been configured
1194 // for security reasons.
1195 $this->incompleteForm = true;
1196 } else {
1197 // If we receive the last parameter of the request, we can fairly
1198 // claim the POST request has not been truncated.
1199 $this->incompleteForm = !$request->getVal( 'wpUltimateParam' );
1200 }
1201 if ( $this->incompleteForm ) {
1202 # If the form is incomplete, force to preview.
1203 wfDebug( __METHOD__ . ": Form data appears to be incomplete" );
1204 wfDebug( "POST DATA: " . var_export( $request->getPostValues(), true ) );
1205 $this->preview = true;
1206 } else {
1207 $this->preview = $request->getCheck( 'wpPreview' );
1208 $this->diff = $request->getCheck( 'wpDiff' );
1209
1210 // Remember whether a save was requested, so we can indicate
1211 // if we forced preview due to session failure.
1212 $this->mTriedSave = !$this->preview;
1213
1214 if ( $this->tokenOk( $request ) ) {
1215 # Some browsers will not report any submit button
1216 # if the user hits enter in the comment box.
1217 # The unmarked state will be assumed to be a save,
1218 # if the form seems otherwise complete.
1219 wfDebug( __METHOD__ . ": Passed token check." );
1220 } elseif ( $this->diff ) {
1221 # Failed token check, but only requested "Show Changes".
1222 wfDebug( __METHOD__ . ": Failed token check; Show Changes requested." );
1223 } else {
1224 # Page might be a hack attempt posted from
1225 # an external site. Preview instead of saving.
1226 wfDebug( __METHOD__ . ": Failed token check; forcing preview" );
1227 $this->preview = true;
1228 }
1229 }
1230 $this->save = !$this->preview && !$this->diff;
1231 if ( !$this->edittime || !preg_match( '/^\d{14}$/', $this->edittime ) ) {
1232 $this->edittime = null;
1233 }
1234
1235 if ( !$this->starttime || !preg_match( '/^\d{14}$/', $this->starttime ) ) {
1236 $this->starttime = null;
1237 }
1238
1239 $this->recreate = $request->getCheck( 'wpRecreate' );
1240
1241 $user = $this->context->getUser();
1242
1243 $this->minoredit = $request->getCheck( 'wpMinoredit' );
1244 $this->watchthis = $request->getCheck( 'wpWatchthis' );
1245 $expiry = $request->getText( 'wpWatchlistExpiry' );
1246 if ( $this->watchlistExpiryEnabled && $expiry !== '' ) {
1247 // This parsing of the user-posted expiry is done for both preview and saving. This
1248 // is necessary because ApiEditPage uses preview when it saves (yuck!). Note that it
1249 // only works because the unnormalized value is retrieved again below in
1250 // getCheckboxesDefinitionForWatchlist().
1251 $expiry = ExpiryDef::normalizeExpiry( $expiry, TS_ISO_8601 );
1252 if ( $expiry !== false ) {
1253 $this->watchlistExpiry = $expiry;
1254 }
1255 }
1256
1257 # Don't force edit summaries when a user is editing their own user or talk page
1258 if ( ( $this->mTitle->getNamespace() === NS_USER || $this->mTitle->getNamespace() === NS_USER_TALK )
1259 && $this->mTitle->getText() === $user->getName()
1260 ) {
1261 $this->allowBlankSummary = true;
1262 } else {
1263 $this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' )
1264 || !$this->userOptionsLookup->getOption( $user, 'forceeditsummary' );
1265 }
1266
1267 $this->autoSumm = $request->getText( 'wpAutoSummary' );
1268
1269 $this->allowBlankArticle = $request->getBool( 'wpIgnoreBlankArticle' );
1270 $this->allowSelfRedirect = $request->getBool( 'wpIgnoreSelfRedirect' );
1271
1272 $changeTags = $request->getVal( 'wpChangeTags' );
1273 if ( $changeTags === null || $changeTags === '' ) {
1274 $this->changeTags = [];
1275 } else {
1276 $this->changeTags = array_filter(
1277 array_map(
1278 'trim',
1279 explode( ',', $changeTags )
1280 )
1281 );
1282 }
1283 } else {
1284 # Not a posted form? Start with nothing.
1285 wfDebug( __METHOD__ . ": Not a posted form." );
1286 $this->textbox1 = '';
1287 $this->summary = '';
1288 $this->sectiontitle = null;
1289 $this->edittime = '';
1290 $this->editRevId = null;
1291 $this->starttime = wfTimestampNow();
1292 $this->edit = false;
1293 $this->preview = false;
1294 $this->save = false;
1295 $this->diff = false;
1296 $this->minoredit = false;
1297 // Watch may be overridden by request parameters
1298 $this->watchthis = $request->getBool( 'watchthis', false );
1299 if ( $this->watchlistExpiryEnabled ) {
1300 $this->watchlistExpiry = null;
1301 }
1302 $this->recreate = false;
1303
1304 // When creating a new section, we can preload a section title by passing it as the
1305 // preloadtitle parameter in the URL (T15100)
1306 if ( $this->section === 'new' && $request->getCheck( 'preloadtitle' ) ) {
1307 $this->sectiontitle = $request->getVal( 'preloadtitle' );
1308 $this->setNewSectionSummary();
1309 } elseif ( $this->section !== 'new' && $request->getVal( 'summary' ) !== '' ) {
1310 $this->summary = $request->getText( 'summary' );
1311 if ( $this->summary !== '' ) {
1312 // If a summary has been preset using &summary= we don't want to prompt for
1313 // a different summary. Only prompt for a summary if the summary is blanked.
1314 // (T19416)
1315 $this->autoSumm = md5( '' );
1316 }
1317 }
1318
1319 if ( $request->getVal( 'minor' ) ) {
1320 $this->minoredit = true;
1321 }
1322 }
1323
1324 $this->oldid = $request->getInt( 'oldid' );
1325 $this->parentRevId = $request->getInt( 'parentRevId' );
1326
1327 $this->markAsBot = $request->getBool( 'bot', true );
1328 $this->nosummary = $request->getBool( 'nosummary' );
1329
1330 // May be overridden by revision.
1331 $this->contentModel = $request->getText( 'model', $this->contentModel );
1332 // May be overridden by revision.
1333 $this->contentFormat = $request->getText( 'format', $this->contentFormat );
1334
1335 try {
1336 $handler = $this->contentHandlerFactory->getContentHandler( $this->contentModel );
1337 } catch ( MWUnknownContentModelException $e ) {
1338 throw new ErrorPageError(
1339 'editpage-invalidcontentmodel-title',
1340 'editpage-invalidcontentmodel-text',
1341 [ wfEscapeWikiText( $this->contentModel ) ]
1342 );
1343 }
1344
1345 if ( !$handler->isSupportedFormat( $this->contentFormat ) ) {
1346 throw new ErrorPageError(
1347 'editpage-notsupportedcontentformat-title',
1348 'editpage-notsupportedcontentformat-text',
1349 [
1350 wfEscapeWikiText( $this->contentFormat ),
1351 wfEscapeWikiText( ContentHandler::getLocalizedName( $this->contentModel ) )
1352 ]
1353 );
1354 }
1355
1356 // Allow extensions to modify form data
1357 $this->getHookRunner()->onEditPage__importFormData( $this, $request );
1358 }
1359
1369 protected function importContentFormData( &$request ) {
1370 return null; // Don't do anything, EditPage already extracted wpTextbox1
1371 }
1372
1378 private function initialiseForm(): bool {
1379 $this->edittime = $this->page->getTimestamp();
1380 $this->editRevId = $this->page->getLatest();
1381
1382 $dummy = $this->contentHandlerFactory
1383 ->getContentHandler( $this->contentModel )
1384 ->makeEmptyContent();
1385 $content = $this->getContentObject( $dummy ); # TODO: track content object?!
1386 if ( $content === $dummy ) { // Invalid section
1387 $this->noSuchSectionPage();
1388 return false;
1389 }
1390
1391 if ( !$content ) {
1392 $out = $this->context->getOutput();
1393 $this->editFormPageTop .= Html::errorBox(
1394 $out->parseAsInterface( $this->context->msg( 'missing-revision-content',
1395 $this->oldid,
1396 Message::plaintextParam( $this->mTitle->getPrefixedText() )
1397 ) )
1398 );
1399 } elseif ( !$this->isSupportedContentModel( $content->getModel() ) ) {
1400 $modelMsg = $this->getContext()->msg( 'content-model-' . $content->getModel() );
1401 $modelName = $modelMsg->exists() ? $modelMsg->text() : $content->getModel();
1402
1403 $out = $this->context->getOutput();
1404 $out->showErrorPage(
1405 'modeleditnotsupported-title',
1406 'modeleditnotsupported-text',
1407 [ $modelName ]
1408 );
1409 return false;
1410 }
1411
1412 $this->textbox1 = $this->toEditText( $content );
1413
1414 $user = $this->context->getUser();
1415 // activate checkboxes if user wants them to be always active
1416 # Sort out the "watch" checkbox
1417 if ( $this->userOptionsLookup->getOption( $user, 'watchdefault' ) ) {
1418 # Watch all edits
1419 $this->watchthis = true;
1420 } elseif ( $this->userOptionsLookup->getOption( $user, 'watchcreations' ) && !$this->mTitle->exists() ) {
1421 # Watch creations
1422 $this->watchthis = true;
1423 } elseif ( $this->watchlistManager->isWatched( $user, $this->mTitle ) ) {
1424 # Already watched
1425 $this->watchthis = true;
1426 }
1427 if ( $this->watchthis && $this->watchlistExpiryEnabled ) {
1428 $watchedItem = $this->watchedItemStore->getWatchedItem( $user, $this->getTitle() );
1429 $this->watchlistExpiry = $watchedItem ? $watchedItem->getExpiry() : null;
1430 }
1431 if ( !$this->isNew && $this->userOptionsLookup->getOption( $user, 'minordefault' ) ) {
1432 $this->minoredit = true;
1433 }
1434 if ( $this->textbox1 === false ) {
1435 return false;
1436 }
1437 return true;
1438 }
1439
1447 protected function getContentObject( $def_content = null ) {
1448 $services = MediaWikiServices::getInstance();
1449 $disableAnonTalk = $services->getMainConfig()->get( MainConfigNames::DisableAnonTalk );
1450 $request = $this->context->getRequest();
1451
1452 $content = false;
1453
1454 // For non-existent articles and new sections, use preload text if any.
1455 if ( !$this->mTitle->exists() || $this->section === 'new' ) {
1456 $content = $services->getPreloadedContentBuilder()->getPreloadedContent(
1457 $this->mTitle->toPageIdentity(),
1458 $this->context->getUser(),
1459 $request->getVal( 'preload' ),
1460 $request->getArray( 'preloadparams', [] ),
1461 $request->getVal( 'section' )
1462 );
1463 // For existing pages, get text based on "undo" or section parameters.
1464 } elseif ( $this->section !== '' ) {
1465 // Get section edit text (returns $def_text for invalid sections)
1466 $orig = $this->getOriginalContent( $this->getAuthority() );
1467 $content = $orig ? $orig->getSection( $this->section ) : null;
1468
1469 if ( !$content ) {
1470 $content = $def_content;
1471 }
1472 } else {
1473 $undoafter = $request->getInt( 'undoafter' );
1474 $undo = $request->getInt( 'undo' );
1475
1476 if ( $undo > 0 && $undoafter > 0 ) {
1477 // The use of getRevisionByTitle() is intentional, as allowing access to
1478 // arbitrary revisions on arbitrary pages bypass partial visibility restrictions (T297322).
1479 $undorev = $this->revisionStore->getRevisionByTitle( $this->mTitle, $undo );
1480 $oldrev = $this->revisionStore->getRevisionByTitle( $this->mTitle, $undoafter );
1481 $undoMsg = null;
1482
1483 # Make sure it's the right page,
1484 # the revisions exist and they were not deleted.
1485 # Otherwise, $content will be left as-is.
1486 if ( $undorev !== null && $oldrev !== null &&
1487 !$undorev->isDeleted( RevisionRecord::DELETED_TEXT ) &&
1488 !$oldrev->isDeleted( RevisionRecord::DELETED_TEXT )
1489 ) {
1490 if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev )
1491 || !$this->isSupportedContentModel(
1492 $oldrev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW )->getModel()
1493 )
1494 ) {
1495 // Hack for undo while EditPage can't handle multi-slot editing
1496 $this->context->getOutput()->redirect( $this->mTitle->getFullURL( [
1497 'action' => 'mcrundo',
1498 'undo' => $undo,
1499 'undoafter' => $undoafter,
1500 ] ) );
1501 return false;
1502 } else {
1503 $content = $this->getUndoContent( $undorev, $oldrev, $undoMsg );
1504 }
1505
1506 if ( $undoMsg === null ) {
1507 $oldContent = $this->page->getContent( RevisionRecord::RAW );
1508 $popts = ParserOptions::newFromUserAndLang(
1509 $this->getUserForPreview(),
1510 $services->getContentLanguage()
1511 );
1512 $contentTransformer = $services->getContentTransformer();
1513 $newContent = $contentTransformer->preSaveTransform(
1514 $content, $this->mTitle, $this->getUserForPreview(), $popts
1515 );
1516
1517 if ( $newContent->getModel() !== $oldContent->getModel() ) {
1518 // The undo may change content
1519 // model if its reverting the top
1520 // edit. This can result in
1521 // mismatched content model/format.
1522 $this->contentModel = $newContent->getModel();
1523 $oldMainSlot = $oldrev->getSlot(
1524 SlotRecord::MAIN,
1525 RevisionRecord::RAW
1526 );
1527 $this->contentFormat = $oldMainSlot->getFormat();
1528 if ( $this->contentFormat === null ) {
1529 $this->contentFormat = $this->contentHandlerFactory
1530 ->getContentHandler( $oldMainSlot->getModel() )
1531 ->getDefaultFormat();
1532 }
1533 }
1534
1535 if ( $newContent->equals( $oldContent ) ) {
1536 # Tell the user that the undo results in no change,
1537 # i.e. the revisions were already undone.
1538 $undoMsg = 'nochange';
1539 $content = false;
1540 } else {
1541 # Inform the user of our success and set an automatic edit summary
1542 $undoMsg = 'success';
1543
1544 # If we just undid one rev, use an autosummary
1545 $firstrev = $this->revisionStore->getNextRevision( $oldrev );
1546 if ( $firstrev && $firstrev->getId() == $undo ) {
1547 $userText = $undorev->getUser() ?
1548 $undorev->getUser()->getName() :
1549 '';
1550 if ( $userText === '' ) {
1551 $undoSummary = $this->context->msg(
1552 'undo-summary-username-hidden',
1553 $undo
1554 )->inContentLanguage()->text();
1555 // Handle external users (imported revisions)
1556 } elseif ( ExternalUserNames::isExternal( $userText ) ) {
1557 $userLinkTitle = ExternalUserNames::getUserLinkTitle( $userText );
1558 if ( $userLinkTitle ) {
1559 $userLink = $userLinkTitle->getPrefixedText();
1560 $undoSummary = $this->context->msg(
1561 'undo-summary-import',
1562 $undo,
1563 $userLink,
1564 $userText
1565 )->inContentLanguage()->text();
1566 } else {
1567 $undoSummary = $this->context->msg(
1568 'undo-summary-import2',
1569 $undo,
1570 $userText
1571 )->inContentLanguage()->text();
1572 }
1573 } else {
1574 $undoIsAnon =
1575 !$undorev->getUser() ||
1576 !$undorev->getUser()->isRegistered();
1577 $undoMessage = ( $undoIsAnon && $disableAnonTalk ) ?
1578 'undo-summary-anon' :
1579 'undo-summary';
1580 $undoSummary = $this->context->msg(
1581 $undoMessage,
1582 $undo,
1583 $userText
1584 )->inContentLanguage()->text();
1585 }
1586 if ( $this->summary === '' ) {
1587 $this->summary = $undoSummary;
1588 } else {
1589 $this->summary = $undoSummary . $this->context->msg( 'colon-separator' )
1590 ->inContentLanguage()->text() . $this->summary;
1591 }
1592 }
1593 $this->undidRev = $undo;
1594 $this->undoAfter = $undoafter;
1595 $this->formtype = 'diff';
1596 }
1597 }
1598 } else {
1599 // Failed basic checks.
1600 // Older revisions may have been removed since the link
1601 // was created, or we may simply have got bogus input.
1602 $undoMsg = 'norev';
1603 }
1604
1605 $out = $this->context->getOutput();
1606 // Messages: undo-success, undo-failure, undo-main-slot-only, undo-norev,
1607 // undo-nochange.
1608 $class = ( $undoMsg === 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
1609 $this->editFormPageTop .= Html::rawElement(
1610 'div',
1611 [ 'class' => $class ],
1612 $out->parseAsInterface(
1613 $this->context->msg( 'undo-' . $undoMsg )->plain()
1614 )
1615 );
1616 }
1617
1618 if ( $content === false ) {
1619 $content = $this->getOriginalContent( $this->getAuthority() );
1620 }
1621 }
1622
1623 return $content;
1624 }
1625
1639 private function getUndoContent( RevisionRecord $undoRev, RevisionRecord $oldRev, &$error ) {
1640 $handler = $this->contentHandlerFactory
1641 ->getContentHandler( $undoRev->getSlot(
1642 SlotRecord::MAIN,
1643 RevisionRecord::RAW
1644 )->getModel() );
1645 $currentContent = $this->page->getRevisionRecord()
1646 ->getContent( SlotRecord::MAIN );
1647 $undoContent = $undoRev->getContent( SlotRecord::MAIN );
1648 $undoAfterContent = $oldRev->getContent( SlotRecord::MAIN );
1649 $undoIsLatest = $this->page->getRevisionRecord()->getId() === $undoRev->getId();
1650 if ( $currentContent === null
1651 || $undoContent === null
1652 || $undoAfterContent === null
1653 ) {
1654 $error = 'norev';
1655 return false;
1656 }
1657
1658 $content = $handler->getUndoContent(
1659 $currentContent,
1660 $undoContent,
1661 $undoAfterContent,
1662 $undoIsLatest
1663 );
1664 if ( $content === false ) {
1665 $error = 'failure';
1666 }
1667 return $content;
1668 }
1669
1684 private function getOriginalContent( Authority $performer ): ?Content {
1685 if ( $this->section === 'new' ) {
1686 return $this->getCurrentContent();
1687 }
1688 $revRecord = $this->mArticle->fetchRevisionRecord();
1689 if ( $revRecord === null ) {
1690 return $this->contentHandlerFactory
1691 ->getContentHandler( $this->contentModel )
1692 ->makeEmptyContent();
1693 }
1694 return $revRecord->getContent( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $performer );
1695 }
1696
1708 private function getParentRevId() {
1709 if ( $this->parentRevId ) {
1710 return $this->parentRevId;
1711 } else {
1712 return $this->mArticle->getRevIdFetched();
1713 }
1714 }
1715
1724 protected function getCurrentContent() {
1725 $revRecord = $this->page->getRevisionRecord();
1726 $content = $revRecord ? $revRecord->getContent(
1727 SlotRecord::MAIN,
1728 RevisionRecord::RAW
1729 ) : null;
1730
1731 if ( $content === null ) {
1732 return $this->contentHandlerFactory
1733 ->getContentHandler( $this->contentModel )
1734 ->makeEmptyContent();
1735 }
1736
1737 return $content;
1738 }
1739
1746 private function tokenOk( WebRequest $request ): bool {
1747 $token = $request->getVal( 'wpEditToken' );
1748 $user = $this->context->getUser();
1749 $this->mTokenOk = $user->matchEditToken( $token );
1750 return $this->mTokenOk;
1751 }
1752
1767 private function setPostEditCookie( int $statusValue ): void {
1768 $revisionId = $this->page->getLatest();
1769 $postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
1770
1771 $val = 'saved';
1772 if ( $statusValue === self::AS_SUCCESS_NEW_ARTICLE ) {
1773 $val = 'created';
1774 } elseif ( $this->oldid ) {
1775 $val = 'restored';
1776 }
1777 if ( $this->tempUserCreateDone ) {
1778 $val .= '+tempuser';
1779 }
1780
1781 $response = $this->context->getRequest()->response();
1782 $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION );
1783 }
1784
1791 public function attemptSave( &$resultDetails = false ) {
1792 // Allow bots to exempt some edits from bot flagging
1793 $markAsBot = $this->markAsBot
1794 && $this->getAuthority()->isAllowed( 'bot' );
1795
1796 // Allow trusted users to mark some edits as minor
1797 $markAsMinor = $this->minoredit && !$this->isNew
1798 && $this->getAuthority()->isAllowed( 'minoredit' );
1799
1800 $status = $this->internalAttemptSave( $resultDetails, $markAsBot, $markAsMinor );
1801
1802 $this->getHookRunner()->onEditPage__attemptSave_after( $this, $status, $resultDetails );
1803
1804 return $status;
1805 }
1806
1810 private function incrementResolvedConflicts(): void {
1811 if ( $this->context->getRequest()->getText( 'mode' ) !== 'conflict' ) {
1812 return;
1813 }
1814
1815 $this->getEditConflictHelper()->incrementResolvedStats( $this->context->getUser() );
1816 }
1817
1827 private function handleStatus( Status $status, $resultDetails ): bool {
1828 $statusValue = is_int( $status->value ) ? $status->value : 0;
1829
1834 if ( $statusValue === self::AS_SUCCESS_UPDATE
1835 || $statusValue === self::AS_SUCCESS_NEW_ARTICLE
1836 ) {
1837 $this->incrementResolvedConflicts();
1838
1839 $this->didSave = true;
1840 if ( !$resultDetails['nullEdit'] ) {
1841 $this->setPostEditCookie( $statusValue );
1842 }
1843 }
1844
1845 $out = $this->context->getOutput();
1846
1847 // "wpExtraQueryRedirect" is a hidden input to modify
1848 // after save URL and is not used by actual edit form
1849 $request = $this->context->getRequest();
1850 $extraQueryRedirect = $request->getVal( 'wpExtraQueryRedirect' );
1851
1852 switch ( $statusValue ) {
1853 case self::AS_HOOK_ERROR_EXPECTED:
1854 case self::AS_CONTENT_TOO_BIG:
1855 case self::AS_ARTICLE_WAS_DELETED:
1856 case self::AS_CONFLICT_DETECTED:
1857 case self::AS_SUMMARY_NEEDED:
1858 case self::AS_TEXTBOX_EMPTY:
1859 case self::AS_MAX_ARTICLE_SIZE_EXCEEDED:
1860 case self::AS_END:
1861 case self::AS_BLANK_ARTICLE:
1862 case self::AS_SELF_REDIRECT:
1863 case self::AS_REVISION_WAS_DELETED:
1864 return true;
1865
1866 case self::AS_HOOK_ERROR:
1867 return false;
1868
1869 case self::AS_PARSE_ERROR:
1870 case self::AS_UNICODE_NOT_SUPPORTED:
1871 $out->wrapWikiTextAsInterface( 'error',
1872 $status->getWikiText( false, false, $this->context->getLanguage() )
1873 );
1874 return true;
1875
1876 case self::AS_SUCCESS_NEW_ARTICLE:
1877 $queryParts = [];
1878 if ( $resultDetails['redirect'] ) {
1879 $queryParts[] = 'redirect=no';
1880 }
1881 if ( $extraQueryRedirect ) {
1882 $queryParts[] = $extraQueryRedirect;
1883 }
1884 $anchor = $resultDetails['sectionanchor'] ?? '';
1885 $this->doPostEditRedirect( implode( '&', $queryParts ), $anchor );
1886 return false;
1887
1888 case self::AS_SUCCESS_UPDATE:
1889 $extraQuery = '';
1890 $sectionanchor = $resultDetails['sectionanchor'];
1891 // Give extensions a chance to modify URL query on update
1892 $this->getHookRunner()->onArticleUpdateBeforeRedirect( $this->mArticle,
1893 $sectionanchor, $extraQuery );
1894
1895 $queryParts = [];
1896 if ( $resultDetails['redirect'] ) {
1897 $queryParts[] = 'redirect=no';
1898 }
1899 if ( $extraQuery ) {
1900 $queryParts[] = $extraQuery;
1901 }
1902 if ( $extraQueryRedirect ) {
1903 $queryParts[] = $extraQueryRedirect;
1904 }
1905 $this->doPostEditRedirect( implode( '&', $queryParts ), $sectionanchor );
1906 return false;
1907
1908 case self::AS_SPAM_ERROR:
1909 $this->spamPageWithContent( $resultDetails['spam'] ?? false );
1910 return false;
1911
1912 case self::AS_BLOCKED_PAGE_FOR_USER:
1913 throw new UserBlockedError(
1914 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable Block is checked and not null
1915 $this->context->getUser()->getBlock(),
1916 $this->context->getUser(),
1917 $this->context->getLanguage(),
1918 $request->getIP()
1919 );
1920
1921 case self::AS_IMAGE_REDIRECT_ANON:
1922 case self::AS_IMAGE_REDIRECT_LOGGED:
1923 throw new PermissionsError( 'upload' );
1924
1925 case self::AS_READ_ONLY_PAGE_ANON:
1926 case self::AS_READ_ONLY_PAGE_LOGGED:
1927 throw new PermissionsError( 'edit' );
1928
1929 case self::AS_READ_ONLY_PAGE:
1930 throw new ReadOnlyError;
1931
1932 case self::AS_RATE_LIMITED:
1933 $out->wrapWikiTextAsInterface( 'error',
1934 wfMessage( 'actionthrottledtext' )->plain()
1935 );
1936 return true;
1937
1938 case self::AS_NO_CREATE_PERMISSION:
1939 $permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
1940 throw new PermissionsError( $permission );
1941
1942 case self::AS_NO_CHANGE_CONTENT_MODEL:
1943 throw new PermissionsError( 'editcontentmodel' );
1944
1945 default:
1946 // We don't recognize $statusValue. The only way that can happen
1947 // is if an extension hook aborted from inside ArticleSave.
1948 // Render the status object into $this->hookError
1949 // FIXME this sucks, we should just use the Status object throughout
1950 $this->hookError = Html::errorBox(
1951 "\n" . $status->getWikiText( false, false, $this->context->getLanguage() )
1952 );
1953 return true;
1954 }
1955 }
1956
1964 private function doPostEditRedirect( $query, $anchor ) {
1965 $out = $this->context->getOutput();
1966 $url = $this->mTitle->getFullURL( $query ) . $anchor;
1967 if ( $this->tempUserCreateDone ) {
1968 $this->getHookRunner()->onTempUserCreatedRedirect(
1969 $this->context->getRequest()->getSession(),
1970 $this->getUserForSave(),
1971 $this->mTitle->getPrefixedDBkey(),
1972 $query,
1973 $anchor,
1974 $url
1975 );
1976 }
1977 $out->redirect( $url );
1978 }
1979
1983 private function setNewSectionSummary(): void {
1984 Assert::precondition( $this->section === 'new', 'This method can only be called for new sections' );
1985 Assert::precondition( $this->sectiontitle !== null, 'This method can only be called for new sections' );
1986
1987 $services = MediaWikiServices::getInstance();
1988 $parser = $services->getParser();
1989 $textFormatter = $services->getMessageFormatterFactory()->getTextFormatter(
1990 $services->getContentLanguage()->getCode()
1991 );
1992
1993 if ( $this->sectiontitle !== '' ) {
1994 $this->newSectionAnchor = $this->guessSectionName( $this->sectiontitle );
1995 // If no edit summary was specified, create one automatically from the section
1996 // title and have it link to the new section. Otherwise, respect the summary as
1997 // passed.
1998 if ( $this->summary === '' ) {
1999 $messageValue = MessageValue::new( 'newsectionsummary' )
2000 ->plaintextParams( $parser->stripSectionName( $this->sectiontitle ) );
2001 $this->summary = $textFormatter->format( $messageValue );
2002 }
2003 } else {
2004 $this->newSectionAnchor = '';
2005 }
2006 }
2007
2034 public function internalAttemptSave( &$result, $markAsBot = false, $markAsMinor = false ) {
2035 $useNPPatrol = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::UseNPPatrol );
2036 $useRCPatrol = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::UseRCPatrol );
2037 if ( !$this->getHookRunner()->onEditPage__attemptSave( $this ) ) {
2038 wfDebug( "Hook 'EditPage::attemptSave' aborted article saving" );
2039 $status = Status::newFatal( 'hookaborted' );
2040 $status->value = self::AS_HOOK_ERROR;
2041 return $status;
2042 }
2043
2044 if ( !$this->getHookRunner()->onEditFilter( $this, $this->textbox1, $this->section,
2045 $this->hookError, $this->summary )
2046 ) {
2047 # Error messages etc. could be handled within the hook...
2048 $status = Status::newFatal( 'hookaborted' );
2049 $status->value = self::AS_HOOK_ERROR;
2050 return $status;
2051 } elseif ( $this->hookError ) {
2052 # ...or the hook could be expecting us to produce an error
2053 $status = Status::newFatal( 'hookaborted' );
2054 $status->value = self::AS_HOOK_ERROR_EXPECTED;
2055 return $status;
2056 }
2057
2058 try {
2059 # Construct Content object
2060 $textbox_content = $this->toEditContent( $this->textbox1 );
2061 } catch ( MWContentSerializationException $ex ) {
2062 $status = Status::newFatal(
2063 'content-failed-to-parse',
2064 $this->contentModel,
2065 $this->contentFormat,
2066 $ex->getMessage()
2067 );
2068 $status->value = self::AS_PARSE_ERROR;
2069 return $status;
2070 }
2071
2072 $this->contentLength = strlen( $this->textbox1 );
2073
2074 $requestUser = $this->context->getUser();
2075 $authority = $this->getAuthority();
2076 $pstUser = $this->getUserForPreview();
2077
2078 $changingContentModel = false;
2079 if ( $this->contentModel !== $this->mTitle->getContentModel() ) {
2080 $changingContentModel = true;
2081 $oldContentModel = $this->mTitle->getContentModel();
2082 }
2083
2084 // BEGINNING OF MIGRATION TO EDITCONSTRAINT SYSTEM (see T157658)
2086 $constraintFactory = MediaWikiServices::getInstance()->getService( '_EditConstraintFactory' );
2087 $constraintRunner = new EditConstraintRunner();
2088
2089 // UnicodeConstraint: ensure that `$this->unicodeCheck` is the correct unicode
2090 $constraintRunner->addConstraint(
2091 new UnicodeConstraint( $this->unicodeCheck )
2092 );
2093
2094 // SimpleAntiSpamConstraint: ensure that the context request does not have
2095 // `wpAntispam` set
2096 // Use $user since there is no permissions aspect
2097 $constraintRunner->addConstraint(
2098 $constraintFactory->newSimpleAntiSpamConstraint(
2099 $this->context->getRequest()->getText( 'wpAntispam' ),
2100 $requestUser,
2101 $this->mTitle
2102 )
2103 );
2104
2105 // SpamRegexConstraint: ensure that the summary and text don't match the spam regex
2106 $constraintRunner->addConstraint(
2107 $constraintFactory->newSpamRegexConstraint(
2108 $this->summary,
2109 $this->sectiontitle,
2110 $this->textbox1,
2111 $this->context->getRequest()->getIP(),
2112 $this->mTitle
2113 )
2114 );
2115 $constraintRunner->addConstraint(
2116 new EditRightConstraint( $authority )
2117 );
2118 $constraintRunner->addConstraint(
2120 $textbox_content,
2121 $this->mTitle,
2122 $authority
2123 )
2124 );
2125 $constraintRunner->addConstraint(
2126 $constraintFactory->newUserBlockConstraint( $this->mTitle, $requestUser )
2127 );
2128 $constraintRunner->addConstraint(
2130 $authority,
2131 $this->mTitle,
2132 $this->contentModel
2133 )
2134 );
2135
2136 $constraintRunner->addConstraint(
2137 $constraintFactory->newReadOnlyConstraint()
2138 );
2139 $constraintRunner->addConstraint(
2140 new UserRateLimitConstraint( $requestUser, $this->mTitle, $this->contentModel )
2141 );
2142 $constraintRunner->addConstraint(
2143 // Same constraint is used to check size before and after merging the
2144 // edits, which use different failure codes
2145 $constraintFactory->newPageSizeConstraint(
2146 $this->contentLength,
2147 PageSizeConstraint::BEFORE_MERGE
2148 )
2149 );
2150 $constraintRunner->addConstraint(
2151 new ChangeTagsConstraint( $authority, $this->changeTags )
2152 );
2153
2154 // If the article has been deleted while editing, don't save it without
2155 // confirmation
2156 $constraintRunner->addConstraint(
2158 $this->wasDeletedSinceLastEdit(),
2159 $this->recreate
2160 )
2161 );
2162
2163 // Check the constraints
2164 if ( !$constraintRunner->checkConstraints() ) {
2165 $failed = $constraintRunner->getFailedConstraint();
2166
2167 // Need to check SpamRegexConstraint here, to avoid needing to pass
2168 // $result by reference again
2169 if ( $failed instanceof SpamRegexConstraint ) {
2170 $result['spam'] = $failed->getMatch();
2171 } else {
2172 $this->handleFailedConstraint( $failed );
2173 }
2174
2175 return Status::wrap( $failed->getLegacyStatus() );
2176 }
2177 // END OF MIGRATION TO EDITCONSTRAINT SYSTEM (continued below)
2178
2179 // Load the page data from the primary DB. If anything changes in the meantime,
2180 // we detect it by using page_latest like a token in a 1 try compare-and-swap.
2181 $this->page->loadPageData( WikiPage::READ_LATEST );
2182 $new = !$this->page->exists();
2183
2184 $flags = EDIT_AUTOSUMMARY |
2185 ( $new ? EDIT_NEW : EDIT_UPDATE ) |
2186 ( $markAsMinor ? EDIT_MINOR : 0 ) |
2187 ( $markAsBot ? EDIT_FORCE_BOT : 0 );
2188
2189 if ( $new ) {
2190 $content = $textbox_content;
2191
2192 $result['sectionanchor'] = '';
2193 if ( $this->section === 'new' ) {
2194 if ( $this->sectiontitle !== null ) {
2195 // Insert the section title above the content.
2196 $content = $content->addSectionHeader( $this->sectiontitle );
2197 }
2198 $result['sectionanchor'] = $this->newSectionAnchor;
2199 }
2200
2201 $pageUpdater = $this->page->newPageUpdater( $pstUser )
2202 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable False positive
2203 ->setContent( SlotRecord::MAIN, $content );
2204 $pageUpdater->prepareUpdate( $flags );
2205
2206 // BEGINNING OF MIGRATION TO EDITCONSTRAINT SYSTEM (see T157658)
2207 // Create a new runner to avoid rechecking the prior constraints, use the same factory
2208 $constraintRunner = new EditConstraintRunner();
2209 // Late check for create permission, just in case *PARANOIA*
2210 $constraintRunner->addConstraint(
2211 new CreationPermissionConstraint( $authority, $this->mTitle )
2212 );
2213
2214 // Don't save a new page if it's blank or if it's a MediaWiki:
2215 // message with content equivalent to default (allow empty pages
2216 // in this case to disable messages, see T52124)
2217 $constraintRunner->addConstraint(
2219 $this->mTitle,
2220 $this->allowBlankArticle,
2221 $this->textbox1
2222 )
2223 );
2224
2225 $constraintRunner->addConstraint(
2226 $constraintFactory->newEditFilterMergedContentHookConstraint(
2227 $content,
2228 $this->context,
2229 $this->summary,
2230 $markAsMinor,
2231 $this->context->getLanguage(),
2232 $pstUser
2233 )
2234 );
2235
2236 // Check the constraints
2237 if ( !$constraintRunner->checkConstraints() ) {
2238 $failed = $constraintRunner->getFailedConstraint();
2239 $this->handleFailedConstraint( $failed );
2240 return Status::wrap( $failed->getLegacyStatus() );
2241 }
2242 // END OF MIGRATION TO EDITCONSTRAINT SYSTEM (continued below)
2243 } else { # not $new
2244
2245 # Article exists. Check for edit conflict.
2246
2247 $timestamp = $this->page->getTimestamp();
2248 $latest = $this->page->getLatest();
2249
2250 wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}" );
2251 wfDebug( "revision: {$latest}, editRevId: {$this->editRevId}" );
2252
2253 $editConflictLogger = LoggerFactory::getInstance( 'EditConflict' );
2254 // An edit conflict is detected if the current revision is different from the
2255 // revision that was current when editing was initiated on the client.
2256 // This is checked based on the timestamp and revision ID.
2257 // TODO: the timestamp based check can probably go away now.
2258 if ( ( $this->edittime !== null && $this->edittime != $timestamp )
2259 || ( $this->editRevId !== null && $this->editRevId != $latest )
2260 ) {
2261 $this->isConflict = true;
2262 if ( $this->section === 'new' ) {
2263 if ( $this->page->getUserText() === $requestUser->getName() &&
2264 $this->page->getComment() === $this->summary
2265 ) {
2266 // Probably a duplicate submission of a new comment.
2267 // This can happen when CDN resends a request after
2268 // a timeout but the first one actually went through.
2269 $editConflictLogger->debug(
2270 'Duplicate new section submission; trigger edit conflict!'
2271 );
2272 } else {
2273 // New comment; suppress conflict.
2274 $this->isConflict = false;
2275 $editConflictLogger->debug( 'Conflict suppressed; new section' );
2276 }
2277 } elseif ( $this->section === ''
2278 && $this->edittime
2279 && $this->revisionStore->userWasLastToEdit(
2281 $this->mTitle->getArticleID(),
2282 $requestUser->getId(),
2283 $this->edittime
2284 )
2285 ) {
2286 # Suppress edit conflict with self, except for section edits where merging is required.
2287 $editConflictLogger->debug( 'Suppressing edit conflict, same user.' );
2288 $this->isConflict = false;
2289 }
2290 }
2291
2292 if ( $this->isConflict ) {
2293 $editConflictLogger->debug(
2294 'Conflict! Getting section {section} for time {editTime}'
2295 . ' (id {editRevId}, article time {timestamp})',
2296 [
2297 'section' => $this->section,
2298 'editTime' => $this->edittime,
2299 'editRevId' => $this->editRevId,
2300 'timestamp' => $timestamp,
2301 ]
2302 );
2303 // @TODO: replaceSectionAtRev() with base ID (not prior current) for ?oldid=X case
2304 // ...or disable section editing for non-current revisions (not exposed anyway).
2305 if ( $this->editRevId !== null ) {
2306 $content = $this->page->replaceSectionAtRev(
2307 $this->section,
2308 $textbox_content,
2309 $this->sectiontitle,
2310 $this->editRevId
2311 );
2312 } else {
2313 $content = $this->page->replaceSectionContent(
2314 $this->section,
2315 $textbox_content,
2316 $this->sectiontitle,
2317 $this->edittime
2318 );
2319 }
2320 } else {
2321 $editConflictLogger->debug(
2322 'Getting section {section}',
2323 [ 'section' => $this->section ]
2324 );
2325 $content = $this->page->replaceSectionAtRev(
2326 $this->section,
2327 $textbox_content,
2328 $this->sectiontitle
2329 );
2330 }
2331
2332 if ( $content === null ) {
2333 $editConflictLogger->debug( 'Activating conflict; section replace failed.' );
2334 $this->isConflict = true;
2335 $content = $textbox_content; // do not try to merge here!
2336 } elseif ( $this->isConflict ) {
2337 // Attempt merge
2338 $mergedChange = $this->mergeChangesIntoContent( $content );
2339 if ( $mergedChange !== false ) {
2340 // Successful merge! Maybe we should tell the user the good news?
2341 $content = $mergedChange[0];
2342 $this->parentRevId = $mergedChange[1];
2343 $this->isConflict = false;
2344 $editConflictLogger->debug( 'Suppressing edit conflict, successful merge.' );
2345 } else {
2346 $this->section = '';
2347 $this->textbox1 = ( $content instanceof TextContent ) ? $content->getText() : '';
2348 $editConflictLogger->debug( 'Keeping edit conflict, failed merge.' );
2349 }
2350 }
2351
2352 if ( $this->isConflict ) {
2353 return Status::newGood( self::AS_CONFLICT_DETECTED )->setOK( false );
2354 }
2355
2356 $pageUpdater = $this->page->newPageUpdater( $pstUser )
2357 ->setContent( SlotRecord::MAIN, $content );
2358 $pageUpdater->prepareUpdate( $flags );
2359
2360 // BEGINNING OF MIGRATION TO EDITCONSTRAINT SYSTEM (see T157658)
2361 // Create a new runner to avoid rechecking the prior constraints, use the same factory
2362 $constraintRunner = new EditConstraintRunner();
2363 $constraintRunner->addConstraint(
2364 $constraintFactory->newEditFilterMergedContentHookConstraint(
2365 $content,
2366 $this->context,
2367 $this->summary,
2368 $markAsMinor,
2369 $this->context->getLanguage(),
2370 $pstUser
2371 )
2372 );
2373
2374 if ( $this->section === 'new' ) {
2375 $constraintRunner->addConstraint(
2377 $this->sectiontitle,
2378 $this->allowBlankSummary
2379 )
2380 );
2381 $constraintRunner->addConstraint(
2382 new MissingCommentConstraint( $this->textbox1 )
2383 );
2384 } else {
2385 $originalContent = $this->getOriginalContent( $authority );
2386
2387 if ( $originalContent === null ) {
2388 // T301947: User loses access to revision after loading
2389 // The error message, rev-deleted-text-permission, is not really in use currently.
2390 // It's added for completeness and in case any code path wants to know the error.
2391 $status = Status::newFatal( 'rev-deleted-text-permission' );
2392 $status->value = self::AS_REVISION_WAS_DELETED;
2393 return $status;
2394 }
2395
2396 $constraintRunner->addConstraint(
2398 $this->summary,
2399 $this->autoSumm,
2400 $this->allowBlankSummary,
2401 $content,
2402 $originalContent
2403 )
2404 );
2405 }
2406 // Check the constraints
2407 if ( !$constraintRunner->checkConstraints() ) {
2408 $failed = $constraintRunner->getFailedConstraint();
2409 $this->handleFailedConstraint( $failed );
2410 return Status::wrap( $failed->getLegacyStatus() );
2411 }
2412 // END OF MIGRATION TO EDITCONSTRAINT SYSTEM (continued below)
2413
2414 # All's well
2415 $sectionAnchor = '';
2416 if ( $this->section === 'new' ) {
2417 $sectionAnchor = $this->newSectionAnchor;
2418 } elseif ( $this->section !== '' ) {
2419 # Try to get a section anchor from the section source, redirect
2420 # to edited section if header found.
2421 # XXX: Might be better to integrate this into WikiPage::replaceSectionAtRev
2422 # for duplicate heading checking and maybe parsing.
2423 $hasmatch = preg_match( "/^ *([=]{1,6})(.*?)(\\1) *\\n/i", $this->textbox1, $matches );
2424 # We can't deal with anchors, includes, html etc in the header for now,
2425 # headline would need to be parsed to improve this.
2426 if ( $hasmatch && $matches[2] !== '' ) {
2427 $sectionAnchor = $this->guessSectionName( $matches[2] );
2428 }
2429 }
2430 $result['sectionanchor'] = $sectionAnchor;
2431
2432 // Save errors may fall down to the edit form, but we've now
2433 // merged the section into full text. Clear the section field
2434 // so that later submission of conflict forms won't try to
2435 // replace that into a duplicated mess.
2436 $this->textbox1 = $this->toEditText( $content );
2437 $this->section = '';
2438 }
2439
2440 // Check for length errors again now that the section is merged in
2441 $this->contentLength = strlen( $this->toEditText( $content ) );
2442
2443 // BEGINNING OF MIGRATION TO EDITCONSTRAINT SYSTEM (see T157658)
2444 // Create a new runner to avoid rechecking the prior constraints, use the same factory
2445 $constraintRunner = new EditConstraintRunner();
2446 $constraintRunner->addConstraint(
2448 $this->allowSelfRedirect,
2449 $content,
2450 $this->getCurrentContent(),
2451 $this->getTitle()
2452 )
2453 );
2454 $constraintRunner->addConstraint(
2455 // Same constraint is used to check size before and after merging the
2456 // edits, which use different failure codes
2457 $constraintFactory->newPageSizeConstraint(
2458 $this->contentLength,
2459 PageSizeConstraint::AFTER_MERGE
2460 )
2461 );
2462 // Check the constraints
2463 if ( !$constraintRunner->checkConstraints() ) {
2464 $failed = $constraintRunner->getFailedConstraint();
2465 $this->handleFailedConstraint( $failed );
2466 return Status::wrap( $failed->getLegacyStatus() );
2467 }
2468 // END OF MIGRATION TO EDITCONSTRAINT SYSTEM
2469
2470 // Auto-create the user if that is enabled
2471 $status = $this->createTempUser( $pageUpdater );
2472 if ( !$status->isOK() ) {
2473 return $status;
2474 }
2475 if ( $status instanceof CreateStatus ) {
2476 $result['savedTempUser'] = $status->getUser();
2477 }
2478
2479 if ( $this->undidRev && $this->isUndoClean( $content ) ) {
2480 // As the user can change the edit's content before saving, we only mark
2481 // "clean" undos as reverts. This is to avoid abuse by marking irrelevant
2482 // edits as undos.
2483 $pageUpdater
2484 ->setOriginalRevisionId( $this->undoAfter ?: false )
2485 ->markAsRevert(
2486 EditResult::REVERT_UNDO,
2487 $this->undidRev,
2488 $this->undoAfter ?: null
2489 );
2490 }
2491
2492 $needsPatrol = $useRCPatrol || ( $useNPPatrol && !$this->page->exists() );
2493 if ( $needsPatrol && $authority->authorizeWrite( 'autopatrol', $this->getTitle() ) ) {
2494 $pageUpdater->setRcPatrolStatus( RecentChange::PRC_AUTOPATROLLED );
2495 }
2496
2497 $pageUpdater
2498 ->addTags( $this->changeTags )
2499 ->saveRevision(
2500 CommentStoreComment::newUnsavedComment( trim( $this->summary ) ),
2501 $flags
2502 );
2503 $doEditStatus = $pageUpdater->getStatus();
2504
2505 if ( !$doEditStatus->isOK() ) {
2506 // Failure from doEdit()
2507 // Show the edit conflict page for certain recognized errors from doEdit(),
2508 // but don't show it for errors from extension hooks
2509 if (
2510 $doEditStatus->failedBecausePageMissing() ||
2511 $doEditStatus->failedBecausePageExists() ||
2512 $doEditStatus->failedBecauseOfConflict()
2513 ) {
2514 $this->isConflict = true;
2515 // Destroys data doEdit() put in $status->value but who cares
2516 $doEditStatus->value = self::AS_END;
2517 }
2518 return $doEditStatus;
2519 }
2520
2521 $result['nullEdit'] = !$doEditStatus->wasRevisionCreated();
2522 if ( $result['nullEdit'] ) {
2523 // We don't know if it was a null edit until now, so increment here
2524 $requestUser->pingLimiter( 'linkpurge' );
2525 }
2526 $result['redirect'] = $content->isRedirect();
2527
2528 $this->updateWatchlist();
2529
2530 // If the content model changed, add a log entry
2531 if ( $changingContentModel ) {
2532 $this->addContentModelChangeLogEntry(
2533 $this->getUserForSave(),
2534 // @phan-suppress-next-next-line PhanPossiblyUndeclaredVariable
2535 // $oldContentModel is set when $changingContentModel is true
2536 $new ? false : $oldContentModel,
2537 $this->contentModel,
2538 $this->summary
2539 );
2540 }
2541
2542 // Instead of carrying the same status object throughout, it is created right
2543 // when it is returned, either at an earlier point due to an error or here
2544 // due to a successful edit.
2545 $statusCode = ( $new ? self::AS_SUCCESS_NEW_ARTICLE : self::AS_SUCCESS_UPDATE );
2546 return Status::newGood( $statusCode );
2547 }
2548
2557 private function handleFailedConstraint( IEditConstraint $failed ): void {
2558 if ( $failed instanceof PageSizeConstraint ) {
2559 // Error will be displayed by showEditForm()
2560 $this->tooBig = true;
2561 } elseif ( $failed instanceof UserBlockConstraint ) {
2562 // Auto-block user's IP if the account was "hard" blocked
2563 if ( !MediaWikiServices::getInstance()->getReadOnlyMode()->isReadOnly() ) {
2564 $this->context->getUser()->spreadAnyEditBlock();
2565 }
2566 } elseif ( $failed instanceof DefaultTextConstraint ) {
2567 $this->blankArticle = true;
2568 } elseif ( $failed instanceof EditFilterMergedContentHookConstraint ) {
2569 $this->hookError = $failed->getHookError();
2570 } elseif (
2571 $failed instanceof AutoSummaryMissingSummaryConstraint ||
2572 $failed instanceof NewSectionMissingSubjectConstraint
2573 ) {
2574 $this->missingSummary = true;
2575 } elseif ( $failed instanceof MissingCommentConstraint ) {
2576 $this->missingComment = true;
2577 } elseif ( $failed instanceof SelfRedirectConstraint ) {
2578 $this->selfRedirect = true;
2579 }
2580 }
2581
2592 private function isUndoClean( Content $content ): bool {
2593 // Check whether the undo was "clean", that is the user has not modified
2594 // the automatically generated content.
2595 $undoRev = $this->revisionStore->getRevisionById( $this->undidRev );
2596 if ( $undoRev === null ) {
2597 return false;
2598 }
2599
2600 if ( $this->undoAfter ) {
2601 $oldRev = $this->revisionStore->getRevisionById( $this->undoAfter );
2602 } else {
2603 $oldRev = $this->revisionStore->getPreviousRevision( $undoRev );
2604 }
2605
2606 if ( $oldRev === null ||
2607 $undoRev->isDeleted( RevisionRecord::DELETED_TEXT ) ||
2608 $oldRev->isDeleted( RevisionRecord::DELETED_TEXT )
2609 ) {
2610 return false;
2611 }
2612
2613 $undoContent = $this->getUndoContent( $undoRev, $oldRev, $undoError );
2614 if ( !$undoContent ) {
2615 return false;
2616 }
2617
2618 // Do a pre-save transform on the retrieved undo content
2619 $services = MediaWikiServices::getInstance();
2620 $contentLanguage = $services->getContentLanguage();
2621 $user = $this->getUserForPreview();
2622 $parserOptions = ParserOptions::newFromUserAndLang( $user, $contentLanguage );
2623 $contentTransformer = $services->getContentTransformer();
2624 $undoContent = $contentTransformer->preSaveTransform( $undoContent, $this->mTitle, $user, $parserOptions );
2625
2626 if ( $undoContent->equals( $content ) ) {
2627 return true;
2628 }
2629 return false;
2630 }
2631
2638 private function addContentModelChangeLogEntry( UserIdentity $user, $oldModel, $newModel, $reason = "" ): void {
2639 $new = $oldModel === false;
2640 $log = new ManualLogEntry( 'contentmodel', $new ? 'new' : 'change' );
2641 $log->setPerformer( $user );
2642 $log->setTarget( $this->mTitle );
2643 $log->setComment( is_string( $reason ) ? $reason : "" );
2644 $log->setParameters( [
2645 '4::oldmodel' => $oldModel,
2646 '5::newmodel' => $newModel
2647 ] );
2648 $logid = $log->insert();
2649 $log->publish( $logid );
2650 }
2651
2655 private function updateWatchlist(): void {
2656 if ( $this->tempUserCreateActive ) {
2657 return;
2658 }
2659 $user = $this->getUserForSave();
2660 if ( !$user->isNamed() ) {
2661 return;
2662 }
2663
2664 $title = $this->mTitle;
2665 $watch = $this->watchthis;
2666 $watchlistExpiry = $this->watchlistExpiry;
2667
2668 // This can't run as a DeferredUpdate due to a possible race condition
2669 // when the post-edit redirect happens if the pendingUpdates queue is
2670 // too large to finish in time (T259564)
2671 $this->watchlistManager->setWatch( $watch, $user, $title, $watchlistExpiry );
2672
2673 $this->watchedItemStore->maybeEnqueueWatchlistExpiryJob();
2674 }
2675
2686 private function mergeChangesIntoContent( Content $editContent ) {
2687 // This is the revision that was current at the time editing was initiated on the client,
2688 // even if the edit was based on an old revision.
2689 $baseRevRecord = $this->getExpectedParentRevision();
2690 $baseContent = $baseRevRecord ?
2691 $baseRevRecord->getContent( SlotRecord::MAIN ) :
2692 null;
2693
2694 if ( $baseContent === null ) {
2695 return false;
2696 }
2697
2698 // The current state, we want to merge updates into it
2699 $currentRevisionRecord = $this->revisionStore->getRevisionByTitle(
2700 $this->mTitle,
2701 0,
2702 RevisionStore::READ_LATEST
2703 );
2704 $currentContent = $currentRevisionRecord
2705 ? $currentRevisionRecord->getContent( SlotRecord::MAIN )
2706 : null;
2707
2708 if ( $currentContent === null ) {
2709 return false;
2710 }
2711
2712 $mergedContent = $this->contentHandlerFactory
2713 ->getContentHandler( $baseContent->getModel() )
2714 ->merge3( $baseContent, $editContent, $currentContent );
2715
2716 if ( $mergedContent ) {
2717 // Also need to update parentRevId to what we just merged.
2718 return [ $mergedContent, $currentRevisionRecord->getId() ];
2719 }
2720
2721 return false;
2722 }
2723
2731 public function getExpectedParentRevision() {
2732 if ( $this->mExpectedParentRevision === false ) {
2733 $revRecord = null;
2734 if ( $this->editRevId ) {
2735 $revRecord = $this->revisionStore->getRevisionById(
2736 $this->editRevId,
2737 RevisionStore::READ_LATEST
2738 );
2739 } elseif ( $this->edittime ) {
2740 $revRecord = $this->revisionStore->getRevisionByTimestamp(
2741 $this->getTitle(),
2742 $this->edittime,
2743 RevisionStore::READ_LATEST
2744 );
2745 }
2746 $this->mExpectedParentRevision = $revRecord;
2747 }
2748 return $this->mExpectedParentRevision;
2749 }
2750
2751 public function setHeaders() {
2752 $out = $this->context->getOutput();
2753
2754 $out->addModules( 'mediawiki.action.edit' );
2755 $out->addModuleStyles( 'mediawiki.action.edit.styles' );
2756 $out->addModuleStyles( 'mediawiki.editfont.styles' );
2757 $out->addModuleStyles( 'mediawiki.interface.helpers.styles' );
2758
2759 $user = $this->context->getUser();
2760
2761 if ( $this->userOptionsLookup->getOption( $user, 'uselivepreview' ) ) {
2762 $out->addModules( 'mediawiki.action.edit.preview' );
2763 }
2764
2765 if ( $this->userOptionsLookup->getOption( $user, 'useeditwarning' ) ) {
2766 $out->addModules( 'mediawiki.action.edit.editWarning' );
2767 }
2768
2769 if ( $this->context->getConfig()->get( MainConfigNames::EnableEditRecovery ) ) {
2770 $out->addModules( 'mediawiki.editRecovery.edit' );
2771 }
2772
2773 # Enabled article-related sidebar, toplinks, etc.
2774 $out->setArticleRelated( true );
2775
2776 $contextTitle = $this->getContextTitle();
2777 if ( $this->isConflict ) {
2778 $msg = 'editconflict';
2779 } elseif ( $contextTitle->exists() && $this->section != '' ) {
2780 $msg = $this->section === 'new' ? 'editingcomment' : 'editingsection';
2781 } else {
2782 $msg = $contextTitle->exists()
2783 || ( $contextTitle->getNamespace() === NS_MEDIAWIKI
2784 && $contextTitle->getDefaultMessageText() !== false
2785 )
2786 ? 'editing'
2787 : 'creating';
2788 }
2789
2790 # Use the title defined by DISPLAYTITLE magic word when present
2791 # NOTE: getDisplayTitle() returns HTML while getPrefixedText() returns plain text.
2792 # Escape ::getPrefixedText() so that we have HTML in all cases,
2793 # and pass as a "raw" parameter to ::setPageTitleMsg().
2794 $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
2795 if ( $displayTitle === false ) {
2796 $displayTitle = htmlspecialchars(
2797 $contextTitle->getPrefixedText(), ENT_QUOTES, 'UTF-8', false
2798 );
2799 } else {
2800 $out->setDisplayTitle( $displayTitle );
2801 }
2802
2803 // Enclose the title with an element. This is used on live preview to update the
2804 // preview of the display title.
2805 $displayTitle = Html::rawElement( 'span', [ 'id' => 'firstHeadingTitle' ], $displayTitle );
2806
2807 $out->setPageTitleMsg( $this->context->msg( $msg )->rawParams( $displayTitle ) );
2808
2809 $config = $this->context->getConfig();
2810
2811 # Transmit the name of the message to JavaScript. This was added for live preview.
2812 # Live preview doesn't use this anymore. The variable is still transmitted because
2813 # Edit Recovery and user scripts use it.
2814 $out->addJsConfigVars( [
2815 'wgEditMessage' => $msg,
2816 ] );
2817
2818 // Add whether to use 'save' or 'publish' messages to JavaScript for post-edit, other
2819 // editors, etc.
2820 $out->addJsConfigVars(
2821 'wgEditSubmitButtonLabelPublish',
2822 $config->get( MainConfigNames::EditSubmitButtonLabelPublish )
2823 );
2824 }
2825
2829 private function showIntro(): void {
2830 $services = MediaWikiServices::getInstance();
2831
2832 // Hardcoded list of notices that are suppressable for historical reasons.
2833 // This feature was originally added for LiquidThreads, to avoid showing non-essential messages
2834 // when commenting in a thread, but some messages were included (or excluded) by mistake before
2835 // its implementation was moved to one place, and this list doesn't make a lot of sense.
2836 // TODO: Remove the suppressIntro feature from EditPage, and invent a better way for extensions
2837 // to skip individual intro messages.
2838 $skip = $this->suppressIntro ? [
2839 'editintro',
2840 'code-editing-intro',
2841 'sharedupload-desc-create',
2842 'sharedupload-desc-edit',
2843 'userpage-userdoesnotexist',
2844 'blocked-notice-logextract',
2845 'newarticletext',
2846 'newarticletextanon',
2847 'recreate-moveddeleted-warn',
2848 ] : [];
2849
2850 $messages = $services->getIntroMessageBuilder()->getIntroMessages(
2851 IntroMessageBuilder::MORE_FRAMES,
2852 $skip,
2853 $this->context,
2854 $this->mTitle->toPageIdentity(),
2855 $this->mArticle->fetchRevisionRecord(),
2856 $this->context->getUser(),
2857 $this->context->getRequest()->getVal( 'editintro' ),
2859 array_diff_key(
2860 $this->context->getRequest()->getValues(),
2861 [ 'title' => true, 'returnto' => true, 'returntoquery' => true ]
2862 )
2863 ),
2864 !$this->firsttime,
2865 $this->section !== '' ? $this->section : null
2866 );
2867
2868 foreach ( $messages as $noticeName => $message ) {
2869 $this->context->getOutput()->addHTML( $message );
2870 }
2871 }
2872
2891 private function toEditText( $content ) {
2892 if ( $content === null || $content === false ) {
2893 return '';
2894 }
2895 if ( is_string( $content ) ) {
2896 return $content;
2897 }
2898
2899 if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
2900 throw new MWException( 'This content model is not supported: ' . $content->getModel() );
2901 }
2902
2903 return $content->serialize( $this->contentFormat );
2904 }
2905
2922 protected function toEditContent( $text ) {
2923 if ( $text === false || $text === null ) {
2924 return $text;
2925 }
2926
2927 $content = ContentHandler::makeContent( $text, $this->getTitle(),
2928 $this->contentModel, $this->contentFormat );
2929
2930 if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
2931 throw new MWException( 'This content model is not supported: ' . $content->getModel() );
2932 }
2933
2934 return $content;
2935 }
2936
2940 public function showEditForm() {
2941 # need to parse the preview early so that we know which templates are used,
2942 # otherwise users with "show preview after edit box" will get a blank list
2943 # we parse this near the beginning so that setHeaders can do the title
2944 # setting work instead of leaving it in getPreviewText
2945 $previewOutput = '';
2946 if ( $this->formtype === 'preview' ) {
2947 $previewOutput = $this->getPreviewText();
2948 }
2949
2950 $out = $this->context->getOutput();
2951
2952 // FlaggedRevs depends on running this hook before adding edit notices in showIntro() (T337637)
2953 $this->getHookRunner()->onEditPage__showEditForm_initial( $this, $out );
2954
2955 $this->setHeaders();
2956
2957 // Show applicable editing introductions
2958 $this->showIntro();
2959
2960 if ( !$this->isConflict &&
2961 $this->section !== '' &&
2962 !$this->isSectionEditSupported()
2963 ) {
2964 // We use $this->section to much before this and getVal('wgSection') directly in other places
2965 // at this point we can't reset $this->section to '' to fallback to non-section editing.
2966 // Someone is welcome to try refactoring though
2967 $out->showErrorPage( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
2968 return;
2969 }
2970
2971 $this->showHeader();
2972
2973 $out->addHTML( $this->editFormPageTop );
2974
2975 $user = $this->context->getUser();
2976 if ( $this->userOptionsLookup->getOption( $user, 'previewontop' ) ) {
2977 $this->displayPreviewArea( $previewOutput, true );
2978 }
2979
2980 $out->addHTML( $this->editFormTextTop );
2981
2982 if ( $this->formtype !== 'save' && $this->wasDeletedSinceLastEdit() ) {
2983 $out->addHTML( Html::errorBox(
2984 $out->msg( 'deletedwhileediting' )->parse(),
2985 '',
2986 'mw-deleted-while-editing'
2987 ) );
2988 }
2989
2990 // @todo add EditForm plugin interface and use it here!
2991 // search for textarea1 and textarea2, and allow EditForm to override all uses.
2992 $out->addHTML( Html::openElement(
2993 'form',
2994 [
2995 'class' => 'mw-editform',
2996 'id' => self::EDITFORM_ID,
2997 'name' => self::EDITFORM_ID,
2998 'method' => 'post',
2999 'action' => $this->getActionURL( $this->getContextTitle() ),
3000 'enctype' => 'multipart/form-data'
3001 ]
3002 ) );
3003
3004 // Add a check for Unicode support
3005 $out->addHTML( Html::hidden( 'wpUnicodeCheck', self::UNICODE_CHECK ) );
3006
3007 // Add an empty field to trip up spambots
3008 $out->addHTML(
3009 Xml::openElement( 'div', [ 'id' => 'antispam-container', 'style' => 'display: none;' ] )
3010 . Html::rawElement(
3011 'label',
3012 [ 'for' => 'wpAntispam' ],
3013 $this->context->msg( 'simpleantispam-label' )->parse()
3014 )
3015 . Xml::element(
3016 'input',
3017 [
3018 'type' => 'text',
3019 'name' => 'wpAntispam',
3020 'id' => 'wpAntispam',
3021 'value' => ''
3022 ]
3023 )
3024 . Xml::closeElement( 'div' )
3025 );
3026
3027 $this->getHookRunner()->onEditPage__showEditForm_fields( $this, $out );
3028
3029 // Put these up at the top to ensure they aren't lost on early form submission
3030 $this->showFormBeforeText();
3031
3032 if ( $this->formtype === 'save' && $this->wasDeletedSinceLastEdit() ) {
3033 $username = $this->lastDelete->actor_name;
3034 $comment = $this->commentStore->getComment( 'log_comment', $this->lastDelete )->text;
3035
3036 // It is better to not parse the comment at all than to have templates expanded in the middle
3037 // TODO: can the checkLabel be moved outside of the div so that wrapWikiMsg could be used?
3038 $key = $comment === ''
3039 ? 'confirmrecreate-noreason'
3040 : 'confirmrecreate';
3041 $out->addHTML( Html::rawElement(
3042 'div',
3043 [ 'class' => 'mw-confirm-recreate' ],
3044 $this->context->msg( $key )
3045 ->params( $username )
3046 ->plaintextParams( $comment )
3047 ->parse() .
3048 Xml::checkLabel(
3049 $this->context->msg( 'recreate' )->text(),
3050 'wpRecreate',
3051 'wpRecreate',
3052 false,
3053 [ 'title' => Linker::titleAttrib( 'recreate' ), 'tabindex' => 1, 'id' => 'wpRecreate' ]
3054 )
3055 ) );
3056 }
3057
3058 # When the summary is hidden, also hide them on preview/show changes
3059 if ( $this->nosummary ) {
3060 $out->addHTML( Html::hidden( 'nosummary', true ) );
3061 }
3062
3063 # If a blank edit summary was previously provided, and the appropriate
3064 # user preference is active, pass a hidden tag as wpIgnoreBlankSummary. This will stop the
3065 # user being bounced back more than once in the event that a summary
3066 # is not required.
3067 # ####
3068 # For a bit more sophisticated detection of blank summaries, hash the
3069 # automatic one and pass that in the hidden field wpAutoSummary.
3070 if (
3071 $this->missingSummary ||
3072 // @phan-suppress-next-line PhanSuspiciousValueComparison
3073 ( $this->section === 'new' && $this->nosummary ) ||
3074 $this->allowBlankSummary
3075 ) {
3076 $out->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) );
3077 }
3078
3079 if ( $this->undidRev ) {
3080 $out->addHTML( Html::hidden( 'wpUndidRevision', $this->undidRev ) );
3081 }
3082 if ( $this->undoAfter ) {
3083 $out->addHTML( Html::hidden( 'wpUndoAfter', $this->undoAfter ) );
3084 }
3085
3086 if ( $this->selfRedirect ) {
3087 $out->addHTML( Html::hidden( 'wpIgnoreSelfRedirect', true ) );
3088 }
3089
3090 $autosumm = $this->autoSumm !== '' ? $this->autoSumm : md5( $this->summary );
3091 $out->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) );
3092
3093 $out->addHTML( Html::hidden( 'oldid', $this->oldid ) );
3094 $out->addHTML( Html::hidden( 'parentRevId', $this->getParentRevId() ) );
3095
3096 $out->addHTML( Html::hidden( 'format', $this->contentFormat ) );
3097 $out->addHTML( Html::hidden( 'model', $this->contentModel ) );
3098
3099 $out->enableOOUI();
3100
3101 if ( $this->section === 'new' ) {
3102 $this->showSummaryInput( true );
3103 $out->addHTML( $this->getSummaryPreview( true ) );
3104 }
3105
3106 $out->addHTML( $this->editFormTextBeforeContent );
3107 if ( $this->isConflict ) {
3108 $currentText = $this->toEditText( $this->getCurrentContent() );
3109
3110 $editConflictHelper = $this->getEditConflictHelper();
3111 $editConflictHelper->setTextboxes( $this->textbox1, $currentText );
3112 $editConflictHelper->setContentModel( $this->contentModel );
3113 $editConflictHelper->setContentFormat( $this->contentFormat );
3114 $out->addHTML( $editConflictHelper->getEditFormHtmlBeforeContent() );
3115
3116 $this->textbox2 = $this->textbox1;
3117 $this->textbox1 = $currentText;
3118 }
3119
3120 if ( !$this->mTitle->isUserConfigPage() ) {
3121 $out->addHTML( self::getEditToolbar() );
3122 }
3123
3124 if ( $this->blankArticle ) {
3125 $out->addHTML( Html::hidden( 'wpIgnoreBlankArticle', true ) );
3126 }
3127
3128 if ( $this->isConflict ) {
3129 // In an edit conflict bypass the overridable content form method
3130 // and fallback to the raw wpTextbox1 since editconflicts can't be
3131 // resolved between page source edits and custom ui edits using the
3132 // custom edit ui.
3133 $conflictTextBoxAttribs = [];
3134 if ( $this->wasDeletedSinceLastEdit() ) {
3135 $conflictTextBoxAttribs['style'] = 'display:none;';
3136 } elseif ( $this->isOldRev ) {
3137 $conflictTextBoxAttribs['class'] = 'mw-textarea-oldrev';
3138 }
3139
3140 // @phan-suppress-next-next-line PhanPossiblyUndeclaredVariable
3141 // $editConflictHelper is declard, when isConflict is true
3142 $out->addHTML( $editConflictHelper->getEditConflictMainTextBox( $conflictTextBoxAttribs ) );
3143 // @phan-suppress-next-next-line PhanPossiblyUndeclaredVariable
3144 // $editConflictHelper is declard, when isConflict is true
3145 $out->addHTML( $editConflictHelper->getEditFormHtmlAfterContent() );
3146 } else {
3147 $this->showContentForm();
3148 }
3149
3150 $out->addHTML( $this->editFormTextAfterContent );
3151
3152 $this->showStandardInputs();
3153
3154 $this->showFormAfterText();
3155
3156 $this->showTosSummary();
3157
3158 $this->showEditTools();
3159
3160 $out->addHTML( $this->editFormTextAfterTools . "\n" );
3161
3162 $out->addHTML( $this->makeTemplatesOnThisPageList( $this->getTemplates() ) );
3163
3164 $out->addHTML( Html::rawElement( 'div', [ 'class' => 'hiddencats' ],
3165 Linker::formatHiddenCategories( $this->page->getHiddenCategories() ) ) );
3166
3167 $out->addHTML( Html::rawElement( 'div', [ 'class' => 'limitreport' ],
3168 self::getPreviewLimitReport( $this->mParserOutput ) ) );
3169
3170 $out->addModules( 'mediawiki.action.edit.collapsibleFooter' );
3171
3172 if ( $this->isConflict ) {
3173 try {
3174 $this->showConflict();
3175 } catch ( MWContentSerializationException $ex ) {
3176 // this can't really happen, but be nice if it does.
3177 $msg = $this->context->msg(
3178 'content-failed-to-parse',
3179 $this->contentModel,
3180 $this->contentFormat,
3181 $ex->getMessage()
3182 );
3183 $out->wrapWikiTextAsInterface( 'error', $msg->plain() );
3184 }
3185 }
3186
3187 // Set a hidden field so JS knows what edit form mode we are in
3188 if ( $this->isConflict ) {
3189 $mode = 'conflict';
3190 } elseif ( $this->preview ) {
3191 $mode = 'preview';
3192 } elseif ( $this->diff ) {
3193 $mode = 'diff';
3194 } else {
3195 $mode = 'text';
3196 }
3197 $out->addHTML( Html::hidden( 'mode', $mode, [ 'id' => 'mw-edit-mode' ] ) );
3198
3199 // Marker for detecting truncated form data. This must be the last
3200 // parameter sent in order to be of use, so do not move me.
3201 $out->addHTML( Html::hidden( 'wpUltimateParam', true ) );
3202 $out->addHTML( $this->editFormTextBottom . "\n</form>\n" );
3203
3204 if ( !$this->userOptionsLookup->getOption( $user, 'previewontop' ) ) {
3205 $this->displayPreviewArea( $previewOutput, false );
3206 }
3207 }
3208
3216 public function makeTemplatesOnThisPageList( array $templates ) {
3217 $templateListFormatter = new TemplatesOnThisPageFormatter(
3218 $this->context,
3219 $this->linkRenderer,
3220 $this->linkBatchFactory,
3221 $this->restrictionStore
3222 );
3223
3224 // preview if preview, else section if section, else false
3225 $type = false;
3226 if ( $this->preview ) {
3227 $type = 'preview';
3228 } elseif ( $this->section !== '' ) {
3229 $type = 'section';
3230 }
3231
3232 return Html::rawElement( 'div', [ 'class' => 'templatesUsed' ],
3233 $templateListFormatter->format( $templates, $type )
3234 );
3235 }
3236
3243 private static function extractSectionTitle( $text ) {
3244 if ( preg_match( "/^(=+)(.+)\\1\\s*(\n|$)/i", $text, $matches ) ) {
3245 return MediaWikiServices::getInstance()->getParser()
3246 ->stripSectionName( trim( $matches[2] ) );
3247 } else {
3248 return false;
3249 }
3250 }
3251
3252 private function showHeader(): void {
3253 $out = $this->context->getOutput();
3254 $user = $this->context->getUser();
3255 if ( $this->isConflict ) {
3256 $this->addExplainConflictHeader();
3257 $this->editRevId = $this->page->getLatest();
3258 } else {
3259 if ( $this->section !== '' && $this->section !== 'new' && !$this->summary &&
3260 !$this->preview && !$this->diff
3261 ) {
3262 $sectionTitle = self::extractSectionTitle( $this->textbox1 ); // FIXME: use Content object
3263 if ( $sectionTitle !== false ) {
3264 $this->summary = "/* $sectionTitle */ ";
3265 }
3266 }
3267
3268 $buttonLabel = $this->context->msg( $this->getSubmitButtonLabel() )->text();
3269
3270 if ( $this->missingComment ) {
3271 $out->wrapWikiMsg( "<div id='mw-missingcommenttext'>\n$1\n</div>", 'missingcommenttext' );
3272 }
3273
3274 if ( $this->missingSummary && $this->section !== 'new' ) {
3275 $out->wrapWikiMsg(
3276 "<div id='mw-missingsummary'>\n$1\n</div>",
3277 [ 'missingsummary', $buttonLabel ]
3278 );
3279 }
3280
3281 if ( $this->missingSummary && $this->section === 'new' ) {
3282 $out->wrapWikiMsg(
3283 "<div id='mw-missingcommentheader'>\n$1\n</div>",
3284 [ 'missingcommentheader', $buttonLabel ]
3285 );
3286 }
3287
3288 if ( $this->blankArticle ) {
3289 $out->wrapWikiMsg(
3290 "<div id='mw-blankarticle'>\n$1\n</div>",
3291 [ 'blankarticle', $buttonLabel ]
3292 );
3293 }
3294
3295 if ( $this->selfRedirect ) {
3296 $out->wrapWikiMsg(
3297 "<div id='mw-selfredirect'>\n$1\n</div>",
3298 [ 'selfredirect', $buttonLabel ]
3299 );
3300 }
3301
3302 if ( $this->hookError !== '' ) {
3303 $out->addWikiTextAsInterface( $this->hookError );
3304 }
3305
3306 if ( $this->section != 'new' ) {
3307 $revRecord = $this->mArticle->fetchRevisionRecord();
3308 if ( $revRecord && $revRecord instanceof RevisionStoreRecord ) {
3309 // Let sysop know that this will make private content public if saved
3310
3311 if ( !$revRecord->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
3312 $out->addHTML(
3313 Html::warningBox(
3314 $out->msg( 'rev-deleted-text-permission', $this->mTitle->getPrefixedDBkey() )->parse(),
3315 'plainlinks'
3316 )
3317 );
3318 } elseif ( $revRecord->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
3319 $out->addHTML(
3320 Html::warningBox(
3321 // title used in wikilinks, should not contain whitespaces
3322 $out->msg( 'rev-deleted-text-view', $this->mTitle->getPrefixedDBkey() )->parse(),
3323 'plainlinks'
3324 )
3325 );
3326 }
3327
3328 if ( !$revRecord->isCurrent() ) {
3329 $this->mArticle->setOldSubtitle( $revRecord->getId() );
3330 $this->isOldRev = true;
3331 }
3332 } elseif ( $this->mTitle->exists() ) {
3333 // Something went wrong
3334
3335 $out->addHTML(
3336 Html::errorBox(
3337 $out->msg( 'missing-revision', $this->oldid )->parse()
3338 )
3339 );
3340 }
3341 }
3342 }
3343
3344 $this->addLongPageWarningHeader();
3345 }
3346
3354 private function getSummaryInputAttributes( array $inputAttrs ): array {
3355 // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
3356 // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
3357 // Unicode codepoints.
3358 return $inputAttrs + [
3359 'id' => 'wpSummary',
3360 'name' => 'wpSummary',
3361 'maxlength' => CommentStore::COMMENT_CHARACTER_LIMIT,
3362 'tabindex' => 1,
3363 'size' => 60,
3364 'spellcheck' => 'true',
3365 ];
3366 }
3367
3377 private function getSummaryInputWidget( $summary, string $labelText, array $inputAttrs ): FieldLayout {
3378 $inputAttrs = OOUI\Element::configFromHtmlAttributes(
3379 $this->getSummaryInputAttributes( $inputAttrs )
3380 );
3381 $inputAttrs += [
3382 'title' => Linker::titleAttrib( 'summary' ),
3383 'accessKey' => Linker::accesskey( 'summary' ),
3384 ];
3385
3386 // For compatibility with old scripts and extensions, we want the legacy 'id' on the `<input>`
3387 $inputAttrs['inputId'] = $inputAttrs['id'];
3388 $inputAttrs['id'] = 'wpSummaryWidget';
3389
3390 return new OOUI\FieldLayout(
3391 new OOUI\TextInputWidget( [
3392 'value' => $summary,
3393 'infusable' => true,
3394 ] + $inputAttrs ),
3395 [
3396 'label' => new OOUI\HtmlSnippet( $labelText ),
3397 'align' => 'top',
3398 'id' => 'wpSummaryLabel',
3399 'classes' => [ $this->missingSummary ? 'mw-summarymissed' : 'mw-summary' ],
3400 ]
3401 );
3402 }
3403
3409 private function showSummaryInput( bool $isSubjectPreview ): void {
3410 # Add a class if 'missingsummary' is triggered to allow styling of the summary line
3411 $summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary';
3412 if ( $isSubjectPreview ) {
3413 if ( $this->nosummary ) {
3414 return;
3415 }
3416 } elseif ( !$this->mShowSummaryField ) {
3417 return;
3418 }
3419
3420 $labelText = $this->context->msg( $isSubjectPreview ? 'subject' : 'summary' )->parse();
3421 $this->context->getOutput()->addHTML(
3422 $this->getSummaryInputWidget(
3423 $isSubjectPreview ? $this->sectiontitle : $this->summary,
3424 $labelText,
3425 [ 'class' => $summaryClass ]
3426 )
3427 );
3428 }
3429
3436 private function getSummaryPreview( bool $isSubjectPreview ): string {
3437 // avoid spaces in preview, gets always trimmed on save
3438 $summary = trim( $this->summary );
3439 if ( $summary === '' || ( !$this->preview && !$this->diff ) ) {
3440 return "";
3441 }
3442
3443 $commentFormatter = MediaWikiServices::getInstance()->getCommentFormatter();
3444 $summary = $this->context->msg( 'summary-preview' )->parse()
3445 . $commentFormatter->formatBlock( $summary, $this->mTitle, $isSubjectPreview );
3446 return Xml::tags( 'div', [ 'class' => 'mw-summary-preview' ], $summary );
3447 }
3448
3449 private function showFormBeforeText(): void {
3450 $out = $this->context->getOutput();
3451 $out->addHTML( Html::hidden( 'wpSection', $this->section ) );
3452 $out->addHTML( Html::hidden( 'wpStarttime', $this->starttime ) );
3453 $out->addHTML( Html::hidden( 'wpEdittime', $this->edittime ) );
3454 $out->addHTML( Html::hidden( 'editRevId', $this->editRevId ) );
3455 $out->addHTML( Html::hidden( 'wpScrolltop', $this->scrolltop, [ 'id' => 'wpScrolltop' ] ) );
3456 }
3457
3458 protected function showFormAfterText() {
3471 $this->context->getOutput()->addHTML(
3472 "\n" .
3473 Html::hidden( "wpEditToken", $this->context->getUser()->getEditToken() ) .
3474 "\n"
3475 );
3476 }
3477
3486 protected function showContentForm() {
3487 $this->showTextbox1();
3488 }
3489
3490 private function showTextbox1(): void {
3491 if ( $this->formtype === 'save' && $this->wasDeletedSinceLastEdit() ) {
3492 $attribs = [ 'style' => 'display:none;' ];
3493 } else {
3494 $builder = new TextboxBuilder();
3495 $classes = $builder->getTextboxProtectionCSSClasses( $this->getTitle() );
3496
3497 # Is an old revision being edited?
3498 if ( $this->isOldRev ) {
3499 $classes[] = 'mw-textarea-oldrev';
3500 }
3501
3502 $attribs = [
3503 'aria-label' => $this->context->msg( 'edit-textarea-aria-label' )->text(),
3504 'tabindex' => 1
3505 ];
3506
3507 $attribs = $builder->mergeClassesIntoAttributes( $classes, $attribs );
3508 }
3509
3510 $this->showTextbox(
3511 $this->textbox1,
3512 'wpTextbox1',
3513 $attribs
3514 );
3515 }
3516
3517 protected function showTextbox( $text, $name, $customAttribs = [] ) {
3518 $builder = new TextboxBuilder();
3519 $attribs = $builder->buildTextboxAttribs(
3520 $name,
3521 $customAttribs,
3522 $this->context->getUser(),
3523 $this->mTitle
3524 );
3525
3526 $this->context->getOutput()->addHTML(
3527 Html::textarea( $name, $builder->addNewLineAtEnd( $text ), $attribs )
3528 );
3529 }
3530
3531 private function displayPreviewArea( string $previewOutput, bool $isOnTop ): void {
3532 $attribs = [ 'id' => 'wikiPreview' ];
3533 if ( $isOnTop ) {
3534 $attribs['class'] = 'ontop';
3535 }
3536 if ( $this->formtype !== 'preview' ) {
3537 $attribs['style'] = 'display: none;';
3538 }
3539
3540 $out = $this->context->getOutput();
3541 $out->addHTML( Xml::openElement( 'div', $attribs ) );
3542
3543 if ( $this->formtype === 'preview' ) {
3544 $this->showPreview( $previewOutput );
3545 } else {
3546 // Empty content container for LivePreview
3547 $pageViewLang = $this->mTitle->getPageViewLanguage();
3548 $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
3549 'class' => 'mw-content-' . $pageViewLang->getDir() ];
3550 $out->addHTML( Html::rawElement( 'div', $attribs ) );
3551 }
3552
3553 $out->addHTML( '</div>' );
3554
3555 if ( $this->formtype === 'diff' ) {
3556 try {
3557 $this->showDiff();
3558 } catch ( MWContentSerializationException $ex ) {
3559 $msg = $this->context->msg(
3560 'content-failed-to-parse',
3561 $this->contentModel,
3562 $this->contentFormat,
3563 $ex->getMessage()
3564 );
3565 $out->wrapWikiTextAsInterface( 'error', $msg->plain() );
3566 }
3567 }
3568 }
3569
3576 private function showPreview( string $text ): void {
3577 if ( $this->mArticle instanceof CategoryPage ) {
3578 $this->mArticle->openShowCategory();
3579 }
3580 # This hook seems slightly odd here, but makes things more
3581 # consistent for extensions.
3582 $out = $this->context->getOutput();
3583 $this->getHookRunner()->onOutputPageBeforeHTML( $out, $text );
3584 $out->addHTML( $text );
3585 if ( $this->mArticle instanceof CategoryPage ) {
3586 $this->mArticle->closeShowCategory();
3587 }
3588 }
3589
3597 public function showDiff() {
3598 $oldtitlemsg = 'currentrev';
3599 # if message does not exist, show diff against the preloaded default
3600 if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && !$this->mTitle->exists() ) {
3601 $oldtext = $this->mTitle->getDefaultMessageText();
3602 if ( $oldtext !== false ) {
3603 $oldtitlemsg = 'defaultmessagetext';
3604 $oldContent = $this->toEditContent( $oldtext );
3605 } else {
3606 $oldContent = null;
3607 }
3608 } else {
3609 $oldContent = $this->getCurrentContent();
3610 }
3611
3612 $textboxContent = $this->toEditContent( $this->textbox1 );
3613 if ( $this->editRevId !== null ) {
3614 $newContent = $this->page->replaceSectionAtRev(
3615 $this->section, $textboxContent, $this->sectiontitle, $this->editRevId
3616 );
3617 } else {
3618 $newContent = $this->page->replaceSectionContent(
3619 $this->section, $textboxContent, $this->sectiontitle, $this->edittime
3620 );
3621 }
3622
3623 if ( $newContent ) {
3624 $this->getHookRunner()->onEditPageGetDiffContent( $this, $newContent );
3625
3626 $user = $this->getUserForPreview();
3627 $popts = ParserOptions::newFromUserAndLang( $user,
3628 MediaWikiServices::getInstance()->getContentLanguage() );
3629 $services = MediaWikiServices::getInstance();
3630 $contentTransformer = $services->getContentTransformer();
3631 $newContent = $contentTransformer->preSaveTransform( $newContent, $this->mTitle, $user, $popts );
3632 }
3633
3634 if ( ( $oldContent && !$oldContent->isEmpty() ) || ( $newContent && !$newContent->isEmpty() ) ) {
3635 $oldtitle = $this->context->msg( $oldtitlemsg )->parse();
3636 $newtitle = $this->context->msg( 'yourtext' )->parse();
3637
3638 if ( !$oldContent ) {
3639 $oldContent = $newContent->getContentHandler()->makeEmptyContent();
3640 }
3641
3642 if ( !$newContent ) {
3643 $newContent = $oldContent->getContentHandler()->makeEmptyContent();
3644 }
3645
3646 $de = $oldContent->getContentHandler()->createDifferenceEngine( $this->context );
3647 $de->setContent( $oldContent, $newContent );
3648
3649 $difftext = $de->getDiff( $oldtitle, $newtitle );
3650 $de->showDiffStyle();
3651 } else {
3652 $difftext = '';
3653 }
3654
3655 $this->context->getOutput()->addHTML( Html::rawElement( 'div', [ 'id' => 'wikiDiff' ], $difftext ) );
3656 }
3657
3666 private function showTosSummary(): void {
3667 $msgKey = 'editpage-tos-summary';
3668 $this->getHookRunner()->onEditPageTosSummary( $this->mTitle, $msgKey );
3669 $msg = $this->context->msg( $msgKey );
3670 if ( !$msg->isDisabled() ) {
3671 $this->context->getOutput()->addHTML( Html::rawElement(
3672 'div',
3673 [ 'class' => 'mw-tos-summary' ],
3674 $msg->parseAsBlock()
3675 ) );
3676 }
3677 }
3678
3683 private function showEditTools(): void {
3684 $this->context->getOutput()->addHTML( Html::rawElement(
3685 'div',
3686 [ 'class' => 'mw-editTools' ],
3687 $this->context->msg( 'edittools' )->inContentLanguage()->parse()
3688 ) );
3689 }
3690
3700 public static function getCopyrightWarning( PageReference $page, string $format, MessageLocalizer $localizer ) {
3701 $services = MediaWikiServices::getInstance();
3702 $rightsText = $services->getMainConfig()->get( MainConfigNames::RightsText );
3703 if ( $rightsText ) {
3704 $copywarnMsg = [ 'copyrightwarning',
3705 '[[' . $localizer->msg( 'copyrightpage' )->inContentLanguage()->text() . ']]',
3706 $rightsText ];
3707 } else {
3708 $copywarnMsg = [ 'copyrightwarning2',
3709 '[[' . $localizer->msg( 'copyrightpage' )->inContentLanguage()->text() . ']]' ];
3710 }
3711 // Allow for site and per-namespace customization of contribution/copyright notice.
3712 $title = Title::newFromPageReference( $page );
3713 ( new HookRunner( $services->getHookContainer() ) )->onEditPageCopyrightWarning( $title, $copywarnMsg );
3714 if ( !$copywarnMsg ) {
3715 return '';
3716 }
3717
3718 $msg = $localizer->msg( ...$copywarnMsg )->page( $page );
3719 return Html::rawElement( 'div', [ 'id' => 'editpage-copywarn' ], $msg->$format() );
3720 }
3721
3729 public static function getPreviewLimitReport( ParserOutput $output = null ) {
3730 if ( !$output || !$output->getLimitReportData() ) {
3731 return '';
3732 }
3733
3734 $limitReport = Html::rawElement( 'div', [ 'class' => 'mw-limitReportExplanation' ],
3735 wfMessage( 'limitreport-title' )->parseAsBlock()
3736 );
3737
3738 // Show/hide animation doesn't work correctly on a table, so wrap it in a div.
3739 $limitReport .= Html::openElement( 'div', [ 'class' => 'preview-limit-report-wrapper' ] );
3740
3741 $limitReport .= Html::openElement( 'table', [
3742 'class' => 'preview-limit-report wikitable'
3743 ] ) .
3744 Html::openElement( 'tbody' );
3745
3746 $hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
3747 foreach ( $output->getLimitReportData() as $key => $value ) {
3748 if ( $hookRunner->onParserLimitReportFormat( $key, $value, $limitReport, true, true ) ) {
3749 $keyMsg = wfMessage( $key );
3750 $valueMsg = wfMessage( [ "$key-value-html", "$key-value" ] );
3751 if ( !$valueMsg->exists() ) {
3752 // This is formatted raw, not as localized number.
3753 // If you want the parameter formatted as a number,
3754 // define the `$key-value` message.
3755 $valueMsg = ( new RawMessage( '$1' ) )->params( $value );
3756 } else {
3757 // If you define the `$key-value` or `$key-value-html`
3758 // message then the argument *must* be numeric.
3759 $valueMsg = $valueMsg->numParams( $value );
3760 }
3761 if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
3762 $limitReport .= Html::openElement( 'tr' ) .
3763 Html::rawElement( 'th', [], $keyMsg->parse() ) .
3764 Html::rawElement( 'td', [], $valueMsg->parse() ) .
3765 Html::closeElement( 'tr' );
3766 }
3767 }
3768 }
3769
3770 $limitReport .= Html::closeElement( 'tbody' ) .
3771 Html::closeElement( 'table' ) .
3772 Html::closeElement( 'div' );
3773
3774 return $limitReport;
3775 }
3776
3777 protected function showStandardInputs( &$tabindex = 2 ) {
3778 $out = $this->context->getOutput();
3779 $out->addHTML( "<div class='editOptions'>\n" );
3780
3781 if ( $this->section !== 'new' ) {
3782 $this->showSummaryInput( false );
3783 $out->addHTML( $this->getSummaryPreview( false ) );
3784 }
3785
3786 // When previewing, override the selected dropdown option to select whatever was posted
3787 // (if it's a valid option) rather than the current value for watchlistExpiry.
3788 // See also above in $this->importFormData().
3789 $expiryFromRequest = null;
3790 if ( $this->preview || $this->diff || $this->isConflict ) {
3791 $expiryFromRequest = $this->getContext()->getRequest()->getText( 'wpWatchlistExpiry' );
3792 }
3793
3794 $checkboxes = $this->getCheckboxesWidget(
3795 $tabindex,
3796 [ 'minor' => $this->minoredit, 'watch' => $this->watchthis, 'wpWatchlistExpiry' => $expiryFromRequest ]
3797 );
3798 $checkboxesHTML = new OOUI\HorizontalLayout( [ 'items' => array_values( $checkboxes ) ] );
3799
3800 $out->addHTML( "<div class='editCheckboxes'>" . $checkboxesHTML . "</div>\n" );
3801
3802 // Show copyright warning.
3803 $out->addHTML( self::getCopyrightWarning( $this->mTitle, 'parse', $this->context ) );
3804 $out->addHTML( $this->editFormTextAfterWarn );
3805
3806 $out->addHTML( "<div class='editButtons'>\n" );
3807 $out->addHTML( implode( "\n", $this->getEditButtons( $tabindex ) ) . "\n" );
3808
3809 $cancel = $this->getCancelLink( $tabindex++ );
3810
3811 $edithelp = $this->getHelpLink() .
3812 $this->context->msg( 'word-separator' )->escaped() .
3813 $this->context->msg( 'newwindow' )->parse();
3814
3815 $out->addHTML( " <span class='cancelLink'>{$cancel}</span>\n" );
3816 $out->addHTML( " <span class='editHelp'>{$edithelp}</span>\n" );
3817 $out->addHTML( "</div><!-- editButtons -->\n" );
3818
3819 $this->getHookRunner()->onEditPage__showStandardInputs_options( $this, $out, $tabindex );
3820
3821 $out->addHTML( "</div><!-- editOptions -->\n" );
3822 }
3823
3828 private function showConflict(): void {
3829 $out = $this->context->getOutput();
3830 if ( $this->getHookRunner()->onEditPageBeforeConflictDiff( $this, $out ) ) {
3831 $this->incrementConflictStats();
3832
3833 $this->getEditConflictHelper()->showEditFormTextAfterFooters();
3834 }
3835 }
3836
3837 private function incrementConflictStats(): void {
3838 $this->getEditConflictHelper()->incrementConflictStats( $this->context->getUser() );
3839 }
3840
3844 private function getHelpLink(): string {
3845 $message = $this->context->msg( 'edithelppage' )->inContentLanguage()->text();
3846 $editHelpUrl = Skin::makeInternalOrExternalUrl( $message );
3847 return Html::element( 'a', [
3848 'href' => $editHelpUrl,
3849 'target' => 'helpwindow'
3850 ], $this->context->msg( 'edithelp' )->text() );
3851 }
3852
3857 private function getCancelLink( int $tabindex ): ButtonWidget {
3858 $cancelParams = [];
3859 if ( !$this->isConflict && $this->oldid > 0 ) {
3860 $cancelParams['oldid'] = $this->oldid;
3861 } elseif ( $this->getContextTitle()->isRedirect() ) {
3862 $cancelParams['redirect'] = 'no';
3863 }
3864
3865 return new OOUI\ButtonWidget( [
3866 'id' => 'mw-editform-cancel',
3867 'tabIndex' => $tabindex,
3868 'href' => $this->getContextTitle()->getLinkURL( $cancelParams ),
3869 'label' => new OOUI\HtmlSnippet( $this->context->msg( 'cancel' )->parse() ),
3870 'framed' => false,
3871 'infusable' => true,
3872 'flags' => 'destructive',
3873 ] );
3874 }
3875
3885 protected function getActionURL( Title $title ) {
3886 return $title->getLocalURL( [ 'action' => $this->action ] );
3887 }
3888
3896 private function wasDeletedSinceLastEdit(): bool {
3897 if ( $this->deletedSinceEdit !== null ) {
3898 return $this->deletedSinceEdit;
3899 }
3900
3901 $this->deletedSinceEdit = false;
3902
3903 if ( !$this->mTitle->exists() && $this->mTitle->hasDeletedEdits() ) {
3904 $this->lastDelete = $this->getLastDelete();
3905 if ( $this->lastDelete ) {
3906 $deleteTime = wfTimestamp( TS_MW, $this->lastDelete->log_timestamp );
3907 if ( $deleteTime > $this->starttime ) {
3908 $this->deletedSinceEdit = true;
3909 }
3910 }
3911 }
3912
3913 return $this->deletedSinceEdit;
3914 }
3915
3921 private function getLastDelete(): ?stdClass {
3922 $dbr = wfGetDB( DB_REPLICA );
3923 $commentQuery = $this->commentStore->getJoin( 'log_comment' );
3924 $data = $dbr->selectRow(
3925 array_merge( [ 'logging' ], $commentQuery['tables'], [ 'actor' ] ),
3926 [
3927 'log_type',
3928 'log_action',
3929 'log_timestamp',
3930 'log_namespace',
3931 'log_title',
3932 'log_params',
3933 'log_deleted',
3934 'actor_name'
3935 ] + $commentQuery['fields'],
3936 [
3937 'log_namespace' => $this->mTitle->getNamespace(),
3938 'log_title' => $this->mTitle->getDBkey(),
3939 'log_type' => 'delete',
3940 'log_action' => 'delete',
3941 ],
3942 __METHOD__,
3943 [ 'ORDER BY' => [ 'log_timestamp DESC', 'log_id DESC' ] ],
3944 [
3945 'actor' => [ 'JOIN', 'actor_id=log_actor' ],
3946 ] + $commentQuery['joins']
3947 );
3948 // Quick paranoid permission checks...
3949 if ( $data !== false ) {
3950 if ( $data->log_deleted & LogPage::DELETED_USER ) {
3951 $data->actor_name = $this->context->msg( 'rev-deleted-user' )->escaped();
3952 }
3953
3954 if ( $data->log_deleted & LogPage::DELETED_COMMENT ) {
3955 $data->log_comment_text = $this->context->msg( 'rev-deleted-comment' )->escaped();
3956 $data->log_comment_data = null;
3957 }
3958 }
3959
3960 return $data ?: null;
3961 }
3962
3968 public function getPreviewText() {
3969 $out = $this->context->getOutput();
3970 $config = $this->context->getConfig();
3971
3972 if ( $config->get( MainConfigNames::RawHtml ) && !$this->mTokenOk ) {
3973 // Could be an offsite preview attempt. This is very unsafe if
3974 // HTML is enabled, as it could be an attack.
3975 $parsedNote = '';
3976 if ( $this->textbox1 !== '' ) {
3977 // Do not put big scary notice, if previewing the empty
3978 // string, which happens when you initially edit
3979 // a category page, due to automatic preview-on-open.
3980 $parsedNote = Html::rawElement( 'div', [ 'class' => 'previewnote' ],
3981 $out->parseAsInterface(
3982 $this->context->msg( 'session_fail_preview_html' )->plain()
3983 ) );
3984 }
3985 $this->incrementEditFailureStats( 'session_loss' );
3986 return $parsedNote;
3987 }
3988
3989 $note = '';
3990
3991 try {
3992 $content = $this->toEditContent( $this->textbox1 );
3993
3994 $previewHTML = '';
3995 if ( !$this->getHookRunner()->onAlternateEditPreview(
3996 $this, $content, $previewHTML, $this->mParserOutput )
3997 ) {
3998 return $previewHTML;
3999 }
4000
4001 # provide a anchor link to the editform
4002 $continueEditing = '<span class="mw-continue-editing">' .
4003 '[[#' . self::EDITFORM_ID . '|' .
4004 $this->context->getLanguage()->getArrow() . ' ' .
4005 $this->context->msg( 'continue-editing' )->text() . ']]</span>';
4006 if ( $this->mTriedSave && !$this->mTokenOk ) {
4007 $note = $this->context->msg( 'session_fail_preview' )->plain();
4008 $this->incrementEditFailureStats( 'session_loss' );
4009 } elseif ( $this->incompleteForm ) {
4010 $note = $this->context->msg( 'edit_form_incomplete' )->plain();
4011 if ( $this->mTriedSave ) {
4012 $this->incrementEditFailureStats( 'incomplete_form' );
4013 }
4014 } else {
4015 $note = $this->context->msg( 'previewnote' )->plain() . ' ' . $continueEditing;
4016 }
4017
4018 # don't parse non-wikitext pages, show message about preview
4019 if ( $this->mTitle->isUserConfigPage() || $this->mTitle->isSiteConfigPage() ) {
4020 if ( $this->mTitle->isUserConfigPage() ) {
4021 $level = 'user';
4022 } elseif ( $this->mTitle->isSiteConfigPage() ) {
4023 $level = 'site';
4024 } else {
4025 $level = false;
4026 }
4027
4028 if ( $content->getModel() === CONTENT_MODEL_CSS ) {
4029 $format = 'css';
4030 if ( $level === 'user' && !$config->get( MainConfigNames::AllowUserCss ) ) {
4031 $format = false;
4032 }
4033 } elseif ( $content->getModel() === CONTENT_MODEL_JSON ) {
4034 $format = 'json';
4035 if ( $level === 'user' /* No comparable 'AllowUserJson' */ ) {
4036 $format = false;
4037 }
4038 } elseif ( $content->getModel() === CONTENT_MODEL_JAVASCRIPT ) {
4039 $format = 'js';
4040 if ( $level === 'user' && !$config->get( MainConfigNames::AllowUserJs ) ) {
4041 $format = false;
4042 }
4043 } else {
4044 $format = false;
4045 }
4046
4047 # Used messages to make sure grep find them:
4048 # Messages: usercsspreview, userjsonpreview, userjspreview,
4049 # sitecsspreview, sitejsonpreview, sitejspreview
4050 if ( $level && $format ) {
4051 $note = "<div id='mw-{$level}{$format}preview'>" .
4052 $this->context->msg( "{$level}{$format}preview" )->plain() .
4053 ' ' . $continueEditing . "</div>";
4054 }
4055 }
4056
4057 if ( $this->section === "new" ) {
4058 $content = $content->addSectionHeader( $this->sectiontitle );
4059 }
4060
4061 // @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
4062 $this->getHookRunner()->onEditPageGetPreviewContent( $this, $content );
4063
4064 $parserResult = $this->doPreviewParse( $content );
4065 $parserOutput = $parserResult['parserOutput'];
4066 $previewHTML = $parserResult['html'];
4067 $this->mParserOutput = $parserOutput;
4068 $out->addParserOutputMetadata( $parserOutput );
4069 if ( $out->userCanPreview() ) {
4070 $out->addContentOverride( $this->getTitle(), $content );
4071 }
4072
4073 if ( count( $parserOutput->getWarnings() ) ) {
4074 $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
4075 }
4076
4077 } catch ( MWContentSerializationException $ex ) {
4078 $m = $this->context->msg(
4079 'content-failed-to-parse',
4080 $this->contentModel,
4081 $this->contentFormat,
4082 $ex->getMessage()
4083 );
4084 $note .= "\n\n" . $m->plain(); # gets parsed down below
4085 $previewHTML = '';
4086 }
4087
4088 if ( $this->isConflict ) {
4089 $conflict = Html::warningBox(
4090 $this->context->msg( 'previewconflict' )->escaped(),
4091 'mw-previewconflict'
4092 );
4093 } else {
4094 $conflict = '';
4095 }
4096
4097 $previewhead = Html::rawElement(
4098 'div', [ 'class' => 'previewnote' ],
4099 Html::rawElement(
4100 'h2', [ 'id' => 'mw-previewheader' ],
4101 $this->context->msg( 'preview' )->escaped()
4102 ) .
4103 Html::warningBox(
4104 $out->parseAsInterface( $note )
4105 ) . $conflict
4106 );
4107
4108 $pageViewLang = $this->mTitle->getPageViewLanguage();
4109 $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
4110 'class' => 'mw-content-' . $pageViewLang->getDir() ];
4111 $previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
4112
4113 return $previewhead . $previewHTML . $this->previewTextAfterContent;
4114 }
4115
4116 private function incrementEditFailureStats( string $failureType ): void {
4117 $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
4118 $stats->increment( 'edit.failures.' . $failureType );
4119 }
4120
4125 protected function getPreviewParserOptions() {
4126 $parserOptions = $this->page->makeParserOptions( $this->context );
4127 $parserOptions->setRenderReason( 'page-preview' );
4128 $parserOptions->setIsPreview( true );
4129 $parserOptions->setIsSectionPreview( $this->section !== null && $this->section !== '' );
4130
4131 // XXX: we could call $parserOptions->setCurrentRevisionRecordCallback here to force the
4132 // current revision to be null during PST, until setupFakeRevision is called on
4133 // the ParserOptions. Currently, we rely on Parser::getRevisionRecordObject() to ignore
4134 // existing revisions in preview mode.
4135
4136 return $parserOptions;
4137 }
4138
4148 protected function doPreviewParse( Content $content ) {
4149 $user = $this->getUserForPreview();
4150 $parserOptions = $this->getPreviewParserOptions();
4151
4152 // NOTE: preSaveTransform doesn't have a fake revision to operate on.
4153 // Parser::getRevisionRecordObject() will return null in preview mode,
4154 // causing the context user to be used for {{subst:REVISIONUSER}}.
4155 // XXX: Alternatively, we could also call setupFakeRevision()
4156 // before PST with $content.
4157 $services = MediaWikiServices::getInstance();
4158 $contentTransformer = $services->getContentTransformer();
4159 $contentRenderer = $services->getContentRenderer();
4160 $pstContent = $contentTransformer->preSaveTransform( $content, $this->mTitle, $user, $parserOptions );
4161 $parserOutput = $contentRenderer->getParserOutput( $pstContent, $this->mTitle, null, $parserOptions );
4162 $out = $this->context->getOutput();
4163 $skin = $out->getSkin();
4164 $skinOptions = $skin->getOptions();
4165 return [
4166 'parserOutput' => $parserOutput,
4167 'html' => $parserOutput->getText( [
4168 'userLang' => $skin->getLanguage(),
4169 'injectTOC' => $skinOptions['toc'],
4170 'enableSectionEditLinks' => false,
4171 'includeDebugInfo' => true,
4172 ] )
4173 ];
4174 }
4175
4179 public function getTemplates() {
4180 if ( $this->preview || $this->section !== '' ) {
4181 $templates = [];
4182 if ( !isset( $this->mParserOutput ) ) {
4183 return $templates;
4184 }
4185 foreach ( $this->mParserOutput->getTemplates() as $ns => $template ) {
4186 foreach ( $template as $dbk => $_ ) {
4187 $templates[] = Title::makeTitle( $ns, $dbk );
4188 }
4189 }
4190 return $templates;
4191 } else {
4192 return $this->mTitle->getTemplateLinksFrom();
4193 }
4194 }
4195
4201 public static function getEditToolbar() {
4202 $startingToolbar = '<div id="toolbar"></div>';
4203 $toolbar = $startingToolbar;
4204
4205 $hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
4206 if ( !$hookRunner->onEditPageBeforeEditToolbar( $toolbar ) ) {
4207 return null;
4208 }
4209 // Don't add a pointless `<div>` to the page unless a hook caller populated it
4210 return ( $toolbar === $startingToolbar ) ? null : $toolbar;
4211 }
4212
4238 public function getCheckboxesDefinition( $values ) {
4239 $checkboxes = [];
4240
4241 $user = $this->context->getUser();
4242 // don't show the minor edit checkbox if it's a new page or section
4243 if ( !$this->isNew && $this->permManager->userHasRight( $user, 'minoredit' ) ) {
4244 $checkboxes['wpMinoredit'] = [
4245 'id' => 'wpMinoredit',
4246 'label-message' => 'minoredit',
4247 // Uses messages: tooltip-minoredit, accesskey-minoredit
4248 'tooltip' => 'minoredit',
4249 'label-id' => 'mw-editpage-minoredit',
4250 'legacy-name' => 'minor',
4251 'default' => $values['minor'],
4252 ];
4253 }
4254
4255 if ( $user->isNamed() ) {
4256 $checkboxes = array_merge(
4257 $checkboxes,
4258 $this->getCheckboxesDefinitionForWatchlist( $values['watch'], $values['wpWatchlistExpiry'] ?? null )
4259 );
4260 }
4261
4262 $this->getHookRunner()->onEditPageGetCheckboxesDefinition( $this, $checkboxes );
4263
4264 return $checkboxes;
4265 }
4266
4274 private function getCheckboxesDefinitionForWatchlist( $watch, $watchexpiry ): array {
4275 $fieldDefs = [
4276 'wpWatchthis' => [
4277 'id' => 'wpWatchthis',
4278 'label-message' => 'watchthis',
4279 // Uses messages: tooltip-watch, accesskey-watch
4280 'tooltip' => 'watch',
4281 'label-id' => 'mw-editpage-watch',
4282 'legacy-name' => 'watch',
4283 'default' => $watch,
4284 ]
4285 ];
4286 if ( $this->watchlistExpiryEnabled ) {
4287 $watchedItem = $this->watchedItemStore->getWatchedItem( $this->getContext()->getUser(), $this->getTitle() );
4288 $expiryOptions = WatchAction::getExpiryOptions( $this->getContext(), $watchedItem );
4289 if ( $watchexpiry && in_array( $watchexpiry, $expiryOptions['options'] ) ) {
4290 $expiryOptions['default'] = $watchexpiry;
4291 }
4292 // Reformat the options to match what DropdownInputWidget wants.
4293 $options = [];
4294 foreach ( $expiryOptions['options'] as $label => $value ) {
4295 $options[] = [ 'data' => $value, 'label' => $label ];
4296 }
4297 $fieldDefs['wpWatchlistExpiry'] = [
4298 'id' => 'wpWatchlistExpiry',
4299 'label-message' => 'confirm-watch-label',
4300 // Uses messages: tooltip-watchlist-expiry, accesskey-watchlist-expiry
4301 'tooltip' => 'watchlist-expiry',
4302 'label-id' => 'mw-editpage-watchlist-expiry',
4303 'default' => $expiryOptions['default'],
4304 'value-attr' => 'value',
4305 'class' => DropdownInputWidget::class,
4306 'options' => $options,
4307 'invisibleLabel' => true,
4308 ];
4309 }
4310 return $fieldDefs;
4311 }
4312
4323 public function getCheckboxesWidget( &$tabindex, $values ) {
4324 $checkboxes = [];
4325 $checkboxesDef = $this->getCheckboxesDefinition( $values );
4326
4327 foreach ( $checkboxesDef as $name => $options ) {
4328 $legacyName = $options['legacy-name'] ?? $name;
4329
4330 $title = null;
4331 $accesskey = null;
4332 if ( isset( $options['tooltip'] ) ) {
4333 $accesskey = $this->context->msg( "accesskey-{$options['tooltip']}" )->text();
4334 $title = Linker::titleAttrib( $options['tooltip'] );
4335 }
4336 if ( isset( $options['title-message'] ) ) {
4337 $title = $this->context->msg( $options['title-message'] )->text();
4338 }
4339 // Allow checkbox definitions to set their own class and value-attribute names.
4340 // See $this->getCheckboxesDefinition() for details.
4341 $className = $options['class'] ?? CheckboxInputWidget::class;
4342 $valueAttr = $options['value-attr'] ?? 'selected';
4343 $checkboxes[ $legacyName ] = new FieldLayout(
4344 new $className( [
4345 'tabIndex' => ++$tabindex,
4346 'accessKey' => $accesskey,
4347 'id' => $options['id'] . 'Widget',
4348 'inputId' => $options['id'],
4349 'name' => $name,
4350 $valueAttr => $options['default'],
4351 'infusable' => true,
4352 'options' => $options['options'] ?? null,
4353 ] ),
4354 [
4355 'align' => 'inline',
4356 'label' => new OOUI\HtmlSnippet( $this->context->msg( $options['label-message'] )->parse() ),
4357 'title' => $title,
4358 'id' => $options['label-id'] ?? null,
4359 'invisibleLabel' => $options['invisibleLabel'] ?? null,
4360 ]
4361 );
4362 }
4363
4364 return $checkboxes;
4365 }
4366
4372 private function getSubmitButtonLabel(): string {
4373 $labelAsPublish =
4374 $this->context->getConfig()->get( MainConfigNames::EditSubmitButtonLabelPublish );
4375
4376 // Can't use $this->isNew as that's also true if we're adding a new section to an extant page
4377 $newPage = !$this->mTitle->exists();
4378
4379 if ( $labelAsPublish ) {
4380 $buttonLabelKey = $newPage ? 'publishpage' : 'publishchanges';
4381 } else {
4382 $buttonLabelKey = $newPage ? 'savearticle' : 'savechanges';
4383 }
4384
4385 return $buttonLabelKey;
4386 }
4387
4398 public function getEditButtons( &$tabindex ) {
4399 $buttons = [];
4400
4401 $labelAsPublish =
4402 $this->context->getConfig()->get( MainConfigNames::EditSubmitButtonLabelPublish );
4403
4404 $buttonLabel = $this->context->msg( $this->getSubmitButtonLabel() )->text();
4405 $buttonTooltip = $labelAsPublish ? 'publish' : 'save';
4406
4407 $buttons['save'] = new OOUI\ButtonInputWidget( [
4408 'name' => 'wpSave',
4409 'tabIndex' => ++$tabindex,
4410 'id' => 'wpSaveWidget',
4411 'inputId' => 'wpSave',
4412 // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
4413 'useInputTag' => true,
4414 'flags' => [ 'progressive', 'primary' ],
4415 'label' => $buttonLabel,
4416 'infusable' => true,
4417 'type' => 'submit',
4418 // Messages used: tooltip-save, tooltip-publish
4419 'title' => Linker::titleAttrib( $buttonTooltip ),
4420 // Messages used: accesskey-save, accesskey-publish
4421 'accessKey' => Linker::accesskey( $buttonTooltip ),
4422 ] );
4423
4424 $buttons['preview'] = new OOUI\ButtonInputWidget( [
4425 'name' => 'wpPreview',
4426 'tabIndex' => ++$tabindex,
4427 'id' => 'wpPreviewWidget',
4428 'inputId' => 'wpPreview',
4429 // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
4430 'useInputTag' => true,
4431 'label' => $this->context->msg( 'showpreview' )->text(),
4432 'infusable' => true,
4433 'type' => 'submit',
4434 // Allow previewing even when the form is in invalid state (T343585)
4435 'formNoValidate' => true,
4436 // Message used: tooltip-preview
4437 'title' => Linker::titleAttrib( 'preview' ),
4438 // Message used: accesskey-preview
4439 'accessKey' => Linker::accesskey( 'preview' ),
4440 ] );
4441
4442 $buttons['diff'] = new OOUI\ButtonInputWidget( [
4443 'name' => 'wpDiff',
4444 'tabIndex' => ++$tabindex,
4445 'id' => 'wpDiffWidget',
4446 'inputId' => 'wpDiff',
4447 // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
4448 'useInputTag' => true,
4449 'label' => $this->context->msg( 'showdiff' )->text(),
4450 'infusable' => true,
4451 'type' => 'submit',
4452 // Allow previewing even when the form is in invalid state (T343585)
4453 'formNoValidate' => true,
4454 // Message used: tooltip-diff
4455 'title' => Linker::titleAttrib( 'diff' ),
4456 // Message used: accesskey-diff
4457 'accessKey' => Linker::accesskey( 'diff' ),
4458 ] );
4459
4460 $this->getHookRunner()->onEditPageBeforeEditButtons( $this, $buttons, $tabindex );
4461
4462 return $buttons;
4463 }
4464
4469 private function noSuchSectionPage(): void {
4470 $out = $this->context->getOutput();
4471 $out->prepareErrorPage();
4472 $out->setPageTitleMsg( $this->context->msg( 'nosuchsectiontitle' ) );
4473
4474 $res = $this->context->msg( 'nosuchsectiontext', $this->section )->parseAsBlock();
4475
4476 $this->getHookRunner()->onEditPageNoSuchSection( $this, $res );
4477 $out->addHTML( $res );
4478
4479 $out->returnToMain( false, $this->mTitle );
4480 }
4481
4487 public function spamPageWithContent( $match = false ) {
4488 $this->textbox2 = $this->textbox1;
4489
4490 $out = $this->context->getOutput();
4491 $out->prepareErrorPage();
4492 $out->setPageTitleMsg( $this->context->msg( 'spamprotectiontitle' ) );
4493
4494 $spamText = $this->context->msg( 'spamprotectiontext' )->parseAsBlock();
4495
4496 if ( $match ) {
4497 if ( is_array( $match ) ) {
4498 $matchText = $this->context->getLanguage()->listToText( array_map( 'wfEscapeWikiText', $match ) );
4499 } else {
4500 $matchText = wfEscapeWikiText( $match );
4501 }
4502
4503 $spamText .= $this->context->msg( 'spamprotectionmatch' )
4504 ->params( $matchText )
4505 ->parseAsBlock();
4506 }
4507 $out->addHTML( Html::rawElement(
4508 'div',
4509 [ 'id' => 'spamprotected' ],
4510 $spamText
4511 ) );
4512
4513 $out->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
4514 $this->showDiff();
4515
4516 $out->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
4517 $this->showTextbox( $this->textbox2, 'wpTextbox2', [ 'tabindex' => 6, 'readonly' ] );
4518
4519 $out->addReturnTo( $this->getContextTitle(), [ 'action' => 'edit' ] );
4520 }
4521
4522 private function addLongPageWarningHeader(): void {
4523 if ( $this->contentLength === false ) {
4524 $this->contentLength = strlen( $this->textbox1 );
4525 }
4526
4527 $out = $this->context->getOutput();
4528 $maxArticleSize = $this->context->getConfig()->get( MainConfigNames::MaxArticleSize );
4529 if ( $this->tooBig || $this->contentLength > $maxArticleSize * 1024 ) {
4530 $lang = $this->context->getLanguage();
4531 $out->wrapWikiMsg( "<div class='error' id='mw-edit-longpageerror'>\n$1\n</div>",
4532 [
4533 'longpageerror',
4534 $lang->formatNum( round( $this->contentLength / 1024, 3 ) ),
4535 $lang->formatNum( $maxArticleSize )
4536 ]
4537 );
4538 } else {
4539 $longPageHint = $this->context->msg( 'longpage-hint' );
4540 if ( !$longPageHint->isDisabled() ) {
4541 $msgText = trim( $longPageHint->sizeParams( $this->contentLength )
4542 ->params( $this->contentLength ) // Keep this unformatted for math inside message
4543 ->text() );
4544 if ( $msgText !== '' && $msgText !== '-' ) {
4545 $out->addWikiTextAsInterface( "<div id='mw-edit-longpage-hint'>\n$msgText\n</div>" );
4546 }
4547 }
4548 }
4549 }
4550
4551 private function addExplainConflictHeader(): void {
4552 $this->context->getOutput()->addHTML(
4553 $this->getEditConflictHelper()->getExplainHeader()
4554 );
4555 }
4556
4567 private function guessSectionName( $text ): string {
4568 // Detect Microsoft browsers
4569 $userAgent = $this->context->getRequest()->getHeader( 'User-Agent' );
4570 $parser = MediaWikiServices::getInstance()->getParser();
4571 if ( $userAgent && preg_match( '/MSIE|Edge/', $userAgent ) ) {
4572 // ...and redirect them to legacy encoding, if available
4573 return $parser->guessLegacySectionNameFromWikiText( $text );
4574 }
4575 // Meanwhile, real browsers get real anchors
4576 $name = $parser->guessSectionNameFromWikiText( $text );
4577 // With one little caveat: per T216029, fragments in HTTP redirects need to be urlencoded,
4578 // otherwise Chrome double-escapes the rest of the URL.
4579 return '#' . urlencode( mb_substr( $name, 1 ) );
4580 }
4581
4588 public function setEditConflictHelperFactory( callable $factory ) {
4589 $this->editConflictHelperFactory = $factory;
4590 $this->editConflictHelper = null;
4591 }
4592
4596 private function getEditConflictHelper(): TextConflictHelper {
4597 if ( !$this->editConflictHelper ) {
4598 $this->editConflictHelper = call_user_func(
4599 $this->editConflictHelperFactory,
4600 $this->getSubmitButtonLabel()
4601 );
4602 }
4603
4604 return $this->editConflictHelper;
4605 }
4606
4612 private function newTextConflictHelper( string $submitButtonLabel ): TextConflictHelper {
4613 return new TextConflictHelper(
4614 $this->getTitle(),
4615 $this->getContext()->getOutput(),
4616 MediaWikiServices::getInstance()->getStatsdDataFactory(),
4617 $submitButtonLabel,
4618 MediaWikiServices::getInstance()->getContentHandlerFactory()
4619 );
4620 }
4621}
4622
4626class_alias( EditPage::class, 'EditPage' );
getUser()
getAuthority()
const EDIT_FORCE_BOT
Definition Defines.php:130
const EDIT_UPDATE
Definition Defines.php:127
const NS_USER
Definition Defines.php:66
const CONTENT_MODEL_CSS
Definition Defines.php:211
const NS_MEDIAWIKI
Definition Defines.php:72
const CONTENT_MODEL_JSON
Definition Defines.php:213
const NS_USER_TALK
Definition Defines.php:67
const EDIT_MINOR
Definition Defines.php:128
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:210
const EDIT_AUTOSUMMARY
Definition Defines.php:132
const EDIT_NEW
Definition Defines.php:126
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfTimestampNow()
Convenience function; returns MediaWiki timestamp for the present time.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
wfArrayToCgi( $array1, $array2=null, $prefix='')
This function takes one or two arrays as input, and returns a CGI-style string, e....
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
wfEscapeWikiText( $text)
Escapes the given text so that it may be output using addWikiText() without any linking,...
Title null $mTitle
getContext()
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:88
Legacy class representing an editable page and handling UI for some page actions.
Definition Article.php:61
getContext()
Gets the context this Article is executed in.
Definition Article.php:1967
getTitle()
Get the title object of the article.
Definition Article.php:254
getPage()
Get the WikiPage object of this instance.
Definition Article.php:264
Special handling for category description pages.
A content handler knows how do deal with a specific type of content on a wiki page.
Defer callable updates to run later in the PHP process.
An IContextSource implementation which will inherit context from another source but allow individual ...
An error page which can definitely be safely rendered using the OutputPage.
Class to simplify the use of log pages.
Definition LogPage.php:43
Exception representing a failure to serialize or unserialize a content object.
MediaWiki exception.
Exception thrown when an unregistered content model is requested.
Class for creating new log entries and inserting them into the database.
setPerformer(UserIdentity $performer)
Set the user that performed the action being logged.
A service class for getting formatted information about a block.
Value object for a comment stored by CommentStore.
Handle database storage of comments such as edit summaries and log reasons.
Make sure user doesn't accidentally recreate a page deleted after they started editing.
For an edit to an existing page but not with a new section, do not allow the user to post with a summ...
Verify user permissions if changing content model: Must have editcontentmodel rights Must be able to ...
Verify be able to create the page in question if it is a new page.
Don't save a new page if it's blank or if it's a MediaWiki: message with content equivalent to defaul...
Constraints reflect possible errors that need to be checked.
Back end to process the edit constraints.
Verify user permissions: Must have edit rights.
Verify user permissions: If creating a redirect in the file namespace, must have upload rights.
Do not allow the user to post an empty comment (only used for new section)
For a new section, do not allow the user to post with an empty subject (section title) unless they ch...
Verify the page isn't larger than the maximum.
Verify the page does not redirect to itself unless.
Verify summary and text do not match spam regexes.
Verify user permissions: Must not be blocked from the page.
The HTML user interface for page editing.
Definition EditPage.php:146
showEditForm()
Send the edit form and related headers to OutputPage.
internalAttemptSave(&$result, $markAsBot=false, $markAsMinor=false)
Attempt submission (no UI)
int $oldid
Revision ID the edit is based on, or 0 if it's the current revision.
Definition EditPage.php:365
setEditConflictHelperFactory(callable $factory)
Set a factory function to create an EditConflictHelper.
__construct(Article $article)
Definition EditPage.php:487
doPreviewParse(Content $content)
Parse the page for a preview.
importFormData(&$request)
This function collects the form data and uses it to populate various member variables.
edit()
This is the function that gets called for "action=edit".
Definition EditPage.php:607
toEditContent( $text)
Turns the given text into a Content object by unserializing it.
string null $starttime
Timestamp from the first time the edit form was rendered.
Definition EditPage.php:358
makeTemplatesOnThisPageList(array $templates)
Wrapper around TemplatesOnThisPageFormatter to make a "templates on this page" list.
showDiff()
Get a diff between the current contents of the edit box and the version of the page we're editing fro...
getPreviewText()
Get the rendered text for previewing.
getContentObject( $def_content=null)
spamPageWithContent( $match=false)
Show "your edit contains spam" page with your diff and text.
string $textbox1
Page content input field.
Definition EditPage.php:313
getCheckboxesWidget(&$tabindex, $values)
Returns an array of fields for the edit form, including 'minor' and 'watch' checkboxes and any other ...
static getCopyrightWarning(PageReference $page, string $format, MessageLocalizer $localizer)
Get the copyright warning.
attemptSave(&$resultDetails=false)
Attempt submission.
static getEditToolbar()
Allow extensions to provide a toolbar.
showStandardInputs(&$tabindex=2)
string null $edittime
Timestamp of the latest revision of the page when editing was initiated on the client.
Definition EditPage.php:331
string $editFormPageTop
Before even the preview.
Definition EditPage.php:394
getActionURL(Title $title)
Returns the URL to use in the form's action attribute.
const UNICODE_CHECK
Used for Unicode support checks.
Definition EditPage.php:153
static getPreviewLimitReport(ParserOutput $output=null)
Get the Limit report for page previews.
getCheckboxesDefinition( $values)
Return an array of field definitions.
getEditButtons(&$tabindex)
Returns an array of html code of the following buttons: save, diff and preview.
importContentFormData(&$request)
Subpage overridable method for extracting the page content data from the posted form to be placed in ...
const EDITFORM_ID
HTML id and name for the beginning of the edit form.
Definition EditPage.php:158
const POST_EDIT_COOKIE_DURATION
Duration of PostEdit cookie, in seconds.
Definition EditPage.php:182
bool $firsttime
True the first time the edit form is rendered, false after re-rendering with diff,...
Definition EditPage.php:225
showContentForm()
Subpage overridable method for printing the form for page content editing By default this simply outp...
showTextbox( $text, $name, $customAttribs=[])
previewOnOpen()
Should we show a preview when the edit form is first shown?
getCurrentContent()
Get the current content of the page.
setApiEditOverride( $enableOverride)
Allow editing of content that supports API direct editing, but not general direct editing.
Definition EditPage.php:592
const POST_EDIT_COOKIE_KEY_PREFIX
Prefix of key for cookie used to pass post-edit state.
Definition EditPage.php:164
getPreviewParserOptions()
Get parser options for a preview.
bool $isConflict
Whether an edit conflict needs to be resolved.
Definition EditPage.php:210
maybeActivateTempUserCreate( $doAcquire)
Check the configuration and current user and enable automatic temporary user creation if possible.
Definition EditPage.php:784
getExpectedParentRevision()
Returns the RevisionRecord corresponding to the revision that was current at the time editing was ini...
Handles formatting for the "templates used on this page" lists.
Helper for displaying edit conflicts in text content models to users.
Helps EditPage build textboxes.
This class provides an implementation of the core hook interfaces, forwarding hook calls to HookConta...
This class is a collection of static functions that serve two purposes:
Definition Html.php:57
Variant of the Message class.
Class that generates HTML for internal links.
Some internal bits split of from Skin.php.
Definition Linker.php:65
Create PSR-3 logger objects.
A class containing constants representing the names of configuration variables.
const WatchlistExpiry
Name constant for the WatchlistExpiry setting, for use with Config::get()
Service locator for MediaWiki core services.
static getInstance()
Returns the global default instance of the top level service locator.
Service for creating WikiPage objects.
A service class for checking permissions To obtain an instance, use MediaWikiServices::getInstance()-...
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form stripping il...
wasPosted()
Returns true if the present request was reached by a POST operation, false otherwise (GET,...
getVal( $name, $default=null)
Fetch a text string and partially normalize it.
getText( $name, $default='')
Fetch a text string and return it in normalized form.
getBool( $name, $default=false)
Fetch a boolean value from the input or return $default if not set.
getIntOrNull( $name)
Fetch an integer value from the input or return null if empty.
getIP()
Work out the IP address based on various globals For trusted proxies, use the XFF client IP (first of...
getArray( $name, $default=null)
Fetch an array from the input or return $default if it's not set.
getInt( $name, $default=0)
Fetch an integer value from the input or return $default if not set.
getPostValues()
Get the values passed via POST.
getCheck( $name)
Return true if the named value is set in the input, whatever that value is (even "0").
Page revision base class.
getSlot( $role, $audience=self::FOR_PUBLIC, Authority $performer=null)
Returns meta-data for the given slot.
getContent( $role, $audience=self::FOR_PUBLIC, Authority $performer=null)
Returns the Content of the given slot of this revision.
isDeleted( $field)
MCR migration note: this replaced Revision::isDeleted.
getId( $wikiId=self::LOCAL)
Get revision ID.
A RevisionRecord representing an existing revision persisted in the revision table.
Service for looking up page revisions.
Value object representing a content slot associated with a page revision.
Generic operation result class Has warning/error list, boolean status and arbitrary value.
Definition Status.php:58
Object for storing information about the effects of an edit.
Controller-like object for creating and updating pages by creating new revisions.
getStatus()
The Status object indicating whether saveRevision() was successful.
updateAuthor(UserIdentity $author)
After creation of the user during the save process, update the stored UserIdentity.
prepareUpdate(int $flags=0)
Prepare the update.
setOriginalRevisionId( $originalRevId)
Sets the ID of an earlier revision that is being repeated or restored by this update.
addTags(array $tags)
Sets tags to apply to this update.
setRcPatrolStatus( $status)
Sets the "patrolled" status of the edit.
isChange()
Whether the prepared edit is a change compared to the previous revision.
preventChange()
Disable new revision creation, throwing an exception if it is attempted.
setContent( $role, Content $content)
Set the new content for the given slot role.
Represents a title within MediaWiki.
Definition Title.php:76
getLocalURL( $query='')
Get a URL with no fragment or server name (relative URL) from a Title object.
Definition Title.php:2198
Class to parse and build external user names.
Status object with strongly typed value, for TempUserManager::createUser()
Service for temporary user creation.
Creates User objects.
UserNameUtils service.
Provides access to user options.
internal since 1.36
Definition User.php:98
The Message class deals with fetching and processing of interface message into a variety of formats.
Definition Message.php:144
static plaintextParam( $plaintext)
Definition Message.php:1275
Set options of the Parser.
static newFromUserAndLang(UserIdentity $user, Language $lang)
Get a ParserOptions object from a given user and language.
Rendered output of a wiki page, as parsed from wikitext.
Show an error when a user tries to do something they do not have the necessary permissions for.
Show an error when the wiki is locked/read-only and the user tries to do something that requires writ...
Utility class for creating new RC entries.
The base class for all skins.
Definition Skin.php:60
static makeInternalOrExternalUrl( $name)
If url string starts with http, consider as external URL, else internal.
Definition Skin.php:1167
Content object implementation for representing flat text.
Show an error when the user hits a rate limit.
Show an error when the user tries to do something whilst blocked.
Page addition to a user's watchlist.
Base representation for an editable wiki page.
Definition WikiPage.php:77
Value object representing a message for i18n.
Type definition for expiry timestamps.
Definition ExpiryDef.php:17
Module of static functions for generating XML.
Definition Xml.php:33
static tags( $element, $attribs, $contents)
Same as Xml::element(), but does not escape contents.
Definition Xml.php:141
return[0=> 'ـ', 1=> ' ', 2=> '`', 3=> '´', 4=> '˜', 5=> '^', 6=> '¯', 7=> '‾', 8=> '˘', 9=> '˙', 10=> '¨', 11=> '˚', 12=> '˝', 13=> '᾽', 14=> '῝', 15=> '¸', 16=> '˛', 17=> '_', 18=> '‗', 19=> '῀', 20=> '﮲', 21=> '﮳', 22=> '﮴', 23=> '﮵', 24=> '﮶', 25=> '﮷', 26=> '﮸', 27=> '﮹', 28=> '﮺', 29=> '﮻', 30=> '﮼', 31=> '﮽', 32=> '﮾', 33=> '﮿', 34=> '﯀', 35=> '﯁', 36=> '゛', 37=> '゜', 38=> '-', 39=> '֊', 40=> '᐀', 41=> '᭠', 42=> '᠆', 43=> '᠇', 44=> '‐', 45=> '‒', 46=> '–', 47=> '—', 48=> '―', 49=> '⁓', 50=> '⸗', 51=> '゠', 52=> '・', 53=> ',', 54=> '՝', 55=> '،', 56=> '؍', 57=> '٫', 58=> '٬', 59=> '߸', 60=> '᠂', 61=> '᠈', 62=> '꓾', 63=> '꘍', 64=> '꛵', 65=> '︑', 66=> ';', 67=> '؛', 68=> '⁏', 69=> '꛶', 70=> ':', 71=> '։', 72=> '؞', 73=> '܃', 74=> '܄', 75=> '܅', 76=> '܆', 77=> '܇', 78=> '܈', 79=> '࠰', 80=> '࠱', 81=> '࠲', 82=> '࠳', 83=> '࠴', 84=> '࠵', 85=> '࠶', 86=> '࠷', 87=> '࠸', 88=> '࠹', 89=> '࠺', 90=> '࠻', 91=> '࠼', 92=> '࠽', 93=> '࠾', 94=> '፡', 95=> '፣', 96=> '፤', 97=> '፥', 98=> '፦', 99=> '᠄', 100=> '᠅', 101=> '༔', 102=> '៖', 103=> '᭝', 104=> '꧇', 105=> '᛫', 106=> '᛬', 107=> '᛭', 108=> '꛴', 109=> '!', 110=> '¡', 111=> '՜', 112=> '߹', 113=> '᥄', 114=> '?', 115=> '¿', 116=> '⸮', 117=> '՞', 118=> '؟', 119=> '܉', 120=> '፧', 121=> '᥅', 122=> '⳺', 123=> '⳻', 124=> '꘏', 125=> '꛷', 126=> '‽', 127=> '⸘', 128=> '.', 129=> '᠁', 130=> '۔', 131=> '܁', 132=> '܂', 133=> '።', 134=> '᠃', 135=> '᠉', 136=> '᙮', 137=> '᭜', 138=> '⳹', 139=> '⳾', 140=> '⸰', 141=> '꓿', 142=> '꘎', 143=> '꛳', 144=> '︒', 145=> '·', 146=> '⸱', 147=> '।', 148=> '॥', 149=> '꣎', 150=> '꣏', 151=> '᰻', 152=> '᰼', 153=> '꡶', 154=> '꡷', 155=> '᜵', 156=> '᜶', 157=> '꤯', 158=> '၊', 159=> '။', 160=> '។', 161=> '៕', 162=> '᪨', 163=> '᪩', 164=> '᪪', 165=> '᪫', 166=> '᭞', 167=> '᭟', 168=> '꧈', 169=> '꧉', 170=> '꩝', 171=> '꩞', 172=> '꩟', 173=> '꯫', 174=> '𐩖', 175=> '𐩗', 176=> '𑁇', 177=> '𑁈', 178=> '𑃀', 179=> '𑃁', 180=> '᱾', 181=> '᱿', 182=> '܀', 183=> '߷', 184=> '჻', 185=> '፠', 186=> '፨', 187=> '᨞', 188=> '᨟', 189=> '᭚', 190=> '᭛', 191=> '꧁', 192=> '꧂', 193=> '꧃', 194=> '꧄', 195=> '꧅', 196=> '꧆', 197=> '꧊', 198=> '꧋', 199=> '꧌', 200=> '꧍', 201=> '꛲', 202=> '꥟', 203=> '𐡗', 204=> '𐬺', 205=> '𐬻', 206=> '𐬼', 207=> '𐬽', 208=> '𐬾', 209=> '𐬿', 210=> '𑂾', 211=> '𑂿', 212=> '⁕', 213=> '⁖', 214=> '⁘', 215=> '⁙', 216=> '⁚', 217=> '⁛', 218=> '⁜', 219=> '⁝', 220=> '⁞', 221=> '⸪', 222=> '⸫', 223=> '⸬', 224=> '⸭', 225=> '⳼', 226=> '⳿', 227=> '⸙', 228=> '𐤿', 229=> '𐄀', 230=> '𐄁', 231=> '𐄂', 232=> '𐎟', 233=> '𐏐', 234=> '𐤟', 235=> '𒑰', 236=> '𒑱', 237=> '𒑲', 238=> '𒑳', 239=> '\'', 240=> '‘', 241=> '’', 242=> '‚', 243=> '‛', 244=> '‹', 245=> '›', 246=> '"', 247 => '“', 248 => '”', 249 => '„', 250 => '‟', 251 => '«', 252 => '»', 253 => '(', 254 => ')', 255 => '[', 256 => ']', 257 => '{', 258 => '}', 259 => '༺', 260 => '༻', 261 => '༼', 262 => '༽', 263 => '᚛', 264 => '᚜', 265 => '⁅', 266 => '⁆', 267 => '⧼', 268 => '⧽', 269 => '⦃', 270 => '⦄', 271 => '⦅', 272 => '⦆', 273 => '⦇', 274 => '⦈', 275 => '⦉', 276 => '⦊', 277 => '⦋', 278 => '⦌', 279 => '⦍', 280 => '⦎', 281 => '⦏', 282 => '⦐', 283 => '⦑', 284 => '⦒', 285 => '⦓', 286 => '⦔', 287 => '⦕', 288 => '⦖', 289 => '⦗', 290 => '⦘', 291 => '⟬', 292 => '⟭', 293 => '⟮', 294 => '⟯', 295 => '⸂', 296 => '⸃', 297 => '⸄', 298 => '⸅', 299 => '⸉', 300 => '⸊', 301 => '⸌', 302 => '⸍', 303 => '⸜', 304 => '⸝', 305 => '⸠', 306 => '⸡', 307 => '⸢', 308 => '⸣', 309 => '⸤', 310 => '⸥', 311 => '⸦', 312 => '⸧', 313 => '⸨', 314 => '⸩', 315 => '〈', 316 => '〉', 317 => '「', 318 => '」', 319 => '﹝', 320 => '﹞', 321 => '︗', 322 => '︘', 323 => '﴾', 324 => '﴿', 325 => '§', 326 => '¶', 327 => '⁋', 328 => '©', 329 => '®', 330 => '@', 331 => '*', 332 => '⁎', 333 => '⁑', 334 => '٭', 335 => '꙳', 336 => '/', 337 => '⁄', 338 => '\\', 339 => '&', 340 => '⅋', 341 => '⁊', 342 => '#', 343 => '%', 344 => '٪', 345 => '‰', 346 => '؉', 347 => '‱', 348 => '؊', 349 => '⁒', 350 => '†', 351 => '‡', 352 => '•', 353 => '‣', 354 => '‧', 355 => '⁃', 356 => '⁌', 357 => '⁍', 358 => '′', 359 => '‵', 360 => '‸', 361 => '※', 362 => '‿', 363 => '⁔', 364 => '⁀', 365 => '⁐', 366 => '⁁', 367 => '⁂', 368 => '⸀', 369 => '⸁', 370 => '⸆', 371 => '⸇', 372 => '⸈', 373 => '⸋', 374 => '⸎', 375 => '⸏', 376 => '⸐', 377 => '⸑', 378 => '⸒', 379 => '⸓', 380 => '⸔', 381 => '⸕', 382 => '⸖', 383 => '⸚', 384 => '⸛', 385 => '⸞', 386 => '⸟', 387 => '꙾', 388 => '՚', 389 => '՛', 390 => '՟', 391 => '־', 392 => '׀', 393 => '׃', 394 => '׆', 395 => '׳', 396 => '״', 397 => '܊', 398 => '܋', 399 => '܌', 400 => '܍', 401 => '࡞', 402 => '᠀', 403 => '॰', 404 => '꣸', 405 => '꣹', 406 => '꣺', 407 => '෴', 408 => '๚', 409 => '๛', 410 => '꫞', 411 => '꫟', 412 => '༄', 413 => '༅', 414 => '༆', 415 => '༇', 416 => '༈', 417 => '༉', 418 => '༊', 419 => '࿐', 420 => '࿑', 421 => '་', 422 => '།', 423 => '༎', 424 => '༏', 425 => '༐', 426 => '༑', 427 => '༒', 428 => '྅', 429 => '࿒', 430 => '࿓', 431 => '࿔', 432 => '࿙', 433 => '࿚', 434 => '᰽', 435 => '᰾', 436 => '᰿', 437 => '᥀', 438 => '၌', 439 => '၍', 440 => '၎', 441 => '၏', 442 => '႞', 443 => '႟', 444 => '꩷', 445 => '꩸', 446 => '꩹', 447 => 'ៗ', 448 => '៘', 449 => '៙', 450 => '៚', 451 => '᪠', 452 => '᪡', 453 => '᪢', 454 => '᪣', 455 => '᪤', 456 => '᪥', 457 => '᪦', 458 => '᪬', 459 => '᪭', 460 => '᙭', 461 => '⵰', 462 => '꡴', 463 => '꡵', 464 => '᯼', 465 => '᯽', 466 => '᯾', 467 => '᯿', 468 => '꤮', 469 => '꧞', 470 => '꧟', 471 => '꩜', 472 => '𑁉', 473 => '𑁊', 474 => '𑁋', 475 => '𑁌', 476 => '𑁍', 477 => '𐩐', 478 => '𐩑', 479 => '𐩒', 480 => '𐩓', 481 => '𐩔', 482 => '𐩕', 483 => '𐩘', 484 => '𐬹', 485 => '𑂻', 486 => '𑂼', 487 => 'ʹ', 488 => '͵', 489 => 'ʺ', 490 => '˂', 491 => '˃', 492 => '˄', 493 => '˅', 494 => 'ˆ', 495 => 'ˇ', 496 => 'ˈ', 497 => 'ˉ', 498 => 'ˊ', 499 => 'ˋ', 500 => 'ˌ', 501 => 'ˍ', 502 => 'ˎ', 503 => 'ˏ', 504 => '˒', 505 => '˓', 506 => '˔', 507 => '˕', 508 => '˖', 509 => '˗', 510 => '˞', 511 => '˟', 512 => '˥', 513 => '˦', 514 => '˧', 515 => '˨', 516 => '˩', 517 => '˪', 518 => '˫', 519 => 'ˬ', 520 => '˭', 521 => '˯', 522 => '˰', 523 => '˱', 524 => '˲', 525 => '˳', 526 => '˴', 527 => '˵', 528 => '˶', 529 => '˷', 530 => '˸', 531 => '˹', 532 => '˺', 533 => '˻', 534 => '˼', 535 => '˽', 536 => '˾', 537 => '˿', 538 => '᎐', 539 => '᎑', 540 => '᎒', 541 => '᎓', 542 => '᎔', 543 => '᎕', 544 => '᎖', 545 => '᎗', 546 => '᎘', 547 => '᎙', 548 => '꜀', 549 => '꜁', 550 => '꜂', 551 => '꜃', 552 => '꜄', 553 => '꜅', 554 => '꜆', 555 => '꜇', 556 => '꜈', 557 => '꜉', 558 => '꜊', 559 => '꜋', 560 => '꜌', 561 => '꜍', 562 => '꜎', 563 => '꜏', 564 => '꜐', 565 => '꜑', 566 => '꜒', 567 => '꜓', 568 => '꜔', 569 => '꜕', 570 => '꜖', 571 => 'ꜗ', 572 => 'ꜘ', 573 => 'ꜙ', 574 => 'ꜚ', 575 => 'ꜛ', 576 => 'ꜜ', 577 => 'ꜝ', 578 => 'ꜞ', 579 => 'ꜟ', 580 => '꜠', 581 => '꜡', 582 => 'ꞈ', 583 => '꞉', 584 => '꞊', 585 => '°', 586 => '҂', 587 => '؈', 588 => '؎', 589 => '؏', 590 => '۞', 591 => '۩', 592 => '﷽', 593 => '߶', 594 => '৺', 595 => '୰', 596 => '௳', 597 => '௴', 598 => '௵', 599 => '௶', 600 => '௷', 601 => '௸', 602 => '௺', 603 => '౿', 604 => '൹', 605 => '꠨', 606 => '꠩', 607 => '꠪', 608 => '꠫', 609 => '꠶', 610 => '꠷', 611 => '꠹', 612 => '๏', 613 => '༁', 614 => '༂', 615 => '༃', 616 => '༓', 617 => '༕', 618 => '༖', 619 => '༗', 620 => '༚', 621 => '༛', 622 => '༜', 623 => '༝', 624 => '༞', 625 => '༟', 626 => '༴', 627 => '༶', 628 => '༸', 629 => '྾', 630 => '྿', 631 => '࿀', 632 => '࿁', 633 => '࿂', 634 => '࿃', 635 => '࿄', 636 => '࿅', 637 => '࿇', 638 => '࿈', 639 => '࿉', 640 => '࿊', 641 => '࿋', 642 => '࿌', 643 => '࿎', 644 => '࿏', 645 => '࿕', 646 => '࿖', 647 => '࿗', 648 => '࿘', 649 => '᧠', 650 => '᧡', 651 => '᧢', 652 => '᧣', 653 => '᧤', 654 => '᧥', 655 => '᧦', 656 => '᧧', 657 => '᧨', 658 => '᧩', 659 => '᧪', 660 => '᧫', 661 => '᧬', 662 => '᧭', 663 => '᧮', 664 => '᧯', 665 => '᧰', 666 => '᧱', 667 => '᧲', 668 => '᧳', 669 => '᧴', 670 => '᧵', 671 => '᧶', 672 => '᧷', 673 => '᧸', 674 => '᧹', 675 => '᧺', 676 => '᧻', 677 => '᧼', 678 => '᧽', 679 => '᧾', 680 => '᧿', 681 => '᭡', 682 => '᭢', 683 => '᭣', 684 => '᭤', 685 => '᭥', 686 => '᭦', 687 => '᭧', 688 => '᭨', 689 => '᭩', 690 => '᭪', 691 => '᭴', 692 => '᭵', 693 => '᭶', 694 => '᭷', 695 => '᭸', 696 => '᭹', 697 => '᭺', 698 => '᭻', 699 => '᭼', 700 => '℄', 701 => '℈', 702 => '℔', 703 => '℗', 704 => '℘', 705 => '℞', 706 => '℟', 707 => '℣', 708 => '℥', 709 => '℧', 710 => '℩', 711 => '℮', 712 => '℺', 713 => '⅁', 714 => '⅂', 715 => '⅃', 716 => '⅄', 717 => '⅊', 718 => '⅌', 719 => '⅍', 720 => '⅏', 721 => '←', 722 => '→', 723 => '↑', 724 => '↓', 725 => '↔', 726 => '↕', 727 => '↖', 728 => '↗', 729 => '↘', 730 => '↙', 731 => '↜', 732 => '↝', 733 => '↞', 734 => '↟', 735 => '↠', 736 => '↡', 737 => '↢', 738 => '↣', 739 => '↤', 740 => '↥', 741 => '↦', 742 => '↧', 743 => '↨', 744 => '↩', 745 => '↪', 746 => '↫', 747 => '↬', 748 => '↭', 749 => '↯', 750 => '↰', 751 => '↱', 752 => '↲', 753 => '↳', 754 => '↴', 755 => '↵', 756 => '↶', 757 => '↷', 758 => '↸', 759 => '↹', 760 => '↺', 761 => '↻', 762 => '↼', 763 => '↽', 764 => '↾', 765 => '↿', 766 => '⇀', 767 => '⇁', 768 => '⇂', 769 => '⇃', 770 => '⇄', 771 => '⇅', 772 => '⇆', 773 => '⇇', 774 => '⇈', 775 => '⇉', 776 => '⇊', 777 => '⇋', 778 => '⇌', 779 => '⇐', 780 => '⇑', 781 => '⇒', 782 => '⇓', 783 => '⇔', 784 => '⇕', 785 => '⇖', 786 => '⇗', 787 => '⇘', 788 => '⇙', 789 => '⇚', 790 => '⇛', 791 => '⇜', 792 => '⇝', 793 => '⇞', 794 => '⇟', 795 => '⇠', 796 => '⇡', 797 => '⇢', 798 => '⇣', 799 => '⇤', 800 => '⇥', 801 => '⇦', 802 => '⇧', 803 => '⇨', 804 => '⇩', 805 => '⇪', 806 => '⇫', 807 => '⇬', 808 => '⇭', 809 => '⇮', 810 => '⇯', 811 => '⇰', 812 => '⇱', 813 => '⇲', 814 => '⇳', 815 => '⇴', 816 => '⇵', 817 => '⇶', 818 => '⇷', 819 => '⇸', 820 => '⇹', 821 => '⇺', 822 => '⇻', 823 => '⇼', 824 => '⇽', 825 => '⇾', 826 => '⇿', 827 => '∀', 828 => '∁', 829 => '∂', 830 => '∃', 831 => '∅', 832 => '∆', 833 => '∇', 834 => '∈', 835 => '∊', 836 => '∋', 837 => '∍', 838 => '϶', 839 => '∎', 840 => '∏', 841 => '∐', 842 => '∑', 843 => '+', 844 => '±', 845 => '÷', 846 => '×', 847 => '<', 848 => '=', 849 => '>', 850 => '¬', 851 => '|', 852 => '¦', 853 => '‖', 854 => '~', 855 => '−', 856 => '∓', 857 => '∔', 858 => '∕', 859 => '∖', 860 => '∗', 861 => '∘', 862 => '∙', 863 => '√', 864 => '∛', 865 => '؆', 866 => '∜', 867 => '؇', 868 => '∝', 869 => '∞', 870 => '∟', 871 => '∠', 872 => '∡', 873 => '∢', 874 => '∣', 875 => '∥', 876 => '∧', 877 => '∨', 878 => '∩', 879 => '∪', 880 => '∫', 881 => '∮', 882 => '∱', 883 => '∲', 884 => '∳', 885 => '∴', 886 => '∵', 887 => '∶', 888 => '∷', 889 => '∸', 890 => '∹', 891 => '∺', 892 => '∻', 893 => '∼', 894 => '∽', 895 => '∾', 896 => '∿', 897 => '≀', 898 => '≂', 899 => '≃', 900 => '≅', 901 => '≆', 902 => '≈', 903 => '≊', 904 => '≋', 905 => '≌', 906 => '≍', 907 => '≎', 908 => '≏', 909 => '≐', 910 => '≑', 911 => '≒', 912 => '≓', 913 => '≔', 914 => '≕', 915 => '≖', 916 => '≗', 917 => '≘', 918 => '≙', 919 => '≚', 920 => '≛', 921 => '≜', 922 => '≝', 923 => '≞', 924 => '≟', 925 => '≡', 926 => '≣', 927 => '≤', 928 => '≥', 929 => '≦', 930 => '≧', 931 => '≨', 932 => '≩', 933 => '≪', 934 => '≫', 935 => '≬', 936 => '≲', 937 => '≳', 938 => '≶', 939 => '≷', 940 => '≺', 941 => '≻', 942 => '≼', 943 => '≽', 944 => '≾', 945 => '≿', 946 => '⊂', 947 => '⊃', 948 => '⊆', 949 => '⊇', 950 => '⊊', 951 => '⊋', 952 => '⊌', 953 => '⊍', 954 => '⊎', 955 => '⊏', 956 => '⊐', 957 => '⊑', 958 => '⊒', 959 => '⊓', 960 => '⊔', 961 => '⊕', 962 => '⊖', 963 => '⊗', 964 => '⊘', 965 => '⊙', 966 => '⊚', 967 => '⊛', 968 => '⊜', 969 => '⊝', 970 => '⊞', 971 => '⊟', 972 => '⊠', 973 => '⊡', 974 => '⊢', 975 => '⊣', 976 => '⊤', 977 => '⊥', 978 => '⊦', 979 => '⊧', 980 => '⊨', 981 => '⊩', 982 => '⊪', 983 => '⊫', 984 => '⊰', 985 => '⊱', 986 => '⊲', 987 => '⊳', 988 => '⊴', 989 => '⊵', 990 => '⊶', 991 => '⊷', 992 => '⊸', 993 => '⊹', 994 => '⊺', 995 => '⊻', 996 => '⊼', 997 => '⊽', 998 => '⊾', 999 => '⊿', 1000 => '⋀', 1001 => '⋁', 1002 => '⋂', 1003 => '⋃', 1004 => '⋄', 1005 => '⋅', 1006 => '⋆', 1007 => '⋇', 1008 => '⋈', 1009 => '⋉', 1010 => '⋊', 1011 => '⋋', 1012 => '⋌', 1013 => '⋍', 1014 => '⋎', 1015 => '⋏', 1016 => '⋐', 1017 => '⋑', 1018 => '⋒', 1019 => '⋓', 1020 => '⋔', 1021 => '⋕', 1022 => '⋖', 1023 => '⋗', 1024 => '⋘', 1025 => '⋙', 1026 => '⋚', 1027 => '⋛', 1028 => '⋜', 1029 => '⋝', 1030 => '⋞', 1031 => '⋟', 1032 => '⋤', 1033 => '⋥', 1034 => '⋦', 1035 => '⋧', 1036 => '⋨', 1037 => '⋩', 1038 => '⋮', 1039 => '⋯', 1040 => '⋰', 1041 => '⋱', 1042 => '⋲', 1043 => '⋳', 1044 => '⋴', 1045 => '⋵', 1046 => '⋶', 1047 => '⋷', 1048 => '⋸', 1049 => '⋹', 1050 => '⋺', 1051 => '⋻', 1052 => '⋼', 1053 => '⋽', 1054 => '⋾', 1055 => '⋿', 1056 => '⌀', 1057 => '⌁', 1058 => '⌂', 1059 => '⌃', 1060 => '⌄', 1061 => '⌅', 1062 => '⌆', 1063 => '⌇', 1064 => '⌈', 1065 => '⌉', 1066 => '⌊', 1067 => '⌋', 1068 => '⌌', 1069 => '⌍', 1070 => '⌎', 1071 => '⌏', 1072 => '⌐', 1073 => '⌑', 1074 => '⌒', 1075 => '⌓', 1076 => '⌔', 1077 => '⌕', 1078 => '⌖', 1079 => '⌗', 1080 => '⌘', 1081 => '⌙', 1082 => '⌚', 1083 => '⌛', 1084 => '⌜', 1085 => '⌝', 1086 => '⌞', 1087 => '⌟', 1088 => '⌠', 1089 => '⌡', 1090 => '⌢', 1091 => '⌣', 1092 => '⌤', 1093 => '⌥', 1094 => '⌦', 1095 => '⌧', 1096 => '⌨', 1097 => '⌫', 1098 => '⌬', 1099 => '⌭', 1100 => '⌮', 1101 => '⌯', 1102 => '⌰', 1103 => '⌱', 1104 => '⌲', 1105 => '⌳', 1106 => '⌴', 1107 => '⌵', 1108 => '⌶', 1109 => '⌷', 1110 => '⌸', 1111 => '⌹', 1112 => '⌺', 1113 => '⌻', 1114 => '⌼', 1115 => '⌽', 1116 => '⌾', 1117 => '⌿', 1118 => '⍀', 1119 => '⍁', 1120 => '⍂', 1121 => '⍃', 1122 => '⍄', 1123 => '⍅', 1124 => '⍆', 1125 => '⍇', 1126 => '⍈', 1127 => '⍉', 1128 => '⍊', 1129 => '⍋', 1130 => '⍌', 1131 => '⍍', 1132 => '⍎', 1133 => '⍏', 1134 => '⍐', 1135 => '⍑', 1136 => '⍒', 1137 => '⍓', 1138 => '⍔', 1139 => '⍕', 1140 => '⍖', 1141 => '⍗', 1142 => '⍘', 1143 => '⍙', 1144 => '⍚', 1145 => '⍛', 1146 => '⍜', 1147 => '⍝', 1148 => '⍞', 1149 => '⍟', 1150 => '⍠', 1151 => '⍡', 1152 => '⍢', 1153 => '⍣', 1154 => '⍤', 1155 => '⍥', 1156 => '⍦', 1157 => '⍧', 1158 => '⍨', 1159 => '⍩', 1160 => '⍪', 1161 => '⍫', 1162 => '⍬', 1163 => '⍭', 1164 => '⍮', 1165 => '⍯', 1166 => '⍰', 1167 => '⍱', 1168 => '⍲', 1169 => '⍳', 1170 => '⍴', 1171 => '⍵', 1172 => '⍶', 1173 => '⍷', 1174 => '⍸', 1175 => '⍹', 1176 => '⍺', 1177 => '⍻', 1178 => '⍼', 1179 => '⍽', 1180 => '⍾', 1181 => '⍿', 1182 => '⎀', 1183 => '⎁', 1184 => '⎂', 1185 => '⎃', 1186 => '⎄', 1187 => '⎅', 1188 => '⎆', 1189 => '⎇', 1190 => '⎈', 1191 => '⎉', 1192 => '⎊', 1193 => '⎋', 1194 => '⎌', 1195 => '⎍', 1196 => '⎎', 1197 => '⎏', 1198 => '⎐', 1199 => '⎑', 1200 => '⎒', 1201 => '⎓', 1202 => '⎔', 1203 => '⎕', 1204 => '⎖', 1205 => '⎗', 1206 => '⎘', 1207 => '⎙', 1208 => '⎚', 1209 => '⎛', 1210 => '⎜', 1211 => '⎝', 1212 => '⎞', 1213 => '⎟', 1214 => '⎠', 1215 => '⎡', 1216 => '⎢', 1217 => '⎣', 1218 => '⎤', 1219 => '⎥', 1220 => '⎦', 1221 => '⎧', 1222 => '⎨', 1223 => '⎩', 1224 => '⎪', 1225 => '⎫', 1226 => '⎬', 1227 => '⎭', 1228 => '⎮', 1229 => '⎯', 1230 => '⎰', 1231 => '⎱', 1232 => '⎲', 1233 => '⎳', 1234 => '⎴', 1235 => '⎵', 1236 => '⎶', 1237 => '⎷', 1238 => '⎸', 1239 => '⎹', 1240 => '⎺', 1241 => '⎻', 1242 => '⎼', 1243 => '⎽', 1244 => '⎾', 1245 => '⎿', 1246 => '⏀', 1247 => '⏁', 1248 => '⏂', 1249 => '⏃', 1250 => '⏄', 1251 => '⏅', 1252 => '⏆', 1253 => '⏇', 1254 => '⏈', 1255 => '⏉', 1256 => '⏊', 1257 => '⏋', 1258 => '⏌', 1259 => '⏍', 1260 => '⏎', 1261 => '⏏', 1262 => '⏐', 1263 => '⏑', 1264 => '⏒', 1265 => '⏓', 1266 => '⏔', 1267 => '⏕', 1268 => '⏖', 1269 => '⏗', 1270 => '⏘', 1271 => '⏙', 1272 => '⏚', 1273 => '⏛', 1274 => '⏜', 1275 => '⏝', 1276 => '⏞', 1277 => '⏟', 1278 => '⏠', 1279 => '⏡', 1280 => '⏢', 1281 => '⏣', 1282 => '⏤', 1283 => '⏥', 1284 => '⏦', 1285 => '⏧', 1286 => '⏨', 1287 => '⏩', 1288 => '⏪', 1289 => '⏫', 1290 => '⏬', 1291 => '⏭', 1292 => '⏮', 1293 => '⏯', 1294 => '⏰', 1295 => '⏱', 1296 => '⏲', 1297 => '⏳', 1298 => '␀', 1299 => '␁', 1300 => '␂', 1301 => '␃', 1302 => '␄', 1303 => '␅', 1304 => '␆', 1305 => '␇', 1306 => '␈', 1307 => '␉', 1308 => '␊', 1309 => '␋', 1310 => '␌', 1311 => '␍', 1312 => '␎', 1313 => '␏', 1314 => '␐', 1315 => '␑', 1316 => '␒', 1317 => '␓', 1318 => '␔', 1319 => '␕', 1320 => '␖', 1321 => '␗', 1322 => '␘', 1323 => '␙', 1324 => '␚', 1325 => '␛', 1326 => '␜', 1327 => '␝', 1328 => '␞', 1329 => '␟', 1330 => '␠', 1331 => '␡', 1332 => '␢', 1333 => '␣', 1334 => '␤', 1335 => '␥', 1336 => '␦', 1337 => '⑀', 1338 => '⑁', 1339 => '⑂', 1340 => '⑃', 1341 => '⑄', 1342 => '⑅', 1343 => '⑆', 1344 => '⑇', 1345 => '⑈', 1346 => '⑉', 1347 => '⑊', 1348 => '─', 1349 => '━', 1350 => '│', 1351 => '┃', 1352 => '┄', 1353 => '┅', 1354 => '┆', 1355 => '┇', 1356 => '┈', 1357 => '┉', 1358 => '┊', 1359 => '┋', 1360 => '┌', 1361 => '┍', 1362 => '┎', 1363 => '┏', 1364 => '┐', 1365 => '┑', 1366 => '┒', 1367 => '┓', 1368 => '└', 1369 => '┕', 1370 => '┖', 1371 => '┗', 1372 => '┘', 1373 => '┙', 1374 => '┚', 1375 => '┛', 1376 => '├', 1377 => '┝', 1378 => '┞', 1379 => '┟', 1380 => '┠', 1381 => '┡', 1382 => '┢', 1383 => '┣', 1384 => '┤', 1385 => '┥', 1386 => '┦', 1387 => '┧', 1388 => '┨', 1389 => '┩', 1390 => '┪', 1391 => '┫', 1392 => '┬', 1393 => '┭', 1394 => '┮', 1395 => '┯', 1396 => '┰', 1397 => '┱', 1398 => '┲', 1399 => '┳', 1400 => '┴', 1401 => '┵', 1402 => '┶', 1403 => '┷', 1404 => '┸', 1405 => '┹', 1406 => '┺', 1407 => '┻', 1408 => '┼', 1409 => '┽', 1410 => '┾', 1411 => '┿', 1412 => '╀', 1413 => '╁', 1414 => '╂', 1415 => '╃', 1416 => '╄', 1417 => '╅', 1418 => '╆', 1419 => '╇', 1420 => '╈', 1421 => '╉', 1422 => '╊', 1423 => '╋', 1424 => '╌', 1425 => '╍', 1426 => '╎', 1427 => '╏', 1428 => '═', 1429 => '║', 1430 => '╒', 1431 => '╓', 1432 => '╔', 1433 => '╕', 1434 => '╖', 1435 => '╗', 1436 => '╘', 1437 => '╙', 1438 => '╚', 1439 => '╛', 1440 => '╜', 1441 => '╝', 1442 => '╞', 1443 => '╟', 1444 => '╠', 1445 => '╡', 1446 => '╢', 1447 => '╣', 1448 => '╤', 1449 => '╥', 1450 => '╦', 1451 => '╧', 1452 => '╨', 1453 => '╩', 1454 => '╪', 1455 => '╫', 1456 => '╬', 1457 => '╭', 1458 => '╮', 1459 => '╯', 1460 => '╰', 1461 => '╱', 1462 => '╲', 1463 => '╳', 1464 => '╴', 1465 => '╵', 1466 => '╶', 1467 => '╷', 1468 => '╸', 1469 => '╹', 1470 => '╺', 1471 => '╻', 1472 => '╼', 1473 => '╽', 1474 => '╾', 1475 => '╿', 1476 => '▀', 1477 => '▁', 1478 => '▂', 1479 => '▃', 1480 => '▄', 1481 => '▅', 1482 => '▆', 1483 => '▇', 1484 => '█', 1485 => '▉', 1486 => '▊', 1487 => '▋', 1488 => '▌', 1489 => '▍', 1490 => '▎', 1491 => '▏', 1492 => '▐', 1493 => '░', 1494 => '▒', 1495 => '▓', 1496 => '▔', 1497 => '▕', 1498 => '▖', 1499 => '▗', 1500 => '▘', 1501 => '▙', 1502 => '▚', 1503 => '▛', 1504 => '▜', 1505 => '▝', 1506 => '▞', 1507 => '▟', 1508 => '■', 1509 => '□', 1510 => '▢', 1511 => '▣', 1512 => '▤', 1513 => '▥', 1514 => '▦', 1515 => '▧', 1516 => '▨', 1517 => '▩', 1518 => '▪', 1519 => '▫', 1520 => '▬', 1521 => '▭', 1522 => '▮', 1523 => '▯', 1524 => '▰', 1525 => '▱', 1526 => '▲', 1527 => '△', 1528 => '▴', 1529 => '▵', 1530 => '▶', 1531 => '▷', 1532 => '▸', 1533 => '▹', 1534 => '►', 1535 => '▻', 1536 => '▼', 1537 => '▽', 1538 => '▾', 1539 => '▿', 1540 => '◀', 1541 => '◁', 1542 => '◂', 1543 => '◃', 1544 => '◄', 1545 => '◅', 1546 => '◆', 1547 => '◇', 1548 => '◈', 1549 => '◉', 1550 => '◊', 1551 => '○', 1552 => '◌', 1553 => '◍', 1554 => '◎', 1555 => '●', 1556 => '◐', 1557 => '◑', 1558 => '◒', 1559 => '◓', 1560 => '◔', 1561 => '◕', 1562 => '◖', 1563 => '◗', 1564 => '◘', 1565 => '◙', 1566 => '◚', 1567 => '◛', 1568 => '◜', 1569 => '◝', 1570 => '◞', 1571 => '◟', 1572 => '◠', 1573 => '◡', 1574 => '◢', 1575 => '◣', 1576 => '◤', 1577 => '◥', 1578 => '◦', 1579 => '◧', 1580 => '◨', 1581 => '◩', 1582 => '◪', 1583 => '◫', 1584 => '◬', 1585 => '◭', 1586 => '◮', 1587 => '◯', 1588 => '◰', 1589 => '◱', 1590 => '◲', 1591 => '◳', 1592 => '◴', 1593 => '◵', 1594 => '◶', 1595 => '◷', 1596 => '◸', 1597 => '◹', 1598 => '◺', 1599 => '◻', 1600 => '◼', 1601 => '◽', 1602 => '◾', 1603 => '◿', 1604 => '☀', 1605 => '☁', 1606 => '☂', 1607 => '☃', 1608 => '☄', 1609 => '★', 1610 => '☆', 1611 => '☇', 1612 => '☈', 1613 => '☉', 1614 => '☊', 1615 => '☋', 1616 => '☌', 1617 => '☍', 1618 => '☎', 1619 => '☏', 1620 => '☐', 1621 => '☑', 1622 => '☒', 1623 => '☓', 1624 => '☔', 1625 => '☕', 1626 => '☖', 1627 => '☗', 1628 => '☘', 1629 => '☙', 1630 => '☚', 1631 => '☛', 1632 => '☜', 1633 => '☝', 1634 => '☞', 1635 => '☟', 1636 => '☠', 1637 => '☡', 1638 => '☢', 1639 => '☣', 1640 => '☤', 1641 => '☥', 1642 => '☦', 1643 => '☧', 1644 => '☨', 1645 => '☩', 1646 => '☪', 1647 => '☫', 1648 => '☬', 1649 => '☭', 1650 => '☮', 1651 => '☯', 1652 => '☸', 1653 => '☹', 1654 => '☺', 1655 => '☻', 1656 => '☼', 1657 => '☽', 1658 => '☾', 1659 => '☿', 1660 => '♀', 1661 => '♁', 1662 => '♂', 1663 => '♃', 1664 => '♄', 1665 => '♅', 1666 => '♆', 1667 => '♇', 1668 => '♈', 1669 => '♉', 1670 => '♊', 1671 => '♋', 1672 => '♌', 1673 => '♍', 1674 => '♎', 1675 => '♏', 1676 => '♐', 1677 => '♑', 1678 => '♒', 1679 => '♓', 1680 => '♔', 1681 => '♕', 1682 => '♖', 1683 => '♗', 1684 => '♘', 1685 => '♙', 1686 => '♚', 1687 => '♛', 1688 => '♜', 1689 => '♝', 1690 => '♞', 1691 => '♟', 1692 => '♠', 1693 => '♡', 1694 => '♢', 1695 => '♣', 1696 => '♤', 1697 => '♥', 1698 => '♦', 1699 => '♧', 1700 => '♨', 1701 => '♩', 1702 => '♪', 1703 => '♫', 1704 => '♬', 1705 => '♰', 1706 => '♱', 1707 => '♲', 1708 => '♳', 1709 => '♴', 1710 => '♵', 1711 => '♶', 1712 => '♷', 1713 => '♸', 1714 => '♹', 1715 => '♺', 1716 => '♻', 1717 => '♼', 1718 => '♽', 1719 => '♾', 1720 => '♿', 1721 => '⚀', 1722 => '⚁', 1723 => '⚂', 1724 => '⚃', 1725 => '⚄', 1726 => '⚅', 1727 => '⚆', 1728 => '⚇', 1729 => '⚈', 1730 => '⚉', 1731 => '⚐', 1732 => '⚑', 1733 => '⚒', 1734 => '⚓', 1735 => '⚔', 1736 => '⚕', 1737 => '⚖', 1738 => '⚗', 1739 => '⚘', 1740 => '⚙', 1741 => '⚚', 1742 => '⚛', 1743 => '⚜', 1744 => '⚝', 1745 => '⚞', 1746 => '⚟', 1747 => '⚠', 1748 => '⚡', 1749 => '⚢', 1750 => '⚣', 1751 => '⚤', 1752 => '⚥', 1753 => '⚦', 1754 => '⚧', 1755 => '⚨', 1756 => '⚩', 1757 => '⚪', 1758 => '⚫', 1759 => '⚬', 1760 => '⚭', 1761 => '⚮', 1762 => '⚯', 1763 => '⚰', 1764 => '⚱', 1765 => '⚲', 1766 => '⚳', 1767 => '⚴', 1768 => '⚵', 1769 => '⚶', 1770 => '⚷', 1771 => '⚸', 1772 => '⚹', 1773 => '⚺', 1774 => '⚻', 1775 => '⚼', 1776 => '⚽', 1777 => '⚾', 1778 => '⚿', 1779 => '⛀', 1780 => '⛁', 1781 => '⛂', 1782 => '⛃', 1783 => '⛄', 1784 => '⛅', 1785 => '⛆', 1786 => '⛇', 1787 => '⛈', 1788 => '⛉', 1789 => '⛊', 1790 => '⛋', 1791 => '⛌', 1792 => '⛍', 1793 => '⛎', 1794 => '⛏', 1795 => '⛐', 1796 => '⛑', 1797 => '⛒', 1798 => '⛓', 1799 => '⛔', 1800 => '⛕', 1801 => '⛖', 1802 => '⛗', 1803 => '⛘', 1804 => '⛙', 1805 => '⛚', 1806 => '⛛', 1807 => '⛜', 1808 => '⛝', 1809 => '⛞', 1810 => '⛟', 1811 => '⛠', 1812 => '⛡', 1813 => '⛢', 1814 => '⛣', 1815 => '⛤', 1816 => '⛥', 1817 => '⛦', 1818 => '⛧', 1819 => '⛨', 1820 => '⛩', 1821 => '⛪', 1822 => '⛫', 1823 => '⛬', 1824 => '⛭', 1825 => '⛮', 1826 => '⛯', 1827 => '⛰', 1828 => '⛱', 1829 => '⛲', 1830 => '⛳', 1831 => '⛴', 1832 => '⛵', 1833 => '⛶', 1834 => '⛷', 1835 => '⛸', 1836 => '⛹', 1837 => '⛺', 1838 => '⛻', 1839 => '⛼', 1840 => '⛽', 1841 => '⛾', 1842 => '⛿', 1843 => '✁', 1844 => '✂', 1845 => '✃', 1846 => '✄', 1847 => '✅', 1848 => '✆', 1849 => '✇', 1850 => '✈', 1851 => '✉', 1852 => '✊', 1853 => '✋', 1854 => '✌', 1855 => '✍', 1856 => '✎', 1857 => '✏', 1858 => '✐', 1859 => '✑', 1860 => '✒', 1861 => '✓', 1862 => '✔', 1863 => '✕', 1864 => '✖', 1865 => '✗', 1866 => '✘', 1867 => '✙', 1868 => '✚', 1869 => '✛', 1870 => '✜', 1871 => '✝', 1872 => '✞', 1873 => '✟', 1874 => '✠', 1875 => '✡', 1876 => '✢', 1877 => '✣', 1878 => '✤', 1879 => '✥', 1880 => '✦', 1881 => '✧', 1882 => '✨', 1883 => '✩', 1884 => '✪', 1885 => '✫', 1886 => '✬', 1887 => '✭', 1888 => '✮', 1889 => '✯', 1890 => '✰', 1891 => '✱', 1892 => '✲', 1893 => '✳', 1894 => '✴', 1895 => '✵', 1896 => '✶', 1897 => '✷', 1898 => '✸', 1899 => '✹', 1900 => '✺', 1901 => '✻', 1902 => '✼', 1903 => '✽', 1904 => '✾', 1905 => '✿', 1906 => '❀', 1907 => '❁', 1908 => '❂', 1909 => '❃', 1910 => '❄', 1911 => '❅', 1912 => '❆', 1913 => '❇', 1914 => '❈', 1915 => '❉', 1916 => '❊', 1917 => '❋', 1918 => '❌', 1919 => '❍', 1920 => '❎', 1921 => '❏', 1922 => '❐', 1923 => '❑', 1924 => '❒', 1925 => '❓', 1926 => '❔', 1927 => '❕', 1928 => '❖', 1929 => '❗', 1930 => '❘', 1931 => '❙', 1932 => '❚', 1933 => '❛', 1934 => '❜', 1935 => '❝', 1936 => '❞', 1937 => '❟', 1938 => '❠', 1939 => '❡', 1940 => '❢', 1941 => '❣', 1942 => '❤', 1943 => '❥', 1944 => '❦', 1945 => '❧', 1946 => '❨', 1947 => '❩', 1948 => '❪', 1949 => '❫', 1950 => '❬', 1951 => '❭', 1952 => '❮', 1953 => '❯', 1954 => '❰', 1955 => '❱', 1956 => '❲', 1957 => '❳', 1958 => '❴', 1959 => '❵', 1960 => '➔', 1961 => '➕', 1962 => '➖', 1963 => '➗', 1964 => '➘', 1965 => '➙', 1966 => '➚', 1967 => '➛', 1968 => '➜', 1969 => '➝', 1970 => '➞', 1971 => '➟', 1972 => '➠', 1973 => '➡', 1974 => '➢', 1975 => '➣', 1976 => '➤', 1977 => '➥', 1978 => '➦', 1979 => '➧', 1980 => '➨', 1981 => '➩', 1982 => '➪', 1983 => '➫', 1984 => '➬', 1985 => '➭', 1986 => '➮', 1987 => '➯', 1988 => '➰', 1989 => '➱', 1990 => '➲', 1991 => '➳', 1992 => '➴', 1993 => '➵', 1994 => '➶', 1995 => '➷', 1996 => '➸', 1997 => '➹', 1998 => '➺', 1999 => '➻', 2000 => '➼', 2001 => '➽', 2002 => '➾', 2003 => '➿', 2004 => '⟀', 2005 => '⟁', 2006 => '⟂', 2007 => '⟃', 2008 => '⟄', 2009 => '⟅', 2010 => '⟆', 2011 => '⟇', 2012 => '⟈', 2013 => '⟉', 2014 => '⟊', 2015 => '⟌', 2016 => '⟎', 2017 => '⟏', 2018 => '⟐', 2019 => '⟑', 2020 => '⟒', 2021 => '⟓', 2022 => '⟔', 2023 => '⟕', 2024 => '⟖', 2025 => '⟗', 2026 => '⟘', 2027 => '⟙', 2028 => '⟚', 2029 => '⟛', 2030 => '⟜', 2031 => '⟝', 2032 => '⟞', 2033 => '⟟', 2034 => '⟠', 2035 => '⟡', 2036 => '⟢', 2037 => '⟣', 2038 => '⟤', 2039 => '⟥', 2040 => '⟦', 2041 => '⟧', 2042 => '⟨', 2043 => '⟩', 2044 => '⟪', 2045 => '⟫', 2046 => '⟰', 2047 => '⟱', 2048 => '⟲', 2049 => '⟳', 2050 => '⟴', 2051 => '⟵', 2052 => '⟶', 2053 => '⟷', 2054 => '⟸', 2055 => '⟹', 2056 => '⟺', 2057 => '⟻', 2058 => '⟼', 2059 => '⟽', 2060 => '⟾', 2061 => '⟿', 2062 => '⤀', 2063 => '⤁', 2064 => '⤂', 2065 => '⤃', 2066 => '⤄', 2067 => '⤅', 2068 => '⤆', 2069 => '⤇', 2070 => '⤈', 2071 => '⤉', 2072 => '⤊', 2073 => '⤋', 2074 => '⤌', 2075 => '⤍', 2076 => '⤎', 2077 => '⤏', 2078 => '⤐', 2079 => '⤑', 2080 => '⤒', 2081 => '⤓', 2082 => '⤔', 2083 => '⤕', 2084 => '⤖', 2085 => '⤗', 2086 => '⤘', 2087 => '⤙', 2088 => '⤚', 2089 => '⤛', 2090 => '⤜', 2091 => '⤝', 2092 => '⤞', 2093 => '⤟', 2094 => '⤠', 2095 => '⤡', 2096 => '⤢', 2097 => '⤣', 2098 => '⤤', 2099 => '⤥', 2100 => '⤦', 2101 => '⤧', 2102 => '⤨', 2103 => '⤩', 2104 => '⤪', 2105 => '⤫', 2106 => '⤬', 2107 => '⤭', 2108 => '⤮', 2109 => '⤯', 2110 => '⤰', 2111 => '⤱', 2112 => '⤲', 2113 => '⤳', 2114 => '⤴', 2115 => '⤵', 2116 => '⤶', 2117 => '⤷', 2118 => '⤸', 2119 => '⤹', 2120 => '⤺', 2121 => '⤻', 2122 => '⤼', 2123 => '⤽', 2124 => '⤾', 2125 => '⤿', 2126 => '⥀', 2127 => '⥁', 2128 => '⥂', 2129 => '⥃', 2130 => '⥄', 2131 => '⥅', 2132 => '⥆', 2133 => '⥇', 2134 => '⥈', 2135 => '⥉', 2136 => '⥊', 2137 => '⥋', 2138 => '⥌', 2139 => '⥍', 2140 => '⥎', 2141 => '⥏', 2142 => '⥐', 2143 => '⥑', 2144 => '⥒', 2145 => '⥓', 2146 => '⥔', 2147 => '⥕', 2148 => '⥖', 2149 => '⥗', 2150 => '⥘', 2151 => '⥙', 2152 => '⥚', 2153 => '⥛', 2154 => '⥜', 2155 => '⥝', 2156 => '⥞', 2157 => '⥟', 2158 => '⥠', 2159 => '⥡', 2160 => '⥢', 2161 => '⥣', 2162 => '⥤', 2163 => '⥥', 2164 => '⥦', 2165 => '⥧', 2166 => '⥨', 2167 => '⥩', 2168 => '⥪', 2169 => '⥫', 2170 => '⥬', 2171 => '⥭', 2172 => '⥮', 2173 => '⥯', 2174 => '⥰', 2175 => '⥱', 2176 => '⥲', 2177 => '⥳', 2178 => '⥴', 2179 => '⥵', 2180 => '⥶', 2181 => '⥷', 2182 => '⥸', 2183 => '⥹', 2184 => '⥺', 2185 => '⥻', 2186 => '⥼', 2187 => '⥽', 2188 => '⥾', 2189 => '⥿', 2190 => '⦀', 2191 => '⦁', 2192 => '⦂', 2193 => '⦙', 2194 => '⦚', 2195 => '⦛', 2196 => '⦜', 2197 => '⦝', 2198 => '⦞', 2199 => '⦟', 2200 => '⦠', 2201 => '⦡', 2202 => '⦢', 2203 => '⦣', 2204 => '⦤', 2205 => '⦥', 2206 => '⦦', 2207 => '⦧', 2208 => '⦨', 2209 => '⦩', 2210 => '⦪', 2211 => '⦫', 2212 => '⦬', 2213 => '⦭', 2214 => '⦮', 2215 => '⦯', 2216 => '⦰', 2217 => '⦱', 2218 => '⦲', 2219 => '⦳', 2220 => '⦴', 2221 => '⦵', 2222 => '⦶', 2223 => '⦷', 2224 => '⦸', 2225 => '⦹', 2226 => '⦺', 2227 => '⦻', 2228 => '⦼', 2229 => '⦽', 2230 => '⦾', 2231 => '⦿', 2232 => '⧀', 2233 => '⧁', 2234 => '⧂', 2235 => '⧃', 2236 => '⧄', 2237 => '⧅', 2238 => '⧆', 2239 => '⧇', 2240 => '⧈', 2241 => '⧉', 2242 => '⧊', 2243 => '⧋', 2244 => '⧌', 2245 => '⧍', 2246 => '⧎', 2247 => '⧏', 2248 => '⧐', 2249 => '⧑', 2250 => '⧒', 2251 => '⧓', 2252 => '⧔', 2253 => '⧕', 2254 => '⧖', 2255 => '⧗', 2256 => '⧘', 2257 => '⧙', 2258 => '⧚', 2259 => '⧛', 2260 => '⧜', 2261 => '⧝', 2262 => '⧞', 2263 => '⧟', 2264 => '⧠', 2265 => '⧡', 2266 => '⧢', 2267 => '⧣', 2268 => '⧤', 2269 => '⧥', 2270 => '⧦', 2271 => '⧧', 2272 => '⧨', 2273 => '⧩', 2274 => '⧪', 2275 => '⧫', 2276 => '⧬', 2277 => '⧭', 2278 => '⧮', 2279 => '⧯', 2280 => '⧰', 2281 => '⧱', 2282 => '⧲', 2283 => '⧳', 2284 => '⧴', 2285 => '⧵', 2286 => '⧶', 2287 => '⧷', 2288 => '⧸', 2289 => '⧹', 2290 => '⧺', 2291 => '⧻', 2292 => '⧾', 2293 => '⧿', 2294 => '⨀', 2295 => '⨁', 2296 => '⨂', 2297 => '⨃', 2298 => '⨄', 2299 => '⨅', 2300 => '⨆', 2301 => '⨇', 2302 => '⨈', 2303 => '⨉', 2304 => '⨊', 2305 => '⨋', 2306 => '⨍', 2307 => '⨎', 2308 => '⨏', 2309 => '⨐', 2310 => '⨑', 2311 => '⨒', 2312 => '⨓', 2313 => '⨔', 2314 => '⨕', 2315 => '⨖', 2316 => '⨗', 2317 => '⨘', 2318 => '⨙', 2319 => '⨚', 2320 => '⨛', 2321 => '⨜', 2322 => '⨝', 2323 => '⨞', 2324 => '⨟', 2325 => '⨠', 2326 => '⨡', 2327 => '⨢', 2328 => '⨣', 2329 => '⨤', 2330 => '⨥', 2331 => '⨦', 2332 => '⨧', 2333 => '⨨', 2334 => '⨩', 2335 => '⨪', 2336 => '⨫', 2337 => '⨬', 2338 => '⨭', 2339 => '⨮', 2340 => '⨯', 2341 => '⨰', 2342 => '⨱', 2343 => '⨲', 2344 => '⨳', 2345 => '⨴', 2346 => '⨵', 2347 => '⨶', 2348 => '⨷', 2349 => '⨸', 2350 => '⨹', 2351 => '⨺', 2352 => '⨻', 2353 => '⨼', 2354 => '⨽', 2355 => '⨾', 2356 => '⨿', 2357 => '⩀', 2358 => '⩁', 2359 => '⩂', 2360 => '⩃', 2361 => '⩄', 2362 => '⩅', 2363 => '⩆', 2364 => '⩇', 2365 => '⩈', 2366 => '⩉', 2367 => '⩊', 2368 => '⩋', 2369 => '⩌', 2370 => '⩍', 2371 => '⩎', 2372 => '⩏', 2373 => '⩐', 2374 => '⩑', 2375 => '⩒', 2376 => '⩓', 2377 => '⩔', 2378 => '⩕', 2379 => '⩖', 2380 => '⩗', 2381 => '⩘', 2382 => '⩙', 2383 => '⩚', 2384 => '⩛', 2385 => '⩜', 2386 => '⩝', 2387 => '⩞', 2388 => '⩟', 2389 => '⩠', 2390 => '⩡', 2391 => '⩢', 2392 => '⩣', 2393 => '⩤', 2394 => '⩥', 2395 => '⩦', 2396 => '⩧', 2397 => '⩨', 2398 => '⩩', 2399 => '⩪', 2400 => '⩫', 2401 => '⩬', 2402 => '⩭', 2403 => '⩮', 2404 => '⩯', 2405 => '⩰', 2406 => '⩱', 2407 => '⩲', 2408 => '⩳', 2409 => '⩷', 2410 => '⩸', 2411 => '⩹', 2412 => '⩺', 2413 => '⩻', 2414 => '⩼', 2415 => '⩽', 2416 => '⩾', 2417 => '⩿', 2418 => '⪀', 2419 => '⪁', 2420 => '⪂', 2421 => '⪃', 2422 => '⪄', 2423 => '⪅', 2424 => '⪆', 2425 => '⪇', 2426 => '⪈', 2427 => '⪉', 2428 => '⪊', 2429 => '⪋', 2430 => '⪌', 2431 => '⪍', 2432 => '⪎', 2433 => '⪏', 2434 => '⪐', 2435 => '⪑', 2436 => '⪒', 2437 => '⪓', 2438 => '⪔', 2439 => '⪕', 2440 => '⪖', 2441 => '⪗', 2442 => '⪘', 2443 => '⪙', 2444 => '⪚', 2445 => '⪛', 2446 => '⪜', 2447 => '⪝', 2448 => '⪞', 2449 => '⪟', 2450 => '⪠', 2451 => '⪡', 2452 => '⪢', 2453 => '⪣', 2454 => '⪤', 2455 => '⪥', 2456 => '⪦', 2457 => '⪧', 2458 => '⪨', 2459 => '⪩', 2460 => '⪪', 2461 => '⪫', 2462 => '⪬', 2463 => '⪭', 2464 => '⪮', 2465 => '⪯', 2466 => '⪰', 2467 => '⪱', 2468 => '⪲', 2469 => '⪳', 2470 => '⪴', 2471 => '⪵', 2472 => '⪶', 2473 => '⪷', 2474 => '⪸', 2475 => '⪹', 2476 => '⪺', 2477 => '⪻', 2478 => '⪼', 2479 => '⪽', 2480 => '⪾', 2481 => '⪿', 2482 => '⫀', 2483 => '⫁', 2484 => '⫂', 2485 => '⫃', 2486 => '⫄', 2487 => '⫅', 2488 => '⫆', 2489 => '⫇', 2490 => '⫈', 2491 => '⫉', 2492 => '⫊', 2493 => '⫋', 2494 => '⫌', 2495 => '⫍', 2496 => '⫎', 2497 => '⫏', 2498 => '⫐', 2499 => '⫑', 2500 => '⫒', 2501 => '⫓', 2502 => '⫔', 2503 => '⫕', 2504 => '⫖', 2505 => '⫗', 2506 => '⫘', 2507 => '⫙', 2508 => '⫚', 2509 => '⫛', 2510 => '⫝', 2511 => '⫞', 2512 => '⫟', 2513 => '⫠', 2514 => '⫡', 2515 => '⫢', 2516 => '⫣', 2517 => '⫤', 2518 => '⫥', 2519 => '⫦', 2520 => '⫧', 2521 => '⫨', 2522 => '⫩', 2523 => '⫪', 2524 => '⫫', 2525 => '⫬', 2526 => '⫭', 2527 => '⫮', 2528 => '⫯', 2529 => '⫰', 2530 => '⫱', 2531 => '⫲', 2532 => '⫳', 2533 => '⫴', 2534 => '⫵', 2535 => '⫶', 2536 => '⫷', 2537 => '⫸', 2538 => '⫹', 2539 => '⫺', 2540 => '⫻', 2541 => '⫼', 2542 => '⫽', 2543 => '⫾', 2544 => '⫿', 2545 => '⬀', 2546 => '⬁', 2547 => '⬂', 2548 => '⬃', 2549 => '⬄', 2550 => '⬅', 2551 => '⬆', 2552 => '⬇', 2553 => '⬈', 2554 => '⬉', 2555 => '⬊', 2556 => '⬋', 2557 => '⬌', 2558 => '⬍', 2559 => '⬎', 2560 => '⬏', 2561 => '⬐', 2562 => '⬑', 2563 => '⬒', 2564 => '⬓', 2565 => '⬔', 2566 => '⬕', 2567 => '⬖', 2568 => '⬗', 2569 => '⬘', 2570 => '⬙', 2571 => '⬚', 2572 => '⬛', 2573 => '⬜', 2574 => '⬝', 2575 => '⬞', 2576 => '⬟', 2577 => '⬠', 2578 => '⬡', 2579 => '⬢', 2580 => '⬣', 2581 => '⬤', 2582 => '⬥', 2583 => '⬦', 2584 => '⬧', 2585 => '⬨', 2586 => '⬩', 2587 => '⬪', 2588 => '⬫', 2589 => '⬬', 2590 => '⬭', 2591 => '⬮', 2592 => '⬯', 2593 => '⬰', 2594 => '⬱', 2595 => '⬲', 2596 => '⬳', 2597 => '⬴', 2598 => '⬵', 2599 => '⬶', 2600 => '⬷', 2601 => '⬸', 2602 => '⬹', 2603 => '⬺', 2604 => '⬻', 2605 => '⬼', 2606 => '⬽', 2607 => '⬾', 2608 => '⬿', 2609 => '⭀', 2610 => '⭁', 2611 => '⭂', 2612 => '⭃', 2613 => '⭄', 2614 => '⭅', 2615 => '⭆', 2616 => '⭇', 2617 => '⭈', 2618 => '⭉', 2619 => '⭊', 2620 => '⭋', 2621 => '⭌', 2622 => '⭐', 2623 => '⭑', 2624 => '⭒', 2625 => '⭓', 2626 => '⭔', 2627 => '⭕', 2628 => '⭖', 2629 => '⭗', 2630 => '⭘', 2631 => '⭙', 2632 => '⳥', 2633 => '⳦', 2634 => '⳧', 2635 => '⳨', 2636 => '⳩', 2637 => '⳪', 2638 => '⠀', 2639 => '⠁', 2640 => '⠂', 2641 => '⠃', 2642 => '⠄', 2643 => '⠅', 2644 => '⠆', 2645 => '⠇', 2646 => '⠈', 2647 => '⠉', 2648 => '⠊', 2649 => '⠋', 2650 => '⠌', 2651 => '⠍', 2652 => '⠎', 2653 => '⠏', 2654 => '⠐', 2655 => '⠑', 2656 => '⠒', 2657 => '⠓', 2658 => '⠔', 2659 => '⠕', 2660 => '⠖', 2661 => '⠗', 2662 => '⠘', 2663 => '⠙', 2664 => '⠚', 2665 => '⠛', 2666 => '⠜', 2667 => '⠝', 2668 => '⠞', 2669 => '⠟', 2670 => '⠠', 2671 => '⠡', 2672 => '⠢', 2673 => '⠣', 2674 => '⠤', 2675 => '⠥', 2676 => '⠦', 2677 => '⠧', 2678 => '⠨', 2679 => '⠩', 2680 => '⠪', 2681 => '⠫', 2682 => '⠬', 2683 => '⠭', 2684 => '⠮', 2685 => '⠯', 2686 => '⠰', 2687 => '⠱', 2688 => '⠲', 2689 => '⠳', 2690 => '⠴', 2691 => '⠵', 2692 => '⠶', 2693 => '⠷', 2694 => '⠸', 2695 => '⠹', 2696 => '⠺', 2697 => '⠻', 2698 => '⠼', 2699 => '⠽', 2700 => '⠾', 2701 => '⠿', 2702 => '⡀', 2703 => '⡁', 2704 => '⡂', 2705 => '⡃', 2706 => '⡄', 2707 => '⡅', 2708 => '⡆', 2709 => '⡇', 2710 => '⡈', 2711 => '⡉', 2712 => '⡊', 2713 => '⡋', 2714 => '⡌', 2715 => '⡍', 2716 => '⡎', 2717 => '⡏', 2718 => '⡐', 2719 => '⡑', 2720 => '⡒', 2721 => '⡓', 2722 => '⡔', 2723 => '⡕', 2724 => '⡖', 2725 => '⡗', 2726 => '⡘', 2727 => '⡙', 2728 => '⡚', 2729 => '⡛', 2730 => '⡜', 2731 => '⡝', 2732 => '⡞', 2733 => '⡟', 2734 => '⡠', 2735 => '⡡', 2736 => '⡢', 2737 => '⡣', 2738 => '⡤', 2739 => '⡥', 2740 => '⡦', 2741 => '⡧', 2742 => '⡨', 2743 => '⡩', 2744 => '⡪', 2745 => '⡫', 2746 => '⡬', 2747 => '⡭', 2748 => '⡮', 2749 => '⡯', 2750 => '⡰', 2751 => '⡱', 2752 => '⡲', 2753 => '⡳', 2754 => '⡴', 2755 => '⡵', 2756 => '⡶', 2757 => '⡷', 2758 => '⡸', 2759 => '⡹', 2760 => '⡺', 2761 => '⡻', 2762 => '⡼', 2763 => '⡽', 2764 => '⡾', 2765 => '⡿', 2766 => '⢀', 2767 => '⢁', 2768 => '⢂', 2769 => '⢃', 2770 => '⢄', 2771 => '⢅', 2772 => '⢆', 2773 => '⢇', 2774 => '⢈', 2775 => '⢉', 2776 => '⢊', 2777 => '⢋', 2778 => '⢌', 2779 => '⢍', 2780 => '⢎', 2781 => '⢏', 2782 => '⢐', 2783 => '⢑', 2784 => '⢒', 2785 => '⢓', 2786 => '⢔', 2787 => '⢕', 2788 => '⢖', 2789 => '⢗', 2790 => '⢘', 2791 => '⢙', 2792 => '⢚', 2793 => '⢛', 2794 => '⢜', 2795 => '⢝', 2796 => '⢞', 2797 => '⢟', 2798 => '⢠', 2799 => '⢡', 2800 => '⢢', 2801 => '⢣', 2802 => '⢤', 2803 => '⢥', 2804 => '⢦', 2805 => '⢧', 2806 => '⢨', 2807 => '⢩', 2808 => '⢪', 2809 => '⢫', 2810 => '⢬', 2811 => '⢭', 2812 => '⢮', 2813 => '⢯', 2814 => '⢰', 2815 => '⢱', 2816 => '⢲', 2817 => '⢳', 2818 => '⢴', 2819 => '⢵', 2820 => '⢶', 2821 => '⢷', 2822 => '⢸', 2823 => '⢹', 2824 => '⢺', 2825 => '⢻', 2826 => '⢼', 2827 => '⢽', 2828 => '⢾', 2829 => '⢿', 2830 => '⣀', 2831 => '⣁', 2832 => '⣂', 2833 => '⣃', 2834 => '⣄', 2835 => '⣅', 2836 => '⣆', 2837 => '⣇', 2838 => '⣈', 2839 => '⣉', 2840 => '⣊', 2841 => '⣋', 2842 => '⣌', 2843 => '⣍', 2844 => '⣎', 2845 => '⣏', 2846 => '⣐', 2847 => '⣑', 2848 => '⣒', 2849 => '⣓', 2850 => '⣔', 2851 => '⣕', 2852 => '⣖', 2853 => '⣗', 2854 => '⣘', 2855 => '⣙', 2856 => '⣚', 2857 => '⣛', 2858 => '⣜', 2859 => '⣝', 2860 => '⣞', 2861 => '⣟', 2862 => '⣠', 2863 => '⣡', 2864 => '⣢', 2865 => '⣣', 2866 => '⣤', 2867 => '⣥', 2868 => '⣦', 2869 => '⣧', 2870 => '⣨', 2871 => '⣩', 2872 => '⣪', 2873 => '⣫', 2874 => '⣬', 2875 => '⣭', 2876 => '⣮', 2877 => '⣯', 2878 => '⣰', 2879 => '⣱', 2880 => '⣲', 2881 => '⣳', 2882 => '⣴', 2883 => '⣵', 2884 => '⣶', 2885 => '⣷', 2886 => '⣸', 2887 => '⣹', 2888 => '⣺', 2889 => '⣻', 2890 => '⣼', 2891 => '⣽', 2892 => '⣾', 2893 => '⣿', 2894 => '⚊', 2895 => '⚋', 2896 => '⚌', 2897 => '⚍', 2898 => '⚎', 2899 => '⚏', 2900 => '☰', 2901 => '☱', 2902 => '☲', 2903 => '☳', 2904 => '☴', 2905 => '☵', 2906 => '☶', 2907 => '☷', 2908 => '䷀', 2909 => '䷁', 2910 => '䷂', 2911 => '䷃', 2912 => '䷄', 2913 => '䷅', 2914 => '䷆', 2915 => '䷇', 2916 => '䷈', 2917 => '䷉', 2918 => '䷊', 2919 => '䷋', 2920 => '䷌', 2921 => '䷍', 2922 => '䷎', 2923 => '䷏', 2924 => '䷐', 2925 => '䷑', 2926 => '䷒', 2927 => '䷓', 2928 => '䷔', 2929 => '䷕', 2930 => '䷖', 2931 => '䷗', 2932 => '䷘', 2933 => '䷙', 2934 => '䷚', 2935 => '䷛', 2936 => '䷜', 2937 => '䷝', 2938 => '䷞', 2939 => '䷟', 2940 => '䷠', 2941 => '䷡', 2942 => '䷢', 2943 => '䷣', 2944 => '䷤', 2945 => '䷥', 2946 => '䷦', 2947 => '䷧', 2948 => '䷨', 2949 => '䷩', 2950 => '䷪', 2951 => '䷫', 2952 => '䷬', 2953 => '䷭', 2954 => '䷮', 2955 => '䷯', 2956 => '䷰', 2957 => '䷱', 2958 => '䷲', 2959 => '䷳', 2960 => '䷴', 2961 => '䷵', 2962 => '䷶', 2963 => '䷷', 2964 => '䷸', 2965 => '䷹', 2966 => '䷺', 2967 => '䷻', 2968 => '䷼', 2969 => '䷽', 2970 => '䷾', 2971 => '䷿', 2972 => '𝌀', 2973 => '𝌁', 2974 => '𝌂', 2975 => '𝌃', 2976 => '𝌄', 2977 => '𝌅', 2978 => '𝌆', 2979 => '𝌇', 2980 => '𝌈', 2981 => '𝌉', 2982 => '𝌊', 2983 => '𝌋', 2984 => '𝌌', 2985 => '𝌍', 2986 => '𝌎', 2987 => '𝌏', 2988 => '𝌐', 2989 => '𝌑', 2990 => '𝌒', 2991 => '𝌓', 2992 => '𝌔', 2993 => '𝌕', 2994 => '𝌖', 2995 => '𝌗', 2996 => '𝌘', 2997 => '𝌙', 2998 => '𝌚', 2999 => '𝌛', 3000 => '𝌜', 3001 => '𝌝', 3002 => '𝌞', 3003 => '𝌟', 3004 => '𝌠', 3005 => '𝌡', 3006 => '𝌢', 3007 => '𝌣', 3008 => '𝌤', 3009 => '𝌥', 3010 => '𝌦', 3011 => '𝌧', 3012 => '𝌨', 3013 => '𝌩', 3014 => '𝌪', 3015 => '𝌫', 3016 => '𝌬', 3017 => '𝌭', 3018 => '𝌮', 3019 => '𝌯', 3020 => '𝌰', 3021 => '𝌱', 3022 => '𝌲', 3023 => '𝌳', 3024 => '𝌴', 3025 => '𝌵', 3026 => '𝌶', 3027 => '𝌷', 3028 => '𝌸', 3029 => '𝌹', 3030 => '𝌺', 3031 => '𝌻', 3032 => '𝌼', 3033 => '𝌽', 3034 => '𝌾', 3035 => '𝌿', 3036 => '𝍀', 3037 => '𝍁', 3038 => '𝍂', 3039 => '𝍃', 3040 => '𝍄', 3041 => '𝍅', 3042 => '𝍆', 3043 => '𝍇', 3044 => '𝍈', 3045 => '𝍉', 3046 => '𝍊', 3047 => '𝍋', 3048 => '𝍌', 3049 => '𝍍', 3050 => '𝍎', 3051 => '𝍏', 3052 => '𝍐', 3053 => '𝍑', 3054 => '𝍒', 3055 => '𝍓', 3056 => '𝍔', 3057 => '𝍕', 3058 => '𝍖', 3059 => '꒐', 3060 => '꒑', 3061 => '꒒', 3062 => '꒓', 3063 => '꒔', 3064 => '꒕', 3065 => '꒖', 3066 => '꒗', 3067 => '꒘', 3068 => '꒙', 3069 => '꒚', 3070 => '꒛', 3071 => '꒜', 3072 => '꒝', 3073 => '꒞', 3074 => '꒟', 3075 => '꒠', 3076 => '꒡', 3077 => '꒢', 3078 => '꒣', 3079 => '꒤', 3080 => '꒥', 3081 => '꒦', 3082 => '꒧', 3083 => '꒨', 3084 => '꒩', 3085 => '꒪', 3086 => '꒫', 3087 => '꒬', 3088 => '꒭', 3089 => '꒮', 3090 => '꒯', 3091 => '꒰', 3092 => '꒱', 3093 => '꒲', 3094 => '꒳', 3095 => '꒴', 3096 => '꒵', 3097 => '꒶', 3098 => '꒷', 3099 => '꒸', 3100 => '꒹', 3101 => '꒺', 3102 => '꒻', 3103 => '꒼', 3104 => '꒽', 3105 => '꒾', 3106 => '꒿', 3107 => '꓀', 3108 => '꓁', 3109 => '꓂', 3110 => '꓃', 3111 => '꓄', 3112 => '꓅', 3113 => '꓆', 3114 => '𐄷', 3115 => '𐄸', 3116 => '𐄹', 3117 => '𐄺', 3118 => '𐄻', 3119 => '𐄼', 3120 => '𐄽', 3121 => '𐄾', 3122 => '𐄿', 3123 => '𐅹', 3124 => '𐅺', 3125 => '𐅻', 3126 => '𐅼', 3127 => '𐅽', 3128 => '𐅾', 3129 => '𐅿', 3130 => '𐆀', 3131 => '𐆁', 3132 => '𐆂', 3133 => '𐆃', 3134 => '𐆄', 3135 => '𐆅', 3136 => '𐆆', 3137 => '𐆇', 3138 => '𐆈', 3139 => '𐆉', 3140 => '𐆐', 3141 => '𐆑', 3142 => '𐆒', 3143 => '𐆓', 3144 => '𐆔', 3145 => '𐆕', 3146 => '𐆖', 3147 => '𐆗', 3148 => '𐆘', 3149 => '𐆙', 3150 => '𐆚', 3151 => '𐆛', 3152 => '𐇐', 3153 => '𐇑', 3154 => '𐇒', 3155 => '𐇓', 3156 => '𐇔', 3157 => '𐇕', 3158 => '𐇖', 3159 => '𐇗', 3160 => '𐇘', 3161 => '𐇙', 3162 => '𐇚', 3163 => '𐇛', 3164 => '𐇜', 3165 => '𐇝', 3166 => '𐇞', 3167 => '𐇟', 3168 => '𐇠', 3169 => '𐇡', 3170 => '𐇢', 3171 => '𐇣', 3172 => '𐇤', 3173 => '𐇥', 3174 => '𐇦', 3175 => '𐇧', 3176 => '𐇨', 3177 => '𐇩', 3178 => '𐇪', 3179 => '𐇫', 3180 => '𐇬', 3181 => '𐇭', 3182 => '𐇮', 3183 => '𐇯', 3184 => '𐇰', 3185 => '𐇱', 3186 => '𐇲', 3187 => '𐇳', 3188 => '𐇴', 3189 => '𐇵', 3190 => '𐇶', 3191 => '𐇷', 3192 => '𐇸', 3193 => '𐇹', 3194 => '𐇺', 3195 => '𐇻', 3196 => '𐇼', 3197 => '𝀀', 3198 => '𝀁', 3199 => '𝀂', 3200 => '𝀃', 3201 => '𝀄', 3202 => '𝀅', 3203 => '𝀆', 3204 => '𝀇', 3205 => '𝀈', 3206 => '𝀉', 3207 => '𝀊', 3208 => '𝀋', 3209 => '𝀌', 3210 => '𝀍', 3211 => '𝀎', 3212 => '𝀏', 3213 => '𝀐', 3214 => '𝀑', 3215 => '𝀒', 3216 => '𝀓', 3217 => '𝀔', 3218 => '𝀕', 3219 => '𝀖', 3220 => '𝀗', 3221 => '𝀘', 3222 => '𝀙', 3223 => '𝀚', 3224 => '𝀛', 3225 => '𝀜', 3226 => '𝀝', 3227 => '𝀞', 3228 => '𝀟', 3229 => '𝀠', 3230 => '𝀡', 3231 => '𝀢', 3232 => '𝀣', 3233 => '𝀤', 3234 => '𝀥', 3235 => '𝀦', 3236 => '𝀧', 3237 => '𝀨', 3238 => '𝀩', 3239 => '𝀪', 3240 => '𝀫', 3241 => '𝀬', 3242 => '𝀭', 3243 => '𝀮', 3244 => '𝀯', 3245 => '𝀰', 3246 => '𝀱', 3247 => '𝀲', 3248 => '𝀳', 3249 => '𝀴', 3250 => '𝀵', 3251 => '𝀶', 3252 => '𝀷', 3253 => '𝀸', 3254 => '𝀹', 3255 => '𝀺', 3256 => '𝀻', 3257 => '𝀼', 3258 => '𝀽', 3259 => '𝀾', 3260 => '𝀿', 3261 => '𝁀', 3262 => '𝁁', 3263 => '𝁂', 3264 => '𝁃', 3265 => '𝁄', 3266 => '𝁅', 3267 => '𝁆', 3268 => '𝁇', 3269 => '𝁈', 3270 => '𝁉', 3271 => '𝁊', 3272 => '𝁋', 3273 => '𝁌', 3274 => '𝁍', 3275 => '𝁎', 3276 => '𝁏', 3277 => '𝁐', 3278 => '𝁑', 3279 => '𝁒', 3280 => '𝁓', 3281 => '𝁔', 3282 => '𝁕', 3283 => '𝁖', 3284 => '𝁗', 3285 => '𝁘', 3286 => '𝁙', 3287 => '𝁚', 3288 => '𝁛', 3289 => '𝁜', 3290 => '𝁝', 3291 => '𝁞', 3292 => '𝁟', 3293 => '𝁠', 3294 => '𝁡', 3295 => '𝁢', 3296 => '𝁣', 3297 => '𝁤', 3298 => '𝁥', 3299 => '𝁦', 3300 => '𝁧', 3301 => '𝁨', 3302 => '𝁩', 3303 => '𝁪', 3304 => '𝁫', 3305 => '𝁬', 3306 => '𝁭', 3307 => '𝁮', 3308 => '𝁯', 3309 => '𝁰', 3310 => '𝁱', 3311 => '𝁲', 3312 => '𝁳', 3313 => '𝁴', 3314 => '𝁵', 3315 => '𝁶', 3316 => '𝁷', 3317 => '𝁸', 3318 => '𝁹', 3319 => '𝁺', 3320 => '𝁻', 3321 => '𝁼', 3322 => '𝁽', 3323 => '𝁾', 3324 => '𝁿', 3325 => '𝂀', 3326 => '𝂁', 3327 => '𝂂', 3328 => '𝂃', 3329 => '𝂄', 3330 => '𝂅', 3331 => '𝂆', 3332 => '𝂇', 3333 => '𝂈', 3334 => '𝂉', 3335 => '𝂊', 3336 => '𝂋', 3337 => '𝂌', 3338 => '𝂍', 3339 => '𝂎', 3340 => '𝂏', 3341 => '𝂐', 3342 => '𝂑', 3343 => '𝂒', 3344 => '𝂓', 3345 => '𝂔', 3346 => '𝂕', 3347 => '𝂖', 3348 => '𝂗', 3349 => '𝂘', 3350 => '𝂙', 3351 => '𝂚', 3352 => '𝂛', 3353 => '𝂜', 3354 => '𝂝', 3355 => '𝂞', 3356 => '𝂟', 3357 => '𝂠', 3358 => '𝂡', 3359 => '𝂢', 3360 => '𝂣', 3361 => '𝂤', 3362 => '𝂥', 3363 => '𝂦', 3364 => '𝂧', 3365 => '𝂨', 3366 => '𝂩', 3367 => '𝂪', 3368 => '𝂫', 3369 => '𝂬', 3370 => '𝂭', 3371 => '𝂮', 3372 => '𝂯', 3373 => '𝂰', 3374 => '𝂱', 3375 => '𝂲', 3376 => '𝂳', 3377 => '𝂴', 3378 => '𝂵', 3379 => '𝂶', 3380 => '𝂷', 3381 => '𝂸', 3382 => '𝂹', 3383 => '𝂺', 3384 => '𝂻', 3385 => '𝂼', 3386 => '𝂽', 3387 => '𝂾', 3388 => '𝂿', 3389 => '𝃀', 3390 => '𝃁', 3391 => '𝃂', 3392 => '𝃃', 3393 => '𝃄', 3394 => '𝃅', 3395 => '𝃆', 3396 => '𝃇', 3397 => '𝃈', 3398 => '𝃉', 3399 => '𝃊', 3400 => '𝃋', 3401 => '𝃌', 3402 => '𝃍', 3403 => '𝃎', 3404 => '𝃏', 3405 => '𝃐', 3406 => '𝃑', 3407 => '𝃒', 3408 => '𝃓', 3409 => '𝃔', 3410 => '𝃕', 3411 => '𝃖', 3412 => '𝃗', 3413 => '𝃘', 3414 => '𝃙', 3415 => '𝃚', 3416 => '𝃛', 3417 => '𝃜', 3418 => '𝃝', 3419 => '𝃞', 3420 => '𝃟', 3421 => '𝃠', 3422 => '𝃡', 3423 => '𝃢', 3424 => '𝃣', 3425 => '𝃤', 3426 => '𝃥', 3427 => '𝃦', 3428 => '𝃧', 3429 => '𝃨', 3430 => '𝃩', 3431 => '𝃪', 3432 => '𝃫', 3433 => '𝃬', 3434 => '𝃭', 3435 => '𝃮', 3436 => '𝃯', 3437 => '𝃰', 3438 => '𝃱', 3439 => '𝃲', 3440 => '𝃳', 3441 => '𝃴', 3442 => '𝃵', 3443 => '𝄀', 3444 => '𝄁', 3445 => '𝄂', 3446 => '𝄃', 3447 => '𝄄', 3448 => '𝄅', 3449 => '𝄆', 3450 => '𝄇', 3451 => '𝄈', 3452 => '𝄉', 3453 => '𝄊', 3454 => '𝄋', 3455 => '𝄌', 3456 => '𝄍', 3457 => '𝄎', 3458 => '𝄏', 3459 => '𝄐', 3460 => '𝄑', 3461 => '𝄒', 3462 => '𝄓', 3463 => '𝄔', 3464 => '𝄕', 3465 => '𝄖', 3466 => '𝄗', 3467 => '𝄘', 3468 => '𝄙', 3469 => '𝄚', 3470 => '𝄛', 3471 => '𝄜', 3472 => '𝄝', 3473 => '𝄞', 3474 => '𝄟', 3475 => '𝄠', 3476 => '𝄡', 3477 => '𝄢', 3478 => '𝄣', 3479 => '𝄤', 3480 => '𝄥', 3481 => '𝄦', 3482 => '♭', 3483 => '♮', 3484 => '♯', 3485 => '𝄪', 3486 => '𝄫', 3487 => '𝄬', 3488 => '𝄭', 3489 => '𝄮', 3490 => '𝄯', 3491 => '𝄰', 3492 => '𝄱', 3493 => '𝄲', 3494 => '𝄳', 3495 => '𝄴', 3496 => '𝄵', 3497 => '𝄶', 3498 => '𝄷', 3499 => '𝄸', 3500 => '𝄹', 3501 => '𝄩', 3502 => '𝄺', 3503 => '𝄻', 3504 => '𝄼', 3505 => '𝄽', 3506 => '𝄾', 3507 => '𝄿', 3508 => '𝅀', 3509 => '𝅁', 3510 => '𝅂', 3511 => '𝅃', 3512 => '𝅄', 3513 => '𝅅', 3514 => '𝅆', 3515 => '𝅇', 3516 => '𝅈', 3517 => '𝅉', 3518 => '𝅊', 3519 => '𝅋', 3520 => '𝅌', 3521 => '𝅍', 3522 => '𝅎', 3523 => '𝅏', 3524 => '𝅐', 3525 => '𝅑', 3526 => '𝅒', 3527 => '𝅓', 3528 => '𝅔', 3529 => '𝅕', 3530 => '𝅖', 3531 => '𝅗', 3532 => '𝅘', 3533 => '𝅙', 3534 => '𝅚', 3535 => '𝅛', 3536 => '𝅜', 3537 => '𝅝', 3538 => '𝅪', 3539 => '𝅫', 3540 => '𝅬', 3541 => '𝆃', 3542 => '𝆄', 3543 => '𝆌', 3544 => '𝆍', 3545 => '𝆎', 3546 => '𝆏', 3547 => '𝆐', 3548 => '𝆑', 3549 => '𝆒', 3550 => '𝆓', 3551 => '𝆔', 3552 => '𝆕', 3553 => '𝆖', 3554 => '𝆗', 3555 => '𝆘', 3556 => '𝆙', 3557 => '𝆚', 3558 => '𝆛', 3559 => '𝆜', 3560 => '𝆝', 3561 => '𝆞', 3562 => '𝆟', 3563 => '𝆠', 3564 => '𝆡', 3565 => '𝆢', 3566 => '𝆣', 3567 => '𝆤', 3568 => '𝆥', 3569 => '𝆦', 3570 => '𝆧', 3571 => '𝆨', 3572 => '𝆩', 3573 => '𝆮', 3574 => '𝆯', 3575 => '𝆰', 3576 => '𝆱', 3577 => '𝆲', 3578 => '𝆳', 3579 => '𝆴', 3580 => '𝆵', 3581 => '𝆶', 3582 => '𝆷', 3583 => '𝆸', 3584 => '𝆹', 3585 => '𝆺', 3586 => '𝇁', 3587 => '𝇂', 3588 => '𝇃', 3589 => '𝇄', 3590 => '𝇅', 3591 => '𝇆', 3592 => '𝇇', 3593 => '𝇈', 3594 => '𝇉', 3595 => '𝇊', 3596 => '𝇋', 3597 => '𝇌', 3598 => '𝇍', 3599 => '𝇎', 3600 => '𝇏', 3601 => '𝇐', 3602 => '𝇑', 3603 => '𝇒', 3604 => '𝇓', 3605 => '𝇔', 3606 => '𝇕', 3607 => '𝇖', 3608 => '𝇗', 3609 => '𝇘', 3610 => '𝇙', 3611 => '𝇚', 3612 => '𝇛', 3613 => '𝇜', 3614 => '𝇝', 3615 => '𝈀', 3616 => '𝈁', 3617 => '𝈂', 3618 => '𝈃', 3619 => '𝈄', 3620 => '𝈅', 3621 => '𝈆', 3622 => '𝈇', 3623 => '𝈈', 3624 => '𝈉', 3625 => '𝈊', 3626 => '𝈋', 3627 => '𝈌', 3628 => '𝈍', 3629 => '𝈎', 3630 => '𝈏', 3631 => '𝈐', 3632 => '𝈑', 3633 => '𝈒', 3634 => '𝈓', 3635 => '𝈔', 3636 => '𝈕', 3637 => '𝈖', 3638 => '𝈗', 3639 => '𝈘', 3640 => '𝈙', 3641 => '𝈚', 3642 => '𝈛', 3643 => '𝈜', 3644 => '𝈝', 3645 => '𝈞', 3646 => '𝈟', 3647 => '𝈠', 3648 => '𝈡', 3649 => '𝈢', 3650 => '𝈣', 3651 => '𝈤', 3652 => '𝈥', 3653 => '𝈦', 3654 => '𝈧', 3655 => '𝈨', 3656 => '𝈩', 3657 => '𝈪', 3658 => '𝈫', 3659 => '𝈬', 3660 => '𝈭', 3661 => '𝈮', 3662 => '𝈯', 3663 => '𝈰', 3664 => '𝈱', 3665 => '𝈲', 3666 => '𝈳', 3667 => '𝈴', 3668 => '𝈵', 3669 => '𝈶', 3670 => '𝈷', 3671 => '𝈸', 3672 => '𝈹', 3673 => '𝈺', 3674 => '𝈻', 3675 => '𝈼', 3676 => '𝈽', 3677 => '𝈾', 3678 => '𝈿', 3679 => '𝉀', 3680 => '𝉁', 3681 => '𝉅', 3682 => '🀀', 3683 => '🀁', 3684 => '🀂', 3685 => '🀃', 3686 => '🀄', 3687 => '🀅', 3688 => '🀆', 3689 => '🀇', 3690 => '🀈', 3691 => '🀉', 3692 => '🀊', 3693 => '🀋', 3694 => '🀌', 3695 => '🀍', 3696 => '🀎', 3697 => '🀏', 3698 => '🀐', 3699 => '🀑', 3700 => '🀒', 3701 => '🀓', 3702 => '🀔', 3703 => '🀕', 3704 => '🀖', 3705 => '🀗', 3706 => '🀘', 3707 => '🀙', 3708 => '🀚', 3709 => '🀛', 3710 => '🀜', 3711 => '🀝', 3712 => '🀞', 3713 => '🀟', 3714 => '🀠', 3715 => '🀡', 3716 => '🀢', 3717 => '🀣', 3718 => '🀤', 3719 => '🀥', 3720 => '🀦', 3721 => '🀧', 3722 => '🀨', 3723 => '🀩', 3724 => '🀪', 3725 => '🀫', 3726 => '🀰', 3727 => '🀱', 3728 => '🀲', 3729 => '🀳', 3730 => '🀴', 3731 => '🀵', 3732 => '🀶', 3733 => '🀷', 3734 => '🀸', 3735 => '🀹', 3736 => '🀺', 3737 => '🀻', 3738 => '🀼', 3739 => '🀽', 3740 => '🀾', 3741 => '🀿', 3742 => '🁀', 3743 => '🁁', 3744 => '🁂', 3745 => '🁃', 3746 => '🁄', 3747 => '🁅', 3748 => '🁆', 3749 => '🁇', 3750 => '🁈', 3751 => '🁉', 3752 => '🁊', 3753 => '🁋', 3754 => '🁌', 3755 => '🁍', 3756 => '🁎', 3757 => '🁏', 3758 => '🁐', 3759 => '🁑', 3760 => '🁒', 3761 => '🁓', 3762 => '🁔', 3763 => '🁕', 3764 => '🁖', 3765 => '🁗', 3766 => '🁘', 3767 => '🁙', 3768 => '🁚', 3769 => '🁛', 3770 => '🁜', 3771 => '🁝', 3772 => '🁞', 3773 => '🁟', 3774 => '🁠', 3775 => '🁡', 3776 => '🁢', 3777 => '🁣', 3778 => '🁤', 3779 => '🁥', 3780 => '🁦', 3781 => '🁧', 3782 => '🁨', 3783 => '🁩', 3784 => '🁪', 3785 => '🁫', 3786 => '🁬', 3787 => '🁭', 3788 => '🁮', 3789 => '🁯', 3790 => '🁰', 3791 => '🁱', 3792 => '🁲', 3793 => '🁳', 3794 => '🁴', 3795 => '🁵', 3796 => '🁶', 3797 => '🁷', 3798 => '🁸', 3799 => '🁹', 3800 => '🁺', 3801 => '🁻', 3802 => '🁼', 3803 => '🁽', 3804 => '🁾', 3805 => '🁿', 3806 => '🂀', 3807 => '🂁', 3808 => '🂂', 3809 => '🂃', 3810 => '🂄', 3811 => '🂅', 3812 => '🂆', 3813 => '🂇', 3814 => '🂈', 3815 => '🂉', 3816 => '🂊', 3817 => '🂋', 3818 => '🂌', 3819 => '🂍', 3820 => '🂎', 3821 => '🂏', 3822 => '🂐', 3823 => '🂑', 3824 => '🂒', 3825 => '🂓', 3826 => '🂠', 3827 => '🂡', 3828 => '🂢', 3829 => '🂣', 3830 => '🂤', 3831 => '🂥', 3832 => '🂦', 3833 => '🂧', 3834 => '🂨', 3835 => '🂩', 3836 => '🂪', 3837 => '🂫', 3838 => '🂬', 3839 => '🂭', 3840 => '🂮', 3841 => '🂱', 3842 => '🂲', 3843 => '🂳', 3844 => '🂴', 3845 => '🂵', 3846 => '🂶', 3847 => '🂷', 3848 => '🂸', 3849 => '🂹', 3850 => '🂺', 3851 => '🂻', 3852 => '🂼', 3853 => '🂽', 3854 => '🂾', 3855 => '🃁', 3856 => '🃂', 3857 => '🃃', 3858 => '🃄', 3859 => '🃅', 3860 => '🃆', 3861 => '🃇', 3862 => '🃈', 3863 => '🃉', 3864 => '🃊', 3865 => '🃋', 3866 => '🃌', 3867 => '🃍', 3868 => '🃎', 3869 => '🃏', 3870 => '🃑', 3871 => '🃒', 3872 => '🃓', 3873 => '🃔', 3874 => '🃕', 3875 => '🃖', 3876 => '🃗', 3877 => '🃘', 3878 => '🃙', 3879 => '🃚', 3880 => '🃛', 3881 => '🃜', 3882 => '🃝', 3883 => '🃞', 3884 => '🃟', 3885 => '🌀', 3886 => '🌁', 3887 => '🌂', 3888 => '🌃', 3889 => '🌄', 3890 => '🌅', 3891 => '🌆', 3892 => '🌇', 3893 => '🌈', 3894 => '🌉', 3895 => '🌊', 3896 => '🌋', 3897 => '🌌', 3898 => '🌍', 3899 => '🌎', 3900 => '🌏', 3901 => '🌐', 3902 => '🌑', 3903 => '🌒', 3904 => '🌓', 3905 => '🌔', 3906 => '🌕', 3907 => '🌖', 3908 => '🌗', 3909 => '🌘', 3910 => '🌙', 3911 => '🌚', 3912 => '🌛', 3913 => '🌜', 3914 => '🌝', 3915 => '🌞', 3916 => '🌟', 3917 => '🌠', 3918 => '🌰', 3919 => '🌱', 3920 => '🌲', 3921 => '🌳', 3922 => '🌴', 3923 => '🌵', 3924 => '🌷', 3925 => '🌸', 3926 => '🌹', 3927 => '🌺', 3928 => '🌻', 3929 => '🌼', 3930 => '🌽', 3931 => '🌾', 3932 => '🌿', 3933 => '🍀', 3934 => '🍁', 3935 => '🍂', 3936 => '🍃', 3937 => '🍄', 3938 => '🍅', 3939 => '🍆', 3940 => '🍇', 3941 => '🍈', 3942 => '🍉', 3943 => '🍊', 3944 => '🍋', 3945 => '🍌', 3946 => '🍍', 3947 => '🍎', 3948 => '🍏', 3949 => '🍐', 3950 => '🍑', 3951 => '🍒', 3952 => '🍓', 3953 => '🍔', 3954 => '🍕', 3955 => '🍖', 3956 => '🍗', 3957 => '🍘', 3958 => '🍙', 3959 => '🍚', 3960 => '🍛', 3961 => '🍜', 3962 => '🍝', 3963 => '🍞', 3964 => '🍟', 3965 => '🍠', 3966 => '🍡', 3967 => '🍢', 3968 => '🍣', 3969 => '🍤', 3970 => '🍥', 3971 => '🍦', 3972 => '🍧', 3973 => '🍨', 3974 => '🍩', 3975 => '🍪', 3976 => '🍫', 3977 => '🍬', 3978 => '🍭', 3979 => '🍮', 3980 => '🍯', 3981 => '🍰', 3982 => '🍱', 3983 => '🍲', 3984 => '🍳', 3985 => '🍴', 3986 => '🍵', 3987 => '🍶', 3988 => '🍷', 3989 => '🍸', 3990 => '🍹', 3991 => '🍺', 3992 => '🍻', 3993 => '🍼', 3994 => '🎀', 3995 => '🎁', 3996 => '🎂', 3997 => '🎃', 3998 => '🎄', 3999 => '🎅', 4000 => '🎆', 4001 => '🎇', 4002 => '🎈', 4003 => '🎉', 4004 => '🎊', 4005 => '🎋', 4006 => '🎌', 4007 => '🎍', 4008 => '🎎', 4009 => '🎏', 4010 => '🎐', 4011 => '🎑', 4012 => '🎒', 4013 => '🎓', 4014 => '🎠', 4015 => '🎡', 4016 => '🎢', 4017 => '🎣', 4018 => '🎤', 4019 => '🎥', 4020 => '🎦', 4021 => '🎧', 4022 => '🎨', 4023 => '🎩', 4024 => '🎪', 4025 => '🎫', 4026 => '🎬', 4027 => '🎭', 4028 => '🎮', 4029 => '🎯', 4030 => '🎰', 4031 => '🎱', 4032 => '🎲', 4033 => '🎳', 4034 => '🎴', 4035 => '🎵', 4036 => '🎶', 4037 => '🎷', 4038 => '🎸', 4039 => '🎹', 4040 => '🎺', 4041 => '🎻', 4042 => '🎼', 4043 => '🎽', 4044 => '🎾', 4045 => '🎿', 4046 => '🏀', 4047 => '🏁', 4048 => '🏂', 4049 => '🏃', 4050 => '🏄', 4051 => '🏆', 4052 => '🏇', 4053 => '🏈', 4054 => '🏉', 4055 => '🏊', 4056 => '🏠', 4057 => '🏡', 4058 => '🏢', 4059 => '🏣', 4060 => '🏤', 4061 => '🏥', 4062 => '🏦', 4063 => '🏧', 4064 => '🏨', 4065 => '🏩', 4066 => '🏪', 4067 => '🏫', 4068 => '🏬', 4069 => '🏭', 4070 => '🏮', 4071 => '🏯', 4072 => '🏰', 4073 => '🐀', 4074 => '🐁', 4075 => '🐂', 4076 => '🐃', 4077 => '🐄', 4078 => '🐅', 4079 => '🐆', 4080 => '🐇', 4081 => '🐈', 4082 => '🐉', 4083 => '🐊', 4084 => '🐋', 4085 => '🐌', 4086 => '🐍', 4087 => '🐎', 4088 => '🐏', 4089 => '🐐', 4090 => '🐑', 4091 => '🐒', 4092 => '🐓', 4093 => '🐔', 4094 => '🐕', 4095 => '🐖', 4096 => '🐗', 4097 => '🐘', 4098 => '🐙', 4099 => '🐚', 4100 => '🐛', 4101 => '🐜', 4102 => '🐝', 4103 => '🐞', 4104 => '🐟', 4105 => '🐠', 4106 => '🐡', 4107 => '🐢', 4108 => '🐣', 4109 => '🐤', 4110 => '🐥', 4111 => '🐦', 4112 => '🐧', 4113 => '🐨', 4114 => '🐩', 4115 => '🐪', 4116 => '🐫', 4117 => '🐬', 4118 => '🐭', 4119 => '🐮', 4120 => '🐯', 4121 => '🐰', 4122 => '🐱', 4123 => '🐲', 4124 => '🐳', 4125 => '🐴', 4126 => '🐵', 4127 => '🐶', 4128 => '🐷', 4129 => '🐸', 4130 => '🐹', 4131 => '🐺', 4132 => '🐻', 4133 => '🐼', 4134 => '🐽', 4135 => '🐾', 4136 => '👀', 4137 => '👂', 4138 => '👃', 4139 => '👄', 4140 => '👅', 4141 => '👆', 4142 => '👇', 4143 => '👈', 4144 => '👉', 4145 => '👊', 4146 => '👋', 4147 => '👌', 4148 => '👍', 4149 => '👎', 4150 => '👏', 4151 => '👐', 4152 => '👑', 4153 => '👒', 4154 => '👓', 4155 => '👔', 4156 => '👕', 4157 => '👖', 4158 => '👗', 4159 => '👘', 4160 => '👙', 4161 => '👚', 4162 => '👛', 4163 => '👜', 4164 => '👝', 4165 => '👞', 4166 => '👟', 4167 => '👠', 4168 => '👡', 4169 => '👢', 4170 => '👣', 4171 => '👤', 4172 => '👥', 4173 => '👦', 4174 => '👧', 4175 => '👨', 4176 => '👩', 4177 => '👪', 4178 => '👫', 4179 => '👬', 4180 => '👭', 4181 => '👮', 4182 => '👯', 4183 => '👰', 4184 => '👱', 4185 => '👲', 4186 => '👳', 4187 => '👴', 4188 => '👵', 4189 => '👶', 4190 => '👷', 4191 => '👸', 4192 => '👹', 4193 => '👺', 4194 => '👻', 4195 => '👼', 4196 => '👽', 4197 => '👾', 4198 => '👿', 4199 => '💀', 4200 => '💁', 4201 => '💂', 4202 => '💃', 4203 => '💄', 4204 => '💅', 4205 => '💆', 4206 => '💇', 4207 => '💈', 4208 => '💉', 4209 => '💊', 4210 => '💋', 4211 => '💌', 4212 => '💍', 4213 => '💎', 4214 => '💏', 4215 => '💐', 4216 => '💑', 4217 => '💒', 4218 => '💓', 4219 => '💔', 4220 => '💕', 4221 => '💖', 4222 => '💗', 4223 => '💘', 4224 => '💙', 4225 => '💚', 4226 => '💛', 4227 => '💜', 4228 => '💝', 4229 => '💞', 4230 => '💟', 4231 => '💠', 4232 => '💡', 4233 => '💢', 4234 => '💣', 4235 => '💤', 4236 => '💥', 4237 => '💦', 4238 => '💧', 4239 => '💨', 4240 => '💩', 4241 => '💪', 4242 => '💫', 4243 => '💬', 4244 => '💭', 4245 => '💮', 4246 => '💯', 4247 => '💰', 4248 => '💱', 4249 => '💲', 4250 => '💳', 4251 => '💴', 4252 => '💵', 4253 => '💶', 4254 => '💷', 4255 => '💸', 4256 => '💹', 4257 => '💺', 4258 => '💻', 4259 => '💼', 4260 => '💽', 4261 => '💾', 4262 => '💿', 4263 => '📀', 4264 => '📁', 4265 => '📂', 4266 => '📃', 4267 => '📄', 4268 => '📅', 4269 => '📆', 4270 => '📇', 4271 => '📈', 4272 => '📉', 4273 => '📊', 4274 => '📋', 4275 => '📌', 4276 => '📍', 4277 => '📎', 4278 => '📏', 4279 => '📐', 4280 => '📑', 4281 => '📒', 4282 => '📓', 4283 => '📔', 4284 => '📕', 4285 => '📖', 4286 => '📗', 4287 => '📘', 4288 => '📙', 4289 => '📚', 4290 => '📛', 4291 => '📜', 4292 => '📝', 4293 => '📞', 4294 => '📟', 4295 => '📠', 4296 => '📡', 4297 => '📢', 4298 => '📣', 4299 => '📤', 4300 => '📥', 4301 => '📦', 4302 => '📧', 4303 => '📨', 4304 => '📩', 4305 => '📪', 4306 => '📫', 4307 => '📬', 4308 => '📭', 4309 => '📮', 4310 => '📯', 4311 => '📰', 4312 => '📱', 4313 => '📲', 4314 => '📳', 4315 => '📴', 4316 => '📵', 4317 => '📶', 4318 => '📷', 4319 => '📹', 4320 => '📺', 4321 => '📻', 4322 => '📼', 4323 => '🔀', 4324 => '🔁', 4325 => '🔂', 4326 => '🔃', 4327 => '🔄', 4328 => '🔅', 4329 => '🔆', 4330 => '🔇', 4331 => '🔈', 4332 => '🔉', 4333 => '🔊', 4334 => '🔋', 4335 => '🔌', 4336 => '🔍', 4337 => '🔎', 4338 => '🔏', 4339 => '🔐', 4340 => '🔑', 4341 => '🔒', 4342 => '🔓', 4343 => '🔔', 4344 => '🔕', 4345 => '🔖', 4346 => '🔗', 4347 => '🔘', 4348 => '🔙', 4349 => '🔚', 4350 => '🔛', 4351 => '🔜', 4352 => '🔝', 4353 => '🔞', 4354 => '🔟', 4355 => '🔠', 4356 => '🔡', 4357 => '🔢', 4358 => '🔣', 4359 => '🔤', 4360 => '🔥', 4361 => '🔦', 4362 => '🔧', 4363 => '🔨', 4364 => '🔩', 4365 => '🔪', 4366 => '🔫', 4367 => '🔬', 4368 => '🔭', 4369 => '🔮', 4370 => '🔯', 4371 => '🔰', 4372 => '🔱', 4373 => '🔲', 4374 => '🔳', 4375 => '🔴', 4376 => '🔵', 4377 => '🔶', 4378 => '🔷', 4379 => '🔸', 4380 => '🔹', 4381 => '🔺', 4382 => '🔻', 4383 => '🔼', 4384 => '🔽', 4385 => '🕐', 4386 => '🕑', 4387 => '🕒', 4388 => '🕓', 4389 => '🕔', 4390 => '🕕', 4391 => '🕖', 4392 => '🕗', 4393 => '🕘', 4394 => '🕙', 4395 => '🕚', 4396 => '🕛', 4397 => '🕜', 4398 => '🕝', 4399 => '🕞', 4400 => '🕟', 4401 => '🕠', 4402 => '🕡', 4403 => '🕢', 4404 => '🕣', 4405 => '🕤', 4406 => '🕥', 4407 => '🕦', 4408 => '🕧', 4409 => '🗻', 4410 => '🗼', 4411 => '🗽', 4412 => '🗾', 4413 => '🗿', 4414 => '😁', 4415 => '😂', 4416 => '😃', 4417 => '😄', 4418 => '😅', 4419 => '😆', 4420 => '😇', 4421 => '😈', 4422 => '😉', 4423 => '😊', 4424 => '😋', 4425 => '😌', 4426 => '😍', 4427 => '😎', 4428 => '😏', 4429 => '😐', 4430 => '😒', 4431 => '😓', 4432 => '😔', 4433 => '😖', 4434 => '😘', 4435 => '😚', 4436 => '😜', 4437 => '😝', 4438 => '😞', 4439 => '😠', 4440 => '😡', 4441 => '😢', 4442 => '😣', 4443 => '😤', 4444 => '😥', 4445 => '😨', 4446 => '😩', 4447 => '😪', 4448 => '😫', 4449 => '😭', 4450 => '😰', 4451 => '😱', 4452 => '😲', 4453 => '😳', 4454 => '😵', 4455 => '😶', 4456 => '😷', 4457 => '😸', 4458 => '😹', 4459 => '😺', 4460 => '😻', 4461 => '😼', 4462 => '😽', 4463 => '😾', 4464 => '😿', 4465 => '🙀', 4466 => '🙅', 4467 => '🙆', 4468 => '🙇', 4469 => '🙈', 4470 => '🙉', 4471 => '🙊', 4472 => '🙋', 4473 => '🙌', 4474 => '🙍', 4475 => '🙎', 4476 => '🙏', 4477 => '🚀', 4478 => '🚁', 4479 => '🚂', 4480 => '🚃', 4481 => '🚄', 4482 => '🚅', 4483 => '🚆', 4484 => '🚇', 4485 => '🚈', 4486 => '🚉', 4487 => '🚊', 4488 => '🚋', 4489 => '🚌', 4490 => '🚍', 4491 => '🚎', 4492 => '🚏', 4493 => '🚐', 4494 => '🚑', 4495 => '🚒', 4496 => '🚓', 4497 => '🚔', 4498 => '🚕', 4499 => '🚖', 4500 => '🚗', 4501 => '🚘', 4502 => '🚙', 4503 => '🚚', 4504 => '🚛', 4505 => '🚜', 4506 => '🚝', 4507 => '🚞', 4508 => '🚟', 4509 => '🚠', 4510 => '🚡', 4511 => '🚢', 4512 => '🚣', 4513 => '🚤', 4514 => '🚥', 4515 => '🚦', 4516 => '🚧', 4517 => '🚨', 4518 => '🚩', 4519 => '🚪', 4520 => '🚫', 4521 => '🚬', 4522 => '🚭', 4523 => '🚮', 4524 => '🚯', 4525 => '🚰', 4526 => '🚱', 4527 => '🚲', 4528 => '🚳', 4529 => '🚴', 4530 => '🚵', 4531 => '🚶', 4532 => '🚷', 4533 => '🚸', 4534 => '🚹', 4535 => '🚺', 4536 => '🚻', 4537 => '🚼', 4538 => '🚽', 4539 => '🚾', 4540 => '🚿', 4541 => '🛀', 4542 => '🛁', 4543 => '🛂', 4544 => '🛃', 4545 => '🛄', 4546 => '🛅', 4547 => '🜀', 4548 => '🜁', 4549 => '🜂', 4550 => '🜃', 4551 => '🜄', 4552 => '🜅', 4553 => '🜆', 4554 => '🜇', 4555 => '🜈', 4556 => '🜉', 4557 => '🜊', 4558 => '🜋', 4559 => '🜌', 4560 => '🜍', 4561 => '🜎', 4562 => '🜏', 4563 => '🜐', 4564 => '🜑', 4565 => '🜒', 4566 => '🜓', 4567 => '🜔', 4568 => '🜕', 4569 => '🜖', 4570 => '🜗', 4571 => '🜘', 4572 => '🜙', 4573 => '🜚', 4574 => '🜛', 4575 => '🜜', 4576 => '🜝', 4577 => '🜞', 4578 => '🜟', 4579 => '🜠', 4580 => '🜡', 4581 => '🜢', 4582 => '🜣', 4583 => '🜤', 4584 => '🜥', 4585 => '🜦', 4586 => '🜧', 4587 => '🜨', 4588 => '🜩', 4589 => '🜪', 4590 => '🜫', 4591 => '🜬', 4592 => '🜭', 4593 => '🜮', 4594 => '🜯', 4595 => '🜰', 4596 => '🜱', 4597 => '🜲', 4598 => '🜳', 4599 => '🜴', 4600 => '🜵', 4601 => '🜶', 4602 => '🜷', 4603 => '🜸', 4604 => '🜹', 4605 => '🜺', 4606 => '🜻', 4607 => '🜼', 4608 => '🜽', 4609 => '🜾', 4610 => '🜿', 4611 => '🝀', 4612 => '🝁', 4613 => '🝂', 4614 => '🝃', 4615 => '🝄', 4616 => '🝅', 4617 => '🝆', 4618 => '🝇', 4619 => '🝈', 4620 => '🝉', 4621 => '🝊', 4622 => '🝋', 4623 => '🝌', 4624 => '🝍', 4625 => '🝎', 4626 => '🝏', 4627 => '🝐', 4628 => '🝑', 4629 => '🝒', 4630 => '🝓', 4631 => '🝔', 4632 => '🝕', 4633 => '🝖', 4634 => '🝗', 4635 => '🝘', 4636 => '🝙', 4637 => '🝚', 4638 => '🝛', 4639 => '🝜', 4640 => '🝝', 4641 => '🝞', 4642 => '🝟', 4643 => '🝠', 4644 => '🝡', 4645 => '🝢', 4646 => '🝣', 4647 => '🝤', 4648 => '🝥', 4649 => '🝦', 4650 => '🝧', 4651 => '🝨', 4652 => '🝩', 4653 => '🝪', 4654 => '🝫', 4655 => '🝬', 4656 => '🝭', 4657 => '🝮', 4658 => '🝯', 4659 => '🝰', 4660 => '🝱', 4661 => '🝲', 4662 => '🝳', 4663 => '㆐', 4664 => '㆑', 4665 => '', 4666 => '�', 4667 => '৴', 4668 => '৵', 4669 => '৶', 4670 => '৷', 4671 => '৸', 4672 => '৹', 4673 => '୲', 4674 => '୳', 4675 => '୴', 4676 => '୵', 4677 => '୶', 4678 => '୷', 4679 => '꠰', 4680 => '꠱', 4681 => '꠲', 4682 => '꠳', 4683 => '꠴', 4684 => '꠵', 4685 => '௰', 4686 => '௱', 4687 => '௲', 4688 => '൰', 4689 => '൱', 4690 => '൲', 4691 => '൳', 4692 => '൴', 4693 => '൵', 4694 => '፲', 4695 => '፳', 4696 => '፴', 4697 => '፵', 4698 => '፶', 4699 => '፷', 4700 => '፸', 4701 => '፹', 4702 => '፺', 4703 => '፻', 4704 => '፼', 4705 => 'ↀ', 4706 => 'ↁ', 4707 => 'ↂ', 4708 => 'ↆ', 4709 => 'ↇ', 4710 => 'ↈ', 4711 => '𐹩', 4712 => '𐹪', 4713 => '𐹫', 4714 => '𐹬', 4715 => '𐹭', 4716 => '𐹮', 4717 => '𐹯', 4718 => '𐹰', 4719 => '𐹱', 4720 => '𐹲', 4721 => '𐹳', 4722 => '𐹴', 4723 => '𐹵', 4724 => '𐹶', 4725 => '𐹷', 4726 => '𐹸', 4727 => '𐹹', 4728 => '𐹺', 4729 => '𐹻', 4730 => '𐹼', 4731 => '𐹽', 4732 => '𐹾', 4733 => '⳽', 4734 => '𐌢', 4735 => '𐌣', 4736 => '𐄐', 4737 => '𐄑', 4738 => '𐄒', 4739 => '𐄓', 4740 => '𐄔', 4741 => '𐄕', 4742 => '𐄖', 4743 => '𐄗', 4744 => '𐄘', 4745 => '𐄙', 4746 => '𐄚', 4747 => '𐄛', 4748 => '𐄜', 4749 => '𐄝', 4750 => '𐄞', 4751 => '𐄟', 4752 => '𐄠', 4753 => '𐄡', 4754 => '𐄢', 4755 => '𐄣', 4756 => '𐄤', 4757 => '𐄥', 4758 => '𐄦', 4759 => '𐄧', 4760 => '𐄨', 4761 => '𐄩', 4762 => '𐄪', 4763 => '𐄫', 4764 => '𐄬', 4765 => '𐄭', 4766 => '𐄮', 4767 => '𐄯', 4768 => '𐄰', 4769 => '𐄱', 4770 => '𐄲', 4771 => '𐄳', 4772 => '𐅀', 4773 => '𐅁', 4774 => '𐅄', 4775 => '𐅅', 4776 => '𐅆', 4777 => '𐅇', 4778 => '𐅉', 4779 => '𐅊', 4780 => '𐅋', 4781 => '𐅌', 4782 => '𐅍', 4783 => '𐅎', 4784 => '𐅐', 4785 => '𐅑', 4786 => '𐅒', 4787 => '𐅓', 4788 => '𐅔', 4789 => '𐅕', 4790 => '𐅖', 4791 => '𐅗', 4792 => '𐅠', 4793 => '𐅡', 4794 => '𐅢', 4795 => '𐅣', 4796 => '𐅤', 4797 => '𐅥', 4798 => '𐅦', 4799 => '𐅧', 4800 => '𐅨', 4801 => '𐅩', 4802 => '𐅪', 4803 => '𐅫', 4804 => '𐅬', 4805 => '𐅭', 4806 => '𐅮', 4807 => '𐅯', 4808 => '𐅰', 4809 => '𐅱', 4810 => '𐅲', 4811 => '𐅴', 4812 => '𐅵', 4813 => '𐅶', 4814 => '𐅷', 4815 => '𐅸', 4816 => '𐏓', 4817 => '𐏔', 4818 => '𐏕', 4819 => '𐩾', 4820 => '𐩿', 4821 => '𐤗', 4822 => '𐤘', 4823 => '𐤙', 4824 => '𐡛', 4825 => '𐡜', 4826 => '𐡝', 4827 => '𐡞', 4828 => '𐡟', 4829 => '𐭜', 4830 => '𐭝', 4831 => '𐭞', 4832 => '𐭟', 4833 => '𐭼', 4834 => '𐭽', 4835 => '𐭾', 4836 => '𐭿', 4837 => '𑁛', 4838 => '𑁜', 4839 => '𑁝', 4840 => '𑁞', 4841 => '𑁟', 4842 => '𑁠', 4843 => '𑁡', 4844 => '𑁢', 4845 => '𑁣', 4846 => '𑁤', 4847 => '𑁥', 4848 => '𐩄', 4849 => '𐩅', 4850 => '𐩆', 4851 => '𐩇', 4852 => '𒐲', 4853 => '𒐳', 4854 => '𒑖', 4855 => '𒑗', 4856 => '𒑚', 4857 => '𒑛', 4858 => '𒑜', 4859 => '𒑝', 4860 => '𒑞', 4861 => '𒑟', 4862 => '𒑠', 4863 => '𒑡', 4864 => '𒑢', 4865 => '𝍩', 4866 => '𝍪', 4867 => '𝍫', 4868 => '𝍬', 4869 => '𝍭', 4870 => '𝍮', 4871 => '𝍯', 4872 => '𝍰', 4873 => '𝍱', 4874 => 'ː', 4875 => 'ˑ', 4876 => 'ॱ', 4877 => 'ๆ', 4878 => 'ໆ', 4879 => 'ᪧ', 4880 => 'ꧏ', 4881 => 'ꩰ', 4882 => 'ꫝ', 4883 => 'ゝ', 4884 => 'ー', 4885 => 'ヽ', 4886 => '¤', 4887 => '¢', 4888 => '$', 4889 => '£', 4890 => '¥', 4891 => '؋', 4892 => '৲', 4893 => '৳', 4894 => '৻', 4895 => '૱', 4896 => '꠸', 4897 => '௹', 4898 => '฿', 4899 => '៛', 4900 => '₠', 4901 => '₡', 4902 => '₢', 4903 => '₣', 4904 => '₤', 4905 => '₥', 4906 => '₦', 4907 => '₧', 4908 => '₩', 4909 => '₪', 4910 => '₫', 4911 => '€', 4912 => '₭', 4913 => '₮', 4914 => '₯', 4915 => '₰', 4916 => '₱', 4917 => '₲', 4918 => '₳', 4919 => '₴', 4920 => '₵', 4921 => '₶', 4922 => '₷', 4923 => '₸', 4924 => '₹', 4925 => '0', 4926 => '1', 4927 => '2', 4928 => '3', 4929 => '4', 4930 => '5', 4931 => '6', 4932 => '7', 4933 => '8', 4934 => '9', 4935 => 'A', 4936 => 'ᴀ', 4937 => 'Ⱥ', 4938 => 'ᶏ', 4939 => 'ᴁ', 4940 => 'ᴂ', 4941 => 'Ɐ', 4942 => 'Ɑ', 4943 => 'ᶐ', 4944 => 'Ɒ', 4945 => 'B', 4946 => 'ʙ', 4947 => 'Ƀ', 4948 => 'ᴯ', 4949 => 'ᴃ', 4950 => 'ᵬ', 4951 => 'ᶀ', 4952 => 'Ɓ', 4953 => 'Ƃ', 4954 => 'C', 4955 => 'ᴄ', 4956 => 'Ȼ', 4957 => 'Ƈ', 4958 => 'ɕ', 4959 => 'Ↄ', 4960 => 'Ꜿ', 4961 => 'D', 4962 => 'ᴅ', 4963 => 'ᴆ', 4964 => 'ᵭ', 4965 => 'ᶁ', 4966 => 'Ɖ', 4967 => 'Ɗ', 4968 => 'ᶑ', 4969 => 'Ƌ', 4970 => 'ȡ', 4971 => 'ꝱ', 4972 => 'ẟ', 4973 => 'E', 4974 => 'ᴇ', 4975 => 'Ɇ', 4976 => 'ᶒ', 4977 => 'ⱸ', 4978 => 'Ǝ', 4979 => 'ⱻ', 4980 => 'Ə', 4981 => 'ᶕ', 4982 => 'Ɛ', 4983 => 'ᶓ', 4984 => 'ɘ', 4985 => 'ɚ', 4986 => 'ɜ', 4987 => 'ᶔ', 4988 => 'ᴈ', 4989 => 'ɝ', 4990 => 'ɞ', 4991 => 'ʚ', 4992 => 'ɤ', 4993 => 'F', 4994 => 'ꜰ', 4995 => 'ᵮ', 4996 => 'ᶂ', 4997 => 'Ƒ', 4998 => 'Ⅎ', 4999 => 'ꟻ', 5000 => 'G', 5001 => 'ɡ', 5002 => 'ɢ', 5003 => 'Ǥ', 5004 => 'ᶃ', 5005 => 'Ɠ', 5006 => 'ʛ', 5007 => 'ᵷ', 5008 => 'Ꝿ', 5009 => 'Ɣ', 5010 => 'Ƣ', 5011 => 'H', 5012 => 'ʜ', 5013 => 'Ƕ', 5014 => 'ɦ', 5015 => 'Ⱨ', 5016 => 'Ⱶ', 5017 => 'Ꜧ', 5018 => 'ɧ', 5019 => 'ʻ', 5020 => 'ʽ', 5021 => 'I', 5022 => 'ı', 5023 => 'ɪ', 5024 => 'ꟾ', 5025 => 'ᴉ', 5026 => 'Ɨ', 5027 => 'ᵻ', 5028 => 'ᶖ', 5029 => 'Ɩ', 5030 => 'ᵼ', 5031 => 'J', 5032 => 'ȷ', 5033 => 'ᴊ', 5034 => 'Ɉ', 5035 => 'ʝ', 5036 => 'ɟ', 5037 => 'ʄ', 5038 => 'K', 5039 => 'ᴋ', 5040 => 'ᶄ', 5041 => 'Ƙ', 5042 => 'Ⱪ', 5043 => 'Ꝁ', 5044 => 'Ꝃ', 5045 => 'Ꝅ', 5046 => 'ʞ', 5047 => 'L', 5048 => 'ʟ', 5049 => 'Ꝇ', 5050 => 'ᴌ', 5051 => 'Ꝉ', 5052 => 'Ƚ', 5053 => 'Ⱡ', 5054 => 'Ɫ', 5055 => 'ɬ', 5056 => 'ᶅ', 5057 => 'ɭ', 5058 => 'ꞎ', 5059 => 'ȴ', 5060 => 'ꝲ', 5061 => 'ɮ', 5062 => 'Ꞁ', 5063 => 'ƛ', 5064 => 'ʎ', 5065 => 'M', 5066 => 'ᴍ', 5067 => 'ᵯ', 5068 => 'ᶆ', 5069 => 'Ɱ', 5070 => 'ꟽ', 5071 => 'ꟿ', 5072 => 'ꝳ', 5073 => 'N', 5074 => 'ɴ', 5075 => 'ᴻ', 5076 => 'ᴎ', 5077 => 'ᵰ', 5078 => 'Ɲ', 5079 => 'Ƞ', 5080 => 'Ꞑ', 5081 => 'ᶇ', 5082 => 'ɳ', 5083 => 'ȵ', 5084 => 'ꝴ', 5085 => 'Ŋ', 5086 => 'O', 5087 => 'ᴏ', 5088 => 'ᴑ', 5089 => 'ɶ', 5090 => 'ᴔ', 5091 => 'ᴓ', 5092 => 'Ɔ', 5093 => 'ᴐ', 5094 => 'ᴒ', 5095 => 'ᶗ', 5096 => 'Ꝍ', 5097 => 'ᴖ', 5098 => 'ᴗ', 5099 => 'ⱺ', 5100 => 'Ɵ', 5101 => 'Ꝋ', 5102 => 'ɷ', 5103 => 'Ȣ', 5104 => 'ᴕ', 5105 => 'P', 5106 => 'ᴘ', 5107 => 'Ᵽ', 5108 => 'Ꝑ', 5109 => 'ᵱ', 5110 => 'ᶈ', 5111 => 'Ƥ', 5112 => 'Ꝓ', 5113 => 'Ꝕ', 5114 => 'ꟼ', 5115 => 'ɸ', 5116 => 'ⱷ', 5117 => 'Q', 5118 => 'Ꝗ', 5119 => 'Ꝙ', 5120 => 'ʠ', 5121 => 'Ɋ', 5122 => 'ĸ', 5123 => 'R', 5124 => 'Ʀ', 5125 => 'Ꝛ', 5126 => 'ᴙ', 5127 => 'Ɍ', 5128 => 'ᵲ', 5129 => 'ɹ', 5130 => 'ᴚ', 5131 => 'ɺ', 5132 => 'ᶉ', 5133 => 'ɻ', 5134 => 'ⱹ', 5135 => 'ɼ', 5136 => 'Ɽ', 5137 => 'ɾ', 5138 => 'ᵳ', 5139 => 'ɿ', 5140 => 'ʁ', 5141 => 'ꝵ', 5142 => 'ꝶ', 5143 => 'Ꝝ', 5144 => 'S', 5145 => 'ꜱ', 5146 => 'ᵴ', 5147 => 'ᶊ', 5148 => 'ʂ', 5149 => 'Ȿ', 5150 => 'ẜ', 5151 => 'ẝ', 5152 => 'Ʃ', 5153 => 'ᶋ', 5154 => 'ƪ', 5155 => 'ʅ', 5156 => 'ᶘ', 5157 => 'ʆ', 5158 => 'T', 5159 => 'ᴛ', 5160 => 'Ŧ', 5161 => 'Ⱦ', 5162 => 'ᵵ', 5163 => 'ƫ', 5164 => 'Ƭ', 5165 => 'Ʈ', 5166 => 'ȶ', 5167 => 'ꝷ', 5168 => 'ʇ', 5169 => 'U', 5170 => 'ᴜ', 5171 => 'ᴝ', 5172 => 'ᴞ', 5173 => 'ᵫ', 5174 => 'Ʉ', 5175 => 'ᵾ', 5176 => 'ᶙ', 5177 => 'Ɥ', 5178 => 'ʮ', 5179 => 'ʯ', 5180 => 'Ɯ', 5181 => 'ꟺ', 5182 => 'ᴟ', 5183 => 'ɰ', 5184 => 'Ʊ', 5185 => 'ᵿ', 5186 => 'V', 5187 => 'ᴠ', 5188 => 'Ꝟ', 5189 => 'ᶌ', 5190 => 'Ʋ', 5191 => 'ⱱ', 5192 => 'ⱴ', 5193 => 'Ỽ', 5194 => 'Ʌ', 5195 => 'W', 5196 => 'ᴡ', 5197 => 'Ⱳ', 5198 => 'ʍ', 5199 => 'X', 5200 => 'ᶍ', 5201 => 'Y', 5202 => 'ʏ', 5203 => 'Ɏ', 5204 => 'Ƴ', 5205 => 'Ỿ', 5206 => 'Z', 5207 => 'ᴢ', 5208 => 'Ƶ', 5209 => 'ᵶ', 5210 => 'ᶎ', 5211 => 'Ȥ', 5212 => 'ʐ', 5213 => 'ʑ', 5214 => 'Ɀ', 5215 => 'Ⱬ', 5216 => 'Ꝣ', 5217 => 'Ʒ', 5218 => 'ᴣ', 5219 => 'Ƹ', 5220 => 'ᶚ', 5221 => 'ƺ', 5222 => 'ʓ', 5223 => 'Ȝ', 5224 => 'Þ', 5225 => 'Ꝥ', 5226 => 'Ꝧ', 5227 => 'Ƿ', 5228 => 'Ꝩ', 5229 => 'Ꝫ', 5230 => 'Ꝭ', 5231 => 'Ꝯ', 5232 => 'ꝸ', 5233 => 'ƻ', 5234 => 'Ꜫ', 5235 => 'Ꜭ', 5236 => 'Ꜯ', 5237 => 'Ƨ', 5238 => 'Ƽ', 5239 => 'Ƅ', 5240 => 'ʔ', 5241 => 'Ɂ', 5242 => 'ˀ', 5243 => 'ʼ', 5244 => 'ˮ', 5245 => 'ʾ', 5246 => 'Ꜣ', 5247 => 'Ꞌ', 5248 => 'ʕ', 5249 => 'ʿ', 5250 => 'ˁ', 5251 => 'ᴤ', 5252 => 'ᴥ', 5253 => 'Ꜥ', 5254 => 'ʡ', 5255 => 'ʢ', 5256 => 'ʖ', 5257 => 'ǀ', 5258 => 'ǁ', 5259 => 'ǂ', 5260 => 'ǃ', 5261 => 'ʗ', 5262 => 'ʘ', 5263 => 'ʬ', 5264 => 'ʭ', 5265 => 'Α', 5266 => 'Β', 5267 => 'Γ', 5268 => 'ᴦ', 5269 => 'Δ', 5270 => 'Ε', 5271 => 'Ϝ', 5272 => 'Ͷ', 5273 => 'Ϛ', 5274 => 'Ζ', 5275 => 'Ͱ', 5276 => 'Η', 5277 => 'Θ', 5278 => 'Ι', 5279 => 'ϳ', 5280 => 'Κ', 5281 => 'Λ', 5282 => 'ᴧ', 5283 => 'Μ', 5284 => 'Ν', 5285 => 'Ξ', 5286 => 'Ο', 5287 => 'Π', 5288 => 'ᴨ', 5289 => 'Ϻ', 5290 => 'Ϟ', 5291 => 'Ϙ', 5292 => 'Ρ', 5293 => 'ᴩ', 5294 => 'ϼ', 5295 => 'Σ', 5296 => 'Ͼ', 5297 => 'Ͻ', 5298 => 'Ͽ', 5299 => 'Τ', 5300 => 'Υ', 5301 => 'Φ', 5302 => 'Χ', 5303 => 'Ψ', 5304 => 'ᴪ', 5305 => 'Ω', 5306 => 'Ϡ', 5307 => 'Ͳ', 5308 => 'Ϸ', 5309 => 'Ⲁ', 5310 => 'Ⲃ', 5311 => 'Ⲅ', 5312 => 'Ⲇ', 5313 => 'Ⲉ', 5314 => 'Ⲷ', 5315 => 'Ⲋ', 5316 => 'Ⲍ', 5317 => 'Ⲏ', 5318 => 'Ⲑ', 5319 => 'Ⲓ', 5320 => 'Ⲕ', 5321 => 'Ⲹ', 5322 => 'Ⲗ', 5323 => 'Ⲙ', 5324 => 'Ⲛ', 5325 => 'Ⲻ', 5326 => 'Ⲽ', 5327 => 'Ⲝ', 5328 => 'Ⲟ', 5329 => 'Ⲡ', 5330 => 'Ⲣ', 5331 => 'Ⲥ', 5332 => 'Ⲧ', 5333 => 'Ⲩ', 5334 => 'Ⲫ', 5335 => 'Ⲭ', 5336 => 'Ⲯ', 5337 => 'Ⲱ', 5338 => 'Ⲿ', 5339 => 'Ⳁ', 5340 => 'Ϣ', 5341 => 'Ⳬ', 5342 => 'Ⳃ', 5343 => 'Ⳅ', 5344 => 'Ⳇ', 5345 => 'Ϥ', 5346 => 'Ϧ', 5347 => 'Ⳉ', 5348 => 'Ϩ', 5349 => 'Ⳋ', 5350 => 'Ⳍ', 5351 => 'Ⳏ', 5352 => 'Ⳑ', 5353 => 'Ⳓ', 5354 => 'Ⳕ', 5355 => 'Ϫ', 5356 => 'Ⳮ', 5357 => 'Ⳗ', 5358 => 'Ϭ', 5359 => 'Ⳙ', 5360 => 'Ⳛ', 5361 => 'Ⳝ', 5362 => 'Ϯ', 5363 => 'Ⲳ', 5364 => 'Ⲵ', 5365 => 'Ⳟ', 5366 => 'Ⳡ', 5367 => 'Ⳣ', 5368 => 'А', 5369 => 'Ӑ', 5370 => 'Ӓ', 5371 => 'Ә', 5372 => 'Ӛ', 5373 => 'Ӕ', 5374 => 'Б', 5375 => 'В', 5376 => 'Г', 5377 => 'Ғ', 5378 => 'Ӻ', 5379 => 'Ҕ', 5380 => 'Ӷ', 5381 => 'Д', 5382 => 'Ԁ', 5383 => 'Ꚁ', 5384 => 'Ђ', 5385 => 'Ꙣ', 5386 => 'Ԃ', 5387 => 'Ѓ', 5388 => 'Ҙ', 5389 => 'Е', 5390 => 'Ӗ', 5391 => 'Є', 5392 => 'Ж', 5393 => 'Ꚅ', 5394 => 'Ӝ', 5395 => 'Җ', 5396 => 'З', 5397 => 'Ꙁ', 5398 => 'Ԅ', 5399 => 'Ԑ', 5400 => 'Ӟ', 5401 => 'Ꙃ', 5402 => 'Ѕ', 5403 => 'Ꙅ', 5404 => 'Ӡ', 5405 => 'Ꚉ', 5406 => 'Ԇ', 5407 => 'Ꚃ', 5408 => 'И', 5409 => 'Ҋ', 5410 => 'Ӥ', 5411 => 'І', 5412 => 'Ꙇ', 5413 => 'Ї', 5414 => 'Й', 5415 => 'Ј', 5416 => 'Ꙉ', 5417 => 'К', 5418 => 'Қ', 5419 => 'Ӄ', 5420 => 'Ҡ', 5421 => 'Ҟ', 5422 => 'Ҝ', 5423 => 'Ԟ', 5424 => 'Ԛ', 5425 => 'Л', 5426 => 'ᴫ', 5427 => 'Ӆ', 5428 => 'Ԓ', 5429 => 'Ԡ', 5430 => 'Љ', 5431 => 'Ꙥ', 5432 => 'Ԉ', 5433 => 'Ԕ', 5434 => 'М', 5435 => 'Ӎ', 5436 => 'Ꙧ', 5437 => 'Н', 5438 => 'Ӊ', 5439 => 'Ң', 5440 => 'Ӈ', 5441 => 'Ԣ', 5442 => 'Ҥ', 5443 => 'Њ', 5444 => 'Ԋ', 5445 => 'О', 5446 => 'Ӧ', 5447 => 'Ө', 5448 => 'Ӫ', 5449 => 'П', 5450 => 'Ԥ', 5451 => 'Ҧ', 5452 => 'Ҁ', 5453 => 'Р', 5454 => 'Ҏ', 5455 => 'Ԗ', 5456 => 'С', 5457 => 'Ԍ', 5458 => 'Ҫ', 5459 => 'Т', 5460 => 'Ꚍ', 5461 => 'Ԏ', 5462 => 'Ҭ', 5463 => 'Ꚋ', 5464 => 'Ћ', 5465 => 'Ќ', 5466 => 'У', 5467 => 'Ў', 5468 => 'Ӱ', 5469 => 'Ӳ', 5470 => 'Ү', 5471 => 'Ұ', 5472 => 'Ꙋ', 5473 => 'Ѹ', 5474 => 'Ф', 5475 => 'Х', 5476 => 'Ӽ', 5477 => 'Ӿ', 5478 => 'Ҳ', 5479 => 'Һ', 5480 => 'Ԧ', 5481 => 'Ꚕ', 5482 => 'Ѡ', 5483 => 'Ѿ', 5484 => 'Ꙍ', 5485 => 'Ѽ', 5486 => 'Ѻ', 5487 => 'Ц', 5488 => 'Ꙡ', 5489 => 'Ꚏ', 5490 => 'Ҵ', 5491 => 'Ꚑ', 5492 => 'Ч', 5493 => 'Ꚓ', 5494 => 'Ӵ', 5495 => 'Ҷ', 5496 => 'Ӌ', 5497 => 'Ҹ', 5498 => 'Ꚇ', 5499 => 'Ҽ', 5500 => 'Ҿ', 5501 => 'Џ', 5502 => 'Ш', 5503 => 'Ꚗ', 5504 => 'Щ', 5505 => 'Ꙏ', 5506 => 'ⸯ', 5507 => 'ꙿ', 5508 => 'Ъ', 5509 => 'Ꙑ', 5510 => 'Ы', 5511 => 'Ӹ', 5512 => 'Ь', 5513 => 'Ҍ', 5514 => 'Ѣ', 5515 => 'Ꙓ', 5516 => 'Э', 5517 => 'Ӭ', 5518 => 'Ю', 5519 => 'Ꙕ', 5520 => 'Ꙗ', 5521 => 'Я', 5522 => 'Ԙ', 5523 => 'Ѥ', 5524 => 'Ѧ', 5525 => 'Ꙙ', 5526 => 'Ѫ', 5527 => 'Ꙛ', 5528 => 'Ѩ', 5529 => 'Ꙝ', 5530 => 'Ѭ', 5531 => 'Ѯ', 5532 => 'Ѱ', 5533 => 'Ѳ', 5534 => 'Ѵ', 5535 => 'Ѷ', 5536 => 'Ꙟ', 5537 => 'Ҩ', 5538 => 'Ԝ', 5539 => 'Ӏ', 5540 => 'Ⰰ', 5541 => 'Ⰱ', 5542 => 'Ⰲ', 5543 => 'Ⰳ', 5544 => 'Ⰴ', 5545 => 'Ⰵ', 5546 => 'Ⰶ', 5547 => 'Ⰷ', 5548 => 'Ⰸ', 5549 => 'Ⰹ', 5550 => 'Ⰺ', 5551 => 'Ⰻ', 5552 => 'Ⰼ', 5553 => 'Ⰽ', 5554 => 'Ⰾ', 5555 => 'Ⰿ', 5556 => 'Ⱀ', 5557 => 'Ⱁ', 5558 => 'Ⱂ', 5559 => 'Ⱃ', 5560 => 'Ⱄ', 5561 => 'Ⱅ', 5562 => 'Ⱆ', 5563 => 'Ⱇ', 5564 => 'Ⱈ', 5565 => 'Ⱉ', 5566 => 'Ⱊ', 5567 => 'Ⱋ', 5568 => 'Ⱌ', 5569 => 'Ⱍ', 5570 => 'Ⱎ', 5571 => 'Ⱏ', 5572 => 'Ⱐ', 5573 => 'Ⱑ', 5574 => 'Ⱒ', 5575 => 'Ⱓ', 5576 => 'Ⱔ', 5577 => 'Ⱕ', 5578 => 'Ⱖ', 5579 => 'Ⱗ', 5580 => 'Ⱘ', 5581 => 'Ⱙ', 5582 => 'Ⱚ', 5583 => 'Ⱛ', 5584 => 'Ⱜ', 5585 => 'Ⱝ', 5586 => 'Ⱞ', 5587 => 'ა', 5588 => 'Ⴀ', 5589 => 'ბ', 5590 => 'Ⴁ', 5591 => 'გ', 5592 => 'Ⴂ', 5593 => 'დ', 5594 => 'Ⴃ', 5595 => 'ე', 5596 => 'Ⴄ', 5597 => 'ვ', 5598 => 'Ⴅ', 5599 => 'ზ', 5600 => 'Ⴆ', 5601 => 'ჱ', 5602 => 'Ⴡ', 5603 => 'თ', 5604 => 'Ⴇ', 5605 => 'ი', 5606 => 'Ⴈ', 5607 => 'კ', 5608 => 'Ⴉ', 5609 => 'ლ', 5610 => 'Ⴊ', 5611 => 'მ', 5612 => 'Ⴋ', 5613 => 'ნ', 5614 => 'Ⴌ', 5615 => 'ჲ', 5616 => 'Ⴢ', 5617 => 'ო', 5618 => 'Ⴍ', 5619 => 'პ', 5620 => 'Ⴎ', 5621 => 'ჟ', 5622 => 'Ⴏ', 5623 => 'რ', 5624 => 'Ⴐ', 5625 => 'ს', 5626 => 'Ⴑ', 5627 => 'ტ', 5628 => 'Ⴒ', 5629 => 'ჳ', 5630 => 'Ⴣ', 5631 => 'უ', 5632 => 'Ⴓ', 5633 => 'ფ', 5634 => 'Ⴔ', 5635 => 'ქ', 5636 => 'Ⴕ', 5637 => 'ღ', 5638 => 'Ⴖ', 5639 => 'ყ', 5640 => 'Ⴗ', 5641 => 'შ', 5642 => 'Ⴘ', 5643 => 'ჩ', 5644 => 'Ⴙ', 5645 => 'ც', 5646 => 'Ⴚ', 5647 => 'ძ', 5648 => 'Ⴛ', 5649 => 'წ', 5650 => 'Ⴜ', 5651 => 'ჭ', 5652 => 'Ⴝ', 5653 => 'ხ', 5654 => 'Ⴞ', 5655 => 'ჴ', 5656 => 'Ⴤ', 5657 => 'ჯ', 5658 => 'Ⴟ', 5659 => 'ჰ', 5660 => 'Ⴠ', 5661 => 'ჵ', 5662 => 'Ⴥ', 5663 => 'ჶ', 5664 => 'ჷ', 5665 => 'ჸ', 5666 => 'ჹ', 5667 => 'ჺ', 5668 => 'Ա', 5669 => 'Բ', 5670 => 'Գ', 5671 => 'Դ', 5672 => 'Ե', 5673 => 'Զ', 5674 => 'Է', 5675 => 'Ը', 5676 => 'Թ', 5677 => 'Ժ', 5678 => 'Ի', 5679 => 'Լ', 5680 => 'Խ', 5681 => 'Ծ', 5682 => 'Կ', 5683 => 'Հ', 5684 => 'Ձ', 5685 => 'Ղ', 5686 => 'Ճ', 5687 => 'Մ', 5688 => 'Յ', 5689 => 'Ն', 5690 => 'Շ', 5691 => 'Ո', 5692 => 'Չ', 5693 => 'Պ', 5694 => 'Ջ', 5695 => 'Ռ', 5696 => 'Ս', 5697 => 'Վ', 5698 => 'Տ', 5699 => 'Ր', 5700 => 'Ց', 5701 => 'Ւ', 5702 => 'Փ', 5703 => 'Ք', 5704 => 'Օ', 5705 => 'Ֆ', 5706 => 'ՙ', 5707 => 'א', 5708 => 'ב', 5709 => 'ג', 5710 => 'ד', 5711 => 'ה', 5712 => 'ו', 5713 => 'ז', 5714 => 'ח', 5715 => 'ט', 5716 => 'י', 5717 => 'ך', 5718 => 'ל', 5719 => 'ם', 5720 => 'ן', 5721 => 'ס', 5722 => 'ע', 5723 => 'ף', 5724 => 'ץ', 5725 => 'ק', 5726 => 'ר', 5727 => 'ש', 5728 => 'ת', 5729 => '𐤀', 5730 => '𐤁', 5731 => '𐤂', 5732 => '𐤃', 5733 => '𐤄', 5734 => '𐤅', 5735 => '𐤆', 5736 => '𐤇', 5737 => '𐤈', 5738 => '𐤉', 5739 => '𐤊', 5740 => '𐤋', 5741 => '𐤌', 5742 => '𐤍', 5743 => '𐤎', 5744 => '𐤏', 5745 => '𐤐', 5746 => '𐤑', 5747 => '𐤒', 5748 => '𐤓', 5749 => '𐤔', 5750 => '𐤕', 5751 => 'ࠀ', 5752 => 'ࠁ', 5753 => 'ࠂ', 5754 => 'ࠃ', 5755 => 'ࠄ', 5756 => 'ࠅ', 5757 => 'ࠆ', 5758 => 'ࠇ', 5759 => 'ࠈ', 5760 => 'ࠉ', 5761 => 'ࠊ', 5762 => 'ࠋ', 5763 => 'ࠌ', 5764 => 'ࠍ', 5765 => 'ࠎ', 5766 => 'ࠏ', 5767 => 'ࠐ', 5768 => 'ࠑ', 5769 => 'ࠒ', 5770 => 'ࠓ', 5771 => 'ࠔ', 5772 => 'ࠕ', 5773 => 'ࠚ', 5774 => 'ء', 5775 => 'آ', 5776 => 'أ', 5777 => 'ٲ', 5778 => 'ٱ', 5779 => 'ؤ', 5780 => 'إ', 5781 => 'ٳ', 5782 => 'ݳ', 5783 => 'ݴ', 5784 => 'ئ', 5785 => 'ا', 5786 => 'ٮ', 5787 => 'ب', 5788 => 'ٻ', 5789 => 'پ', 5790 => 'ڀ', 5791 => 'ݐ', 5792 => 'ݑ', 5793 => 'ݒ', 5794 => 'ݓ', 5795 => 'ݔ', 5796 => 'ݕ', 5797 => 'ݖ', 5798 => 'ة', 5799 => 'ت', 5800 => 'ث', 5801 => 'ٹ', 5802 => 'ٺ', 5803 => 'ټ', 5804 => 'ٽ', 5805 => 'ٿ', 5806 => 'ج', 5807 => 'ڃ', 5808 => 'ڄ', 5809 => 'چ', 5810 => 'ڿ', 5811 => 'ڇ', 5812 => 'ح', 5813 => 'خ', 5814 => 'ځ', 5815 => 'ڂ', 5816 => 'څ', 5817 => 'ݗ', 5818 => 'ݘ', 5819 => 'ݮ', 5820 => 'ݯ', 5821 => 'ݲ', 5822 => 'ݼ', 5823 => 'د', 5824 => 'ذ', 5825 => 'ڈ', 5826 => 'ډ', 5827 => 'ڊ', 5828 => 'ڋ', 5829 => 'ڌ', 5830 => 'ڍ', 5831 => 'ڎ', 5832 => 'ڏ', 5833 => 'ڐ', 5834 => 'ۮ', 5835 => 'ݙ', 5836 => 'ݚ', 5837 => 'ر', 5838 => 'ز', 5839 => 'ڑ', 5840 => 'ڒ', 5841 => 'ړ', 5842 => 'ڔ', 5843 => 'ڕ', 5844 => 'ږ', 5845 => 'ڗ', 5846 => 'ژ', 5847 => 'ڙ', 5848 => 'ۯ', 5849 => 'ݛ', 5850 => 'ݫ', 5851 => 'ݬ', 5852 => 'ݱ', 5853 => 'س', 5854 => 'ش', 5855 => 'ښ', 5856 => 'ڛ', 5857 => 'ڜ', 5858 => 'ۺ', 5859 => 'ݜ', 5860 => 'ݭ', 5861 => 'ݰ', 5862 => 'ݽ', 5863 => 'ݾ', 5864 => 'ص', 5865 => 'ض', 5866 => 'ڝ', 5867 => 'ڞ', 5868 => 'ۻ', 5869 => 'ط', 5870 => 'ظ', 5871 => 'ڟ', 5872 => 'ع', 5873 => 'غ', 5874 => 'ڠ', 5875 => 'ۼ', 5876 => 'ݝ', 5877 => 'ݞ', 5878 => 'ݟ', 5879 => 'ف', 5880 => 'ڡ', 5881 => 'ڢ', 5882 => 'ڣ', 5883 => 'ڤ', 5884 => 'ڥ', 5885 => 'ڦ', 5886 => 'ݠ', 5887 => 'ݡ', 5888 => 'ٯ', 5889 => 'ق', 5890 => 'ڧ', 5891 => 'ڨ', 5892 => 'ك', 5893 => 'ک', 5894 => 'ڪ', 5895 => 'ګ', 5896 => 'ڬ', 5897 => 'ݿ', 5898 => 'ڭ', 5899 => 'ڮ', 5900 => 'گ', 5901 => 'ڰ', 5902 => 'ڱ', 5903 => 'ڲ', 5904 => 'ڳ', 5905 => 'ڴ', 5906 => 'ݢ', 5907 => 'ػ', 5908 => 'ؼ', 5909 => 'ݣ', 5910 => 'ݤ', 5911 => 'ل', 5912 => 'ڵ', 5913 => 'ڶ', 5914 => 'ڷ', 5915 => 'ڸ', 5916 => 'ݪ', 5917 => 'م', 5918 => 'ݥ', 5919 => 'ݦ', 5920 => 'ن', 5921 => 'ں', 5922 => 'ڻ', 5923 => 'ڼ', 5924 => 'ڽ', 5925 => 'ڹ', 5926 => 'ݧ', 5927 => 'ݨ', 5928 => 'ݩ', 5929 => 'ه', 5930 => 'ھ', 5931 => 'ہ', 5932 => 'ۃ', 5933 => 'ۿ', 5934 => 'ە', 5935 => 'و', 5936 => 'ۄ', 5937 => 'ۅ', 5938 => 'ۆ', 5939 => 'ۇ', 5940 => 'ۈ', 5941 => 'ۉ', 5942 => 'ۊ', 5943 => 'ۋ', 5944 => 'ۏ', 5945 => 'ݸ', 5946 => 'ݹ', 5947 => 'ى', 5948 => 'ي', 5949 => 'ی', 5950 => 'ۍ', 5951 => 'ێ', 5952 => 'ې', 5953 => 'ۑ', 5954 => 'ؽ', 5955 => 'ؾ', 5956 => 'ؿ', 5957 => 'ؠ', 5958 => 'ݵ', 5959 => 'ݶ', 5960 => 'ݷ', 5961 => 'ے', 5962 => 'ݺ', 5963 => 'ݻ', 5964 => 'ܐ', 5965 => 'ܒ', 5966 => 'ܓ', 5967 => 'ܖ', 5968 => 'ܕ', 5969 => 'ܗ', 5970 => 'ܘ', 5971 => 'ܙ', 5972 => 'ݍ', 5973 => 'ܚ', 5974 => 'ܛ', 5975 => 'ܝ', 5976 => 'ܞ', 5977 => 'ܟ', 5978 => 'ݎ', 5979 => 'ܠ', 5980 => 'ܡ', 5981 => 'ܢ', 5982 => 'ܣ', 5983 => 'ܥ', 5984 => 'ܦ', 5985 => 'ݏ', 5986 => 'ܨ', 5987 => 'ܩ', 5988 => 'ܪ', 5989 => 'ܫ', 5990 => 'ܬ', 5991 => 'ࡀ', 5992 => 'ࡁ', 5993 => 'ࡂ', 5994 => 'ࡃ', 5995 => 'ࡄ', 5996 => 'ࡅ', 5997 => 'ࡆ', 5998 => 'ࡇ', 5999 => 'ࡈ', 6000 => 'ࡉ', 6001 => 'ࡊ', 6002 => 'ࡋ', 6003 => 'ࡌ', 6004 => 'ࡍ', 6005 => 'ࡎ', 6006 => 'ࡏ', 6007 => 'ࡐ', 6008 => 'ࡑ', 6009 => 'ࡒ', 6010 => 'ࡓ', 6011 => 'ࡔ', 6012 => 'ࡕ', 6013 => 'ࡖ', 6014 => 'ࡗ', 6015 => 'ࡘ', 6016 => 'ހ', 6017 => 'ޙ', 6018 => 'ޚ', 6019 => 'ށ', 6020 => 'ނ', 6021 => 'ރ', 6022 => 'ޜ', 6023 => 'ބ', 6024 => 'ޅ', 6025 => 'ކ', 6026 => 'އ', 6027 => 'ޢ', 6028 => 'ޣ', 6029 => 'ވ', 6030 => 'ޥ', 6031 => 'މ', 6032 => 'ފ', 6033 => 'ދ', 6034 => 'ޛ', 6035 => 'ތ', 6036 => 'ޘ', 6037 => 'ޠ', 6038 => 'ޡ', 6039 => 'ލ', 6040 => 'ގ', 6041 => 'ޤ', 6042 => 'ޏ', 6043 => 'ސ', 6044 => 'ޝ', 6045 => 'ޞ', 6046 => 'ޟ', 6047 => 'ޑ', 6048 => 'ޒ', 6049 => 'ޓ', 6050 => 'ޔ', 6051 => 'ޕ', 6052 => 'ޖ', 6053 => 'ޗ', 6054 => 'ޱ', 6055 => 'ߊ', 6056 => 'ߋ', 6057 => 'ߌ', 6058 => 'ߍ', 6059 => 'ߎ', 6060 => 'ߏ', 6061 => 'ߐ', 6062 => 'ߑ', 6063 => 'ߒ', 6064 => 'ߓ', 6065 => 'ߔ', 6066 => 'ߕ', 6067 => 'ߖ', 6068 => 'ߗ', 6069 => 'ߘ', 6070 => 'ߙ', 6071 => 'ߚ', 6072 => 'ߛ', 6073 => 'ߜ', 6074 => 'ߝ', 6075 => 'ߞ', 6076 => 'ߟ', 6077 => 'ߠ', 6078 => 'ߡ', 6079 => 'ߢ', 6080 => 'ߣ', 6081 => 'ߤ', 6082 => 'ߥ', 6083 => 'ߦ', 6084 => 'ߧ', 6085 => 'ߴ', 6086 => 'ߵ', 6087 => 'ⴰ', 6088 => 'ⴱ', 6089 => 'ⴲ', 6090 => 'ⴳ', 6091 => 'ⴴ', 6092 => 'ⴵ', 6093 => 'ⴶ', 6094 => 'ⴷ', 6095 => 'ⴸ', 6096 => 'ⴹ', 6097 => 'ⴺ', 6098 => 'ⴻ', 6099 => 'ⴼ', 6100 => 'ⴽ', 6101 => 'ⴾ', 6102 => 'ⴿ', 6103 => 'ⵀ', 6104 => 'ⵁ', 6105 => 'ⵂ', 6106 => 'ⵃ', 6107 => 'ⵄ', 6108 => 'ⵅ', 6109 => 'ⵆ', 6110 => 'ⵇ', 6111 => 'ⵈ', 6112 => 'ⵉ', 6113 => 'ⵊ', 6114 => 'ⵋ', 6115 => 'ⵌ', 6116 => 'ⵍ', 6117 => 'ⵎ', 6118 => 'ⵏ', 6119 => 'ⵐ', 6120 => 'ⵑ', 6121 => 'ⵒ', 6122 => 'ⵓ', 6123 => 'ⵔ', 6124 => 'ⵕ', 6125 => 'ⵖ', 6126 => 'ⵗ', 6127 => 'ⵘ', 6128 => 'ⵙ', 6129 => 'ⵚ', 6130 => 'ⵛ', 6131 => 'ⵜ', 6132 => 'ⵝ', 6133 => 'ⵞ', 6134 => 'ⵟ', 6135 => 'ⵠ', 6136 => 'ⵡ', 6137 => 'ⵢ', 6138 => 'ⵣ', 6139 => 'ⵤ', 6140 => 'ⵥ', 6141 => 'ⵯ', 6142 => 'ሀ', 6143 => 'ሁ', 6144 => 'ሂ', 6145 => 'ሃ', 6146 => 'ሄ', 6147 => 'ህ', 6148 => 'ሆ', 6149 => 'ሇ', 6150 => 'ለ', 6151 => 'ሉ', 6152 => 'ሊ', 6153 => 'ላ', 6154 => 'ሌ', 6155 => 'ል', 6156 => 'ሎ', 6157 => 'ሏ', 6158 => 'ⶀ', 6159 => 'ሐ', 6160 => 'ሑ', 6161 => 'ሒ', 6162 => 'ሓ', 6163 => 'ሔ', 6164 => 'ሕ', 6165 => 'ሖ', 6166 => 'ሗ', 6167 => 'መ', 6168 => 'ሙ', 6169 => 'ሚ', 6170 => 'ማ', 6171 => 'ሜ', 6172 => 'ም', 6173 => 'ሞ', 6174 => 'ሟ', 6175 => 'ᎀ', 6176 => 'ᎁ', 6177 => 'ᎂ', 6178 => 'ᎃ', 6179 => 'ⶁ', 6180 => 'ሠ', 6181 => 'ሡ', 6182 => 'ሢ', 6183 => 'ሣ', 6184 => 'ሤ', 6185 => 'ሥ', 6186 => 'ሦ', 6187 => 'ሧ', 6188 => 'ረ', 6189 => 'ሩ', 6190 => 'ሪ', 6191 => 'ራ', 6192 => 'ሬ', 6193 => 'ር', 6194 => 'ሮ', 6195 => 'ሯ', 6196 => 'ⶂ', 6197 => 'ሰ', 6198 => 'ሱ', 6199 => 'ሲ', 6200 => 'ሳ', 6201 => 'ሴ', 6202 => 'ስ', 6203 => 'ሶ', 6204 => 'ሷ', 6205 => 'ⶃ', 6206 => 'ꬁ', 6207 => 'ꬂ', 6208 => 'ꬃ', 6209 => 'ꬄ', 6210 => 'ꬅ', 6211 => 'ꬆ', 6212 => 'ሸ', 6213 => 'ሹ', 6214 => 'ሺ', 6215 => 'ሻ', 6216 => 'ሼ', 6217 => 'ሽ', 6218 => 'ሾ', 6219 => 'ሿ', 6220 => 'ⶄ', 6221 => 'ቀ', 6222 => 'ቁ', 6223 => 'ቂ', 6224 => 'ቃ', 6225 => 'ቄ', 6226 => 'ቅ', 6227 => 'ቆ', 6228 => 'ቇ', 6229 => 'ቈ', 6230 => 'ቊ', 6231 => 'ቋ', 6232 => 'ቌ', 6233 => 'ቍ', 6234 => 'ቐ', 6235 => 'ቑ', 6236 => 'ቒ', 6237 => 'ቓ', 6238 => 'ቔ', 6239 => 'ቕ', 6240 => 'ቖ', 6241 => 'ቘ', 6242 => 'ቚ', 6243 => 'ቛ', 6244 => 'ቜ', 6245 => 'ቝ', 6246 => 'በ', 6247 => 'ቡ', 6248 => 'ቢ', 6249 => 'ባ', 6250 => 'ቤ', 6251 => 'ብ', 6252 => 'ቦ', 6253 => 'ቧ', 6254 => 'ᎄ', 6255 => 'ᎅ', 6256 => 'ᎆ', 6257 => 'ᎇ', 6258 => 'ⶅ', 6259 => 'ቨ', 6260 => 'ቩ', 6261 => 'ቪ', 6262 => 'ቫ', 6263 => 'ቬ', 6264 => 'ቭ', 6265 => 'ቮ', 6266 => 'ቯ', 6267 => 'ተ', 6268 => 'ቱ', 6269 => 'ቲ', 6270 => 'ታ', 6271 => 'ቴ', 6272 => 'ት', 6273 => 'ቶ', 6274 => 'ቷ', 6275 => 'ⶆ', 6276 => 'ቸ', 6277 => 'ቹ', 6278 => 'ቺ', 6279 => 'ቻ', 6280 => 'ቼ', 6281 => 'ች', 6282 => 'ቾ', 6283 => 'ቿ', 6284 => 'ⶇ', 6285 => 'ኀ', 6286 => 'ኁ', 6287 => 'ኂ', 6288 => 'ኃ', 6289 => 'ኄ', 6290 => 'ኅ', 6291 => 'ኆ', 6292 => 'ኇ', 6293 => 'ኈ', 6294 => 'ኊ', 6295 => 'ኋ', 6296 => 'ኌ', 6297 => 'ኍ', 6298 => 'ነ', 6299 => 'ኑ', 6300 => 'ኒ', 6301 => 'ና', 6302 => 'ኔ', 6303 => 'ን', 6304 => 'ኖ', 6305 => 'ኗ', 6306 => 'ⶈ', 6307 => 'ኘ', 6308 => 'ኙ', 6309 => 'ኚ', 6310 => 'ኛ', 6311 => 'ኜ', 6312 => 'ኝ', 6313 => 'ኞ', 6314 => 'ኟ', 6315 => 'ⶉ', 6316 => 'አ', 6317 => 'ኡ', 6318 => 'ኢ', 6319 => 'ኣ', 6320 => 'ኤ', 6321 => 'እ', 6322 => 'ኦ', 6323 => 'ኧ', 6324 => 'ⶊ', 6325 => 'ከ', 6326 => 'ኩ', 6327 => 'ኪ', 6328 => 'ካ', 6329 => 'ኬ', 6330 => 'ክ', 6331 => 'ኮ', 6332 => 'ኯ', 6333 => 'ኰ', 6334 => 'ኲ', 6335 => 'ኳ', 6336 => 'ኴ', 6337 => 'ኵ', 6338 => 'ኸ', 6339 => 'ኹ', 6340 => 'ኺ', 6341 => 'ኻ', 6342 => 'ኼ', 6343 => 'ኽ', 6344 => 'ኾ', 6345 => 'ዀ', 6346 => 'ዂ', 6347 => 'ዃ', 6348 => 'ዄ', 6349 => 'ዅ', 6350 => 'ወ', 6351 => 'ዉ', 6352 => 'ዊ', 6353 => 'ዋ', 6354 => 'ዌ', 6355 => 'ው', 6356 => 'ዎ', 6357 => 'ዏ', 6358 => 'ዐ', 6359 => 'ዑ', 6360 => 'ዒ', 6361 => 'ዓ', 6362 => 'ዔ', 6363 => 'ዕ', 6364 => 'ዖ', 6365 => 'ዘ', 6366 => 'ዙ', 6367 => 'ዚ', 6368 => 'ዛ', 6369 => 'ዜ', 6370 => 'ዝ', 6371 => 'ዞ', 6372 => 'ዟ', 6373 => 'ⶋ', 6374 => 'ꬑ', 6375 => 'ꬒ', 6376 => 'ꬓ', 6377 => 'ꬔ', 6378 => 'ꬕ', 6379 => 'ꬖ', 6380 => 'ዠ', 6381 => 'ዡ', 6382 => 'ዢ', 6383 => 'ዣ', 6384 => 'ዤ', 6385 => 'ዥ', 6386 => 'ዦ', 6387 => 'ዧ', 6388 => 'የ', 6389 => 'ዩ', 6390 => 'ዪ', 6391 => 'ያ', 6392 => 'ዬ', 6393 => 'ይ', 6394 => 'ዮ', 6395 => 'ዯ', 6396 => 'ደ', 6397 => 'ዱ', 6398 => 'ዲ', 6399 => 'ዳ', 6400 => 'ዴ', 6401 => 'ድ', 6402 => 'ዶ', 6403 => 'ዷ', 6404 => 'ⶌ', 6405 => 'ꬉ', 6406 => 'ꬊ', 6407 => 'ꬋ', 6408 => 'ꬌ', 6409 => 'ꬍ', 6410 => 'ꬎ', 6411 => 'ዸ', 6412 => 'ዹ', 6413 => 'ዺ', 6414 => 'ዻ', 6415 => 'ዼ', 6416 => 'ዽ', 6417 => 'ዾ', 6418 => 'ዿ', 6419 => 'ⶍ', 6420 => 'ጀ', 6421 => 'ጁ', 6422 => 'ጂ', 6423 => 'ጃ', 6424 => 'ጄ', 6425 => 'ጅ', 6426 => 'ጆ', 6427 => 'ጇ', 6428 => 'ⶎ', 6429 => 'ገ', 6430 => 'ጉ', 6431 => 'ጊ', 6432 => 'ጋ', 6433 => 'ጌ', 6434 => 'ግ', 6435 => 'ጎ', 6436 => 'ጏ', 6437 => 'ጐ', 6438 => 'ጒ', 6439 => 'ጓ', 6440 => 'ጔ', 6441 => 'ጕ', 6442 => 'ጘ', 6443 => 'ጙ', 6444 => 'ጚ', 6445 => 'ጛ', 6446 => 'ጜ', 6447 => 'ጝ', 6448 => 'ጞ', 6449 => 'ጟ', 6450 => 'ⶓ', 6451 => 'ⶔ', 6452 => 'ⶕ', 6453 => 'ⶖ', 6454 => 'ጠ', 6455 => 'ጡ', 6456 => 'ጢ', 6457 => 'ጣ', 6458 => 'ጤ', 6459 => 'ጥ', 6460 => 'ጦ', 6461 => 'ጧ', 6462 => 'ⶏ', 6463 => 'ጨ', 6464 => 'ጩ', 6465 => 'ጪ', 6466 => 'ጫ', 6467 => 'ጬ', 6468 => 'ጭ', 6469 => 'ጮ', 6470 => 'ጯ', 6471 => 'ⶐ', 6472 => 'ꬠ', 6473 => 'ꬡ', 6474 => 'ꬢ', 6475 => 'ꬣ', 6476 => 'ꬤ', 6477 => 'ꬥ', 6478 => 'ꬦ', 6479 => 'ጰ', 6480 => 'ጱ', 6481 => 'ጲ', 6482 => 'ጳ', 6483 => 'ጴ', 6484 => 'ጵ', 6485 => 'ጶ', 6486 => 'ጷ', 6487 => 'ⶑ', 6488 => 'ጸ', 6489 => 'ጹ', 6490 => 'ጺ', 6491 => 'ጻ', 6492 => 'ጼ', 6493 => 'ጽ', 6494 => 'ጾ', 6495 => 'ጿ', 6496 => 'ꬨ', 6497 => 'ꬩ', 6498 => 'ꬪ', 6499 => 'ꬫ', 6500 => 'ꬬ', 6501 => 'ꬭ', 6502 => 'ꬮ', 6503 => 'ፀ', 6504 => 'ፁ', 6505 => 'ፂ', 6506 => 'ፃ', 6507 => 'ፄ', 6508 => 'ፅ', 6509 => 'ፆ', 6510 => 'ፇ', 6511 => 'ፈ', 6512 => 'ፉ', 6513 => 'ፊ', 6514 => 'ፋ', 6515 => 'ፌ', 6516 => 'ፍ', 6517 => 'ፎ', 6518 => 'ፏ', 6519 => 'ᎈ', 6520 => 'ᎉ', 6521 => 'ᎊ', 6522 => 'ᎋ', 6523 => 'ፐ', 6524 => 'ፑ', 6525 => 'ፒ', 6526 => 'ፓ', 6527 => 'ፔ', 6528 => 'ፕ', 6529 => 'ፖ', 6530 => 'ፗ', 6531 => 'ᎌ', 6532 => 'ᎍ', 6533 => 'ᎎ', 6534 => 'ᎏ', 6535 => 'ⶒ', 6536 => 'ፘ', 6537 => 'ፙ', 6538 => 'ፚ', 6539 => 'ⶠ', 6540 => 'ⶡ', 6541 => 'ⶢ', 6542 => 'ⶣ', 6543 => 'ⶤ', 6544 => 'ⶥ', 6545 => 'ⶦ', 6546 => 'ⶨ', 6547 => 'ⶩ', 6548 => 'ⶪ', 6549 => 'ⶫ', 6550 => 'ⶬ', 6551 => 'ⶭ', 6552 => 'ⶮ', 6553 => 'ⶰ', 6554 => 'ⶱ', 6555 => 'ⶲ', 6556 => 'ⶳ', 6557 => 'ⶴ', 6558 => 'ⶵ', 6559 => 'ⶶ', 6560 => 'ⶸ', 6561 => 'ⶹ', 6562 => 'ⶺ', 6563 => 'ⶻ', 6564 => 'ⶼ', 6565 => 'ⶽ', 6566 => 'ⶾ', 6567 => 'ⷀ', 6568 => 'ⷁ', 6569 => 'ⷂ', 6570 => 'ⷃ', 6571 => 'ⷄ', 6572 => 'ⷅ', 6573 => 'ⷆ', 6574 => 'ⷈ', 6575 => 'ⷉ', 6576 => 'ⷊ', 6577 => 'ⷋ', 6578 => 'ⷌ', 6579 => 'ⷍ', 6580 => 'ⷎ', 6581 => 'ⷐ', 6582 => 'ⷑ', 6583 => 'ⷒ', 6584 => 'ⷓ', 6585 => 'ⷔ', 6586 => 'ⷕ', 6587 => 'ⷖ', 6588 => 'ⷘ', 6589 => 'ⷙ', 6590 => 'ⷚ', 6591 => 'ⷛ', 6592 => 'ⷜ', 6593 => 'ⷝ', 6594 => 'ⷞ', 6595 => 'ॐ', 6596 => 'ॲ', 6597 => 'ऄ', 6598 => 'अ', 6599 => 'आ', 6600 => 'ॳ', 6601 => 'ॴ', 6602 => 'ॵ', 6603 => 'ॶ', 6604 => 'ॷ', 6605 => 'इ', 6606 => 'ई', 6607 => 'उ', 6608 => 'ऊ', 6609 => 'ऋ', 6610 => 'ॠ', 6611 => 'ऌ', 6612 => 'ॡ', 6613 => 'ऍ', 6614 => 'ऎ', 6615 => 'ए', 6616 => 'ऐ', 6617 => 'ऑ', 6618 => 'ऒ', 6619 => 'ओ', 6620 => 'औ', 6621 => 'क', 6622 => 'ख', 6623 => 'ग', 6624 => 'ॻ', 6625 => 'घ', 6626 => 'ङ', 6627 => 'च', 6628 => 'छ', 6629 => 'ज', 6630 => 'ॹ', 6631 => 'ॼ', 6632 => 'झ', 6633 => 'ञ', 6634 => 'ट', 6635 => 'ठ', 6636 => 'ड', 6637 => 'ॾ', 6638 => 'ढ', 6639 => 'ण', 6640 => 'त', 6641 => 'थ', 6642 => 'द', 6643 => 'ध', 6644 => 'न', 6645 => 'प', 6646 => 'फ', 6647 => 'ब', 6648 => 'ॿ', 6649 => 'भ', 6650 => 'म', 6651 => 'य', 6652 => 'ॺ', 6653 => 'र', 6654 => 'ल', 6655 => 'ळ', 6656 => 'व', 6657 => 'श', 6658 => 'ष', 6659 => 'स', 6660 => 'ह', 6661 => 'ऽ', 6662 => 'ॽ', 6663 => 'ᳩ', 6664 => 'ꣲ', 6665 => 'ꣻ', 6666 => 'অ', 6667 => 'আ', 6668 => 'ই', 6669 => 'ঈ', 6670 => 'উ', 6671 => 'ঊ', 6672 => 'ঋ', 6673 => 'ৠ', 6674 => 'ঌ', 6675 => 'ৡ', 6676 => 'এ', 6677 => 'ঐ', 6678 => 'ও', 6679 => 'ঔ', 6680 => 'ক', 6681 => 'খ', 6682 => 'গ', 6683 => 'ঘ', 6684 => 'ঙ', 6685 => 'চ', 6686 => 'ছ', 6687 => 'জ', 6688 => 'ঝ', 6689 => 'ঞ', 6690 => 'ট', 6691 => 'ঠ', 6692 => 'ড', 6693 => 'ঢ', 6694 => 'ণ', 6695 => 'ত', 6696 => 'থ', 6697 => 'দ', 6698 => 'ধ', 6699 => 'ন', 6700 => 'প', 6701 => 'ফ', 6702 => 'ব', 6703 => 'ভ', 6704 => 'ম', 6705 => 'য', 6706 => 'র', 6707 => 'ৰ', 6708 => 'ল', 6709 => 'ৱ', 6710 => 'শ', 6711 => 'ষ', 6712 => 'স', 6713 => 'হ', 6714 => 'ঽ', 6715 => 'ੴ', 6716 => 'ੳ', 6717 => 'ਉ', 6718 => 'ਊ', 6719 => 'ਓ', 6720 => 'ਅ', 6721 => 'ਆ', 6722 => 'ਐ', 6723 => 'ਔ', 6724 => 'ੲ', 6725 => 'ਇ', 6726 => 'ਈ', 6727 => 'ਏ', 6728 => 'ਸ', 6729 => 'ਹ', 6730 => 'ਕ', 6731 => 'ਖ', 6732 => 'ਗ', 6733 => 'ਘ', 6734 => 'ਙ', 6735 => 'ਚ', 6736 => 'ਛ', 6737 => 'ਜ', 6738 => 'ਝ', 6739 => 'ਞ', 6740 => 'ਟ', 6741 => 'ਠ', 6742 => 'ਡ', 6743 => 'ਢ', 6744 => 'ਣ', 6745 => 'ਤ', 6746 => 'ਥ', 6747 => 'ਦ', 6748 => 'ਧ', 6749 => 'ਨ', 6750 => 'ਪ', 6751 => 'ਫ', 6752 => 'ਬ', 6753 => 'ਭ', 6754 => 'ਮ', 6755 => 'ਯ', 6756 => 'ਰ', 6757 => 'ਲ', 6758 => 'ਵ', 6759 => 'ੜ', 6760 => 'ૐ', 6761 => 'અ', 6762 => 'આ', 6763 => 'ઇ', 6764 => 'ઈ', 6765 => 'ઉ', 6766 => 'ઊ', 6767 => 'ઋ', 6768 => 'ૠ', 6769 => 'ઌ', 6770 => 'ૡ', 6771 => 'ઍ', 6772 => 'એ', 6773 => 'ઐ', 6774 => 'ઑ', 6775 => 'ઓ', 6776 => 'ઔ', 6777 => 'ક', 6778 => 'ખ', 6779 => 'ગ', 6780 => 'ઘ', 6781 => 'ઙ', 6782 => 'ચ', 6783 => 'છ', 6784 => 'જ', 6785 => 'ઝ', 6786 => 'ઞ', 6787 => 'ટ', 6788 => 'ઠ', 6789 => 'ડ', 6790 => 'ઢ', 6791 => 'ણ', 6792 => 'ત', 6793 => 'થ', 6794 => 'દ', 6795 => 'ધ', 6796 => 'ન', 6797 => 'પ', 6798 => 'ફ', 6799 => 'બ', 6800 => 'ભ', 6801 => 'મ', 6802 => 'ય', 6803 => 'ર', 6804 => 'લ', 6805 => 'વ', 6806 => 'શ', 6807 => 'ષ', 6808 => 'સ', 6809 => 'હ', 6810 => 'ળ', 6811 => 'ઽ', 6812 => 'ଅ', 6813 => 'ଆ', 6814 => 'ଇ', 6815 => 'ଈ', 6816 => 'ଉ', 6817 => 'ଊ', 6818 => 'ଋ', 6819 => 'ୠ', 6820 => 'ଌ', 6821 => 'ୡ', 6822 => 'ଏ', 6823 => 'ଐ', 6824 => 'ଓ', 6825 => 'ଔ', 6826 => 'କ', 6827 => 'ଖ', 6828 => 'ଗ', 6829 => 'ଘ', 6830 => 'ଙ', 6831 => 'ଚ', 6832 => 'ଛ', 6833 => 'ଜ', 6834 => 'ଝ', 6835 => 'ଞ', 6836 => 'ଟ', 6837 => 'ଠ', 6838 => 'ଡ', 6839 => 'ଢ', 6840 => 'ଣ', 6841 => 'ତ', 6842 => 'ଥ', 6843 => 'ଦ', 6844 => 'ଧ', 6845 => 'ନ', 6846 => 'ପ', 6847 => 'ଫ', 6848 => 'ବ', 6849 => 'ଭ', 6850 => 'ମ', 6851 => 'ଯ', 6852 => 'ୟ', 6853 => 'ର', 6854 => 'ଲ', 6855 => 'ଳ', 6856 => 'ଵ', 6857 => 'ୱ', 6858 => 'ଶ', 6859 => 'ଷ', 6860 => 'ସ', 6861 => 'ହ', 6862 => 'ଽ', 6863 => 'ௐ', 6864 => 'அ', 6865 => 'ஆ', 6866 => 'இ', 6867 => 'ஈ', 6868 => 'உ', 6869 => 'ஊ', 6870 => 'எ', 6871 => 'ஏ', 6872 => 'ஐ', 6873 => 'ஒ', 6874 => 'ஓ', 6875 => 'ஔ', 6876 => 'ஃ', 6877 => 'க', 6878 => 'ங', 6879 => 'ச', 6880 => 'ஞ', 6881 => 'ட', 6882 => 'ண', 6883 => 'த', 6884 => 'ந', 6885 => 'ப', 6886 => 'ம', 6887 => 'ய', 6888 => 'ர', 6889 => 'ல', 6890 => 'வ', 6891 => 'ழ', 6892 => 'ள', 6893 => 'ற', 6894 => 'ன', 6895 => 'ஜ', 6896 => 'ஶ', 6897 => 'ஷ', 6898 => 'ஸ', 6899 => 'ஹ', 6900 => 'అ', 6901 => 'ఆ', 6902 => 'ఇ', 6903 => 'ఈ', 6904 => 'ఉ', 6905 => 'ఊ', 6906 => 'ఋ', 6907 => 'ౠ', 6908 => 'ఌ', 6909 => 'ౡ', 6910 => 'ఎ', 6911 => 'ఏ', 6912 => 'ఐ', 6913 => 'ఒ', 6914 => 'ఓ', 6915 => 'ఔ', 6916 => 'క', 6917 => 'ఖ', 6918 => 'గ', 6919 => 'ఘ', 6920 => 'ఙ', 6921 => 'చ', 6922 => 'ౘ', 6923 => 'ఛ', 6924 => 'జ', 6925 => 'ౙ', 6926 => 'ఝ', 6927 => 'ఞ', 6928 => 'ట', 6929 => 'ఠ', 6930 => 'డ', 6931 => 'ఢ', 6932 => 'ణ', 6933 => 'త', 6934 => 'థ', 6935 => 'ద', 6936 => 'ధ', 6937 => 'న', 6938 => 'ప', 6939 => 'ఫ', 6940 => 'బ', 6941 => 'భ', 6942 => 'మ', 6943 => 'య', 6944 => 'ర', 6945 => 'ఱ', 6946 => 'ల', 6947 => 'వ', 6948 => 'శ', 6949 => 'ష', 6950 => 'స', 6951 => 'హ', 6952 => 'ళ', 6953 => 'ఽ', 6954 => 'ಅ', 6955 => 'ಆ', 6956 => 'ಇ', 6957 => 'ಈ', 6958 => 'ಉ', 6959 => 'ಊ', 6960 => 'ಋ', 6961 => 'ೠ', 6962 => 'ಌ', 6963 => 'ೡ', 6964 => 'ಎ', 6965 => 'ಏ', 6966 => 'ಐ', 6967 => 'ಒ', 6968 => 'ಓ', 6969 => 'ಔ', 6970 => 'ಕ', 6971 => 'ಖ', 6972 => 'ಗ', 6973 => 'ಘ', 6974 => 'ಙ', 6975 => 'ಚ', 6976 => 'ಛ', 6977 => 'ಜ', 6978 => 'ಝ', 6979 => 'ಞ', 6980 => 'ಟ', 6981 => 'ಠ', 6982 => 'ಡ', 6983 => 'ಢ', 6984 => 'ಣ', 6985 => 'ತ', 6986 => 'ಥ', 6987 => 'ದ', 6988 => 'ಧ', 6989 => 'ನ', 6990 => 'ಪ', 6991 => 'ಫ', 6992 => 'ಬ', 6993 => 'ಭ', 6994 => 'ಮ', 6995 => 'ಯ', 6996 => 'ರ', 6997 => 'ಱ', 6998 => 'ಲ', 6999 => 'ವ', 7000 => 'ಶ', 7001 => 'ಷ', 7002 => 'ಸ', 7003 => 'ಹ', 7004 => 'ಳ', 7005 => 'ೞ', 7006 => 'ಽ', 7007 => 'ೱ', 7008 => 'ೲ', 7009 => 'അ', 7010 => 'ആ', 7011 => 'ഇ', 7012 => 'ഈ', 7013 => 'ഉ', 7014 => 'ഊ', 7015 => 'ഋ', 7016 => 'ൠ', 7017 => 'ഌ', 7018 => 'ൡ', 7019 => 'എ', 7020 => 'ഏ', 7021 => 'ഐ', 7022 => 'ഒ', 7023 => 'ഓ', 7024 => 'ഔ', 7025 => 'ക', 7026 => 'ഖ', 7027 => 'ഗ', 7028 => 'ഘ', 7029 => 'ങ', 7030 => 'ച', 7031 => 'ഛ', 7032 => 'ജ', 7033 => 'ഝ', 7034 => 'ഞ', 7035 => 'ട', 7036 => 'ഠ', 7037 => 'ഡ', 7038 => 'ഢ', 7039 => 'ണ', 7040 => 'ത', 7041 => 'ഥ', 7042 => 'ദ', 7043 => 'ധ', 7044 => 'ന', 7045 => 'ഩ', 7046 => 'പ', 7047 => 'ഫ', 7048 => 'ബ', 7049 => 'ഭ', 7050 => 'മ', 7051 => 'യ', 7052 => 'ര', 7053 => 'ല', 7054 => 'വ', 7055 => 'ശ', 7056 => 'ഷ', 7057 => 'സ', 7058 => 'ഹ', 7059 => 'ള', 7060 => 'ഴ', 7061 => 'റ', 7062 => 'ഺ', 7063 => 'ഽ', 7064 => 'අ', 7065 => 'ආ', 7066 => 'ඇ', 7067 => 'ඈ', 7068 => 'ඉ', 7069 => 'ඊ', 7070 => 'උ', 7071 => 'ඌ', 7072 => 'ඍ', 7073 => 'ඎ', 7074 => 'ඏ', 7075 => 'ඐ', 7076 => 'එ', 7077 => 'ඒ', 7078 => 'ඓ', 7079 => 'ඔ', 7080 => 'ඕ', 7081 => 'ඖ', 7082 => 'ක', 7083 => 'ඛ', 7084 => 'ග', 7085 => 'ඝ', 7086 => 'ඞ', 7087 => 'ඟ', 7088 => 'ච', 7089 => 'ඡ', 7090 => 'ජ', 7091 => 'ඣ', 7092 => 'ඤ', 7093 => 'ඥ', 7094 => 'ඦ', 7095 => 'ට', 7096 => 'ඨ', 7097 => 'ඩ', 7098 => 'ඪ', 7099 => 'ණ', 7100 => 'ඬ', 7101 => 'ත', 7102 => 'ථ', 7103 => 'ද', 7104 => 'ධ', 7105 => 'න', 7106 => 'ඳ', 7107 => 'ප', 7108 => 'ඵ', 7109 => 'බ', 7110 => 'භ', 7111 => 'ම', 7112 => 'ඹ', 7113 => 'ය', 7114 => 'ර', 7115 => 'ල', 7116 => 'ව', 7117 => 'ශ', 7118 => 'ෂ', 7119 => 'ස', 7120 => 'හ', 7121 => 'ළ', 7122 => 'ෆ', 7123 => 'ꯀ', 7124 => 'ꯁ', 7125 => 'ꯂ', 7126 => 'ꯃ', 7127 => 'ꯄ', 7128 => 'ꯅ', 7129 => 'ꯆ', 7130 => 'ꯇ', 7131 => 'ꯈ', 7132 => 'ꯉ', 7133 => 'ꯊ', 7134 => 'ꯋ', 7135 => 'ꯌ', 7136 => 'ꯍ', 7137 => 'ꯎ', 7138 => 'ꯏ', 7139 => 'ꯐ', 7140 => 'ꯑ', 7141 => 'ꯒ', 7142 => 'ꯓ', 7143 => 'ꯔ', 7144 => 'ꯕ', 7145 => 'ꯖ', 7146 => 'ꯗ', 7147 => 'ꯘ', 7148 => 'ꯙ', 7149 => 'ꯚ', 7150 => 'ꯛ', 7151 => 'ꯜ', 7152 => 'ꯝ', 7153 => 'ꯞ', 7154 => 'ꯟ', 7155 => 'ꯠ', 7156 => 'ꯡ', 7157 => 'ꯢ', 7158 => 'ꠀ', 7159 => 'ꠁ', 7160 => 'ꠃ', 7161 => 'ꠄ', 7162 => 'ꠅ', 7163 => 'ꠇ', 7164 => 'ꠈ', 7165 => 'ꠉ', 7166 => 'ꠊ', 7167 => 'ꠌ', 7168 => 'ꠍ', 7169 => 'ꠎ', 7170 => 'ꠏ', 7171 => 'ꠐ', 7172 => 'ꠑ', 7173 => 'ꠒ', 7174 => 'ꠓ', 7175 => 'ꠔ', 7176 => 'ꠕ', 7177 => 'ꠖ', 7178 => 'ꠗ', 7179 => 'ꠘ', 7180 => 'ꠙ', 7181 => 'ꠚ', 7182 => 'ꠛ', 7183 => 'ꠜ', 7184 => 'ꠝ', 7185 => 'ꠞ', 7186 => 'ꠟ', 7187 => 'ꠠ', 7188 => 'ꠡ', 7189 => 'ꠢ', 7190 => 'ꢂ', 7191 => 'ꢃ', 7192 => 'ꢄ', 7193 => 'ꢅ', 7194 => 'ꢆ', 7195 => 'ꢇ', 7196 => 'ꢈ', 7197 => 'ꢉ', 7198 => 'ꢊ', 7199 => 'ꢋ', 7200 => 'ꢌ', 7201 => 'ꢍ', 7202 => 'ꢎ', 7203 => 'ꢏ', 7204 => 'ꢐ', 7205 => 'ꢑ', 7206 => 'ꢒ', 7207 => 'ꢓ', 7208 => 'ꢔ', 7209 => 'ꢕ', 7210 => 'ꢖ', 7211 => 'ꢗ', 7212 => 'ꢘ', 7213 => 'ꢙ', 7214 => 'ꢚ', 7215 => 'ꢛ', 7216 => 'ꢜ', 7217 => 'ꢝ', 7218 => 'ꢞ', 7219 => 'ꢟ', 7220 => 'ꢠ', 7221 => 'ꢡ', 7222 => 'ꢢ', 7223 => 'ꢣ', 7224 => 'ꢤ', 7225 => 'ꢥ', 7226 => 'ꢦ', 7227 => 'ꢧ', 7228 => 'ꢨ', 7229 => 'ꢩ', 7230 => 'ꢪ', 7231 => 'ꢫ', 7232 => 'ꢬ', 7233 => 'ꢭ', 7234 => 'ꢮ', 7235 => 'ꢯ', 7236 => 'ꢰ', 7237 => 'ꢱ', 7238 => 'ꢲ', 7239 => 'ꢳ', 7240 => '𑂃', 7241 => '𑂄', 7242 => '𑂅', 7243 => '𑂆', 7244 => '𑂇', 7245 => '𑂈', 7246 => '𑂉', 7247 => '𑂊', 7248 => '𑂋', 7249 => '𑂌', 7250 => '𑂍', 7251 => '𑂎', 7252 => '𑂏', 7253 => '𑂐', 7254 => '𑂑', 7255 => '𑂒', 7256 => '𑂓', 7257 => '𑂔', 7258 => '𑂕', 7259 => '𑂖', 7260 => '𑂗', 7261 => '𑂘', 7262 => '𑂙', 7263 => '𑂛', 7264 => '𑂝', 7265 => '𑂞', 7266 => '𑂟', 7267 => '𑂠', 7268 => '𑂡', 7269 => '𑂢', 7270 => '𑂣', 7271 => '𑂤', 7272 => '𑂥', 7273 => '𑂦', 7274 => '𑂧', 7275 => '𑂨', 7276 => '𑂩', 7277 => '𑂪', 7278 => '𑂬', 7279 => '𑂭', 7280 => '𑂮', 7281 => '𑂯', 7282 => 'ᮃ', 7283 => 'ᮄ', 7284 => 'ᮅ', 7285 => 'ᮆ', 7286 => 'ᮇ', 7287 => 'ᮈ', 7288 => 'ᮉ', 7289 => 'ᮊ', 7290 => 'ᮮ', 7291 => 'ᮋ', 7292 => 'ᮌ', 7293 => 'ᮍ', 7294 => 'ᮎ', 7295 => 'ᮏ', 7296 => 'ᮐ', 7297 => 'ᮑ', 7298 => 'ᮒ', 7299 => 'ᮓ', 7300 => 'ᮔ', 7301 => 'ᮕ', 7302 => 'ᮖ', 7303 => 'ᮗ', 7304 => 'ᮘ', 7305 => 'ᮙ', 7306 => 'ᮚ', 7307 => 'ᮛ', 7308 => 'ᮜ', 7309 => 'ᮝ', 7310 => 'ᮞ', 7311 => 'ᮟ', 7312 => 'ᮯ', 7313 => 'ᮠ', 7314 => '𑀅', 7315 => '𑀆', 7316 => '𑀇', 7317 => '𑀈', 7318 => '𑀉', 7319 => '𑀊', 7320 => '𑀋', 7321 => '𑀌', 7322 => '𑀍', 7323 => '𑀎', 7324 => '𑀏', 7325 => '𑀐', 7326 => '𑀑', 7327 => '𑀒', 7328 => '𑀓', 7329 => '𑀔', 7330 => '𑀕', 7331 => '𑀖', 7332 => '𑀗', 7333 => '𑀘', 7334 => '𑀙', 7335 => '𑀚', 7336 => '𑀛', 7337 => '𑀜', 7338 => '𑀝', 7339 => '𑀞', 7340 => '𑀟', 7341 => '𑀠', 7342 => '𑀡', 7343 => '𑀢', 7344 => '𑀣', 7345 => '𑀤', 7346 => '𑀥', 7347 => '𑀦', 7348 => '𑀧', 7349 => '𑀨', 7350 => '𑀩', 7351 => '𑀪', 7352 => '𑀫', 7353 => '𑀬', 7354 => '𑀭', 7355 => '𑀮', 7356 => '𑀯', 7357 => '𑀰', 7358 => '𑀱', 7359 => '𑀲', 7360 => '𑀳', 7361 => '𑀃', 7362 => '𑀄', 7363 => '𑀴', 7364 => '𑀵', 7365 => '𑀶', 7366 => '𑀷', 7367 => '𐨀', 7368 => '𐨐', 7369 => '𐨑', 7370 => '𐨒', 7371 => '𐨓', 7372 => '𐨕', 7373 => '𐨖', 7374 => '𐨗', 7375 => '𐨙', 7376 => '𐨚', 7377 => '𐨛', 7378 => '𐨜', 7379 => '𐨝', 7380 => '𐨞', 7381 => '𐨟', 7382 => '𐨠', 7383 => '𐨡', 7384 => '𐨢', 7385 => '𐨣', 7386 => '𐨤', 7387 => '𐨥', 7388 => '𐨦', 7389 => '𐨧', 7390 => '𐨨', 7391 => '𐨩', 7392 => '𐨪', 7393 => '𐨫', 7394 => '𐨬', 7395 => '𐨭', 7396 => '𐨮', 7397 => '𐨯', 7398 => '𐨰', 7399 => '𐨱', 7400 => '𐨲', 7401 => '𐨳', 7402 => 'ก', 7403 => 'ข', 7404 => 'ฃ', 7405 => 'ค', 7406 => 'ฅ', 7407 => 'ฆ', 7408 => 'ง', 7409 => 'จ', 7410 => 'ฉ', 7411 => 'ช', 7412 => 'ซ', 7413 => 'ฌ', 7414 => 'ญ', 7415 => 'ฎ', 7416 => 'ฏ', 7417 => 'ฐ', 7418 => 'ฑ', 7419 => 'ฒ', 7420 => 'ณ', 7421 => 'ด', 7422 => 'ต', 7423 => 'ถ', 7424 => 'ท', 7425 => 'ธ', 7426 => 'น', 7427 => 'บ', 7428 => 'ป', 7429 => 'ผ', 7430 => 'ฝ', 7431 => 'พ', 7432 => 'ฟ', 7433 => 'ภ', 7434 => 'ม', 7435 => 'ย', 7436 => 'ร', 7437 => 'ฤ', 7438 => 'ล', 7439 => 'ฦ', 7440 => 'ว', 7441 => 'ศ', 7442 => 'ษ', 7443 => 'ส', 7444 => 'ห', 7445 => 'ฬ', 7446 => 'อ', 7447 => 'ฮ', 7448 => 'ฯ', 7449 => 'ะ', 7450 => 'า', 7451 => 'ำ', 7452 => 'เ', 7453 => 'แ', 7454 => 'โ', 7455 => 'ใ', 7456 => 'ไ', 7457 => 'ๅ', 7458 => 'ກ', 7459 => 'ຂ', 7460 => 'ຄ', 7461 => 'ງ', 7462 => 'ຈ', 7463 => 'ສ', 7464 => 'ຊ', 7465 => 'ຍ', 7466 => 'ດ', 7467 => 'ຕ', 7468 => 'ຖ', 7469 => 'ທ', 7470 => 'ນ', 7471 => 'ບ', 7472 => 'ປ', 7473 => 'ຜ', 7474 => 'ຝ', 7475 => 'ພ', 7476 => 'ຟ', 7477 => 'ມ', 7478 => 'ຢ', 7479 => 'ຣ', 7480 => 'ລ', 7481 => 'ວ', 7482 => 'ຫ', 7483 => 'ອ', 7484 => 'ຮ', 7485 => 'ຯ', 7486 => 'ະ', 7487 => 'າ', 7488 => 'ຳ', 7489 => 'ຽ', 7490 => 'ເ', 7491 => 'ແ', 7492 => 'ໂ', 7493 => 'ໃ', 7494 => 'ໄ', 7495 => 'ꪀ', 7496 => 'ꪁ', 7497 => 'ꪂ', 7498 => 'ꪃ', 7499 => 'ꪄ', 7500 => 'ꪅ', 7501 => 'ꪆ', 7502 => 'ꪇ', 7503 => 'ꪈ', 7504 => 'ꪉ', 7505 => 'ꪊ', 7506 => 'ꪋ', 7507 => 'ꪌ', 7508 => 'ꪍ', 7509 => 'ꪎ', 7510 => 'ꪏ', 7511 => 'ꪐ', 7512 => 'ꪑ', 7513 => 'ꪒ', 7514 => 'ꪓ', 7515 => 'ꪔ', 7516 => 'ꪕ', 7517 => 'ꪖ', 7518 => 'ꪗ', 7519 => 'ꪘ', 7520 => 'ꪙ', 7521 => 'ꪚ', 7522 => 'ꪛ', 7523 => 'ꪜ', 7524 => 'ꪝ', 7525 => 'ꪞ', 7526 => 'ꪟ', 7527 => 'ꪠ', 7528 => 'ꪡ', 7529 => 'ꪢ', 7530 => 'ꪣ', 7531 => 'ꪤ', 7532 => 'ꪥ', 7533 => 'ꪦ', 7534 => 'ꪧ', 7535 => 'ꪨ', 7536 => 'ꪩ', 7537 => 'ꪪ', 7538 => 'ꪫ', 7539 => 'ꪬ', 7540 => 'ꪭ', 7541 => 'ꪮ', 7542 => 'ꪯ', 7543 => 'ꪱ', 7544 => 'ꪵ', 7545 => 'ꪶ', 7546 => 'ꪹ', 7547 => 'ꪺ', 7548 => 'ꪻ', 7549 => 'ꪼ', 7550 => 'ꪽ', 7551 => 'ꫀ', 7552 => 'ꫂ', 7553 => 'ꫛ', 7554 => 'ꫜ', 7555 => 'ཀ', 7556 => 'ཫ', 7557 => 'ཁ', 7558 => 'ག', 7559 => 'ང', 7560 => 'ཅ', 7561 => 'ཆ', 7562 => 'ཇ', 7563 => 'ཉ', 7564 => 'ཊ', 7565 => 'ཋ', 7566 => 'ཌ', 7567 => 'ཎ', 7568 => 'ཏ', 7569 => 'ཐ', 7570 => 'ད', 7571 => 'ན', 7572 => 'པ', 7573 => 'ཕ', 7574 => 'བ', 7575 => 'མ', 7576 => 'ཙ', 7577 => 'ཚ', 7578 => 'ཛ', 7579 => 'ཝ', 7580 => 'ཞ', 7581 => 'ཟ', 7582 => 'འ', 7583 => 'ཡ', 7584 => 'ར', 7585 => 'ཬ', 7586 => 'ལ', 7587 => 'ཤ', 7588 => 'ཥ', 7589 => 'ས', 7590 => 'ཧ', 7591 => 'ཨ', 7592 => 'ྈ', 7593 => 'ྉ', 7594 => 'ྌ', 7595 => 'ྊ', 7596 => 'ྋ', 7597 => 'ᰀ', 7598 => 'ᰁ', 7599 => 'ᰂ', 7600 => 'ᰃ', 7601 => 'ᰄ', 7602 => 'ᰅ', 7603 => 'ᰆ', 7604 => 'ᰇ', 7605 => 'ᰈ', 7606 => 'ᰉ', 7607 => 'ᱍ', 7608 => 'ᱎ', 7609 => 'ᱏ', 7610 => 'ᰊ', 7611 => 'ᰋ', 7612 => 'ᰌ', 7613 => 'ᰍ', 7614 => 'ᰎ', 7615 => 'ᰏ', 7616 => 'ᰐ', 7617 => 'ᰑ', 7618 => 'ᰒ', 7619 => 'ᰓ', 7620 => 'ᰔ', 7621 => 'ᰕ', 7622 => 'ᰖ', 7623 => 'ᰗ', 7624 => 'ᰘ', 7625 => 'ᰙ', 7626 => 'ᰚ', 7627 => 'ᰛ', 7628 => 'ᰜ', 7629 => 'ᰝ', 7630 => 'ᰞ', 7631 => 'ᰟ', 7632 => 'ᰠ', 7633 => 'ᰡ', 7634 => 'ᰢ', 7635 => 'ᰣ', 7636 => 'ꡀ', 7637 => 'ꡁ', 7638 => 'ꡂ', 7639 => 'ꡃ', 7640 => 'ꡄ', 7641 => 'ꡅ', 7642 => 'ꡆ', 7643 => 'ꡇ', 7644 => 'ꡩ', 7645 => 'ꡪ', 7646 => 'ꡫ', 7647 => 'ꡬ', 7648 => 'ꡈ', 7649 => 'ꡉ', 7650 => 'ꡊ', 7651 => 'ꡋ', 7652 => 'ꡌ', 7653 => 'ꡍ', 7654 => 'ꡎ', 7655 => 'ꡏ', 7656 => 'ꡐ', 7657 => 'ꡑ', 7658 => 'ꡒ', 7659 => 'ꡓ', 7660 => 'ꡧ', 7661 => 'ꡔ', 7662 => 'ꡕ', 7663 => 'ꡖ', 7664 => 'ꡗ', 7665 => 'ꡨ', 7666 => 'ꡭ', 7667 => 'ꡘ', 7668 => 'ꡱ', 7669 => 'ꡲ', 7670 => 'ꡙ', 7671 => 'ꡚ', 7672 => 'ꡮ', 7673 => 'ꡛ', 7674 => 'ꡜ', 7675 => 'ꡯ', 7676 => 'ꡰ', 7677 => 'ꡝ', 7678 => 'ꡢ', 7679 => 'ꡣ', 7680 => 'ꡤ', 7681 => 'ꡥ', 7682 => 'ꡞ', 7683 => 'ꡟ', 7684 => 'ꡠ', 7685 => 'ꡡ', 7686 => 'ꡦ', 7687 => 'ꡳ', 7688 => 'ᤀ', 7689 => 'ᤁ', 7690 => 'ᤂ', 7691 => 'ᤃ', 7692 => 'ᤄ', 7693 => 'ᤅ', 7694 => 'ᤆ', 7695 => 'ᤇ', 7696 => 'ᤈ', 7697 => 'ᤉ', 7698 => 'ᤊ', 7699 => 'ᤋ', 7700 => 'ᤌ', 7701 => 'ᤍ', 7702 => 'ᤎ', 7703 => 'ᤏ', 7704 => 'ᤐ', 7705 => 'ᤑ', 7706 => 'ᤒ', 7707 => 'ᤓ', 7708 => 'ᤔ', 7709 => 'ᤕ', 7710 => 'ᤖ', 7711 => 'ᤗ', 7712 => 'ᤘ', 7713 => 'ᤙ', 7714 => 'ᤚ', 7715 => 'ᤛ', 7716 => 'ᤜ', 7717 => 'ᜀ', 7718 => 'ᜁ', 7719 => 'ᜂ', 7720 => 'ᜃ', 7721 => 'ᜄ', 7722 => 'ᜅ', 7723 => 'ᜆ', 7724 => 'ᜇ', 7725 => 'ᜈ', 7726 => 'ᜉ', 7727 => 'ᜊ', 7728 => 'ᜋ', 7729 => 'ᜌ', 7730 => 'ᜎ', 7731 => 'ᜏ', 7732 => 'ᜐ', 7733 => 'ᜑ', 7734 => 'ᜠ', 7735 => 'ᜡ', 7736 => 'ᜢ', 7737 => 'ᜣ', 7738 => 'ᜤ', 7739 => 'ᜥ', 7740 => 'ᜦ', 7741 => 'ᜧ', 7742 => 'ᜨ', 7743 => 'ᜩ', 7744 => 'ᜪ', 7745 => 'ᜫ', 7746 => 'ᜬ', 7747 => 'ᜭ', 7748 => 'ᜮ', 7749 => 'ᜯ', 7750 => 'ᜰ', 7751 => 'ᜱ', 7752 => 'ᝀ', 7753 => 'ᝁ', 7754 => 'ᝂ', 7755 => 'ᝃ', 7756 => 'ᝄ', 7757 => 'ᝅ', 7758 => 'ᝆ', 7759 => 'ᝇ', 7760 => 'ᝈ', 7761 => 'ᝉ', 7762 => 'ᝊ', 7763 => 'ᝋ', 7764 => 'ᝌ', 7765 => 'ᝍ', 7766 => 'ᝎ', 7767 => 'ᝏ', 7768 => 'ᝐ', 7769 => 'ᝑ', 7770 => 'ᝠ', 7771 => 'ᝡ', 7772 => 'ᝢ', 7773 => 'ᝣ', 7774 => 'ᝤ', 7775 => 'ᝥ', 7776 => 'ᝦ', 7777 => 'ᝧ', 7778 => 'ᝨ', 7779 => 'ᝩ', 7780 => 'ᝪ', 7781 => 'ᝫ', 7782 => 'ᝬ', 7783 => 'ᝮ', 7784 => 'ᝯ', 7785 => 'ᝰ', 7786 => 'ᨀ', 7787 => 'ᨁ', 7788 => 'ᨂ', 7789 => 'ᨃ', 7790 => 'ᨄ', 7791 => 'ᨅ', 7792 => 'ᨆ', 7793 => 'ᨇ', 7794 => 'ᨈ', 7795 => 'ᨉ', 7796 => 'ᨊ', 7797 => 'ᨋ', 7798 => 'ᨌ', 7799 => 'ᨍ', 7800 => 'ᨎ', 7801 => 'ᨏ', 7802 => 'ᨐ', 7803 => 'ᨑ', 7804 => 'ᨒ', 7805 => 'ᨓ', 7806 => 'ᨔ', 7807 => 'ᨕ', 7808 => 'ᨖ', 7809 => 'ᯀ', 7810 => 'ᯂ', 7811 => 'ᯅ', 7812 => 'ᯇ', 7813 => 'ᯉ', 7814 => 'ᯋ', 7815 => 'ᯎ', 7816 => 'ᯐ', 7817 => 'ᯑ', 7818 => 'ᯒ', 7819 => 'ᯔ', 7820 => 'ᯖ', 7821 => 'ᯘ', 7822 => 'ᯛ', 7823 => 'ᯝ', 7824 => 'ᯞ', 7825 => 'ᯠ', 7826 => 'ᯡ', 7827 => 'ᯢ', 7828 => 'ᯣ', 7829 => 'ᯤ', 7830 => 'ᯥ', 7831 => 'ꤰ', 7832 => 'ꤱ', 7833 => 'ꤲ', 7834 => 'ꤳ', 7835 => 'ꤴ', 7836 => 'ꤵ', 7837 => 'ꤶ', 7838 => 'ꤷ', 7839 => 'ꤸ', 7840 => 'ꤹ', 7841 => 'ꤺ', 7842 => 'ꤻ', 7843 => 'ꤼ', 7844 => 'ꤽ', 7845 => 'ꤾ', 7846 => 'ꤿ', 7847 => 'ꥀ', 7848 => 'ꥁ', 7849 => 'ꥂ', 7850 => 'ꥃ', 7851 => 'ꥄ', 7852 => 'ꥅ', 7853 => 'ꥆ', 7854 => 'ꤊ', 7855 => 'ꤋ', 7856 => 'ꤌ', 7857 => 'ꤍ', 7858 => 'ꤎ', 7859 => 'ꤏ', 7860 => 'ꤐ', 7861 => 'ꤑ', 7862 => 'ꤒ', 7863 => 'ꤓ', 7864 => 'ꤔ', 7865 => 'ꤕ', 7866 => 'ꤖ', 7867 => 'ꤗ', 7868 => 'ꤘ', 7869 => 'ꤙ', 7870 => 'ꤚ', 7871 => 'ꤛ', 7872 => 'ꤜ', 7873 => 'ꤝ', 7874 => 'ꤞ', 7875 => 'ꤟ', 7876 => 'ꤠ', 7877 => 'ꤡ', 7878 => 'ꤢ', 7879 => 'ꤣ', 7880 => 'ꤤ', 7881 => 'ꤥ', 7882 => 'က', 7883 => 'ၵ', 7884 => 'ခ', 7885 => 'ၶ', 7886 => 'ဂ', 7887 => 'ၷ', 7888 => 'ꩠ', 7889 => 'ဃ', 7890 => 'င', 7891 => 'ၚ', 7892 => 'စ', 7893 => 'ၸ', 7894 => 'ꩡ', 7895 => 'ဆ', 7896 => 'ꩢ', 7897 => 'ဇ', 7898 => 'ꩣ', 7899 => 'ၹ', 7900 => 'ꩲ', 7901 => 'ဈ', 7902 => 'ၛ', 7903 => 'ꩤ', 7904 => 'ၡ', 7905 => 'ဉ', 7906 => 'ၺ', 7907 => 'ꩥ', 7908 => 'ည', 7909 => 'ဋ', 7910 => 'ꩦ', 7911 => 'ဌ', 7912 => 'ꩧ', 7913 => 'ဍ', 7914 => 'ꩨ', 7915 => 'ဎ', 7916 => 'ꩩ', 7917 => 'ဏ', 7918 => 'ၮ', 7919 => 'တ', 7920 => 'ထ', 7921 => 'ဒ', 7922 => 'ၻ', 7923 => 'ဓ', 7924 => 'ꩪ', 7925 => 'န', 7926 => 'ၼ', 7927 => 'ꩫ', 7928 => 'ပ', 7929 => 'ဖ', 7930 => 'ၽ', 7931 => 'ၾ', 7932 => 'ꩯ', 7933 => 'ႎ', 7934 => 'ဗ', 7935 => 'ၿ', 7936 => 'ဘ', 7937 => 'မ', 7938 => 'ယ', 7939 => 'ရ', 7940 => 'ꩳ', 7941 => 'ꩺ', 7942 => 'လ', 7943 => 'ဝ', 7944 => 'ႀ', 7945 => 'ၐ', 7946 => 'ၑ', 7947 => 'ၥ', 7948 => 'သ', 7949 => 'ꩬ', 7950 => 'ဟ', 7951 => 'ႁ', 7952 => 'ꩭ', 7953 => 'ꩮ', 7954 => 'ꩱ', 7955 => 'ဠ', 7956 => 'ၜ', 7957 => 'ၝ', 7958 => 'ၯ', 7959 => 'ၰ', 7960 => 'ၦ', 7961 => 'အ', 7962 => 'ဢ', 7963 => 'ဣ', 7964 => 'ဤ', 7965 => 'ဥ', 7966 => 'ဦ', 7967 => 'ၒ', 7968 => 'ၓ', 7969 => 'ၔ', 7970 => 'ၕ', 7971 => 'ဧ', 7972 => 'ဨ', 7973 => 'ဩ', 7974 => 'ဪ', 7975 => 'ꩴ', 7976 => 'ꩵ', 7977 => 'ꩶ', 7978 => 'ក', 7979 => 'ខ', 7980 => 'គ', 7981 => 'ឃ', 7982 => 'ង', 7983 => 'ច', 7984 => 'ឆ', 7985 => 'ជ', 7986 => 'ឈ', 7987 => 'ញ', 7988 => 'ដ', 7989 => 'ឋ', 7990 => 'ឌ', 7991 => 'ឍ', 7992 => 'ណ', 7993 => 'ត', 7994 => 'ថ', 7995 => 'ទ', 7996 => 'ធ', 7997 => 'ន', 7998 => 'ប', 7999 => 'ផ', 8000 => 'ព', 8001 => 'ភ', 8002 => 'ម', 8003 => 'យ', 8004 => 'រ', 8005 => 'ល', 8006 => 'វ', 8007 => 'ឝ', 8008 => 'ឞ', 8009 => 'ស', 8010 => 'ហ', 8011 => 'ឡ', 8012 => 'អ', 8013 => 'ៜ', 8014 => 'ឣ', 8015 => 'ឤ', 8016 => 'ឥ', 8017 => 'ឦ', 8018 => 'ឧ', 8019 => 'ឨ', 8020 => 'ឩ', 8021 => 'ឪ', 8022 => 'ឫ', 8023 => 'ឬ', 8024 => 'ឭ', 8025 => 'ឮ', 8026 => 'ឯ', 8027 => 'ឰ', 8028 => 'ឱ', 8029 => 'ឲ', 8030 => 'ឳ', 8031 => 'ᥐ', 8032 => 'ᥑ', 8033 => 'ᥒ', 8034 => 'ᥓ', 8035 => 'ᥔ', 8036 => 'ᥕ', 8037 => 'ᥖ', 8038 => 'ᥗ', 8039 => 'ᥘ', 8040 => 'ᥙ', 8041 => 'ᥚ', 8042 => 'ᥛ', 8043 => 'ᥜ', 8044 => 'ᥝ', 8045 => 'ᥞ', 8046 => 'ᥟ', 8047 => 'ᥠ', 8048 => 'ᥡ', 8049 => 'ᥢ', 8050 => 'ᥣ', 8051 => 'ᥤ', 8052 => 'ᥥ', 8053 => 'ᥦ', 8054 => 'ᥧ', 8055 => 'ᥨ', 8056 => 'ᥩ', 8057 => 'ᥪ', 8058 => 'ᥫ', 8059 => 'ᥬ', 8060 => 'ᥭ', 8061 => 'ᥰ', 8062 => 'ᥱ', 8063 => 'ᥲ', 8064 => 'ᥳ', 8065 => 'ᥴ', 8066 => 'ᦀ', 8067 => 'ᦁ', 8068 => 'ᦂ', 8069 => 'ᦃ', 8070 => 'ᦄ', 8071 => 'ᦅ', 8072 => 'ᦆ', 8073 => 'ᦇ', 8074 => 'ᦈ', 8075 => 'ᦉ', 8076 => 'ᦊ', 8077 => 'ᦋ', 8078 => 'ᦌ', 8079 => 'ᦍ', 8080 => 'ᦎ', 8081 => 'ᦏ', 8082 => 'ᦐ', 8083 => 'ᦑ', 8084 => 'ᦒ', 8085 => 'ᦓ', 8086 => 'ᦔ', 8087 => 'ᦕ', 8088 => 'ᦖ', 8089 => 'ᦗ', 8090 => 'ᦘ', 8091 => 'ᦙ', 8092 => 'ᦚ', 8093 => 'ᦛ', 8094 => 'ᦜ', 8095 => 'ᦝ', 8096 => 'ᦞ', 8097 => 'ᦟ', 8098 => 'ᦠ', 8099 => 'ᦡ', 8100 => 'ᦢ', 8101 => 'ᦣ', 8102 => 'ᦤ', 8103 => 'ᦥ', 8104 => 'ᦦ', 8105 => 'ᦧ', 8106 => 'ᦨ', 8107 => 'ᦩ', 8108 => 'ᦪ', 8109 => 'ᦫ', 8110 => 'ᧁ', 8111 => 'ᧂ', 8112 => 'ᧃ', 8113 => 'ᧄ', 8114 => 'ᧅ', 8115 => 'ᧆ', 8116 => 'ᧇ', 8117 => 'ᨠ', 8118 => 'ᨡ', 8119 => 'ᨢ', 8120 => 'ᨣ', 8121 => 'ᨤ', 8122 => 'ᨥ', 8123 => 'ᨦ', 8124 => 'ᨧ', 8125 => 'ᨨ', 8126 => 'ᨩ', 8127 => 'ᨪ', 8128 => 'ᨫ', 8129 => 'ᨬ', 8130 => 'ᨭ', 8131 => 'ᨮ', 8132 => 'ᨯ', 8133 => 'ᨰ', 8134 => 'ᨱ', 8135 => 'ᨲ', 8136 => 'ᨳ', 8137 => 'ᨴ', 8138 => 'ᨵ', 8139 => 'ᨶ', 8140 => 'ᨷ', 8141 => 'ᨸ', 8142 => 'ᨹ', 8143 => 'ᨺ', 8144 => 'ᨻ', 8145 => 'ᨼ', 8146 => 'ᨽ', 8147 => 'ᨾ', 8148 => 'ᨿ', 8149 => 'ᩀ', 8150 => 'ᩁ', 8151 => 'ᩂ', 8152 => 'ᩃ', 8153 => 'ᩄ', 8154 => 'ᩅ', 8155 => 'ᩆ', 8156 => 'ᩇ', 8157 => 'ᩈ', 8158 => 'ᩉ', 8159 => 'ᩊ', 8160 => 'ᩋ', 8161 => 'ᩌ', 8162 => 'ᩓ', 8163 => 'ᩍ', 8164 => 'ᩎ', 8165 => 'ᩏ', 8166 => 'ᩐ', 8167 => 'ᩑ', 8168 => 'ᩒ', 8169 => 'ꨀ', 8170 => 'ꨁ', 8171 => 'ꨂ', 8172 => 'ꨃ', 8173 => 'ꨄ', 8174 => 'ꨅ', 8175 => 'ꨆ', 8176 => 'ꨇ', 8177 => 'ꨈ', 8178 => 'ꨉ', 8179 => 'ꨊ', 8180 => 'ꨋ', 8181 => 'ꨌ', 8182 => 'ꨍ', 8183 => 'ꨎ', 8184 => 'ꨏ', 8185 => 'ꨐ', 8186 => 'ꨑ', 8187 => 'ꨒ', 8188 => 'ꨓ', 8189 => 'ꨔ', 8190 => 'ꨕ', 8191 => 'ꨖ', 8192 => 'ꨗ', 8193 => 'ꨘ', 8194 => 'ꨙ', 8195 => 'ꨚ', 8196 => 'ꨛ', 8197 => 'ꨜ', 8198 => 'ꨝ', 8199 => 'ꨞ', 8200 => 'ꨟ', 8201 => 'ꨠ', 8202 => 'ꨡ', 8203 => 'ꨢ', 8204 => 'ꨣ', 8205 => 'ꨤ', 8206 => 'ꨥ', 8207 => 'ꨦ', 8208 => 'ꨧ', 8209 => 'ꨨ', 8210 => 'ꩀ', 8211 => 'ꩁ', 8212 => 'ꩂ', 8213 => 'ꩄ', 8214 => 'ꩅ', 8215 => 'ꩆ', 8216 => 'ꩇ', 8217 => 'ꩈ', 8218 => 'ꩉ', 8219 => 'ꩊ', 8220 => 'ꩋ', 8221 => 'ᬅ', 8222 => 'ᬆ', 8223 => 'ᬇ', 8224 => 'ᬈ', 8225 => 'ᬉ', 8226 => 'ᬊ', 8227 => 'ᬋ', 8228 => 'ᬌ', 8229 => 'ᬍ', 8230 => 'ᬎ', 8231 => 'ᬏ', 8232 => 'ᬐ', 8233 => 'ᬑ', 8234 => 'ᬒ', 8235 => 'ᬓ', 8236 => 'ᭅ', 8237 => 'ᭆ', 8238 => 'ᬔ', 8239 => 'ᬕ', 8240 => 'ᬖ', 8241 => 'ᬗ', 8242 => 'ᬘ', 8243 => 'ᬙ', 8244 => 'ᬚ', 8245 => 'ᬛ', 8246 => 'ᬜ', 8247 => 'ᬝ', 8248 => 'ᬞ', 8249 => 'ᬟ', 8250 => 'ᬠ', 8251 => 'ᬡ', 8252 => 'ᬢ', 8253 => 'ᭇ', 8254 => 'ᬣ', 8255 => 'ᬤ', 8256 => 'ᬥ', 8257 => 'ᬦ', 8258 => 'ᬧ', 8259 => 'ᭈ', 8260 => 'ᬨ', 8261 => 'ᬩ', 8262 => 'ᬪ', 8263 => 'ᬫ', 8264 => 'ᬬ', 8265 => 'ᬭ', 8266 => 'ᬮ', 8267 => 'ᬯ', 8268 => 'ᭉ', 8269 => 'ᬰ', 8270 => 'ᬱ', 8271 => 'ᬲ', 8272 => 'ᭊ', 8273 => 'ᭋ', 8274 => 'ᬳ', 8275 => 'ꦄ', 8276 => 'ꦅ', 8277 => 'ꦆ', 8278 => 'ꦇ', 8279 => 'ꦈ', 8280 => 'ꦉ', 8281 => 'ꦊ', 8282 => 'ꦋ', 8283 => 'ꦌ', 8284 => 'ꦍ', 8285 => 'ꦎ', 8286 => 'ꦏ', 8287 => 'ꦐ', 8288 => 'ꦑ', 8289 => 'ꦒ', 8290 => 'ꦓ', 8291 => 'ꦔ', 8292 => 'ꦕ', 8293 => 'ꦖ', 8294 => 'ꦗ', 8295 => 'ꦘ', 8296 => 'ꦙ', 8297 => 'ꦚ', 8298 => 'ꦛ', 8299 => 'ꦜ', 8300 => 'ꦝ', 8301 => 'ꦞ', 8302 => 'ꦟ', 8303 => 'ꦠ', 8304 => 'ꦡ', 8305 => 'ꦢ', 8306 => 'ꦣ', 8307 => 'ꦤ', 8308 => 'ꦥ', 8309 => 'ꦦ', 8310 => 'ꦧ', 8311 => 'ꦨ', 8312 => 'ꦩ', 8313 => 'ꦪ', 8314 => 'ꦫ', 8315 => 'ꦭ', 8316 => 'ꦮ', 8317 => 'ꦯ', 8318 => 'ꦰ', 8319 => 'ꦱ', 8320 => 'ꦲ', 8321 => 'ᢀ', 8322 => 'ᢁ', 8323 => 'ᢂ', 8324 => 'ᢃ', 8325 => 'ᢄ', 8326 => 'ᢅ', 8327 => 'ᢆ', 8328 => 'ᡃ', 8329 => 'ᠠ', 8330 => 'ᢇ', 8331 => 'ᠡ', 8332 => 'ᡄ', 8333 => 'ᡝ', 8334 => 'ᠢ', 8335 => 'ᡅ', 8336 => 'ᡞ', 8337 => 'ᡳ', 8338 => 'ᢈ', 8339 => 'ᡟ', 8340 => 'ᠣ', 8341 => 'ᡆ', 8342 => 'ᠤ', 8343 => 'ᡇ', 8344 => 'ᡡ', 8345 => 'ᠥ', 8346 => 'ᡈ', 8347 => 'ᠦ', 8348 => 'ᡉ', 8349 => 'ᡠ', 8350 => 'ᠧ', 8351 => 'ᠨ', 8352 => 'ᠩ', 8353 => 'ᡊ', 8354 => 'ᡢ', 8355 => 'ᢊ', 8356 => 'ᢛ', 8357 => 'ᠪ', 8358 => 'ᡋ', 8359 => 'ᠫ', 8360 => 'ᡌ', 8361 => 'ᡦ', 8362 => 'ᠬ', 8363 => 'ᡍ', 8364 => 'ᠭ', 8365 => 'ᡎ', 8366 => 'ᡤ', 8367 => 'ᢚ', 8368 => 'ᡥ', 8369 => 'ᠮ', 8370 => 'ᡏ', 8371 => 'ᠯ', 8372 => 'ᠰ', 8373 => 'ᠱ', 8374 => 'ᡧ', 8375 => 'ᢜ', 8376 => 'ᢝ', 8377 => 'ᢢ', 8378 => 'ᢤ', 8379 => 'ᢥ', 8380 => 'ᠲ', 8381 => 'ᡐ', 8382 => 'ᡨ', 8383 => 'ᠳ', 8384 => 'ᡑ', 8385 => 'ᡩ', 8386 => 'ᠴ', 8387 => 'ᡒ', 8388 => 'ᡱ', 8389 => 'ᡜ', 8390 => 'ᢋ', 8391 => 'ᠵ', 8392 => 'ᡓ', 8393 => 'ᡪ', 8394 => 'ᡷ', 8395 => 'ᠶ', 8396 => 'ᡕ', 8397 => 'ᡲ', 8398 => 'ᠷ', 8399 => 'ᡵ', 8400 => 'ᠸ', 8401 => 'ᡖ', 8402 => 'ᠹ', 8403 => 'ᡫ', 8404 => 'ᡶ', 8405 => 'ᠺ', 8406 => 'ᡗ', 8407 => 'ᡣ', 8408 => 'ᡴ', 8409 => 'ᢉ', 8410 => 'ᠻ', 8411 => 'ᠼ', 8412 => 'ᡔ', 8413 => 'ᡮ', 8414 => 'ᠽ', 8415 => 'ᡯ', 8416 => 'ᡘ', 8417 => 'ᡬ', 8418 => 'ᠾ', 8419 => 'ᡙ', 8420 => 'ᡭ', 8421 => 'ᠿ', 8422 => 'ᡀ', 8423 => 'ᡁ', 8424 => 'ᡂ', 8425 => 'ᡚ', 8426 => 'ᡛ', 8427 => 'ᡰ', 8428 => 'ᢌ', 8429 => 'ᢞ', 8430 => 'ᢍ', 8431 => 'ᢎ', 8432 => 'ᢟ', 8433 => 'ᢏ', 8434 => 'ᢐ', 8435 => 'ᢘ', 8436 => 'ᢠ', 8437 => 'ᢑ', 8438 => 'ᢡ', 8439 => 'ᢒ', 8440 => 'ᢓ', 8441 => 'ᢨ', 8442 => 'ᢔ', 8443 => 'ᢣ', 8444 => 'ᢕ', 8445 => 'ᢙ', 8446 => 'ᢖ', 8447 => 'ᢗ', 8448 => 'ᢦ', 8449 => 'ᢧ', 8450 => 'ᢪ', 8451 => 'ᱚ', 8452 => 'ᱛ', 8453 => 'ᱜ', 8454 => 'ᱝ', 8455 => 'ᱞ', 8456 => 'ᱟ', 8457 => 'ᱠ', 8458 => 'ᱡ', 8459 => 'ᱢ', 8460 => 'ᱣ', 8461 => 'ᱤ', 8462 => 'ᱥ', 8463 => 'ᱦ', 8464 => 'ᱧ', 8465 => 'ᱨ', 8466 => 'ᱩ', 8467 => 'ᱪ', 8468 => 'ᱫ', 8469 => 'ᱬ', 8470 => 'ᱭ', 8471 => 'ᱮ', 8472 => 'ᱯ', 8473 => 'ᱰ', 8474 => 'ᱱ', 8475 => 'ᱲ', 8476 => 'ᱳ', 8477 => 'ᱴ', 8478 => 'ᱵ', 8479 => 'ᱶ', 8480 => 'ᱷ', 8481 => 'ᱸ', 8482 => 'ᱹ', 8483 => 'ᱺ', 8484 => 'ᱻ', 8485 => 'ᱼ', 8486 => 'ᱽ', 8487 => 'Ꭰ', 8488 => 'Ꭱ', 8489 => 'Ꭲ', 8490 => 'Ꭳ', 8491 => 'Ꭴ', 8492 => 'Ꭵ', 8493 => 'Ꭶ', 8494 => 'Ꭷ', 8495 => 'Ꭸ', 8496 => 'Ꭹ', 8497 => 'Ꭺ', 8498 => 'Ꭻ', 8499 => 'Ꭼ', 8500 => 'Ꭽ', 8501 => 'Ꭾ', 8502 => 'Ꭿ', 8503 => 'Ꮀ', 8504 => 'Ꮁ', 8505 => 'Ꮂ', 8506 => 'Ꮃ', 8507 => 'Ꮄ', 8508 => 'Ꮅ', 8509 => 'Ꮆ', 8510 => 'Ꮇ', 8511 => 'Ꮈ', 8512 => 'Ꮉ', 8513 => 'Ꮊ', 8514 => 'Ꮋ', 8515 => 'Ꮌ', 8516 => 'Ꮍ', 8517 => 'Ꮎ', 8518 => 'Ꮏ', 8519 => 'Ꮐ', 8520 => 'Ꮑ', 8521 => 'Ꮒ', 8522 => 'Ꮓ', 8523 => 'Ꮔ', 8524 => 'Ꮕ', 8525 => 'Ꮖ', 8526 => 'Ꮗ', 8527 => 'Ꮘ', 8528 => 'Ꮙ', 8529 => 'Ꮚ', 8530 => 'Ꮛ', 8531 => 'Ꮜ', 8532 => 'Ꮝ', 8533 => 'Ꮞ', 8534 => 'Ꮟ', 8535 => 'Ꮠ', 8536 => 'Ꮡ', 8537 => 'Ꮢ', 8538 => 'Ꮣ', 8539 => 'Ꮤ', 8540 => 'Ꮥ', 8541 => 'Ꮦ', 8542 => 'Ꮧ', 8543 => 'Ꮨ', 8544 => 'Ꮩ', 8545 => 'Ꮪ', 8546 => 'Ꮫ', 8547 => 'Ꮬ', 8548 => 'Ꮭ', 8549 => 'Ꮮ', 8550 => 'Ꮯ', 8551 => 'Ꮰ', 8552 => 'Ꮱ', 8553 => 'Ꮲ', 8554 => 'Ꮳ', 8555 => 'Ꮴ', 8556 => 'Ꮵ', 8557 => 'Ꮶ', 8558 => 'Ꮷ', 8559 => 'Ꮸ', 8560 => 'Ꮹ', 8561 => 'Ꮺ', 8562 => 'Ꮻ', 8563 => 'Ꮼ', 8564 => 'Ꮽ', 8565 => 'Ꮾ', 8566 => 'Ꮿ', 8567 => 'Ᏸ', 8568 => 'Ᏹ', 8569 => 'Ᏺ', 8570 => 'Ᏻ', 8571 => 'Ᏼ', 8572 => 'ᐁ', 8573 => 'ᐂ', 8574 => 'ᐃ', 8575 => 'ᐄ', 8576 => 'ᐅ', 8577 => 'ᐆ', 8578 => 'ᐇ', 8579 => 'ᐈ', 8580 => 'ᐉ', 8581 => 'ᐊ', 8582 => 'ᐋ', 8583 => 'ᐌ', 8584 => 'ᐍ', 8585 => 'ᐎ', 8586 => 'ᐏ', 8587 => 'ᐐ', 8588 => 'ᐑ', 8589 => 'ᐒ', 8590 => 'ᐓ', 8591 => 'ᐔ', 8592 => 'ᐕ', 8593 => 'ᐖ', 8594 => 'ᐗ', 8595 => 'ᐘ', 8596 => 'ᐙ', 8597 => 'ᐚ', 8598 => 'ᐛ', 8599 => 'ᐜ', 8600 => 'ᐝ', 8601 => 'ᐞ', 8602 => 'ᐟ', 8603 => 'ᐠ', 8604 => 'ᐡ', 8605 => 'ᐢ', 8606 => 'ᐣ', 8607 => 'ᐤ', 8608 => 'ᐥ', 8609 => 'ᐦ', 8610 => 'ᐧ', 8611 => 'ᐨ', 8612 => 'ᐩ', 8613 => 'ᐪ', 8614 => 'ᐫ', 8615 => 'ᐬ', 8616 => 'ᐭ', 8617 => 'ᐮ', 8618 => 'ᐯ', 8619 => 'ᐰ', 8620 => 'ᐱ', 8621 => 'ᐲ', 8622 => 'ᐳ', 8623 => 'ᐴ', 8624 => 'ᐵ', 8625 => 'ᐶ', 8626 => 'ᐷ', 8627 => 'ᐸ', 8628 => 'ᐹ', 8629 => 'ᐺ', 8630 => 'ᐻ', 8631 => 'ᐼ', 8632 => 'ᐽ', 8633 => 'ᐾ', 8634 => 'ᐿ', 8635 => 'ᑀ', 8636 => 'ᑁ', 8637 => 'ᑂ', 8638 => 'ᑃ', 8639 => 'ᑄ', 8640 => 'ᑅ', 8641 => 'ᑆ', 8642 => 'ᑇ', 8643 => 'ᑈ', 8644 => 'ᑉ', 8645 => 'ᑊ', 8646 => 'ᑋ', 8647 => 'ᑌ', 8648 => 'ᑍ', 8649 => 'ᑎ', 8650 => 'ᑏ', 8651 => 'ᑐ', 8652 => 'ᑑ', 8653 => 'ᑒ', 8654 => 'ᑓ', 8655 => 'ᑔ', 8656 => 'ᑕ', 8657 => 'ᑖ', 8658 => 'ᑗ', 8659 => 'ᑘ', 8660 => 'ᑙ', 8661 => 'ᑚ', 8662 => 'ᑛ', 8663 => 'ᑜ', 8664 => 'ᑝ', 8665 => 'ᑞ', 8666 => 'ᑟ', 8667 => 'ᑠ', 8668 => 'ᑡ', 8669 => 'ᑢ', 8670 => 'ᑣ', 8671 => 'ᑤ', 8672 => 'ᑥ', 8673 => 'ᑦ', 8674 => 'ᑧ', 8675 => 'ᑨ', 8676 => 'ᑩ', 8677 => 'ᑪ', 8678 => 'ᑫ', 8679 => 'ᑬ', 8680 => 'ᑭ', 8681 => 'ᑮ', 8682 => 'ᑯ', 8683 => 'ᑰ', 8684 => 'ᑱ', 8685 => 'ᑲ', 8686 => 'ᑳ', 8687 => 'ᑴ', 8688 => 'ᑵ', 8689 => 'ᑶ', 8690 => 'ᑷ', 8691 => 'ᑸ', 8692 => 'ᑹ', 8693 => 'ᑺ', 8694 => 'ᑻ', 8695 => 'ᑼ', 8696 => 'ᑽ', 8697 => 'ᑾ', 8698 => 'ᑿ', 8699 => 'ᒀ', 8700 => 'ᒁ', 8701 => 'ᒂ', 8702 => 'ᒃ', 8703 => 'ᒄ', 8704 => 'ᒅ', 8705 => 'ᒆ', 8706 => 'ᒇ', 8707 => 'ᒈ', 8708 => 'ᒉ', 8709 => 'ᒊ', 8710 => 'ᒋ', 8711 => 'ᒌ', 8712 => 'ᒍ', 8713 => 'ᒎ', 8714 => 'ᒏ', 8715 => 'ᒐ', 8716 => 'ᒑ', 8717 => 'ᒒ', 8718 => 'ᒓ', 8719 => 'ᒔ', 8720 => 'ᒕ', 8721 => 'ᒖ', 8722 => 'ᒗ', 8723 => 'ᒘ', 8724 => 'ᒙ', 8725 => 'ᒚ', 8726 => 'ᒛ', 8727 => 'ᒜ', 8728 => 'ᒝ', 8729 => 'ᒞ', 8730 => 'ᒟ', 8731 => 'ᒠ', 8732 => 'ᒡ', 8733 => 'ᒢ', 8734 => 'ᒣ', 8735 => 'ᒤ', 8736 => 'ᒥ', 8737 => 'ᒦ', 8738 => 'ᒧ', 8739 => 'ᒨ', 8740 => 'ᒩ', 8741 => 'ᒪ', 8742 => 'ᒫ', 8743 => 'ᒬ', 8744 => 'ᒭ', 8745 => 'ᒮ', 8746 => 'ᒯ', 8747 => 'ᒰ', 8748 => 'ᒱ', 8749 => 'ᒲ', 8750 => 'ᒳ', 8751 => 'ᒴ', 8752 => 'ᒵ', 8753 => 'ᒶ', 8754 => 'ᒷ', 8755 => 'ᒸ', 8756 => 'ᒹ', 8757 => 'ᒺ', 8758 => 'ᒻ', 8759 => 'ᒼ', 8760 => 'ᒽ', 8761 => 'ᒾ', 8762 => 'ᒿ', 8763 => 'ᓀ', 8764 => 'ᓁ', 8765 => 'ᓂ', 8766 => 'ᓃ', 8767 => 'ᓄ', 8768 => 'ᓅ', 8769 => 'ᓆ', 8770 => 'ᓇ', 8771 => 'ᓈ', 8772 => 'ᓉ', 8773 => 'ᓊ', 8774 => 'ᓋ', 8775 => 'ᓌ', 8776 => 'ᓍ', 8777 => 'ᓎ', 8778 => 'ᓏ', 8779 => 'ᓐ', 8780 => 'ᓑ', 8781 => 'ᓒ', 8782 => 'ᓓ', 8783 => 'ᓔ', 8784 => 'ᓕ', 8785 => 'ᓖ', 8786 => 'ᓗ', 8787 => 'ᓘ', 8788 => 'ᓙ', 8789 => 'ᓚ', 8790 => 'ᓛ', 8791 => 'ᓜ', 8792 => 'ᓝ', 8793 => 'ᓞ', 8794 => 'ᓟ', 8795 => 'ᓠ', 8796 => 'ᓡ', 8797 => 'ᓢ', 8798 => 'ᓣ', 8799 => 'ᓤ', 8800 => 'ᓥ', 8801 => 'ᓦ', 8802 => 'ᓧ', 8803 => 'ᓨ', 8804 => 'ᓩ', 8805 => 'ᓪ', 8806 => 'ᓫ', 8807 => 'ᓬ', 8808 => 'ᓭ', 8809 => 'ᓮ', 8810 => 'ᓯ', 8811 => 'ᓰ', 8812 => 'ᓱ', 8813 => 'ᓲ', 8814 => 'ᓳ', 8815 => 'ᓴ', 8816 => 'ᓵ', 8817 => 'ᓶ', 8818 => 'ᓷ', 8819 => 'ᓸ', 8820 => 'ᓹ', 8821 => 'ᓺ', 8822 => 'ᓻ', 8823 => 'ᓼ', 8824 => 'ᓽ', 8825 => 'ᓾ', 8826 => 'ᓿ', 8827 => 'ᔀ', 8828 => 'ᔁ', 8829 => 'ᔂ', 8830 => 'ᔃ', 8831 => 'ᔄ', 8832 => 'ᔅ', 8833 => 'ᔆ', 8834 => 'ᔇ', 8835 => 'ᔈ', 8836 => 'ᔉ', 8837 => 'ᔊ', 8838 => 'ᔋ', 8839 => 'ᔌ', 8840 => 'ᔍ', 8841 => 'ᔎ', 8842 => 'ᔏ', 8843 => 'ᔐ', 8844 => 'ᔑ', 8845 => 'ᔒ', 8846 => 'ᔓ', 8847 => 'ᔔ', 8848 => 'ᔕ', 8849 => 'ᔖ', 8850 => 'ᔗ', 8851 => 'ᔘ', 8852 => 'ᔙ', 8853 => 'ᔚ', 8854 => 'ᔛ', 8855 => 'ᔜ', 8856 => 'ᔝ', 8857 => 'ᔞ', 8858 => 'ᔟ', 8859 => 'ᔠ', 8860 => 'ᔡ', 8861 => 'ᔢ', 8862 => 'ᔣ', 8863 => 'ᔤ', 8864 => 'ᔥ', 8865 => 'ᔦ', 8866 => 'ᔧ', 8867 => 'ᔨ', 8868 => 'ᔩ', 8869 => 'ᔪ', 8870 => 'ᔫ', 8871 => 'ᔬ', 8872 => 'ᔭ', 8873 => 'ᔮ', 8874 => 'ᔯ', 8875 => 'ᔰ', 8876 => 'ᔱ', 8877 => 'ᔲ', 8878 => 'ᔳ', 8879 => 'ᔴ', 8880 => 'ᔵ', 8881 => 'ᔶ', 8882 => 'ᔷ', 8883 => 'ᔸ', 8884 => 'ᔹ', 8885 => 'ᔺ', 8886 => 'ᔻ', 8887 => 'ᔼ', 8888 => 'ᔽ', 8889 => 'ᔾ', 8890 => 'ᔿ', 8891 => 'ᕀ', 8892 => 'ᕁ', 8893 => 'ᕂ', 8894 => 'ᕃ', 8895 => 'ᕄ', 8896 => 'ᕅ', 8897 => 'ᕆ', 8898 => 'ᕇ', 8899 => 'ᕈ', 8900 => 'ᕉ', 8901 => 'ᕊ', 8902 => 'ᕋ', 8903 => 'ᕌ', 8904 => 'ᕍ', 8905 => 'ᕎ', 8906 => 'ᕏ', 8907 => 'ᕐ', 8908 => 'ᕑ', 8909 => 'ᕒ', 8910 => 'ᕓ', 8911 => 'ᕔ', 8912 => 'ᕕ', 8913 => 'ᕖ', 8914 => 'ᕗ', 8915 => 'ᕘ', 8916 => 'ᕙ', 8917 => 'ᕚ', 8918 => 'ᕛ', 8919 => 'ᕜ', 8920 => 'ᕝ', 8921 => 'ᕞ', 8922 => 'ᕟ', 8923 => 'ᕠ', 8924 => 'ᕡ', 8925 => 'ᕢ', 8926 => 'ᕣ', 8927 => 'ᕤ', 8928 => 'ᕥ', 8929 => 'ᕦ', 8930 => 'ᕧ', 8931 => 'ᕨ', 8932 => 'ᕩ', 8933 => 'ᕪ', 8934 => 'ᕫ', 8935 => 'ᕬ', 8936 => 'ᕭ', 8937 => 'ᕮ', 8938 => 'ᕯ', 8939 => 'ᕰ', 8940 => 'ᕱ', 8941 => 'ᕲ', 8942 => 'ᕳ', 8943 => 'ᕴ', 8944 => 'ᕵ', 8945 => 'ᕶ', 8946 => 'ᕷ', 8947 => 'ᕸ', 8948 => 'ᕹ', 8949 => 'ᕺ', 8950 => 'ᕻ', 8951 => 'ᕽ', 8952 => 'ᙯ', 8953 => 'ᕾ', 8954 => 'ᕿ', 8955 => 'ᖀ', 8956 => 'ᖁ', 8957 => 'ᖂ', 8958 => 'ᖃ', 8959 => 'ᖄ', 8960 => 'ᖅ', 8961 => 'ᖆ', 8962 => 'ᖇ', 8963 => 'ᖈ', 8964 => 'ᖉ', 8965 => 'ᖊ', 8966 => 'ᖋ', 8967 => 'ᖌ', 8968 => 'ᖍ', 8969 => 'ᙰ', 8970 => 'ᖎ', 8971 => 'ᖏ', 8972 => 'ᖐ', 8973 => 'ᖑ', 8974 => 'ᖒ', 8975 => 'ᖓ', 8976 => 'ᖔ', 8977 => 'ᖕ', 8978 => 'ᙱ', 8979 => 'ᙲ', 8980 => 'ᙳ', 8981 => 'ᙴ', 8982 => 'ᙵ', 8983 => 'ᙶ', 8984 => 'ᖖ', 8985 => 'ᖗ', 8986 => 'ᖘ', 8987 => 'ᖙ', 8988 => 'ᖚ', 8989 => 'ᖛ', 8990 => 'ᖜ', 8991 => 'ᖝ', 8992 => 'ᖞ', 8993 => 'ᖟ', 8994 => 'ᖠ', 8995 => 'ᖡ', 8996 => 'ᖢ', 8997 => 'ᖣ', 8998 => 'ᖤ', 8999 => 'ᖥ', 9000 => 'ᖦ', 9001 => 'ᕼ', 9002 => 'ᖧ', 9003 => 'ᖨ', 9004 => 'ᖩ', 9005 => 'ᖪ', 9006 => 'ᖫ', 9007 => 'ᖬ', 9008 => 'ᖭ', 9009 => 'ᖮ', 9010 => 'ᖯ', 9011 => 'ᖰ', 9012 => 'ᖱ', 9013 => 'ᖲ', 9014 => 'ᖳ', 9015 => 'ᖴ', 9016 => 'ᖵ', 9017 => 'ᖶ', 9018 => 'ᖷ', 9019 => 'ᖸ', 9020 => 'ᖹ', 9021 => 'ᖺ', 9022 => 'ᖻ', 9023 => 'ᖼ', 9024 => 'ᖽ', 9025 => 'ᖾ', 9026 => 'ᖿ', 9027 => 'ᗀ', 9028 => 'ᗁ', 9029 => 'ᗂ', 9030 => 'ᗃ', 9031 => 'ᗄ', 9032 => 'ᗅ', 9033 => 'ᗆ', 9034 => 'ᗇ', 9035 => 'ᗈ', 9036 => 'ᗉ', 9037 => 'ᗊ', 9038 => 'ᗋ', 9039 => 'ᗌ', 9040 => 'ᗍ', 9041 => 'ᗎ', 9042 => 'ᗏ', 9043 => 'ᗐ', 9044 => 'ᗑ', 9045 => 'ᗒ', 9046 => 'ᗓ', 9047 => 'ᗔ', 9048 => 'ᗕ', 9049 => 'ᗖ', 9050 => 'ᗗ', 9051 => 'ᗘ', 9052 => 'ᗙ', 9053 => 'ᗚ', 9054 => 'ᗛ', 9055 => 'ᗜ', 9056 => 'ᗝ', 9057 => 'ᗞ', 9058 => 'ᗟ', 9059 => 'ᗠ', 9060 => 'ᗡ', 9061 => 'ᗢ', 9062 => 'ᗣ', 9063 => 'ᗤ', 9064 => 'ᗥ', 9065 => 'ᗦ', 9066 => 'ᗧ', 9067 => 'ᗨ', 9068 => 'ᗩ', 9069 => 'ᗪ', 9070 => 'ᗫ', 9071 => 'ᗬ', 9072 => 'ᗭ', 9073 => 'ᗮ', 9074 => 'ᗯ', 9075 => 'ᗰ', 9076 => 'ᗱ', 9077 => 'ᗲ', 9078 => 'ᗳ', 9079 => 'ᗴ', 9080 => 'ᗵ', 9081 => 'ᗶ', 9082 => 'ᗷ', 9083 => 'ᗸ', 9084 => 'ᗹ', 9085 => 'ᗺ', 9086 => 'ᗻ', 9087 => 'ᗼ', 9088 => 'ᗽ', 9089 => 'ᗾ', 9090 => 'ᗿ', 9091 => 'ᘀ', 9092 => 'ᘁ', 9093 => 'ᘂ', 9094 => 'ᘃ', 9095 => 'ᘄ', 9096 => 'ᘅ', 9097 => 'ᘆ', 9098 => 'ᘇ', 9099 => 'ᘈ', 9100 => 'ᘉ', 9101 => 'ᘊ', 9102 => 'ᘋ', 9103 => 'ᘌ', 9104 => 'ᘍ', 9105 => 'ᘎ', 9106 => 'ᘏ', 9107 => 'ᘐ', 9108 => 'ᘑ', 9109 => 'ᘒ', 9110 => 'ᘓ', 9111 => 'ᘔ', 9112 => 'ᘕ', 9113 => 'ᘖ', 9114 => 'ᘗ', 9115 => 'ᘘ', 9116 => 'ᘙ', 9117 => 'ᘚ', 9118 => 'ᘛ', 9119 => 'ᘜ', 9120 => 'ᘝ', 9121 => 'ᘞ', 9122 => 'ᘟ', 9123 => 'ᘠ', 9124 => 'ᘡ', 9125 => 'ᘢ', 9126 => 'ᘣ', 9127 => 'ᘤ', 9128 => 'ᘥ', 9129 => 'ᘦ', 9130 => 'ᘧ', 9131 => 'ᘨ', 9132 => 'ᘩ', 9133 => 'ᘪ', 9134 => 'ᘫ', 9135 => 'ᘬ', 9136 => 'ᘭ', 9137 => 'ᘮ', 9138 => 'ᘯ', 9139 => 'ᘰ', 9140 => 'ᘱ', 9141 => 'ᘲ', 9142 => 'ᘳ', 9143 => 'ᘴ', 9144 => 'ᘵ', 9145 => 'ᘶ', 9146 => 'ᘷ', 9147 => 'ᘸ', 9148 => 'ᘹ', 9149 => 'ᘺ', 9150 => 'ᘻ', 9151 => 'ᘼ', 9152 => 'ᘽ', 9153 => 'ᘾ', 9154 => 'ᘿ', 9155 => 'ᙀ', 9156 => 'ᙁ', 9157 => 'ᙂ', 9158 => 'ᙃ', 9159 => 'ᙄ', 9160 => 'ᙅ', 9161 => 'ᙆ', 9162 => 'ᙇ', 9163 => 'ᙈ', 9164 => 'ᙉ', 9165 => 'ᙊ', 9166 => 'ᙋ', 9167 => 'ᙌ', 9168 => 'ᙍ', 9169 => 'ᙎ', 9170 => 'ᙏ', 9171 => 'ᙐ', 9172 => 'ᙑ', 9173 => 'ᙒ', 9174 => 'ᙓ', 9175 => 'ᙔ', 9176 => 'ᙕ', 9177 => 'ᙖ', 9178 => 'ᙗ', 9179 => 'ᙘ', 9180 => 'ᙙ', 9181 => 'ᙚ', 9182 => 'ᙛ', 9183 => 'ᙜ', 9184 => 'ᙝ', 9185 => 'ᙞ', 9186 => 'ᙟ', 9187 => 'ᙠ', 9188 => 'ᙡ', 9189 => 'ᙢ', 9190 => 'ᙣ', 9191 => 'ᙤ', 9192 => 'ᙥ', 9193 => 'ᙦ', 9194 => 'ᙧ', 9195 => 'ᙨ', 9196 => 'ᙩ', 9197 => 'ᙪ', 9198 => 'ᙫ', 9199 => 'ᙬ', 9200 => 'ᙷ', 9201 => 'ᙸ', 9202 => 'ᙹ', 9203 => 'ᙺ', 9204 => 'ᙻ', 9205 => 'ᙼ', 9206 => 'ᙽ', 9207 => 'ᙾ', 9208 => 'ᙿ', 9209 => 'ᢰ', 9210 => 'ᢱ', 9211 => 'ᢲ', 9212 => 'ᢳ', 9213 => 'ᢴ', 9214 => 'ᢵ', 9215 => 'ᢶ', 9216 => 'ᢷ', 9217 => 'ᢸ', 9218 => 'ᢹ', 9219 => 'ᢺ', 9220 => 'ᢻ', 9221 => 'ᢼ', 9222 => 'ᢽ', 9223 => 'ᢾ', 9224 => 'ᢿ', 9225 => 'ᣀ', 9226 => 'ᣁ', 9227 => 'ᣂ', 9228 => 'ᣃ', 9229 => 'ᣄ', 9230 => 'ᣅ', 9231 => 'ᣆ', 9232 => 'ᣇ', 9233 => 'ᣈ', 9234 => 'ᣉ', 9235 => 'ᣊ', 9236 => 'ᣋ', 9237 => 'ᣌ', 9238 => 'ᣍ', 9239 => 'ᣎ', 9240 => 'ᣏ', 9241 => 'ᣐ', 9242 => 'ᣑ', 9243 => 'ᣒ', 9244 => 'ᣓ', 9245 => 'ᣔ', 9246 => 'ᣕ', 9247 => 'ᣖ', 9248 => 'ᣗ', 9249 => 'ᣘ', 9250 => 'ᣙ', 9251 => 'ᣚ', 9252 => 'ᣛ', 9253 => 'ᣜ', 9254 => 'ᣝ', 9255 => 'ᣞ', 9256 => 'ᣟ', 9257 => 'ᣠ', 9258 => 'ᣡ', 9259 => 'ᣢ', 9260 => 'ᣣ', 9261 => 'ᣤ', 9262 => 'ᣥ', 9263 => 'ᣦ', 9264 => 'ᣧ', 9265 => 'ᣨ', 9266 => 'ᣩ', 9267 => 'ᣪ', 9268 => 'ᣫ', 9269 => 'ᣬ', 9270 => 'ᣭ', 9271 => 'ᣮ', 9272 => 'ᣯ', 9273 => 'ᣰ', 9274 => 'ᣱ', 9275 => 'ᣲ', 9276 => 'ᣳ', 9277 => 'ᣴ', 9278 => 'ᣵ', 9279 => 'ᚁ', 9280 => 'ᚂ', 9281 => 'ᚃ', 9282 => 'ᚄ', 9283 => 'ᚅ', 9284 => 'ᚆ', 9285 => 'ᚇ', 9286 => 'ᚈ', 9287 => 'ᚉ', 9288 => 'ᚊ', 9289 => 'ᚋ', 9290 => 'ᚌ', 9291 => 'ᚍ', 9292 => 'ᚎ', 9293 => 'ᚏ', 9294 => 'ᚐ', 9295 => 'ᚑ', 9296 => 'ᚒ', 9297 => 'ᚓ', 9298 => 'ᚔ', 9299 => 'ᚕ', 9300 => 'ᚖ', 9301 => 'ᚗ', 9302 => 'ᚘ', 9303 => 'ᚙ', 9304 => 'ᚚ', 9305 => 'ᚠ', 9306 => 'ᚢ', 9307 => 'ᚦ', 9308 => 'ᚨ', 9309 => 'ᚯ', 9310 => 'ᚰ', 9311 => 'ᚱ', 9312 => 'ᚲ', 9313 => 'ᚷ', 9314 => 'ᚹ', 9315 => 'ᚺ', 9316 => 'ᚾ', 9317 => 'ᛁ', 9318 => 'ᛃ', 9319 => 'ᛅ', 9320 => 'ᛇ', 9321 => 'ᛈ', 9322 => 'ᛉ', 9323 => 'ᛊ', 9324 => 'ᛏ', 9325 => 'ᛒ', 9326 => 'ᛖ', 9327 => 'ᛗ', 9328 => 'ᛚ', 9329 => 'ᛜ', 9330 => 'ᛞ', 9331 => 'ᛟ', 9332 => 'ᚪ', 9333 => 'ᚫ', 9334 => 'ᚣ', 9335 => 'ᛠ', 9336 => 'ᛣ', 9337 => 'ᚸ', 9338 => 'ᛤ', 9339 => 'ᛡ', 9340 => 'ᛢ', 9341 => 'ᛥ', 9342 => 'ᛦ', 9343 => '𐰀', 9344 => '𐰂', 9345 => '𐰃', 9346 => '𐰅', 9347 => '𐰆', 9348 => '𐰇', 9349 => '𐰉', 9350 => '𐰋', 9351 => '𐰍', 9352 => '𐰏', 9353 => '𐰑', 9354 => '𐰓', 9355 => '𐰔', 9356 => '𐰖', 9357 => '𐰘', 9358 => '𐰚', 9359 => '𐰜', 9360 => '𐰞', 9361 => '𐰠', 9362 => '𐰡', 9363 => '𐰢', 9364 => '𐰣', 9365 => '𐰤', 9366 => '𐰦', 9367 => '𐰨', 9368 => '𐰪', 9369 => '𐰬', 9370 => '𐰭', 9371 => '𐰯', 9372 => '𐰰', 9373 => '𐰱', 9374 => '𐰲', 9375 => '𐰴', 9376 => '𐰶', 9377 => '𐰸', 9378 => '𐰺', 9379 => '𐰼', 9380 => '𐰽', 9381 => '𐰾', 9382 => '𐰿', 9383 => '𐱁', 9384 => '𐱃', 9385 => '𐱅', 9386 => '𐱇', 9387 => '𐱈', 9388 => 'ꔀ', 9389 => 'ꔁ', 9390 => 'ꔂ', 9391 => 'ꔃ', 9392 => 'ꔄ', 9393 => 'ꔅ', 9394 => 'ꔆ', 9395 => 'ꔇ', 9396 => 'ꔈ', 9397 => 'ꔉ', 9398 => 'ꔊ', 9399 => 'ꔋ', 9400 => 'ꔌ', 9401 => 'ꔍ', 9402 => 'ꔎ', 9403 => 'ꔏ', 9404 => 'ꔐ', 9405 => 'ꔑ', 9406 => 'ꔒ', 9407 => 'ꔓ', 9408 => 'ꔔ', 9409 => 'ꔕ', 9410 => 'ꔖ', 9411 => 'ꔗ', 9412 => 'ꔘ', 9413 => 'ꔙ', 9414 => 'ꔚ', 9415 => 'ꔛ', 9416 => 'ꔜ', 9417 => 'ꔝ', 9418 => 'ꔞ', 9419 => 'ꔟ', 9420 => 'ꔠ', 9421 => 'ꔡ', 9422 => 'ꔢ', 9423 => 'ꔣ', 9424 => 'ꔤ', 9425 => 'ꔥ', 9426 => 'ꔦ', 9427 => 'ꔧ', 9428 => 'ꔨ', 9429 => 'ꔩ', 9430 => 'ꔪ', 9431 => 'ꔫ', 9432 => 'ꔬ', 9433 => 'ꔭ', 9434 => 'ꔮ', 9435 => 'ꔯ', 9436 => 'ꔰ', 9437 => 'ꔱ', 9438 => 'ꔲ', 9439 => 'ꔳ', 9440 => 'ꔴ', 9441 => 'ꔵ', 9442 => 'ꔶ', 9443 => 'ꔷ', 9444 => 'ꔸ', 9445 => 'ꔹ', 9446 => 'ꔺ', 9447 => 'ꔻ', 9448 => 'ꔼ', 9449 => 'ꔽ', 9450 => 'ꔾ', 9451 => 'ꔿ', 9452 => 'ꕀ', 9453 => 'ꕁ', 9454 => 'ꕂ', 9455 => 'ꕃ', 9456 => 'ꕄ', 9457 => 'ꕅ', 9458 => 'ꕆ', 9459 => 'ꕇ', 9460 => 'ꕈ', 9461 => 'ꕉ', 9462 => 'ꕊ', 9463 => 'ꕋ', 9464 => 'ꕌ', 9465 => 'ꕍ', 9466 => 'ꕎ', 9467 => 'ꕏ', 9468 => 'ꕐ', 9469 => 'ꕑ', 9470 => 'ꕒ', 9471 => 'ꕓ', 9472 => 'ꕔ', 9473 => 'ꕕ', 9474 => 'ꕖ', 9475 => 'ꕗ', 9476 => 'ꕘ', 9477 => 'ꕙ', 9478 => 'ꕚ', 9479 => 'ꕛ', 9480 => 'ꕜ', 9481 => 'ꕝ', 9482 => 'ꕞ', 9483 => 'ꕟ', 9484 => 'ꕠ', 9485 => 'ꕡ', 9486 => 'ꕢ', 9487 => 'ꕣ', 9488 => 'ꕤ', 9489 => 'ꕥ', 9490 => 'ꕦ', 9491 => 'ꕧ', 9492 => 'ꕨ', 9493 => 'ꕩ', 9494 => 'ꕪ', 9495 => 'ꕫ', 9496 => 'ꕬ', 9497 => 'ꕭ', 9498 => 'ꕮ', 9499 => 'ꕯ', 9500 => 'ꕰ', 9501 => 'ꕱ', 9502 => 'ꕲ', 9503 => 'ꕳ', 9504 => 'ꕴ', 9505 => 'ꕵ', 9506 => 'ꕶ', 9507 => 'ꕷ', 9508 => 'ꕸ', 9509 => 'ꕹ', 9510 => 'ꕺ', 9511 => 'ꕻ', 9512 => 'ꕼ', 9513 => 'ꕽ', 9514 => 'ꕾ', 9515 => 'ꕿ', 9516 => 'ꖀ', 9517 => 'ꖁ', 9518 => 'ꖂ', 9519 => 'ꖃ', 9520 => 'ꖄ', 9521 => 'ꖅ', 9522 => 'ꖆ', 9523 => 'ꖇ', 9524 => 'ꖈ', 9525 => 'ꖉ', 9526 => 'ꖊ', 9527 => 'ꖋ', 9528 => 'ꖌ', 9529 => 'ꖍ', 9530 => 'ꖎ', 9531 => 'ꖏ', 9532 => 'ꖐ', 9533 => 'ꖑ', 9534 => 'ꖒ', 9535 => 'ꖓ', 9536 => 'ꖔ', 9537 => 'ꖕ', 9538 => 'ꖖ', 9539 => 'ꖗ', 9540 => 'ꖘ', 9541 => 'ꖙ', 9542 => 'ꖚ', 9543 => 'ꖛ', 9544 => 'ꖜ', 9545 => 'ꖝ', 9546 => 'ꖞ', 9547 => 'ꖟ', 9548 => 'ꖠ', 9549 => 'ꖡ', 9550 => 'ꖢ', 9551 => 'ꖣ', 9552 => 'ꖤ', 9553 => 'ꖥ', 9554 => 'ꖦ', 9555 => 'ꖧ', 9556 => 'ꖨ', 9557 => 'ꖩ', 9558 => 'ꖪ', 9559 => 'ꖫ', 9560 => 'ꖬ', 9561 => 'ꖭ', 9562 => 'ꖮ', 9563 => 'ꖯ', 9564 => 'ꖰ', 9565 => 'ꖱ', 9566 => 'ꖲ', 9567 => 'ꖳ', 9568 => 'ꖴ', 9569 => 'ꖵ', 9570 => 'ꖶ', 9571 => 'ꖷ', 9572 => 'ꖸ', 9573 => 'ꖹ', 9574 => 'ꖺ', 9575 => 'ꖻ', 9576 => 'ꖼ', 9577 => 'ꖽ', 9578 => 'ꖾ', 9579 => 'ꖿ', 9580 => 'ꗀ', 9581 => 'ꗁ', 9582 => 'ꗂ', 9583 => 'ꗃ', 9584 => 'ꗄ', 9585 => 'ꗅ', 9586 => 'ꗆ', 9587 => 'ꗇ', 9588 => 'ꗈ', 9589 => 'ꗉ', 9590 => 'ꗊ', 9591 => 'ꗋ', 9592 => 'ꗌ', 9593 => 'ꗍ', 9594 => 'ꗎ', 9595 => 'ꗏ', 9596 => 'ꗐ', 9597 => 'ꗑ', 9598 => 'ꗒ', 9599 => 'ꗓ', 9600 => 'ꗔ', 9601 => 'ꗕ', 9602 => 'ꗖ', 9603 => 'ꗗ', 9604 => 'ꗘ', 9605 => 'ꗙ', 9606 => 'ꗚ', 9607 => 'ꗛ', 9608 => 'ꗜ', 9609 => 'ꗝ', 9610 => 'ꗞ', 9611 => 'ꗟ', 9612 => 'ꗠ', 9613 => 'ꗡ', 9614 => 'ꗢ', 9615 => 'ꗣ', 9616 => 'ꗤ', 9617 => 'ꗥ', 9618 => 'ꗦ', 9619 => 'ꗧ', 9620 => 'ꗨ', 9621 => 'ꗩ', 9622 => 'ꗪ', 9623 => 'ꗫ', 9624 => 'ꗬ', 9625 => 'ꗭ', 9626 => 'ꗮ', 9627 => 'ꗯ', 9628 => 'ꗰ', 9629 => 'ꗱ', 9630 => 'ꗲ', 9631 => 'ꗳ', 9632 => 'ꗴ', 9633 => 'ꗵ', 9634 => 'ꗶ', 9635 => 'ꗷ', 9636 => 'ꗸ', 9637 => 'ꗹ', 9638 => 'ꗺ', 9639 => 'ꗻ', 9640 => 'ꗼ', 9641 => 'ꗽ', 9642 => 'ꗾ', 9643 => 'ꗿ', 9644 => 'ꘀ', 9645 => 'ꘁ', 9646 => 'ꘂ', 9647 => 'ꘃ', 9648 => 'ꘄ', 9649 => 'ꘅ', 9650 => 'ꘆ', 9651 => 'ꘇ', 9652 => 'ꘈ', 9653 => 'ꘉ', 9654 => 'ꘊ', 9655 => 'ꘋ', 9656 => 'ꘌ', 9657 => 'ꚠ', 9658 => 'ꚡ', 9659 => 'ꚢ', 9660 => 'ꚣ', 9661 => 'ꚤ', 9662 => 'ꚥ', 9663 => 'ꚦ', 9664 => 'ꚧ', 9665 => 'ꚨ', 9666 => 'ꚩ', 9667 => 'ꚪ', 9668 => 'ꚫ', 9669 => 'ꚬ', 9670 => 'ꚭ', 9671 => 'ꚮ', 9672 => 'ꚯ', 9673 => 'ꚰ', 9674 => 'ꚱ', 9675 => 'ꚲ', 9676 => 'ꚳ', 9677 => 'ꚴ', 9678 => 'ꚵ', 9679 => 'ꚶ', 9680 => 'ꚷ', 9681 => 'ꚸ', 9682 => 'ꚹ', 9683 => 'ꚺ', 9684 => 'ꚻ', 9685 => 'ꚼ', 9686 => 'ꚽ', 9687 => 'ꚾ', 9688 => 'ꚿ', 9689 => 'ꛀ', 9690 => 'ꛁ', 9691 => 'ꛂ', 9692 => 'ꛃ', 9693 => 'ꛄ', 9694 => 'ꛅ', 9695 => 'ꛆ', 9696 => 'ꛇ', 9697 => 'ꛈ', 9698 => 'ꛉ', 9699 => 'ꛊ', 9700 => 'ꛋ', 9701 => 'ꛌ', 9702 => 'ꛍ', 9703 => 'ꛎ', 9704 => 'ꛏ', 9705 => 'ꛐ', 9706 => 'ꛑ', 9707 => 'ꛒ', 9708 => 'ꛓ', 9709 => 'ꛔ', 9710 => 'ꛕ', 9711 => 'ꛖ', 9712 => 'ꛗ', 9713 => 'ꛘ', 9714 => 'ꛙ', 9715 => 'ꛚ', 9716 => 'ꛛ', 9717 => 'ꛜ', 9718 => 'ꛝ', 9719 => 'ꛞ', 9720 => 'ꛟ', 9721 => 'ꛠ', 9722 => 'ꛡ', 9723 => 'ꛢ', 9724 => 'ꛣ', 9725 => 'ꛤ', 9726 => 'ꛥ', 9727 => 'ꛦ', 9728 => 'ꛧ', 9729 => 'ꛨ', 9730 => 'ꛩ', 9731 => 'ꛪ', 9732 => 'ꛫ', 9733 => 'ꛬ', 9734 => 'ꛭ', 9735 => 'ꛮ', 9736 => 'ꛯ', 9737 => '𖠀', 9738 => '𖠁', 9739 => '𖠂', 9740 => '𖠃', 9741 => '𖠄', 9742 => '𖠅', 9743 => '𖠆', 9744 => '𖠇', 9745 => '𖠈', 9746 => '𖠉', 9747 => '𖠊', 9748 => '𖠋', 9749 => '𖠌', 9750 => '𖠍', 9751 => '𖠎', 9752 => '𖠏', 9753 => '𖠐', 9754 => '𖠑', 9755 => '𖠒', 9756 => '𖠓', 9757 => '𖠔', 9758 => '𖠕', 9759 => '𖠖', 9760 => '𖠗', 9761 => '𖠘', 9762 => '𖠙', 9763 => '𖠚', 9764 => '𖠛', 9765 => '𖠜', 9766 => '𖠝', 9767 => '𖠞', 9768 => '𖠟', 9769 => '𖠠', 9770 => '𖠡', 9771 => '𖠢', 9772 => '𖠣', 9773 => '𖠤', 9774 => '𖠥', 9775 => '𖠦', 9776 => '𖠧', 9777 => '𖠨', 9778 => '𖠩', 9779 => '𖠪', 9780 => '𖠫', 9781 => '𖠬', 9782 => '𖠭', 9783 => '𖠮', 9784 => '𖠯', 9785 => '𖠰', 9786 => '𖠱', 9787 => '𖠲', 9788 => '𖠳', 9789 => '𖠴', 9790 => '𖠵', 9791 => '𖠶', 9792 => '𖠷', 9793 => '𖠸', 9794 => '𖠹', 9795 => '𖠺', 9796 => '𖠻', 9797 => '𖠼', 9798 => '𖠽', 9799 => '𖠾', 9800 => '𖠿', 9801 => '𖡀', 9802 => '𖡁', 9803 => '𖡂', 9804 => '𖡃', 9805 => '𖡄', 9806 => '𖡅', 9807 => '𖡆', 9808 => '𖡇', 9809 => '𖡈', 9810 => '𖡉', 9811 => '𖡊', 9812 => '𖡋', 9813 => '𖡌', 9814 => '𖡍', 9815 => '𖡎', 9816 => '𖡏', 9817 => '𖡐', 9818 => '𖡑', 9819 => '𖡒', 9820 => '𖡓', 9821 => '𖡔', 9822 => '𖡕', 9823 => '𖡖', 9824 => '𖡗', 9825 => '𖡘', 9826 => '𖡙', 9827 => '𖡚', 9828 => '𖡛', 9829 => '𖡜', 9830 => '𖡝', 9831 => '𖡞', 9832 => '𖡟', 9833 => '𖡠', 9834 => '𖡡', 9835 => '𖡢', 9836 => '𖡣', 9837 => '𖡤', 9838 => '𖡥', 9839 => '𖡦', 9840 => '𖡧', 9841 => '𖡨', 9842 => '𖡩', 9843 => '𖡪', 9844 => '𖡫', 9845 => '𖡬', 9846 => '𖡭', 9847 => '𖡮', 9848 => '𖡯', 9849 => '𖡰', 9850 => '𖡱', 9851 => '𖡲', 9852 => '𖡳', 9853 => '𖡴', 9854 => '𖡵', 9855 => '𖡶', 9856 => '𖡷', 9857 => '𖡸', 9858 => '𖡹', 9859 => '𖡺', 9860 => '𖡻', 9861 => '𖡼', 9862 => '𖡽', 9863 => '𖡾', 9864 => '𖡿', 9865 => '𖢀', 9866 => '𖢁', 9867 => '𖢂', 9868 => '𖢃', 9869 => '𖢄', 9870 => '𖢅', 9871 => '𖢆', 9872 => '𖢇', 9873 => '𖢈', 9874 => '𖢉', 9875 => '𖢊', 9876 => '𖢋', 9877 => '𖢌', 9878 => '𖢍', 9879 => '𖢎', 9880 => '𖢏', 9881 => '𖢐', 9882 => '𖢑', 9883 => '𖢒', 9884 => '𖢓', 9885 => '𖢔', 9886 => '𖢕', 9887 => '𖢖', 9888 => '𖢗', 9889 => '𖢘', 9890 => '𖢙', 9891 => '𖢚', 9892 => '𖢛', 9893 => '𖢜', 9894 => '𖢝', 9895 => '𖢞', 9896 => '𖢟', 9897 => '𖢠', 9898 => '𖢡', 9899 => '𖢢', 9900 => '𖢣', 9901 => '𖢤', 9902 => '𖢥', 9903 => '𖢦', 9904 => '𖢧', 9905 => '𖢨', 9906 => '𖢩', 9907 => '𖢪', 9908 => '𖢫', 9909 => '𖢬', 9910 => '𖢭', 9911 => '𖢮', 9912 => '𖢯', 9913 => '𖢰', 9914 => '𖢱', 9915 => '𖢲', 9916 => '𖢳', 9917 => '𖢴', 9918 => '𖢵', 9919 => '𖢶', 9920 => '𖢷', 9921 => '𖢸', 9922 => '𖢹', 9923 => '𖢺', 9924 => '𖢻', 9925 => '𖢼', 9926 => '𖢽', 9927 => '𖢾', 9928 => '𖢿', 9929 => '𖣀', 9930 => '𖣁', 9931 => '𖣂', 9932 => '𖣃', 9933 => '𖣄', 9934 => '𖣅', 9935 => '𖣆', 9936 => '𖣇', 9937 => '𖣈', 9938 => '𖣉', 9939 => '𖣊', 9940 => '𖣋', 9941 => '𖣌', 9942 => '𖣍', 9943 => '𖣎', 9944 => '𖣏', 9945 => '𖣐', 9946 => '𖣑', 9947 => '𖣒', 9948 => '𖣓', 9949 => '𖣔', 9950 => '𖣕', 9951 => '𖣖', 9952 => '𖣗', 9953 => '𖣘', 9954 => '𖣙', 9955 => '𖣚', 9956 => '𖣛', 9957 => '𖣜', 9958 => '𖣝', 9959 => '𖣞', 9960 => '𖣟', 9961 => '𖣠', 9962 => '𖣡', 9963 => '𖣢', 9964 => '𖣣', 9965 => '𖣤', 9966 => '𖣥', 9967 => '𖣦', 9968 => '𖣧', 9969 => '𖣨', 9970 => '𖣩', 9971 => '𖣪', 9972 => '𖣫', 9973 => '𖣬', 9974 => '𖣭', 9975 => '𖣮', 9976 => '𖣯', 9977 => '𖣰', 9978 => '𖣱', 9979 => '𖣲', 9980 => '𖣳', 9981 => '𖣴', 9982 => '𖣵', 9983 => '𖣶', 9984 => '𖣷', 9985 => '𖣸', 9986 => '𖣹', 9987 => '𖣺', 9988 => '𖣻', 9989 => '𖣼', 9990 => '𖣽', 9991 => '𖣾', 9992 => '𖣿', 9993 => '𖤀', 9994 => '𖤁', 9995 => '𖤂', 9996 => '𖤃', 9997 => '𖤄', 9998 => '𖤅', 9999 => '𖤆', 10000 => '𖤇', 10001 => '𖤈', 10002 => '𖤉', 10003 => '𖤊', 10004 => '𖤋', 10005 => '𖤌', 10006 => '𖤍', 10007 => '𖤎', 10008 => '𖤏', 10009 => '𖤐', 10010 => '𖤑', 10011 => '𖤒', 10012 => '𖤓', 10013 => '𖤔', 10014 => '𖤕', 10015 => '𖤖', 10016 => '𖤗', 10017 => '𖤘', 10018 => '𖤙', 10019 => '𖤚', 10020 => '𖤛', 10021 => '𖤜', 10022 => '𖤝', 10023 => '𖤞', 10024 => '𖤟', 10025 => '𖤠', 10026 => '𖤡', 10027 => '𖤢', 10028 => '𖤣', 10029 => '𖤤', 10030 => '𖤥', 10031 => '𖤦', 10032 => '𖤧', 10033 => '𖤨', 10034 => '𖤩', 10035 => '𖤪', 10036 => '𖤫', 10037 => '𖤬', 10038 => '𖤭', 10039 => '𖤮', 10040 => '𖤯', 10041 => '𖤰', 10042 => '𖤱', 10043 => '𖤲', 10044 => '𖤳', 10045 => '𖤴', 10046 => '𖤵', 10047 => '𖤶', 10048 => '𖤷', 10049 => '𖤸', 10050 => '𖤹', 10051 => '𖤺', 10052 => '𖤻', 10053 => '𖤼', 10054 => '𖤽', 10055 => '𖤾', 10056 => '𖤿', 10057 => '𖥀', 10058 => '𖥁', 10059 => '𖥂', 10060 => '𖥃', 10061 => '𖥄', 10062 => '𖥅', 10063 => '𖥆', 10064 => '𖥇', 10065 => '𖥈', 10066 => '𖥉', 10067 => '𖥊', 10068 => '𖥋', 10069 => '𖥌', 10070 => '𖥍', 10071 => '𖥎', 10072 => '𖥏', 10073 => '𖥐', 10074 => '𖥑', 10075 => '𖥒', 10076 => '𖥓', 10077 => '𖥔', 10078 => '𖥕', 10079 => '𖥖', 10080 => '𖥗', 10081 => '𖥘', 10082 => '𖥙', 10083 => '𖥚', 10084 => '𖥛', 10085 => '𖥜', 10086 => '𖥝', 10087 => '𖥞', 10088 => '𖥟', 10089 => '𖥠', 10090 => '𖥡', 10091 => '𖥢', 10092 => '𖥣', 10093 => '𖥤', 10094 => '𖥥', 10095 => '𖥦', 10096 => '𖥧', 10097 => '𖥨', 10098 => '𖥩', 10099 => '𖥪', 10100 => '𖥫', 10101 => '𖥬', 10102 => '𖥭', 10103 => '𖥮', 10104 => '𖥯', 10105 => '𖥰', 10106 => '𖥱', 10107 => '𖥲', 10108 => '𖥳', 10109 => '𖥴', 10110 => '𖥵', 10111 => '𖥶', 10112 => '𖥷', 10113 => '𖥸', 10114 => '𖥹', 10115 => '𖥺', 10116 => '𖥻', 10117 => '𖥼', 10118 => '𖥽', 10119 => '𖥾', 10120 => '𖥿', 10121 => '𖦀', 10122 => '𖦁', 10123 => '𖦂', 10124 => '𖦃', 10125 => '𖦄', 10126 => '𖦅', 10127 => '𖦆', 10128 => '𖦇', 10129 => '𖦈', 10130 => '𖦉', 10131 => '𖦊', 10132 => '𖦋', 10133 => '𖦌', 10134 => '𖦍', 10135 => '𖦎', 10136 => '𖦏', 10137 => '𖦐', 10138 => '𖦑', 10139 => '𖦒', 10140 => '𖦓', 10141 => '𖦔', 10142 => '𖦕', 10143 => '𖦖', 10144 => '𖦗', 10145 => '𖦘', 10146 => '𖦙', 10147 => '𖦚', 10148 => '𖦛', 10149 => '𖦜', 10150 => '𖦝', 10151 => '𖦞', 10152 => '𖦟', 10153 => '𖦠', 10154 => '𖦡', 10155 => '𖦢', 10156 => '𖦣', 10157 => '𖦤', 10158 => '𖦥', 10159 => '𖦦', 10160 => '𖦧', 10161 => '𖦨', 10162 => '𖦩', 10163 => '𖦪', 10164 => '𖦫', 10165 => '𖦬', 10166 => '𖦭', 10167 => '𖦮', 10168 => '𖦯', 10169 => '𖦰', 10170 => '𖦱', 10171 => '𖦲', 10172 => '𖦳', 10173 => '𖦴', 10174 => '𖦵', 10175 => '𖦶', 10176 => '𖦷', 10177 => '𖦸', 10178 => '𖦹', 10179 => '𖦺', 10180 => '𖦻', 10181 => '𖦼', 10182 => '𖦽', 10183 => '𖦾', 10184 => '𖦿', 10185 => '𖧀', 10186 => '𖧁', 10187 => '𖧂', 10188 => '𖧃', 10189 => '𖧄', 10190 => '𖧅', 10191 => '𖧆', 10192 => '𖧇', 10193 => '𖧈', 10194 => '𖧉', 10195 => '𖧊', 10196 => '𖧋', 10197 => '𖧌', 10198 => '𖧍', 10199 => '𖧎', 10200 => '𖧏', 10201 => '𖧐', 10202 => '𖧑', 10203 => '𖧒', 10204 => '𖧓', 10205 => '𖧔', 10206 => '𖧕', 10207 => '𖧖', 10208 => '𖧗', 10209 => '𖧘', 10210 => '𖧙', 10211 => '𖧚', 10212 => '𖧛', 10213 => '𖧜', 10214 => '𖧝', 10215 => '𖧞', 10216 => '𖧟', 10217 => '𖧠', 10218 => '𖧡', 10219 => '𖧢', 10220 => '𖧣', 10221 => '𖧤', 10222 => '𖧥', 10223 => '𖧦', 10224 => '𖧧', 10225 => '𖧨', 10226 => '𖧩', 10227 => '𖧪', 10228 => '𖧫', 10229 => '𖧬', 10230 => '𖧭', 10231 => '𖧮', 10232 => '𖧯', 10233 => '𖧰', 10234 => '𖧱', 10235 => '𖧲', 10236 => '𖧳', 10237 => '𖧴', 10238 => '𖧵', 10239 => '𖧶', 10240 => '𖧷', 10241 => '𖧸', 10242 => '𖧹', 10243 => '𖧺', 10244 => '𖧻', 10245 => '𖧼', 10246 => '𖧽', 10247 => '𖧾', 10248 => '𖧿', 10249 => '𖨀', 10250 => '𖨁', 10251 => '𖨂', 10252 => '𖨃', 10253 => '𖨄', 10254 => '𖨅', 10255 => '𖨆', 10256 => '𖨇', 10257 => '𖨈', 10258 => '𖨉', 10259 => '𖨊', 10260 => '𖨋', 10261 => '𖨌', 10262 => '𖨍', 10263 => '𖨎', 10264 => '𖨏', 10265 => '𖨐', 10266 => '𖨑', 10267 => '𖨒', 10268 => '𖨓', 10269 => '𖨔', 10270 => '𖨕', 10271 => '𖨖', 10272 => '𖨗', 10273 => '𖨘', 10274 => '𖨙', 10275 => '𖨚', 10276 => '𖨛', 10277 => '𖨜', 10278 => '𖨝', 10279 => '𖨞', 10280 => '𖨟', 10281 => '𖨠', 10282 => '𖨡', 10283 => '𖨢', 10284 => '𖨣', 10285 => '𖨤', 10286 => '𖨥', 10287 => '𖨦', 10288 => '𖨧', 10289 => '𖨨', 10290 => '𖨩', 10291 => '𖨪', 10292 => '𖨫', 10293 => '𖨬', 10294 => '𖨭', 10295 => '𖨮', 10296 => '𖨯', 10297 => '𖨰', 10298 => '𖨱', 10299 => '𖨲', 10300 => '𖨳', 10301 => '𖨴', 10302 => '𖨵', 10303 => '𖨶', 10304 => '𖨷', 10305 => '𖨸', 10306 => 'ᄀ', 10307 => 'ᄁ', 10308 => 'ᄂ', 10309 => 'ᄃ', 10310 => 'ᄄ', 10311 => 'ᄅ', 10312 => 'ᄆ', 10313 => 'ᄇ', 10314 => 'ᄈ', 10315 => 'ᄉ', 10316 => 'ᄊ', 10317 => 'ᄋ', 10318 => 'ᄌ', 10319 => 'ᄍ', 10320 => 'ᄎ', 10321 => 'ᄏ', 10322 => 'ᄐ', 10323 => 'ᄑ', 10324 => 'ᄒ', 10325 => 'ᄓ', 10326 => 'ᄔ', 10327 => 'ᄕ', 10328 => 'ᄖ', 10329 => 'ᄗ', 10330 => 'ᄘ', 10331 => 'ᄙ', 10332 => 'ᄚ', 10333 => 'ᄛ', 10334 => 'ᄜ', 10335 => 'ᄝ', 10336 => 'ᄞ', 10337 => 'ᄟ', 10338 => 'ᄠ', 10339 => 'ᄡ', 10340 => 'ᄢ', 10341 => 'ᄣ', 10342 => 'ᄤ', 10343 => 'ᄥ', 10344 => 'ᄦ', 10345 => 'ᄧ', 10346 => 'ᄨ', 10347 => 'ᄩ', 10348 => 'ᄪ', 10349 => 'ᄫ', 10350 => 'ᄬ', 10351 => 'ᄭ', 10352 => 'ᄮ', 10353 => 'ᄯ', 10354 => 'ᄰ', 10355 => 'ᄱ', 10356 => 'ᄲ', 10357 => 'ᄳ', 10358 => 'ᄴ', 10359 => 'ᄵ', 10360 => 'ᄶ', 10361 => 'ᄷ', 10362 => 'ᄸ', 10363 => 'ᄹ', 10364 => 'ᄺ', 10365 => 'ᄻ', 10366 => 'ᄼ', 10367 => 'ᄽ', 10368 => 'ᄾ', 10369 => 'ᄿ', 10370 => 'ᅀ', 10371 => 'ᅁ', 10372 => 'ᅂ', 10373 => 'ᅃ', 10374 => 'ᅄ', 10375 => 'ᅅ', 10376 => 'ᅆ', 10377 => 'ᅇ', 10378 => 'ᅈ', 10379 => 'ᅉ', 10380 => 'ᅊ', 10381 => 'ᅋ', 10382 => 'ᅌ', 10383 => 'ᅍ', 10384 => 'ᅎ', 10385 => 'ᅏ', 10386 => 'ᅐ', 10387 => 'ᅑ', 10388 => 'ᅒ', 10389 => 'ᅓ', 10390 => 'ᅔ', 10391 => 'ᅕ', 10392 => 'ᅖ', 10393 => 'ᅗ', 10394 => 'ᅘ', 10395 => 'ᅙ', 10396 => 'ᅚ', 10397 => 'ᅛ', 10398 => 'ᅜ', 10399 => 'ᅝ', 10400 => 'ᅞ', 10401 => 'ꥠ', 10402 => 'ꥡ', 10403 => 'ꥢ', 10404 => 'ꥣ', 10405 => 'ꥤ', 10406 => 'ꥥ', 10407 => 'ꥦ', 10408 => 'ꥧ', 10409 => 'ꥨ', 10410 => 'ꥩ', 10411 => 'ꥪ', 10412 => 'ꥫ', 10413 => 'ꥬ', 10414 => 'ꥭ', 10415 => 'ꥮ', 10416 => 'ꥯ', 10417 => 'ꥰ', 10418 => 'ꥱ', 10419 => 'ꥲ', 10420 => 'ꥳ', 10421 => 'ꥴ', 10422 => 'ꥵ', 10423 => 'ꥶ', 10424 => 'ꥷ', 10425 => 'ꥸ', 10426 => 'ꥹ', 10427 => 'ꥺ', 10428 => 'ꥻ', 10429 => 'ꥼ', 10430 => 'ᅟ', 10431 => 'ᅠ', 10432 => 'ᅡ', 10433 => 'ᅢ', 10434 => 'ᅣ', 10435 => 'ᅤ', 10436 => 'ᅥ', 10437 => 'ᅦ', 10438 => 'ᅧ', 10439 => 'ᅨ', 10440 => 'ᅩ', 10441 => 'ᅪ', 10442 => 'ᅫ', 10443 => 'ᅬ', 10444 => 'ᅭ', 10445 => 'ᅮ', 10446 => 'ᅯ', 10447 => 'ᅰ', 10448 => 'ᅱ', 10449 => 'ᅲ', 10450 => 'ᅳ', 10451 => 'ᅴ', 10452 => 'ᅵ', 10453 => 'ᅶ', 10454 => 'ᅷ', 10455 => 'ᅸ', 10456 => 'ᅹ', 10457 => 'ᅺ', 10458 => 'ᅻ', 10459 => 'ᅼ', 10460 => 'ᅽ', 10461 => 'ᅾ', 10462 => 'ᅿ', 10463 => 'ᆀ', 10464 => 'ᆁ', 10465 => 'ᆂ', 10466 => 'ᆃ', 10467 => 'ᆄ', 10468 => 'ᆅ', 10469 => 'ᆆ', 10470 => 'ᆇ', 10471 => 'ᆈ', 10472 => 'ᆉ', 10473 => 'ᆊ', 10474 => 'ᆋ', 10475 => 'ᆌ', 10476 => 'ᆍ', 10477 => 'ᆎ', 10478 => 'ᆏ', 10479 => 'ᆐ', 10480 => 'ᆑ', 10481 => 'ᆒ', 10482 => 'ᆓ', 10483 => 'ᆔ', 10484 => 'ᆕ', 10485 => 'ᆖ', 10486 => 'ᆗ', 10487 => 'ᆘ', 10488 => 'ᆙ', 10489 => 'ᆚ', 10490 => 'ᆛ', 10491 => 'ᆜ', 10492 => 'ᆝ', 10493 => 'ᆞ', 10494 => 'ᆟ', 10495 => 'ᆠ', 10496 => 'ᆡ', 10497 => 'ᆢ', 10498 => 'ᆣ', 10499 => 'ᆤ', 10500 => 'ᆥ', 10501 => 'ᆦ', 10502 => 'ᆧ', 10503 => 'ힰ', 10504 => 'ힱ', 10505 => 'ힲ', 10506 => 'ힳ', 10507 => 'ힴ', 10508 => 'ힵ', 10509 => 'ힶ', 10510 => 'ힷ', 10511 => 'ힸ', 10512 => 'ힹ', 10513 => 'ힺ', 10514 => 'ힻ', 10515 => 'ힼ', 10516 => 'ힽ', 10517 => 'ힾ', 10518 => 'ힿ', 10519 => 'ퟀ', 10520 => 'ퟁ', 10521 => 'ퟂ', 10522 => 'ퟃ', 10523 => 'ퟄ', 10524 => 'ퟅ', 10525 => 'ퟆ', 10526 => 'ᆨ', 10527 => 'ᆩ', 10528 => 'ᆪ', 10529 => 'ᆫ', 10530 => 'ᆬ', 10531 => 'ᆭ', 10532 => 'ᆮ', 10533 => 'ᆯ', 10534 => 'ᆰ', 10535 => 'ᆱ', 10536 => 'ᆲ', 10537 => 'ᆳ', 10538 => 'ᆴ', 10539 => 'ᆵ', 10540 => 'ᆶ', 10541 => 'ᆷ', 10542 => 'ᆸ', 10543 => 'ᆹ', 10544 => 'ᆺ', 10545 => 'ᆻ', 10546 => 'ᆼ', 10547 => 'ᆽ', 10548 => 'ᆾ', 10549 => 'ᆿ', 10550 => 'ᇀ', 10551 => 'ᇁ', 10552 => 'ᇂ', 10553 => 'ᇃ', 10554 => 'ᇄ', 10555 => 'ᇅ', 10556 => 'ᇆ', 10557 => 'ᇇ', 10558 => 'ᇈ', 10559 => 'ᇉ', 10560 => 'ᇊ', 10561 => 'ᇋ', 10562 => 'ᇌ', 10563 => 'ᇍ', 10564 => 'ᇎ', 10565 => 'ᇏ', 10566 => 'ᇐ', 10567 => 'ᇑ', 10568 => 'ᇒ', 10569 => 'ᇓ', 10570 => 'ᇔ', 10571 => 'ᇕ', 10572 => 'ᇖ', 10573 => 'ᇗ', 10574 => 'ᇘ', 10575 => 'ᇙ', 10576 => 'ᇚ', 10577 => 'ᇛ', 10578 => 'ᇜ', 10579 => 'ᇝ', 10580 => 'ᇞ', 10581 => 'ᇟ', 10582 => 'ᇠ', 10583 => 'ᇡ', 10584 => 'ᇢ', 10585 => 'ᇣ', 10586 => 'ᇤ', 10587 => 'ᇥ', 10588 => 'ᇦ', 10589 => 'ᇧ', 10590 => 'ᇨ', 10591 => 'ᇩ', 10592 => 'ᇪ', 10593 => 'ᇫ', 10594 => 'ᇬ', 10595 => 'ᇭ', 10596 => 'ᇮ', 10597 => 'ᇯ', 10598 => 'ᇰ', 10599 => 'ᇱ', 10600 => 'ᇲ', 10601 => 'ᇳ', 10602 => 'ᇴ', 10603 => 'ᇵ', 10604 => 'ᇶ', 10605 => 'ᇷ', 10606 => 'ᇸ', 10607 => 'ᇹ', 10608 => 'ᇺ', 10609 => 'ᇻ', 10610 => 'ᇼ', 10611 => 'ᇽ', 10612 => 'ᇾ', 10613 => 'ᇿ', 10614 => 'ퟋ', 10615 => 'ퟌ', 10616 => 'ퟍ', 10617 => 'ퟎ', 10618 => 'ퟏ', 10619 => 'ퟐ', 10620 => 'ퟑ', 10621 => 'ퟒ', 10622 => 'ퟓ', 10623 => 'ퟔ', 10624 => 'ퟕ', 10625 => 'ퟖ', 10626 => 'ퟗ', 10627 => 'ퟘ', 10628 => 'ퟙ', 10629 => 'ퟚ', 10630 => 'ퟛ', 10631 => 'ퟜ', 10632 => 'ퟝ', 10633 => 'ퟞ', 10634 => 'ퟟ', 10635 => 'ퟠ', 10636 => 'ퟡ', 10637 => 'ퟢ', 10638 => 'ퟣ', 10639 => 'ퟤ', 10640 => 'ퟥ', 10641 => 'ퟦ', 10642 => 'ퟧ', 10643 => 'ퟨ', 10644 => 'ퟩ', 10645 => 'ퟪ', 10646 => 'ퟫ', 10647 => 'ퟬ', 10648 => 'ퟭ', 10649 => 'ퟮ', 10650 => 'ퟯ', 10651 => 'ퟰ', 10652 => 'ퟱ', 10653 => 'ퟲ', 10654 => 'ퟳ', 10655 => 'ퟴ', 10656 => 'ퟵ', 10657 => 'ퟶ', 10658 => 'ퟷ', 10659 => 'ퟸ', 10660 => 'ퟹ', 10661 => 'ퟺ', 10662 => 'ퟻ', 10663 => 'あ', 10664 => 'い', 10665 => 'う', 10666 => '𛀀', 10667 => 'え', 10668 => 'お', 10669 => 'か', 10670 => 'き', 10671 => 'く', 10672 => 'け', 10673 => 'こ', 10674 => 'さ', 10675 => 'し', 10676 => 'す', 10677 => 'せ', 10678 => 'そ', 10679 => 'た', 10680 => 'ち', 10681 => 'つ', 10682 => 'て', 10683 => 'と', 10684 => 'な', 10685 => 'に', 10686 => 'ぬ', 10687 => 'ね', 10688 => 'の', 10689 => 'は', 10690 => 'ひ', 10691 => 'ふ', 10692 => 'へ', 10693 => 'ほ', 10694 => 'ま', 10695 => 'み', 10696 => 'む', 10697 => 'め', 10698 => 'も', 10699 => 'や', 10700 => 'ゆ', 10701 => '𛀁', 10702 => 'よ', 10703 => 'ら', 10704 => 'り', 10705 => 'る', 10706 => 'れ', 10707 => 'ろ', 10708 => 'わ', 10709 => 'ゐ', 10710 => 'ゑ', 10711 => 'を', 10712 => 'ん', 10713 => 'ㄅ', 10714 => 'ㄆ', 10715 => 'ㄇ', 10716 => 'ㄈ', 10717 => 'ㄪ', 10718 => 'ㄉ', 10719 => 'ㄊ', 10720 => 'ㄋ', 10721 => 'ㄌ', 10722 => 'ㄍ', 10723 => 'ㄎ', 10724 => 'ㄫ', 10725 => 'ㆭ', 10726 => 'ㄏ', 10727 => 'ㄐ', 10728 => 'ㄑ', 10729 => 'ㄒ', 10730 => 'ㄬ', 10731 => 'ㄓ', 10732 => 'ㄔ', 10733 => 'ㄕ', 10734 => 'ㄖ', 10735 => 'ㄗ', 10736 => 'ㄘ', 10737 => 'ㄙ', 10738 => 'ㆸ', 10739 => 'ㆹ', 10740 => 'ㆺ', 10741 => 'ㄚ', 10742 => 'ㄛ', 10743 => 'ㆦ', 10744 => 'ㄜ', 10745 => 'ㄝ', 10746 => 'ㆤ', 10747 => 'ㄞ', 10748 => 'ㄟ', 10749 => 'ㄠ', 10750 => 'ㄡ', 10751 => 'ㄢ', 10752 => 'ㄣ', 10753 => 'ㄤ', 10754 => 'ㆲ', 10755 => 'ㄥ', 10756 => 'ㆰ', 10757 => 'ㆱ', 10758 => 'ㆬ', 10759 => 'ㄦ', 10760 => 'ㄧ', 10761 => 'ㄨ', 10762 => 'ㄩ', 10763 => 'ㄭ', 10764 => 'ꀀ', 10765 => 'ꀁ', 10766 => 'ꀂ', 10767 => 'ꀃ', 10768 => 'ꀄ', 10769 => 'ꀅ', 10770 => 'ꀆ', 10771 => 'ꀇ', 10772 => 'ꀈ', 10773 => 'ꀉ', 10774 => 'ꀊ', 10775 => 'ꀋ', 10776 => 'ꀌ', 10777 => 'ꀍ', 10778 => 'ꀎ', 10779 => 'ꀏ', 10780 => 'ꀐ', 10781 => 'ꀑ', 10782 => 'ꀒ', 10783 => 'ꀓ', 10784 => 'ꀔ', 10785 => 'ꀕ', 10786 => 'ꀖ', 10787 => 'ꀗ', 10788 => 'ꀘ', 10789 => 'ꀙ', 10790 => 'ꀚ', 10791 => 'ꀛ', 10792 => 'ꀜ', 10793 => 'ꀝ', 10794 => 'ꀞ', 10795 => 'ꀟ', 10796 => 'ꀠ', 10797 => 'ꀡ', 10798 => 'ꀢ', 10799 => 'ꀣ', 10800 => 'ꀤ', 10801 => 'ꀥ', 10802 => 'ꀦ', 10803 => 'ꀧ', 10804 => 'ꀨ', 10805 => 'ꀩ', 10806 => 'ꀪ', 10807 => 'ꀫ', 10808 => 'ꀬ', 10809 => 'ꀭ', 10810 => 'ꀮ', 10811 => 'ꀯ', 10812 => 'ꀰ', 10813 => 'ꀱ', 10814 => 'ꀲ', 10815 => 'ꀳ', 10816 => 'ꀴ', 10817 => 'ꀵ', 10818 => 'ꀶ', 10819 => 'ꀷ', 10820 => 'ꀸ', 10821 => 'ꀹ', 10822 => 'ꀺ', 10823 => 'ꀻ', 10824 => 'ꀼ', 10825 => 'ꀽ', 10826 => 'ꀾ', 10827 => 'ꀿ', 10828 => 'ꁀ', 10829 => 'ꁁ', 10830 => 'ꁂ', 10831 => 'ꁃ', 10832 => 'ꁄ', 10833 => 'ꁅ', 10834 => 'ꁆ', 10835 => 'ꁇ', 10836 => 'ꁈ', 10837 => 'ꁉ', 10838 => 'ꁊ', 10839 => 'ꁋ', 10840 => 'ꁌ', 10841 => 'ꁍ', 10842 => 'ꁎ', 10843 => 'ꁏ', 10844 => 'ꁐ', 10845 => 'ꁑ', 10846 => 'ꁒ', 10847 => 'ꁓ', 10848 => 'ꁔ', 10849 => 'ꁕ', 10850 => 'ꁖ', 10851 => 'ꁗ', 10852 => 'ꁘ', 10853 => 'ꁙ', 10854 => 'ꁚ', 10855 => 'ꁛ', 10856 => 'ꁜ', 10857 => 'ꁝ', 10858 => 'ꁞ', 10859 => 'ꁟ', 10860 => 'ꁠ', 10861 => 'ꁡ', 10862 => 'ꁢ', 10863 => 'ꁣ', 10864 => 'ꁤ', 10865 => 'ꁥ', 10866 => 'ꁦ', 10867 => 'ꁧ', 10868 => 'ꁨ', 10869 => 'ꁩ', 10870 => 'ꁪ', 10871 => 'ꁫ', 10872 => 'ꁬ', 10873 => 'ꁭ', 10874 => 'ꁮ', 10875 => 'ꁯ', 10876 => 'ꁰ', 10877 => 'ꁱ', 10878 => 'ꁲ', 10879 => 'ꁳ', 10880 => 'ꁴ', 10881 => 'ꁵ', 10882 => 'ꁶ', 10883 => 'ꁷ', 10884 => 'ꁸ', 10885 => 'ꁹ', 10886 => 'ꁺ', 10887 => 'ꁻ', 10888 => 'ꁼ', 10889 => 'ꁽ', 10890 => 'ꁾ', 10891 => 'ꁿ', 10892 => 'ꂀ', 10893 => 'ꂁ', 10894 => 'ꂂ', 10895 => 'ꂃ', 10896 => 'ꂄ', 10897 => 'ꂅ', 10898 => 'ꂆ', 10899 => 'ꂇ', 10900 => 'ꂈ', 10901 => 'ꂉ', 10902 => 'ꂊ', 10903 => 'ꂋ', 10904 => 'ꂌ', 10905 => 'ꂍ', 10906 => 'ꂎ', 10907 => 'ꂏ', 10908 => 'ꂐ', 10909 => 'ꂑ', 10910 => 'ꂒ', 10911 => 'ꂓ', 10912 => 'ꂔ', 10913 => 'ꂕ', 10914 => 'ꂖ', 10915 => 'ꂗ', 10916 => 'ꂘ', 10917 => 'ꂙ', 10918 => 'ꂚ', 10919 => 'ꂛ', 10920 => 'ꂜ', 10921 => 'ꂝ', 10922 => 'ꂞ', 10923 => 'ꂟ', 10924 => 'ꂠ', 10925 => 'ꂡ', 10926 => 'ꂢ', 10927 => 'ꂣ', 10928 => 'ꂤ', 10929 => 'ꂥ', 10930 => 'ꂦ', 10931 => 'ꂧ', 10932 => 'ꂨ', 10933 => 'ꂩ', 10934 => 'ꂪ', 10935 => 'ꂫ', 10936 => 'ꂬ', 10937 => 'ꂭ', 10938 => 'ꂮ', 10939 => 'ꂯ', 10940 => 'ꂰ', 10941 => 'ꂱ', 10942 => 'ꂲ', 10943 => 'ꂳ', 10944 => 'ꂴ', 10945 => 'ꂵ', 10946 => 'ꂶ', 10947 => 'ꂷ', 10948 => 'ꂸ', 10949 => 'ꂹ', 10950 => 'ꂺ', 10951 => 'ꂻ', 10952 => 'ꂼ', 10953 => 'ꂽ', 10954 => 'ꂾ', 10955 => 'ꂿ', 10956 => 'ꃀ', 10957 => 'ꃁ', 10958 => 'ꃂ', 10959 => 'ꃃ', 10960 => 'ꃄ', 10961 => 'ꃅ', 10962 => 'ꃆ', 10963 => 'ꃇ', 10964 => 'ꃈ', 10965 => 'ꃉ', 10966 => 'ꃊ', 10967 => 'ꃋ', 10968 => 'ꃌ', 10969 => 'ꃍ', 10970 => 'ꃎ', 10971 => 'ꃏ', 10972 => 'ꃐ', 10973 => 'ꃑ', 10974 => 'ꃒ', 10975 => 'ꃓ', 10976 => 'ꃔ', 10977 => 'ꃕ', 10978 => 'ꃖ', 10979 => 'ꃗ', 10980 => 'ꃘ', 10981 => 'ꃙ', 10982 => 'ꃚ', 10983 => 'ꃛ', 10984 => 'ꃜ', 10985 => 'ꃝ', 10986 => 'ꃞ', 10987 => 'ꃟ', 10988 => 'ꃠ', 10989 => 'ꃡ', 10990 => 'ꃢ', 10991 => 'ꃣ', 10992 => 'ꃤ', 10993 => 'ꃥ', 10994 => 'ꃦ', 10995 => 'ꃧ', 10996 => 'ꃨ', 10997 => 'ꃩ', 10998 => 'ꃪ', 10999 => 'ꃫ', 11000 => 'ꃬ', 11001 => 'ꃭ', 11002 => 'ꃮ', 11003 => 'ꃯ', 11004 => 'ꃰ', 11005 => 'ꃱ', 11006 => 'ꃲ', 11007 => 'ꃳ', 11008 => 'ꃴ', 11009 => 'ꃵ', 11010 => 'ꃶ', 11011 => 'ꃷ', 11012 => 'ꃸ', 11013 => 'ꃹ', 11014 => 'ꃺ', 11015 => 'ꃻ', 11016 => 'ꃼ', 11017 => 'ꃽ', 11018 => 'ꃾ', 11019 => 'ꃿ', 11020 => 'ꄀ', 11021 => 'ꄁ', 11022 => 'ꄂ', 11023 => 'ꄃ', 11024 => 'ꄄ', 11025 => 'ꄅ', 11026 => 'ꄆ', 11027 => 'ꄇ', 11028 => 'ꄈ', 11029 => 'ꄉ', 11030 => 'ꄊ', 11031 => 'ꄋ', 11032 => 'ꄌ', 11033 => 'ꄍ', 11034 => 'ꄎ', 11035 => 'ꄏ', 11036 => 'ꄐ', 11037 => 'ꄑ', 11038 => 'ꄒ', 11039 => 'ꄓ', 11040 => 'ꄔ', 11041 => 'ꄕ', 11042 => 'ꄖ', 11043 => 'ꄗ', 11044 => 'ꄘ', 11045 => 'ꄙ', 11046 => 'ꄚ', 11047 => 'ꄛ', 11048 => 'ꄜ', 11049 => 'ꄝ', 11050 => 'ꄞ', 11051 => 'ꄟ', 11052 => 'ꄠ', 11053 => 'ꄡ', 11054 => 'ꄢ', 11055 => 'ꄣ', 11056 => 'ꄤ', 11057 => 'ꄥ', 11058 => 'ꄦ', 11059 => 'ꄧ', 11060 => 'ꄨ', 11061 => 'ꄩ', 11062 => 'ꄪ', 11063 => 'ꄫ', 11064 => 'ꄬ', 11065 => 'ꄭ', 11066 => 'ꄮ', 11067 => 'ꄯ', 11068 => 'ꄰ', 11069 => 'ꄱ', 11070 => 'ꄲ', 11071 => 'ꄳ', 11072 => 'ꄴ', 11073 => 'ꄵ', 11074 => 'ꄶ', 11075 => 'ꄷ', 11076 => 'ꄸ', 11077 => 'ꄹ', 11078 => 'ꄺ', 11079 => 'ꄻ', 11080 => 'ꄼ', 11081 => 'ꄽ', 11082 => 'ꄾ', 11083 => 'ꄿ', 11084 => 'ꅀ', 11085 => 'ꅁ', 11086 => 'ꅂ', 11087 => 'ꅃ', 11088 => 'ꅄ', 11089 => 'ꅅ', 11090 => 'ꅆ', 11091 => 'ꅇ', 11092 => 'ꅈ', 11093 => 'ꅉ', 11094 => 'ꅊ', 11095 => 'ꅋ', 11096 => 'ꅌ', 11097 => 'ꅍ', 11098 => 'ꅎ', 11099 => 'ꅏ', 11100 => 'ꅐ', 11101 => 'ꅑ', 11102 => 'ꅒ', 11103 => 'ꅓ', 11104 => 'ꅔ', 11105 => 'ꅕ', 11106 => 'ꅖ', 11107 => 'ꅗ', 11108 => 'ꅘ', 11109 => 'ꅙ', 11110 => 'ꅚ', 11111 => 'ꅛ', 11112 => 'ꅜ', 11113 => 'ꅝ', 11114 => 'ꅞ', 11115 => 'ꅟ', 11116 => 'ꅠ', 11117 => 'ꅡ', 11118 => 'ꅢ', 11119 => 'ꅣ', 11120 => 'ꅤ', 11121 => 'ꅥ', 11122 => 'ꅦ', 11123 => 'ꅧ', 11124 => 'ꅨ', 11125 => 'ꅩ', 11126 => 'ꅪ', 11127 => 'ꅫ', 11128 => 'ꅬ', 11129 => 'ꅭ', 11130 => 'ꅮ', 11131 => 'ꅯ', 11132 => 'ꅰ', 11133 => 'ꅱ', 11134 => 'ꅲ', 11135 => 'ꅳ', 11136 => 'ꅴ', 11137 => 'ꅵ', 11138 => 'ꅶ', 11139 => 'ꅷ', 11140 => 'ꅸ', 11141 => 'ꅹ', 11142 => 'ꅺ', 11143 => 'ꅻ', 11144 => 'ꅼ', 11145 => 'ꅽ', 11146 => 'ꅾ', 11147 => 'ꅿ', 11148 => 'ꆀ', 11149 => 'ꆁ', 11150 => 'ꆂ', 11151 => 'ꆃ', 11152 => 'ꆄ', 11153 => 'ꆅ', 11154 => 'ꆆ', 11155 => 'ꆇ', 11156 => 'ꆈ', 11157 => 'ꆉ', 11158 => 'ꆊ', 11159 => 'ꆋ', 11160 => 'ꆌ', 11161 => 'ꆍ', 11162 => 'ꆎ', 11163 => 'ꆏ', 11164 => 'ꆐ', 11165 => 'ꆑ', 11166 => 'ꆒ', 11167 => 'ꆓ', 11168 => 'ꆔ', 11169 => 'ꆕ', 11170 => 'ꆖ', 11171 => 'ꆗ', 11172 => 'ꆘ', 11173 => 'ꆙ', 11174 => 'ꆚ', 11175 => 'ꆛ', 11176 => 'ꆜ', 11177 => 'ꆝ', 11178 => 'ꆞ', 11179 => 'ꆟ', 11180 => 'ꆠ', 11181 => 'ꆡ', 11182 => 'ꆢ', 11183 => 'ꆣ', 11184 => 'ꆤ', 11185 => 'ꆥ', 11186 => 'ꆦ', 11187 => 'ꆧ', 11188 => 'ꆨ', 11189 => 'ꆩ', 11190 => 'ꆪ', 11191 => 'ꆫ', 11192 => 'ꆬ', 11193 => 'ꆭ', 11194 => 'ꆮ', 11195 => 'ꆯ', 11196 => 'ꆰ', 11197 => 'ꆱ', 11198 => 'ꆲ', 11199 => 'ꆳ', 11200 => 'ꆴ', 11201 => 'ꆵ', 11202 => 'ꆶ', 11203 => 'ꆷ', 11204 => 'ꆸ', 11205 => 'ꆹ', 11206 => 'ꆺ', 11207 => 'ꆻ', 11208 => 'ꆼ', 11209 => 'ꆽ', 11210 => 'ꆾ', 11211 => 'ꆿ', 11212 => 'ꇀ', 11213 => 'ꇁ', 11214 => 'ꇂ', 11215 => 'ꇃ', 11216 => 'ꇄ', 11217 => 'ꇅ', 11218 => 'ꇆ', 11219 => 'ꇇ', 11220 => 'ꇈ', 11221 => 'ꇉ', 11222 => 'ꇊ', 11223 => 'ꇋ', 11224 => 'ꇌ', 11225 => 'ꇍ', 11226 => 'ꇎ', 11227 => 'ꇏ', 11228 => 'ꇐ', 11229 => 'ꇑ', 11230 => 'ꇒ', 11231 => 'ꇓ', 11232 => 'ꇔ', 11233 => 'ꇕ', 11234 => 'ꇖ', 11235 => 'ꇗ', 11236 => 'ꇘ', 11237 => 'ꇙ', 11238 => 'ꇚ', 11239 => 'ꇛ', 11240 => 'ꇜ', 11241 => 'ꇝ', 11242 => 'ꇞ', 11243 => 'ꇟ', 11244 => 'ꇠ', 11245 => 'ꇡ', 11246 => 'ꇢ', 11247 => 'ꇣ', 11248 => 'ꇤ', 11249 => 'ꇥ', 11250 => 'ꇦ', 11251 => 'ꇧ', 11252 => 'ꇨ', 11253 => 'ꇩ', 11254 => 'ꇪ', 11255 => 'ꇫ', 11256 => 'ꇬ', 11257 => 'ꇭ', 11258 => 'ꇮ', 11259 => 'ꇯ', 11260 => 'ꇰ', 11261 => 'ꇱ', 11262 => 'ꇲ', 11263 => 'ꇳ', 11264 => 'ꇴ', 11265 => 'ꇵ', 11266 => 'ꇶ', 11267 => 'ꇷ', 11268 => 'ꇸ', 11269 => 'ꇹ', 11270 => 'ꇺ', 11271 => 'ꇻ', 11272 => 'ꇼ', 11273 => 'ꇽ', 11274 => 'ꇾ', 11275 => 'ꇿ', 11276 => 'ꈀ', 11277 => 'ꈁ', 11278 => 'ꈂ', 11279 => 'ꈃ', 11280 => 'ꈄ', 11281 => 'ꈅ', 11282 => 'ꈆ', 11283 => 'ꈇ', 11284 => 'ꈈ', 11285 => 'ꈉ', 11286 => 'ꈊ', 11287 => 'ꈋ', 11288 => 'ꈌ', 11289 => 'ꈍ', 11290 => 'ꈎ', 11291 => 'ꈏ', 11292 => 'ꈐ', 11293 => 'ꈑ', 11294 => 'ꈒ', 11295 => 'ꈓ', 11296 => 'ꈔ', 11297 => 'ꈕ', 11298 => 'ꈖ', 11299 => 'ꈗ', 11300 => 'ꈘ', 11301 => 'ꈙ', 11302 => 'ꈚ', 11303 => 'ꈛ', 11304 => 'ꈜ', 11305 => 'ꈝ', 11306 => 'ꈞ', 11307 => 'ꈟ', 11308 => 'ꈠ', 11309 => 'ꈡ', 11310 => 'ꈢ', 11311 => 'ꈣ', 11312 => 'ꈤ', 11313 => 'ꈥ', 11314 => 'ꈦ', 11315 => 'ꈧ', 11316 => 'ꈨ', 11317 => 'ꈩ', 11318 => 'ꈪ', 11319 => 'ꈫ', 11320 => 'ꈬ', 11321 => 'ꈭ', 11322 => 'ꈮ', 11323 => 'ꈯ', 11324 => 'ꈰ', 11325 => 'ꈱ', 11326 => 'ꈲ', 11327 => 'ꈳ', 11328 => 'ꈴ', 11329 => 'ꈵ', 11330 => 'ꈶ', 11331 => 'ꈷ', 11332 => 'ꈸ', 11333 => 'ꈹ', 11334 => 'ꈺ', 11335 => 'ꈻ', 11336 => 'ꈼ', 11337 => 'ꈽ', 11338 => 'ꈾ', 11339 => 'ꈿ', 11340 => 'ꉀ', 11341 => 'ꉁ', 11342 => 'ꉂ', 11343 => 'ꉃ', 11344 => 'ꉄ', 11345 => 'ꉅ', 11346 => 'ꉆ', 11347 => 'ꉇ', 11348 => 'ꉈ', 11349 => 'ꉉ', 11350 => 'ꉊ', 11351 => 'ꉋ', 11352 => 'ꉌ', 11353 => 'ꉍ', 11354 => 'ꉎ', 11355 => 'ꉏ', 11356 => 'ꉐ', 11357 => 'ꉑ', 11358 => 'ꉒ', 11359 => 'ꉓ', 11360 => 'ꉔ', 11361 => 'ꉕ', 11362 => 'ꉖ', 11363 => 'ꉗ', 11364 => 'ꉘ', 11365 => 'ꉙ', 11366 => 'ꉚ', 11367 => 'ꉛ', 11368 => 'ꉜ', 11369 => 'ꉝ', 11370 => 'ꉞ', 11371 => 'ꉟ', 11372 => 'ꉠ', 11373 => 'ꉡ', 11374 => 'ꉢ', 11375 => 'ꉣ', 11376 => 'ꉤ', 11377 => 'ꉥ', 11378 => 'ꉦ', 11379 => 'ꉧ', 11380 => 'ꉨ', 11381 => 'ꉩ', 11382 => 'ꉪ', 11383 => 'ꉫ', 11384 => 'ꉬ', 11385 => 'ꉭ', 11386 => 'ꉮ', 11387 => 'ꉯ', 11388 => 'ꉰ', 11389 => 'ꉱ', 11390 => 'ꉲ', 11391 => 'ꉳ', 11392 => 'ꉴ', 11393 => 'ꉵ', 11394 => 'ꉶ', 11395 => 'ꉷ', 11396 => 'ꉸ', 11397 => 'ꉹ', 11398 => 'ꉺ', 11399 => 'ꉻ', 11400 => 'ꉼ', 11401 => 'ꉽ', 11402 => 'ꉾ', 11403 => 'ꉿ', 11404 => 'ꊀ', 11405 => 'ꊁ', 11406 => 'ꊂ', 11407 => 'ꊃ', 11408 => 'ꊄ', 11409 => 'ꊅ', 11410 => 'ꊆ', 11411 => 'ꊇ', 11412 => 'ꊈ', 11413 => 'ꊉ', 11414 => 'ꊊ', 11415 => 'ꊋ', 11416 => 'ꊌ', 11417 => 'ꊍ', 11418 => 'ꊎ', 11419 => 'ꊏ', 11420 => 'ꊐ', 11421 => 'ꊑ', 11422 => 'ꊒ', 11423 => 'ꊓ', 11424 => 'ꊔ', 11425 => 'ꊕ', 11426 => 'ꊖ', 11427 => 'ꊗ', 11428 => 'ꊘ', 11429 => 'ꊙ', 11430 => 'ꊚ', 11431 => 'ꊛ', 11432 => 'ꊜ', 11433 => 'ꊝ', 11434 => 'ꊞ', 11435 => 'ꊟ', 11436 => 'ꊠ', 11437 => 'ꊡ', 11438 => 'ꊢ', 11439 => 'ꊣ', 11440 => 'ꊤ', 11441 => 'ꊥ', 11442 => 'ꊦ', 11443 => 'ꊧ', 11444 => 'ꊨ', 11445 => 'ꊩ', 11446 => 'ꊪ', 11447 => 'ꊫ', 11448 => 'ꊬ', 11449 => 'ꊭ', 11450 => 'ꊮ', 11451 => 'ꊯ', 11452 => 'ꊰ', 11453 => 'ꊱ', 11454 => 'ꊲ', 11455 => 'ꊳ', 11456 => 'ꊴ', 11457 => 'ꊵ', 11458 => 'ꊶ', 11459 => 'ꊷ', 11460 => 'ꊸ', 11461 => 'ꊹ', 11462 => 'ꊺ', 11463 => 'ꊻ', 11464 => 'ꊼ', 11465 => 'ꊽ', 11466 => 'ꊾ', 11467 => 'ꊿ', 11468 => 'ꋀ', 11469 => 'ꋁ', 11470 => 'ꋂ', 11471 => 'ꋃ', 11472 => 'ꋄ', 11473 => 'ꋅ', 11474 => 'ꋆ', 11475 => 'ꋇ', 11476 => 'ꋈ', 11477 => 'ꋉ', 11478 => 'ꋊ', 11479 => 'ꋋ', 11480 => 'ꋌ', 11481 => 'ꋍ', 11482 => 'ꋎ', 11483 => 'ꋏ', 11484 => 'ꋐ', 11485 => 'ꋑ', 11486 => 'ꋒ', 11487 => 'ꋓ', 11488 => 'ꋔ', 11489 => 'ꋕ', 11490 => 'ꋖ', 11491 => 'ꋗ', 11492 => 'ꋘ', 11493 => 'ꋙ', 11494 => 'ꋚ', 11495 => 'ꋛ', 11496 => 'ꋜ', 11497 => 'ꋝ', 11498 => 'ꋞ', 11499 => 'ꋟ', 11500 => 'ꋠ', 11501 => 'ꋡ', 11502 => 'ꋢ', 11503 => 'ꋣ', 11504 => 'ꋤ', 11505 => 'ꋥ', 11506 => 'ꋦ', 11507 => 'ꋧ', 11508 => 'ꋨ', 11509 => 'ꋩ', 11510 => 'ꋪ', 11511 => 'ꋫ', 11512 => 'ꋬ', 11513 => 'ꋭ', 11514 => 'ꋮ', 11515 => 'ꋯ', 11516 => 'ꋰ', 11517 => 'ꋱ', 11518 => 'ꋲ', 11519 => 'ꋳ', 11520 => 'ꋴ', 11521 => 'ꋵ', 11522 => 'ꋶ', 11523 => 'ꋷ', 11524 => 'ꋸ', 11525 => 'ꋹ', 11526 => 'ꋺ', 11527 => 'ꋻ', 11528 => 'ꋼ', 11529 => 'ꋽ', 11530 => 'ꋾ', 11531 => 'ꋿ', 11532 => 'ꌀ', 11533 => 'ꌁ', 11534 => 'ꌂ', 11535 => 'ꌃ', 11536 => 'ꌄ', 11537 => 'ꌅ', 11538 => 'ꌆ', 11539 => 'ꌇ', 11540 => 'ꌈ', 11541 => 'ꌉ', 11542 => 'ꌊ', 11543 => 'ꌋ', 11544 => 'ꌌ', 11545 => 'ꌍ', 11546 => 'ꌎ', 11547 => 'ꌏ', 11548 => 'ꌐ', 11549 => 'ꌑ', 11550 => 'ꌒ', 11551 => 'ꌓ', 11552 => 'ꌔ', 11553 => 'ꌕ', 11554 => 'ꌖ', 11555 => 'ꌗ', 11556 => 'ꌘ', 11557 => 'ꌙ', 11558 => 'ꌚ', 11559 => 'ꌛ', 11560 => 'ꌜ', 11561 => 'ꌝ', 11562 => 'ꌞ', 11563 => 'ꌟ', 11564 => 'ꌠ', 11565 => 'ꌡ', 11566 => 'ꌢ', 11567 => 'ꌣ', 11568 => 'ꌤ', 11569 => 'ꌥ', 11570 => 'ꌦ', 11571 => 'ꌧ', 11572 => 'ꌨ', 11573 => 'ꌩ', 11574 => 'ꌪ', 11575 => 'ꌫ', 11576 => 'ꌬ', 11577 => 'ꌭ', 11578 => 'ꌮ', 11579 => 'ꌯ', 11580 => 'ꌰ', 11581 => 'ꌱ', 11582 => 'ꌲ', 11583 => 'ꌳ', 11584 => 'ꌴ', 11585 => 'ꌵ', 11586 => 'ꌶ', 11587 => 'ꌷ', 11588 => 'ꌸ', 11589 => 'ꌹ', 11590 => 'ꌺ', 11591 => 'ꌻ', 11592 => 'ꌼ', 11593 => 'ꌽ', 11594 => 'ꌾ', 11595 => 'ꌿ', 11596 => 'ꍀ', 11597 => 'ꍁ', 11598 => 'ꍂ', 11599 => 'ꍃ', 11600 => 'ꍄ', 11601 => 'ꍅ', 11602 => 'ꍆ', 11603 => 'ꍇ', 11604 => 'ꍈ', 11605 => 'ꍉ', 11606 => 'ꍊ', 11607 => 'ꍋ', 11608 => 'ꍌ', 11609 => 'ꍍ', 11610 => 'ꍎ', 11611 => 'ꍏ', 11612 => 'ꍐ', 11613 => 'ꍑ', 11614 => 'ꍒ', 11615 => 'ꍓ', 11616 => 'ꍔ', 11617 => 'ꍕ', 11618 => 'ꍖ', 11619 => 'ꍗ', 11620 => 'ꍘ', 11621 => 'ꍙ', 11622 => 'ꍚ', 11623 => 'ꍛ', 11624 => 'ꍜ', 11625 => 'ꍝ', 11626 => 'ꍞ', 11627 => 'ꍟ', 11628 => 'ꍠ', 11629 => 'ꍡ', 11630 => 'ꍢ', 11631 => 'ꍣ', 11632 => 'ꍤ', 11633 => 'ꍥ', 11634 => 'ꍦ', 11635 => 'ꍧ', 11636 => 'ꍨ', 11637 => 'ꍩ', 11638 => 'ꍪ', 11639 => 'ꍫ', 11640 => 'ꍬ', 11641 => 'ꍭ', 11642 => 'ꍮ', 11643 => 'ꍯ', 11644 => 'ꍰ', 11645 => 'ꍱ', 11646 => 'ꍲ', 11647 => 'ꍳ', 11648 => 'ꍴ', 11649 => 'ꍵ', 11650 => 'ꍶ', 11651 => 'ꍷ', 11652 => 'ꍸ', 11653 => 'ꍹ', 11654 => 'ꍺ', 11655 => 'ꍻ', 11656 => 'ꍼ', 11657 => 'ꍽ', 11658 => 'ꍾ', 11659 => 'ꍿ', 11660 => 'ꎀ', 11661 => 'ꎁ', 11662 => 'ꎂ', 11663 => 'ꎃ', 11664 => 'ꎄ', 11665 => 'ꎅ', 11666 => 'ꎆ', 11667 => 'ꎇ', 11668 => 'ꎈ', 11669 => 'ꎉ', 11670 => 'ꎊ', 11671 => 'ꎋ', 11672 => 'ꎌ', 11673 => 'ꎍ', 11674 => 'ꎎ', 11675 => 'ꎏ', 11676 => 'ꎐ', 11677 => 'ꎑ', 11678 => 'ꎒ', 11679 => 'ꎓ', 11680 => 'ꎔ', 11681 => 'ꎕ', 11682 => 'ꎖ', 11683 => 'ꎗ', 11684 => 'ꎘ', 11685 => 'ꎙ', 11686 => 'ꎚ', 11687 => 'ꎛ', 11688 => 'ꎜ', 11689 => 'ꎝ', 11690 => 'ꎞ', 11691 => 'ꎟ', 11692 => 'ꎠ', 11693 => 'ꎡ', 11694 => 'ꎢ', 11695 => 'ꎣ', 11696 => 'ꎤ', 11697 => 'ꎥ', 11698 => 'ꎦ', 11699 => 'ꎧ', 11700 => 'ꎨ', 11701 => 'ꎩ', 11702 => 'ꎪ', 11703 => 'ꎫ', 11704 => 'ꎬ', 11705 => 'ꎭ', 11706 => 'ꎮ', 11707 => 'ꎯ', 11708 => 'ꎰ', 11709 => 'ꎱ', 11710 => 'ꎲ', 11711 => 'ꎳ', 11712 => 'ꎴ', 11713 => 'ꎵ', 11714 => 'ꎶ', 11715 => 'ꎷ', 11716 => 'ꎸ', 11717 => 'ꎹ', 11718 => 'ꎺ', 11719 => 'ꎻ', 11720 => 'ꎼ', 11721 => 'ꎽ', 11722 => 'ꎾ', 11723 => 'ꎿ', 11724 => 'ꏀ', 11725 => 'ꏁ', 11726 => 'ꏂ', 11727 => 'ꏃ', 11728 => 'ꏄ', 11729 => 'ꏅ', 11730 => 'ꏆ', 11731 => 'ꏇ', 11732 => 'ꏈ', 11733 => 'ꏉ', 11734 => 'ꏊ', 11735 => 'ꏋ', 11736 => 'ꏌ', 11737 => 'ꏍ', 11738 => 'ꏎ', 11739 => 'ꏏ', 11740 => 'ꏐ', 11741 => 'ꏑ', 11742 => 'ꏒ', 11743 => 'ꏓ', 11744 => 'ꏔ', 11745 => 'ꏕ', 11746 => 'ꏖ', 11747 => 'ꏗ', 11748 => 'ꏘ', 11749 => 'ꏙ', 11750 => 'ꏚ', 11751 => 'ꏛ', 11752 => 'ꏜ', 11753 => 'ꏝ', 11754 => 'ꏞ', 11755 => 'ꏟ', 11756 => 'ꏠ', 11757 => 'ꏡ', 11758 => 'ꏢ', 11759 => 'ꏣ', 11760 => 'ꏤ', 11761 => 'ꏥ', 11762 => 'ꏦ', 11763 => 'ꏧ', 11764 => 'ꏨ', 11765 => 'ꏩ', 11766 => 'ꏪ', 11767 => 'ꏫ', 11768 => 'ꏬ', 11769 => 'ꏭ', 11770 => 'ꏮ', 11771 => 'ꏯ', 11772 => 'ꏰ', 11773 => 'ꏱ', 11774 => 'ꏲ', 11775 => 'ꏳ', 11776 => 'ꏴ', 11777 => 'ꏵ', 11778 => 'ꏶ', 11779 => 'ꏷ', 11780 => 'ꏸ', 11781 => 'ꏹ', 11782 => 'ꏺ', 11783 => 'ꏻ', 11784 => 'ꏼ', 11785 => 'ꏽ', 11786 => 'ꏾ', 11787 => 'ꏿ', 11788 => 'ꐀ', 11789 => 'ꐁ', 11790 => 'ꐂ', 11791 => 'ꐃ', 11792 => 'ꐄ', 11793 => 'ꐅ', 11794 => 'ꐆ', 11795 => 'ꐇ', 11796 => 'ꐈ', 11797 => 'ꐉ', 11798 => 'ꐊ', 11799 => 'ꐋ', 11800 => 'ꐌ', 11801 => 'ꐍ', 11802 => 'ꐎ', 11803 => 'ꐏ', 11804 => 'ꐐ', 11805 => 'ꐑ', 11806 => 'ꐒ', 11807 => 'ꐓ', 11808 => 'ꐔ', 11809 => 'ꐕ', 11810 => 'ꐖ', 11811 => 'ꐗ', 11812 => 'ꐘ', 11813 => 'ꐙ', 11814 => 'ꐚ', 11815 => 'ꐛ', 11816 => 'ꐜ', 11817 => 'ꐝ', 11818 => 'ꐞ', 11819 => 'ꐟ', 11820 => 'ꐠ', 11821 => 'ꐡ', 11822 => 'ꐢ', 11823 => 'ꐣ', 11824 => 'ꐤ', 11825 => 'ꐥ', 11826 => 'ꐦ', 11827 => 'ꐧ', 11828 => 'ꐨ', 11829 => 'ꐩ', 11830 => 'ꐪ', 11831 => 'ꐫ', 11832 => 'ꐬ', 11833 => 'ꐭ', 11834 => 'ꐮ', 11835 => 'ꐯ', 11836 => 'ꐰ', 11837 => 'ꐱ', 11838 => 'ꐲ', 11839 => 'ꐳ', 11840 => 'ꐴ', 11841 => 'ꐵ', 11842 => 'ꐶ', 11843 => 'ꐷ', 11844 => 'ꐸ', 11845 => 'ꐹ', 11846 => 'ꐺ', 11847 => 'ꐻ', 11848 => 'ꐼ', 11849 => 'ꐽ', 11850 => 'ꐾ', 11851 => 'ꐿ', 11852 => 'ꑀ', 11853 => 'ꑁ', 11854 => 'ꑂ', 11855 => 'ꑃ', 11856 => 'ꑄ', 11857 => 'ꑅ', 11858 => 'ꑆ', 11859 => 'ꑇ', 11860 => 'ꑈ', 11861 => 'ꑉ', 11862 => 'ꑊ', 11863 => 'ꑋ', 11864 => 'ꑌ', 11865 => 'ꑍ', 11866 => 'ꑎ', 11867 => 'ꑏ', 11868 => 'ꑐ', 11869 => 'ꑑ', 11870 => 'ꑒ', 11871 => 'ꑓ', 11872 => 'ꑔ', 11873 => 'ꑕ', 11874 => 'ꑖ', 11875 => 'ꑗ', 11876 => 'ꑘ', 11877 => 'ꑙ', 11878 => 'ꑚ', 11879 => 'ꑛ', 11880 => 'ꑜ', 11881 => 'ꑝ', 11882 => 'ꑞ', 11883 => 'ꑟ', 11884 => 'ꑠ', 11885 => 'ꑡ', 11886 => 'ꑢ', 11887 => 'ꑣ', 11888 => 'ꑤ', 11889 => 'ꑥ', 11890 => 'ꑦ', 11891 => 'ꑧ', 11892 => 'ꑨ', 11893 => 'ꑩ', 11894 => 'ꑪ', 11895 => 'ꑫ', 11896 => 'ꑬ', 11897 => 'ꑭ', 11898 => 'ꑮ', 11899 => 'ꑯ', 11900 => 'ꑰ', 11901 => 'ꑱ', 11902 => 'ꑲ', 11903 => 'ꑳ', 11904 => 'ꑴ', 11905 => 'ꑵ', 11906 => 'ꑶ', 11907 => 'ꑷ', 11908 => 'ꑸ', 11909 => 'ꑹ', 11910 => 'ꑺ', 11911 => 'ꑻ', 11912 => 'ꑼ', 11913 => 'ꑽ', 11914 => 'ꑾ', 11915 => 'ꑿ', 11916 => 'ꒀ', 11917 => 'ꒁ', 11918 => 'ꒂ', 11919 => 'ꒃ', 11920 => 'ꒄ', 11921 => 'ꒅ', 11922 => 'ꒆ', 11923 => 'ꒇ', 11924 => 'ꒈ', 11925 => 'ꒉ', 11926 => 'ꒊ', 11927 => 'ꒋ', 11928 => 'ꒌ', 11929 => 'ꓸ', 11930 => 'ꓹ', 11931 => 'ꓺ', 11932 => 'ꓻ', 11933 => 'ꓽ', 11934 => 'ꓼ', 11935 => 'ꓐ', 11936 => 'ꓑ', 11937 => 'ꓒ', 11938 => 'ꓓ', 11939 => 'ꓔ', 11940 => 'ꓕ', 11941 => 'ꓖ', 11942 => 'ꓗ', 11943 => 'ꓘ', 11944 => 'ꓙ', 11945 => 'ꓚ', 11946 => 'ꓛ', 11947 => 'ꓜ', 11948 => 'ꓝ', 11949 => 'ꓞ', 11950 => 'ꓟ', 11951 => 'ꓠ', 11952 => 'ꓡ', 11953 => 'ꓢ', 11954 => 'ꓣ', 11955 => 'ꓤ', 11956 => 'ꓥ', 11957 => 'ꓦ', 11958 => 'ꓧ', 11959 => 'ꓨ', 11960 => 'ꓩ', 11961 => 'ꓫ', 11962 => 'ꓭ', 11963 => 'ꓪ', 11964 => 'ꓬ', 11965 => 'ꓮ', 11966 => 'ꓯ', 11967 => 'ꓰ', 11968 => 'ꓱ', 11969 => 'ꓲ', 11970 => 'ꓳ', 11971 => 'ꓴ', 11972 => 'ꓵ', 11973 => 'ꓶ', 11974 => 'ꓷ', 11975 => '𐊀', 11976 => '𐊁', 11977 => '𐊂', 11978 => '𐊃', 11979 => '𐊄', 11980 => '𐊅', 11981 => '𐊆', 11982 => '𐊇', 11983 => '𐊈', 11984 => '𐊉', 11985 => '𐊊', 11986 => '𐊋', 11987 => '𐊌', 11988 => '𐊍', 11989 => '𐊎', 11990 => '𐊏', 11991 => '𐊐', 11992 => '𐊑', 11993 => '𐊒', 11994 => '𐊓', 11995 => '𐊔', 11996 => '𐊕', 11997 => '𐊖', 11998 => '𐊗', 11999 => '𐊘', 12000 => '𐊙', 12001 => '𐊚', 12002 => '𐊛', 12003 => '𐊜', 12004 => '𐊠', 12005 => '𐊡', 12006 => '𐊢', 12007 => '𐊣', 12008 => '𐊤', 12009 => '𐊥', 12010 => '𐊦', 12011 => '𐊧', 12012 => '𐊨', 12013 => '𐊩', 12014 => '𐊪', 12015 => '𐊫', 12016 => '𐊬', 12017 => '𐊭', 12018 => '𐊮', 12019 => '𐊯', 12020 => '𐊰', 12021 => '𐊱', 12022 => '𐊲', 12023 => '𐊳', 12024 => '𐊴', 12025 => '𐊵', 12026 => '𐊶', 12027 => '𐊷', 12028 => '𐊸', 12029 => '𐊹', 12030 => '𐊺', 12031 => '𐊻', 12032 => '𐊼', 12033 => '𐊽', 12034 => '𐊾', 12035 => '𐊿', 12036 => '𐋀', 12037 => '𐋁', 12038 => '𐋂', 12039 => '𐋃', 12040 => '𐋄', 12041 => '𐋅', 12042 => '𐋆', 12043 => '𐋇', 12044 => '𐋈', 12045 => '𐋉', 12046 => '𐋊', 12047 => '𐋋', 12048 => '𐋌', 12049 => '𐋍', 12050 => '𐋎', 12051 => '𐋏', 12052 => '𐋐', 12053 => '𐤠', 12054 => '𐤡', 12055 => '𐤢', 12056 => '𐤣', 12057 => '𐤤', 12058 => '𐤥', 12059 => '𐤦', 12060 => '𐤧', 12061 => '𐤨', 12062 => '𐤩', 12063 => '𐤪', 12064 => '𐤫', 12065 => '𐤬', 12066 => '𐤭', 12067 => '𐤮', 12068 => '𐤯', 12069 => '𐤰', 12070 => '𐤱', 12071 => '𐤲', 12072 => '𐤳', 12073 => '𐤴', 12074 => '𐤵', 12075 => '𐤶', 12076 => '𐤷', 12077 => '𐤸', 12078 => '𐤹', 12079 => '𐌀', 12080 => '𐌁', 12081 => '𐌂', 12082 => '𐌃', 12083 => '𐌄', 12084 => '𐌅', 12085 => '𐌆', 12086 => '𐌇', 12087 => '𐌈', 12088 => '𐌉', 12089 => '𐌊', 12090 => '𐌋', 12091 => '𐌌', 12092 => '𐌍', 12093 => '𐌎', 12094 => '𐌏', 12095 => '𐌐', 12096 => '𐌑', 12097 => '𐌒', 12098 => '𐌓', 12099 => '𐌔', 12100 => '𐌕', 12101 => '𐌖', 12102 => '𐌗', 12103 => '𐌘', 12104 => '𐌙', 12105 => '𐌚', 12106 => '𐌛', 12107 => '𐌜', 12108 => '𐌝', 12109 => '𐌞', 12110 => '𐌰', 12111 => '𐌱', 12112 => '𐌲', 12113 => '𐌳', 12114 => '𐌴', 12115 => '𐌵', 12116 => '𐌶', 12117 => '𐌷', 12118 => '𐌸', 12119 => '𐌹', 12120 => '𐌺', 12121 => '𐌻', 12122 => '𐌼', 12123 => '𐌽', 12124 => '𐌾', 12125 => '𐌿', 12126 => '𐍀', 12127 => '𐍁', 12128 => '𐍂', 12129 => '𐍃', 12130 => '𐍄', 12131 => '𐍅', 12132 => '𐍆', 12133 => '𐍇', 12134 => '𐍈', 12135 => '𐍉', 12136 => '𐍊', 12137 => '𐐀', 12138 => '𐐁', 12139 => '𐐂', 12140 => '𐐃', 12141 => '𐐄', 12142 => '𐐅', 12143 => '𐐆', 12144 => '𐐇', 12145 => '𐐈', 12146 => '𐐉', 12147 => '𐐊', 12148 => '𐐋', 12149 => '𐐌', 12150 => '𐐍', 12151 => '𐐎', 12152 => '𐐏', 12153 => '𐐐', 12154 => '𐐑', 12155 => '𐐒', 12156 => '𐐓', 12157 => '𐐔', 12158 => '𐐕', 12159 => '𐐖', 12160 => '𐐗', 12161 => '𐐘', 12162 => '𐐙', 12163 => '𐐚', 12164 => '𐐛', 12165 => '𐐜', 12166 => '𐐝', 12167 => '𐐞', 12168 => '𐐟', 12169 => '𐐠', 12170 => '𐐡', 12171 => '𐐢', 12172 => '𐐣', 12173 => '𐐤', 12174 => '𐐥', 12175 => '𐐦', 12176 => '𐐧', 12177 => '𐑐', 12178 => '𐑑', 12179 => '𐑒', 12180 => '𐑓', 12181 => '𐑔', 12182 => '𐑕', 12183 => '𐑖', 12184 => '𐑗', 12185 => '𐑘', 12186 => '𐑙', 12187 => '𐑚', 12188 => '𐑛', 12189 => '𐑜', 12190 => '𐑝', 12191 => '𐑞', 12192 => '𐑟', 12193 => '𐑠', 12194 => '𐑡', 12195 => '𐑢', 12196 => '𐑣', 12197 => '𐑤', 12198 => '𐑥', 12199 => '𐑦', 12200 => '𐑧', 12201 => '𐑨', 12202 => '𐑩', 12203 => '𐑪', 12204 => '𐑫', 12205 => '𐑬', 12206 => '𐑭', 12207 => '𐑮', 12208 => '𐑯', 12209 => '𐑰', 12210 => '𐑱', 12211 => '𐑲', 12212 => '𐑳', 12213 => '𐑴', 12214 => '𐑵', 12215 => '𐑶', 12216 => '𐑷', 12217 => '𐑸', 12218 => '𐑹', 12219 => '𐑺', 12220 => '𐑻', 12221 => '𐑼', 12222 => '𐑽', 12223 => '𐑾', 12224 => '𐑿', 12225 => '𐒀', 12226 => '𐒁', 12227 => '𐒂', 12228 => '𐒃', 12229 => '𐒄', 12230 => '𐒅', 12231 => '𐒆', 12232 => '𐒇', 12233 => '𐒈', 12234 => '𐒉', 12235 => '𐒊', 12236 => '𐒋', 12237 => '𐒌', 12238 => '𐒍', 12239 => '𐒎', 12240 => '𐒏', 12241 => '𐒐', 12242 => '𐒑', 12243 => '𐒒', 12244 => '𐒓', 12245 => '𐒔', 12246 => '𐒕', 12247 => '𐒖', 12248 => '𐒗', 12249 => '𐒘', 12250 => '𐒙', 12251 => '𐒚', 12252 => '𐒛', 12253 => '𐒜', 12254 => '𐒝', 12255 => '𐀀', 12256 => '𐀁', 12257 => '𐀂', 12258 => '𐀃', 12259 => '𐀄', 12260 => '𐀅', 12261 => '𐀆', 12262 => '𐀇', 12263 => '𐀈', 12264 => '𐀉', 12265 => '𐀊', 12266 => '𐀋', 12267 => '𐀍', 12268 => '𐀎', 12269 => '𐀏', 12270 => '𐀐', 12271 => '𐀑', 12272 => '𐀒', 12273 => '𐀓', 12274 => '𐀔', 12275 => '𐀕', 12276 => '𐀖', 12277 => '𐀗', 12278 => '𐀘', 12279 => '𐀙', 12280 => '𐀚', 12281 => '𐀛', 12282 => '𐀜', 12283 => '𐀝', 12284 => '𐀞', 12285 => '𐀟', 12286 => '𐀠', 12287 => '𐀡', 12288 => '𐀢', 12289 => '𐀣', 12290 => '𐀤', 12291 => '𐀥', 12292 => '𐀦', 12293 => '𐀨', 12294 => '𐀩', 12295 => '𐀪', 12296 => '𐀫', 12297 => '𐀬', 12298 => '𐀭', 12299 => '𐀮', 12300 => '𐀯', 12301 => '𐀰', 12302 => '𐀱', 12303 => '𐀲', 12304 => '𐀳', 12305 => '𐀴', 12306 => '𐀵', 12307 => '𐀶', 12308 => '𐀷', 12309 => '𐀸', 12310 => '𐀹', 12311 => '𐀺', 12312 => '𐀼', 12313 => '𐀽', 12314 => '𐀿', 12315 => '𐁀', 12316 => '𐁁', 12317 => '𐁂', 12318 => '𐁃', 12319 => '𐁄', 12320 => '𐁅', 12321 => '𐁆', 12322 => '𐁇', 12323 => '𐁈', 12324 => '𐁉', 12325 => '𐁊', 12326 => '𐁋', 12327 => '𐁌', 12328 => '𐁍', 12329 => '𐁐', 12330 => '𐁑', 12331 => '𐁒', 12332 => '𐁓', 12333 => '𐁔', 12334 => '𐁕', 12335 => '𐁖', 12336 => '𐁗', 12337 => '𐁘', 12338 => '𐁙', 12339 => '𐁚', 12340 => '𐁛', 12341 => '𐁜', 12342 => '𐁝', 12343 => '𐂀', 12344 => '𐂁', 12345 => '𐂂', 12346 => '𐂃', 12347 => '𐂄', 12348 => '𐂅', 12349 => '𐂆', 12350 => '𐂇', 12351 => '𐂈', 12352 => '𐂉', 12353 => '𐂊', 12354 => '𐂋', 12355 => '𐂌', 12356 => '𐂍', 12357 => '𐂎', 12358 => '𐂏', 12359 => '𐂐', 12360 => '𐂑', 12361 => '𐂒', 12362 => '𐂓', 12363 => '𐂔', 12364 => '𐂕', 12365 => '𐂖', 12366 => '𐂗', 12367 => '𐂘', 12368 => '𐂙', 12369 => '𐂚', 12370 => '𐂛', 12371 => '𐂜', 12372 => '𐂝', 12373 => '𐂞', 12374 => '𐂟', 12375 => '𐂠', 12376 => '𐂡', 12377 => '𐂢', 12378 => '𐂣', 12379 => '𐂤', 12380 => '𐂥', 12381 => '𐂦', 12382 => '𐂧', 12383 => '𐂨', 12384 => '𐂩', 12385 => '𐂪', 12386 => '𐂫', 12387 => '𐂬', 12388 => '𐂭', 12389 => '𐂮', 12390 => '𐂯', 12391 => '𐂰', 12392 => '𐂱', 12393 => '𐂲', 12394 => '𐂳', 12395 => '𐂴', 12396 => '𐂵', 12397 => '𐂶', 12398 => '𐂷', 12399 => '𐂸', 12400 => '𐂹', 12401 => '𐂺', 12402 => '𐂻', 12403 => '𐂼', 12404 => '𐂽', 12405 => '𐂾', 12406 => '𐂿', 12407 => '𐃀', 12408 => '𐃁', 12409 => '𐃂', 12410 => '𐃃', 12411 => '𐃄', 12412 => '𐃅', 12413 => '𐃆', 12414 => '𐃇', 12415 => '𐃈', 12416 => '𐃉', 12417 => '𐃊', 12418 => '𐃋', 12419 => '𐃌', 12420 => '𐃍', 12421 => '𐃎', 12422 => '𐃏', 12423 => '𐃐', 12424 => '𐃑', 12425 => '𐃒', 12426 => '𐃓', 12427 => '𐃔', 12428 => '𐃕', 12429 => '𐃖', 12430 => '𐃗', 12431 => '𐃘', 12432 => '𐃙', 12433 => '𐃚', 12434 => '𐃛', 12435 => '𐃜', 12436 => '𐃝', 12437 => '𐃞', 12438 => '𐃟', 12439 => '𐃠', 12440 => '𐃡', 12441 => '𐃢', 12442 => '𐃣', 12443 => '𐃤', 12444 => '𐃥', 12445 => '𐃦', 12446 => '𐃧', 12447 => '𐃨', 12448 => '𐃩', 12449 => '𐃪', 12450 => '𐃫', 12451 => '𐃬', 12452 => '𐃭', 12453 => '𐃮', 12454 => '𐃯', 12455 => '𐃰', 12456 => '𐃱', 12457 => '𐃲', 12458 => '𐃳', 12459 => '𐃴', 12460 => '𐃵', 12461 => '𐃶', 12462 => '𐃷', 12463 => '𐃸', 12464 => '𐃹', 12465 => '𐃺', 12466 => '𐠀', 12467 => '𐠁', 12468 => '𐠂', 12469 => '𐠃', 12470 => '𐠄', 12471 => '𐠅', 12472 => '𐠈', 12473 => '𐠊', 12474 => '𐠋', 12475 => '𐠌', 12476 => '𐠍', 12477 => '𐠎', 12478 => '𐠏', 12479 => '𐠐', 12480 => '𐠑', 12481 => '𐠒', 12482 => '𐠓', 12483 => '𐠔', 12484 => '𐠕', 12485 => '𐠖', 12486 => '𐠗', 12487 => '𐠘', 12488 => '𐠙', 12489 => '𐠚', 12490 => '𐠛', 12491 => '𐠜', 12492 => '𐠝', 12493 => '𐠞', 12494 => '𐠟', 12495 => '𐠠', 12496 => '𐠡', 12497 => '𐠢', 12498 => '𐠣', 12499 => '𐠤', 12500 => '𐠥', 12501 => '𐠦', 12502 => '𐠧', 12503 => '𐠨', 12504 => '𐠩', 12505 => '𐠪', 12506 => '𐠫', 12507 => '𐠬', 12508 => '𐠭', 12509 => '𐠮', 12510 => '𐠯', 12511 => '𐠰', 12512 => '𐠱', 12513 => '𐠲', 12514 => '𐠳', 12515 => '𐠴', 12516 => '𐠵', 12517 => '𐠷', 12518 => '𐠸', 12519 => '𐠼', 12520 => '𐠿', 12521 => '𐩠', 12522 => '𐩡', 12523 => '𐩢', 12524 => '𐩣', 12525 => '𐩤', 12526 => '𐩥', 12527 => '𐩦', 12528 => '𐩧', 12529 => '𐩨', 12530 => '𐩩', 12531 => '𐩪', 12532 => '𐩫', 12533 => '𐩬', 12534 => '𐩭', 12535 => '𐩮', 12536 => '𐩯', 12537 => '𐩰', 12538 => '𐩱', 12539 => '𐩲', 12540 => '𐩳', 12541 => '𐩴', 12542 => '𐩵', 12543 => '𐩶', 12544 => '𐩷', 12545 => '𐩸', 12546 => '𐩹', 12547 => '𐩺', 12548 => '𐩻', 12549 => '𐩼', 12550 => '𐬀', 12551 => '𐬁', 12552 => '𐬂', 12553 => '𐬃', 12554 => '𐬄', 12555 => '𐬅', 12556 => '𐬆', 12557 => '𐬇', 12558 => '𐬈', 12559 => '𐬉', 12560 => '𐬊', 12561 => '𐬋', 12562 => '𐬌', 12563 => '𐬍', 12564 => '𐬎', 12565 => '𐬏', 12566 => '𐬐', 12567 => '𐬑', 12568 => '𐬒', 12569 => '𐬓', 12570 => '𐬔', 12571 => '𐬕', 12572 => '𐬖', 12573 => '𐬗', 12574 => '𐬘', 12575 => '𐬙', 12576 => '𐬚', 12577 => '𐬛', 12578 => '𐬜', 12579 => '𐬝', 12580 => '𐬞', 12581 => '𐬟', 12582 => '𐬠', 12583 => '𐬡', 12584 => '𐬢', 12585 => '𐬣', 12586 => '𐬤', 12587 => '𐬥', 12588 => '𐬦', 12589 => '𐬧', 12590 => '𐬨', 12591 => '𐬩', 12592 => '𐬪', 12593 => '𐬫', 12594 => '𐬬', 12595 => '𐬭', 12596 => '𐬯', 12597 => '𐬰', 12598 => '𐬱', 12599 => '𐬲', 12600 => '𐬳', 12601 => '𐬴', 12602 => '𐬵', 12603 => '𐡀', 12604 => '𐡁', 12605 => '𐡂', 12606 => '𐡃', 12607 => '𐡄', 12608 => '𐡅', 12609 => '𐡆', 12610 => '𐡇', 12611 => '𐡈', 12612 => '𐡉', 12613 => '𐡊', 12614 => '𐡋', 12615 => '𐡌', 12616 => '𐡍', 12617 => '𐡎', 12618 => '𐡏', 12619 => '𐡐', 12620 => '𐡑', 12621 => '𐡒', 12622 => '𐡓', 12623 => '𐡔', 12624 => '𐡕', 12625 => '𐭀', 12626 => '𐭁', 12627 => '𐭂', 12628 => '𐭃', 12629 => '𐭄', 12630 => '𐭅', 12631 => '𐭆', 12632 => '𐭇', 12633 => '𐭈', 12634 => '𐭉', 12635 => '𐭊', 12636 => '𐭋', 12637 => '𐭌', 12638 => '𐭍', 12639 => '𐭎', 12640 => '𐭏', 12641 => '𐭐', 12642 => '𐭑', 12643 => '𐭒', 12644 => '𐭓', 12645 => '𐭔', 12646 => '𐭕', 12647 => '𐭠', 12648 => '𐭡', 12649 => '𐭢', 12650 => '𐭣', 12651 => '𐭤', 12652 => '𐭥', 12653 => '𐭦', 12654 => '𐭧', 12655 => '𐭨', 12656 => '𐭩', 12657 => '𐭪', 12658 => '𐭫', 12659 => '𐭬', 12660 => '𐭭', 12661 => '𐭮', 12662 => '𐭯', 12663 => '𐭰', 12664 => '𐭱', 12665 => '𐭲', 12666 => '𐎀', 12667 => '𐎁', 12668 => '𐎂', 12669 => '𐎃', 12670 => '𐎄', 12671 => '𐎅', 12672 => '𐎆', 12673 => '𐎇', 12674 => '𐎈', 12675 => '𐎉', 12676 => '𐎊', 12677 => '𐎋', 12678 => '𐎌', 12679 => '𐎍', 12680 => '𐎎', 12681 => '𐎏', 12682 => '𐎐', 12683 => '𐎑', 12684 => '𐎒', 12685 => '𐎓', 12686 => '𐎔', 12687 => '𐎕', 12688 => '𐎖', 12689 => '𐎗', 12690 => '𐎘', 12691 => '𐎙', 12692 => '𐎚', 12693 => '𐎛', 12694 => '𐎜', 12695 => '𐎝', 12696 => '𐎠', 12697 => '𐎡', 12698 => '𐎢', 12699 => '𐎣', 12700 => '𐎤', 12701 => '𐎥', 12702 => '𐎦', 12703 => '𐎧', 12704 => '𐎨', 12705 => '𐎩', 12706 => '𐎪', 12707 => '𐎫', 12708 => '𐎬', 12709 => '𐎭', 12710 => '𐎮', 12711 => '𐎯', 12712 => '𐎰', 12713 => '𐎱', 12714 => '𐎲', 12715 => '𐎳', 12716 => '𐎴', 12717 => '𐎵', 12718 => '𐎶', 12719 => '𐎷', 12720 => '𐎸', 12721 => '𐎹', 12722 => '𐎺', 12723 => '𐎻', 12724 => '𐎼', 12725 => '𐎽', 12726 => '𐎾', 12727 => '𐎿', 12728 => '𐏀', 12729 => '𐏁', 12730 => '𐏂', 12731 => '𐏃', 12732 => '𐏈', 12733 => '𐏉', 12734 => '𐏊', 12735 => '𐏋', 12736 => '𐏌', 12737 => '𐏍', 12738 => '𐏎', 12739 => '𐏏', 12740 => '𒀀', 12741 => '𒀁', 12742 => '𒀂', 12743 => '𒀃', 12744 => '𒀄', 12745 => '𒀅', 12746 => '𒀆', 12747 => '𒀇', 12748 => '𒀈', 12749 => '𒀉', 12750 => '𒀊', 12751 => '𒀋', 12752 => '𒀌', 12753 => '𒀍', 12754 => '𒀎', 12755 => '𒀏', 12756 => '𒀐', 12757 => '𒀑', 12758 => '𒀒', 12759 => '𒀓', 12760 => '𒀔', 12761 => '𒀕', 12762 => '𒀖', 12763 => '𒀗', 12764 => '𒀘', 12765 => '𒀙', 12766 => '𒀚', 12767 => '𒀛', 12768 => '𒀜', 12769 => '𒀝', 12770 => '𒀞', 12771 => '𒀟', 12772 => '𒀠', 12773 => '𒀡', 12774 => '𒀢', 12775 => '𒀣', 12776 => '𒀤', 12777 => '𒀥', 12778 => '𒀦', 12779 => '𒀧', 12780 => '𒀨', 12781 => '𒀩', 12782 => '𒀪', 12783 => '𒀫', 12784 => '𒀬', 12785 => '𒀭', 12786 => '𒀮', 12787 => '𒀯', 12788 => '𒀰', 12789 => '𒀱', 12790 => '𒀲', 12791 => '𒀳', 12792 => '𒀴', 12793 => '𒀵', 12794 => '𒀶', 12795 => '𒀷', 12796 => '𒀸', 12797 => '𒀹', 12798 => '𒀺', 12799 => '𒀻', 12800 => '𒀼', 12801 => '𒀽', 12802 => '𒀾', 12803 => '𒀿', 12804 => '𒁀', 12805 => '𒁁', 12806 => '𒁂', 12807 => '𒁃', 12808 => '𒁄', 12809 => '𒁅', 12810 => '𒁆', 12811 => '𒁇', 12812 => '𒁈', 12813 => '𒁉', 12814 => '𒁊', 12815 => '𒁋', 12816 => '𒁌', 12817 => '𒁍', 12818 => '𒁎', 12819 => '𒁏', 12820 => '𒁐', 12821 => '𒁑', 12822 => '𒁒', 12823 => '𒁓', 12824 => '𒁔', 12825 => '𒁕', 12826 => '𒁖', 12827 => '𒁗', 12828 => '𒁘', 12829 => '𒁙', 12830 => '𒁚', 12831 => '𒁛', 12832 => '𒁜', 12833 => '𒁝', 12834 => '𒁞', 12835 => '𒁟', 12836 => '𒁠', 12837 => '𒁡', 12838 => '𒁢', 12839 => '𒁣', 12840 => '𒁤', 12841 => '𒁥', 12842 => '𒁦', 12843 => '𒁧', 12844 => '𒁨', 12845 => '𒁩', 12846 => '𒁪', 12847 => '𒁫', 12848 => '𒁬', 12849 => '𒁭', 12850 => '𒁮', 12851 => '𒁯', 12852 => '𒁰', 12853 => '𒁱', 12854 => '𒁲', 12855 => '𒁳', 12856 => '𒁴', 12857 => '𒁵', 12858 => '𒁶', 12859 => '𒁷', 12860 => '𒁸', 12861 => '𒁹', 12862 => '𒁺', 12863 => '𒁻', 12864 => '𒁼', 12865 => '𒁽', 12866 => '𒁾', 12867 => '𒁿', 12868 => '𒂀', 12869 => '𒂁', 12870 => '𒂂', 12871 => '𒂃', 12872 => '𒂄', 12873 => '𒂅', 12874 => '𒂆', 12875 => '𒂇', 12876 => '𒂈', 12877 => '𒂉', 12878 => '𒂊', 12879 => '𒂋', 12880 => '𒂌', 12881 => '𒂍', 12882 => '𒂎', 12883 => '𒂏', 12884 => '𒂐', 12885 => '𒂑', 12886 => '𒂒', 12887 => '𒂓', 12888 => '𒂔', 12889 => '𒂕', 12890 => '𒂖', 12891 => '𒂗', 12892 => '𒂘', 12893 => '𒂙', 12894 => '𒂚', 12895 => '𒂛', 12896 => '𒂜', 12897 => '𒂝', 12898 => '𒂞', 12899 => '𒂟', 12900 => '𒂠', 12901 => '𒂡', 12902 => '𒂢', 12903 => '𒂣', 12904 => '𒂤', 12905 => '𒂥', 12906 => '𒂦', 12907 => '𒂧', 12908 => '𒂨', 12909 => '𒂩', 12910 => '𒂪', 12911 => '𒂫', 12912 => '𒂬', 12913 => '𒂭', 12914 => '𒂮', 12915 => '𒂯', 12916 => '𒂰', 12917 => '𒂱', 12918 => '𒂲', 12919 => '𒂳', 12920 => '𒂴', 12921 => '𒂵', 12922 => '𒂶', 12923 => '𒂷', 12924 => '𒂸', 12925 => '𒂹', 12926 => '𒂺', 12927 => '𒂻', 12928 => '𒂼', 12929 => '𒂽', 12930 => '𒂾', 12931 => '𒂿', 12932 => '𒃀', 12933 => '𒃁', 12934 => '𒃂', 12935 => '𒃃', 12936 => '𒃄', 12937 => '𒃅', 12938 => '𒃆', 12939 => '𒃇', 12940 => '𒃈', 12941 => '𒃉', 12942 => '𒃊', 12943 => '𒃋', 12944 => '𒃌', 12945 => '𒃍', 12946 => '𒃎', 12947 => '𒃏', 12948 => '𒃐', 12949 => '𒃑', 12950 => '𒃒', 12951 => '𒃓', 12952 => '𒃔', 12953 => '𒃕', 12954 => '𒃖', 12955 => '𒃗', 12956 => '𒃘', 12957 => '𒃙', 12958 => '𒃚', 12959 => '𒃛', 12960 => '𒃜', 12961 => '𒃝', 12962 => '𒃞', 12963 => '𒃟', 12964 => '𒃠', 12965 => '𒃡', 12966 => '𒃢', 12967 => '𒃣', 12968 => '𒃤', 12969 => '𒃥', 12970 => '𒃦', 12971 => '𒃧', 12972 => '𒃨', 12973 => '𒃩', 12974 => '𒃪', 12975 => '𒃫', 12976 => '𒃬', 12977 => '𒃭', 12978 => '𒃮', 12979 => '𒃯', 12980 => '𒃰', 12981 => '𒃱', 12982 => '𒃲', 12983 => '𒃳', 12984 => '𒃴', 12985 => '𒃵', 12986 => '𒃶', 12987 => '𒃷', 12988 => '𒃸', 12989 => '𒃹', 12990 => '𒃺', 12991 => '𒃻', 12992 => '𒃼', 12993 => '𒃽', 12994 => '𒃾', 12995 => '𒃿', 12996 => '𒄀', 12997 => '𒄁', 12998 => '𒄂', 12999 => '𒄃', 13000 => '𒄄', 13001 => '𒄅', 13002 => '𒄆', 13003 => '𒄇', 13004 => '𒄈', 13005 => '𒄉', 13006 => '𒄊', 13007 => '𒄋', 13008 => '𒄌', 13009 => '𒄍', 13010 => '𒄎', 13011 => '𒄏', 13012 => '𒄐', 13013 => '𒄑', 13014 => '𒄒', 13015 => '𒄓', 13016 => '𒄔', 13017 => '𒄕', 13018 => '𒄖', 13019 => '𒄗', 13020 => '𒄘', 13021 => '𒄙', 13022 => '𒄚', 13023 => '𒄛', 13024 => '𒄜', 13025 => '𒄝', 13026 => '𒄞', 13027 => '𒄟', 13028 => '𒄠', 13029 => '𒄡', 13030 => '𒄢', 13031 => '𒄣', 13032 => '𒄤', 13033 => '𒄥', 13034 => '𒄦', 13035 => '𒄧', 13036 => '𒄨', 13037 => '𒄩', 13038 => '𒄪', 13039 => '𒄫', 13040 => '𒄬', 13041 => '𒄭', 13042 => '𒄮', 13043 => '𒄯', 13044 => '𒄰', 13045 => '𒄱', 13046 => '𒄲', 13047 => '𒄳', 13048 => '𒄴', 13049 => '𒄵', 13050 => '𒄶', 13051 => '𒄷', 13052 => '𒄸', 13053 => '𒄹', 13054 => '𒄺', 13055 => '𒄻', 13056 => '𒄼', 13057 => '𒄽', 13058 => '𒄾', 13059 => '𒄿', 13060 => '𒅀', 13061 => '𒅁', 13062 => '𒅂', 13063 => '𒅃', 13064 => '𒅄', 13065 => '𒅅', 13066 => '𒅆', 13067 => '𒅇', 13068 => '𒅈', 13069 => '𒅉', 13070 => '𒅊', 13071 => '𒅋', 13072 => '𒅌', 13073 => '𒅍', 13074 => '𒅎', 13075 => '𒅏', 13076 => '𒅐', 13077 => '𒅑', 13078 => '𒅒', 13079 => '𒅓', 13080 => '𒅔', 13081 => '𒅕', 13082 => '𒅖', 13083 => '𒅗', 13084 => '𒅘', 13085 => '𒅙', 13086 => '𒅚', 13087 => '𒅛', 13088 => '𒅜', 13089 => '𒅝', 13090 => '𒅞', 13091 => '𒅟', 13092 => '𒅠', 13093 => '𒅡', 13094 => '𒅢', 13095 => '𒅣', 13096 => '𒅤', 13097 => '𒅥', 13098 => '𒅦', 13099 => '𒅧', 13100 => '𒅨', 13101 => '𒅩', 13102 => '𒅪', 13103 => '𒅫', 13104 => '𒅬', 13105 => '𒅭', 13106 => '𒅮', 13107 => '𒅯', 13108 => '𒅰', 13109 => '𒅱', 13110 => '𒅲', 13111 => '𒅳', 13112 => '𒅴', 13113 => '𒅵', 13114 => '𒅶', 13115 => '𒅷', 13116 => '𒅸', 13117 => '𒅹', 13118 => '𒅺', 13119 => '𒅻', 13120 => '𒅼', 13121 => '𒅽', 13122 => '𒅾', 13123 => '𒅿', 13124 => '𒆀', 13125 => '𒆁', 13126 => '𒆂', 13127 => '𒆃', 13128 => '𒆄', 13129 => '𒆅', 13130 => '𒆆', 13131 => '𒆇', 13132 => '𒆈', 13133 => '𒆉', 13134 => '𒆊', 13135 => '𒆋', 13136 => '𒆌', 13137 => '𒆍', 13138 => '𒆎', 13139 => '𒆏', 13140 => '𒆐', 13141 => '𒆑', 13142 => '𒆒', 13143 => '𒆓', 13144 => '𒆔', 13145 => '𒆕', 13146 => '𒆖', 13147 => '𒆗', 13148 => '𒆘', 13149 => '𒆙', 13150 => '𒆚', 13151 => '𒆛', 13152 => '𒆜', 13153 => '𒆝', 13154 => '𒆞', 13155 => '𒆟', 13156 => '𒆠', 13157 => '𒆡', 13158 => '𒆢', 13159 => '𒆣', 13160 => '𒆤', 13161 => '𒆥', 13162 => '𒆦', 13163 => '𒆧', 13164 => '𒆨', 13165 => '𒆩', 13166 => '𒆪', 13167 => '𒆫', 13168 => '𒆬', 13169 => '𒆭', 13170 => '𒆮', 13171 => '𒆯', 13172 => '𒆰', 13173 => '𒆱', 13174 => '𒆲', 13175 => '𒆳', 13176 => '𒆴', 13177 => '𒆵', 13178 => '𒆶', 13179 => '𒆷', 13180 => '𒆸', 13181 => '𒆹', 13182 => '𒆺', 13183 => '𒆻', 13184 => '𒆼', 13185 => '𒆽', 13186 => '𒆾', 13187 => '𒆿', 13188 => '𒇀', 13189 => '𒇁', 13190 => '𒇂', 13191 => '𒇃', 13192 => '𒇄', 13193 => '𒇅', 13194 => '𒇆', 13195 => '𒇇', 13196 => '𒇈', 13197 => '𒇉', 13198 => '𒇊', 13199 => '𒇋', 13200 => '𒇌', 13201 => '𒇍', 13202 => '𒇎', 13203 => '𒇏', 13204 => '𒇐', 13205 => '𒇑', 13206 => '𒇒', 13207 => '𒇓', 13208 => '𒇔', 13209 => '𒇕', 13210 => '𒇖', 13211 => '𒇗', 13212 => '𒇘', 13213 => '𒇙', 13214 => '𒇚', 13215 => '𒇛', 13216 => '𒇜', 13217 => '𒇝', 13218 => '𒇞', 13219 => '𒇟', 13220 => '𒇠', 13221 => '𒇡', 13222 => '𒇢', 13223 => '𒇣', 13224 => '𒇤', 13225 => '𒇥', 13226 => '𒇦', 13227 => '𒇧', 13228 => '𒇨', 13229 => '𒇩', 13230 => '𒇪', 13231 => '𒇫', 13232 => '𒇬', 13233 => '𒇭', 13234 => '𒇮', 13235 => '𒇯', 13236 => '𒇰', 13237 => '𒇱', 13238 => '𒇲', 13239 => '𒇳', 13240 => '𒇴', 13241 => '𒇵', 13242 => '𒇶', 13243 => '𒇷', 13244 => '𒇸', 13245 => '𒇹', 13246 => '𒇺', 13247 => '𒇻', 13248 => '𒇼', 13249 => '𒇽', 13250 => '𒇾', 13251 => '𒇿', 13252 => '𒈀', 13253 => '𒈁', 13254 => '𒈂', 13255 => '𒈃', 13256 => '𒈄', 13257 => '𒈅', 13258 => '𒈆', 13259 => '𒈇', 13260 => '𒈈', 13261 => '𒈉', 13262 => '𒈊', 13263 => '𒈋', 13264 => '𒈌', 13265 => '𒈍', 13266 => '𒈎', 13267 => '𒈏', 13268 => '𒈐', 13269 => '𒈑', 13270 => '𒈒', 13271 => '𒈓', 13272 => '𒈔', 13273 => '𒈕', 13274 => '𒈖', 13275 => '𒈗', 13276 => '𒈘', 13277 => '𒈙', 13278 => '𒈚', 13279 => '𒈛', 13280 => '𒈜', 13281 => '𒈝', 13282 => '𒈞', 13283 => '𒈟', 13284 => '𒈠', 13285 => '𒈡', 13286 => '𒈢', 13287 => '𒈣', 13288 => '𒈤', 13289 => '𒈥', 13290 => '𒈦', 13291 => '𒈧', 13292 => '𒈨', 13293 => '𒈩', 13294 => '𒈪', 13295 => '𒈫', 13296 => '𒈬', 13297 => '𒈭', 13298 => '𒈮', 13299 => '𒈯', 13300 => '𒈰', 13301 => '𒈱', 13302 => '𒈲', 13303 => '𒈳', 13304 => '𒈴', 13305 => '𒈵', 13306 => '𒈶', 13307 => '𒈷', 13308 => '𒈸', 13309 => '𒈹', 13310 => '𒈺', 13311 => '𒈻', 13312 => '𒈼', 13313 => '𒈽', 13314 => '𒈾', 13315 => '𒈿', 13316 => '𒉀', 13317 => '𒉁', 13318 => '𒉂', 13319 => '𒉃', 13320 => '𒉄', 13321 => '𒉅', 13322 => '𒉆', 13323 => '𒉇', 13324 => '𒉈', 13325 => '𒉉', 13326 => '𒉊', 13327 => '𒉋', 13328 => '𒉌', 13329 => '𒉍', 13330 => '𒉎', 13331 => '𒉏', 13332 => '𒉐', 13333 => '𒉑', 13334 => '𒉒', 13335 => '𒉓', 13336 => '𒉔', 13337 => '𒉕', 13338 => '𒉖', 13339 => '𒉗', 13340 => '𒉘', 13341 => '𒉙', 13342 => '𒉚', 13343 => '𒉛', 13344 => '𒉜', 13345 => '𒉝', 13346 => '𒉞', 13347 => '𒉟', 13348 => '𒉠', 13349 => '𒉡', 13350 => '𒉢', 13351 => '𒉣', 13352 => '𒉤', 13353 => '𒉥', 13354 => '𒉦', 13355 => '𒉧', 13356 => '𒉨', 13357 => '𒉩', 13358 => '𒉪', 13359 => '𒉫', 13360 => '𒉬', 13361 => '𒉭', 13362 => '𒉮', 13363 => '𒉯', 13364 => '𒉰', 13365 => '𒉱', 13366 => '𒉲', 13367 => '𒉳', 13368 => '𒉴', 13369 => '𒉵', 13370 => '𒉶', 13371 => '𒉷', 13372 => '𒉸', 13373 => '𒉹', 13374 => '𒉺', 13375 => '𒉻', 13376 => '𒉼', 13377 => '𒉽', 13378 => '𒉾', 13379 => '𒉿', 13380 => '𒊀', 13381 => '𒊁', 13382 => '𒊂', 13383 => '𒊃', 13384 => '𒊄', 13385 => '𒊅', 13386 => '𒊆', 13387 => '𒊇', 13388 => '𒊈', 13389 => '𒊉', 13390 => '𒊊', 13391 => '𒊋', 13392 => '𒊌', 13393 => '𒊍', 13394 => '𒊎', 13395 => '𒊏', 13396 => '𒊐', 13397 => '𒊑', 13398 => '𒊒', 13399 => '𒊓', 13400 => '𒊔', 13401 => '𒊕', 13402 => '𒊖', 13403 => '𒊗', 13404 => '𒊘', 13405 => '𒊙', 13406 => '𒊚', 13407 => '𒊛', 13408 => '𒊜', 13409 => '𒊝', 13410 => '𒊞', 13411 => '𒊟', 13412 => '𒊠', 13413 => '𒊡', 13414 => '𒊢', 13415 => '𒊣', 13416 => '𒊤', 13417 => '𒊥', 13418 => '𒊦', 13419 => '𒊧', 13420 => '𒊨', 13421 => '𒊩', 13422 => '𒊪', 13423 => '𒊫', 13424 => '𒊬', 13425 => '𒊭', 13426 => '𒊮', 13427 => '𒊯', 13428 => '𒊰', 13429 => '𒊱', 13430 => '𒊲', 13431 => '𒊳', 13432 => '𒊴', 13433 => '𒊵', 13434 => '𒊶', 13435 => '𒊷', 13436 => '𒊸', 13437 => '𒊹', 13438 => '𒊺', 13439 => '𒊻', 13440 => '𒊼', 13441 => '𒊽', 13442 => '𒊾', 13443 => '𒊿', 13444 => '𒋀', 13445 => '𒋁', 13446 => '𒋂', 13447 => '𒋃', 13448 => '𒋄', 13449 => '𒋅', 13450 => '𒋆', 13451 => '𒋇', 13452 => '𒋈', 13453 => '𒋉', 13454 => '𒋊', 13455 => '𒋋', 13456 => '𒋌', 13457 => '𒋍', 13458 => '𒋎', 13459 => '𒋏', 13460 => '𒋐', 13461 => '𒋑', 13462 => '𒋒', 13463 => '𒋓', 13464 => '𒋔', 13465 => '𒋕', 13466 => '𒋖', 13467 => '𒋗', 13468 => '𒋘', 13469 => '𒋙', 13470 => '𒋚', 13471 => '𒋛', 13472 => '𒋜', 13473 => '𒋝', 13474 => '𒋞', 13475 => '𒋟', 13476 => '𒋠', 13477 => '𒋡', 13478 => '𒋢', 13479 => '𒋣', 13480 => '𒋤', 13481 => '𒋥', 13482 => '𒋦', 13483 => '𒋧', 13484 => '𒋨', 13485 => '𒋩', 13486 => '𒋪', 13487 => '𒋫', 13488 => '𒋬', 13489 => '𒋭', 13490 => '𒋮', 13491 => '𒋯', 13492 => '𒋰', 13493 => '𒋱', 13494 => '𒋲', 13495 => '𒋳', 13496 => '𒋴', 13497 => '𒋵', 13498 => '𒋶', 13499 => '𒋷', 13500 => '𒋸', 13501 => '𒋹', 13502 => '𒋺', 13503 => '𒋻', 13504 => '𒋼', 13505 => '𒋽', 13506 => '𒋾', 13507 => '𒋿', 13508 => '𒌀', 13509 => '𒌁', 13510 => '𒌂', 13511 => '𒌃', 13512 => '𒌄', 13513 => '𒌅', 13514 => '𒌆', 13515 => '𒌇', 13516 => '𒌈', 13517 => '𒌉', 13518 => '𒌊', 13519 => '𒌋', 13520 => '𒌌', 13521 => '𒌍', 13522 => '𒌎', 13523 => '𒌏', 13524 => '𒌐', 13525 => '𒌑', 13526 => '𒌒', 13527 => '𒌓', 13528 => '𒌔', 13529 => '𒌕', 13530 => '𒌖', 13531 => '𒌗', 13532 => '𒌘', 13533 => '𒌙', 13534 => '𒌚', 13535 => '𒌛', 13536 => '𒌜', 13537 => '𒌝', 13538 => '𒌞', 13539 => '𒌟', 13540 => '𒌠', 13541 => '𒌡', 13542 => '𒌢', 13543 => '𒌣', 13544 => '𒌤', 13545 => '𒌥', 13546 => '𒌦', 13547 => '𒌧', 13548 => '𒌨', 13549 => '𒌩', 13550 => '𒌪', 13551 => '𒌫', 13552 => '𒌬', 13553 => '𒌭', 13554 => '𒌮', 13555 => '𒌯', 13556 => '𒌰', 13557 => '𒌱', 13558 => '𒌲', 13559 => '𒌳', 13560 => '𒌴', 13561 => '𒌵', 13562 => '𒌶', 13563 => '𒌷', 13564 => '𒌸', 13565 => '𒌹', 13566 => '𒌺', 13567 => '𒌻', 13568 => '𒌼', 13569 => '𒌽', 13570 => '𒌾', 13571 => '𒌿', 13572 => '𒍀', 13573 => '𒍁', 13574 => '𒍂', 13575 => '𒍃', 13576 => '𒍄', 13577 => '𒍅', 13578 => '𒍆', 13579 => '𒍇', 13580 => '𒍈', 13581 => '𒍉', 13582 => '𒍊', 13583 => '𒍋', 13584 => '𒍌', 13585 => '𒍍', 13586 => '𒍎', 13587 => '𒍏', 13588 => '𒍐', 13589 => '𒍑', 13590 => '𒍒', 13591 => '𒍓', 13592 => '𒍔', 13593 => '𒍕', 13594 => '𒍖', 13595 => '𒍗', 13596 => '𒍘', 13597 => '𒍙', 13598 => '𒍚', 13599 => '𒍛', 13600 => '𒍜', 13601 => '𒍝', 13602 => '𒍞', 13603 => '𒍟', 13604 => '𒍠', 13605 => '𒍡', 13606 => '𒍢', 13607 => '𒍣', 13608 => '𒍤', 13609 => '𒍥', 13610 => '𒍦', 13611 => '𒍧', 13612 => '𒍨', 13613 => '𒍩', 13614 => '𒍪', 13615 => '𒍫', 13616 => '𒍬', 13617 => '𒍭', 13618 => '𒍮', 13619 => '𓀀', 13620 => '𓀁', 13621 => '𓀂', 13622 => '𓀃', 13623 => '𓀄', 13624 => '𓀅', 13625 => '𓀆', 13626 => '𓀇', 13627 => '𓀈', 13628 => '𓀉', 13629 => '𓀊', 13630 => '𓀋', 13631 => '𓀌', 13632 => '𓀍', 13633 => '𓀎', 13634 => '𓀏', 13635 => '𓀐', 13636 => '𓀑', 13637 => '𓀒', 13638 => '𓀓', 13639 => '𓀔', 13640 => '𓀕', 13641 => '𓀖', 13642 => '𓀗', 13643 => '𓀘', 13644 => '𓀙', 13645 => '𓀚', 13646 => '𓀛', 13647 => '𓀜', 13648 => '𓀝', 13649 => '𓀞', 13650 => '𓀟', 13651 => '𓀠', 13652 => '𓀡', 13653 => '𓀢', 13654 => '𓀣', 13655 => '𓀤', 13656 => '𓀥', 13657 => '𓀦', 13658 => '𓀧', 13659 => '𓀨', 13660 => '𓀩', 13661 => '𓀪', 13662 => '𓀫', 13663 => '𓀬', 13664 => '𓀭', 13665 => '𓀮', 13666 => '𓀯', 13667 => '𓀰', 13668 => '𓀱', 13669 => '𓀲', 13670 => '𓀳', 13671 => '𓀴', 13672 => '𓀵', 13673 => '𓀶', 13674 => '𓀷', 13675 => '𓀸', 13676 => '𓀹', 13677 => '𓀺', 13678 => '𓀻', 13679 => '𓀼', 13680 => '𓀽', 13681 => '𓀾', 13682 => '𓀿', 13683 => '𓁀', 13684 => '𓁁', 13685 => '𓁂', 13686 => '𓁃', 13687 => '𓁄', 13688 => '𓁅', 13689 => '𓁆', 13690 => '𓁇', 13691 => '𓁈', 13692 => '𓁉', 13693 => '𓁊', 13694 => '𓁋', 13695 => '𓁌', 13696 => '𓁍', 13697 => '𓁎', 13698 => '𓁏', 13699 => '𓁐', 13700 => '𓁑', 13701 => '𓁒', 13702 => '𓁓', 13703 => '𓁔', 13704 => '𓁕', 13705 => '𓁖', 13706 => '𓁗', 13707 => '𓁘', 13708 => '𓁙', 13709 => '𓁚', 13710 => '𓁛', 13711 => '𓁜', 13712 => '𓁝', 13713 => '𓁞', 13714 => '𓁟', 13715 => '𓁠', 13716 => '𓁡', 13717 => '𓁢', 13718 => '𓁣', 13719 => '𓁤', 13720 => '𓁥', 13721 => '𓁦', 13722 => '𓁧', 13723 => '𓁨', 13724 => '𓁩', 13725 => '𓁪', 13726 => '𓁫', 13727 => '𓁬', 13728 => '𓁭', 13729 => '𓁮', 13730 => '𓁯', 13731 => '𓁰', 13732 => '𓁱', 13733 => '𓁲', 13734 => '𓁳', 13735 => '𓁴', 13736 => '𓁵', 13737 => '𓁶', 13738 => '𓁷', 13739 => '𓁸', 13740 => '𓁹', 13741 => '𓁺', 13742 => '𓁻', 13743 => '𓁼', 13744 => '𓁽', 13745 => '𓁾', 13746 => '𓁿', 13747 => '𓂀', 13748 => '𓂁', 13749 => '𓂂', 13750 => '𓂃', 13751 => '𓂄', 13752 => '𓂅', 13753 => '𓂆', 13754 => '𓂇', 13755 => '𓂈', 13756 => '𓂉', 13757 => '𓂊', 13758 => '𓂋', 13759 => '𓂌', 13760 => '𓂍', 13761 => '𓂎', 13762 => '𓂏', 13763 => '𓂐', 13764 => '𓂑', 13765 => '𓂒', 13766 => '𓂓', 13767 => '𓂔', 13768 => '𓂕', 13769 => '𓂖', 13770 => '𓂗', 13771 => '𓂘', 13772 => '𓂙', 13773 => '𓂚', 13774 => '𓂛', 13775 => '𓂜', 13776 => '𓂝', 13777 => '𓂞', 13778 => '𓂟', 13779 => '𓂠', 13780 => '𓂡', 13781 => '𓂢', 13782 => '𓂣', 13783 => '𓂤', 13784 => '𓂥', 13785 => '𓂦', 13786 => '𓂧', 13787 => '𓂨', 13788 => '𓂩', 13789 => '𓂪', 13790 => '𓂫', 13791 => '𓂬', 13792 => '𓂭', 13793 => '𓂮', 13794 => '𓂯', 13795 => '𓂰', 13796 => '𓂱', 13797 => '𓂲', 13798 => '𓂳', 13799 => '𓂴', 13800 => '𓂵', 13801 => '𓂶', 13802 => '𓂷', 13803 => '𓂸', 13804 => '𓂹', 13805 => '𓂺', 13806 => '𓂻', 13807 => '𓂼', 13808 => '𓂽', 13809 => '𓂾', 13810 => '𓂿', 13811 => '𓃀', 13812 => '𓃁', 13813 => '𓃂', 13814 => '𓃃', 13815 => '𓃄', 13816 => '𓃅', 13817 => '𓃆', 13818 => '𓃇', 13819 => '𓃈', 13820 => '𓃉', 13821 => '𓃊', 13822 => '𓃋', 13823 => '𓃌', 13824 => '𓃍', 13825 => '𓃎', 13826 => '𓃏', 13827 => '𓃐', 13828 => '𓃑', 13829 => '𓃒', 13830 => '𓃓', 13831 => '𓃔', 13832 => '𓃕', 13833 => '𓃖', 13834 => '𓃗', 13835 => '𓃘', 13836 => '𓃙', 13837 => '𓃚', 13838 => '𓃛', 13839 => '𓃜', 13840 => '𓃝', 13841 => '𓃞', 13842 => '𓃟', 13843 => '𓃠', 13844 => '𓃡', 13845 => '𓃢', 13846 => '𓃣', 13847 => '𓃤', 13848 => '𓃥', 13849 => '𓃦', 13850 => '𓃧', 13851 => '𓃨', 13852 => '𓃩', 13853 => '𓃪', 13854 => '𓃫', 13855 => '𓃬', 13856 => '𓃭', 13857 => '𓃮', 13858 => '𓃯', 13859 => '𓃰', 13860 => '𓃱', 13861 => '𓃲', 13862 => '𓃳', 13863 => '𓃴', 13864 => '𓃵', 13865 => '𓃶', 13866 => '𓃷', 13867 => '𓃸', 13868 => '𓃹', 13869 => '𓃺', 13870 => '𓃻', 13871 => '𓃼', 13872 => '𓃽', 13873 => '𓃾', 13874 => '𓃿', 13875 => '𓄀', 13876 => '𓄁', 13877 => '𓄂', 13878 => '𓄃', 13879 => '𓄄', 13880 => '𓄅', 13881 => '𓄆', 13882 => '𓄇', 13883 => '𓄈', 13884 => '𓄉', 13885 => '𓄊', 13886 => '𓄋', 13887 => '𓄌', 13888 => '𓄍', 13889 => '𓄎', 13890 => '𓄏', 13891 => '𓄐', 13892 => '𓄑', 13893 => '𓄒', 13894 => '𓄓', 13895 => '𓄔', 13896 => '𓄕', 13897 => '𓄖', 13898 => '𓄗', 13899 => '𓄘', 13900 => '𓄙', 13901 => '𓄚', 13902 => '𓄛', 13903 => '𓄜', 13904 => '𓄝', 13905 => '𓄞', 13906 => '𓄟', 13907 => '𓄠', 13908 => '𓄡', 13909 => '𓄢', 13910 => '𓄣', 13911 => '𓄤', 13912 => '𓄥', 13913 => '𓄦', 13914 => '𓄧', 13915 => '𓄨', 13916 => '𓄩', 13917 => '𓄪', 13918 => '𓄫', 13919 => '𓄬', 13920 => '𓄭', 13921 => '𓄮', 13922 => '𓄯', 13923 => '𓄰', 13924 => '𓄱', 13925 => '𓄲', 13926 => '𓄳', 13927 => '𓄴', 13928 => '𓄵', 13929 => '𓄶', 13930 => '𓄷', 13931 => '𓄸', 13932 => '𓄹', 13933 => '𓄺', 13934 => '𓄻', 13935 => '𓄼', 13936 => '𓄽', 13937 => '𓄾', 13938 => '𓄿', 13939 => '𓅀', 13940 => '𓅁', 13941 => '𓅂', 13942 => '𓅃', 13943 => '𓅄', 13944 => '𓅅', 13945 => '𓅆', 13946 => '𓅇', 13947 => '𓅈', 13948 => '𓅉', 13949 => '𓅊', 13950 => '𓅋', 13951 => '𓅌', 13952 => '𓅍', 13953 => '𓅎', 13954 => '𓅏', 13955 => '𓅐', 13956 => '𓅑', 13957 => '𓅒', 13958 => '𓅓', 13959 => '𓅔', 13960 => '𓅕', 13961 => '𓅖', 13962 => '𓅗', 13963 => '𓅘', 13964 => '𓅙', 13965 => '𓅚', 13966 => '𓅛', 13967 => '𓅜', 13968 => '𓅝', 13969 => '𓅞', 13970 => '𓅟', 13971 => '𓅠', 13972 => '𓅡', 13973 => '𓅢', 13974 => '𓅣', 13975 => '𓅤', 13976 => '𓅥', 13977 => '𓅦', 13978 => '𓅧', 13979 => '𓅨', 13980 => '𓅩', 13981 => '𓅪', 13982 => '𓅫', 13983 => '𓅬', 13984 => '𓅭', 13985 => '𓅮', 13986 => '𓅯', 13987 => '𓅰', 13988 => '𓅱', 13989 => '𓅲', 13990 => '𓅳', 13991 => '𓅴', 13992 => '𓅵', 13993 => '𓅶', 13994 => '𓅷', 13995 => '𓅸', 13996 => '𓅹', 13997 => '𓅺', 13998 => '𓅻', 13999 => '𓅼', 14000 => '𓅽', 14001 => '𓅾', 14002 => '𓅿', 14003 => '𓆀', 14004 => '𓆁', 14005 => '𓆂', 14006 => '𓆃', 14007 => '𓆄', 14008 => '𓆅', 14009 => '𓆆', 14010 => '𓆇', 14011 => '𓆈', 14012 => '𓆉', 14013 => '𓆊', 14014 => '𓆋', 14015 => '𓆌', 14016 => '𓆍', 14017 => '𓆎', 14018 => '𓆏', 14019 => '𓆐', 14020 => '𓆑', 14021 => '𓆒', 14022 => '𓆓', 14023 => '𓆔', 14024 => '𓆕', 14025 => '𓆖', 14026 => '𓆗', 14027 => '𓆘', 14028 => '𓆙', 14029 => '𓆚', 14030 => '𓆛', 14031 => '𓆜', 14032 => '𓆝', 14033 => '𓆞', 14034 => '𓆟', 14035 => '𓆠', 14036 => '𓆡', 14037 => '𓆢', 14038 => '𓆣', 14039 => '𓆤', 14040 => '𓆥', 14041 => '𓆦', 14042 => '𓆧', 14043 => '𓆨', 14044 => '𓆩', 14045 => '𓆪', 14046 => '𓆫', 14047 => '𓆬', 14048 => '𓆭', 14049 => '𓆮', 14050 => '𓆯', 14051 => '𓆰', 14052 => '𓆱', 14053 => '𓆲', 14054 => '𓆳', 14055 => '𓆴', 14056 => '𓆵', 14057 => '𓆶', 14058 => '𓆷', 14059 => '𓆸', 14060 => '𓆹', 14061 => '𓆺', 14062 => '𓆻', 14063 => '𓆼', 14064 => '𓆽', 14065 => '𓆾', 14066 => '𓆿', 14067 => '𓇀', 14068 => '𓇁', 14069 => '𓇂', 14070 => '𓇃', 14071 => '𓇄', 14072 => '𓇅', 14073 => '𓇆', 14074 => '𓇇', 14075 => '𓇈', 14076 => '𓇉', 14077 => '𓇊', 14078 => '𓇋', 14079 => '𓇌', 14080 => '𓇍', 14081 => '𓇎', 14082 => '𓇏', 14083 => '𓇐', 14084 => '𓇑', 14085 => '𓇒', 14086 => '𓇓', 14087 => '𓇔', 14088 => '𓇕', 14089 => '𓇖', 14090 => '𓇗', 14091 => '𓇘', 14092 => '𓇙', 14093 => '𓇚', 14094 => '𓇛', 14095 => '𓇜', 14096 => '𓇝', 14097 => '𓇞', 14098 => '𓇟', 14099 => '𓇠', 14100 => '𓇡', 14101 => '𓇢', 14102 => '𓇣', 14103 => '𓇤', 14104 => '𓇥', 14105 => '𓇦', 14106 => '𓇧', 14107 => '𓇨', 14108 => '𓇩', 14109 => '𓇪', 14110 => '𓇫', 14111 => '𓇬', 14112 => '𓇭', 14113 => '𓇮', 14114 => '𓇯', 14115 => '𓇰', 14116 => '𓇱', 14117 => '𓇲', 14118 => '𓇳', 14119 => '𓇴', 14120 => '𓇵', 14121 => '𓇶', 14122 => '𓇷', 14123 => '𓇸', 14124 => '𓇹', 14125 => '𓇺', 14126 => '𓇻', 14127 => '𓇼', 14128 => '𓇽', 14129 => '𓇾', 14130 => '𓇿', 14131 => '𓈀', 14132 => '𓈁', 14133 => '𓈂', 14134 => '𓈃', 14135 => '𓈄', 14136 => '𓈅', 14137 => '𓈆', 14138 => '𓈇', 14139 => '𓈈', 14140 => '𓈉', 14141 => '𓈊', 14142 => '𓈋', 14143 => '𓈌', 14144 => '𓈍', 14145 => '𓈎', 14146 => '𓈏', 14147 => '𓈐', 14148 => '𓈑', 14149 => '𓈒', 14150 => '𓈓', 14151 => '𓈔', 14152 => '𓈕', 14153 => '𓈖', 14154 => '𓈗', 14155 => '𓈘', 14156 => '𓈙', 14157 => '𓈚', 14158 => '𓈛', 14159 => '𓈜', 14160 => '𓈝', 14161 => '𓈞', 14162 => '𓈟', 14163 => '𓈠', 14164 => '𓈡', 14165 => '𓈢', 14166 => '𓈣', 14167 => '𓈤', 14168 => '𓈥', 14169 => '𓈦', 14170 => '𓈧', 14171 => '𓈨', 14172 => '𓈩', 14173 => '𓈪', 14174 => '𓈫', 14175 => '𓈬', 14176 => '𓈭', 14177 => '𓈮', 14178 => '𓈯', 14179 => '𓈰', 14180 => '𓈱', 14181 => '𓈲', 14182 => '𓈳', 14183 => '𓈴', 14184 => '𓈵', 14185 => '𓈶', 14186 => '𓈷', 14187 => '𓈸', 14188 => '𓈹', 14189 => '𓈺', 14190 => '𓈻', 14191 => '𓈼', 14192 => '𓈽', 14193 => '𓈾', 14194 => '𓈿', 14195 => '𓉀', 14196 => '𓉁', 14197 => '𓉂', 14198 => '𓉃', 14199 => '𓉄', 14200 => '𓉅', 14201 => '𓉆', 14202 => '𓉇', 14203 => '𓉈', 14204 => '𓉉', 14205 => '𓉊', 14206 => '𓉋', 14207 => '𓉌', 14208 => '𓉍', 14209 => '𓉎', 14210 => '𓉏', 14211 => '𓉐', 14212 => '𓉑', 14213 => '𓉒', 14214 => '𓉓', 14215 => '𓉔', 14216 => '𓉕', 14217 => '𓉖', 14218 => '𓉗', 14219 => '𓉘', 14220 => '𓉙', 14221 => '𓉚', 14222 => '𓉛', 14223 => '𓉜', 14224 => '𓉝', 14225 => '𓉞', 14226 => '𓉟', 14227 => '𓉠', 14228 => '𓉡', 14229 => '𓉢', 14230 => '𓉣', 14231 => '𓉤', 14232 => '𓉥', 14233 => '𓉦', 14234 => '𓉧', 14235 => '𓉨', 14236 => '𓉩', 14237 => '𓉪', 14238 => '𓉫', 14239 => '𓉬', 14240 => '𓉭', 14241 => '𓉮', 14242 => '𓉯', 14243 => '𓉰', 14244 => '𓉱', 14245 => '𓉲', 14246 => '𓉳', 14247 => '𓉴', 14248 => '𓉵', 14249 => '𓉶', 14250 => '𓉷', 14251 => '𓉸', 14252 => '𓉹', 14253 => '𓉺', 14254 => '𓉻', 14255 => '𓉼', 14256 => '𓉽', 14257 => '𓉾', 14258 => '𓉿', 14259 => '𓊀', 14260 => '𓊁', 14261 => '𓊂', 14262 => '𓊃', 14263 => '𓊄', 14264 => '𓊅', 14265 => '𓊆', 14266 => '𓊇', 14267 => '𓊈', 14268 => '𓊉', 14269 => '𓊊', 14270 => '𓊋', 14271 => '𓊌', 14272 => '𓊍', 14273 => '𓊎', 14274 => '𓊏', 14275 => '𓊐', 14276 => '𓊑', 14277 => '𓊒', 14278 => '𓊓', 14279 => '𓊔', 14280 => '𓊕', 14281 => '𓊖', 14282 => '𓊗', 14283 => '𓊘', 14284 => '𓊙', 14285 => '𓊚', 14286 => '𓊛', 14287 => '𓊜', 14288 => '𓊝', 14289 => '𓊞', 14290 => '𓊟', 14291 => '𓊠', 14292 => '𓊡', 14293 => '𓊢', 14294 => '𓊣', 14295 => '𓊤', 14296 => '𓊥', 14297 => '𓊦', 14298 => '𓊧', 14299 => '𓊨', 14300 => '𓊩', 14301 => '𓊪', 14302 => '𓊫', 14303 => '𓊬', 14304 => '𓊭', 14305 => '𓊮', 14306 => '𓊯', 14307 => '𓊰', 14308 => '𓊱', 14309 => '𓊲', 14310 => '𓊳', 14311 => '𓊴', 14312 => '𓊵', 14313 => '𓊶', 14314 => '𓊷', 14315 => '𓊸', 14316 => '𓊹', 14317 => '𓊺', 14318 => '𓊻', 14319 => '𓊼', 14320 => '𓊽', 14321 => '𓊾', 14322 => '𓊿', 14323 => '𓋀', 14324 => '𓋁', 14325 => '𓋂', 14326 => '𓋃', 14327 => '𓋄', 14328 => '𓋅', 14329 => '𓋆', 14330 => '𓋇', 14331 => '𓋈', 14332 => '𓋉', 14333 => '𓋊', 14334 => '𓋋', 14335 => '𓋌', 14336 => '𓋍', 14337 => '𓋎', 14338 => '𓋏', 14339 => '𓋐', 14340 => '𓋑', 14341 => '𓋒', 14342 => '𓋓', 14343 => '𓋔', 14344 => '𓋕', 14345 => '𓋖', 14346 => '𓋗', 14347 => '𓋘', 14348 => '𓋙', 14349 => '𓋚', 14350 => '𓋛', 14351 => '𓋜', 14352 => '𓋝', 14353 => '𓋞', 14354 => '𓋟', 14355 => '𓋠', 14356 => '𓋡', 14357 => '𓋢', 14358 => '𓋣', 14359 => '𓋤', 14360 => '𓋥', 14361 => '𓋦', 14362 => '𓋧', 14363 => '𓋨', 14364 => '𓋩', 14365 => '𓋪', 14366 => '𓋫', 14367 => '𓋬', 14368 => '𓋭', 14369 => '𓋮', 14370 => '𓋯', 14371 => '𓋰', 14372 => '𓋱', 14373 => '𓋲', 14374 => '𓋳', 14375 => '𓋴', 14376 => '𓋵', 14377 => '𓋶', 14378 => '𓋷', 14379 => '𓋸', 14380 => '𓋹', 14381 => '𓋺', 14382 => '𓋻', 14383 => '𓋼', 14384 => '𓋽', 14385 => '𓋾', 14386 => '𓋿', 14387 => '𓌀', 14388 => '𓌁', 14389 => '𓌂', 14390 => '𓌃', 14391 => '𓌄', 14392 => '𓌅', 14393 => '𓌆', 14394 => '𓌇', 14395 => '𓌈', 14396 => '𓌉', 14397 => '𓌊', 14398 => '𓌋', 14399 => '𓌌', 14400 => '𓌍', 14401 => '𓌎', 14402 => '𓌏', 14403 => '𓌐', 14404 => '𓌑', 14405 => '𓌒', 14406 => '𓌓', 14407 => '𓌔', 14408 => '𓌕', 14409 => '𓌖', 14410 => '𓌗', 14411 => '𓌘', 14412 => '𓌙', 14413 => '𓌚', 14414 => '𓌛', 14415 => '𓌜', 14416 => '𓌝', 14417 => '𓌞', 14418 => '𓌟', 14419 => '𓌠', 14420 => '𓌡', 14421 => '𓌢', 14422 => '𓌣', 14423 => '𓌤', 14424 => '𓌥', 14425 => '𓌦', 14426 => '𓌧', 14427 => '𓌨', 14428 => '𓌩', 14429 => '𓌪', 14430 => '𓌫', 14431 => '𓌬', 14432 => '𓌭', 14433 => '𓌮', 14434 => '𓌯', 14435 => '𓌰', 14436 => '𓌱', 14437 => '𓌲', 14438 => '𓌳', 14439 => '𓌴', 14440 => '𓌵', 14441 => '𓌶', 14442 => '𓌷', 14443 => '𓌸', 14444 => '𓌹', 14445 => '𓌺', 14446 => '𓌻', 14447 => '𓌼', 14448 => '𓌽', 14449 => '𓌾', 14450 => '𓌿', 14451 => '𓍀', 14452 => '𓍁', 14453 => '𓍂', 14454 => '𓍃', 14455 => '𓍄', 14456 => '𓍅', 14457 => '𓍆', 14458 => '𓍇', 14459 => '𓍈', 14460 => '𓍉', 14461 => '𓍊', 14462 => '𓍋', 14463 => '𓍌', 14464 => '𓍍', 14465 => '𓍎', 14466 => '𓍏', 14467 => '𓍐', 14468 => '𓍑', 14469 => '𓍒', 14470 => '𓍓', 14471 => '𓍔', 14472 => '𓍕', 14473 => '𓍖', 14474 => '𓍗', 14475 => '𓍘', 14476 => '𓍙', 14477 => '𓍚', 14478 => '𓍛', 14479 => '𓍜', 14480 => '𓍝', 14481 => '𓍞', 14482 => '𓍟', 14483 => '𓍠', 14484 => '𓍡', 14485 => '𓍢', 14486 => '𓍣', 14487 => '𓍤', 14488 => '𓍥', 14489 => '𓍦', 14490 => '𓍧', 14491 => '𓍨', 14492 => '𓍩', 14493 => '𓍪', 14494 => '𓍫', 14495 => '𓍬', 14496 => '𓍭', 14497 => '𓍮', 14498 => '𓍯', 14499 => '𓍰', 14500 => '𓍱', 14501 => '𓍲', 14502 => '𓍳', 14503 => '𓍴', 14504 => '𓍵', 14505 => '𓍶', 14506 => '𓍷', 14507 => '𓍸', 14508 => '𓍹', 14509 => '𓍺', 14510 => '𓍻', 14511 => '𓍼', 14512 => '𓍽', 14513 => '𓍾', 14514 => '𓍿', 14515 => '𓎀', 14516 => '𓎁', 14517 => '𓎂', 14518 => '𓎃', 14519 => '𓎄', 14520 => '𓎅', 14521 => '𓎆', 14522 => '𓎇', 14523 => '𓎈', 14524 => '𓎉', 14525 => '𓎊', 14526 => '𓎋', 14527 => '𓎌', 14528 => '𓎍', 14529 => '𓎎', 14530 => '𓎏', 14531 => '𓎐', 14532 => '𓎑', 14533 => '𓎒', 14534 => '𓎓', 14535 => '𓎔', 14536 => '𓎕', 14537 => '𓎖', 14538 => '𓎗', 14539 => '𓎘', 14540 => '𓎙', 14541 => '𓎚', 14542 => '𓎛', 14543 => '𓎜', 14544 => '𓎝', 14545 => '𓎞', 14546 => '𓎟', 14547 => '𓎠', 14548 => '𓎡', 14549 => '𓎢', 14550 => '𓎣', 14551 => '𓎤', 14552 => '𓎥', 14553 => '𓎦', 14554 => '𓎧', 14555 => '𓎨', 14556 => '𓎩', 14557 => '𓎪', 14558 => '𓎫', 14559 => '𓎬', 14560 => '𓎭', 14561 => '𓎮', 14562 => '𓎯', 14563 => '𓎰', 14564 => '𓎱', 14565 => '𓎲', 14566 => '𓎳', 14567 => '𓎴', 14568 => '𓎵', 14569 => '𓎶', 14570 => '𓎷', 14571 => '𓎸', 14572 => '𓎹', 14573 => '𓎺', 14574 => '𓎻', 14575 => '𓎼', 14576 => '𓎽', 14577 => '𓎾', 14578 => '𓎿', 14579 => '𓏀', 14580 => '𓏁', 14581 => '𓏂', 14582 => '𓏃', 14583 => '𓏄', 14584 => '𓏅', 14585 => '𓏆', 14586 => '𓏇', 14587 => '𓏈', 14588 => '𓏉', 14589 => '𓏊', 14590 => '𓏋', 14591 => '𓏌', 14592 => '𓏍', 14593 => '𓏎', 14594 => '𓏏', 14595 => '𓏐', 14596 => '𓏑', 14597 => '𓏒', 14598 => '𓏓', 14599 => '𓏔', 14600 => '𓏕', 14601 => '𓏖', 14602 => '𓏗', 14603 => '𓏘', 14604 => '𓏙', 14605 => '𓏚', 14606 => '𓏛', 14607 => '𓏜', 14608 => '𓏝', 14609 => '𓏞', 14610 => '𓏟', 14611 => '𓏠', 14612 => '𓏡', 14613 => '𓏢', 14614 => '𓏣', 14615 => '𓏤', 14616 => '𓏥', 14617 => '𓏦', 14618 => '𓏧', 14619 => '𓏨', 14620 => '𓏩', 14621 => '𓏪', 14622 => '𓏫', 14623 => '𓏬', 14624 => '𓏭', 14625 => '𓏮', 14626 => '𓏯', 14627 => '𓏰', 14628 => '𓏱', 14629 => '𓏲', 14630 => '𓏳', 14631 => '𓏴', 14632 => '𓏵', 14633 => '𓏶', 14634 => '𓏷', 14635 => '𓏸', 14636 => '𓏹', 14637 => '𓏺', 14638 => '𓏻', 14639 => '𓏼', 14640 => '𓏽', 14641 => '𓏾', 14642 => '𓏿', 14643 => '𓐀', 14644 => '𓐁', 14645 => '𓐂', 14646 => '𓐃', 14647 => '𓐄', 14648 => '𓐅', 14649 => '𓐆', 14650 => '𓐇', 14651 => '𓐈', 14652 => '𓐉', 14653 => '𓐊', 14654 => '𓐋', 14655 => '𓐌', 14656 => '𓐍', 14657 => '𓐎', 14658 => '𓐏', 14659 => '𓐐', 14660 => '𓐑', 14661 => '𓐒', 14662 => '𓐓', 14663 => '𓐔', 14664 => '𓐕', 14665 => '𓐖', 14666 => '𓐗', 14667 => '𓐘', 14668 => '𓐙', 14669 => '𓐚', 14670 => '𓐛', 14671 => '𓐜', 14672 => '𓐝', 14673 => '𓐞', 14674 => '𓐟', 14675 => '𓐠', 14676 => '𓐡', 14677 => '𓐢', 14678 => '𓐣', 14679 => '𓐤', 14680 => '𓐥', 14681 => '𓐦', 14682 => '𓐧', 14683 => '𓐨', 14684 => '𓐩', 14685 => '𓐪', 14686 => '𓐫', 14687 => '𓐬', 14688 => '𓐭', 14689 => '𓐮', 14690 => '㆒', 14691 => '㆜', 14692 => '㆔', 14693 => '㆖', 14694 => '㆘', 14695 => '㆛', 14696 => '㆗', 14697 => '㆚', 14698 => '㆓', 14699 => '🈘', 14700 => '㆟', 14701 => '🈞', 14702 => '🈠', 14703 => '🈜', 14704 => '🈹', 14705 => '🈒', 14706 => '🉑', 14707 => '🈮', 14708 => '🈴', 14709 => '🈥', 14710 => '🈺', 14711 => '㆕', 14712 => '㆞', 14713 => '🈤', 14714 => '🈕', 14715 => '㆝', 14716 => '🈑', 14717 => '🈬', 14718 => '🈝', 14719 => '🉐', 14720 => '🈐', 14721 => '🈱', 14722 => '🈧', 14723 => '🈯', 14724 => '🈨', 14725 => '🈛', 14726 => '🈟', 14727 => '🈙', 14728 => '🈷', 14729 => '🈶', 14730 => '🈵', 14731 => '🈦', 14732 => '🈚', 14733 => '🈢', 14734 => '㆙', 14735 => '🈸', 14736 => '🈲', 14737 => '🈳', 14738 => '🈡', 14739 => '🈖', 14740 => '🈣', 14741 => '🈰', 14742 => '🈫',]
Base interface for representing page content.
Definition Content.php:39
getSection( $sectionId)
Returns the section with the given ID.
getModel()
Returns the ID of the content model used by this Content object.
Interface for objects which can provide a MediaWiki context on request.
Interface for configuration instances.
Definition Config.php:32
get( $name)
Get a configuration variable such as "Sitename" or "UploadMaintenance.".
Interface for all constraints that can prevent edits.
Serves as a common repository of constants for EditPage edit status results.
Interface for objects (potentially) representing an editable wiki page.
Interface for objects (potentially) representing a page that can be viewable and linked to on a wiki.
Service for resolving a wiki page redirect.
This interface represents the authority associated the current execution context, such as a web reque...
Definition Authority.php:37
Interface for objects representing user identity.
Interface for localizing messages in MediaWiki.
msg( $key,... $params)
This is the method for getting translated interface messages.
const DB_REPLICA
Definition defines.php:26
const DB_PRIMARY
Definition defines.php:28
$content
Definition router.php:76
return true
Definition router.php:92