diff --git a/vendor/autoload.php b/vendor/autoload.php index c6bd4b914d..dd4c555f43 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer' . '/autoload_real.php'; -return ComposerAutoloaderInitf4df0055480c4a6738498545f1ec0cfd::getLoader(); +return ComposerAutoloaderInitbbdc7dea11a66b6e7562e6c0fd58031a::getLoader(); diff --git a/vendor/bin/generate_vcards b/vendor/bin/generate_vcards new file mode 120000 index 0000000000..cb76da13a1 --- /dev/null +++ b/vendor/bin/generate_vcards @@ -0,0 +1 @@ +../sabre/vobject/bin/generate_vcards \ No newline at end of file diff --git a/vendor/bin/vobject b/vendor/bin/vobject new file mode 120000 index 0000000000..f5b111eacd --- /dev/null +++ b/vendor/bin/vobject @@ -0,0 +1 @@ +../sabre/vobject/bin/vobject \ No newline at end of file diff --git a/vendor/chamilo/chash/src/Chash/Command/Installation/CommonCommand.php b/vendor/chamilo/chash/src/Chash/Command/Installation/CommonCommand.php index 0dcb9893c9..f123eacb64 100644 --- a/vendor/chamilo/chash/src/Chash/Command/Installation/CommonCommand.php +++ b/vendor/chamilo/chash/src/Chash/Command/Installation/CommonCommand.php @@ -30,16 +30,16 @@ class CommonCommand extends AbstractCommand private $migrationConfigurationFile; /** - * @param array $configuration - */ + * @param array $configuration + */ public function setConfigurationArray(array $configuration) { $this->configuration = $configuration; } /** - * @return array - */ + * @return array + */ public function getConfigurationArray() { return $this->configuration; @@ -116,8 +116,8 @@ class CommonCommand extends AbstractCommand } /** - * @param array $databaseSettings - */ + * @param array $databaseSettings + */ public function setExtraDatabaseSettings(array $databaseSettings) { $this->extraDatabaseSettings = $databaseSettings; @@ -503,8 +503,8 @@ class CommonCommand extends AbstractCommand 'parent' => '1.9.0' ), '1.9.x' => array( - 'require_update' => false, - 'parent' => '1.9.0' + 'require_update' => false, + 'parent' => '1.9.0' ), '1.10.0' => array( 'require_update' => true, diff --git a/vendor/chamilo/chash/src/Chash/Command/Installation/InstallCommand.php b/vendor/chamilo/chash/src/Chash/Command/Installation/InstallCommand.php index 9cc3766079..73ccc5ed3d 100644 --- a/vendor/chamilo/chash/src/Chash/Command/Installation/InstallCommand.php +++ b/vendor/chamilo/chash/src/Chash/Command/Installation/InstallCommand.php @@ -379,7 +379,6 @@ class InstallCommand extends CommonCommand // Generating config files (auth, profile, etc) $this->generateConfFiles($output); - $this->writeHtaccess($path); $output->writeln("Chamilo was successfully installed here: ".$this->getRootSys()." "); return 1; diff --git a/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/db_main.sql b/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/db_main.sql index 4e0a93d74a..be2bdcf260 100644 --- a/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/db_main.sql +++ b/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/db_main.sql @@ -657,10 +657,12 @@ VALUES ('Institution',NULL,'textfield','Platform','{ORGANISATIONNAME}','InstitutionTitle','InstitutionComment','platform',NULL, 1), ('InstitutionUrl',NULL,'textfield','Platform','{ORGANISATIONURL}','InstitutionUrlTitle','InstitutionUrlComment',NULL,NULL, 1), ('siteName',NULL,'textfield','Platform','{CAMPUSNAME}','SiteNameTitle','SiteNameComment',NULL,NULL, 1), -('emailAdministrator',NULL,'textfield','Platform','{ADMINEMAIL}','emailAdministratorTitle','emailAdministratorComment',NULL,NULL, 1), -('administratorSurname',NULL,'textfield','Platform','{ADMINLASTNAME}','administratorSurnameTitle','administratorSurnameComment',NULL,NULL, 1), -('administratorName',NULL,'textfield','Platform','{ADMINFIRSTNAME}','administratorNameTitle','administratorNameComment',NULL,NULL, 1), -('show_administrator_data',NULL,'radio','Platform','true','ShowAdministratorDataTitle','ShowAdministratorDataComment',NULL,NULL, 1), +('noreply_email_address', '', 'textfield', 'Platform', '', 'NoReplyEmailAddress', 'NoReplyEmailAddressComment', NULL, NULL, 0), +('emailAdministrator',NULL,'textfield','Admin','{ADMINEMAIL}','emailAdministratorTitle','emailAdministratorComment',NULL,NULL, 1), +('administratorSurname',NULL,'textfield','Admin','{ADMINLASTNAME}','administratorSurnameTitle','administratorSurnameComment',NULL,NULL, 1), +('administratorName',NULL,'textfield','Admin','{ADMINFIRSTNAME}','administratorNameTitle','administratorNameComment',NULL,NULL, 1), +('administratorTelephone',NULL,'textfield','Admin','(000) 001 02 03','administratorTelephoneTitle','administratorTelephoneComment',NULL,NULL, 1), +('show_administrator_data',NULL,'radio','Admin','true','ShowAdministratorDataTitle','ShowAdministratorDataComment',NULL,NULL, 1), ('show_tutor_data',NULL,'radio','Session','true','ShowTutorDataTitle','ShowTutorDataComment',NULL,NULL, 1), ('show_teacher_data',NULL,'radio','Platform','true','ShowTeacherDataTitle','ShowTeacherDataComment',NULL,NULL, 1), ('homepage_view',NULL,'radio','Course','activity_big','HomepageViewTitle','HomepageViewComment',NULL,NULL, 1), @@ -679,13 +681,13 @@ VALUES ('profile','password','checkbox','User','true','ProfileChangesTitle','ProfileChangesComment',NULL,'UserPassword', 0), ('profile','language','checkbox','User','true','ProfileChangesTitle','ProfileChangesComment',NULL,'Language', 0), ('default_document_quotum',NULL,'textfield','Course','100000000','DefaultDocumentQuotumTitle','DefaultDocumentQuotumComment',NULL,NULL, 0), -('registration','officialcode','checkbox','User','false','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'OfficialCode', 0), -('registration','email','checkbox','User','true','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'Email', 0), -('registration','language','checkbox','User','true','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'Language', 0), +('registration','officialcode','checkbox','Registration','false','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'OfficialCode', 0), +('registration','email','checkbox','Registration','true','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'Email', 0), +('registration','language','checkbox','Registration','true','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'Language', 0), ('default_group_quotum',NULL,'textfield','Course','5000000','DefaultGroupQuotumTitle','DefaultGroupQuotumComment',NULL,NULL, 0), -('allow_registration',NULL,'radio','Platform','{ALLOWSELFREGISTRATION}','AllowRegistrationTitle','AllowRegistrationComment',NULL,NULL, 0), -('allow_registration_as_teacher',NULL,'radio','Platform','{ALLOWTEACHERSELFREGISTRATION}','AllowRegistrationAsTeacherTitle','AllowRegistrationAsTeacherComment',NULL,NULL, 0), -('allow_lostpassword',NULL,'radio','Platform','true','AllowLostPasswordTitle','AllowLostPasswordComment',NULL,NULL, 0), +('allow_registration',NULL,'radio','Registration','{ALLOWSELFREGISTRATION}','AllowRegistrationTitle','AllowRegistrationComment',NULL,NULL, 0), +('allow_registration_as_teacher',NULL,'radio','Registration','{ALLOWTEACHERSELFREGISTRATION}','AllowRegistrationAsTeacherTitle','AllowRegistrationAsTeacherComment',NULL,NULL, 0), +('allow_lostpassword',NULL,'radio','Registration','true','AllowLostPasswordTitle','AllowLostPasswordComment',NULL,NULL, 0), ('allow_user_headings',NULL,'radio','Course','false','AllowUserHeadings','AllowUserHeadingsComment',NULL,NULL, 0), ('course_create_active_tools','course_description','checkbox','Tools','true','CourseCreateActiveToolsTitle','CourseCreateActiveToolsComment',NULL,'CourseDescription', 0), ('course_create_active_tools','agenda','checkbox','Tools','true','CourseCreateActiveToolsTitle','CourseCreateActiveToolsComment',NULL,'Agenda', 0), @@ -702,8 +704,8 @@ VALUES ('course_create_active_tools','online_conference','checkbox','Tools','true','CourseCreateActiveToolsTitle','CourseCreateActiveToolsComment',NULL,'OnlineConference', 0), ('course_create_active_tools','student_publications','checkbox','Tools','true','CourseCreateActiveToolsTitle','CourseCreateActiveToolsComment',NULL,'StudentPublications', 0), ('allow_personal_agenda',NULL,'radio','User','true','AllowPersonalAgendaTitle','AllowPersonalAgendaComment',NULL,NULL, 0), -('display_coursecode_in_courselist',NULL,'radio','Platform','false','DisplayCourseCodeInCourselistTitle','DisplayCourseCodeInCourselistComment',NULL,NULL, 0), -('display_teacher_in_courselist',NULL,'radio','Platform','true','DisplayTeacherInCourselistTitle','DisplayTeacherInCourselistComment',NULL,NULL, 0), +('display_coursecode_in_courselist',NULL,'radio','Course','false','DisplayCourseCodeInCourselistTitle','DisplayCourseCodeInCourselistComment',NULL,NULL, 0), +('display_teacher_in_courselist',NULL,'radio','Course','true','DisplayTeacherInCourselistTitle','DisplayTeacherInCourselistComment',NULL,NULL, 0), ('permanently_remove_deleted_files',NULL,'radio','Tools','false','PermanentlyRemoveFilesTitle','PermanentlyRemoveFilesComment',NULL,NULL, 0), ('dropbox_allow_overwrite',NULL,'radio','Tools','true','DropboxAllowOverwriteTitle','DropboxAllowOverwriteComment',NULL,NULL, 0), ('dropbox_max_filesize',NULL,'textfield','Tools','100000000','DropboxMaxFilesizeTitle','DropboxMaxFilesizeComment',NULL,NULL, 0), @@ -711,12 +713,11 @@ VALUES ('dropbox_allow_student_to_student',NULL,'radio','Tools','true','DropboxAllowStudentToStudentTitle','DropboxAllowStudentToStudentComment',NULL,NULL, 0), ('dropbox_allow_group',NULL,'radio','Tools','true','DropboxAllowGroupTitle','DropboxAllowGroupComment',NULL,NULL, 0), ('dropbox_allow_mailing',NULL,'radio','Tools','false','DropboxAllowMailingTitle','DropboxAllowMailingComment',NULL,NULL, 0), -('administratorTelephone',NULL,'textfield','Platform','(000) 001 02 03','administratorTelephoneTitle','administratorTelephoneComment',NULL,NULL, 1), ('extended_profile',NULL,'radio','User','false','ExtendedProfileTitle','ExtendedProfileComment',NULL,NULL, 0), -('student_view_enabled',NULL,'radio','Platform','true','StudentViewEnabledTitle','StudentViewEnabledComment',NULL,NULL, 0), +('student_view_enabled',NULL,'radio','Course','true','StudentViewEnabledTitle','StudentViewEnabledComment',NULL,NULL, 0), ('show_navigation_menu',NULL,'radio','Course','false','ShowNavigationMenuTitle','ShowNavigationMenuComment',NULL,NULL, 0), ('enable_tool_introduction',NULL,'radio','course','false','EnableToolIntroductionTitle','EnableToolIntroductionComment',NULL,NULL, 0), -('page_after_login', NULL, 'radio','Platform','user_portal.php', 'PageAfterLoginTitle','PageAfterLoginComment', NULL, NULL, 0), +('page_after_login', NULL, 'radio','Registration','user_portal.php', 'PageAfterLoginTitle','PageAfterLoginComment', NULL, NULL, 0), ('time_limit_whosonline', NULL, 'textfield','Platform','30', 'TimeLimitWhosonlineTitle','TimeLimitWhosonlineComment', NULL, NULL, 0), ('breadcrumbs_course_homepage', NULL, 'radio','Course','course_title', 'BreadCrumbsCourseHomepageTitle','BreadCrumbsCourseHomepageComment', NULL, NULL, 0), ('example_material_course_creation', NULL, 'radio','Platform','true', 'ExampleMaterialCourseCreationTitle','ExampleMaterialCourseCreationComment', NULL, NULL, 0), @@ -762,7 +763,6 @@ VALUES ('show_tabs', 'my_profile', 'checkbox', 'Platform', 'true', 'ShowTabsTitle','ShowTabsComment',NULL,'TabsMyProfile', 1), ('default_forum_view', NULL, 'radio', 'Course', 'flat', 'DefaultForumViewTitle','DefaultForumViewComment',NULL,NULL, 0), ('platform_charset',NULL,'textfield','Languages','UTF-8','PlatformCharsetTitle','PlatformCharsetComment','platform',NULL, 0), -('noreply_email_address', '', 'textfield', 'Platform', '', 'NoReplyEmailAddress', 'NoReplyEmailAddressComment', NULL, NULL, 0), ('survey_email_sender_noreply', '', 'radio', 'Course', 'coach', 'SurveyEmailSenderNoReply', 'SurveyEmailSenderNoReplyComment', NULL, NULL, 0), ('openid_authentication',NULL,'radio','Security','false','OpenIdAuthentication','OpenIdAuthenticationComment',NULL,NULL, 0), ('profile','openid','checkbox','User','false','ProfileChangesTitle','ProfileChangesComment',NULL,'OpenIDURL', 0), @@ -773,7 +773,7 @@ VALUES ('gradebook_score_display_colorsplit',NULL,'textfield','Gradebook','50','GradebookScoreDisplayColorSplit','GradebookScoreDisplayColorSplitComment',NULL,NULL, 0), ('gradebook_score_display_upperlimit','my_display_upperlimit','checkbox','Gradebook','false','GradebookScoreDisplayUpperLimit','GradebookScoreDisplayUpperLimitComment',NULL,'TabsGradebookEnableUpperLimit', 0), ('gradebook_number_decimals', NULL, 'select', 'Gradebook', '0', 'GradebookNumberDecimals', 'GradebookNumberDecimalsComment', NULL, NULL, 0), -('user_selected_theme',NULL,'radio','Platform','false','UserThemeSelection','UserThemeSelectionComment',NULL,NULL, 0), +('user_selected_theme',NULL,'radio','User','false','UserThemeSelection','UserThemeSelectionComment',NULL,NULL, 0), ('profile','theme','checkbox','User','false','ProfileChangesTitle','ProfileChangesComment',NULL,'UserTheme', 0), ('allow_course_theme',NULL,'radio','Course','true','AllowCourseThemeTitle','AllowCourseThemeComment',NULL,NULL, 0), ('display_mini_month_calendar',NULL,'radio','Tools', 'true', 'DisplayMiniMonthCalendarTitle', 'DisplayMiniMonthCalendarComment', NULL, NULL, 0), @@ -781,15 +781,15 @@ VALUES ('number_of_upcoming_events',NULL,'textfield','Tools','1','NumberOfUpcomingEventsTitle','NumberOfUpcomingEventsComment',NULL,NULL, 0), ('show_closed_courses',NULL,'radio','Platform','false','ShowClosedCoursesTitle','ShowClosedCoursesComment',NULL,NULL, 0), ('service_visio', 'visio_use_rtmpt', 'radio',null,'false', 'VisioUseRtmptTitle','VisioUseRtmptComment', NULL, NULL, 0), -('extendedprofile_registration', 'mycomptetences', 'checkbox','User','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyCompetences', 0), -('extendedprofile_registration', 'mydiplomas', 'checkbox','User','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyDiplomas', 0), -('extendedprofile_registration', 'myteach', 'checkbox','User','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyTeach', 0), -('extendedprofile_registration', 'mypersonalopenarea', 'checkbox','User','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyPersonalOpenArea', 0), -('extendedprofile_registrationrequired', 'mycomptetences', 'checkbox','User','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyCompetences', 0), -('extendedprofile_registrationrequired', 'mydiplomas', 'checkbox','User','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyDiplomas', 0), -('extendedprofile_registrationrequired', 'myteach', 'checkbox','User','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyTeach', 0), -('extendedprofile_registrationrequired', 'mypersonalopenarea', 'checkbox','User','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyPersonalOpenArea', 0), -('registration','phone','textfield','User','false','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'Phone', 0), +('extendedprofile_registration', 'mycomptetences', 'checkbox','Registration','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyCompetences', 0), +('extendedprofile_registration', 'mydiplomas', 'checkbox','Registration','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyDiplomas', 0), +('extendedprofile_registration', 'myteach', 'checkbox','Registration','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyTeach', 0), +('extendedprofile_registration', 'mypersonalopenarea', 'checkbox','Registration','false', 'ExtendedProfileRegistrationTitle','ExtendedProfileRegistrationComment', NULL, 'MyPersonalOpenArea', 0), +('extendedprofile_registrationrequired', 'mycomptetences', 'checkbox','Registration','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyCompetences', 0), +('extendedprofile_registrationrequired', 'mydiplomas', 'checkbox','Registration','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyDiplomas', 0), +('extendedprofile_registrationrequired', 'myteach', 'checkbox','Registration','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyTeach', 0), +('extendedprofile_registrationrequired', 'mypersonalopenarea', 'checkbox','Registration','false', 'ExtendedProfileRegistrationRequiredTitle','ExtendedProfileRegistrationRequiredComment', NULL, 'MyPersonalOpenArea', 0), +('registration','phone','textfield','Registration','false','RegistrationRequiredFormsTitle','RegistrationRequiredFormsComment',NULL,'Phone', 0), ('add_users_by_coach',NULL,'radio','Session','false','AddUsersByCoachTitle','AddUsersByCoachComment',NULL,NULL, 0), ('extend_rights_for_coach',NULL,'radio','Security','false','ExtendRightsForCoachTitle','ExtendRightsForCoachComment',NULL,NULL, 0), ('extend_rights_for_coach_on_survey',NULL,'radio','Security','true','ExtendRightsForCoachOnSurveyTitle','ExtendRightsForCoachOnSurveyComment',NULL,NULL, 0), @@ -811,7 +811,7 @@ VALUES ('show_session_data', NULL, 'radio', 'Session', 'false', 'ShowSessionDataTitle', 'ShowSessionDataComment', NULL, NULL, 1), ('allow_use_sub_language', NULL, 'radio', 'Languages', 'false', 'AllowUseSubLanguageTitle', 'AllowUseSubLanguageComment', NULL, NULL,0), ('show_glossary_in_documents', NULL, 'radio', 'Course', 'none', 'ShowGlossaryInDocumentsTitle', 'ShowGlossaryInDocumentsComment', NULL, NULL,1), -('allow_terms_conditions', NULL, 'radio', 'Platform', 'false', 'AllowTermsAndConditionsTitle', 'AllowTermsAndConditionsComment', NULL, NULL,0), +('allow_terms_conditions', NULL, 'radio', 'Registration', 'false', 'AllowTermsAndConditionsTitle', 'AllowTermsAndConditionsComment', NULL, NULL,0), ('course_create_active_tools','enable_search','checkbox','Tools','false','CourseCreateActiveToolsTitle','CourseCreateActiveToolsComment',NULL,'Search',0), ('search_enabled',NULL,'radio','Search','false','EnableSearchTitle','EnableSearchComment',NULL,NULL,1), ('search_prefilter_prefix',NULL, NULL,'Search','','SearchPrefilterPrefix','SearchPrefilterPrefixComment',NULL,NULL,0), @@ -905,14 +905,14 @@ VALUES ('cas_protocol', NULL, 'radio', 'CAS', '', 'CasMainProtocolTitle', 'CasMainProtocolComment', NULL, NULL, 0), ('cas_add_user_activate', NULL, 'radio', 'CAS', 'false', 'CasUserAddActivateTitle', 'CasUserAddActivateComment', NULL, NULL, 0), ('update_user_info_cas_with_ldap', NULL, 'radio', 'CAS', 'true', 'UpdateUserInfoCasWithLdapTitle', 'UpdateUserInfoCasWithLdapComment', NULL, NULL, 0), -('student_page_after_login', NULL, 'textfield', 'Platform', '', 'StudentPageAfterLoginTitle', 'StudentPageAfterLoginComment', NULL, NULL, 0), -('teacher_page_after_login', NULL, 'textfield', 'Platform', '', 'TeacherPageAfterLoginTitle', 'TeacherPageAfterLoginComment', NULL, NULL, 0), -('drh_page_after_login', NULL, 'textfield', 'Platform', '', 'DRHPageAfterLoginTitle', 'DRHPageAfterLoginComment', NULL, NULL, 0), -('sessionadmin_page_after_login', NULL, 'textfield', 'Session', '', 'SessionAdminPageAfterLoginTitle', 'SessionAdminPageAfterLoginComment', NULL, NULL, 0), -('student_autosubscribe', NULL, 'textfield', 'Platform', '', 'StudentAutosubscribeTitle', 'StudentAutosubscribeComment', NULL, NULL, 0), -('teacher_autosubscribe', NULL, 'textfield', 'Platform', '', 'TeacherAutosubscribeTitle', 'TeacherAutosubscribeComment', NULL, NULL, 0), -('drh_autosubscribe', NULL, 'textfield', 'Platform', '', 'DRHAutosubscribeTitle', 'DRHAutosubscribeComment', NULL, NULL, 0), -('sessionadmin_autosubscribe', NULL, 'textfield', 'Session', '', 'SessionadminAutosubscribeTitle', 'SessionadminAutosubscribeComment', NULL, NULL, 0), +('student_page_after_login', NULL, 'textfield', 'Registration', '', 'StudentPageAfterLoginTitle', 'StudentPageAfterLoginComment', NULL, NULL, 0), +('teacher_page_after_login', NULL, 'textfield', 'Registration', '', 'TeacherPageAfterLoginTitle', 'TeacherPageAfterLoginComment', NULL, NULL, 0), +('drh_page_after_login', NULL, 'textfield', 'Registration', '', 'DRHPageAfterLoginTitle', 'DRHPageAfterLoginComment', NULL, NULL, 0), +('sessionadmin_page_after_login', NULL, 'textfield', 'Registration', '', 'SessionAdminPageAfterLoginTitle', 'SessionAdminPageAfterLoginComment', NULL, NULL, 0), +('student_autosubscribe', NULL, 'textfield', 'Registration', '', 'StudentAutosubscribeTitle', 'StudentAutosubscribeComment', NULL, NULL, 0), +('teacher_autosubscribe', NULL, 'textfield', 'Registration', '', 'TeacherAutosubscribeTitle', 'TeacherAutosubscribeComment', NULL, NULL, 0), +('drh_autosubscribe', NULL, 'textfield', 'Registration', '', 'DRHAutosubscribeTitle', 'DRHAutosubscribeComment', NULL, NULL, 0), +('sessionadmin_autosubscribe', NULL, 'textfield', 'Registration', '', 'SessionadminAutosubscribeTitle', 'SessionadminAutosubscribeComment', NULL, NULL, 0), ('scorm_cumulative_session_time', NULL, 'radio', 'Course', 'true', 'ScormCumulativeSessionTimeTitle', 'ScormCumulativeSessionTimeComment', NULL, NULL, 0), ('allow_hr_skills_management', NULL, 'radio', 'Gradebook', 'true', 'AllowHRSkillsManagementTitle', 'AllowHRSkillsManagementComment', NULL, NULL, 1), ('enable_help_link', NULL, 'radio', 'Platform', 'true', 'EnableHelpLinkTitle', 'EnableHelpLinkComment', NULL, NULL, 0), @@ -924,7 +924,7 @@ VALUES ('languagePriority2', NULL, 'radio', 'Languages','user_profil_lang', 'LanguagePriority2Title', 'LanguagePriority2Comment', NULL, NULL, 0), ('languagePriority3', NULL, 'radio', 'Languages','user_selected_lang', 'LanguagePriority3Title', 'LanguagePriority3Comment', NULL, NULL, 0), ('languagePriority4', NULL, 'radio', 'Languages', 'platform_lang','LanguagePriority4Title', 'LanguagePriority4Comment', NULL, NULL, 0), -('login_is_email', NULL, 'radio', 'Platform', 'false', 'LoginIsEmailTitle', 'LoginIsEmailComment', NULL, NULL, 0), +('login_is_email', NULL, 'radio', 'Registration', 'false', 'LoginIsEmailTitle', 'LoginIsEmailComment', NULL, NULL, 0), ('courses_default_creation_visibility', NULL, 'radio', 'Course', '2', 'CoursesDefaultCreationVisibilityTitle', 'CoursesDefaultCreationVisibilityComment', NULL, NULL, 1), ('allow_browser_sniffer', NULL, 'radio', 'Tuning', 'false', 'AllowBrowserSnifferTitle', 'AllowBrowserSnifferComment', NULL, NULL, 0), ('enable_wami_record',NULL,'radio','Tools','false','EnableWamiRecordTitle','EnableWamiRecordComment',NULL,NULL, 0), @@ -939,7 +939,7 @@ VALUES ('allow_session_admins_to_manage_all_sessions', NULL, 'radio', 'Session', 'false', 'AllowSessionAdminsToSeeAllSessionsTitle', 'AllowSessionAdminsToSeeAllSessionsComment', NULL, NULL, 1), ('allow_skills_tool', NULL, 'radio', 'Platform', 'false', 'AllowSkillsToolTitle', 'AllowSkillsToolComment', NULL, NULL, 1), ('allow_public_certificates', NULL, 'radio', 'Course', 'false', 'AllowPublicCertificatesTitle', 'AllowPublicCertificatesComment', NULL, NULL, 1), -('platform_unsubscribe_allowed', NULL, 'radio', 'Platform', 'false', 'PlatformUnsubscribeTitle', 'PlatformUnsubscribeComment', NULL, NULL, 1), +('platform_unsubscribe_allowed', NULL, 'radio', 'Registration', 'false', 'PlatformUnsubscribeTitle', 'PlatformUnsubscribeComment', NULL, NULL, 1), ('activate_email_template', NULL, 'radio', 'Platform', 'false', 'ActivateEmailTemplateTitle', 'ActivateEmailTemplateComment', NULL, NULL, 0), ('enable_iframe_inclusion', NULL, 'radio', 'Editor', 'false', 'EnableIframeInclusionTitle', 'EnableIframeInclusionComment', NULL, NULL, 1), ('show_hot_courses', NULL, 'radio', 'Platform', 'true', 'ShowHotCoursesTitle', 'ShowHotCoursesComment', NULL, NULL, 1), @@ -3644,4 +3644,4 @@ CREATE TABLE user_session_path ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Do not move this -UPDATE settings_current SET selected_value = '1.10.0.061' WHERE variable = 'chamilo_database_version'; +UPDATE settings_current SET selected_value = '1.10.0.062' WHERE variable = 'chamilo_database_version'; diff --git a/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/migrate-db-1.9.0-1.10.0-pre.sql b/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/migrate-db-1.9.0-1.10.0-pre.sql index 39ef2ce8dc..14e749cae5 100644 --- a/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/migrate-db-1.9.0-1.10.0-pre.sql +++ b/vendor/chamilo/chash/src/Chash/Resources/Database/1.10.0/migrate-db-1.9.0-1.10.0-pre.sql @@ -221,5 +221,37 @@ INSERT INTO branch_transaction_status VALUES (1, 'To be executed'), (2, 'Execute UPDATE course_field SET field_type = 3 WHERE field_variable = 'special_course'; +UPDATE settings_current SET category = 'Admin' WHERE variable = 'emailAdministrator'; +UPDATE settings_current SET category = 'Admin' WHERE variable = 'administratorSurname'; +UPDATE settings_current SET category = 'Admin' WHERE variable = 'administratorName'; +UPDATE settings_current SET category = 'Admin' WHERE variable = 'show_administrator_data'; +UPDATE settings_current SET category = 'Admin' WHERE variable = 'administratorTelephone'; + +UPDATE settings_current SET category = 'Registration' WHERE variable = 'allow_registration'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'allow_registration_as_teacher'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'allow_lostpassword'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'page_after_login'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'allow_terms_conditions'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'student_page_after_login'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'teacher_page_after_login'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'drh_page_after_login'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'student_autosubscribe'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'teacher_autosubscribe'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'drh_autosubscribe'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'platform_unsubscribe_allowed'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'teacher_page_after_login'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'registration'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'extendedprofile_registration'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'extendedprofile_registrationrequired'; +UPDATE settings_current SET category = 'Registration' WHERE variable = 'login_is_email'; + +UPDATE settings_current SET category = 'Course' WHERE variable = 'display_coursecode_in_courselist'; +UPDATE settings_current SET category = 'Course' WHERE variable = 'display_teacher_in_courselist'; +UPDATE settings_current SET category = 'Course' WHERE variable = 'student_view_enabled'; +UPDATE settings_current SET category = 'Course' WHERE variable = 'course_validation'; + +UPDATE settings_current SET category = 'User' WHERE variable = 'user_selected_theme'; + + -- Do not move this -UPDATE settings_current SET selected_value = '1.10.0.061' WHERE variable = 'chamilo_database_version'; +UPDATE settings_current SET selected_value = '1.10.0.062' WHERE variable = 'chamilo_database_version'; diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index bfa57bf9ab..84da2d5a1f 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -75,7 +75,7 @@ return array( 'CourseSelectForm' => $baseDir . '/main/coursecopy/classes/CourseSelectForm.class.php', 'CourseSession' => $baseDir . '/main/coursecopy/classes/CourseSession.class.php', 'CoursesController' => $baseDir . '/main/auth/courses_controller.php', - 'Cpdf' => $baseDir . '/main/inc/lib/ezpdf/class.pdf.php', + 'Cpdf' => $baseDir . '/main/inc/lib/phpdocx/pdf/lib/class.pdf.php', 'CreateChartRels' => $baseDir . '/main/inc/lib/phpdocx/classes/CreateChartRels.inc', 'CreateDocx' => $baseDir . '/main/inc/lib/phpdocx/classes/CreateDocx.inc', 'CreateElement' => $baseDir . '/main/inc/lib/phpdocx/classes/CreateElement.inc', @@ -170,6 +170,9 @@ return array( 'DashboardManager' => $baseDir . '/main/inc/lib/dashboard.lib.php', 'DataForm' => $baseDir . '/main/gradebook/lib/fe/dataform.class.php', 'Database' => $baseDir . '/main/inc/lib/database.lib.php', + 'DatePicker' => $baseDir . '/main/inc/lib/formvalidator/Element/DatePicker.php', + 'DateRangePicker' => $baseDir . '/main/inc/lib/formvalidator/Element/DateRangePicker.php', + 'DateTimePicker' => $baseDir . '/main/inc/lib/formvalidator/Element/DateTimePicker.php', 'Diagnoser' => $baseDir . '/main/inc/lib/diagnoser.lib.php', 'Display' => $baseDir . '/main/inc/lib/display.lib.php', 'DisplayGradebook' => $baseDir . '/main/gradebook/lib/fe/displaygradebook.php', @@ -212,7 +215,7 @@ return array( 'ForumThreadLink' => $baseDir . '/main/gradebook/lib/be/forumthreadlink.class.php', 'ForumTopic' => $baseDir . '/main/coursecopy/classes/ForumTopic.class.php', 'Frame' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/frame.cls.php', - 'FrameFiller' => $vendorDir . '/jmontoyaa/phpqrcode/qrencode.php', + 'FrameFiller' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', 'FrameList' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/frame.cls.php', 'FrameListIterator' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/frame.cls.php', 'FrameTreeIterator' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/frame.cls.php', @@ -282,6 +285,7 @@ return array( 'HTML_QuickForm_Rule_Url' => $baseDir . '/main/inc/lib/formvalidator/Rule/Url.php', 'HTML_QuickForm_Rule_Username' => $baseDir . '/main/inc/lib/formvalidator/Rule/Username.php', 'HTML_QuickForm_Rule_UsernameAvailable' => $baseDir . '/main/inc/lib/formvalidator/Rule/UsernameAvailable.php', + 'HTML_QuickForm_Select_Ajax' => $baseDir . '/main/inc/lib/formvalidator/Element/select_ajax.php', 'HTML_QuickForm_Select_Language' => $baseDir . '/main/inc/lib/formvalidator/Element/select_language.php', 'HTML_QuickForm_Select_Theme' => $baseDir . '/main/inc/lib/formvalidator/Element/select_theme.php', 'HTML_QuickForm_advanced_settings' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/advanced_settings.php', @@ -314,6 +318,7 @@ return array( 'HTML_QuickForm_select' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/select.php', 'HTML_QuickForm_static' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/static.php', 'HTML_QuickForm_stylebutton' => $baseDir . '/main/inc/lib/formvalidator/Element/style_button.php', + 'HTML_QuickForm_styleresetbutton' => $baseDir . '/main/inc/lib/formvalidator/Element/style_reset_button.php', 'HTML_QuickForm_stylesubmitbutton' => $baseDir . '/main/inc/lib/formvalidator/Element/style_submit_button.php', 'HTML_QuickForm_submit' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/submit.php', 'HTML_QuickForm_text' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/text.php', @@ -336,16 +341,16 @@ return array( 'ImagickWrapper' => $baseDir . '/main/inc/lib/image.lib.php', 'Import' => $baseDir . '/main/inc/lib/import.lib.php', 'Ims2Question' => $baseDir . '/main/exercice/export/qti2/qti2_classes.php', - 'ImsAnswerFillInBlanks' => $baseDir . '/main/exercice/export/qti/qti_classes.php', + 'ImsAnswerFillInBlanks' => $baseDir . '/main/exercice/export/qti2/qti2_classes.php', 'ImsAnswerFree' => $baseDir . '/main/exercice/export/qti2/qti2_classes.php', 'ImsAnswerHotspot' => $baseDir . '/main/exercice/export/qti2/qti2_classes.php', - 'ImsAnswerMatching' => $baseDir . '/main/exercice/export/qti/qti_classes.php', - 'ImsAnswerMultipleChoice' => $baseDir . '/main/exercice/export/qti/qti_classes.php', + 'ImsAnswerMatching' => $baseDir . '/main/exercice/export/qti2/qti2_classes.php', + 'ImsAnswerMultipleChoice' => $baseDir . '/main/exercice/export/qti2/qti2_classes.php', 'ImsAnswerTrueFalse' => $baseDir . '/main/exercice/export/qti/qti_classes.php', 'ImsAssessmentItem' => $baseDir . '/main/exercice/export/qti2/qti2_export.php', - 'ImsItem' => $baseDir . '/main/exercice/export/qti/qti_export.php', + 'ImsItem' => $baseDir . '/main/exercice/export/qti2/qti2_export.php', 'ImsQuestion' => $baseDir . '/main/exercice/export/qti/qti_classes.php', - 'ImsSection' => $baseDir . '/main/exercice/export/qti/qti_export.php', + 'ImsSection' => $baseDir . '/main/exercice/export/qti2/qti2_export.php', 'IndexableChunk' => $baseDir . '/main/inc/lib/search/IndexableChunk.class.php', 'Inline_Frame_Decorator' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/inline_frame_decorator.cls.php', 'Inline_Frame_Reflower' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/inline_frame_reflower.cls.php', @@ -426,7 +431,6 @@ return array( 'LoggerRoot' => $baseDir . '/main/inc/lib/phpdocx/lib/log4php/LoggerRoot.php', 'Login' => $baseDir . '/main/inc/lib/login.lib.php', 'LoginRedirection' => $baseDir . '/main/inc/lib/login_redirection.class.php', - 'MagpieRSS' => $baseDir . '/main/inc/lib/magpierss/rss_parse.inc', 'Matching' => $baseDir . '/main/exercice/matching.class.php', 'MediaQuestion' => $baseDir . '/main/exercice/media_question.class.php', 'MessageManager' => $baseDir . '/main/inc/lib/message.lib.php', @@ -468,7 +472,6 @@ return array( 'PGTStorageDB' => $baseDir . '/main/auth/cas/lib/CAS/PGTStorage/pgt-db.php', 'PGTStorageFile' => $baseDir . '/main/auth/cas/lib/CAS/PGTStorage/pgt-file.php', 'PHP_Evaluator' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/php_evaluator.cls.php', - 'PageController' => $baseDir . '/main/inc/lib/page.lib.php', 'Page_Cache' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/page_cache.cls.php', 'Page_Frame_Decorator' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/page_frame_decorator.cls.php', 'Page_Frame_Reflower' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/page_frame_reflower.cls.php', @@ -485,21 +488,21 @@ return array( 'PortfolioShare' => $baseDir . '/main/inc/lib/portfolio.class.php', 'Positioner' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/positioner.cls.php', 'Promotion' => $baseDir . '/main/inc/lib/promotion.lib.php', - 'QRbitstream' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', - 'QRcode' => $vendorDir . '/jmontoyaa/phpqrcode/qrencode.php', - 'QRencode' => $vendorDir . '/jmontoyaa/phpqrcode/qrencode.php', - 'QRimage' => $vendorDir . '/jmontoyaa/phpqrcode/qrimage.php', - 'QRinput' => $vendorDir . '/jmontoyaa/phpqrcode/qrinput.php', - 'QRinputItem' => $vendorDir . '/jmontoyaa/phpqrcode/qrinput.php', - 'QRmask' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', - 'QRrawcode' => $vendorDir . '/jmontoyaa/phpqrcode/qrencode.php', - 'QRrs' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', - 'QRrsItem' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', - 'QRrsblock' => $vendorDir . '/jmontoyaa/phpqrcode/qrencode.php', - 'QRspec' => $vendorDir . '/jmontoyaa/phpqrcode/qrspec.php', - 'QRsplit' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', - 'QRtools' => $vendorDir . '/jmontoyaa/phpqrcode/qrtools.php', - 'QRvect' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRbitstream' => $vendorDir . '/jmontoyaa/phpqrcode/qrbitstream.php', + 'QRcode' => $vendorDir . '/jmontoyaa/phpqrcode/bindings/tcpdf/qrcode.php', + 'QRencode' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRimage' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRinput' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRinputItem' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRmask' => $vendorDir . '/jmontoyaa/phpqrcode/qrmask.php', + 'QRrawcode' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRrs' => $vendorDir . '/jmontoyaa/phpqrcode/qrrscode.php', + 'QRrsItem' => $vendorDir . '/jmontoyaa/phpqrcode/qrrscode.php', + 'QRrsblock' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRspec' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRsplit' => $vendorDir . '/jmontoyaa/phpqrcode/qrsplit.php', + 'QRtools' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'QRvect' => $vendorDir . '/jmontoyaa/phpqrcode/qrvect.php', 'Question' => $baseDir . '/main/exercice/question.class.php', 'QuickformElement' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/Renderer/Object.php', 'QuickformFlexyElement' => $baseDir . '/main/inc/lib/pear/HTML/QuickForm/Renderer/ObjectFlexy.php', @@ -508,7 +511,6 @@ return array( 'Quiz' => $baseDir . '/main/coursecopy/classes/Quiz.class.php', 'QuizQuestion' => $baseDir . '/main/coursecopy/classes/QuizQuestion.class.php', 'QuizQuestionOption' => $baseDir . '/main/coursecopy/classes/QuizQuestionOption.class.php', - 'RSSCache' => $baseDir . '/main/inc/lib/magpierss/rss_cache.inc', 'Renderer' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/renderer.cls.php', 'Resource' => $baseDir . '/main/coursecopy/classes/Resource.class.php', 'Result' => $baseDir . '/main/gradebook/lib/be/result.class.php', @@ -566,7 +568,6 @@ return array( 'SkillRelSkill' => $baseDir . '/main/inc/lib/skill.lib.php', 'SkillRelUser' => $baseDir . '/main/inc/lib/skill.lib.php', 'SkillVisualizer' => $baseDir . '/main/inc/lib/skill.visualizer.lib.php', - 'Snoopy' => $baseDir . '/main/inc/lib/magpierss/extlib/Snoopy.class.inc', 'SocialManager' => $baseDir . '/main/inc/lib/social.lib.php', 'SortableTable' => $baseDir . '/main/inc/lib/sortable_table.class.php', 'SortableTableFromArray' => $baseDir . '/main/inc/lib/sortable_table.class.php', @@ -608,7 +609,6 @@ return array( 'Table_Row_Group_Frame_Reflower' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/table_row_group_frame_reflower.cls.php', 'Table_Row_Positioner' => $baseDir . '/main/inc/lib/phpdocx/pdf/include/table_row_positioner.cls.php', 'Temp' => $baseDir . '/main/inc/lib/system/io/temp.class.php', - 'Template' => $baseDir . '/main/inc/lib/template.lib.php', 'Testcategory' => $baseDir . '/main/exercice/testcategory.class.php', 'Text' => $baseDir . '/main/inc/lib/text.lib.php', 'Text_CAPTCHA' => $baseDir . '/main/inc/lib/pear/Text/CAPTCHA.php', @@ -659,7 +659,6 @@ return array( 'UniqueAnswer' => $baseDir . '/main/exercice/unique_answer.class.php', 'UniqueAnswerImage' => $baseDir . '/main/exercice/unique_answer_image.class.php', 'UniqueAnswerNoOption' => $baseDir . '/main/exercice/unique_answer_no_option.class.php', - 'Uri' => $baseDir . '/main/inc/lib/uri.class.php', 'UrlManager' => $baseDir . '/main/inc/lib/urlmanager.lib.php', 'UserDataGenerator' => $baseDir . '/main/gradebook/lib/user_data_generator.class.php', 'UserForm' => $baseDir . '/main/gradebook/lib/fe/userform.class.php', @@ -679,7 +678,6 @@ return array( 'Work' => $baseDir . '/main/coursecopy/classes/Work.class.php', 'XMLSchema' => $baseDir . '/main/inc/lib/nusoap/class.xmlschema.php', 'XapianIndexer' => $baseDir . '/main/inc/lib/search/xapian/XapianIndexer.class.php', - 'Zip' => $baseDir . '/main/inc/lib/zip.class.php', 'ZombieManager' => $baseDir . '/main/inc/lib/zombie/zombie_manager.class.php', 'ZombieReport' => $baseDir . '/main/inc/lib/zombie/zombie_report.class.php', '_IndexableChunk' => $baseDir . '/main/inc/lib/search/IndexableChunk.class.php', @@ -700,7 +698,6 @@ return array( 'aiccResource' => $baseDir . '/main/newscorm/aiccResource.class.php', 'api_failure' => $baseDir . '/main/inc/lib/api.lib.php', 'bmp' => $vendorDir . '/mpdf/mpdf/classes/bmp.php', - 'calendarComponent' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', 'ch_comment' => $baseDir . '/main/survey/survey.lib.php', 'ch_dropdown' => $baseDir . '/main/survey/survey.lib.php', 'ch_multiplechoice' => $baseDir . '/main/survey/survey.lib.php', @@ -749,8 +746,8 @@ return array( 'link_processor' => $baseDir . '/main/inc/lib/search/tool_processors/link_processor.class.php', 'mPDF' => $vendorDir . '/mpdf/mpdf/mpdf.php', 'meter' => $vendorDir . '/mpdf/mpdf/classes/meter.php', - 'nusoap_base' => $baseDir . '/main/inc/lib/nusoap/class.nusoap_base.php', - 'nusoap_client' => $baseDir . '/main/inc/lib/nusoap/nusoap.php', + 'nusoap_base' => $baseDir . '/main/inc/lib/nusoap/nusoap.php', + 'nusoap_client' => $baseDir . '/main/inc/lib/nusoap/class.soapclient.php', 'nusoap_client_mime' => $baseDir . '/main/inc/lib/nusoap/nusoapmime.php', 'nusoap_fault' => $baseDir . '/main/inc/lib/nusoap/class.soap_fault.php', 'nusoap_parser' => $baseDir . '/main/inc/lib/nusoap/class.soap_parser.php', @@ -772,7 +769,7 @@ return array( 'php4DomProcessingInstruction' => $baseDir . '/main/auth/cas/lib/CAS/domxml-php4-to-php5.php', 'php4DomXsltStylesheet' => $baseDir . '/main/auth/cas/lib/CAS/domxml-php4-to-php5.php', 'phpCAS' => $baseDir . '/main/auth/cas/lib/CAS.php', - 'qrstr' => $vendorDir . '/jmontoyaa/phpqrcode/phpqrcode.php', + 'qrstr' => $vendorDir . '/jmontoyaa/phpqrcode/qrconst.php', 'quiz_processor' => $baseDir . '/main/inc/lib/search/tool_processors/quiz_processor.class.php', 'scorm' => $baseDir . '/main/newscorm/scorm.class.php', 'scormItem' => $baseDir . '/main/newscorm/scormItem.class.php', @@ -784,25 +781,16 @@ return array( 'soap_parser' => $baseDir . '/main/inc/lib/nusoap/class.soap_parser.php', 'soap_server' => $baseDir . '/main/inc/lib/nusoap/class.soap_server.php', 'soap_transport_http' => $baseDir . '/main/inc/lib/nusoap/class.soap_transport_http.php', - 'soapclient' => $baseDir . '/main/inc/lib/nusoap/nusoap.php', + 'soapclient' => $baseDir . '/main/inc/lib/nusoap/class.soapclient.php', 'soapclientmime' => $baseDir . '/main/inc/lib/nusoap/nusoapmime.php', 'soapval' => $baseDir . '/main/inc/lib/nusoap/class.soap_val.php', 'sso' => $baseDir . '/main/auth/sso/sso.class.php', 'survey_manager' => $baseDir . '/main/survey/survey.lib.php', 'survey_question' => $baseDir . '/main/survey/survey.lib.php', 'tocontents' => $vendorDir . '/mpdf/mpdf/classes/tocontents.php', - 'valarm' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', - 'vcalendar' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', - 'vevent' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', - 'vfreebusy' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', - 'vjournal' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', - 'vtimezone' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', - 'vtodo' => $baseDir . '/main/inc/lib/icalcreator/iCalcreator.class.php', 'wmf' => $vendorDir . '/mpdf/mpdf/classes/wmf.php', 'wsdl' => $baseDir . '/main/inc/lib/nusoap/class.wsdl.php', 'wsdlcache' => $baseDir . '/main/inc/lib/nusoap/class.wsdlcache.php', 'xajax' => $baseDir . '/main/inc/lib/xajax/xajax.inc.php', 'xajaxResponse' => $baseDir . '/main/inc/lib/xajax/xajaxResponse.inc.php', - 'xhtdoc' => $baseDir . '/main/inc/lib/xht.lib.php', - 'xmddoc' => $baseDir . '/main/inc/lib/xmd.lib.php', ); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index 166960fcbc..2660313550 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -6,7 +6,14 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( + 'Zend\\Validator\\' => array($vendorDir . '/zendframework/zend-validator'), + 'Zend\\Uri\\' => array($vendorDir . '/zendframework/zend-uri'), 'Zend\\Stdlib\\' => array($vendorDir . '/zendframework/zend-stdlib'), + 'Zend\\ServiceManager\\' => array($vendorDir . '/zendframework/zend-servicemanager'), + 'Zend\\Loader\\' => array($vendorDir . '/zendframework/zend-loader'), + 'Zend\\Http\\' => array($vendorDir . '/zendframework/zend-http'), + 'Zend\\Feed\\' => array($vendorDir . '/zendframework/zend-feed'), + 'Zend\\Escaper\\' => array($vendorDir . '/zendframework/zend-escaper'), 'Zend\\Config\\' => array($vendorDir . '/zendframework/zend-config'), 'Whoops' => array($vendorDir . '/filp/whoops/src'), 'Unoconv' => array($vendorDir . '/php-unoconv/php-unoconv/src'), @@ -52,10 +59,14 @@ return array( 'Silex' => array($vendorDir . '/silex/silex/src'), 'Sensio\\Bundle\\FrameworkExtraBundle' => array($vendorDir . '/sensio/framework-extra-bundle'), 'Seld\\JsonLint' => array($vendorDir . '/seld/jsonlint/src'), + 'Sabre\\VObject' => array($vendorDir . '/sabre/vobject/lib'), 'Psr\\Log\\' => array($vendorDir . '/psr/log'), 'Pimple' => array($vendorDir . '/pimple/pimple/lib'), + 'Patchwork' => array($vendorDir . '/patchwork/utf8/class'), 'Pagerfanta\\' => array($vendorDir . '/pagerfanta/pagerfanta/src'), 'PHPExiftool' => array($vendorDir . '/phpexiftool/phpexiftool/lib'), + 'Oziks' => array($vendorDir . '/jmontoyaa/xhprof-service-provider/src'), + 'Normalizer' => array($vendorDir . '/patchwork/utf8/class'), 'Neutron' => array($vendorDir . '/neutron/silex-filesystem-provider/src', $vendorDir . '/neutron/temporary-filesystem/src'), 'MediaVorus' => array($vendorDir . '/mediavorus/mediavorus/src'), 'MediaAlchemyst' => array($vendorDir . '/media-alchemyst/media-alchemyst/src'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index bb51c10469..88975ecbfd 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInitf4df0055480c4a6738498545f1ec0cfd +class ComposerAutoloaderInitbbdc7dea11a66b6e7562e6c0fd58031a { private static $loader; @@ -19,9 +19,9 @@ class ComposerAutoloaderInitf4df0055480c4a6738498545f1ec0cfd return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInitf4df0055480c4a6738498545f1ec0cfd', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitbbdc7dea11a66b6e7562e6c0fd58031a', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); - spl_autoload_unregister(array('ComposerAutoloaderInitf4df0055480c4a6738498545f1ec0cfd', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitbbdc7dea11a66b6e7562e6c0fd58031a', 'loadClassLoader')); $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); @@ -45,14 +45,14 @@ class ComposerAutoloaderInitf4df0055480c4a6738498545f1ec0cfd $includeFiles = require __DIR__ . '/autoload_files.php'; foreach ($includeFiles as $file) { - composerRequiref4df0055480c4a6738498545f1ec0cfd($file); + composerRequirebbdc7dea11a66b6e7562e6c0fd58031a($file); } return $loader; } } -function composerRequiref4df0055480c4a6738498545f1ec0cfd($file) +function composerRequirebbdc7dea11a66b6e7562e6c0fd58031a($file) { require $file; } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index e34b62b62b..f434c06b59 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -193,7 +193,7 @@ ], "authors": [ { - "name": "Jonathan H. Wage", + "name": "Jonathan Wage", "email": "jonwage@gmail.com", "homepage": "http://www.jwage.com/", "role": "Creator" @@ -263,7 +263,7 @@ ], "authors": [ { - "name": "Jonathan H. Wage", + "name": "Jonathan Wage", "email": "jonwage@gmail.com", "homepage": "http://www.jwage.com/", "role": "Creator" @@ -567,18 +567,18 @@ }, { "name": "symfony/intl", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Intl", "source": { "type": "git", "url": "https://github.com/symfony/Intl.git", - "reference": "ab12f91c6b4a073007db3c478707ace276738a13" + "reference": "1f1d463ffafbf912f2d3b00fb9e1163185e70971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Intl/zipball/ab12f91c6b4a073007db3c478707ace276738a13", - "reference": "ab12f91c6b4a073007db3c478707ace276738a13", + "url": "https://api.github.com/repos/symfony/Intl/zipball/1f1d463ffafbf912f2d3b00fb9e1163185e70971", + "reference": "1f1d463ffafbf912f2d3b00fb9e1163185e70971", "shasum": "" }, "require": { @@ -591,7 +591,7 @@ "suggest": { "ext-intl": "to use the component with locales other than \"en\"" }, - "time": "2014-02-11 13:52:09", + "time": "2014-04-18 20:37:09", "type": "library", "extra": { "branch-alias": { @@ -646,24 +646,24 @@ }, { "name": "symfony/finder", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Finder", "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", - "reference": "ab301c7d21f536c34ab6c2c79dba8d465104c518" + "reference": "25e1e7d5e7376f8a92ae3b1d714d956edf33a730" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/ab301c7d21f536c34ab6c2c79dba8d465104c518", - "reference": "ab301c7d21f536c34ab6c2c79dba8d465104c518", + "url": "https://api.github.com/repos/symfony/Finder/zipball/25e1e7d5e7376f8a92ae3b1d714d956edf33a730", + "reference": "25e1e7d5e7376f8a92ae3b1d714d956edf33a730", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-03-01 17:35:04", + "time": "2014-04-27 13:34:57", "type": "library", "extra": { "branch-alias": { @@ -697,18 +697,18 @@ }, { "name": "symfony/console", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "ef20f1f58d7f693ee888353962bd2db336e3bbcb" + "reference": "2e452005b1e1d003d23702d227e23614679eb5ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/ef20f1f58d7f693ee888353962bd2db336e3bbcb", - "reference": "ef20f1f58d7f693ee888353962bd2db336e3bbcb", + "url": "https://api.github.com/repos/symfony/Console/zipball/2e452005b1e1d003d23702d227e23614679eb5ca", + "reference": "2e452005b1e1d003d23702d227e23614679eb5ca", "shasum": "" }, "require": { @@ -720,7 +720,7 @@ "suggest": { "symfony/event-dispatcher": "" }, - "time": "2014-03-01 17:35:04", + "time": "2014-04-27 13:34:57", "type": "library", "extra": { "branch-alias": { @@ -754,24 +754,24 @@ }, { "name": "symfony/property-access", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/PropertyAccess", "source": { "type": "git", "url": "https://github.com/symfony/PropertyAccess.git", - "reference": "37fe0c2dc494b47db4b0850e9dcba3a27cc45c0c" + "reference": "0456222bc00c40c1365065b603f7c397fb9a7134" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/37fe0c2dc494b47db4b0850e9dcba3a27cc45c0c", - "reference": "37fe0c2dc494b47db4b0850e9dcba3a27cc45c0c", + "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/0456222bc00c40c1365065b603f7c397fb9a7134", + "reference": "0456222bc00c40c1365065b603f7c397fb9a7134", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-02-11 15:39:28", + "time": "2014-04-18 20:37:09", "type": "library", "extra": { "branch-alias": { @@ -816,24 +816,24 @@ }, { "name": "symfony/options-resolver", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/OptionsResolver", "source": { "type": "git", "url": "https://github.com/symfony/OptionsResolver.git", - "reference": "36335060f12869b447854076642d35cc492fe444" + "reference": "de261aa6d0e5d21583f5ae7e68f3d95f90bbd771" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/36335060f12869b447854076642d35cc492fe444", - "reference": "36335060f12869b447854076642d35cc492fe444", + "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/de261aa6d0e5d21583f5ae7e68f3d95f90bbd771", + "reference": "de261aa6d0e5d21583f5ae7e68f3d95f90bbd771", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-16 10:34:31", "type": "library", "extra": { "branch-alias": { @@ -872,18 +872,18 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/EventDispatcher", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "4708b8cd41984a5ba29fe7dd40716f7f761ac501" + "reference": "e539602e5455aa086c0e81e604745af7789e4d8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/4708b8cd41984a5ba29fe7dd40716f7f761ac501", - "reference": "4708b8cd41984a5ba29fe7dd40716f7f761ac501", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/e539602e5455aa086c0e81e604745af7789e4d8a", + "reference": "e539602e5455aa086c0e81e604745af7789e4d8a", "shasum": "" }, "require": { @@ -896,7 +896,7 @@ "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2014-02-11 13:52:09", + "time": "2014-04-16 10:34:31", "type": "library", "extra": { "branch-alias": { @@ -930,18 +930,18 @@ }, { "name": "symfony/form", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Form", "source": { "type": "git", "url": "https://github.com/symfony/Form.git", - "reference": "a326d883c34c561df658f61697b81273107cbe4c" + "reference": "ba7a4852f3124929b270ecd783635e267c379e52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Form/zipball/a326d883c34c561df658f61697b81273107cbe4c", - "reference": "a326d883c34c561df658f61697b81273107cbe4c", + "url": "https://api.github.com/repos/symfony/Form/zipball/ba7a4852f3124929b270ecd783635e267c379e52", + "reference": "ba7a4852f3124929b270ecd783635e267c379e52", "shasum": "" }, "require": { @@ -962,7 +962,7 @@ "symfony/twig-bridge": "For templating with Twig.", "symfony/validator": "For form validation." }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-18 20:37:09", "type": "library", "extra": { "branch-alias": { @@ -996,18 +996,18 @@ }, { "name": "symfony/debug", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Debug", "source": { "type": "git", "url": "https://github.com/symfony/Debug.git", - "reference": "cf012d37f7e0d059fd6b35607e99761b33ccf4ed" + "reference": "6a8eb9aba50595014fef52d6b4d99b31dfaa6f02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/cf012d37f7e0d059fd6b35607e99761b33ccf4ed", - "reference": "cf012d37f7e0d059fd6b35607e99761b33ccf4ed", + "url": "https://api.github.com/repos/symfony/Debug/zipball/6a8eb9aba50595014fef52d6b4d99b31dfaa6f02", + "reference": "6a8eb9aba50595014fef52d6b4d99b31dfaa6f02", "shasum": "" }, "require": { @@ -1021,7 +1021,7 @@ "symfony/http-foundation": "", "symfony/http-kernel": "" }, - "time": "2014-03-26 18:07:42", + "time": "2014-04-16 10:34:42", "type": "library", "extra": { "branch-alias": { @@ -1055,18 +1055,18 @@ }, { "name": "symfony/http-foundation", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "11ad7352c7bfa12145a0df8e1c4c303c585ce169" + "reference": "22c4dee84271ad0cd08d19f26d89f2878e11159b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/11ad7352c7bfa12145a0df8e1c4c303c585ce169", - "reference": "11ad7352c7bfa12145a0df8e1c4c303c585ce169", + "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/22c4dee84271ad0cd08d19f26d89f2878e11159b", + "reference": "22c4dee84271ad0cd08d19f26d89f2878e11159b", "shasum": "" }, "require": { @@ -1075,7 +1075,7 @@ "require-dev": { "symfony/expression-language": "~2.4" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-18 21:02:05", "type": "library", "extra": { "branch-alias": { @@ -1112,18 +1112,18 @@ }, { "name": "symfony/http-kernel", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/HttpKernel", "source": { "type": "git", "url": "https://github.com/symfony/HttpKernel.git", - "reference": "f4e3f0fd1a08c1c4e2ffa044e6910f7ecc7ad317" + "reference": "0e4410de0f39603d4c44b75fe399470e7de89dc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/f4e3f0fd1a08c1c4e2ffa044e6910f7ecc7ad317", - "reference": "f4e3f0fd1a08c1c4e2ffa044e6910f7ecc7ad317", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/0e4410de0f39603d4c44b75fe399470e7de89dc4", + "reference": "0e4410de0f39603d4c44b75fe399470e7de89dc4", "shasum": "" }, "require": { @@ -1153,7 +1153,7 @@ "symfony/dependency-injection": "", "symfony/finder": "" }, - "time": "2014-04-04 10:27:02", + "time": "2014-04-27 13:39:18", "type": "library", "extra": { "branch-alias": { @@ -1187,18 +1187,18 @@ }, { "name": "symfony/security", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Security", "source": { "type": "git", "url": "https://github.com/symfony/Security.git", - "reference": "ef511d47c94ad92e37112b43efcbf7da8696a803" + "reference": "1f2b6d8dfea39071748becf040c8d8a23288e725" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Security/zipball/ef511d47c94ad92e37112b43efcbf7da8696a803", - "reference": "ef511d47c94ad92e37112b43efcbf7da8696a803", + "url": "https://api.github.com/repos/symfony/Security/zipball/1f2b6d8dfea39071748becf040c8d8a23288e725", + "reference": "1f2b6d8dfea39071748becf040c8d8a23288e725", "shasum": "" }, "require": { @@ -1231,7 +1231,7 @@ "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", "symfony/validator": "For using the user password constraint" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-25 07:06:20", "type": "library", "extra": { "branch-alias": { @@ -1265,18 +1265,18 @@ }, { "name": "symfony/twig-bridge", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Bridge/Twig", "source": { "type": "git", "url": "https://github.com/symfony/TwigBridge.git", - "reference": "2fc685dfe3aabb4b6d8b69f93d81eaafc94ab5c7" + "reference": "c34d6f5a808c55139dcf403ab8977e2e1cfbbf32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/2fc685dfe3aabb4b6d8b69f93d81eaafc94ab5c7", - "reference": "2fc685dfe3aabb4b6d8b69f93d81eaafc94ab5c7", + "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/c34d6f5a808c55139dcf403ab8977e2e1cfbbf32", + "reference": "c34d6f5a808c55139dcf403ab8977e2e1cfbbf32", "shasum": "" }, "require": { @@ -1306,7 +1306,7 @@ "symfony/translation": "For using the TranslationExtension", "symfony/yaml": "For using the YamlExtension" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-18 20:37:09", "type": "symfony-bridge", "extra": { "branch-alias": { @@ -1340,18 +1340,18 @@ }, { "name": "symfony/twig-bundle", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Bundle/TwigBundle", "source": { "type": "git", "url": "https://github.com/symfony/TwigBundle.git", - "reference": "845d7c6099fcde1f779c688468107e2d30590ae7" + "reference": "84a54ec515b2887815ddd0e86f1a0e12fbeb0f07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/TwigBundle/zipball/845d7c6099fcde1f779c688468107e2d30590ae7", - "reference": "845d7c6099fcde1f779c688468107e2d30590ae7", + "url": "https://api.github.com/repos/symfony/TwigBundle/zipball/84a54ec515b2887815ddd0e86f1a0e12fbeb0f07", + "reference": "84a54ec515b2887815ddd0e86f1a0e12fbeb0f07", "shasum": "" }, "require": { @@ -1364,7 +1364,7 @@ "symfony/dependency-injection": "~2.0", "symfony/stopwatch": "~2.2" }, - "time": "2014-03-01 17:35:04", + "time": "2014-04-16 10:34:31", "type": "symfony-bundle", "extra": { "branch-alias": { @@ -1398,18 +1398,18 @@ }, { "name": "symfony/translation", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Translation", "source": { "type": "git", "url": "https://github.com/symfony/Translation.git", - "reference": "98697a79a0db83d6f9a3a609a0704f02571ab46c" + "reference": "d2c73ffa4a5ba1fa0c5d93f43b68331dffe898c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/98697a79a0db83d6f9a3a609a0704f02571ab46c", - "reference": "98697a79a0db83d6f9a3a609a0704f02571ab46c", + "url": "https://api.github.com/repos/symfony/Translation/zipball/d2c73ffa4a5ba1fa0c5d93f43b68331dffe898c5", + "reference": "d2c73ffa4a5ba1fa0c5d93f43b68331dffe898c5", "shasum": "" }, "require": { @@ -1423,7 +1423,7 @@ "symfony/config": "", "symfony/yaml": "" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-18 21:02:05", "type": "library", "extra": { "branch-alias": { @@ -1457,18 +1457,18 @@ }, { "name": "symfony/templating", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Templating", "source": { "type": "git", "url": "https://github.com/symfony/Templating.git", - "reference": "2bd48c405223b719d3e38e9f071e00bdc4a9a780" + "reference": "bc13dddde3e542a1bacde4b3c4dd5c9ddab9456d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Templating/zipball/2bd48c405223b719d3e38e9f071e00bdc4a9a780", - "reference": "2bd48c405223b719d3e38e9f071e00bdc4a9a780", + "url": "https://api.github.com/repos/symfony/Templating/zipball/bc13dddde3e542a1bacde4b3c4dd5c9ddab9456d", + "reference": "bc13dddde3e542a1bacde4b3c4dd5c9ddab9456d", "shasum": "" }, "require": { @@ -1480,7 +1480,7 @@ "suggest": { "psr/log": "For using debug logging in loaders" }, - "time": "2014-02-11 15:39:28", + "time": "2014-04-16 10:34:31", "type": "library", "extra": { "branch-alias": { @@ -1514,24 +1514,24 @@ }, { "name": "symfony/stopwatch", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Stopwatch", "source": { "type": "git", "url": "https://github.com/symfony/Stopwatch.git", - "reference": "bffad325e36a3e71fba6d5dcce6e2f4b4637b91a" + "reference": "343bcc0360f2c22f371884b8f6a9fee8d1aa431a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/bffad325e36a3e71fba6d5dcce6e2f4b4637b91a", - "reference": "bffad325e36a3e71fba6d5dcce6e2f4b4637b91a", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/343bcc0360f2c22f371884b8f6a9fee8d1aa431a", + "reference": "343bcc0360f2c22f371884b8f6a9fee8d1aa431a", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-02-11 13:52:09", + "time": "2014-04-18 20:37:09", "type": "library", "extra": { "branch-alias": { @@ -1565,18 +1565,18 @@ }, { "name": "symfony/routing", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Routing", "source": { "type": "git", "url": "https://github.com/symfony/Routing.git", - "reference": "b2fdea8b60400bb84e4931d71101ebbb3a08c1eb" + "reference": "74229f66e16bce6d2415ca44d4756f8e7ea880f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/b2fdea8b60400bb84e4931d71101ebbb3a08c1eb", - "reference": "b2fdea8b60400bb84e4931d71101ebbb3a08c1eb", + "url": "https://api.github.com/repos/symfony/Routing/zipball/74229f66e16bce6d2415ca44d4756f8e7ea880f8", + "reference": "74229f66e16bce6d2415ca44d4756f8e7ea880f8", "shasum": "" }, "require": { @@ -1595,7 +1595,7 @@ "symfony/expression-language": "For using expression matching", "symfony/yaml": "For using the YAML loader" }, - "time": "2014-02-11 13:52:09", + "time": "2014-04-23 14:04:21", "type": "library", "extra": { "branch-alias": { @@ -1635,24 +1635,24 @@ }, { "name": "symfony/filesystem", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Filesystem", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "b717952487176a993e9b12a08b87beae25ae419c" + "reference": "a3af8294bcce4a7c1b2892363b0c9d8109affad4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/b717952487176a993e9b12a08b87beae25ae419c", - "reference": "b717952487176a993e9b12a08b87beae25ae419c", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a3af8294bcce4a7c1b2892363b0c9d8109affad4", + "reference": "a3af8294bcce4a7c1b2892363b0c9d8109affad4", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-03-26 11:55:03", + "time": "2014-04-16 10:34:31", "type": "library", "extra": { "branch-alias": { @@ -1686,25 +1686,25 @@ }, { "name": "symfony/config", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Config", "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "e98693981385224bd31667e56204f311d9e0f98e" + "reference": "2effc67af6f21a0d267210b72d0b0b691d113528" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/e98693981385224bd31667e56204f311d9e0f98e", - "reference": "e98693981385224bd31667e56204f311d9e0f98e", + "url": "https://api.github.com/repos/symfony/Config/zipball/2effc67af6f21a0d267210b72d0b0b691d113528", + "reference": "2effc67af6f21a0d267210b72d0b0b691d113528", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/filesystem": "~2.3" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-22 08:11:06", "type": "library", "extra": { "branch-alias": { @@ -1738,18 +1738,18 @@ }, { "name": "symfony/dependency-injection", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/DependencyInjection", "source": { "type": "git", "url": "https://github.com/symfony/DependencyInjection.git", - "reference": "5f17442aaa47610fcff7daeb635c834be71df204" + "reference": "f4f947f83aa2f1706ec8cf4f4ead6c85ea935156" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/5f17442aaa47610fcff7daeb635c834be71df204", - "reference": "5f17442aaa47610fcff7daeb635c834be71df204", + "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/f4f947f83aa2f1706ec8cf4f4ead6c85ea935156", + "reference": "f4f947f83aa2f1706ec8cf4f4ead6c85ea935156", "shasum": "" }, "require": { @@ -1765,7 +1765,7 @@ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", "symfony/yaml": "" }, - "time": "2014-03-27 14:53:17", + "time": "2014-04-18 20:38:54", "type": "library", "extra": { "branch-alias": { @@ -1799,18 +1799,18 @@ }, { "name": "symfony/framework-bundle", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Bundle/FrameworkBundle", "source": { "type": "git", "url": "https://github.com/symfony/FrameworkBundle.git", - "reference": "1e654ae8b6319e72cc082fc579ee170ee53a9852" + "reference": "1a0274c17c8073d665f7a4829d4ce61851bb2260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/FrameworkBundle/zipball/1e654ae8b6319e72cc082fc579ee170ee53a9852", - "reference": "1e654ae8b6319e72cc082fc579ee170ee53a9852", + "url": "https://api.github.com/repos/symfony/FrameworkBundle/zipball/1a0274c17c8073d665f7a4829d4ce61851bb2260", + "reference": "1a0274c17c8073d665f7a4829d4ce61851bb2260", "shasum": "" }, "require": { @@ -1843,7 +1843,7 @@ "symfony/form": "For using forms", "symfony/validator": "For using validation" }, - "time": "2014-03-26 17:53:45", + "time": "2014-04-22 08:11:06", "type": "symfony-bundle", "extra": { "branch-alias": { @@ -2210,12 +2210,12 @@ "source": { "type": "git", "url": "https://github.com/avalanche123/Imagine.git", - "reference": "f93b6895f4567136528448263cc1fe71ee8504ce" + "reference": "2a6c047472c43032b2718d3a31aee6f982f2980c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/avalanche123/Imagine/zipball/f93b6895f4567136528448263cc1fe71ee8504ce", - "reference": "f93b6895f4567136528448263cc1fe71ee8504ce", + "url": "https://api.github.com/repos/avalanche123/Imagine/zipball/2a6c047472c43032b2718d3a31aee6f982f2980c", + "reference": "2a6c047472c43032b2718d3a31aee6f982f2980c", "shasum": "" }, "require": { @@ -2229,7 +2229,7 @@ "ext-gmagick": "to use the Gmagick implementation", "ext-imagick": "to use the Imagick implementation" }, - "time": "2014-04-09 21:47:26", + "time": "2014-04-22 05:38:05", "type": "library", "extra": { "branch-alias": { @@ -2269,12 +2269,12 @@ "source": { "type": "git", "url": "https://github.com/KnpLabs/snappy.git", - "reference": "9d7bd2e806e68acf6216c8b7eca7ddd774d0aebf" + "reference": "84c9b58713ed7654a51c738c2ba0415d5ef6be72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/snappy/zipball/9d7bd2e806e68acf6216c8b7eca7ddd774d0aebf", - "reference": "9d7bd2e806e68acf6216c8b7eca7ddd774d0aebf", + "url": "https://api.github.com/repos/KnpLabs/snappy/zipball/84c9b58713ed7654a51c738c2ba0415d5ef6be72", + "reference": "84c9b58713ed7654a51c738c2ba0415d5ef6be72", "shasum": "" }, "require": { @@ -2285,7 +2285,7 @@ "google/wkhtmltopdf-i386": "Provide wkhtmltopdf-i386 binary, use version `0.11.0-RC1` as dependency", "symfony/process": "Process Component of Symfony2." }, - "time": "2014-04-04 13:17:48", + "time": "2014-03-24 18:43:40", "type": "library", "extra": { "branch-alias": { @@ -2667,24 +2667,24 @@ }, { "name": "symfony/process", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Process", "source": { "type": "git", "url": "https://github.com/symfony/Process.git", - "reference": "c09c3b08455c35688eee3e481fdfc85518ef01d7" + "reference": "8721f1476d5d38a43c7d6ccb6435b351cf8f3bb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/c09c3b08455c35688eee3e481fdfc85518ef01d7", - "reference": "c09c3b08455c35688eee3e481fdfc85518ef01d7", + "url": "https://api.github.com/repos/symfony/Process/zipball/8721f1476d5d38a43c7d6ccb6435b351cf8f3bb7", + "reference": "8721f1476d5d38a43c7d6ccb6435b351cf8f3bb7", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-03-26 11:35:33", + "time": "2014-04-27 13:34:57", "type": "library", "extra": { "branch-alias": { @@ -2718,23 +2718,23 @@ }, { "name": "guzzle/guzzle", - "version": "v3.8.1", - "version_normalized": "3.8.1.0", + "version": "v3.9.0", + "version_normalized": "3.9.0.0", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" + "url": "https://github.com/guzzle/guzzle3.git", + "reference": "e4d12d7d6acccf75a5e504114e2df9195e494108" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", - "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/e4d12d7d6acccf75a5e504114e2df9195e494108", + "reference": "e4d12d7d6acccf75a5e504114e2df9195e494108", "shasum": "" }, "require": { "ext-curl": "*", "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1" + "symfony/event-dispatcher": "~2.1" }, "replace": { "guzzle/batch": "self.version", @@ -2761,15 +2761,15 @@ "guzzle/stream": "self.version" }, "require-dev": { - "doctrine/cache": "*", - "monolog/monolog": "1.*", + "doctrine/cache": "~1.3", + "monolog/monolog": "~1.0", "phpunit/phpunit": "3.7.*", - "psr/log": "1.0.*", - "symfony/class-loader": "*", - "zendframework/zend-cache": "<2.3", - "zendframework/zend-log": "<2.3" + "psr/log": "~1.0", + "symfony/class-loader": "~2.1", + "zendframework/zend-cache": "2.*,<2.3", + "zendframework/zend-log": "2.*,<2.3" }, - "time": "2014-01-28 22:29:15", + "time": "2014-04-23 21:43:40", "type": "library", "extra": { "branch-alias": { @@ -3262,24 +3262,24 @@ }, { "name": "symfony/yaml", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", "target-dir": "Symfony/Component/Yaml", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "77a41c2835ab7cfe8bf6d15e25d3af8f3eb3bacd" + "reference": "65539ecde838f9c0d18b006b2101e3deb4b5c9ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/77a41c2835ab7cfe8bf6d15e25d3af8f3eb3bacd", - "reference": "77a41c2835ab7cfe8bf6d15e25d3af8f3eb3bacd", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/65539ecde838f9c0d18b006b2101e3deb4b5c9ff", + "reference": "65539ecde838f9c0d18b006b2101e3deb4b5c9ff", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2014-03-12 18:29:58", + "time": "2014-04-18 20:37:09", "type": "library", "extra": { "branch-alias": { @@ -3318,12 +3318,12 @@ "source": { "type": "git", "url": "https://github.com/chamilo/chash.git", - "reference": "a5d78cb0d44f5d565d325cd387169304d32ad03f" + "reference": "aba27ef17cd839cf9b20e72b5e9e340fc583733b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chamilo/chash/zipball/a5d78cb0d44f5d565d325cd387169304d32ad03f", - "reference": "a5d78cb0d44f5d565d325cd387169304d32ad03f", + "url": "https://api.github.com/repos/chamilo/chash/zipball/aba27ef17cd839cf9b20e72b5e9e340fc583733b", + "reference": "aba27ef17cd839cf9b20e72b5e9e340fc583733b", "shasum": "" }, "require": { @@ -3344,7 +3344,7 @@ "mikey179/vfsstream": ">=1.2", "phpunit/phpunit": "3.7.*" }, - "time": "2014-04-13 18:23:29", + "time": "2014-04-15 10:09:19", "type": "library", "installation-source": "source", "autoload": { @@ -3702,17 +3702,17 @@ }, { "name": "monolog/monolog", - "version": "1.8.0", - "version_normalized": "1.8.0.0", + "version": "1.9.1", + "version_normalized": "1.9.1.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "392ef35fd470638e08d0160d6b1cbab63cb23174" + "reference": "65026b610f8c19e61d7242f600530677b0466aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/392ef35fd470638e08d0160d6b1cbab63cb23174", - "reference": "392ef35fd470638e08d0160d6b1cbab63cb23174", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/65026b610f8c19e61d7242f600530677b0466aac", + "reference": "65026b610f8c19e61d7242f600530677b0466aac", "shasum": "" }, "require": { @@ -3737,11 +3737,11 @@ "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, - "time": "2014-03-23 19:50:26", + "time": "2014-04-24 13:29:03", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8.x-dev" + "dev-master": "1.9.x-dev" } }, "installation-source": "dist", @@ -4487,6 +4487,70 @@ "parser" ] }, + { + "name": "league/flysystem", + "version": "0.3.3", + "version_normalized": "0.3.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "387e012fa93878e3865ed8db1aa9daba8bf2f9c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/387e012fa93878e3865ed8db1aa9daba8bf2f9c5", + "reference": "387e012fa93878e3865ed8db1aa9daba8bf2f9c5", + "shasum": "" + }, + "require-dev": { + "aws/aws-sdk-php": "~2.5", + "dropbox/dropbox-sdk": "~1.1.1", + "league/phpunit-coverage-listener": "~1.0", + "mockery/mockery": "~0.9", + "phpseclib/phpseclib": "~0.3.5", + "phpunit/phpunit": "~4.0", + "predis/predis": "~0.8.4", + "rackspace/php-opencloud": "~1.9.1", + "sabre/dav": "~1.8.7" + }, + "suggest": { + "aws/aws-sdk-php": "Allows you to use AWS S3 storage", + "dropbox/dropbox-sdk": "Allows you to use Dropbox storage", + "phpseclib/phpseclib": "Allows SFTP server storage", + "predis/predis": "Allows you to use Predis for caching", + "rackspace/php-opencloud": "Allows you to use Rackspace Cloud Files", + "sabre/dav": "Enables WebDav support" + }, + "time": "2014-04-11 20:02:14", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction, but easy.", + "keywords": [ + "WebDAV", + "aws", + "dropbox", + "filesystem", + "ftp", + "remote", + "s3", + "sftp" + ] + }, { "name": "natxet/CssMin", "version": "dev-master", @@ -4538,15 +4602,15 @@ "source": { "type": "git", "url": "https://github.com/leafo/lessphp.git", - "reference": "b7cd5c79e82666bcd2dfadb304342311209fb527" + "reference": "011afcca8e6f1000a6e789921ba805fa578271a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/leafo/lessphp/zipball/b7cd5c79e82666bcd2dfadb304342311209fb527", - "reference": "b7cd5c79e82666bcd2dfadb304342311209fb527", + "url": "https://api.github.com/repos/leafo/lessphp/zipball/011afcca8e6f1000a6e789921ba805fa578271a3", + "reference": "011afcca8e6f1000a6e789921ba805fa578271a3", "shasum": "" }, - "time": "2014-02-05 19:36:35", + "time": "2014-04-27 02:56:30", "type": "library", "extra": { "branch-alias": { @@ -4581,22 +4645,21 @@ "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "f6b790e41c4a870b4ebcd09b2a13840ed2263d1a" + "reference": "614f0de7c888c8c81f74cd28ac6fd0268c4633e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/f6b790e41c4a870b4ebcd09b2a13840ed2263d1a", - "reference": "f6b790e41c4a870b4ebcd09b2a13840ed2263d1a", + "url": "https://api.github.com/repos/filp/whoops/zipball/614f0de7c888c8c81f74cd28ac6fd0268c4633e6", + "reference": "614f0de7c888c8c81f74cd28ac6fd0268c4633e6", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "mockery/mockery": "0.9.*", - "php": ">=5.3.3" + "mockery/mockery": "0.9.*" }, - "time": "2014-03-31 09:08:37", + "time": "2014-04-20 02:14:11", "type": "library", "extra": { "branch-alias": { @@ -4636,46 +4699,34 @@ ] }, { - "name": "symfony/doctrine-bridge", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Bridge/Doctrine", + "name": "symfony/web-profiler-bundle", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Bundle/WebProfilerBundle", "source": { "type": "git", - "url": "https://github.com/symfony/DoctrineBridge.git", - "reference": "dec8ae317321c9646ff259b5adf53aae3f989f85" + "url": "https://github.com/symfony/WebProfilerBundle.git", + "reference": "b37cb2135afa512a61088217518c699af04cffe9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DoctrineBridge/zipball/dec8ae317321c9646ff259b5adf53aae3f989f85", - "reference": "dec8ae317321c9646ff259b5adf53aae3f989f85", + "url": "https://api.github.com/repos/symfony/WebProfilerBundle/zipball/b37cb2135afa512a61088217518c699af04cffe9", + "reference": "b37cb2135afa512a61088217518c699af04cffe9", "shasum": "" }, "require": { - "doctrine/common": "~2.2", - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/http-kernel": "~2.2", + "symfony/routing": "~2.2", + "symfony/twig-bridge": "~2.2" }, "require-dev": { - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.2", - "doctrine/orm": "~2.2,>=2.2.3", + "symfony/config": "~2.2", "symfony/dependency-injection": "~2.0", - "symfony/expression-language": "~2.2", - "symfony/form": "~2.2", - "symfony/http-kernel": "~2.2", - "symfony/security": "~2.2", - "symfony/stopwatch": "~2.2", - "symfony/validator": "~2.2" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/validator": "" + "symfony/stopwatch": "~2.2" }, - "time": "2014-02-11 13:52:09", - "type": "symfony-bridge", + "time": "2014-04-27 13:34:57", + "type": "symfony-bundle", "extra": { "branch-alias": { "dev-master": "2.4-dev" @@ -4684,7 +4735,7 @@ "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Bridge\\Doctrine\\": "" + "Symfony\\Bundle\\WebProfilerBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4703,57 +4754,41 @@ "homepage": "http://symfony.com/contributors" } ], - "description": "Symfony Doctrine Bridge", + "description": "Symfony WebProfilerBundle", "homepage": "http://symfony.com" }, { - "name": "symfony/validator", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Component/Validator", + "name": "silex/web-profiler", + "version": "v1.0.2", + "version_normalized": "1.0.2.0", + "target-dir": "Silex/Provider", "source": { "type": "git", - "url": "https://github.com/symfony/Validator.git", - "reference": "df98095dbe1a17a12dec8986fe2deacd3d845e72" + "url": "https://github.com/silexphp/Silex-WebProfiler.git", + "reference": "06bd4fcd563d1e114e5c1768dd87da771846fee6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Validator/zipball/df98095dbe1a17a12dec8986fe2deacd3d845e72", - "reference": "df98095dbe1a17a12dec8986fe2deacd3d845e72", + "url": "https://api.github.com/repos/silexphp/Silex-WebProfiler/zipball/06bd4fcd563d1e114e5c1768dd87da771846fee6", + "reference": "06bd4fcd563d1e114e5c1768dd87da771846fee6", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/property-access": "~2.2", - "symfony/translation": "~2.0" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "symfony/config": "~2.2", - "symfony/http-foundation": "~2.1", - "symfony/intl": "~2.3", - "symfony/yaml": "~2.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader", - "symfony/config": "", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/yaml": "" + "silex/silex": "~1.0", + "symfony/stopwatch": "~2.2", + "symfony/web-profiler-bundle": "~2.2" }, - "time": "2014-03-26 18:07:42", + "time": "2013-12-05 21:22:21", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Component\\Validator\\": "" + "Silex\\Provider\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4766,165 +4801,648 @@ "email": "fabien@symfony.com", "homepage": "http://fabien.potencier.org", "role": "Lead Developer" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" } ], - "description": "Symfony Validator Component", - "homepage": "http://symfony.com" + "description": "A WebProfiler for Silex", + "homepage": "http://silex.sensiolabs.org/" }, { - "name": "symfony/locale", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Component/Locale", + "name": "jmontoyaa/xhprof-service-provider", + "version": "dev-master", + "version_normalized": "9999999-dev", "source": { "type": "git", - "url": "https://github.com/symfony/Locale.git", - "reference": "7f38bea9f5afb24d720931dd4469fbc798bcce63" + "url": "https://github.com/jmontoyaa/XHProfServiceProvider.git", + "reference": "5d5477c99f4d808edd200830fa2cecc8e8a86ae5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Locale/zipball/7f38bea9f5afb24d720931dd4469fbc798bcce63", - "reference": "7f38bea9f5afb24d720931dd4469fbc798bcce63", + "url": "https://api.github.com/repos/jmontoyaa/XHProfServiceProvider/zipball/5d5477c99f4d808edd200830fa2cecc8e8a86ae5", + "reference": "5d5477c99f4d808edd200830fa2cecc8e8a86ae5", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/intl": ">=2.3" + "silex/web-profiler": "~1.0@dev", + "symfony/finder": "~2.3" }, - "time": "2014-01-07 13:28:54", + "time": "2014-05-02 12:38:31", "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "installation-source": "dist", + "installation-source": "source", "autoload": { "psr-0": { - "Symfony\\Component\\Locale\\": "" + "Oziks": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Morgan Brunot", + "email": "brunot.morgan@gmail.com", + "homepage": "http://oziks.fr" } ], - "description": "Symfony Locale Component", - "homepage": "http://symfony.com" + "description": "XHProf service provider for Silex.", + "homepage": "https://github.com/oziks/XHProfServiceProvider", + "keywords": [ + "debug", + "silex", + "toolbar", + "xhprof" + ], + "support": { + "source": "https://github.com/jmontoyaa/XHProfServiceProvider/tree/master" + } }, { - "name": "symfony/monolog-bridge", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Bridge/Monolog", + "name": "zendframework/zend-validator", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "target-dir": "Zend/Validator", "source": { "type": "git", - "url": "https://github.com/symfony/MonologBridge.git", - "reference": "041d2c9ead709bed730eda07882b62dba8233ba2" + "url": "https://github.com/zendframework/Component_ZendValidator.git", + "reference": "1d4526a1f7db36d725a3a526d8951c1a6d0d69b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/MonologBridge/zipball/041d2c9ead709bed730eda07882b62dba8233ba2", - "reference": "041d2c9ead709bed730eda07882b62dba8233ba2", + "url": "https://api.github.com/repos/zendframework/Component_ZendValidator/zipball/1d4526a1f7db36d725a3a526d8951c1a6d0d69b3", + "reference": "1d4526a1f7db36d725a3a526d8951c1a6d0d69b3", "shasum": "" }, "require": { - "monolog/monolog": "~1.3", - "php": ">=5.3.3" + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "symfony/console": "~2.3", - "symfony/event-dispatcher": "~2.2", - "symfony/http-kernel": "~2.2" + "zendframework/zend-db": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-uri": "self.version" }, "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.", - "symfony/event-dispatcher": "Needed when using log messages in console commands", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel." - }, - "time": "2014-01-07 13:28:54", - "type": "symfony-bridge", + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator", + "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages as well as to use the various Date validators", + "zendframework/zend-math": "Zend\\Math component", + "zendframework/zend-resources": "Translations of validator messages", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "zendframework/zend-session": "Zend\\Session component", + "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators" + }, + "time": "2014-03-14 16:22:37", + "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Bridge\\Monolog\\": "" + "Zend\\Validator\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } + "BSD-3-Clause" ], - "description": "Symfony Monolog Bridge", - "homepage": "http://symfony.com" + "description": "provides a set of commonly needed validators", + "keywords": [ + "validator", + "zf2" + ] }, { - "name": "dflydev/doctrine-orm-service-provider", - "version": "dev-master", - "version_normalized": "9999999-dev", + "name": "zendframework/zend-escaper", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "target-dir": "Zend/Escaper", "source": { "type": "git", - "url": "https://github.com/dflydev/dflydev-doctrine-orm-service-provider.git", - "reference": "3e5aaadd536b38cb8c6cc5bfbe220ff7d366b206" + "url": "https://github.com/zendframework/Component_ZendEscaper.git", + "reference": "ec2614db2ea860c5765a0adba687eacb365ad355" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-doctrine-orm-service-provider/zipball/3e5aaadd536b38cb8c6cc5bfbe220ff7d366b206", - "reference": "3e5aaadd536b38cb8c6cc5bfbe220ff7d366b206", + "url": "https://api.github.com/repos/zendframework/Component_ZendEscaper/zipball/ec2614db2ea860c5765a0adba687eacb365ad355", + "reference": "ec2614db2ea860c5765a0adba687eacb365ad355", "shasum": "" }, "require": { - "doctrine/orm": "~2.3", - "php": ">=5.3.3", - "pimple/pimple": "1.*@dev" - }, - "require-dev": { - "cilex/cilex": "1.*@dev", - "cilex/console-service-provider": "@dev", - "silex/silex": "1.*@dev" - }, - "suggest": { - "dflydev/psr0-resource-locator-service-provider": "1.0.*@dev" + "php": ">=5.3.23" }, - "time": "2014-01-21 21:52:29", + "time": "2014-03-14 16:21:02", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" } }, - "installation-source": "source", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Zend\\Escaper\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "keywords": [ + "escaper", + "zf2" + ] + }, + { + "name": "zendframework/zend-uri", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "target-dir": "Zend/Uri", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendUri.git", + "reference": "83e617b6273625eeb771c8fb3e886a728fd9dfa4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendUri/zipball/83e617b6273625eeb771c8fb3e886a728fd9dfa4", + "reference": "83e617b6273625eeb771c8fb3e886a728fd9dfa4", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-validator": "self.version" + }, + "time": "2014-03-14 16:22:34", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Zend\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", + "keywords": [ + "uri", + "zf2" + ] + }, + { + "name": "zendframework/zend-loader", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "target-dir": "Zend/Loader", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendLoader.git", + "reference": "517f39de5c547d438556e86c270b384c9dee5b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendLoader/zipball/517f39de5c547d438556e86c270b384c9dee5b18", + "reference": "517f39de5c547d438556e86c270b384c9dee5b18", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "time": "2014-03-14 16:21:32", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Zend\\Loader\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "keywords": [ + "loader", + "zf2" + ] + }, + { + "name": "zendframework/zend-http", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "target-dir": "Zend/Http", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendHttp.git", + "reference": "6d4314b1e3309071f3ab958186911296d70fe5fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendHttp/zipball/6d4314b1e3309071f3ab958186911296d70fe5fe", + "reference": "6d4314b1e3309071f3ab958186911296d70fe5fe", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version" + }, + "time": "2014-03-14 16:21:21", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Zend\\Http\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", + "keywords": [ + "http", + "zf2" + ] + }, + { + "name": "zendframework/zend-feed", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "target-dir": "Zend/Feed", + "source": { + "type": "git", + "url": "https://github.com/zendframework/Component_ZendFeed.git", + "reference": "0977af0912d2b3529d04384420a282dbf230e60a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/Component_ZendFeed/zipball/0977af0912d2b3529d04384420a282dbf230e60a", + "reference": "0977af0912d2b3529d04384420a282dbf230e60a", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-cache": "self.version", + "zendframework/zend-db": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version" + }, + "suggest": { + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-http": "Zend\\Http for PubSubHubbub, and optionally for use with Zend\\Feed\\Reader", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for default/recommended ExtensionManager implementations", + "zendframework/zend-validator": "Zend\\Validator component" + }, + "time": "2014-03-14 16:21:10", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Zend\\Feed\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides functionality for consuming RSS and Atom feeds", + "keywords": [ + "feed", + "zf2" + ] + }, + { + "name": "symfony/doctrine-bridge", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Bridge/Doctrine", + "source": { + "type": "git", + "url": "https://github.com/symfony/DoctrineBridge.git", + "reference": "d55cacd9702c45ec7a94892a9e2d7022f8ad6cb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DoctrineBridge/zipball/d55cacd9702c45ec7a94892a9e2d7022f8ad6cb7", + "reference": "d55cacd9702c45ec7a94892a9e2d7022f8ad6cb7", + "shasum": "" + }, + "require": { + "doctrine/common": "~2.2", + "php": ">=5.3.3" + }, + "require-dev": { + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.2", + "doctrine/orm": "~2.2,>=2.2.3", + "symfony/dependency-injection": "~2.0", + "symfony/expression-language": "~2.2", + "symfony/form": "~2.2", + "symfony/http-kernel": "~2.2", + "symfony/security": "~2.2", + "symfony/stopwatch": "~2.2", + "symfony/validator": "~2.2" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/validator": "" + }, + "time": "2014-04-27 13:34:57", + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Symfony\\Bridge\\Doctrine\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "http://symfony.com" + }, + { + "name": "symfony/validator", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Component/Validator", + "source": { + "type": "git", + "url": "https://github.com/symfony/Validator.git", + "reference": "5bbcdcc520bc7fb3826abb44020880f14c9c03a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Validator/zipball/5bbcdcc520bc7fb3826abb44020880f14c9c03a7", + "reference": "5bbcdcc520bc7fb3826abb44020880f14c9c03a7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/property-access": "~2.2", + "symfony/translation": "~2.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "symfony/config": "~2.2", + "symfony/http-foundation": "~2.1", + "symfony/intl": "~2.3", + "symfony/yaml": "~2.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader", + "symfony/config": "", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/yaml": "" + }, + "time": "2014-04-27 13:34:57", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Symfony\\Component\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "http://symfony.com" + }, + { + "name": "symfony/locale", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Component/Locale", + "source": { + "type": "git", + "url": "https://github.com/symfony/Locale.git", + "reference": "8a8bca790a6fa20192c464155368e183b0686fbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Locale/zipball/8a8bca790a6fa20192c464155368e183b0686fbf", + "reference": "8a8bca790a6fa20192c464155368e183b0686fbf", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": ">=2.3" + }, + "time": "2014-04-18 20:37:09", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Symfony\\Component\\Locale\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Locale Component", + "homepage": "http://symfony.com" + }, + { + "name": "symfony/monolog-bridge", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Bridge/Monolog", + "source": { + "type": "git", + "url": "https://github.com/symfony/MonologBridge.git", + "reference": "46325ecbcf9f7ca71445bcbaca98e59b5cb7301b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/MonologBridge/zipball/46325ecbcf9f7ca71445bcbaca98e59b5cb7301b", + "reference": "46325ecbcf9f7ca71445bcbaca98e59b5cb7301b", + "shasum": "" + }, + "require": { + "monolog/monolog": "~1.3", + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.2", + "symfony/http-kernel": "~2.2" + }, + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.", + "symfony/event-dispatcher": "Needed when using log messages in console commands", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel." + }, + "time": "2014-04-16 10:34:42", + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Symfony\\Bridge\\Monolog\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Monolog Bridge", + "homepage": "http://symfony.com" + }, + { + "name": "dflydev/doctrine-orm-service-provider", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-doctrine-orm-service-provider.git", + "reference": "3e5aaadd536b38cb8c6cc5bfbe220ff7d366b206" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-doctrine-orm-service-provider/zipball/3e5aaadd536b38cb8c6cc5bfbe220ff7d366b206", + "reference": "3e5aaadd536b38cb8c6cc5bfbe220ff7d366b206", + "shasum": "" + }, + "require": { + "doctrine/orm": "~2.3", + "php": ">=5.3.3", + "pimple/pimple": "1.*@dev" + }, + "require-dev": { + "cilex/cilex": "1.*@dev", + "cilex/console-service-provider": "@dev", + "silex/silex": "1.*@dev" + }, + "suggest": { + "dflydev/psr0-resource-locator-service-provider": "1.0.*@dev" + }, + "time": "2014-01-21 21:52:29", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "source", "autoload": { "psr-0": { "Dflydev\\Cilex\\Provider\\DoctrineOrm": "src", @@ -5281,12 +5799,12 @@ "source": { "type": "git", "url": "https://github.com/KnpLabs/KnpMenu.git", - "reference": "7d9bcdc29b49c3fc671a9c22885176f0ffe034c5" + "reference": "de645e813ddca4a1243db48bce5eaee8adb346a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/7d9bcdc29b49c3fc671a9c22885176f0ffe034c5", - "reference": "7d9bcdc29b49c3fc671a9c22885176f0ffe034c5", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/de645e813ddca4a1243db48bce5eaee8adb346a2", + "reference": "de645e813ddca4a1243db48bce5eaee8adb346a2", "shasum": "" }, "require": { @@ -5302,7 +5820,7 @@ "silex/silex": "for the integration with your silex application", "twig/twig": "for the TwigRenderer and the integration with your templates" }, - "time": "2014-04-08 20:25:33", + "time": "2014-05-01 19:50:28", "type": "library", "extra": { "branch-alias": { @@ -5392,150 +5910,194 @@ ] }, { - "name": "symfony/dom-crawler", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Component/DomCrawler", + "name": "zendframework/zend-servicemanager", + "version": "2.3.1", + "version_normalized": "2.3.1.0", + "target-dir": "Zend/ServiceManager", "source": { "type": "git", - "url": "https://github.com/symfony/DomCrawler.git", - "reference": "53667cc8b0334db049e388a2855a1a4732ab891c" + "url": "https://github.com/zendframework/Component_ZendServiceManager.git", + "reference": "652ab6e142b7afd1eede8f0f33b47d2599786c84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/53667cc8b0334db049e388a2855a1a4732ab891c", - "reference": "53667cc8b0334db049e388a2855a1a4732ab891c", + "url": "https://api.github.com/repos/zendframework/Component_ZendServiceManager/zipball/652ab6e142b7afd1eede8f0f33b47d2599786c84", + "reference": "652ab6e142b7afd1eede8f0f33b47d2599786c84", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.23" }, "require-dev": { - "symfony/css-selector": "~2.0" + "zendframework/zend-di": "self.version" }, "suggest": { - "symfony/css-selector": "" + "zendframework/zend-di": "Zend\\Di component" }, - "time": "2014-03-26 12:00:53", + "time": "2014-04-15 15:28:43", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Component\\DomCrawler\\": "" + "Zend\\ServiceManager\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } + "BSD-3-Clause" ], - "description": "Symfony DomCrawler Component", - "homepage": "http://symfony.com" + "keywords": [ + "servicemanager", + "zf2" + ] }, { - "name": "symfony/browser-kit", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Component/BrowserKit", + "name": "sabre/vobject", + "version": "3.2.0", + "version_normalized": "3.2.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/BrowserKit.git", - "reference": "1f5e42db799e05e85d03fe8504c5b1c92c46968d" + "url": "https://github.com/fruux/sabre-vobject.git", + "reference": "dd1dd19b6601cdc99408b70ec260052825f70b8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/1f5e42db799e05e85d03fe8504c5b1c92c46968d", - "reference": "1f5e42db799e05e85d03fe8504c5b1c92c46968d", + "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/dd1dd19b6601cdc99408b70ec260052825f70b8f", + "reference": "dd1dd19b6601cdc99408b70ec260052825f70b8f", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/dom-crawler": "~2.0" + "ext-mbstring": "*", + "php": ">=5.3.1" }, "require-dev": { - "symfony/css-selector": "~2.0", - "symfony/process": "~2.0" - }, - "suggest": { - "symfony/process": "" + "phpunit/phpunit": "*" }, - "time": "2014-03-27 14:53:17", + "time": "2014-04-02 23:53:27", + "bin": [ + "bin/vobject", + "bin/generate_vcards" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "3.2.x-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Component\\BrowserKit\\": "" + "Sabre\\VObject": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, + "name": "Evert Pot", + "email": "evert@rooftopsolutions.nl", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects", + "homepage": "https://github.com/fruux/sabre-vobject", + "keywords": [ + "VObject", + "iCalendar", + "jCal", + "jCard", + "vCard" + ] + }, + { + "name": "patchwork/utf8", + "version": "v1.1.21", + "version_normalized": "1.1.21.0", + "source": { + "type": "git", + "url": "https://github.com/nicolas-grekas/Patchwork-UTF8.git", + "reference": "f45ba8bc7962b7356847724989a6949b68d975a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nicolas-grekas/Patchwork-UTF8/zipball/f45ba8bc7962b7356847724989a6949b68d975a2", + "reference": "f45ba8bc7962b7356847724989a6949b68d975a2", + "shasum": "" + }, + "require": { + "lib-pcre": ">=7.3", + "php": ">=5.3.0" + }, + "suggest": { + "ext-iconv": "Use iconv for best performance", + "ext-intl": "Use Intl for best performance", + "ext-mbstring": "Use Mbstring for best performance" + }, + "time": "2014-03-26 10:52:02", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Patchwork": "class/", + "Normalizer": "class/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(Apache-2.0 or GPL-2.0)" + ], + "authors": [ { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Nicolas Grekas", + "email": "p@tchwork.com", + "role": "Developer" } ], - "description": "Symfony BrowserKit Component", - "homepage": "http://symfony.com" + "description": "Extensive, portable and performant handling of UTF-8 and grapheme clusters for PHP", + "homepage": "https://github.com/nicolas-grekas/Patchwork-UTF8", + "keywords": [ + "i18n", + "unicode", + "utf-8", + "utf8" + ] }, { - "name": "symfony/web-profiler-bundle", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", - "target-dir": "Symfony/Bundle/WebProfilerBundle", + "name": "symfony/dom-crawler", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Component/DomCrawler", "source": { "type": "git", - "url": "https://github.com/symfony/WebProfilerBundle.git", - "reference": "b7267d6c96cbfd1c52c55ada475da74fd4a0bb59" + "url": "https://github.com/symfony/DomCrawler.git", + "reference": "e94b29c7cac964e58c406408d238ceeaa3604e78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/WebProfilerBundle/zipball/b7267d6c96cbfd1c52c55ada475da74fd4a0bb59", - "reference": "b7267d6c96cbfd1c52c55ada475da74fd4a0bb59", + "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/e94b29c7cac964e58c406408d238ceeaa3604e78", + "reference": "e94b29c7cac964e58c406408d238ceeaa3604e78", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/http-kernel": "~2.2", - "symfony/routing": "~2.2", - "symfony/twig-bridge": "~2.2" + "php": ">=5.3.3" }, "require-dev": { - "symfony/config": "~2.2", - "symfony/dependency-injection": "~2.0", - "symfony/stopwatch": "~2.2" + "symfony/css-selector": "~2.0" }, - "time": "2014-02-11 13:52:09", - "type": "symfony-bundle", + "suggest": { + "symfony/css-selector": "" + }, + "time": "2014-04-18 20:37:09", + "type": "library", "extra": { "branch-alias": { "dev-master": "2.4-dev" @@ -5544,7 +6106,7 @@ "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" + "Symfony\\Component\\DomCrawler\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5563,41 +6125,47 @@ "homepage": "http://symfony.com/contributors" } ], - "description": "Symfony WebProfilerBundle", + "description": "Symfony DomCrawler Component", "homepage": "http://symfony.com" }, { - "name": "silex/web-profiler", - "version": "v1.0.2", - "version_normalized": "1.0.2.0", - "target-dir": "Silex/Provider", + "name": "symfony/browser-kit", + "version": "v2.4.4", + "version_normalized": "2.4.4.0", + "target-dir": "Symfony/Component/BrowserKit", "source": { "type": "git", - "url": "https://github.com/silexphp/Silex-WebProfiler.git", - "reference": "06bd4fcd563d1e114e5c1768dd87da771846fee6" + "url": "https://github.com/symfony/BrowserKit.git", + "reference": "90a4d3536598f8a372df8d0730daf0874fec6e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Silex-WebProfiler/zipball/06bd4fcd563d1e114e5c1768dd87da771846fee6", - "reference": "06bd4fcd563d1e114e5c1768dd87da771846fee6", + "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/90a4d3536598f8a372df8d0730daf0874fec6e5b", + "reference": "90a4d3536598f8a372df8d0730daf0874fec6e5b", "shasum": "" }, "require": { - "silex/silex": "~1.0", - "symfony/stopwatch": "~2.2", - "symfony/web-profiler-bundle": "~2.2" + "php": ">=5.3.3", + "symfony/dom-crawler": "~2.0" }, - "time": "2013-12-05 21:22:21", + "require-dev": { + "symfony/css-selector": "~2.0", + "symfony/process": "~2.0" + }, + "suggest": { + "symfony/process": "" + }, + "time": "2014-04-18 20:37:09", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.4-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { - "Silex\\Provider\\": "" + "Symfony\\Component\\BrowserKit\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -5610,10 +6178,14 @@ "email": "fabien@symfony.com", "homepage": "http://fabien.potencier.org", "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" } ], - "description": "A WebProfiler for Silex", - "homepage": "http://silex.sensiolabs.org/" + "description": "Symfony BrowserKit Component", + "homepage": "http://symfony.com" }, { "name": "kriswallsmith/assetic", @@ -5746,69 +6318,5 @@ "assetic", "silex" ] - }, - { - "name": "league/flysystem", - "version": "0.3.3", - "version_normalized": "0.3.3.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "387e012fa93878e3865ed8db1aa9daba8bf2f9c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/387e012fa93878e3865ed8db1aa9daba8bf2f9c5", - "reference": "387e012fa93878e3865ed8db1aa9daba8bf2f9c5", - "shasum": "" - }, - "require-dev": { - "aws/aws-sdk-php": "~2.5", - "dropbox/dropbox-sdk": "~1.1.1", - "league/phpunit-coverage-listener": "~1.0", - "mockery/mockery": "~0.9", - "phpseclib/phpseclib": "~0.3.5", - "phpunit/phpunit": "~4.0", - "predis/predis": "~0.8.4", - "rackspace/php-opencloud": "~1.9.1", - "sabre/dav": "~1.8.7" - }, - "suggest": { - "aws/aws-sdk-php": "Allows you to use AWS S3 storage", - "dropbox/dropbox-sdk": "Allows you to use Dropbox storage", - "phpseclib/phpseclib": "Allows SFTP server storage", - "predis/predis": "Allows you to use Predis for caching", - "rackspace/php-opencloud": "Allows you to use Rackspace Cloud Files", - "sabre/dav": "Enables WebDav support" - }, - "time": "2014-04-11 20:02:14", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction, but easy.", - "keywords": [ - "WebDAV", - "aws", - "dropbox", - "filesystem", - "ftp", - "remote", - "s3", - "sftp" - ] } ] diff --git a/vendor/filp/whoops/README.md b/vendor/filp/whoops/README.md index e093243677..147a85afb6 100644 --- a/vendor/filp/whoops/README.md +++ b/vendor/filp/whoops/README.md @@ -1,9 +1,9 @@ # whoops php errors for cool kids -[![Total Downloads](https://poser.pugx.org/filp/whoops/downloads.png)](https://packagist.org/packages/filp/whoops) -[![Latest Stable Version](https://poser.pugx.org/filp/whoops/v/stable.png)](https://packagist.org/packages/filp/whoops) -[![Build Status](https://travis-ci.org/filp/whoops.png?branch=master)](https://travis-ci.org/filp/whoops) +[![Total Downloads](https://img.shields.io/packagist/dm/filp/whoops.svg)](https://packagist.org/packages/filp/whoops) +[![Latest Version](http://img.shields.io/packagist/v/filp/whoops.svg)](https://packagist.org/packages/filp/whoops) +[![Build Status](https://img.shields.io/travis/filp/whoops/master.svg)](https://travis-ci.org/filp/whoops) [![Dependency Status](https://depending.in/filp/whoops.png)](https://depending.in/filp/whoops) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/filp/whoops/badges/quality-score.png?s=6225c36f2a2dd1fdca11ecc7b10b29105c8c62bd)](https://scrutinizer-ci.com/g/filp/whoops) [![Code Coverage](https://scrutinizer-ci.com/g/filp/whoops/badges/coverage.png?s=711feb2069144d252d111b211965ffb19a7d09a8)](https://scrutinizer-ci.com/g/filp/whoops) diff --git a/vendor/filp/whoops/composer.json b/vendor/filp/whoops/composer.json index ac1e9049b5..2514d08b25 100644 --- a/vendor/filp/whoops/composer.json +++ b/vendor/filp/whoops/composer.json @@ -15,7 +15,6 @@ "php": ">=5.3.0" }, "require-dev": { - "php": ">=5.3.3", "mockery/mockery": "0.9.*" }, "autoload": { diff --git a/vendor/filp/whoops/docs/API Documentation.md b/vendor/filp/whoops/docs/API Documentation.md index 93307c7f06..ba102c206d 100644 --- a/vendor/filp/whoops/docs/API Documentation.md +++ b/vendor/filp/whoops/docs/API Documentation.md @@ -350,17 +350,17 @@ PrettyPageHandler::setPageTitle( string $title ) PrettyPageHandler::getPageTitle() #=> string -// Returns a string path to the location where resources -// used by this handler are stored - the template and CSS +// Returns a list of string paths where resources +// used by this handler are searched for - the template and CSS // files. -PrettyPageHandler::getResourcesPath() - #=> string +PrettyPageHandler::getResourcesPaths() + #=> array -// Sets a string path to the location of resources for the +// Adds a string path to the location of resources for the // handler. Useful if you want to roll your own template // file (pretty-template.php and pretty-page.css) while // still using the logic this handler provides -PrettyPageHandler::setResourcesPath( string $resourcesPath ) +PrettyPageHandler::addResourcesPath( string $resourcesPath ) #=> null // Sets an editor to use to open referenced files, either by diff --git a/vendor/filp/whoops/tests/Whoops/RunTest.php b/vendor/filp/whoops/tests/Whoops/RunTest.php index 0b73e82359..063b1b5b89 100755 --- a/vendor/filp/whoops/tests/Whoops/RunTest.php +++ b/vendor/filp/whoops/tests/Whoops/RunTest.php @@ -350,7 +350,7 @@ class RunTest extends TestCase }) ; - $run->silenceErrorsInPaths('@^'.preg_quote(__FILE__).'$@', E_USER_NOTICE); + $run->silenceErrorsInPaths('@^'.preg_quote(__FILE__, '@').'$@', E_USER_NOTICE); trigger_error('Test', E_USER_NOTICE); $this->assertTrue(true); } diff --git a/vendor/guzzle/guzzle/.travis.yml b/vendor/guzzle/guzzle/.travis.yml index be15746110..56d2838486 100644 --- a/vendor/guzzle/guzzle/.travis.yml +++ b/vendor/guzzle/guzzle/.travis.yml @@ -4,6 +4,8 @@ php: - 5.3 - 5.4 - 5.5 + - 5.6 + - hhvm before_script: - curl --version @@ -20,3 +22,9 @@ before_script: - ~/.nvm/nvm.sh install v0.6.14 script: vendor/bin/phpunit + +matrix: + allow_failures: + - php: 5.6 + - php: hhvm + fast_finish: true diff --git a/vendor/guzzle/guzzle/CHANGELOG.md b/vendor/guzzle/guzzle/CHANGELOG.md index 5be7e5dc80..1914d9ab50 100644 --- a/vendor/guzzle/guzzle/CHANGELOG.md +++ b/vendor/guzzle/guzzle/CHANGELOG.md @@ -1,7 +1,26 @@ CHANGELOG ========= -3.8.1 (2013-01-28) +3.9.0 (2014-04-23) +------------------ + +* `null`, `false`, and `"_guzzle_blank_"` all now serialize as an empty value + with no trailing "=". See dc1d824277. +* No longer performing an MD5 check on the cacert each time the phar is used, + but rather copying the cacert to the temp directory. +* `"0"` can now be added as a URL path +* Deleting cookies that are set to empty +* If-Modified-Since is no longer unnecessarily added to the CachePlugin +* Cookie path matching now follows RFC 6265 s5.1.4 +* Updated service descriptions are now added to a service client's composite + factory. +* MockPlugin now throws an exception if the queue is empty. +* Properly parsing URLs that start with "http" but are not absolute +* Added the ability to configure the curl_multi_select timeout setting +* OAuth parameters are now sorted using lexicographical byte value ordering +* Fixing invalid usage of an out of range PHP feature in the ErrorResponsePlugin + +3.8.1 (2014-01-28) ------------------ * Bug: Always using GET requests when redirecting from a 303 response diff --git a/vendor/guzzle/guzzle/README.md b/vendor/guzzle/guzzle/README.md index 108ba52865..e1fc0cc5a3 100644 --- a/vendor/guzzle/guzzle/README.md +++ b/vendor/guzzle/guzzle/README.md @@ -1,7 +1,8 @@ Guzzle, PHP HTTP client and webservice framework ================================================ -[![Latest Stable Version](https://poser.pugx.org/guzzle/guzzle/version.png)](https://packagist.org/packages/guzzle/guzzle) [![Composer Downloads](https://poser.pugx.org/guzzle/guzzle/d/total.png)](https://packagist.org/packages/guzzle/guzzle) [![Build Status](https://secure.travis-ci.org/guzzle/guzzle.png?branch=master)](http://travis-ci.org/guzzle/guzzle) +[![Composer Downloads](https://poser.pugx.org/guzzle/guzzle/d/total.png)](https://packagist.org/packages/guzzle/guzzle) + [![Build Status](https://secure.travis-ci.org/guzzle/guzzle3.png?branch=master)](http://travis-ci.org/guzzle/guzzle3) Guzzle is a PHP HTTP client and framework for building RESTful web service clients. @@ -10,18 +11,7 @@ Guzzle is a PHP HTTP client and framework for building RESTful web service clien - Service description DSL allows you build awesome web service clients faster. - Symfony2 event-based plugin system allows you to completely modify the behavior of a request. -Get answers with: [Documentation](http://docs.guzzlephp.org/), [Forums](https://groups.google.com/forum/?hl=en#!forum/guzzle), IRC ([#guzzlephp](irc://irc.freenode.net/#guzzlephp) @ irc.freenode.net) - -```php -// Really simple using a static facade -Guzzle\Http\StaticClient::mount(); -$response = Guzzle::get('http://guzzlephp.org'); - -// More control using a client class -$client = new \Guzzle\Http\Client('http://guzzlephp.org'); -$request = $client->get('/'); -$response = $request->send(); -``` +Get answers with: [Documentation](http://guzzle3.readthedocs.org/en/latest/), [Forums](https://groups.google.com/forum/?hl=en#!forum/guzzle), IRC ([#guzzlephp](irc://irc.freenode.net/#guzzlephp) @ irc.freenode.net) ### Installing via Composer @@ -32,7 +22,7 @@ The recommended way to install Guzzle is through [Composer](http://getcomposer.o curl -sS https://getcomposer.org/installer | php # Add Guzzle as a dependency -php composer.phar require guzzle/guzzle:~3.7 +php composer.phar require guzzle/guzzle:~3.9 ``` After installing, you need to require Composer's autoloader: @@ -41,172 +31,6 @@ After installing, you need to require Composer's autoloader: require 'vendor/autoload.php'; ``` -### Installing via phar - -As of the 3.7.4 release, each release of Guzzle includes a "guzzle.phar" file that includes all of the files needed to -run Guzzle and all of Guzzle's dependencies. Simply download the phar and include it in your project. - -You can find a list of each release and the available downloads at https://github.com/guzzle/guzzle/releases. - -Features --------- - -- Supports GET, HEAD, POST, DELETE, PUT, PATCH, OPTIONS, and any other custom HTTP method -- Allows full access to request and response headers -- Persistent connections are implicitly managed by Guzzle, resulting in huge performance benefits -- [Send requests in parallel](http://guzzlephp.org/tour/http.html#send-http-requests-in-parallel) -- Cookie sessions can be maintained between requests using the - [CookiePlugin](http://guzzlephp.org/tour/http.html#cookie-session-plugin) -- Allows custom [entity bodies](http://guzzlephp.org/tour/http.html#entity-bodies), including sending data from a PHP - stream and downloading data to a PHP stream -- Responses can be cached and served from cache using the - [caching forward proxy plugin](http://guzzlephp.org/tour/http.html#php-based-caching-forward-proxy) -- Failed requests can be retried using - [truncated exponential backoff](http://guzzlephp.org/tour/http.html#truncated-exponential-backoff) with custom retry - policies -- Entity bodies can be validated automatically using Content-MD5 headers and the - [MD5 hash validator plugin](http://guzzlephp.org/tour/http.html#md5-hash-validator-plugin) -- All data sent over the wire can be logged using the - [LogPlugin](http://guzzlephp.org/tour/http.html#over-the-wire-logging) -- Subject/Observer signal slot system for unobtrusively - [modifying request behavior](http://guzzlephp.org/guide/http/creating_plugins.html) -- Supports all of the features of libcurl including authentication, compression, redirects, SSL, proxies, etc -- Web service client framework for building future-proof interfaces to web services -- Includes a [service description DSL](http://guzzlephp.org/guide/service/service_descriptions.html) for quickly - building webservice clients -- Full support for [URI templates](http://tools.ietf.org/html/rfc6570) -- Advanced batching functionality to efficiently send requests or commands in parallel with customizable batch sizes - and transfer strategies - -HTTP basics ------------ - -```php - '***' -]); - -// Issue a path using a relative URL to the client's base URL -// Sends to http://www.example.com/api/v1/key/***/users -$request = $client->get('users'); -$response = $request->send(); - -// Relative URL that overwrites the path of the base URL -$request = $client->get('/test/123.php?a=b'); - -// Issue a head request on the base URL -$response = $client->head()->send(); -// Delete user 123 -$response = $client->delete('users/123')->send(); - -// Send a PUT request with custom headers -$response = $client->put('upload/text', [ - 'X-Header' => 'My Header' -], 'body of the request')->send(); - -// Send a PUT request using the contents of a PHP stream as the body -// Send using an absolute URL (overrides the base URL) -$response = $client->put('http://www.example.com/upload', [ - 'X-Header' => 'My Header' -], fopen('http://www.test.com/', 'r')); - -// Create a POST request with a file upload (notice the @ symbol): -$request = $client->post('http://localhost:8983/solr/update', null, [ - 'custom_field' => 'my value', - 'file' => '@/path/to/documents.xml' -]); - -// Create a POST request and add the POST files manually -$request = $client->post('http://localhost:8983/solr/update') - ->addPostFiles(['file' => '/path/to/documents.xml']); - -// Responses are objects -echo $response->getStatusCode() . ' ' . $response->getReasonPhrase() . "\n"; - -// Requests and responses can be cast to a string to show the raw HTTP message -echo $request . "\n\n" . $response; - -// Create a request based on an HTTP message -$request = RequestFactory::fromMessage( - "PUT / HTTP/1.1\r\n" . - "Host: test.com:8081\r\n" . - "Content-Type: text/plain" . - "Transfer-Encoding: chunked\r\n" . - "\r\n" . - "this is the body" -); -``` - -Using the static client facade ------------------------------- - -You can use Guzzle through a static client to make it even easier to send simple HTTP requests. - -```php - ['X-Foo' => 'Bar'], - 'body' => ['Foo' => 'Bar'], - 'query' => ['Test' => 123], - 'timeout' => 10, - 'debug' => true, - 'save_to' => '/path/to/file.html' -]); -``` - -### Available request options: - -* headers: Associative array of headers -* query: Associative array of query string values to add to the request -* body: Body of a request, including an EntityBody, string, or array when sending POST requests. Setting a body for a - GET request will set where the response body is downloaded. -* auth: Array of HTTP authentication parameters to use with the request. The array must contain the - username in index [0], the password in index [1], and can optionally contain the authentication type in index [2]. - The authentication types are: "Basic", "Digest". The default auth type is "Basic". -* cookies: Associative array of cookies -* allow_redirects: Set to false to disable redirects -* save_to: String, fopen resource, or EntityBody object used to store the body of the response -* events: Associative array mapping event names to a closure or array of (priority, closure) -* plugins: Array of plugins to add to the request -* exceptions: Set to false to disable throwing exceptions on an HTTP level error (e.g. 404, 500, etc) -* timeout: Float describing the timeout of the request in seconds -* connect_timeout: Float describing the number of seconds to wait while trying to connect. Use 0 to wait - indefinitely. -* verify: Set to true to enable SSL cert validation (the default), false to disable, or supply the path to a CA - bundle to enable verification using a custom certificate. -* proxy: Specify an HTTP proxy (e.g. "http://username:password@192.168.16.1:10") -* debug: Set to true to display all data sent over the wire - -These options can also be used when creating requests using a standard client: - -```php -$client = new Guzzle\Http\Client(); -// Create a request with a timeout of 10 seconds -$request = $client->get('http://guzzlephp.org', [], ['timeout' => 10]); -$response = $request->send(); -``` - -Unit testing ------------- - -Guzzle uses PHPUnit for unit testing. In order to run the unit tests, you'll first need -to install the dependencies of the project using Composer: `php composer.phar install --dev`. -You can then run the tests using `vendor/bin/phpunit`. - -If you are running the tests with xdebug enabled, you may encounter the following issue: 'Fatal error: Maximum function nesting level of '100' reached, aborting!'. This can be resolved by adding 'xdebug.max_nesting_level = 200' to your php.ini file. +# This is an older version -The PECL extensions, uri_template and pecl_http will be required to ensure all the tests can run. +This repository is for Guzzle 3.x. Guzzle 4.0, the new version of Guzzle has been released and is available at https://github.com/guzzle/guzzle. diff --git a/vendor/guzzle/guzzle/composer.json b/vendor/guzzle/guzzle/composer.json index 315309031e..d6e9a96938 100644 --- a/vendor/guzzle/guzzle/composer.json +++ b/vendor/guzzle/guzzle/composer.json @@ -46,7 +46,7 @@ "require": { "php": ">=5.3.3", "ext-curl": "*", - "symfony/event-dispatcher": ">=2.1" + "symfony/event-dispatcher": "~2.1" }, "autoload": { @@ -57,12 +57,12 @@ }, "require-dev": { - "doctrine/cache": "*", - "symfony/class-loader": "*", - "monolog/monolog": "1.*", - "psr/log": "1.0.*", - "zendframework/zend-cache": "<2.3", - "zendframework/zend-log": "<2.3", + "doctrine/cache": "~1.3", + "symfony/class-loader": "~2.1", + "monolog/monolog": "~1.0", + "psr/log": "~1.0", + "zendframework/zend-cache": "2.*,<2.3", + "zendframework/zend-log": "2.*,<2.3", "phpunit/phpunit": "3.7.*" }, diff --git a/vendor/guzzle/guzzle/docs/_templates/index.html b/vendor/guzzle/guzzle/docs/_templates/index.html index e6d188ea29..2bbfd6f673 100644 --- a/vendor/guzzle/guzzle/docs/_templates/index.html +++ b/vendor/guzzle/guzzle/docs/_templates/index.html @@ -47,7 +47,7 @@
  • Service descriptions for quickly building clients.
  • Powered by the Symfony2 EventDispatcher.
  • Use all of the code or only specific components.
  • -
  • Plugins for caching, logging, OAuth, mocks, and more +
  • Plugins for caching, logging, OAuth, mocks, and more
  • Includes a custom node.js webserver to test your clients.
  • @@ -55,7 +55,7 @@ Guzzle is now part of Drupal 8 core and powers the official AWS SDK for PHP -

    Quick Twitter example

    +

    GitHub Example

    <?php
     require_once 'vendor/autoload.php';
    @@ -71,7 +71,10 @@ echo $response->getBody();
     // >>> {"type":"User", ...
     echo $response->getHeader('Content-Length');
     // >>> 792
    +
    +

    Twitter Example

    +
    <?php
     // Create a client to work with the Twitter API
     $client = new Client('https://api.twitter.com/{version}', array(
         'version' => '1.1'
    diff --git a/vendor/guzzle/guzzle/docs/conf.py b/vendor/guzzle/guzzle/docs/conf.py
    index 895886d241..92bc46bb5e 100644
    --- a/vendor/guzzle/guzzle/docs/conf.py
    +++ b/vendor/guzzle/guzzle/docs/conf.py
    @@ -45,7 +45,6 @@ htmlhelp_basename = 'Guzzledoc'
     sys.path.insert(0, '/Users/dowling/projects/guzzle_sphinx_theme')
     
     import guzzle_sphinx_theme
    -pygments_style = 'guzzle_sphinx_theme.GuzzleStyle'
     html_translator_class = 'guzzle_sphinx_theme.HTMLTranslator'
     html_theme_path = guzzle_sphinx_theme.html_theme_path()
     html_theme = 'guzzle_sphinx_theme'
    diff --git a/vendor/guzzle/guzzle/docs/getting-started/installation.rst b/vendor/guzzle/guzzle/docs/getting-started/installation.rst
    index 7d522919b1..77d4001312 100644
    --- a/vendor/guzzle/guzzle/docs/getting-started/installation.rst
    +++ b/vendor/guzzle/guzzle/docs/getting-started/installation.rst
    @@ -24,7 +24,7 @@ project.
         curl -sS https://getcomposer.org/installer | php
     
         # Add Guzzle as a dependency
    -    php composer.phar require guzzle/guzzle:~3.7
    +    php composer.phar require guzzle/guzzle:~3.9
     
     After installing, you need to require Composer's autoloader:
     
    @@ -115,7 +115,7 @@ You can install a specific version of Guzzle by providing a version number suffi
     
     .. code-block:: bash
     
    -    pear install guzzle/guzzle-3.7.0
    +    pear install guzzle/guzzle-3.9.0
     
     Contributing to Guzzle
     ----------------------
    diff --git a/vendor/guzzle/guzzle/docs/http-client/client.rst b/vendor/guzzle/guzzle/docs/http-client/client.rst
    index d344a96e07..723d729dbb 100644
    --- a/vendor/guzzle/guzzle/docs/http-client/client.rst
    +++ b/vendor/guzzle/guzzle/docs/http-client/client.rst
    @@ -405,7 +405,7 @@ cert
     The `cert` option lets you specify a PEM formatted SSL client certificate to use with servers that require one. If the
     certificate requires a password, provide an array with the password as the second item.
     
    -This would typically be used in conjuction with the `ssl_key` option.
    +This would typically be used in conjunction with the `ssl_key` option.
     
     .. code-block:: php
     
    @@ -423,7 +423,7 @@ ssl_key
     The `ssl_key` option lets you specify a file containing your PEM formatted private key, optionally protected by a password.
     Note: your password is sensitive, keep the PHP script containing it safe.
     
    -This would typically be used in conjuction with the `cert` option.
    +This would typically be used in conjunction with the `cert` option.
     
     .. code-block:: php
     
    diff --git a/vendor/guzzle/guzzle/docs/http-client/request.rst b/vendor/guzzle/guzzle/docs/http-client/request.rst
    index a0593c915e..a8387a915a 100644
    --- a/vendor/guzzle/guzzle/docs/http-client/request.rst
    +++ b/vendor/guzzle/guzzle/docs/http-client/request.rst
    @@ -590,7 +590,7 @@ Connection problems and cURL specific errors can also occur when transferring re
     encounters cURL specific errors while transferring a single request, a ``Guzzle\Http\Exception\CurlException`` is
     thrown with an informative error message and access to the cURL error message.
     
    -A ``Guzzle\Common\Exception\MultiTransferException`` exception is thrown when a cURL specific error occurs while
    +A ``Guzzle\Http\Exception\MultiTransferException`` exception is thrown when a cURL specific error occurs while
     transferring multiple requests in parallel. You can then iterate over all of the exceptions encountered during the
     transfer.
     
    diff --git a/vendor/guzzle/guzzle/docs/iterators/guzzle-iterators.rst b/vendor/guzzle/guzzle/docs/iterators/guzzle-iterators.rst
    index 1c56ec0c56..a5c7fd33ff 100644
    --- a/vendor/guzzle/guzzle/docs/iterators/guzzle-iterators.rst
    +++ b/vendor/guzzle/guzzle/docs/iterators/guzzle-iterators.rst
    @@ -17,7 +17,7 @@ pulling out chunks of values from the inner iterator.
         use Guzzle\Iterator\ChunkedIterator;
     
         $inner = new ArrayIterator(range(0, 8));
    -    $chunkedIterator = new ChunkedIterator($inner, 10);
    +    $chunkedIterator = new ChunkedIterator($inner, 2);
     
         foreach ($chunkedIterator as $chunk) {
             echo implode(', ', $chunk) . "\n";
    @@ -63,7 +63,7 @@ This iterator modifies the values of the inner iterator before yielding.
     
         use Guzzle\Iterator\MapIterator;
     
    -    $innner = new ArrayIterator(range(0, 3));
    +    $inner = new ArrayIterator(range(0, 3));
     
         $mapIterator = new MapIterator($inner, function ($value) {
             return $value * 10;
    diff --git a/vendor/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst b/vendor/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst
    index b1901fc7d7..a91b69c4ab 100644
    --- a/vendor/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst
    +++ b/vendor/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst
    @@ -216,7 +216,7 @@ Here's a very simple example of implementing a custom responseClass object.
             public static function fromCommand(OperationCommand $command)
             {
                 $response = $command->getResponse();
    -            $xml = $command->xml();
    +            $xml = $response->xml();
     
                 return new self((string) $xml->name);
             }
    diff --git a/vendor/guzzle/guzzle/phar-stub.php b/vendor/guzzle/guzzle/phar-stub.php
    index cc2b53f4f0..504dfe0786 100644
    --- a/vendor/guzzle/guzzle/phar-stub.php
    +++ b/vendor/guzzle/guzzle/phar-stub.php
    @@ -13,4 +13,16 @@ $classLoader->registerNamespaces(array(
     ));
     $classLoader->register();
     
    +// Copy the cacert.pem file from the phar if it is not in the temp folder.
    +$from = 'phar://guzzle.phar/src/Guzzle/Http/Resources/cacert.pem';
    +$certFile = sys_get_temp_dir() . '/guzzle-cacert.pem';
    +
    +// Only copy when the file size is different
    +if (!file_exists($certFile) || filesize($certFile) != filesize($from)) {
    +    if (!copy($from, $certFile)) {
    +        throw new RuntimeException("Could not copy {$from} to {$certFile}: "
    +            . var_export(error_get_last(), true));
    +    }
    +}
    +
     __HALT_COMPILER();
    diff --git a/vendor/guzzle/guzzle/phing/imports/deploy.xml b/vendor/guzzle/guzzle/phing/imports/deploy.xml
    index 8476132e78..109e5ec4f4 100644
    --- a/vendor/guzzle/guzzle/phing/imports/deploy.xml
    +++ b/vendor/guzzle/guzzle/phing/imports/deploy.xml
    @@ -5,8 +5,9 @@
         
         
             
    +        
             
    -            
    +            
                 
                     On branch ${head}
                 
    @@ -127,7 +128,6 @@
                 
                     
                     
    -                
                     
                     
                     
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Common/Version.php b/vendor/guzzle/guzzle/src/Guzzle/Common/Version.php
    index 4f5147f7aa..0de1414fe2 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Common/Version.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Common/Version.php
    @@ -7,7 +7,7 @@ namespace Guzzle\Common;
      */
     class Version
     {
    -    const VERSION = '3.8.1';
    +    const VERSION = '3.9.0';
     
         /**
          * @var bool Set this value to true to enable warnings for deprecated functionality use. This should be on in your
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php b/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php
    index 3bda450e19..22df2ec6e2 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php
    @@ -30,6 +30,8 @@ class Client extends AbstractHasDispatcher implements ClientInterface
         const CURL_OPTIONS = 'curl.options';
         const SSL_CERT_AUTHORITY = 'ssl.certificate_authority';
         const DISABLE_REDIRECTS = RedirectPlugin::DISABLE;
    +    const DEFAULT_SELECT_TIMEOUT = 1.0;
    +    const MAX_HANDLES = 3;
     
         /** @var Collection Default HTTP headers to set on each request */
         protected $defaultHeaders;
    @@ -177,7 +179,7 @@ class Client extends AbstractHasDispatcher implements ClientInterface
                 } else {
                     list($uri, $templateVars) = $uri;
                 }
    -            if (substr($uri, 0, 4) === 'http') {
    +            if (strpos($uri, '://')) {
                     // Use absolute URLs as-is
                     $url = $this->expandTemplate($uri, $templateVars);
                 } else {
    @@ -306,7 +308,10 @@ class Client extends AbstractHasDispatcher implements ClientInterface
         public function getCurlMulti()
         {
             if (!$this->curlMulti) {
    -            $this->curlMulti = new CurlMultiProxy();
    +            $this->curlMulti = new CurlMultiProxy(
    +                self::MAX_HANDLES,
    +                $this->getConfig('select_timeout') ?: self::DEFAULT_SELECT_TIMEOUT
    +            );
             }
     
             return $this->curlMulti;
    @@ -333,31 +338,6 @@ class Client extends AbstractHasDispatcher implements ClientInterface
             return $this;
         }
     
    -    /**
    -     * Copy the cacert.pem file from the phar if it is not in the temp folder and validate the MD5 checksum
    -     *
    -     * @param bool $md5Check Set to false to not perform the MD5 validation
    -     *
    -     * @return string Returns the path to the extracted cacert
    -     * @throws RuntimeException if the file cannot be copied or there is a MD5 mismatch
    -     */
    -    public function preparePharCacert($md5Check = true)
    -    {
    -        $from = __DIR__ . '/Resources/cacert.pem';
    -        $certFile = sys_get_temp_dir() . '/guzzle-cacert.pem';
    -        if (!file_exists($certFile) && !copy($from, $certFile)) {
    -            throw new RuntimeException("Could not copy {$from} to {$certFile}: " . var_export(error_get_last(), true));
    -        } elseif ($md5Check) {
    -            $actualMd5 = md5_file($certFile);
    -            $expectedMd5 = trim(file_get_contents("{$from}.md5"));
    -            if ($actualMd5 != $expectedMd5) {
    -                throw new RuntimeException("{$certFile} MD5 mismatch: expected {$expectedMd5} but got {$actualMd5}");
    -            }
    -        }
    -
    -        return $certFile;
    -    }
    -
         /**
          * Expand a URI template while merging client config settings into the template variables
          *
    @@ -457,7 +437,9 @@ class Client extends AbstractHasDispatcher implements ClientInterface
          */
         protected function initSsl()
         {
    -        if ('system' == ($authority = $this->config[self::SSL_CERT_AUTHORITY])) {
    +        $authority = $this->config[self::SSL_CERT_AUTHORITY];
    +
    +        if ($authority === 'system') {
                 return;
             }
     
    @@ -466,13 +448,7 @@ class Client extends AbstractHasDispatcher implements ClientInterface
             }
     
             if ($authority === true && substr(__FILE__, 0, 7) == 'phar://') {
    -            $authority = $this->preparePharCacert();
    -            $that = $this;
    -            $this->getEventDispatcher()->addListener('request.before_send', function ($event) use ($authority, $that) {
    -                if ($authority == $event['request']->getCurlOptions()->get(CURLOPT_CAINFO)) {
    -                    $that->preparePharCacert(false);
    -                }
    -            });
    +            $authority = sys_get_temp_dir() . '/guzzle-cacert.pem';
             }
     
             $this->setSslVerification($authority);
    @@ -503,4 +479,12 @@ class Client extends AbstractHasDispatcher implements ClientInterface
     
             return $this;
         }
    +
    +    /**
    +     * @deprecated
    +     */
    +    public function preparePharCacert($md5Check = true)
    +    {
    +        return sys_get_temp_dir() . '/guzzle-cacert.pem';
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php b/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php
    index f09ca0cac8..e8301be340 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php
    @@ -39,8 +39,12 @@ class CurlMulti extends AbstractHasDispatcher implements CurlMultiInterface
             CURLM_INTERNAL_ERROR  => array('CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!')
         );
     
    -    public function __construct()
    +    /** @var float */
    +    protected $selectTimeout;
    +
    +    public function __construct($selectTimeout = 1.0)
         {
    +        $this->selectTimeout = $selectTimeout;
             $this->multiHandle = curl_multi_init();
             // @codeCoverageIgnoreStart
             if ($this->multiHandle === false) {
    @@ -229,7 +233,7 @@ class CurlMulti extends AbstractHasDispatcher implements CurlMultiInterface
                     // Perform a usleep if a select returns -1: https://bugs.php.net/bug.php?id=61141
                     usleep(150);
                 }
    -            $selectTimeout = 1;
    +            $selectTimeout = $this->selectTimeout;
             } while ($active);
         }
     
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php b/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php
    index 665f029a79..c5b80a7f57 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php
    @@ -15,13 +15,16 @@ class CurlMultiProxy extends AbstractHasDispatcher implements CurlMultiInterface
         protected $groups = array();
         protected $queued = array();
         protected $maxHandles;
    +    protected $selectTimeout;
     
         /**
    -     * @param int $maxHandles The maximum number of idle CurlMulti handles to allow to remain open
    +     * @param int   $maxHandles The maximum number of idle CurlMulti handles to allow to remain open
    +     * @param float $selectTimeout timeout for curl_multi_select
          */
    -    public function __construct($maxHandles = 3)
    +    public function __construct($maxHandles = 3, $selectTimeout = 1.0)
         {
             $this->maxHandles = $maxHandles;
    +        $this->selectTimeout = $selectTimeout;
             // You can get some weird "Too many open files" errors when sending a large amount of requests in parallel.
             // These two statements autoload classes before a system runs out of file descriptors so that you can get back
             // valuable error messages if you run out.
    @@ -122,7 +125,7 @@ class CurlMultiProxy extends AbstractHasDispatcher implements CurlMultiInterface
             }
     
             // All are claimed, so create one
    -        $handle = new CurlMulti();
    +        $handle = new CurlMulti($this->selectTimeout);
             $handle->setEventDispatcher($this->getEventDispatcher());
             $this->handles[] = $handle;
     
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php b/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php
    index 3d487fee36..f218cd5ce9 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php
    @@ -275,7 +275,7 @@ class Request extends AbstractMessage implements RequestInterface
     
             // Include the port in the Host header if it is not the default port for the scheme of the URL
             $scheme = $this->url->getScheme();
    -        if (($scheme == 'http' && $port != 80) || ($scheme == 'https' && $port != 443)) {
    +        if ($port && (($scheme == 'http' && $port != 80) || ($scheme == 'https' && $port != 443))) {
                 $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost() . ':' . $port);
             } else {
                 $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost());
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/QueryString.php b/vendor/guzzle/guzzle/src/Guzzle/Http/QueryString.php
    index c657db09d1..38a2640738 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/QueryString.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/QueryString.php
    @@ -3,6 +3,7 @@
     namespace Guzzle\Http;
     
     use Guzzle\Common\Collection;
    +use Guzzle\Common\Exception\RuntimeException;
     use Guzzle\Http\QueryAggregator\DuplicateAggregator;
     use Guzzle\Http\QueryAggregator\QueryAggregatorInterface;
     use Guzzle\Http\QueryAggregator\PhpAggregator;
    @@ -70,7 +71,8 @@ class QueryString extends Collection
                         $q[$key] = $value;
                     }
                 } else {
    -                $q->add($key, self::BLANK);
    +                // Uses false by default to represent keys with no trailing "=" sign.
    +                $q->add($key, false);
                 }
             }
     
    @@ -86,6 +88,7 @@ class QueryString extends Collection
          * Convert the query string parameters to a query string string
          *
          * @return string
    +     * @throws RuntimeException
          */
         public function __toString()
         {
    @@ -93,21 +96,12 @@ class QueryString extends Collection
                 return '';
             }
     
    -        $queryString = '';
    -
    +        $queryList = array();
             foreach ($this->prepareData($this->data) as $name => $value) {
    -            foreach ((array) $value as $v) {
    -                if ($queryString) {
    -                    $queryString .= $this->fieldSeparator;
    -                }
    -                $queryString .= $name;
    -                if ($v !== self::BLANK) {
    -                    $queryString .= $this->valueSeparator . $v;
    -                }
    -            }
    +            $queryList[] = $this->convertKvp($name, $value);
             }
     
    -        return $queryString;
    +        return implode($this->fieldSeparator, $queryList);
         }
     
         /**
    @@ -264,7 +258,10 @@ class QueryString extends Collection
     
             $temp = array();
             foreach ($data as $key => $value) {
    -            if (is_array($value)) {
    +            if ($value === false || $value === null) {
    +                // False and null will not include the "=". Use an empty string to include the "=".
    +                $temp[$this->encodeValue($key)] = $value;
    +            } elseif (is_array($value)) {
                     $temp = array_merge($temp, $this->aggregator->aggregate($key, $value, $this));
                 } else {
                     $temp[$this->encodeValue($key)] = $this->encodeValue($value);
    @@ -273,4 +270,28 @@ class QueryString extends Collection
     
             return $temp;
         }
    +
    +    /**
    +     * Converts a key value pair that can contain strings, nulls, false, or arrays
    +     * into a single string.
    +     *
    +     * @param string $name  Name of the field
    +     * @param mixed  $value Value of the field
    +     * @return string
    +     */
    +    private function convertKvp($name, $value)
    +    {
    +        if ($value === self::BLANK || $value === null || $value === false) {
    +            return $name;
    +        } elseif (!is_array($value)) {
    +            return $name . $this->valueSeparator . $value;
    +        }
    +
    +        $result = '';
    +        foreach ($value as $v) {
    +            $result .= $this->convertKvp($name, $v) . $this->fieldSeparator;
    +        }
    +
    +        return rtrim($result, $this->fieldSeparator);
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem b/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem
    index 93d3d2dbf4..67f696abc4 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem
    @@ -1,12 +1,12 @@
     ##
     ## ca-bundle.crt -- Bundle of CA Root Certificates
     ##
    -## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012
    +## Certificate data from Mozilla as of: Tue Jan 28 09:38:07 2014
     ##
     ## This is a bundle of X.509 certificates of public Certificate Authorities
     ## (CA). These were automatically extracted from Mozilla's root certificates
     ## file (certdata.txt).  This file can be found in the mozilla source tree:
    -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
    +## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
     ##
     ## It contains the certificates in PEM format and therefore
     ## can be directly used with curl / libcurl / php_curl, or with
    @@ -14,7 +14,6 @@
     ## Just configure this file as the SSLCACertificateFile.
     ##
     
    -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
     
     GTE CyberTrust Global Root
     ==========================
    @@ -91,46 +90,6 @@ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
     70+sB3c4
     -----END CERTIFICATE-----
     
    -Digital Signature Trust Co. Global CA 1
    -=======================================
    ------BEGIN CERTIFICATE-----
    -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
    -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
    -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
    -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
    -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
    -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
    -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
    -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
    -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
    -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
    -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
    -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
    -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
    -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
    -RbyhkwS7hp86W0N6w4pl
    ------END CERTIFICATE-----
    -
    -Digital Signature Trust Co. Global CA 3
    -=======================================
    ------BEGIN CERTIFICATE-----
    -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
    -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
    -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
    -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
    -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
    -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
    -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
    -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
    -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
    -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
    -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
    -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
    -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
    -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
    -mPnHfxsb1gYgAlihw6ID
    ------END CERTIFICATE-----
    -
     Verisign Class 3 Public Primary Certification Authority
     =======================================================
     -----BEGIN CERTIFICATE-----
    @@ -344,11 +303,11 @@ n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
     Entrust.net Premium 2048 Secure Server CA
     =========================================
     -----BEGIN CERTIFICATE-----
    -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
    +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
     ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
     bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
     BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
    -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
    +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
     d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
     MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
     ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
    @@ -356,14 +315,13 @@ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
     Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
     hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
     nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
    -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
    -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
    -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
    -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
    -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
    -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
    -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
    -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
    +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
    +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
    +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
    +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
    +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
    +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
    +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
     -----END CERTIFICATE-----
     
     Baltimore CyberTrust Root
    @@ -421,26 +379,6 @@ lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
     KpYrtWKmpj29f5JZzVoqgrI3eQ==
     -----END CERTIFICATE-----
     
    -Equifax Secure eBusiness CA 2
    -=============================
    ------BEGIN CERTIFICATE-----
    -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
    -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
    -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
    -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
    -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
    -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
    -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
    -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
    -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
    -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
    -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
    -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
    -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
    -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
    -V+GRMOrN
    ------END CERTIFICATE-----
    -
     AddTrust Low-Value Services Root
     ================================
     -----BEGIN CERTIFICATE-----
    @@ -1405,29 +1343,6 @@ wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
     VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
     -----END CERTIFICATE-----
     
    -Wells Fargo Root CA
    -===================
    ------BEGIN CERTIFICATE-----
    -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
    -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
    -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
    -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
    -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
    -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
    -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
    -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
    -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
    -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
    -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
    -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
    -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
    -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
    -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
    -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
    -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
    -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
    ------END CERTIFICATE-----
    -
     Swisscom Root CA 1
     ==================
     -----BEGIN CERTIFICATE-----
    @@ -2803,29 +2718,6 @@ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
     kpeDMdmztcpHWD9f
     -----END CERTIFICATE-----
     
    -TC TrustCenter Universal CA III
    -===============================
    ------BEGIN CERTIFICATE-----
    -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
    -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
    -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
    -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
    -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
    -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
    -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
    -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
    -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
    -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
    -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
    -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
    -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
    -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
    -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
    -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
    -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
    -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
    ------END CERTIFICATE-----
    -
     Autoridad de Certificacion Firmaprofesional CIF A62634068
     =========================================================
     -----BEGIN CERTIFICATE-----
    @@ -3552,3 +3444,342 @@ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
     3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
     dcGWxZ0=
     -----END CERTIFICATE-----
    +
    +TURKTRUST Certificate Services Provider Root 2007
    +=================================================
    +-----BEGIN CERTIFICATE-----
    +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
    +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
    +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
    +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
    +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
    +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
    +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
    +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
    +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
    +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
    +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
    +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
    +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
    +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
    +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
    +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
    +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
    +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
    +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
    +poRq0Tl9
    +-----END CERTIFICATE-----
    +
    +D-TRUST Root Class 3 CA 2 2009
    +==============================
    +-----BEGIN CERTIFICATE-----
    +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
    +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
    +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
    +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
    +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
    +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
    +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
    +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
    +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
    +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
    +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
    +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
    +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
    +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
    +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
    +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
    +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
    +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
    +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
    +-----END CERTIFICATE-----
    +
    +D-TRUST Root Class 3 CA 2 EV 2009
    +=================================
    +-----BEGIN CERTIFICATE-----
    +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
    +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
    +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
    +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
    +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
    +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
    +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
    +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
    +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
    +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
    +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
    +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
    +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
    +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
    +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
    +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
    +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
    +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
    +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
    +w9y4AyHqnxbxLFS1
    +-----END CERTIFICATE-----
    +
    +PSCProcert
    +==========
    +-----BEGIN CERTIFICATE-----
    +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
    +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
    +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
    +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
    +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
    +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
    +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
    +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
    +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
    +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
    +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
    +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
    +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
    +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
    +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
    +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
    +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
    +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
    +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
    +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
    +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
    +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
    +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
    +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
    +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
    +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
    +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
    +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
    +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
    +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
    +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
    +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
    +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
    +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
    +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
    +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
    +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
    +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
    +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
    +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
    +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
    +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
    +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
    +-----END CERTIFICATE-----
    +
    +China Internet Network Information Center EV Certificates Root
    +==============================================================
    +-----BEGIN CERTIFICATE-----
    +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
    +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
    +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
    +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
    +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
    +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
    +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
    +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
    +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
    +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
    +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
    +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
    +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
    +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
    +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
    +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
    +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
    +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
    +-----END CERTIFICATE-----
    +
    +Swisscom Root CA 2
    +==================
    +-----BEGIN CERTIFICATE-----
    +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
    +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
    +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
    +MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
    +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
    +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
    +LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
    +ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
    +wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
    +Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
    +SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
    +NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
    +mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
    +Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
    +qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
    +HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
    +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
    +MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
    +v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
    +82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
    +o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
    +a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
    +OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
    +mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
    ++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
    +rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
    +5OfNeOI5wSsSnqaeG8XmDtkx2Q==
    +-----END CERTIFICATE-----
    +
    +Swisscom Root EV CA 2
    +=====================
    +-----BEGIN CERTIFICATE-----
    +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
    +BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
    +cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
    +MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
    +HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
    +Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
    +o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
    +Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
    +GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
    +qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
    +Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
    +alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
    +m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
    +bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
    +xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
    +BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
    +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
    +bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
    +j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
    +wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
    +XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
    +59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
    +23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
    +J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
    +HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
    +uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
    +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
    +-----END CERTIFICATE-----
    +
    +CA Disig Root R1
    +================
    +-----BEGIN CERTIFICATE-----
    +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
    +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
    +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
    +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
    +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
    +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
    +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
    +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
    +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
    +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
    +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
    +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
    +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
    +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
    +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
    +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
    +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
    +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
    +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
    +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
    +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
    +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
    +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
    +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
    +a7+h89n07eLw4+1knj0vllJPgFOL
    +-----END CERTIFICATE-----
    +
    +CA Disig Root R2
    +================
    +-----BEGIN CERTIFICATE-----
    +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
    +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
    +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
    +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
    +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
    +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
    +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
    +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
    +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
    +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
    +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
    +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
    +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
    +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
    +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
    +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
    +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
    +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
    +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
    +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
    +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
    +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
    +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
    +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
    +7+ZtsH8tZ/3zbBt1RqPlShfppNcL
    +-----END CERTIFICATE-----
    +
    +ACCVRAIZ1
    +=========
    +-----BEGIN CERTIFICATE-----
    +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
    +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
    +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
    +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
    +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
    +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
    +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
    +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
    +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
    +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
    +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
    +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
    +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
    +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
    +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
    +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
    +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
    +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
    +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
    +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
    +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
    +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
    +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
    +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
    +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
    +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
    +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
    +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
    +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
    +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
    +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
    +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
    +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
    +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
    +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
    +EfbRD0tVNEYqi4Y7
    +-----END CERTIFICATE-----
    +
    +TWCA Global Root CA
    +===================
    +-----BEGIN CERTIFICATE-----
    +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
    +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
    +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
    +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
    +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
    +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
    +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
    +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
    +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
    +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
    +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
    +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
    +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
    +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
    +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
    +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
    +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
    +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
    +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
    +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
    +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
    +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
    +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
    +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
    +-----END CERTIFICATE-----
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem.md5 b/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem.md5
    deleted file mode 100644
    index 7112ccf62c..0000000000
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem.md5
    +++ /dev/null
    @@ -1 +0,0 @@
    -349ba2d6964db9ca558c9e1daf38e428
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Http/Url.php b/vendor/guzzle/guzzle/src/Guzzle/Http/Url.php
    index 91de5c4f3c..6a4e772451 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Http/Url.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Http/Url.php
    @@ -213,6 +213,12 @@ class Url
          */
         public function setScheme($scheme)
         {
    +        if ($this->scheme == 'http' && $this->port == 80) {
    +            $this->port = null;
    +        } elseif ($this->scheme == 'https' && $this->port == 443) {
    +            $this->port = null;
    +        }
    +
             $this->scheme = $scheme;
     
             return $this;
    @@ -312,7 +318,7 @@ class Url
         }
     
         /**
    -     * Add a relative path to the currently set path
    +     * Add a relative path to the currently set path.
          *
          * @param string $relativePath Relative path to add
          *
    @@ -320,16 +326,15 @@ class Url
          */
         public function addPath($relativePath)
         {
    -        if (!$relativePath || $relativePath == '/') {
    -            return $this;
    -        }
    -
    -        // Add a leading slash if needed
    -        if ($relativePath[0] != '/') {
    -            $relativePath = '/' . $relativePath;
    +        if ($relativePath != '/' && is_string($relativePath) && strlen($relativePath) > 0) {
    +            // Add a leading slash if needed
    +            if ($relativePath[0] != '/') {
    +                $relativePath = '/' . $relativePath;
    +            }
    +            $this->setPath(str_replace('//', '/', $this->path . $relativePath));
             }
     
    -        return $this->setPath(str_replace('//', '/', $this->getPath() . $relativePath));
    +        return $this;
         }
     
         /**
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Iterator/composer.json b/vendor/guzzle/guzzle/src/Guzzle/Iterator/composer.json
    index 17e8005268..ee1737987b 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Iterator/composer.json
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Iterator/composer.json
    @@ -18,7 +18,7 @@
         "autoload": {
             "psr-0": { "Guzzle\\Iterator": "/" }
         },
    -    "target-dir": "Guzzle/Log",
    +    "target-dir": "Guzzle/Iterator",
         "extra": {
             "branch-alias": {
                 "dev-master": "3.7-dev"
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php b/vendor/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php
    index 8c74a45dce..6afe7b62af 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php
    @@ -29,6 +29,6 @@ class MonologLogAdapter extends AbstractLogAdapter
     
         public function log($message, $priority = LOG_INFO, $extras = array())
         {
    -        $this->log->addRecord(self::$mapping[$priority], $message);
    +        $this->log->addRecord(self::$mapping[$priority], $message, $extras);
         }
     }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php b/vendor/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php
    index 8e825f9bde..4349eeb38b 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php
    @@ -36,7 +36,7 @@ class CookieParser implements CookieParserInterface
             $data = array_merge(array_fill_keys(array_keys(self::$cookieParts), null), array(
                 'cookies'   => array(),
                 'data'      => array(),
    -            'path'      => $path ?: '/',
    +            'path'      => null,
                 'http_only' => false,
                 'discard'   => false,
                 'domain'    => $host
    @@ -81,6 +81,51 @@ class CookieParser implements CookieParserInterface
                 $data['expires'] = time() + (int) $data['max_age'];
             }
     
    +        // Check path attribute according RFC6265 http://tools.ietf.org/search/rfc6265#section-5.2.4
    +        // "If the attribute-value is empty or if the first character of the
    +        // attribute-value is not %x2F ("/"):
    +        //   Let cookie-path be the default-path.
    +        // Otherwise:
    +        //   Let cookie-path be the attribute-value."
    +        if (!$data['path'] || substr($data['path'], 0, 1) !== '/') {
    +            $data['path'] = $this->getDefaultPath($path);
    +        }
    +
             return $data;
         }
    +
    +    /**
    +     * Get default cookie path according to RFC 6265
    +     * http://tools.ietf.org/search/rfc6265#section-5.1.4 Paths and Path-Match
    +     *
    +     * @param string $path Request uri-path
    +     *
    +     * @return string
    +     */
    +    protected function getDefaultPath($path) {
    +        // "The user agent MUST use an algorithm equivalent to the following algorithm
    +        // to compute the default-path of a cookie:"
    +
    +        // "2. If the uri-path is empty or if the first character of the uri-path is not
    +        // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps.
    +        if (empty($path) || substr($path, 0, 1) !== '/') {
    +            return '/';
    +        }
    +
    +        // "3. If the uri-path contains no more than one %x2F ("/") character, output
    +        // %x2F ("/") and skip the remaining step."
    +        if ($path === "/") {
    +            return $path;
    +        }
    +
    +        $rightSlashPos = strrpos($path, '/');
    +        if ($rightSlashPos === 0) {
    +            return "/";
    +        }
    +
    +        // "4. Output the characters of the uri-path from the first character up to,
    +        // but not including, the right-most %x2F ("/")."
    +        return substr($path, 0, $rightSlashPos);
    +
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php
    index ab2e2a2cec..af33234eef 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php
    @@ -95,9 +95,11 @@ class DefaultRevalidation implements RevalidationInterface
         protected function createRevalidationRequest(RequestInterface $request, Response $response)
         {
             $revalidate = clone $request;
    -        $revalidate->removeHeader('Pragma')
    -            ->removeHeader('Cache-Control')
    -            ->setHeader('If-Modified-Since', $response->getLastModified() ?: $response->getDate());
    +        $revalidate->removeHeader('Pragma')->removeHeader('Cache-Control');
    +
    +        if ($response->getLastModified()) {
    +            $revalidate->setHeader('If-Modified-Since', $response->getLastModified());
    +        }
     
             if ($response->getEtag()) {
                 $revalidate->setHeader('If-None-Match', $response->getEtag());
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php
    index f5803dcb15..5218e5f0e4 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php
    @@ -412,7 +412,32 @@ class Cookie implements ToArrayInterface
          */
         public function matchesPath($path)
         {
    -        return !$this->getPath() || 0 === stripos($path, $this->getPath());
    +        // RFC6265 http://tools.ietf.org/search/rfc6265#section-5.1.4
    +        // A request-path path-matches a given cookie-path if at least one of
    +        // the following conditions holds:
    +
    +        // o  The cookie-path and the request-path are identical.
    +        if ($path == $this->getPath()) {
    +            return true;
    +        }
    +
    +        $pos = stripos($path, $this->getPath());
    +        if ($pos === 0) {
    +            // o  The cookie-path is a prefix of the request-path, and the last
    +            // character of the cookie-path is %x2F ("/").
    +            if (substr($this->getPath(), -1, 1) === "/") {
    +                return true;
    +            }
    +
    +            // o  The cookie-path is a prefix of the request-path, and the first
    +            // character of the request-path that is not included in the cookie-
    +            // path is a %x2F ("/") character.
    +            if (substr($path, strlen($this->getPath()), 1) === "/") {
    +                return true;
    +            }
    +        }
    +
    +        return false;
         }
     
         /**
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php
    index 68d5be7e63..6b675039fa 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php
    @@ -93,6 +93,7 @@ class ArrayCookieJar implements CookieJarInterface, \Serializable
                 if ($this->strictMode) {
                     throw new InvalidCookieException($result);
                 } else {
    +                $this->removeCookieIfEmpty($cookie);
                     return false;
                 }
             }
    @@ -219,4 +220,18 @@ class ArrayCookieJar implements CookieJarInterface, \Serializable
     
             return $cookies;
         }
    +
    +    /**
    +     * If a cookie already exists and the server asks to set it again with a null value, the
    +     * cookie must be deleted.
    +     *
    +     * @param \Guzzle\Plugin\Cookie\Cookie $cookie
    +     */
    +    private function removeCookieIfEmpty(Cookie $cookie)
    +    {
    +        $cookieValue = $cookie->getValue();
    +        if ($cookieValue === null || $cookieValue === '') {
    +            $this->remove($cookie->getDomain(), $cookie->getPath(), $cookie->getName());
    +        }
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php b/vendor/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php
    index b3e6c22dec..588b9c3e37 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php
    @@ -62,7 +62,7 @@ class ErrorResponsePlugin implements EventSubscriberInterface
                     $errorClassInterface = __NAMESPACE__ . '\\ErrorResponseExceptionInterface';
                     if (!class_exists($className)) {
                         throw new ErrorResponseException("{$className} does not exist");
    -                } elseif (!is_subclass_of($className, $errorClassInterface)) {
    +                } elseif (!(in_array($errorClassInterface, class_implements($className)))) {
                         throw new ErrorResponseException("{$className} must implement {$errorClassInterface}");
                     }
                     throw $className::fromCommand($command, $response);
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php
    index ab7833cee2..2440578cf0 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php
    @@ -226,17 +226,20 @@ class MockPlugin extends AbstractHasDispatcher implements EventSubscriberInterfa
          * Called when a request is about to be sent
          *
          * @param Event $event
    +     * @throws \OutOfBoundsException When queue is empty
          */
         public function onRequestBeforeSend(Event $event)
         {
    -        if ($this->queue) {
    -            $request = $event['request'];
    -            $this->received[] = $request;
    -            // Detach the filter from the client so it's a one-time use
    -            if ($this->temporary && count($this->queue) == 1 && $request->getClient()) {
    -                $request->getClient()->getEventDispatcher()->removeSubscriber($this);
    -            }
    -            $this->dequeue($request);
    +        if (!$this->queue) {
    +            throw new \OutOfBoundsException('Mock queue is empty');
    +        }
    +
    +        $request = $event['request'];
    +        $this->received[] = $request;
    +        // Detach the filter from the client so it's a one-time use
    +        if ($this->temporary && count($this->queue) == 1 && $request->getClient()) {
    +            $request->getClient()->getEventDispatcher()->removeSubscriber($this);
             }
    +        $this->dequeue($request);
         }
     }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php
    index 1e1547f65b..95e0c3e4a8 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php
    @@ -155,7 +155,8 @@ class OauthPlugin implements EventSubscriberInterface
             $params = $this->prepareParameters($params);
     
             // Build signing string from combined params
    -        $parameterString = new QueryString($params);
    +        $parameterString = clone $request->getQuery();
    +        $parameterString->replace($params);
     
             $url = Url::factory($request->getUrl())->setQuery('')->setFragment(null);
     
    @@ -225,7 +226,7 @@ class OauthPlugin implements EventSubscriberInterface
     
             // Sort params
             $params = $params->toArray();
    -        ksort($params);
    +        uksort($params, 'strcmp');
     
             return $params;
         }
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Service/Client.php b/vendor/guzzle/guzzle/src/Guzzle/Service/Client.php
    index f4b76be1cd..3e5f8e53da 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Service/Client.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Service/Client.php
    @@ -147,6 +147,10 @@ class Client extends HttpClient implements ClientInterface
         {
             $this->serviceDescription = $service;
     
    +        if ($this->getCommandFactory() && $this->getCommandFactory() instanceof CompositeFactory) {
    +            $this->commandFactory->add(new Command\Factory\ServiceDescriptionFactory($service));
    +        }
    +
             // If a baseUrl was set on the description, then update the client
             if ($baseUrl = $service->getBaseUrl()) {
                 $this->setBaseUrl($baseUrl);
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php b/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php
    index 64affbc345..bb7124be75 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php
    @@ -55,6 +55,8 @@ class XmlVisitor extends AbstractResponseVisitor
                 $this->processObject($param, $value);
             } elseif ($type == 'array') {
                 $this->processArray($param, $value);
    +        } elseif ($type == 'string' && gettype($value) == 'array') {
    +            $value = '';
             }
     
             if ($value !== null) {
    diff --git a/vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php b/vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php
    index 13b99cdf2b..b045422d4c 100644
    --- a/vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php
    +++ b/vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php
    @@ -157,8 +157,9 @@ class SchemaValidator implements ValidatorInterface
                                 }
                             } else {
                                 // if additionalProperties is set to false and there are additionalProperties in the values, then fail
    -                            $keys = array_keys($value);
    -                            $this->errors[] = sprintf('%s[%s] is not an allowed property', $path, reset($keys));
    +                            foreach ($diff as $prop) {
    +                                $this->errors[] = sprintf('%s[%s] is not an allowed property', $path, $prop);
    +                            }
                             }
                         }
                     }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/GuzzleTestCase.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/GuzzleTestCase.php
    index 8109874e8f..d89c5f0a28 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/GuzzleTestCase.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/GuzzleTestCase.php
    @@ -8,7 +8,7 @@ use Guzzle\Http\Message\Response;
     use Guzzle\Http\Message\RequestInterface;
     use Guzzle\Tests\Http\Message\HeaderComparison;
     use Guzzle\Plugin\Mock\MockPlugin;
    -use Guzzle\Service\Client;
    +use Guzzle\Http\Client;
     use Guzzle\Service\Builder\ServiceBuilderInterface;
     use Guzzle\Service\Builder\ServiceBuilder;
     use Guzzle\Tests\Mock\MockObserver;
    @@ -99,7 +99,7 @@ abstract class GuzzleTestCase extends \PHPUnit_Framework_TestCase
         /**
          * Get a wildcard observer for an event dispatcher
          *
    -     * @param HasDispatcherInterface $hasEvent
    +     * @param HasDispatcherInterface $hasDispatcher
          *
          * @return MockObserver
          */
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/ClientTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/ClientTest.php
    index 6814cacec1..4a91a18f91 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/ClientTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/ClientTest.php
    @@ -589,4 +589,13 @@ class ClientTest extends \Guzzle\Tests\GuzzleTestCase
             $head = $client->head('http://www.foo.com', array(), array('query' => array('foo' => 'bar')));
             $this->assertEquals('bar', $head->getQuery()->get('foo'));
         }
    +
    +    public function testCanSetRelativeUrlStartingWithHttp()
    +    {
    +        $client = new Client('http://www.foo.com');
    +        $this->assertEquals(
    +            'http://www.foo.com/httpfoo',
    +            $client->createRequest('GET', 'httpfoo')->getUrl()
    +        );
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlHandleTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlHandleTest.php
    index e9eab1d85c..bfa85bd628 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlHandleTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlHandleTest.php
    @@ -140,7 +140,9 @@ class CurlHandleTest extends \Guzzle\Tests\GuzzleTestCase
                 "couldn't connect to host",
                 'timeout was reached',
                 'connection time-out',
    -            'connect() timed out!'
    +            'connect() timed out!',
    +            'failed connect to 127.0.0.1:123; connection refused',
    +            'failed to connect to 127.0.0.1 port 123: connection refused'
             );
             $this->assertTrue(in_array(strtolower($h->getError()), $errors), $h->getError() . ' was not the error');
     
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlMultiProxyTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlMultiProxyTest.php
    index 060cd59ded..e04141c5f5 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlMultiProxyTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlMultiProxyTest.php
    @@ -12,13 +12,17 @@ use Guzzle\Http\Curl\CurlMultiProxy;
      */
     class CurlMultiProxyTest extends \Guzzle\Tests\GuzzleTestCase
     {
    +    const SELECT_TIMEOUT = 23.1;
    +
    +    const MAX_HANDLES = 2;
    +
         /** @var \Guzzle\Http\Curl\CurlMultiProxy */
         private $multi;
     
         protected function setUp()
         {
             parent::setUp();
    -        $this->multi = new CurlMultiProxy();
    +        $this->multi = new CurlMultiProxy(self::MAX_HANDLES, self::SELECT_TIMEOUT);
         }
     
         public function tearDown()
    @@ -28,8 +32,14 @@ class CurlMultiProxyTest extends \Guzzle\Tests\GuzzleTestCase
     
         public function testConstructorSetsMaxHandles()
         {
    -        $m = new CurlMultiProxy(2);
    -        $this->assertEquals(2, $this->readAttribute($m, 'maxHandles'));
    +        $m = new CurlMultiProxy(self::MAX_HANDLES, self::SELECT_TIMEOUT);
    +        $this->assertEquals(self::MAX_HANDLES, $this->readAttribute($m, 'maxHandles'));
    +    }
    +
    +    public function testConstructorSetsSelectTimeout()
    +    {
    +        $m = new CurlMultiProxy(self::MAX_HANDLES, self::SELECT_TIMEOUT);
    +        $this->assertEquals(self::SELECT_TIMEOUT, $this->readAttribute($m, 'selectTimeout'));
         }
     
         public function testAddingRequestsAddsToQueue()
    @@ -90,7 +100,7 @@ class CurlMultiProxyTest extends \Guzzle\Tests\GuzzleTestCase
                 "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"
             ));
             $client = new Client($this->getServer()->getUrl());
    -        $client->setCurlMulti(new CurlMultiProxy(2));
    +        $client->setCurlMulti(new CurlMultiProxy(self::MAX_HANDLES, self::SELECT_TIMEOUT));
             $request = $client->get();
             $request->send();
             $this->assertEquals(200, $request->getResponse()->getStatusCode());
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestFactoryTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestFactoryTest.php
    index d43e0899c1..f91bc84a14 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestFactoryTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestFactoryTest.php
    @@ -421,7 +421,10 @@ class HttpRequestFactoryTest extends \Guzzle\Tests\GuzzleTestCase
     
         public function testCanAddPlugins()
         {
    -        $mock = new MockPlugin(array(new Response(200)));
    +        $mock = new MockPlugin(array(
    +            new Response(200),
    +            new Response(200)
    +        ));
             $client = new Client();
             $client->addSubscriber($mock);
             $request = $client->get('/', array(), array(
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestTest.php
    index 5f4d8a789b..5bf6248296 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestTest.php
    @@ -622,4 +622,18 @@ class RequestTest extends \Guzzle\Tests\GuzzleTestCase
             $request->setResponse(new Response(200, array(), 'foo'));
             $this->assertEquals('foo', (string) $en);
         }
    +
    +    public function testCanChangePortThroughScheme()
    +    {
    +        $request = new Request('GET', 'http://foo.com');
    +        $request->setScheme('https');
    +        $this->assertEquals('https://foo.com', (string) $request->getUrl());
    +        $this->assertEquals('foo.com', $request->getHost());
    +        $request->setScheme('http');
    +        $this->assertEquals('http://foo.com', (string) $request->getUrl());
    +        $this->assertEquals('foo.com', $request->getHost());
    +        $request->setPort(null);
    +        $this->assertEquals('http://foo.com', (string) $request->getUrl());
    +        $this->assertEquals('foo.com', $request->getHost());
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryStringTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryStringTest.php
    index 0513f62241..948db442d4 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryStringTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryStringTest.php
    @@ -92,13 +92,13 @@ class QueryStringTest extends \Guzzle\Tests\GuzzleTestCase
                 'test4'  => null,
             );
             $this->q->replace($params);
    -        $this->assertEquals('test=value&test%202=this%20is%20a%20test%3F&test3%5B0%5D=v1&test3%5B1%5D=v2&test3%5B2%5D=v3&test4=', $this->q->__toString());
    +        $this->assertEquals('test=value&test%202=this%20is%20a%20test%3F&test3%5B0%5D=v1&test3%5B1%5D=v2&test3%5B2%5D=v3&test4', $this->q->__toString());
             $this->q->useUrlEncoding(false);
    -        $this->assertEquals('test=value&test 2=this is a test?&test3[0]=v1&test3[1]=v2&test3[2]=v3&test4=', $this->q->__toString());
    +        $this->assertEquals('test=value&test 2=this is a test?&test3[0]=v1&test3[1]=v2&test3[2]=v3&test4', $this->q->__toString());
     
             // Use an alternative aggregator
             $this->q->setAggregator(new CommaAggregator());
    -        $this->assertEquals('test=value&test 2=this is a test?&test3=v1,v2,v3&test4=', $this->q->__toString());
    +        $this->assertEquals('test=value&test 2=this is a test?&test3=v1,v2,v3&test4', $this->q->__toString());
         }
     
         public function testAllowsMultipleValuesPerKey()
    @@ -147,7 +147,7 @@ class QueryStringTest extends \Guzzle\Tests\GuzzleTestCase
                 // Ensure that query string values are percent decoded
                 array('q%20a=a%20b', array('q a' => 'a b')),
                 // Ensure null values can be added
    -            array('q&a', array('q' => QueryString::BLANK, 'a' => QueryString::BLANK)),
    +            array('q&a', array('q' => false, 'a' => false)),
             );
         }
     
    @@ -207,9 +207,10 @@ class QueryStringTest extends \Guzzle\Tests\GuzzleTestCase
                 'foo' => 0,
                 'baz' => '0',
                 'bar' => null,
    -            'boo' => false
    +            'boo' => false,
    +            'bam' => ''
             ));
    -        $this->assertEquals('foo=0&baz=0&bar=&boo=', (string) $query);
    +        $this->assertEquals('foo=0&baz=0&bar&boo&bam=', (string) $query);
         }
     
         public function testFromStringDoesntStripTrailingEquals()
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/UrlTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/UrlTest.php
    index acba289855..28f26718bb 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/UrlTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Http/UrlTest.php
    @@ -127,11 +127,16 @@ class UrlTest extends \Guzzle\Tests\GuzzleTestCase
         {
             // Does nothing here
             $this->assertEquals('http://e.com/base?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath(false));
    +        $this->assertEquals('http://e.com/base?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath(null));
    +        $this->assertEquals('http://e.com/base?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath(array()));
    +        $this->assertEquals('http://e.com/base?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath(new \stdClass()));
             $this->assertEquals('http://e.com/base?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath(''));
             $this->assertEquals('http://e.com/base?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath('/'));
    -
    +        $this->assertEquals('http://e.com/baz/foo', (string) Url::factory('http://e.com/baz/')->addPath('foo'));
             $this->assertEquals('http://e.com/base/relative?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath('relative'));
             $this->assertEquals('http://e.com/base/relative?a=1', (string) Url::factory('http://e.com/base?a=1')->addPath('/relative'));
    +        $this->assertEquals('http://e.com/base/0', (string) Url::factory('http://e.com/base')->addPath('0'));
    +        $this->assertEquals('http://e.com/base/0/1', (string) Url::factory('http://e.com/base')->addPath('0')->addPath('1'));
         }
     
         /**
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Parser/Cookie/CookieParserProvider.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Parser/Cookie/CookieParserProvider.php
    index bef5b1c63f..86d43c0b15 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Parser/Cookie/CookieParserProvider.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Parser/Cookie/CookieParserProvider.php
    @@ -107,7 +107,7 @@ class CookieParserProvider extends \Guzzle\Tests\GuzzleTestCase
                 ),
                 // Tests getting the domain and path from a reference request
                 array(array(
    -                'foo=1; port="80,8081"; httponly', 'foo=1; port="80,8081"; domain=www.test.com; HttpOnly;', 'foo=1; ; domain=www.test.com; path=/path/; port="80,8081"; HttpOnly;'),
    +                'foo=1; port="80,8081"; httponly', 'foo=1; port="80,8081"; domain=www.test.com; HttpOnly;', 'foo=1; ; domain=www.test.com; path=/path; port="80,8081"; HttpOnly;'),
                     array(
                         'cookies' => array(
                             'foo' => 1
    @@ -117,7 +117,7 @@ class CookieParserProvider extends \Guzzle\Tests\GuzzleTestCase
                         'domain' => 'www.test.com',
                         'expires' => null,
                         'max_age' => null,
    -                    'path' => '/path/',
    +                    'path' => '/path',
                         'port' => array('80', '8081'),
                         'secure' => null,
                         'version' => null,
    @@ -135,7 +135,6 @@ class CookieParserProvider extends \Guzzle\Tests\GuzzleTestCase
                             'justacookie' => 'foo'
                         ),
                         'domain' => 'example.com',
    -                    'path' => '',
                         'data' => array(),
                         'discard' => null,
                         'expires' => null,
    @@ -249,6 +248,91 @@ class CookieParserProvider extends \Guzzle\Tests\GuzzleTestCase
                         'http_only' => false
                     )
                 ),
    +            // rfc6265#section-5.1.4
    +            array(
    +                'cookie=value',
    +                array(
    +                    'cookies' => array(
    +                        'cookie' => 'value'
    +                    ),
    +                    'domain' => 'example.com',
    +                    'data' => array(),
    +                    'discard' => null,
    +                    'expires' => null,
    +                    'max_age' => null,
    +                    'path' => '/some/path',
    +                    'port' => null,
    +                    'secure' => null,
    +                    'version' => null,
    +                    'comment' => null,
    +                    'comment_url' => null,
    +                    'http_only' => false
    +                ),
    +                'http://example.com/some/path/test.html'
    +            ),
    +            array(
    +                'empty=path',
    +                array(
    +                    'cookies' => array(
    +                        'empty' => 'path'
    +                    ),
    +                    'domain' => 'example.com',
    +                    'data' => array(),
    +                    'discard' => null,
    +                    'expires' => null,
    +                    'max_age' => null,
    +                    'path' => '/',
    +                    'port' => null,
    +                    'secure' => null,
    +                    'version' => null,
    +                    'comment' => null,
    +                    'comment_url' => null,
    +                    'http_only' => false
    +                ),
    +                'http://example.com/test.html'
    +            ),
    +            array(
    +                'baz=qux',
    +                array(
    +                    'cookies' => array(
    +                        'baz' => 'qux'
    +                    ),
    +                    'domain' => 'example.com',
    +                    'data' => array(),
    +                    'discard' => null,
    +                    'expires' => null,
    +                    'max_age' => null,
    +                    'path' => '/',
    +                    'port' => null,
    +                    'secure' => null,
    +                    'version' => null,
    +                    'comment' => null,
    +                    'comment_url' => null,
    +                    'http_only' => false
    +                ),
    +                'http://example.com?query=here'
    +            ),
    +            array(
    +                'test=noSlashPath; path=someString',
    +                array(
    +                    'cookies' => array(
    +                        'test' => 'noSlashPath'
    +                    ),
    +                    'domain' => 'example.com',
    +                    'data' => array(),
    +                    'discard' => null,
    +                    'expires' => null,
    +                    'max_age' => null,
    +                    'path' => '/real/path',
    +                    'port' => null,
    +                    'secure' => null,
    +                    'version' => null,
    +                    'comment' => null,
    +                    'comment_url' => null,
    +                    'http_only' => false
    +                ),
    +                'http://example.com/real/path/'
    +            ),
             );
         }
     
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultRevalidationTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultRevalidationTest.php
    index 19bcecacef..0699cb2665 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultRevalidationTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultRevalidationTest.php
    @@ -176,6 +176,7 @@ class DefaultRevalidationTest extends \Guzzle\Tests\GuzzleTestCase
                     'Last-Modified'  => $lm,
                     'Content-Length' => 2
                 ), 'hi'),
    +            new CurlException('Bleh'),
                 new CurlException('Bleh')
             ));
             $client->addSubscriber(new CachePlugin());
    @@ -184,7 +185,7 @@ class DefaultRevalidationTest extends \Guzzle\Tests\GuzzleTestCase
             $response = $client->get()->send();
             $this->assertEquals(200, $response->getStatusCode());
             $this->assertEquals('hi', $response->getBody(true));
    -        $this->assertEquals(2, count($mock->getReceivedRequests()));
    +        $this->assertEquals(3, count($mock->getReceivedRequests()));
             $this->assertEquals(0, count($mock->getQueue()));
         }
     
    @@ -198,6 +199,7 @@ class DefaultRevalidationTest extends \Guzzle\Tests\GuzzleTestCase
                     'Last-Modified' => $lm,
                     'Content-Length' => 2
                 ), 'hi'),
    +            new CurlException('Oh no!'),
                 new CurlException('Oh no!')
             ));
             $cache = new CachePlugin();
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieJar/ArrayCookieJarTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieJar/ArrayCookieJarTest.php
    index 32897d0844..5d0f668a6e 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieJar/ArrayCookieJarTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieJar/ArrayCookieJarTest.php
    @@ -350,4 +350,36 @@ class ArrayCookieJarTest extends \Guzzle\Tests\GuzzleTestCase
                 'domain' => 'bar'
             )));
         }
    +
    +    public function testRemoveExistingCookieIfEmpty()
    +    {
    +        // Add a cookie that should not be affected
    +        $a = new Cookie(array(
    +            'name' => 'foo',
    +            'value' => 'nope',
    +            'domain' => 'foo.com',
    +            'path' => '/abc'
    +        ));
    +        $this->jar->add($a);
    +
    +        $data = array(
    +            'name' => 'foo',
    +            'value' => 'bar',
    +            'domain' => 'foo.com',
    +            'path' => '/'
    +        );
    +
    +        $b = new Cookie($data);
    +        $this->assertTrue($this->jar->add($b));
    +        $this->assertEquals(2, count($this->jar));
    +
    +        // Try to re-set the same cookie with no value: assert that cookie is not added
    +        $data['value'] = null;
    +        $this->assertFalse($this->jar->add(new Cookie($data)));
    +        // assert that original cookie has been deleted
    +        $cookies = $this->jar->all('foo.com');
    +        $this->assertTrue(in_array($a, $cookies, true));
    +        $this->assertFalse(in_array($b, $cookies, true));
    +        $this->assertEquals(1, count($this->jar));
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieTest.php
    index 3d8b0e9bbf..9fb0b4310b 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieTest.php
    @@ -164,9 +164,24 @@ class CookieTest extends \Guzzle\Tests\GuzzleTestCase
             $this->assertTrue($cookie->matchesPath('/foo'));
     
             $cookie->setPath('/foo');
    +
    +        // o  The cookie-path and the request-path are identical.
             $this->assertTrue($cookie->matchesPath('/foo'));
    -        $this->assertTrue($cookie->matchesPath('/foo/bar'));
             $this->assertFalse($cookie->matchesPath('/bar'));
    +
    +        // o  The cookie-path is a prefix of the request-path, and the first
    +        // character of the request-path that is not included in the cookie-
    +        // path is a %x2F ("/") character.
    +        $this->assertTrue($cookie->matchesPath('/foo/bar'));
    +        $this->assertFalse($cookie->matchesPath('/fooBar'));
    +
    +        // o  The cookie-path is a prefix of the request-path, and the last
    +        // character of the cookie-path is %x2F ("/").
    +        $cookie->setPath('/foo/');
    +        $this->assertTrue($cookie->matchesPath('/foo/bar'));
    +        $this->assertFalse($cookie->matchesPath('/fooBaz'));
    +        $this->assertFalse($cookie->matchesPath('/foo'));
    +
         }
     
         public function cookieValidateProvider()
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Mock/MockPluginTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Mock/MockPluginTest.php
    index 52be806099..3760abdbe6 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Mock/MockPluginTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Mock/MockPluginTest.php
    @@ -119,8 +119,9 @@ class MockPluginTest extends \Guzzle\Tests\GuzzleTestCase
     
         /**
          * @depends testAddsResponseFilesToQueue
    +     * @expectedException \OutOfBoundsException
          */
    -    public function testUpdateIgnoresWhenEmpty()
    +    public function testUpdateThrowsExceptionWhenEmpty()
         {
             $p = new MockPlugin();
             $p->onRequestBeforeSend(new Event());
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Oauth/OauthPluginTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Oauth/OauthPluginTest.php
    index ed753177ae..3892fb62b9 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Oauth/OauthPluginTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Oauth/OauthPluginTest.php
    @@ -3,6 +3,7 @@
     namespace Guzzle\Tests\Plugin\Oauth;
     
     use Guzzle\Http\Message\RequestFactory;
    +use Guzzle\Http\QueryAggregator\CommaAggregator;
     use Guzzle\Plugin\Oauth\OauthPlugin;
     use Guzzle\Common\Event;
     
    @@ -149,6 +150,21 @@ class OauthPluginTest extends \Guzzle\Tests\GuzzleTestCase
             $this->assertContains('a%255Bb%255D%255Bc%255D%3Dd%26a%255Bb%255D%255Be%255D%3Df%26c%3Dd%26e%3Df%26', $p->getStringToSign($request, self::TIMESTAMP, self::NONCE));
         }
     
    +    /**
    +     * @depends testMultiDimensionalArray
    +     */
    +    public function testMultiDimensionalArrayWithNonDefaultQueryAggregator()
    +    {
    +        $p = new OauthPlugin($this->config);
    +        $request = $this->getRequest();
    +        $aggregator = new CommaAggregator();
    +        $query = $request->getQuery()->setAggregator($aggregator)
    +            ->set('g', array('h', 'i', 'j'))
    +            ->set('k', array('l'))
    +            ->set('m', array('n', 'o'));
    +        $this->assertContains('a%3Db%26c%3Dd%26e%3Df%26g%3Dh%2Ci%2Cj%26k%3Dl%26m%3Dn%2Co', $p->getStringToSign($request, self::TIMESTAMP, self::NONCE));
    +    }
    +
         /**
          * @depends testCreatesStringToSignFromPostRequest
          */
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php
    index 6ca92cd137..aee29ed8da 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php
    @@ -304,4 +304,17 @@ class ClientTest extends \Guzzle\Tests\GuzzleTestCase
                 }
             }
         }
    +
    +    public function testGetCommandAfterTwoSetDescriptions()
    +    {
    +        $service1 = ServiceDescription::factory(__DIR__ . '/../TestData/test_service.json');
    +        $service2 = ServiceDescription::factory(__DIR__ . '/../TestData/test_service_3.json');
    +
    +        $client = new Mock\MockClient();
    +
    +        $client->setDescription($service1);
    +        $client->getCommand('foo_bar');
    +        $client->setDescription($service2);
    +        $client->getCommand('baz_qux');
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php
    index 1b95ac3b8b..b7173d4862 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php
    @@ -134,11 +134,19 @@ class CommandTest extends AbstractCommandTest
          */
         public function testConvertsInvalidJsonResponsesToArray()
         {
    +        $json = '{ "key": "Hi!" }invalid';
    +        // Some implementations of php-json extension are not strict enough
    +        // and allow to parse invalid json ignoring invalid parts
    +        // See https://github.com/remicollet/pecl-json-c/issues/5
    +        if (json_decode($json) && JSON_ERROR_NONE === json_last_error()) {
    +            $this->markTestSkipped('php-pecl-json library regression issues');
    +        }
    +
             $client = $this->getClient();
             $this->setMockResponse($client, array(
                 new \Guzzle\Http\Message\Response(200, array(
                     'Content-Type' => 'application/json'
    -                ), '{ "key": "Hi!" }invalid'
    +                ), $json
                 )
             ));
             $command = new MockCommand();
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php
    index e7acc3247d..f87cec7cd3 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php
    @@ -412,4 +412,20 @@ class XmlVisitorTest extends AbstractResponseVisitorTest
             $visitor->visit($this->command, $this->response, $param, $this->value);
             $this->assertEquals(array('foo' => array('bar' => 15)), $this->value);
         }
    +
    +    public function testProperlyHandlesEmptyStringValues()
    +    {
    +        $visitor = new Visitor();
    +        $param = new Parameter(array(
    +            'name'                 => 'foo',
    +            'type'                 => 'object',
    +            'properties'           => array(
    +                'bar' => array('type' => 'string')
    +            ),
    +        ));
    +        $xml = '';
    +        $value = json_decode(json_encode(new \SimpleXMLElement($xml)), true);
    +        $visitor->visit($this->command, $this->response, $param, $value);
    +        $this->assertEquals(array('foo' => array('bar' => '')), $value);
    +    }
     }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php
    index 2cd03187d3..573fb6d6e3 100644
    --- a/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php
    @@ -66,7 +66,6 @@ class ResourceIteratorTest extends \Guzzle\Tests\GuzzleTestCase
             ));
     
             $d = array();
    -        reset($ri);
             foreach ($ri as $data) {
                 $d[] = $data;
             }
    diff --git a/vendor/guzzle/guzzle/tests/Guzzle/Tests/TestData/test_service_3.json b/vendor/guzzle/guzzle/tests/Guzzle/Tests/TestData/test_service_3.json
    new file mode 100644
    index 0000000000..ae2ae0bd49
    --- /dev/null
    +++ b/vendor/guzzle/guzzle/tests/Guzzle/Tests/TestData/test_service_3.json
    @@ -0,0 +1,40 @@
    +{
    +    "includes": [ "test_service2.json" ],
    +    "operations": {
    +        "test": {
    +            "uri": "/path"
    +        },
    +        "concrete": {
    +            "extends": "abstract"
    +        },
    +        "baz_qux": {
    +            "uri": "/testing",
    +            "parameters": {
    +                "other": {
    +                    "location": "json",
    +                    "location_key": "Other"
    +                },
    +                "test": {
    +                    "type": "object",
    +                    "location": "json",
    +                    "properties": {
    +                        "baz": {
    +                            "type": "boolean",
    +                            "default": true
    +                        },
    +                        "bar": {
    +                            "type": "string",
    +                            "filters": [
    +                                {
    +                                    "method": "strtolower",
    +                                    "args": ["test", "@value"]
    +                                },
    +                                "strtoupper"
    +                            ]
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    diff --git a/vendor/imagine/imagine/CHANGELOG.md b/vendor/imagine/imagine/CHANGELOG.md
    index 46ff1e70f8..b24c4ad62d 100644
    --- a/vendor/imagine/imagine/CHANGELOG.md
    +++ b/vendor/imagine/imagine/CHANGELOG.md
    @@ -22,6 +22,7 @@
       * Add width parameter to Drawer::text (@salemgolemugoo).
       * Add NotSupportedException when a driver does not support an operation (@rouffj).
       * Add support for metadata.
    +  * Fix #158: GD alpha detection + Color::isOpaque are broken.
     
     ### 0.5.0 (2013-07-10)
     
    diff --git a/vendor/imagine/imagine/README.md b/vendor/imagine/imagine/README.md
    index 7c21cead69..837706428e 100644
    --- a/vendor/imagine/imagine/README.md
    +++ b/vendor/imagine/imagine/README.md
    @@ -2,6 +2,8 @@
     [![project status](http://stillmaintained.com/avalanche123/Imagine.png)](http://stillmaintained.com/avalanche123/Imagine)
     [![Build Status](https://secure.travis-ci.org/avalanche123/Imagine.png?branch=develop)](http://travis-ci.org/avalanche123/Imagine)
     
    +Tweet about it using the [#php_imagine](https://twitter.com/search?q=%23php_imagine) hashtag.
    +
     Image manipulation library for PHP 5.3 inspired by Python's PIL and other image
     libraries.
     
    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Exception/NotSupportedException.html b/vendor/imagine/imagine/docs/API/API/Imagine/Exception/NotSupportedException.html
    new file mode 100644
    index 0000000000..91fb95c6da
    --- /dev/null
    +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Exception/NotSupportedException.html
    @@ -0,0 +1,43 @@
    +
    +
    +    
    +        
    +        
    +        Imagine\Exception\NotSupportedException | 
    +                    
    +                            
    +        
    +            
    + + +
    + +
    Class
    +

    Imagine\Exception\NotSupportedException

    +
    +
    +

    class + NotSupportedException extends RuntimeException implements + Exception

    + +
    +

    Should be used when a driver does not support an operation.

    +

    +

    +
    + + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Filter/Transformation.html b/vendor/imagine/imagine/docs/API/API/Imagine/Filter/Transformation.html index 376164e287..3c196b36eb 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Filter/Transformation.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Filter/Transformation.html @@ -303,7 +303,7 @@

    -
    at line 98
    +
    at line 95
    public array getFilters()

    @@ -328,7 +328,7 @@

    -
    at line 111
    +
    at line 108
    public ImageInterface apply(ImageInterface $image)

    @@ -365,7 +365,7 @@

    -
    at line 123
    +
    at line 120
    public ManipulatorInterface copy()

    @@ -401,7 +401,7 @@

    -
    at line 131
    +
    at line 128
    public ManipulatorInterface crop(PointInterface $start, BoxInterface $size)

    @@ -459,7 +459,7 @@

    -
    at line 139
    +
    at line 136
    public ManipulatorInterface flipHorizontally()

    @@ -495,7 +495,7 @@

    -
    at line 147
    +
    at line 144
    public ManipulatorInterface flipVertically()

    @@ -531,7 +531,7 @@

    -
    at line 155
    +
    at line 152
    public ManipulatorInterface strip()

    @@ -567,7 +567,7 @@

    -
    at line 163
    +
    at line 160
    public ManipulatorInterface paste(ImageInterface $image, PointInterface $start)

    @@ -629,7 +629,7 @@

    -
    at line 171
    +
    at line 168
    public ManipulatorInterface applyMask(ImageInterface $mask)

    @@ -666,7 +666,7 @@

    -
    at line 179
    +
    at line 176
    public ManipulatorInterface fill(FillInterface $fill)

    @@ -703,7 +703,7 @@

    -
    at line 187
    +
    at line 184
    public ManipulatorInterface resize(BoxInterface $size, string $filter = ImageInterface::FILTER_UNDEFINED)

    @@ -756,7 +756,7 @@

    -
    at line 195
    +
    at line 192
    public ManipulatorInterface rotate(integer $angle, ColorInterface $background = null)

    @@ -809,7 +809,7 @@ area of rotated image.

    -
    at line 203
    +
    at line 200
    public ManipulatorInterface save(string $path = null, array $options = array())

    @@ -862,7 +862,7 @@ area of rotated image.

    -
    at line 211
    +
    at line 208
    public ManipulatorInterface show(string $format, array $options = array())

    @@ -915,7 +915,7 @@ area of rotated image.

    -
    at line 219
    +
    at line 216
    public ManipulatorInterface thumbnail(BoxInterface $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)

    @@ -973,7 +973,7 @@ area of rotated image.

    -
    at line 232
    +
    at line 229
    public Transformation add(FilterInterface $filter, int $priority)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Drawer.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Drawer.html index f9fa91c646..c59d986d5b 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Drawer.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Drawer.html @@ -238,7 +238,7 @@

    -
    at line 81
    +
    at line 77
    public DrawerInterface chord(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -321,7 +321,7 @@

    -
    at line 113
    +
    at line 106
    public DrawerInterface ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -392,7 +392,7 @@

    -
    at line 144
    +
    at line 135
    public DrawerInterface line(PointInterface $start, PointInterface $end, ColorInterface $color, integer $thickness = 1)

    @@ -447,7 +447,7 @@

    -
    at line 170
    +
    at line 158
    public DrawerInterface pieSlice(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -530,7 +530,7 @@

    -
    at line 202
    +
    at line 187
    public DrawerInterface dot(PointInterface $position, ColorInterface $color)

    @@ -583,7 +583,7 @@

    -
    at line 226
    +
    at line 208
    public DrawerInterface polygon(array $coordinates, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -648,7 +648,7 @@ three coordinates

    -
    at line 265
    +
    at line 245
    public DrawerInterface text(string $string, AbstractFont $font, PointInterface $position, integer $angle, integer $width = null)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Effects.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Effects.html index 6d06a40903..b324de60d4 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Effects.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Effects.html @@ -309,7 +309,7 @@

    -
    at line 88
    +
    at line 86
    public EffectsInterface sharpen()

    @@ -345,7 +345,7 @@

    -
    at line 103
    +
    at line 101
    public EffectsInterface blur(float|int $sigma = 1)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Image.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Image.html index d6801a0473..e334281fe2 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Image.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Image.html @@ -454,7 +454,7 @@

    -
    at line 59
    +
    at line 58
    public __construct(resource $resource, PaletteInterface $palette, MetadataBag $metadata)

    @@ -493,7 +493,7 @@

    -
    at line 69
    +
    at line 68
    public __destruct()

    @@ -509,7 +509,7 @@

    -
    at line 81
    +
    at line 80
    public resource getGdResource()

    @@ -535,7 +535,7 @@

    -
    at line 89
    +
    at line 88
    final public ManipulatorInterface copy()

    @@ -571,7 +571,7 @@

    -
    at line 106
    +
    at line 103
    final public ManipulatorInterface crop(PointInterface $start, BoxInterface $size)

    @@ -629,7 +629,7 @@

    -
    at line 136
    +
    at line 128
    final public ManipulatorInterface paste(ImageInterface $image, PointInterface $start)

    @@ -691,7 +691,7 @@

    -
    at line 170
    +
    at line 155
    final public ManipulatorInterface resize(BoxInterface $size, string $filter = ImageInterface::FILTER_UNDEFINED)

    @@ -744,7 +744,7 @@

    -
    at line 203
    +
    at line 186
    final public ManipulatorInterface rotate(integer $angle, ColorInterface $background = null)

    @@ -797,7 +797,7 @@ area of rotated image.

    -
    at line 223
    +
    at line 204
    final public ManipulatorInterface save(string $path = null, array $options = array())

    @@ -850,7 +850,7 @@ area of rotated image.

    -
    at line 250
    +
    at line 229
    public ManipulatorInterface show(string $format, array $options = array())

    @@ -903,7 +903,7 @@ area of rotated image.

    -
    at line 262
    +
    at line 241
    public string get(string $format, array $options = array())

    @@ -955,7 +955,7 @@ area of rotated image.

    -
    at line 273
    +
    at line 252
    public string __toString()

    @@ -990,7 +990,7 @@ area of rotated image.

    -
    at line 281
    +
    at line 260
    final public ManipulatorInterface flipHorizontally()

    @@ -1026,7 +1026,7 @@ area of rotated image.

    -
    at line 305
    +
    at line 283
    final public ManipulatorInterface flipVertically()

    @@ -1062,7 +1062,7 @@ area of rotated image.

    -
    at line 329
    +
    at line 306
    final public ManipulatorInterface strip()

    @@ -1098,7 +1098,7 @@ area of rotated image.

    -
    at line 341
    +
    at line 315
    public DrawerInterface draw()

    @@ -1124,7 +1124,7 @@ area of rotated image.

    -
    at line 349
    +
    at line 323
    public EffectsInterface effects()

    @@ -1151,7 +1151,7 @@ area of rotated image.

    -
    at line 357
    +
    at line 331
    public BoxInterface getSize()

    @@ -1177,7 +1177,7 @@ area of rotated image.

    -
    at line 365
    +
    at line 339
    public ManipulatorInterface applyMask(ImageInterface $mask)

    @@ -1214,7 +1214,7 @@ area of rotated image.

    -
    at line 406
    +
    at line 371
    public ManipulatorInterface fill(FillInterface $fill)

    @@ -1251,7 +1251,7 @@ area of rotated image.

    -
    at line 428
    +
    at line 389
    public ImageInterface mask()

    @@ -1277,7 +1277,7 @@ area of rotated image.

    -
    at line 442
    +
    at line 403
    public array histogram()

    @@ -1303,7 +1303,7 @@ area of rotated image.

    -
    at line 459
    +
    at line 420
    public ColorInterface getColorAt(PointInterface $point)

    @@ -1350,7 +1350,7 @@ area of rotated image.

    -
    at line 482
    +
    at line 435
    public LayersInterface layers()

    @@ -1389,7 +1389,7 @@ area of rotated image.

    -
    at line 494
    +
    at line 447
    public ImageInterface interlace(string $scheme)

    @@ -1435,7 +1435,7 @@ area of rotated image.

    -
    at line 515
    +
    at line 468
    public PaletteInterface palette()

    @@ -1461,7 +1461,7 @@ area of rotated image.

    -
    at line 523
    +
    at line 476
    public ImageInterface profile(ProfileInterface $profile)

    @@ -1508,7 +1508,7 @@ area of rotated image.

    -
    at line 531
    +
    at line 484
    public ImageInterface usePalette(PaletteInterface $palette)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Imagine.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Imagine.html index 420dc59d96..501866677e 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Imagine.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gd/Imagine.html @@ -218,7 +218,7 @@

    -
    at line 62
    +
    at line 46
    public ImageInterface create(BoxInterface $size, ColorInterface $color = null)

    @@ -276,7 +276,7 @@

    -
    at line 105
    +
    at line 84
    public ImageInterface open(string $path)

    @@ -323,7 +323,7 @@

    -
    at line 127
    +
    at line 104
    public ImageInterface load(string $string)

    @@ -370,7 +370,7 @@

    -
    at line 141
    +
    at line 112
    public ImageInterface read(resource $resource)

    @@ -417,7 +417,7 @@

    -
    at line 159
    +
    at line 130
    public FontInterface font(string $file, integer $size, ColorInterface $color)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Drawer.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Drawer.html index 9e6c525624..460e2c721e 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Drawer.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Drawer.html @@ -135,7 +135,7 @@

    Details

    -
    at line 36
    +
    at line 37
    public __construct(Gmagick $gmagick)

    @@ -163,7 +163,7 @@

    -
    at line 44
    +
    at line 45
    public DrawerInterface arc(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, integer $thickness = 1)

    @@ -240,7 +240,7 @@

    -
    at line 84
    +
    at line 83
    public DrawerInterface chord(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -323,7 +323,7 @@

    -
    at line 130
    +
    at line 127
    public DrawerInterface ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -394,7 +394,7 @@

    -
    at line 173
    +
    at line 168
    public DrawerInterface line(PointInterface $start, PointInterface $end, ColorInterface $color, integer $thickness = 1)

    @@ -449,7 +449,7 @@

    -
    at line 206
    +
    at line 199
    public DrawerInterface pieSlice(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -532,7 +532,7 @@

    -
    at line 240
    +
    at line 233
    public DrawerInterface dot(PointInterface $position, ColorInterface $color)

    @@ -585,7 +585,7 @@

    -
    at line 269
    +
    at line 259
    public DrawerInterface polygon(array $coordinates, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -650,7 +650,7 @@ three coordinates

    -
    at line 312
    +
    at line 297
    public DrawerInterface text(string $string, AbstractFont $font, PointInterface $position, integer $angle, integer $width = null)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Effects.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Effects.html index 082ad0b456..684860da34 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Effects.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Effects.html @@ -226,7 +226,7 @@

    -
    at line 67
    +
    at line 66
    public EffectsInterface grayscale()

    @@ -262,7 +262,7 @@

    -
    at line 81
    +
    at line 80
    public EffectsInterface colorize(ColorInterface $color)

    @@ -309,7 +309,7 @@

    -
    at line 89
    +
    at line 88
    public EffectsInterface sharpen()

    @@ -345,7 +345,7 @@

    -
    at line 97
    +
    at line 96
    public EffectsInterface blur(float|int $sigma = 1)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Image.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Image.html index d6f1d85297..5069c175dd 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Image.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Image.html @@ -639,7 +639,7 @@

    -
    at line 129
    +
    at line 118
    public ManipulatorInterface flipHorizontally()

    @@ -675,7 +675,7 @@

    -
    at line 145
    +
    at line 132
    public ManipulatorInterface flipVertically()

    @@ -711,7 +711,7 @@

    -
    at line 161
    +
    at line 146
    public ManipulatorInterface strip()

    @@ -747,7 +747,7 @@

    -
    at line 178
    +
    at line 161
    public ManipulatorInterface paste(ImageInterface $image, PointInterface $start)

    @@ -809,7 +809,7 @@

    -
    at line 213
    +
    at line 183
    public ManipulatorInterface resize(BoxInterface $size, string $filter = ImageInterface::FILTER_UNDEFINED)

    @@ -862,7 +862,7 @@

    -
    at line 257
    +
    at line 220
    public ManipulatorInterface rotate(integer $angle, ColorInterface $background = null)

    @@ -915,7 +915,7 @@ area of rotated image.

    -
    at line 344
    +
    at line 305
    public ManipulatorInterface save(string $path = null, array $options = array())

    @@ -968,7 +968,7 @@ area of rotated image.

    -
    at line 370
    +
    at line 327
    public ManipulatorInterface show(string $format, array $options = array())

    @@ -1021,7 +1021,7 @@ area of rotated image.

    -
    at line 381
    +
    at line 338
    public string get(string $format, array $options = array())

    @@ -1073,7 +1073,7 @@ area of rotated image.

    -
    at line 429
    +
    at line 382
    public string __toString()

    @@ -1108,7 +1108,7 @@ area of rotated image.

    -
    at line 437
    +
    at line 390
    public DrawerInterface draw()

    @@ -1134,7 +1134,7 @@ area of rotated image.

    -
    at line 445
    +
    at line 398
    public EffectsInterface effects()

    @@ -1161,7 +1161,7 @@ area of rotated image.

    -
    at line 453
    +
    at line 406
    public BoxInterface getSize()

    @@ -1187,7 +1187,7 @@ area of rotated image.

    -
    at line 470
    +
    at line 421
    public ManipulatorInterface applyMask(ImageInterface $mask)

    @@ -1224,7 +1224,7 @@ area of rotated image.

    -
    at line 509
    +
    at line 447
    public ImageInterface mask()

    @@ -1250,7 +1250,7 @@ area of rotated image.

    -
    at line 527
    +
    at line 463
    public ManipulatorInterface fill(FillInterface $fill)

    @@ -1287,7 +1287,7 @@ area of rotated image.

    -
    at line 559
    +
    at line 493
    public array histogram()

    @@ -1313,7 +1313,7 @@ area of rotated image.

    -
    at line 582
    +
    at line 511
    public ColorInterface getColorAt(PointInterface $point)

    @@ -1360,7 +1360,7 @@ area of rotated image.

    -
    at line 617
    +
    at line 544
    public ColorInterface pixelToColor(GmagickPixel $pixel)

    @@ -1405,7 +1405,7 @@ area of rotated image.

    -
    at line 656
    +
    at line 581
    public LayersInterface layers()

    @@ -1444,7 +1444,7 @@ area of rotated image.

    -
    at line 664
    +
    at line 589
    public ImageInterface interlace(string $scheme)

    @@ -1490,7 +1490,7 @@ area of rotated image.

    -
    at line 685
    +
    at line 610
    public ImageInterface usePalette(PaletteInterface $palette)

    @@ -1536,7 +1536,7 @@ area of rotated image.

    -
    at line 723
    +
    at line 645
    public PaletteInterface palette()

    @@ -1562,7 +1562,7 @@ area of rotated image.

    -
    at line 731
    +
    at line 653
    public ImageInterface profile(ProfileInterface $profile)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Imagine.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Imagine.html index a561db8044..174db89842 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Imagine.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Imagine.html @@ -191,7 +191,7 @@

    -
    at line 33
    +
    at line 34
    public __construct()

    @@ -218,7 +218,7 @@

    -
    at line 43
    +
    at line 44
    public ImageInterface open(string $path)

    @@ -265,7 +265,7 @@

    -
    at line 68
    +
    at line 67
    public ImageInterface create(BoxInterface $size, ColorInterface $color = null)

    @@ -323,7 +323,7 @@

    -
    at line 117
    +
    at line 111
    public ImageInterface load(string $string)

    @@ -370,7 +370,7 @@

    -
    at line 134
    +
    at line 119
    public ImageInterface read(resource $resource)

    @@ -417,7 +417,7 @@

    -
    at line 152
    +
    at line 137
    public FontInterface font(string $file, integer $size, ColorInterface $color)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Layers.html b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Layers.html index 655a90fd1f..6b06952847 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Layers.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Gmagick/Layers.html @@ -480,7 +480,7 @@

    -
    at line 46
    +
    at line 49
    public __construct(Image $image, PaletteInterface $palette, Gmagick $resource)

    @@ -520,7 +520,7 @@

    -
    at line 56
    +
    at line 59
    public merge()

    @@ -546,7 +546,7 @@

    -
    at line 73
    +
    at line 74
    public coalesce()

    @@ -562,7 +562,7 @@ the sequence.

    -
    at line 81
    +
    at line 82
    public LayersInterface animate(string $format, integer $delay, integer $loops)

    @@ -621,7 +621,7 @@ the sequence.

    -
    at line 116
    +
    at line 117
    public current()

    @@ -637,7 +637,7 @@ the sequence.

    -
    at line 148
    +
    at line 146
    public key()

    @@ -653,7 +653,7 @@ the sequence.

    -
    at line 156
    +
    at line 154
    public next()

    @@ -669,7 +669,7 @@ the sequence.

    -
    at line 164
    +
    at line 162
    public rewind()

    @@ -685,7 +685,7 @@ the sequence.

    -
    at line 172
    +
    at line 170
    public valid()

    @@ -701,7 +701,7 @@ the sequence.

    -
    at line 180
    +
    at line 178
    public count()

    @@ -717,7 +717,7 @@ the sequence.

    -
    at line 194
    +
    at line 190
    public offsetExists($offset)

    @@ -744,7 +744,7 @@ the sequence.

    -
    at line 202
    +
    at line 198
    public offsetGet($offset)

    @@ -771,7 +771,7 @@ the sequence.

    -
    at line 210
    +
    at line 206
    public offsetSet($offset, $image)

    @@ -804,7 +804,7 @@ the sequence.

    -
    at line 266
    +
    at line 257
    public offsetUnset($offset)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/AbstractImage.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/AbstractImage.html new file mode 100644 index 0000000000..88ec5758ca --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/AbstractImage.html @@ -0,0 +1,177 @@ + + + + + + Imagine\Image\AbstractImage | + + + +
    + + +
    + +
    Class
    +

    Imagine\Image\AbstractImage

    +
    +
    +

    abstract class + AbstractImage implements + ImageInterface

    + + + + +

    Methods

    + + + + + + + + + + + + + + + + + +
    + ManipulatorInterface + + thumbnail(BoxInterface $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED) +

    Generates a thumbnail from a current image Returns it as a new image, doesn't modify the current image

    +
    + MetadataInterface + + metadata() +

    Returns the Image's meta data

    +
    + + + __clone() +

    Assures the metadata instance will be cloned, too

    +
    + + +

    Details

    + +

    +
    at line 27
    + public ManipulatorInterface + thumbnail(BoxInterface $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED) +

    +
    +

    Generates a thumbnail from a current image Returns it as a new image, doesn't modify the current image

    +

    +

    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + +
    BoxInterface$size +
    string$mode +
    string$filterThe filter to use for resizing, one of ImageInterface::FILTER_*
    + + +

    Return Value

    + + + + + + +
    ManipulatorInterface +
    + + +

    Exceptions

    + + + + + + +
    RuntimeException +
    + + +
    +
    + +

    +
    at line 103
    + public MetadataInterface + metadata() +

    +
    +

    Returns the Image's meta data

    +

    +

    +
    + +

    Return Value

    + + + + + + +
    MetadataInterface +
    + + + +
    +
    + +

    +
    at line 111
    + public + __clone() +

    +
    +

    Assures the metadata instance will be cloned, too

    +

    +

    +
    + + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/AbstractImagine.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/AbstractImagine.html new file mode 100644 index 0000000000..e4c0da532d --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/AbstractImagine.html @@ -0,0 +1,134 @@ + + + + + + Imagine\Image\AbstractImagine | + + + +
    + + +
    + +
    Class
    +

    Imagine\Image\AbstractImagine

    +
    +
    +

    abstract class + AbstractImagine implements + ImagineInterface

    + + + + +

    Methods

    + + + + + + + + + + + + +
    + ImagineInterface + + setMetadataReader(MetadataReaderInterface $metadataReader) +

    +

    +
    + MetadataReaderInterface + + getMetadataReader() +

    +

    +
    + + +

    Details

    + +

    +
    at line 27
    + public ImagineInterface + setMetadataReader(MetadataReaderInterface $metadataReader) +

    +
    +

    +

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    MetadataReaderInterface$metadataReader +
    + + +

    Return Value

    + + + + + + +
    ImagineInterface +
    + + + +
    +
    + +

    +
    at line 37
    + public MetadataReaderInterface + getMetadataReader() +

    +
    +

    +

    +

    +

    +
    + +

    Return Value

    + + + + + + +
    MetadataReaderInterface +
    + + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Box.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Box.html index 0bfd6fa07d..08931f45a7 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Box.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Box.html @@ -187,7 +187,7 @@

    -
    at line 55
    +
    at line 52
    public integer getWidth()

    @@ -213,7 +213,7 @@

    -
    at line 63
    +
    at line 60
    public integer getHeight()

    @@ -239,7 +239,7 @@

    -
    at line 71
    +
    at line 68
    public BoxInterface scale(float $ratio)

    @@ -276,7 +276,7 @@

    -
    at line 79
    +
    at line 76
    public BoxInterface increase(integer $size)

    @@ -313,7 +313,7 @@

    -
    at line 87
    +
    at line 84
    public Boolean contains(BoxInterface $box, PointInterface $start = null)

    @@ -356,7 +356,7 @@

    -
    at line 99
    +
    at line 94
    public integer square()

    @@ -382,7 +382,7 @@

    -
    at line 107
    +
    at line 102
    public string __toString()

    @@ -408,7 +408,7 @@

    -
    at line 115
    +
    at line 110
    public BoxInterface widen(integer $width)

    @@ -445,7 +445,7 @@

    -
    at line 123
    +
    at line 118
    public BoxInterface heighten(integer $height)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Histogram/Range.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Histogram/Range.html index 08086f4fa8..476eaa97b7 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Histogram/Range.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Histogram/Range.html @@ -109,7 +109,7 @@

    -
    at line 55
    +
    at line 52
    public Boolean contains(integer $value)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata.html new file mode 100644 index 0000000000..87a56953c2 --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata.html @@ -0,0 +1,60 @@ + + + + + + Imagine\Image\Metadata | + + + +
    + + +
    + +
    Namespace
    +

    Imagine\Image\Metadata

    +
    +
    + + + + + + + + + + + + + + + + + +
    AbstractMetadataReader +
    DefaultMetadataReaderDefault metadata reader
    ExifMetadataReaderMetadata driven by Exif information
    MetadataBagAn interface for Image Metadata
    + +

    Interfaces

    + + + + + +
    MetadataReaderInterface +
    + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/AbstractMetadataReader.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/AbstractMetadataReader.html new file mode 100644 index 0000000000..7cdfd5fa50 --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/AbstractMetadataReader.html @@ -0,0 +1,203 @@ + + + + + + Imagine\Image\Metadata\AbstractMetadataReader | + + + +
    + + +
    + +
    Class
    +

    Imagine\Image\Metadata\AbstractMetadataReader

    +
    +
    +

    abstract class + AbstractMetadataReader implements + MetadataReaderInterface

    + + + + +

    Methods

    + + + + + + + + + + + + + + + + + +
    + MetadataBag + + readFile($file $file) +

    Reads metadata from a file.

    +
    + MetadataBag + + readData($data $data) +

    Reads metadata from a binary string.

    +
    + MetadataBag + + readStream($resource $resource) +

    Reads metadata from a stream.

    +
    + + +

    Details

    + +

    +
    at line 21
    + public MetadataBag + readFile($file $file) +

    +
    +

    Reads metadata from a file.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $file$fileThe path to the file where to read metadata.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the file does not exist.
    + + +
    +
    + +

    +
    at line 37
    + public MetadataBag + readData($data $data) +

    +
    +

    Reads metadata from a binary string.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $data$dataThe binary string to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + + +
    +
    + +

    +
    at line 45
    + public MetadataBag + readStream($resource $resource) +

    +
    +

    Reads metadata from a stream.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $resource$resourceThe stream to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the resource is not valid.
    + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/DefaultMetadataReader.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/DefaultMetadataReader.html new file mode 100644 index 0000000000..b8b3e9defb --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/DefaultMetadataReader.html @@ -0,0 +1,207 @@ + + + + + + Imagine\Image\Metadata\DefaultMetadataReader | + + + +
    + + +
    + +
    Class
    +

    Imagine\Image\Metadata\DefaultMetadataReader

    +
    +
    +

    class + DefaultMetadataReader extends AbstractMetadataReader

    + +
    +

    Default metadata reader

    +

    +

    +
    + + + +

    Methods

    + + + + + + + + + + + + + + + + + +
    + MetadataBag + + readFile($file $file) +

    Reads metadata from a file.

    +
    from AbstractMetadataReader
    + MetadataBag + + readData($data $data) +

    Reads metadata from a binary string.

    +
    from AbstractMetadataReader
    + MetadataBag + + readStream($resource $resource) +

    Reads metadata from a stream.

    +
    from AbstractMetadataReader
    + + +

    Details

    + +

    + + public MetadataBag + readFile($file $file) +

    +
    +

    Reads metadata from a file.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $file$fileThe path to the file where to read metadata.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the file does not exist.
    + + +
    +
    + +

    + + public MetadataBag + readData($data $data) +

    +
    +

    Reads metadata from a binary string.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $data$dataThe binary string to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + + +
    +
    + +

    + + public MetadataBag + readStream($resource $resource) +

    +
    +

    Reads metadata from a stream.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $resource$resourceThe stream to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the resource is not valid.
    + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/ExifMetadataReader.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/ExifMetadataReader.html new file mode 100644 index 0000000000..d19bb702f6 --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/ExifMetadataReader.html @@ -0,0 +1,235 @@ + + + + + + Imagine\Image\Metadata\ExifMetadataReader | + + + +
    + + +
    + +
    Class
    +

    Imagine\Image\Metadata\ExifMetadataReader

    +
    +
    +

    class + ExifMetadataReader extends AbstractMetadataReader

    + +
    +

    Metadata driven by Exif information

    +

    +

    +
    + + + +

    Methods

    + + + + + + + + + + + + + + + + + + + + + + +
    + MetadataBag + + readFile($file $file) +

    Reads metadata from a file.

    +
    from AbstractMetadataReader
    + MetadataBag + + readData($data $data) +

    Reads metadata from a binary string.

    +
    from AbstractMetadataReader
    + MetadataBag + + readStream($resource $resource) +

    Reads metadata from a stream.

    +
    from AbstractMetadataReader
    + + + __construct() +

    +

    +
    + + +

    Details

    + +

    + + public MetadataBag + readFile($file $file) +

    +
    +

    Reads metadata from a file.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $file$fileThe path to the file where to read metadata.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the file does not exist.
    + + +
    +
    + +

    + + public MetadataBag + readData($data $data) +

    +
    +

    Reads metadata from a binary string.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $data$dataThe binary string to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + + +
    +
    + +

    + + public MetadataBag + readStream($resource $resource) +

    +
    +

    Reads metadata from a stream.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $resource$resourceThe stream to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the resource is not valid.
    + + +
    +
    + +

    +
    at line 22
    + public + __construct() +

    +
    +

    +

    +

    +

    +
    + + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/MetadataBag.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/MetadataBag.html new file mode 100644 index 0000000000..a8a4c58bad --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/MetadataBag.html @@ -0,0 +1,306 @@ + + + + + + Imagine\Image\Metadata\MetadataBag | + + + +
    + + +
    + +
    Class
    +

    Imagine\Image\Metadata\MetadataBag

    +
    +
    +

    class + MetadataBag implements + ArrayAccess, IteratorAggregate

    + +
    +

    An interface for Image Metadata

    +

    +

    +
    + + + +

    Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + __construct(array $data = array()) +

    +

    +
    + + + getIterator() +

    {@inheritdoc}

    +
    + + + offsetExists($offset) +

    {@inheritdoc}

    +
    + + + offsetSet($offset, $value) +

    {@inheritdoc}

    +
    + + + offsetUnset($offset) +

    {@inheritdoc}

    +
    + + + offsetGet($offset) +

    {@inheritdoc}

    +
    + array + + toArray() +

    Returns metadata as an array

    +
    + + +

    Details

    + +

    +
    at line 22
    + public + __construct(array $data = array()) +

    +
    +

    +

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    array$data +
    + + + + +
    +
    + +

    +
    at line 30
    + public + getIterator() +

    +
    +

    {@inheritdoc}

    +

    +

    +
    + + + +
    +
    + +

    +
    at line 38
    + public + offsetExists($offset) +

    +
    +

    {@inheritdoc}

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $offset +
    + + + + +
    +
    + +

    +
    at line 46
    + public + offsetSet($offset, $value) +

    +
    +

    {@inheritdoc}

    +

    +

    +
    +

    Parameters

    + + + + + + + + + + + + +
    $offset +
    $value +
    + + + + +
    +
    + +

    +
    at line 54
    + public + offsetUnset($offset) +

    +
    +

    {@inheritdoc}

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $offset +
    + + + + +
    +
    + +

    +
    at line 62
    + public + offsetGet($offset) +

    +
    +

    {@inheritdoc}

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $offset +
    + + + + +
    +
    + +

    +
    at line 72
    + public array + toArray() +

    +
    +

    Returns metadata as an array

    +

    +

    +
    + +

    Return Value

    + + + + + + +
    arrayAn associative array
    + + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/MetadataReaderInterface.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/MetadataReaderInterface.html new file mode 100644 index 0000000000..fd66cd7e1e --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/MetadataReaderInterface.html @@ -0,0 +1,202 @@ + + + + + + Imagine\Image\Metadata\MetadataReaderInterface | + + + +
    + + +
    + +
    Interface
    +

    Imagine\Image\Metadata\MetadataReaderInterface

    +
    +
    +

    interface + MetadataReaderInterface

    + + + + +

    Methods

    + + + + + + + + + + + + + + + + + +
    + MetadataBag + + readFile($file $file) +

    Reads metadata from a file.

    +
    + MetadataBag + + readData($data $data) +

    Reads metadata from a binary string.

    +
    + MetadataBag + + readStream($resource $resource) +

    Reads metadata from a stream.

    +
    + + +

    Details

    + +

    +
    at line 27
    + public MetadataBag + readFile($file $file) +

    +
    +

    Reads metadata from a file.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $file$fileThe path to the file where to read metadata.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the file does not exist.
    + + +
    +
    + +

    +
    at line 36
    + public MetadataBag + readData($data $data) +

    +
    +

    Reads metadata from a binary string.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $data$dataThe binary string to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + + +
    +
    + +

    +
    at line 47
    + public MetadataBag + readStream($resource $resource) +

    +
    +

    Reads metadata from a stream.

    +

    +

    +
    +

    Parameters

    + + + + + + + +
    $resource$resourceThe stream to read.
    + + +

    Return Value

    + + + + + + +
    MetadataBag +
    + + +

    Exceptions

    + + + + + + +
    InvalidArgumentExceptionIn case the resource is not valid.
    + + +
    +
    + + +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/namespace-frame.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/namespace-frame.html new file mode 100644 index 0000000000..4ea05d0781 --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Metadata/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + Imagine\Image\Metadata | + + + diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/CMYK.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/CMYK.html index b3cead88ae..59193e301a 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/CMYK.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/CMYK.html @@ -265,7 +265,7 @@

    -
    at line 85
    +
    at line 83
    public ColorInterface blend(ColorInterface $color1, ColorInterface $color2, float $amount)

    @@ -313,7 +313,7 @@

    -
    at line 102
    +
    at line 100
    public PaletteInterface useProfile(ProfileInterface $profile)

    @@ -349,7 +349,7 @@

    -
    at line 112
    +
    at line 110
    public ProfileInterface profile()

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/CMYK.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/CMYK.html index e005d1227c..682752498f 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/CMYK.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/CMYK.html @@ -250,7 +250,7 @@

    -
    at line 78
    +
    at line 76
    public integer getCyan()

    @@ -276,7 +276,7 @@

    -
    at line 88
    +
    at line 86
    public integer getMagenta()

    @@ -302,7 +302,7 @@

    -
    at line 98
    +
    at line 96
    public integer getYellow()

    @@ -328,7 +328,7 @@

    -
    at line 108
    +
    at line 106
    public integer getKeyline()

    @@ -354,7 +354,7 @@

    -
    at line 116
    +
    at line 114
    public PaletteInterface getPalette()

    @@ -380,7 +380,7 @@

    -
    at line 124
    +
    at line 122
    public integer getAlpha()

    @@ -406,7 +406,7 @@

    -
    at line 132
    +
    at line 130
    public ColorInterface dissolve(integer $alpha)

    @@ -443,7 +443,7 @@

    -
    at line 140
    +
    at line 138
    public ColorInterface lighten(integer $shade)

    @@ -480,7 +480,7 @@

    -
    at line 155
    +
    at line 153
    public ColorInterface darken(integer $shade)

    @@ -517,7 +517,7 @@

    -
    at line 170
    +
    at line 168
    public ColorInterface grayscale()

    @@ -543,7 +543,7 @@

    -
    at line 186
    +
    at line 184
    public Boolean isOpaque()

    @@ -569,7 +569,7 @@

    -
    at line 196
    +
    at line 194
    public string __toString()

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/Gray.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/Gray.html index d42b7eecfc..0c9acd85f8 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/Gray.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/Gray.html @@ -226,7 +226,7 @@

    -
    at line 62
    +
    at line 60
    public integer getGray()

    @@ -252,7 +252,7 @@

    -
    at line 70
    +
    at line 68
    public PaletteInterface getPalette()

    @@ -278,7 +278,7 @@

    -
    at line 78
    +
    at line 76
    public integer getAlpha()

    @@ -304,7 +304,7 @@

    -
    at line 86
    +
    at line 84
    public ColorInterface dissolve(integer $alpha)

    @@ -341,7 +341,7 @@

    -
    at line 96
    +
    at line 94
    public ColorInterface lighten(integer $shade)

    @@ -378,7 +378,7 @@

    -
    at line 108
    +
    at line 102
    public ColorInterface darken(integer $shade)

    @@ -415,7 +415,7 @@

    -
    at line 120
    +
    at line 110
    public ColorInterface grayscale()

    @@ -441,7 +441,7 @@

    -
    at line 128
    +
    at line 118
    public Boolean isOpaque()

    @@ -467,7 +467,7 @@

    -
    at line 138
    +
    at line 128
    public string __toString()

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/RGB.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/RGB.html index 96ab5679bc..04e237805c 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/RGB.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Color/RGB.html @@ -246,7 +246,7 @@

    -
    at line 76
    +
    at line 74
    public integer getRed()

    @@ -272,7 +272,7 @@

    -
    at line 86
    +
    at line 84
    public integer getGreen()

    @@ -298,7 +298,7 @@

    -
    at line 96
    +
    at line 94
    public integer getBlue()

    @@ -324,7 +324,7 @@

    -
    at line 104
    +
    at line 102
    public PaletteInterface getPalette()

    @@ -350,7 +350,7 @@

    -
    at line 112
    +
    at line 110
    public integer getAlpha()

    @@ -376,7 +376,7 @@

    -
    at line 120
    +
    at line 118
    public ColorInterface dissolve(integer $alpha)

    @@ -413,7 +413,7 @@

    -
    at line 130
    +
    at line 126
    public ColorInterface lighten(integer $shade)

    @@ -450,7 +450,7 @@

    -
    at line 144
    +
    at line 140
    public ColorInterface darken(integer $shade)

    @@ -487,7 +487,7 @@

    -
    at line 158
    +
    at line 154
    public ColorInterface grayscale()

    @@ -513,7 +513,7 @@

    -
    at line 168
    +
    at line 164
    public Boolean isOpaque()

    @@ -539,7 +539,7 @@

    -
    at line 178
    +
    at line 174
    public string __toString()

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Grayscale.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Grayscale.html index a219e28f5d..6bfa4d49dd 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Grayscale.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/Grayscale.html @@ -189,7 +189,7 @@

    -
    at line 63
    +
    at line 61
    public Boolean supportsAlpha()

    @@ -215,7 +215,7 @@

    -
    at line 71
    +
    at line 69
    public PaletteInterface useProfile(ProfileInterface $profile)

    @@ -251,7 +251,7 @@

    -
    at line 81
    +
    at line 79
    public ProfileInterface profile()

    @@ -277,7 +277,7 @@

    -
    at line 95
    +
    at line 91
    public ColorInterface color(string|array|integer $color, integer|null $alpha = null)

    @@ -327,7 +327,7 @@

    -
    at line 114
    +
    at line 110
    public ColorInterface blend(ColorInterface $color1, ColorInterface $color2, float $amount)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/RGB.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/RGB.html index 11aac1927d..031c95f2f3 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/RGB.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Palette/RGB.html @@ -277,7 +277,7 @@

    -
    at line 97
    +
    at line 95
    public ColorInterface color(string|array|integer $color, integer|null $alpha = null)

    @@ -327,7 +327,7 @@

    -
    at line 116
    +
    at line 114
    public ColorInterface blend(ColorInterface $color1, ColorInterface $color2, float $amount)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Point.html b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Point.html index 9dd966d120..d237724bae 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Image/Point.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Image/Point.html @@ -147,7 +147,7 @@

    -
    at line 54
    +
    at line 52
    public integer getX()

    @@ -173,7 +173,7 @@

    -
    at line 62
    +
    at line 60
    public integer getY()

    @@ -199,7 +199,7 @@

    -
    at line 70
    +
    at line 68
    public Boolean in(BoxInterface $box)

    @@ -236,7 +236,7 @@

    -
    at line 78
    +
    at line 76
    public ImageInterface move(integer $amount)

    @@ -273,7 +273,7 @@

    -
    at line 86
    +
    at line 84
    public string __toString()

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Drawer.html b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Drawer.html index c8f359961c..4e7642dfcd 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Drawer.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Drawer.html @@ -240,7 +240,7 @@

    -
    at line 79
    +
    at line 77
    public DrawerInterface chord(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -323,7 +323,7 @@

    -
    at line 139
    +
    at line 129
    public DrawerInterface ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -394,7 +394,7 @@

    -
    at line 186
    +
    at line 174
    public DrawerInterface line(PointInterface $start, PointInterface $end, ColorInterface $color, integer $thickness = 1)

    @@ -449,7 +449,7 @@

    -
    at line 221
    +
    at line 207
    public DrawerInterface pieSlice(PointInterface $center, BoxInterface $size, integer $start, integer $end, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -532,7 +532,7 @@

    -
    at line 255
    +
    at line 241
    public DrawerInterface dot(PointInterface $position, ColorInterface $color)

    @@ -585,7 +585,7 @@

    -
    at line 286
    +
    at line 270
    public DrawerInterface polygon(array $coordinates, ColorInterface $color, Boolean $fill = false, integer $thickness = 1)

    @@ -650,7 +650,7 @@ three coordinates

    -
    at line 336
    +
    at line 311
    public DrawerInterface text(string $string, AbstractFont $font, PointInterface $position, integer $angle, integer $width = null)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Image.html b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Image.html index e1d0a6077f..48b6dbc78d 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Image.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Image.html @@ -581,7 +581,7 @@

    -
    at line 123
    +
    at line 121
    public ManipulatorInterface crop(PointInterface $start, BoxInterface $size)

    @@ -639,7 +639,7 @@

    -
    at line 153
    +
    at line 141
    public ManipulatorInterface flipHorizontally()

    @@ -675,7 +675,7 @@

    -
    at line 169
    +
    at line 155
    public ManipulatorInterface flipVertically()

    @@ -711,7 +711,7 @@

    -
    at line 185
    +
    at line 169
    public ManipulatorInterface strip()

    @@ -747,7 +747,7 @@

    -
    at line 202
    +
    at line 184
    public ManipulatorInterface paste(ImageInterface $image, PointInterface $start)

    @@ -809,7 +809,7 @@

    -
    at line 237
    +
    at line 206
    public ManipulatorInterface resize(BoxInterface $size, string $filter = ImageInterface::FILTER_UNDEFINED)

    @@ -862,7 +862,7 @@

    -
    at line 281
    +
    at line 243
    public ManipulatorInterface rotate(integer $angle, ColorInterface $background = null)

    @@ -915,7 +915,7 @@ area of rotated image.

    -
    at line 304
    +
    at line 264
    public ManipulatorInterface save(string $path = null, array $options = array())

    @@ -968,7 +968,7 @@ area of rotated image.

    -
    at line 328
    +
    at line 284
    public ManipulatorInterface show(string $format, array $options = array())

    @@ -1021,7 +1021,7 @@ area of rotated image.

    -
    at line 339
    +
    at line 295
    public string get(string $format, array $options = array())

    @@ -1073,7 +1073,7 @@ area of rotated image.

    -
    at line 356
    +
    at line 310
    public ImageInterface interlace(string $scheme)

    @@ -1119,7 +1119,7 @@ area of rotated image.

    -
    at line 407
    +
    at line 360
    public string __toString()

    @@ -1154,7 +1154,7 @@ area of rotated image.

    -
    at line 415
    +
    at line 368
    public DrawerInterface draw()

    @@ -1180,7 +1180,7 @@ area of rotated image.

    -
    at line 423
    +
    at line 376
    public EffectsInterface effects()

    @@ -1207,7 +1207,7 @@ area of rotated image.

    -
    at line 431
    +
    at line 384
    public BoxInterface getSize()

    @@ -1233,7 +1233,7 @@ area of rotated image.

    -
    at line 448
    +
    at line 399
    public ManipulatorInterface applyMask(ImageInterface $mask)

    @@ -1270,7 +1270,7 @@ area of rotated image.

    -
    at line 499
    +
    at line 432
    public ImageInterface mask()

    @@ -1296,7 +1296,7 @@ area of rotated image.

    -
    at line 518
    +
    at line 449
    public ManipulatorInterface fill(FillInterface $fill)

    @@ -1333,7 +1333,7 @@ area of rotated image.

    -
    at line 552
    +
    at line 478
    public array histogram()

    @@ -1359,7 +1359,7 @@ area of rotated image.

    -
    at line 575
    +
    at line 496
    public ColorInterface getColorAt(PointInterface $point)

    @@ -1406,7 +1406,7 @@ area of rotated image.

    -
    at line 606
    +
    at line 522
    public ColorInterface pixelToColor(ImagickPixel $pixel)

    @@ -1451,7 +1451,7 @@ area of rotated image.

    -
    at line 637
    +
    at line 548
    public LayersInterface layers()

    @@ -1490,7 +1490,7 @@ area of rotated image.

    -
    at line 645
    +
    at line 556
    public ImageInterface usePalette(PaletteInterface $palette)

    @@ -1536,7 +1536,7 @@ area of rotated image.

    -
    at line 685
    +
    at line 593
    public PaletteInterface palette()

    @@ -1562,7 +1562,7 @@ area of rotated image.

    -
    at line 693
    +
    at line 601
    public ImageInterface profile(ProfileInterface $profile)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Imagine.html b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Imagine.html index 56c2606575..6dd6172342 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Imagine.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Imagine.html @@ -191,7 +191,7 @@

    -
    at line 32
    +
    at line 33
    public __construct()

    @@ -265,7 +265,7 @@

    -
    at line 75
    +
    at line 74
    public ImageInterface create(BoxInterface $size, ColorInterface $color = null)

    @@ -323,7 +323,7 @@

    -
    at line 109
    +
    at line 103
    public ImageInterface load(string $string)

    @@ -370,7 +370,7 @@

    -
    at line 128
    +
    at line 120
    public ImageInterface read(resource $resource)

    @@ -417,7 +417,7 @@

    -
    at line 149
    +
    at line 139
    public FontInterface font(string $file, integer $size, ColorInterface $color)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Layers.html b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Layers.html index a4b54c86b7..3e730cddf5 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Layers.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Imagick/Layers.html @@ -546,7 +546,7 @@

    -
    at line 69
    +
    at line 67
    public LayersInterface animate(string $format, integer $delay, integer $loops)

    @@ -605,7 +605,7 @@

    -
    at line 106
    +
    at line 104
    public coalesce()

    @@ -621,7 +621,7 @@ the sequence.

    -
    at line 132
    +
    at line 126
    public current()

    @@ -637,7 +637,7 @@ the sequence.

    -
    at line 165
    +
    at line 156
    public key()

    @@ -653,7 +653,7 @@ the sequence.

    -
    at line 173
    +
    at line 164
    public next()

    @@ -669,7 +669,7 @@ the sequence.

    -
    at line 181
    +
    at line 172
    public rewind()

    @@ -685,7 +685,7 @@ the sequence.

    -
    at line 189
    +
    at line 180
    public valid()

    @@ -701,7 +701,7 @@ the sequence.

    -
    at line 197
    +
    at line 188
    public count()

    @@ -717,7 +717,7 @@ the sequence.

    -
    at line 211
    +
    at line 200
    public offsetExists($offset)

    @@ -744,7 +744,7 @@ the sequence.

    -
    at line 219
    +
    at line 208
    public offsetGet($offset)

    @@ -771,7 +771,7 @@ the sequence.

    -
    at line 227
    +
    at line 216
    public offsetSet($offset, $image)

    @@ -804,7 +804,7 @@ the sequence.

    -
    at line 272
    +
    at line 256
    public offsetUnset($offset)

    diff --git a/vendor/imagine/imagine/docs/API/API/Imagine/Test/ImagineTestCase.html b/vendor/imagine/imagine/docs/API/API/Imagine/Test/ImagineTestCase.html index 1a58863769..5a543dbf9b 100644 --- a/vendor/imagine/imagine/docs/API/API/Imagine/Test/ImagineTestCase.html +++ b/vendor/imagine/imagine/docs/API/API/Imagine/Test/ImagineTestCase.html @@ -27,6 +27,20 @@ ImagineTestCase extends PHPUnit_Framework_TestCase

    +

    Constants

    + + + + + + +
    HTTP_IMAGE +

    +

    +

    +

    +
    +

    Methods

    @@ -37,7 +51,7 @@ static  - assertImageEquals(ImageInterface $expected, ImageInterface $actual, string $message = '', float $delta = 0.1, integer $buckets = 4) + assertImageEquals(ImageInterface $expected, ImageInterface $actual, string $message = '', float $delta = 0.1, integer $buckets = 4)

    Asserts that two images are equal using color histogram comparison method

    @@ -48,9 +62,9 @@

    Details

    -
    at line 27
    +
    at line 29
    static public - assertImageEquals(ImageInterface $expected, ImageInterface $actual, string $message = '', float $delta = 0.1, integer $buckets = 4) + assertImageEquals(ImageInterface $expected, ImageInterface $actual, string $message = '', float $delta = 0.1, integer $buckets = 4)

    Asserts that two images are equal using color histogram comparison method

    @@ -61,13 +75,13 @@ - + - + diff --git a/vendor/imagine/imagine/docs/API/API/classes.html b/vendor/imagine/imagine/docs/API/API/classes.html index eac28ce890..09fd65c8de 100644 --- a/vendor/imagine/imagine/docs/API/API/classes.html +++ b/vendor/imagine/imagine/docs/API/API/classes.html @@ -490,6 +490,15 @@ + + + + diff --git a/vendor/imagine/imagine/docs/API/API/doc-index.html b/vendor/imagine/imagine/docs/API/API/doc-index.html index e020197788..83f3d597bc 100644 --- a/vendor/imagine/imagine/docs/API/API/doc-index.html +++ b/vendor/imagine/imagine/docs/API/API/doc-index.html @@ -94,7 +94,9 @@
    LayersInterface::animate() — Method in class LayersInterface
    Animates layers
    LayersInterface::add() — Method in class LayersInterface
    Adds an image at the end of the layers stack
    ManipulatorInterface::applyMask() — Method in class ManipulatorInterface
    -
    Applies a given mask to current image's alpha channel
    Drawer::arc() — Method in class Drawer
    +
    Applies a given mask to current image's alpha channel
    AbstractMetadataReaderClass in namespace Imagine\Image\Metadata
    +
    +
    Drawer::arc() — Method in class Drawer
    Draws an arc on a starting at a given x, y coordinates under a given start and end angles
    Image::applyMask() — Method in class Image
    Applies a given mask to current image's alpha channel
    Layers::animate() — Method in class Layers
    Animates layers
    ImagineTestCase::assertImageEquals() — Method in class ImagineTestCase
    @@ -516,12 +518,9 @@
    Loads an image from a resource $resource
    LayersInterface::remove() — Method in class LayersInterface
    Removes the image at offset
    ManipulatorInterface::resize() — Method in class ManipulatorInterface
    Resizes current image and returns self
    ManipulatorInterface::rotate() — Method in class ManipulatorInterface
    -
    Rotates an image at the given angle.
    DefaultMetadataReader::readFile() — Method in class DefaultMetadataReader
    -
    Reads metadata from a file.
    DefaultMetadataReader::readData() — Method in class DefaultMetadataReader
    -
    Reads metadata from a binary string.
    DefaultMetadataReader::readStream() — Method in class DefaultMetadataReader
    -
    Reads metadata from a stream.
    ExifMetadataReader::readFile() — Method in class ExifMetadataReader
    -
    Reads metadata from a file.
    ExifMetadataReader::readData() — Method in class ExifMetadataReader
    -
    Reads metadata from a binary string.
    ExifMetadataReader::readStream() — Method in class ExifMetadataReader
    +
    Rotates an image at the given angle.
    AbstractMetadataReader::readFile() — Method in class AbstractMetadataReader
    +
    Reads metadata from a file.
    AbstractMetadataReader::readData() — Method in class AbstractMetadataReader
    +
    Reads metadata from a binary string.
    AbstractMetadataReader::readStream() — Method in class AbstractMetadataReader
    Reads metadata from a stream.
    MetadataReaderInterface::readFile() — Method in class MetadataReaderInterface
    Reads metadata from a file.
    MetadataReaderInterface::readData() — Method in class MetadataReaderInterface
    Reads metadata from a binary string.
    MetadataReaderInterface::readStream() — Method in class MetadataReaderInterface
    @@ -578,7 +577,8 @@
    Annotates image with specified text at a given position starting on the top left of the final text box
    Drawer::text() — Method in class Drawer
    Annotates image with specified text at a given position starting on the top left of the final text box
    AbstractImage::thumbnail() — Method in class AbstractImage
    Generates a thumbnail from a current image Returns it as a new image, doesn't modify the current image
    ManipulatorInterface::thumbnail() — Method in class ManipulatorInterface
    -
    Generates a thumbnail from a current image Returns it as a new image, doesn't modify the current image
    Drawer::text() — Method in class Drawer
    +
    Generates a thumbnail from a current image Returns it as a new image, doesn't modify the current image
    MetadataBag::toArray() — Method in class MetadataBag
    +
    Returns metadata as an array
    Drawer::text() — Method in class Drawer
    Annotates image with specified text at a given position starting on the top left of the final text box
    IsImageEqual::toString() — Method in class IsImageEqual
    {@inheritdoc}

    U

    Image::usePalette() — Method in class Image
    @@ -653,7 +653,9 @@
    Range::__construct() — Method in class Range
    ImageInterface::__toString() — Method in class ImageInterface
    -
    Returns the image content as a PNG binary string
    MetadataBag::__construct() — Method in class MetadataBag
    +
    Returns the image content as a PNG binary string
    ExifMetadataReader::__construct() — Method in class ExifMetadataReader
    +
    +
    MetadataBag::__construct() — Method in class MetadataBag
    CMYK::__construct() — Method in class CMYK
    diff --git a/vendor/imagine/imagine/docs/API/API/js/permalink.js b/vendor/imagine/imagine/docs/API/API/js/permalink.js new file mode 100644 index 0000000000..959137d8fc --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/js/permalink.js @@ -0,0 +1,17 @@ +jQuery(document).ready( + function () { + var hash = window.location.hash.replace(/^#/, ''); + + if (hash) { + jQuery('#main-frame').attr('src', hash); + + if (history.pushState) { + history.pushState( + '', + document.title, + window.location.pathname + window.location.search + ); + } + } + } +); diff --git a/vendor/imagine/imagine/docs/API/API/renderer.index b/vendor/imagine/imagine/docs/API/API/renderer.index index 76c5ac6516..d1c6d6b95a 100644 --- a/vendor/imagine/imagine/docs/API/API/renderer.index +++ b/vendor/imagine/imagine/docs/API/API/renderer.index @@ -1 +1 @@ -C:19:"Sami\Renderer\Index":7759:{a:3:{i:0;a:84:{s:28:"Imagine\Draw\DrawerInterface";s:40:"56dfe8ed64cdae56250f6b55579101c904554c6f";s:32:"Imagine\Effects\EffectsInterface";s:40:"d369901de894c5efadd67079fb3e21ac7f0ae5e8";s:27:"Imagine\Exception\Exception";s:40:"0f249c05600291986a393f471171cb049b78e449";s:42:"Imagine\Exception\InvalidArgumentException";s:40:"b153b42fb9e368f423de862e68b59d5cb4a49578";s:39:"Imagine\Exception\NotSupportedException";s:40:"2a69e1a3552cf260a965796d71793066a23f5e6d";s:38:"Imagine\Exception\OutOfBoundsException";s:40:"4f55cba9ec0ee27d3aacfcd3fb21c5baac690df4";s:34:"Imagine\Exception\RuntimeException";s:40:"f9428fb30d0ea8bb4022ea7f3ac34ab3e961d096";s:30:"Imagine\Filter\Advanced\Border";s:40:"d4ecd10a4ca034ec489aecea3f28626645696ab7";s:30:"Imagine\Filter\Advanced\Canvas";s:40:"869e18dffe8380a652330b47ac7326b0ed0a07ce";s:33:"Imagine\Filter\Advanced\Grayscale";s:40:"e75560e75a013a18daa351f7936487518a6b23b5";s:36:"Imagine\Filter\Advanced\OnPixelBased";s:40:"9e5da135e77a49c342edbca4a18d81a255824717";s:38:"Imagine\Filter\Advanced\RelativeResize";s:40:"6cd5c92d4eafb7c4ce9338805cce2f8cd66ff5de";s:30:"Imagine\Filter\Basic\ApplyMask";s:40:"6613b607e6b95697d2dfb274abe2d130cc6aa160";s:25:"Imagine\Filter\Basic\Copy";s:40:"ac946c4e6b4d21c804e20ba8f5b9c794e0ceb6b5";s:25:"Imagine\Filter\Basic\Crop";s:40:"e08f226f70b39af34a975342c839c66b43f5fbe2";s:25:"Imagine\Filter\Basic\Fill";s:40:"61569034c3785804c37994ad75e29d91eb5bd422";s:37:"Imagine\Filter\Basic\FlipHorizontally";s:40:"eb3a772623a8f9a197a91df97527c12c187e1fec";s:35:"Imagine\Filter\Basic\FlipVertically";s:40:"ee1a5500df175abac73656a3cc15cbbaf2dcdfe5";s:26:"Imagine\Filter\Basic\Paste";s:40:"86e17cdf635d7eb540f1f9bd59e329b7305668cc";s:27:"Imagine\Filter\Basic\Resize";s:40:"f67aa5922020a853d9288f0791aaffca48110393";s:27:"Imagine\Filter\Basic\Rotate";s:40:"23702e0d79d8f2f6c5fa3956dfadc3464b0a3426";s:25:"Imagine\Filter\Basic\Save";s:40:"e632b88b644381c592e44937c00d75c709ed250c";s:25:"Imagine\Filter\Basic\Show";s:40:"6da15c514cb970d07b552b31183e2f7df06c07b2";s:26:"Imagine\Filter\Basic\Strip";s:40:"08774726d19efc0d650c747d901ebb3d595ee566";s:30:"Imagine\Filter\Basic\Thumbnail";s:40:"d758b88a4375e572272415b899de88d7a6561a5a";s:36:"Imagine\Filter\Basic\WebOptimization";s:40:"d797bafafa7a1c9aa7f1957deab23892190ed4d2";s:30:"Imagine\Filter\FilterInterface";s:40:"759503ed8edc81a59e63f59d7aa0c9295ed91ad5";s:27:"Imagine\Filter\ImagineAware";s:40:"e936e6d58d179bde97f5dfda7ca737d8e77aaeba";s:29:"Imagine\Filter\Transformation";s:40:"8dec2acde91f7b78a9188fe79af7c9a5510fb0f1";s:17:"Imagine\Gd\Drawer";s:40:"5ea3077a45c270bea217c3a23bc3a58796d7ceb4";s:18:"Imagine\Gd\Effects";s:40:"75804073f201e245ac9b4c9654755b83ebc801e5";s:15:"Imagine\Gd\Font";s:40:"f189caacf5e44952b3e1cd2c619b687301545611";s:16:"Imagine\Gd\Image";s:40:"91dd1dfb1f26bb5e9dfd65fea866fd6b473fbb58";s:18:"Imagine\Gd\Imagine";s:40:"f0c79d5fc96b972a9fa674c583bb2659489e79e3";s:17:"Imagine\Gd\Layers";s:40:"c3a5441ada89f7db5deb4728d2fe0460a2e7e5bb";s:22:"Imagine\Gmagick\Drawer";s:40:"377af6dd27f5ffaa948f2ce22dd68eb530685cca";s:23:"Imagine\Gmagick\Effects";s:40:"68a60cc2dba1c2d16c415781d66ad24a283d1aef";s:20:"Imagine\Gmagick\Font";s:40:"7521c24c5594b591cc938663e7225b8b816e0396";s:21:"Imagine\Gmagick\Image";s:40:"dd6f9d111b2cc213aecc9517f5c2079d26e2b1ff";s:23:"Imagine\Gmagick\Imagine";s:40:"1c594fc36d85c797b62a73d9310cfc67dac40800";s:22:"Imagine\Gmagick\Layers";s:40:"1ae8c5b25b1d8002f21ae8e5aa511ba52bfd86dc";s:26:"Imagine\Image\AbstractFont";s:40:"963fa16aa4039ec69d06ced6e5a0c6047bb94d8a";s:27:"Imagine\Image\AbstractImage";s:40:"738f6db58e18e43a33a18dbede7fe8d19254bce1";s:29:"Imagine\Image\AbstractImagine";s:40:"b5a46a499671cf7e8ca9d6ffd5b29a53362d52f3";s:28:"Imagine\Image\AbstractLayers";s:40:"b61893bb8518d7bb2c39bf0dcb5f345ff8b53390";s:17:"Imagine\Image\Box";s:40:"4d9d26e842f37419116a0dd340a7aa016bd10e8e";s:26:"Imagine\Image\BoxInterface";s:40:"01f3801a5e82e4e03509e2ee2338de0d90da6abf";s:32:"Imagine\Image\Fill\FillInterface";s:40:"d9b191740a2928ec9c7c6b84aed845f784b2d37e";s:38:"Imagine\Image\Fill\Gradient\Horizontal";s:40:"b5fdac26b4573829152a29dc05f241f259b317f0";s:34:"Imagine\Image\Fill\Gradient\Linear";s:40:"29837929cd4747f4585bf219f49057f40be4dc18";s:36:"Imagine\Image\Fill\Gradient\Vertical";s:40:"6bd12cfd82d6fc4091f7d70015bfdf856241ab91";s:27:"Imagine\Image\FontInterface";s:40:"2d63cac85978d03678184399deffbc9f6d23a9f5";s:30:"Imagine\Image\Histogram\Bucket";s:40:"d8469b9fa7ea86da11cfd87aaf20bfc128eb7148";s:29:"Imagine\Image\Histogram\Range";s:40:"fe44dbb981d33dea34828e7014a01cfbc17b834c";s:28:"Imagine\Image\ImageInterface";s:40:"92a7c26bbb61f3b28ddb028c89346fe7f791facb";s:30:"Imagine\Image\ImagineInterface";s:40:"20963b8df3cb18c9599e0de738b4d53352a96cc1";s:29:"Imagine\Image\LayersInterface";s:40:"43b0c008e17e23ff2b7a058685472ec142cba798";s:34:"Imagine\Image\ManipulatorInterface";s:40:"3ee3d2429910fe9545991b9380ff4877dd1a9d6b";s:44:"Imagine\Image\Metadata\DefaultMetadataReader";s:40:"66900a01c5181cdc8b27c5f16660205fe69ec09c";s:41:"Imagine\Image\Metadata\ExifMetadataReader";s:40:"03240b20b0c4c62830e0260b6900fd97d76021a0";s:34:"Imagine\Image\Metadata\MetadataBag";s:40:"7e1ff630adca196aa9f5c1703ca0ba5aca134cd3";s:46:"Imagine\Image\Metadata\MetadataReaderInterface";s:40:"538db24207db821617b64d5a529fc950e12c150f";s:26:"Imagine\Image\Palette\CMYK";s:40:"688cb2abbdd52f19878124c27fbbd8e1b6a46845";s:33:"Imagine\Image\Palette\ColorParser";s:40:"8b465563ab4b1944bd78ec72d99227cbe8fa6b08";s:32:"Imagine\Image\Palette\Color\CMYK";s:40:"1dc334a9bf2895c5bb6ce6212ca3510b3e6b33cc";s:42:"Imagine\Image\Palette\Color\ColorInterface";s:40:"6ee104e9f533648d9141a31593c55489b98cc821";s:32:"Imagine\Image\Palette\Color\Gray";s:40:"ddb19ed5b0b454331eb31cdc9ca1f38c42117e65";s:31:"Imagine\Image\Palette\Color\RGB";s:40:"0425c503c5aaaaba2fa20b14feca4f7a65b677a1";s:31:"Imagine\Image\Palette\Grayscale";s:40:"719dbe409490fc595af3277b2790c8b7a3505345";s:38:"Imagine\Image\Palette\PaletteInterface";s:40:"bb0ac9e6322efc5243eca16bc7bd91a62dcc46b6";s:25:"Imagine\Image\Palette\RGB";s:40:"de2b414926270a054d5b0e052745eb76546bf005";s:19:"Imagine\Image\Point";s:40:"7238cb75a4f0631eea3d0ac25df658feb368a28e";s:28:"Imagine\Image\PointInterface";s:40:"7f454cd65500efdc4639a9b98dedbad615c0f8d6";s:26:"Imagine\Image\Point\Center";s:40:"25516b2ce2de4da5411bf60933eba76b39eb66b1";s:21:"Imagine\Image\Profile";s:40:"2276bd3e76452f9f6697dd376fb262b458d7768b";s:30:"Imagine\Image\ProfileInterface";s:40:"f9520aecf889950afec197b1a6e55d66b9dcaef7";s:22:"Imagine\Imagick\Drawer";s:40:"68e6e1afa4b8a6c7d422b9981e9459db3a37ed7b";s:23:"Imagine\Imagick\Effects";s:40:"adf27fed4de1672880b1d9f4848dab0d7d260480";s:20:"Imagine\Imagick\Font";s:40:"2e277b25c761ba56c0cc7220ef69d7c47671068a";s:21:"Imagine\Imagick\Image";s:40:"2568908d91d9ca070b18cddc439a0700f946a5be";s:23:"Imagine\Imagick\Imagine";s:40:"248632928bde84e37225a3afbe3005c2431c1ef5";s:22:"Imagine\Imagick\Layers";s:40:"3f1c0cbcd9de8b55358c654ffdc384567d76f10f";s:36:"Imagine\Test\Constraint\IsImageEqual";s:40:"39d4fc4837e23a02c29a4e5f4e8ebab0a6ac153e";s:28:"Imagine\Test\ImagineTestCase";s:40:"68c60388a65a7721a1eb2674065a53b0616958c1";}i:1;a:1:{i:0;s:6:"master";}i:2;a:20:{i:0;s:7:"Imagine";i:1;s:12:"Imagine\Draw";i:2;s:15:"Imagine\Effects";i:3;s:17:"Imagine\Exception";i:4;s:14:"Imagine\Filter";i:5;s:23:"Imagine\Filter\Advanced";i:6;s:20:"Imagine\Filter\Basic";i:7;s:10:"Imagine\Gd";i:8;s:15:"Imagine\Gmagick";i:9;s:13:"Imagine\Image";i:10;s:18:"Imagine\Image\Fill";i:11;s:27:"Imagine\Image\Fill\Gradient";i:12;s:23:"Imagine\Image\Histogram";i:13;s:22:"Imagine\Image\Metadata";i:14;s:21:"Imagine\Image\Palette";i:15;s:27:"Imagine\Image\Palette\Color";i:16;s:19:"Imagine\Image\Point";i:17;s:15:"Imagine\Imagick";i:18;s:12:"Imagine\Test";i:19;s:23:"Imagine\Test\Constraint";}}} \ No newline at end of file +C:19:"Sami\Renderer\Index":7860:{a:3:{i:0;a:85:{s:28:"Imagine\Draw\DrawerInterface";s:40:"56dfe8ed64cdae56250f6b55579101c904554c6f";s:32:"Imagine\Effects\EffectsInterface";s:40:"d369901de894c5efadd67079fb3e21ac7f0ae5e8";s:27:"Imagine\Exception\Exception";s:40:"0f249c05600291986a393f471171cb049b78e449";s:42:"Imagine\Exception\InvalidArgumentException";s:40:"b153b42fb9e368f423de862e68b59d5cb4a49578";s:39:"Imagine\Exception\NotSupportedException";s:40:"2a69e1a3552cf260a965796d71793066a23f5e6d";s:38:"Imagine\Exception\OutOfBoundsException";s:40:"4f55cba9ec0ee27d3aacfcd3fb21c5baac690df4";s:34:"Imagine\Exception\RuntimeException";s:40:"f9428fb30d0ea8bb4022ea7f3ac34ab3e961d096";s:30:"Imagine\Filter\Advanced\Border";s:40:"d4ecd10a4ca034ec489aecea3f28626645696ab7";s:30:"Imagine\Filter\Advanced\Canvas";s:40:"869e18dffe8380a652330b47ac7326b0ed0a07ce";s:33:"Imagine\Filter\Advanced\Grayscale";s:40:"e75560e75a013a18daa351f7936487518a6b23b5";s:36:"Imagine\Filter\Advanced\OnPixelBased";s:40:"9e5da135e77a49c342edbca4a18d81a255824717";s:38:"Imagine\Filter\Advanced\RelativeResize";s:40:"6cd5c92d4eafb7c4ce9338805cce2f8cd66ff5de";s:30:"Imagine\Filter\Basic\ApplyMask";s:40:"6613b607e6b95697d2dfb274abe2d130cc6aa160";s:25:"Imagine\Filter\Basic\Copy";s:40:"ac946c4e6b4d21c804e20ba8f5b9c794e0ceb6b5";s:25:"Imagine\Filter\Basic\Crop";s:40:"e08f226f70b39af34a975342c839c66b43f5fbe2";s:25:"Imagine\Filter\Basic\Fill";s:40:"61569034c3785804c37994ad75e29d91eb5bd422";s:37:"Imagine\Filter\Basic\FlipHorizontally";s:40:"eb3a772623a8f9a197a91df97527c12c187e1fec";s:35:"Imagine\Filter\Basic\FlipVertically";s:40:"ee1a5500df175abac73656a3cc15cbbaf2dcdfe5";s:26:"Imagine\Filter\Basic\Paste";s:40:"86e17cdf635d7eb540f1f9bd59e329b7305668cc";s:27:"Imagine\Filter\Basic\Resize";s:40:"f67aa5922020a853d9288f0791aaffca48110393";s:27:"Imagine\Filter\Basic\Rotate";s:40:"23702e0d79d8f2f6c5fa3956dfadc3464b0a3426";s:25:"Imagine\Filter\Basic\Save";s:40:"e632b88b644381c592e44937c00d75c709ed250c";s:25:"Imagine\Filter\Basic\Show";s:40:"6da15c514cb970d07b552b31183e2f7df06c07b2";s:26:"Imagine\Filter\Basic\Strip";s:40:"08774726d19efc0d650c747d901ebb3d595ee566";s:30:"Imagine\Filter\Basic\Thumbnail";s:40:"d758b88a4375e572272415b899de88d7a6561a5a";s:36:"Imagine\Filter\Basic\WebOptimization";s:40:"d797bafafa7a1c9aa7f1957deab23892190ed4d2";s:30:"Imagine\Filter\FilterInterface";s:40:"759503ed8edc81a59e63f59d7aa0c9295ed91ad5";s:27:"Imagine\Filter\ImagineAware";s:40:"e936e6d58d179bde97f5dfda7ca737d8e77aaeba";s:29:"Imagine\Filter\Transformation";s:40:"cea8103ff1089fb793f4aed92307540c509c204a";s:17:"Imagine\Gd\Drawer";s:40:"47757e9fec364de94290b90ef539f9148a351199";s:18:"Imagine\Gd\Effects";s:40:"50994194a64e1fa38cbc5731f6df98749151cfe5";s:15:"Imagine\Gd\Font";s:40:"f189caacf5e44952b3e1cd2c619b687301545611";s:16:"Imagine\Gd\Image";s:40:"fdb63de05312b656a81426a249aa64938faef089";s:18:"Imagine\Gd\Imagine";s:40:"4d0ee49cb2410ce3c6525a171eb5452044fbc4ed";s:17:"Imagine\Gd\Layers";s:40:"c3a5441ada89f7db5deb4728d2fe0460a2e7e5bb";s:22:"Imagine\Gmagick\Drawer";s:40:"1c00d68f78dc69c8b2ebd9d31b11376b44458283";s:23:"Imagine\Gmagick\Effects";s:40:"f481541eedaad73bfd6a3047e1672b1d83a6b309";s:20:"Imagine\Gmagick\Font";s:40:"7521c24c5594b591cc938663e7225b8b816e0396";s:21:"Imagine\Gmagick\Image";s:40:"625050484adf8cb19969a503207e68f530394770";s:23:"Imagine\Gmagick\Imagine";s:40:"9c0a2e4198762928e3d556fefcf24d121ccdc8a9";s:22:"Imagine\Gmagick\Layers";s:40:"40837d9a7158a534c786f7b316ce1facc948c50b";s:26:"Imagine\Image\AbstractFont";s:40:"963fa16aa4039ec69d06ced6e5a0c6047bb94d8a";s:27:"Imagine\Image\AbstractImage";s:40:"738f6db58e18e43a33a18dbede7fe8d19254bce1";s:29:"Imagine\Image\AbstractImagine";s:40:"b5a46a499671cf7e8ca9d6ffd5b29a53362d52f3";s:28:"Imagine\Image\AbstractLayers";s:40:"b61893bb8518d7bb2c39bf0dcb5f345ff8b53390";s:17:"Imagine\Image\Box";s:40:"b34df8bedb67911a83740b5a74fde8f194a608ee";s:26:"Imagine\Image\BoxInterface";s:40:"01f3801a5e82e4e03509e2ee2338de0d90da6abf";s:32:"Imagine\Image\Fill\FillInterface";s:40:"d9b191740a2928ec9c7c6b84aed845f784b2d37e";s:38:"Imagine\Image\Fill\Gradient\Horizontal";s:40:"b5fdac26b4573829152a29dc05f241f259b317f0";s:34:"Imagine\Image\Fill\Gradient\Linear";s:40:"29837929cd4747f4585bf219f49057f40be4dc18";s:36:"Imagine\Image\Fill\Gradient\Vertical";s:40:"6bd12cfd82d6fc4091f7d70015bfdf856241ab91";s:27:"Imagine\Image\FontInterface";s:40:"2d63cac85978d03678184399deffbc9f6d23a9f5";s:30:"Imagine\Image\Histogram\Bucket";s:40:"d8469b9fa7ea86da11cfd87aaf20bfc128eb7148";s:29:"Imagine\Image\Histogram\Range";s:40:"43dde36e9f3c0f940521f972e0fb2edcdee26390";s:28:"Imagine\Image\ImageInterface";s:40:"92a7c26bbb61f3b28ddb028c89346fe7f791facb";s:30:"Imagine\Image\ImagineInterface";s:40:"20963b8df3cb18c9599e0de738b4d53352a96cc1";s:29:"Imagine\Image\LayersInterface";s:40:"43b0c008e17e23ff2b7a058685472ec142cba798";s:34:"Imagine\Image\ManipulatorInterface";s:40:"3ee3d2429910fe9545991b9380ff4877dd1a9d6b";s:45:"Imagine\Image\Metadata\AbstractMetadataReader";s:40:"b948bdfaa7f5579458b695f4e2483211bc27d573";s:44:"Imagine\Image\Metadata\DefaultMetadataReader";s:40:"458ba04eac9f1413c5e0c1ace9143beb8b76ea5f";s:41:"Imagine\Image\Metadata\ExifMetadataReader";s:40:"f4bc94d8aa104dd0289688afe0eb5edf7c44c73e";s:34:"Imagine\Image\Metadata\MetadataBag";s:40:"1f923e5f91c4ba600172935edc0a107481bc367e";s:46:"Imagine\Image\Metadata\MetadataReaderInterface";s:40:"ba572d46cc21fdd259ed51a51c41a0033f242dfb";s:26:"Imagine\Image\Palette\CMYK";s:40:"7de24f7a9c0cbf5078d815d2e3c3dd12ed501462";s:33:"Imagine\Image\Palette\ColorParser";s:40:"dbf3e1853e1d7c49a22fcb2a4950ea1248039fbb";s:32:"Imagine\Image\Palette\Color\CMYK";s:40:"4478fe35f126626a176475ae5f11ad31685c8d70";s:42:"Imagine\Image\Palette\Color\ColorInterface";s:40:"6ee104e9f533648d9141a31593c55489b98cc821";s:32:"Imagine\Image\Palette\Color\Gray";s:40:"3386b8d7409330a18d312ea9351ee51c7d011c90";s:31:"Imagine\Image\Palette\Color\RGB";s:40:"1c750f61347d7b49c39a04d9819b494b95596b0b";s:31:"Imagine\Image\Palette\Grayscale";s:40:"c59d023123e6381164616aa3a0496e6b5e923d5c";s:38:"Imagine\Image\Palette\PaletteInterface";s:40:"bb0ac9e6322efc5243eca16bc7bd91a62dcc46b6";s:25:"Imagine\Image\Palette\RGB";s:40:"86a255f85b84742463717152867889061dbaf757";s:19:"Imagine\Image\Point";s:40:"07575769900e5959bfd1fed39c077a72b6450e3a";s:28:"Imagine\Image\PointInterface";s:40:"7f454cd65500efdc4639a9b98dedbad615c0f8d6";s:26:"Imagine\Image\Point\Center";s:40:"25516b2ce2de4da5411bf60933eba76b39eb66b1";s:21:"Imagine\Image\Profile";s:40:"4b011ec7d357e084bb3c39b6f88fd1f8ac8a9c42";s:30:"Imagine\Image\ProfileInterface";s:40:"f9520aecf889950afec197b1a6e55d66b9dcaef7";s:22:"Imagine\Imagick\Drawer";s:40:"ef295111c8e72b571ed5e517c8b344ca4078fa67";s:23:"Imagine\Imagick\Effects";s:40:"adf27fed4de1672880b1d9f4848dab0d7d260480";s:20:"Imagine\Imagick\Font";s:40:"2e277b25c761ba56c0cc7220ef69d7c47671068a";s:21:"Imagine\Imagick\Image";s:40:"d2b1f69b3e7c1b322525b095ff7ba40a3dd8e9c3";s:23:"Imagine\Imagick\Imagine";s:40:"b3a77f0160e5c0fe6e5765a4d42ce1c43bbb6093";s:22:"Imagine\Imagick\Layers";s:40:"07d809d02b712c9aac4b65d60e15b77482d5f27a";s:36:"Imagine\Test\Constraint\IsImageEqual";s:40:"39d4fc4837e23a02c29a4e5f4e8ebab0a6ac153e";s:28:"Imagine\Test\ImagineTestCase";s:40:"084df64e08cf027b51d28224aeb4a4b69274c512";}i:1;a:1:{i:0;s:6:"master";}i:2;a:20:{i:0;s:7:"Imagine";i:1;s:12:"Imagine\Draw";i:2;s:15:"Imagine\Effects";i:3;s:17:"Imagine\Exception";i:4;s:14:"Imagine\Filter";i:5;s:23:"Imagine\Filter\Advanced";i:6;s:20:"Imagine\Filter\Basic";i:7;s:10:"Imagine\Gd";i:8;s:15:"Imagine\Gmagick";i:9;s:13:"Imagine\Image";i:10;s:18:"Imagine\Image\Fill";i:11;s:27:"Imagine\Image\Fill\Gradient";i:12;s:23:"Imagine\Image\Histogram";i:13;s:22:"Imagine\Image\Metadata";i:14;s:21:"Imagine\Image\Palette";i:15;s:27:"Imagine\Image\Palette\Color";i:16;s:19:"Imagine\Image\Point";i:17;s:15:"Imagine\Imagick";i:18;s:12:"Imagine\Test";i:19;s:23:"Imagine\Test\Constraint";}}} \ No newline at end of file diff --git a/vendor/imagine/imagine/docs/API/API/search_index.js b/vendor/imagine/imagine/docs/API/API/search_index.js index 85722be6fc..cb4b681bac 100644 --- a/vendor/imagine/imagine/docs/API/API/search_index.js +++ b/vendor/imagine/imagine/docs/API/API/search_index.js @@ -1,7 +1,7 @@ var search_data = { 'index': { - 'searchIndex': ["imagine","imagine\\draw","imagine\\effects","imagine\\exception","imagine\\filter","imagine\\filter\\advanced","imagine\\filter\\basic","imagine\\gd","imagine\\gmagick","imagine\\image","imagine\\image\\fill","imagine\\image\\fill\\gradient","imagine\\image\\histogram","imagine\\image\\metadata","imagine\\image\\palette","imagine\\image\\palette\\color","imagine\\image\\point","imagine\\imagick","imagine\\test","imagine\\test\\constraint","imagine\\draw\\drawerinterface","imagine\\effects\\effectsinterface","imagine\\exception\\exception","imagine\\exception\\invalidargumentexception","imagine\\exception\\notsupportedexception","imagine\\exception\\outofboundsexception","imagine\\exception\\runtimeexception","imagine\\filter\\advanced\\border","imagine\\filter\\advanced\\canvas","imagine\\filter\\advanced\\grayscale","imagine\\filter\\advanced\\onpixelbased","imagine\\filter\\advanced\\relativeresize","imagine\\filter\\basic\\applymask","imagine\\filter\\basic\\copy","imagine\\filter\\basic\\crop","imagine\\filter\\basic\\fill","imagine\\filter\\basic\\fliphorizontally","imagine\\filter\\basic\\flipvertically","imagine\\filter\\basic\\paste","imagine\\filter\\basic\\resize","imagine\\filter\\basic\\rotate","imagine\\filter\\basic\\save","imagine\\filter\\basic\\show","imagine\\filter\\basic\\strip","imagine\\filter\\basic\\thumbnail","imagine\\filter\\basic\\weboptimization","imagine\\filter\\filterinterface","imagine\\filter\\imagineaware","imagine\\filter\\transformation","imagine\\gd\\drawer","imagine\\gd\\effects","imagine\\gd\\font","imagine\\gd\\image","imagine\\gd\\imagine","imagine\\gd\\layers","imagine\\gmagick\\drawer","imagine\\gmagick\\effects","imagine\\gmagick\\font","imagine\\gmagick\\image","imagine\\gmagick\\imagine","imagine\\gmagick\\layers","imagine\\image\\abstractfont","imagine\\image\\abstractimage","imagine\\image\\abstractimagine","imagine\\image\\abstractlayers","imagine\\image\\box","imagine\\image\\boxinterface","imagine\\image\\fill\\fillinterface","imagine\\image\\fill\\gradient\\horizontal","imagine\\image\\fill\\gradient\\linear","imagine\\image\\fill\\gradient\\vertical","imagine\\image\\fontinterface","imagine\\image\\histogram\\bucket","imagine\\image\\histogram\\range","imagine\\image\\imageinterface","imagine\\image\\imagineinterface","imagine\\image\\layersinterface","imagine\\image\\manipulatorinterface","imagine\\image\\metadata\\defaultmetadatareader","imagine\\image\\metadata\\exifmetadatareader","imagine\\image\\metadata\\metadatabag","imagine\\image\\metadata\\metadatareaderinterface","imagine\\image\\palette\\cmyk","imagine\\image\\palette\\colorparser","imagine\\image\\palette\\color\\cmyk","imagine\\image\\palette\\color\\colorinterface","imagine\\image\\palette\\color\\gray","imagine\\image\\palette\\color\\rgb","imagine\\image\\palette\\grayscale","imagine\\image\\palette\\paletteinterface","imagine\\image\\palette\\rgb","imagine\\image\\point","imagine\\image\\pointinterface","imagine\\image\\point\\center","imagine\\image\\profile","imagine\\image\\profileinterface","imagine\\imagick\\drawer","imagine\\imagick\\effects","imagine\\imagick\\font","imagine\\imagick\\image","imagine\\imagick\\imagine","imagine\\imagick\\layers","imagine\\test\\constraint\\isimageequal","imagine\\test\\imaginetestcase","imagine\\draw\\drawerinterface::arc","imagine\\draw\\drawerinterface::chord","imagine\\draw\\drawerinterface::ellipse","imagine\\draw\\drawerinterface::line","imagine\\draw\\drawerinterface::pieslice","imagine\\draw\\drawerinterface::dot","imagine\\draw\\drawerinterface::polygon","imagine\\draw\\drawerinterface::text","imagine\\effects\\effectsinterface::gamma","imagine\\effects\\effectsinterface::negative","imagine\\effects\\effectsinterface::grayscale","imagine\\effects\\effectsinterface::colorize","imagine\\effects\\effectsinterface::sharpen","imagine\\effects\\effectsinterface::blur","imagine\\filter\\advanced\\border::__construct","imagine\\filter\\advanced\\border::apply","imagine\\filter\\advanced\\canvas::__construct","imagine\\filter\\advanced\\canvas::apply","imagine\\filter\\advanced\\grayscale::__construct","imagine\\filter\\advanced\\onpixelbased::__construct","imagine\\filter\\advanced\\onpixelbased::apply","imagine\\filter\\advanced\\relativeresize::__construct","imagine\\filter\\advanced\\relativeresize::apply","imagine\\filter\\basic\\applymask::__construct","imagine\\filter\\basic\\applymask::apply","imagine\\filter\\basic\\copy::apply","imagine\\filter\\basic\\crop::__construct","imagine\\filter\\basic\\crop::apply","imagine\\filter\\basic\\fill::__construct","imagine\\filter\\basic\\fill::apply","imagine\\filter\\basic\\fliphorizontally::apply","imagine\\filter\\basic\\flipvertically::apply","imagine\\filter\\basic\\paste::__construct","imagine\\filter\\basic\\paste::apply","imagine\\filter\\basic\\resize::__construct","imagine\\filter\\basic\\resize::apply","imagine\\filter\\basic\\rotate::__construct","imagine\\filter\\basic\\rotate::apply","imagine\\filter\\basic\\save::__construct","imagine\\filter\\basic\\save::apply","imagine\\filter\\basic\\show::__construct","imagine\\filter\\basic\\show::apply","imagine\\filter\\basic\\strip::apply","imagine\\filter\\basic\\thumbnail::__construct","imagine\\filter\\basic\\thumbnail::apply","imagine\\filter\\basic\\weboptimization::__construct","imagine\\filter\\basic\\weboptimization::apply","imagine\\filter\\filterinterface::apply","imagine\\filter\\imagineaware::setimagine","imagine\\filter\\imagineaware::getimagine","imagine\\filter\\transformation::__construct","imagine\\filter\\transformation::applyfilter","imagine\\filter\\transformation::getfilters","imagine\\filter\\transformation::apply","imagine\\filter\\transformation::copy","imagine\\filter\\transformation::crop","imagine\\filter\\transformation::fliphorizontally","imagine\\filter\\transformation::flipvertically","imagine\\filter\\transformation::strip","imagine\\filter\\transformation::paste","imagine\\filter\\transformation::applymask","imagine\\filter\\transformation::fill","imagine\\filter\\transformation::resize","imagine\\filter\\transformation::rotate","imagine\\filter\\transformation::save","imagine\\filter\\transformation::show","imagine\\filter\\transformation::thumbnail","imagine\\filter\\transformation::add","imagine\\gd\\drawer::__construct","imagine\\gd\\drawer::arc","imagine\\gd\\drawer::chord","imagine\\gd\\drawer::ellipse","imagine\\gd\\drawer::line","imagine\\gd\\drawer::pieslice","imagine\\gd\\drawer::dot","imagine\\gd\\drawer::polygon","imagine\\gd\\drawer::text","imagine\\gd\\effects::__construct","imagine\\gd\\effects::gamma","imagine\\gd\\effects::negative","imagine\\gd\\effects::grayscale","imagine\\gd\\effects::colorize","imagine\\gd\\effects::sharpen","imagine\\gd\\effects::blur","imagine\\gd\\font::box","imagine\\gd\\image::__construct","imagine\\gd\\image::__destruct","imagine\\gd\\image::getgdresource","imagine\\gd\\image::copy","imagine\\gd\\image::crop","imagine\\gd\\image::paste","imagine\\gd\\image::resize","imagine\\gd\\image::rotate","imagine\\gd\\image::save","imagine\\gd\\image::show","imagine\\gd\\image::get","imagine\\gd\\image::__tostring","imagine\\gd\\image::fliphorizontally","imagine\\gd\\image::flipvertically","imagine\\gd\\image::strip","imagine\\gd\\image::draw","imagine\\gd\\image::effects","imagine\\gd\\image::getsize","imagine\\gd\\image::applymask","imagine\\gd\\image::fill","imagine\\gd\\image::mask","imagine\\gd\\image::histogram","imagine\\gd\\image::getcolorat","imagine\\gd\\image::layers","imagine\\gd\\image::interlace","imagine\\gd\\image::palette","imagine\\gd\\image::profile","imagine\\gd\\image::usepalette","imagine\\gd\\imagine::__construct","imagine\\gd\\imagine::create","imagine\\gd\\imagine::open","imagine\\gd\\imagine::load","imagine\\gd\\imagine::read","imagine\\gd\\imagine::font","imagine\\gd\\layers::__construct","imagine\\gd\\layers::merge","imagine\\gd\\layers::coalesce","imagine\\gd\\layers::animate","imagine\\gd\\layers::current","imagine\\gd\\layers::key","imagine\\gd\\layers::next","imagine\\gd\\layers::rewind","imagine\\gd\\layers::valid","imagine\\gd\\layers::count","imagine\\gd\\layers::offsetexists","imagine\\gd\\layers::offsetget","imagine\\gd\\layers::offsetset","imagine\\gd\\layers::offsetunset","imagine\\gmagick\\drawer::__construct","imagine\\gmagick\\drawer::arc","imagine\\gmagick\\drawer::chord","imagine\\gmagick\\drawer::ellipse","imagine\\gmagick\\drawer::line","imagine\\gmagick\\drawer::pieslice","imagine\\gmagick\\drawer::dot","imagine\\gmagick\\drawer::polygon","imagine\\gmagick\\drawer::text","imagine\\gmagick\\effects::__construct","imagine\\gmagick\\effects::gamma","imagine\\gmagick\\effects::negative","imagine\\gmagick\\effects::grayscale","imagine\\gmagick\\effects::colorize","imagine\\gmagick\\effects::sharpen","imagine\\gmagick\\effects::blur","imagine\\gmagick\\font::__construct","imagine\\gmagick\\font::box","imagine\\gmagick\\image::__construct","imagine\\gmagick\\image::__destruct","imagine\\gmagick\\image::getgmagick","imagine\\gmagick\\image::copy","imagine\\gmagick\\image::crop","imagine\\gmagick\\image::fliphorizontally","imagine\\gmagick\\image::flipvertically","imagine\\gmagick\\image::strip","imagine\\gmagick\\image::paste","imagine\\gmagick\\image::resize","imagine\\gmagick\\image::rotate","imagine\\gmagick\\image::save","imagine\\gmagick\\image::show","imagine\\gmagick\\image::get","imagine\\gmagick\\image::__tostring","imagine\\gmagick\\image::draw","imagine\\gmagick\\image::effects","imagine\\gmagick\\image::getsize","imagine\\gmagick\\image::applymask","imagine\\gmagick\\image::mask","imagine\\gmagick\\image::fill","imagine\\gmagick\\image::histogram","imagine\\gmagick\\image::getcolorat","imagine\\gmagick\\image::pixeltocolor","imagine\\gmagick\\image::layers","imagine\\gmagick\\image::interlace","imagine\\gmagick\\image::usepalette","imagine\\gmagick\\image::palette","imagine\\gmagick\\image::profile","imagine\\gmagick\\imagine::__construct","imagine\\gmagick\\imagine::open","imagine\\gmagick\\imagine::create","imagine\\gmagick\\imagine::load","imagine\\gmagick\\imagine::read","imagine\\gmagick\\imagine::font","imagine\\gmagick\\layers::__construct","imagine\\gmagick\\layers::merge","imagine\\gmagick\\layers::coalesce","imagine\\gmagick\\layers::animate","imagine\\gmagick\\layers::current","imagine\\gmagick\\layers::key","imagine\\gmagick\\layers::next","imagine\\gmagick\\layers::rewind","imagine\\gmagick\\layers::valid","imagine\\gmagick\\layers::count","imagine\\gmagick\\layers::offsetexists","imagine\\gmagick\\layers::offsetget","imagine\\gmagick\\layers::offsetset","imagine\\gmagick\\layers::offsetunset","imagine\\image\\abstractfont::__construct","imagine\\image\\abstractfont::getfile","imagine\\image\\abstractfont::getsize","imagine\\image\\abstractfont::getcolor","imagine\\image\\abstractimage::thumbnail","imagine\\image\\abstractimage::metadata","imagine\\image\\abstractimage::__clone","imagine\\image\\abstractimagine::setmetadatareader","imagine\\image\\abstractimagine::getmetadatareader","imagine\\image\\abstractlayers::add","imagine\\image\\abstractlayers::set","imagine\\image\\abstractlayers::remove","imagine\\image\\abstractlayers::get","imagine\\image\\abstractlayers::has","imagine\\image\\box::__construct","imagine\\image\\box::getwidth","imagine\\image\\box::getheight","imagine\\image\\box::scale","imagine\\image\\box::increase","imagine\\image\\box::contains","imagine\\image\\box::square","imagine\\image\\box::__tostring","imagine\\image\\box::widen","imagine\\image\\box::heighten","imagine\\image\\boxinterface::getheight","imagine\\image\\boxinterface::getwidth","imagine\\image\\boxinterface::scale","imagine\\image\\boxinterface::increase","imagine\\image\\boxinterface::contains","imagine\\image\\boxinterface::square","imagine\\image\\boxinterface::__tostring","imagine\\image\\boxinterface::widen","imagine\\image\\boxinterface::heighten","imagine\\image\\fill\\fillinterface::getcolor","imagine\\image\\fill\\gradient\\horizontal::getdistance","imagine\\image\\fill\\gradient\\linear::__construct","imagine\\image\\fill\\gradient\\linear::getcolor","imagine\\image\\fill\\gradient\\linear::getstart","imagine\\image\\fill\\gradient\\linear::getend","imagine\\image\\fill\\gradient\\vertical::getdistance","imagine\\image\\fontinterface::getfile","imagine\\image\\fontinterface::getsize","imagine\\image\\fontinterface::getcolor","imagine\\image\\fontinterface::box","imagine\\image\\histogram\\bucket::__construct","imagine\\image\\histogram\\bucket::add","imagine\\image\\histogram\\bucket::count","imagine\\image\\histogram\\range::__construct","imagine\\image\\histogram\\range::contains","imagine\\image\\imageinterface::get","imagine\\image\\imageinterface::__tostring","imagine\\image\\imageinterface::draw","imagine\\image\\imageinterface::effects","imagine\\image\\imageinterface::getsize","imagine\\image\\imageinterface::mask","imagine\\image\\imageinterface::histogram","imagine\\image\\imageinterface::getcolorat","imagine\\image\\imageinterface::layers","imagine\\image\\imageinterface::interlace","imagine\\image\\imageinterface::palette","imagine\\image\\imageinterface::usepalette","imagine\\image\\imageinterface::profile","imagine\\image\\imageinterface::metadata","imagine\\image\\imagineinterface::create","imagine\\image\\imagineinterface::open","imagine\\image\\imagineinterface::load","imagine\\image\\imagineinterface::read","imagine\\image\\imagineinterface::font","imagine\\image\\layersinterface::merge","imagine\\image\\layersinterface::animate","imagine\\image\\layersinterface::coalesce","imagine\\image\\layersinterface::add","imagine\\image\\layersinterface::set","imagine\\image\\layersinterface::remove","imagine\\image\\layersinterface::get","imagine\\image\\layersinterface::has","imagine\\image\\manipulatorinterface::copy","imagine\\image\\manipulatorinterface::crop","imagine\\image\\manipulatorinterface::resize","imagine\\image\\manipulatorinterface::rotate","imagine\\image\\manipulatorinterface::paste","imagine\\image\\manipulatorinterface::save","imagine\\image\\manipulatorinterface::show","imagine\\image\\manipulatorinterface::fliphorizontally","imagine\\image\\manipulatorinterface::flipvertically","imagine\\image\\manipulatorinterface::strip","imagine\\image\\manipulatorinterface::thumbnail","imagine\\image\\manipulatorinterface::applymask","imagine\\image\\manipulatorinterface::fill","imagine\\image\\metadata\\defaultmetadatareader::readfile","imagine\\image\\metadata\\defaultmetadatareader::readdata","imagine\\image\\metadata\\defaultmetadatareader::readstream","imagine\\image\\metadata\\exifmetadatareader::readfile","imagine\\image\\metadata\\exifmetadatareader::readdata","imagine\\image\\metadata\\exifmetadatareader::readstream","imagine\\image\\metadata\\metadatabag::__construct","imagine\\image\\metadata\\metadatabag::getiterator","imagine\\image\\metadata\\metadatabag::offsetexists","imagine\\image\\metadata\\metadatabag::offsetset","imagine\\image\\metadata\\metadatabag::offsetunset","imagine\\image\\metadata\\metadatabag::offsetget","imagine\\image\\metadata\\metadatareaderinterface::readfile","imagine\\image\\metadata\\metadatareaderinterface::readdata","imagine\\image\\metadata\\metadatareaderinterface::readstream","imagine\\image\\palette\\cmyk::__construct","imagine\\image\\palette\\cmyk::name","imagine\\image\\palette\\cmyk::pixeldefinition","imagine\\image\\palette\\cmyk::supportsalpha","imagine\\image\\palette\\cmyk::color","imagine\\image\\palette\\cmyk::blend","imagine\\image\\palette\\cmyk::useprofile","imagine\\image\\palette\\cmyk::profile","imagine\\image\\palette\\colorparser::parsetorgb","imagine\\image\\palette\\colorparser::parsetocmyk","imagine\\image\\palette\\colorparser::parsetograyscale","imagine\\image\\palette\\color\\cmyk::__construct","imagine\\image\\palette\\color\\cmyk::getvalue","imagine\\image\\palette\\color\\cmyk::getcyan","imagine\\image\\palette\\color\\cmyk::getmagenta","imagine\\image\\palette\\color\\cmyk::getyellow","imagine\\image\\palette\\color\\cmyk::getkeyline","imagine\\image\\palette\\color\\cmyk::getpalette","imagine\\image\\palette\\color\\cmyk::getalpha","imagine\\image\\palette\\color\\cmyk::dissolve","imagine\\image\\palette\\color\\cmyk::lighten","imagine\\image\\palette\\color\\cmyk::darken","imagine\\image\\palette\\color\\cmyk::grayscale","imagine\\image\\palette\\color\\cmyk::isopaque","imagine\\image\\palette\\color\\cmyk::__tostring","imagine\\image\\palette\\color\\colorinterface::getvalue","imagine\\image\\palette\\color\\colorinterface::getalpha","imagine\\image\\palette\\color\\colorinterface::getpalette","imagine\\image\\palette\\color\\colorinterface::dissolve","imagine\\image\\palette\\color\\colorinterface::lighten","imagine\\image\\palette\\color\\colorinterface::darken","imagine\\image\\palette\\color\\colorinterface::grayscale","imagine\\image\\palette\\color\\colorinterface::isopaque","imagine\\image\\palette\\color\\gray::__construct","imagine\\image\\palette\\color\\gray::getvalue","imagine\\image\\palette\\color\\gray::getgray","imagine\\image\\palette\\color\\gray::getpalette","imagine\\image\\palette\\color\\gray::getalpha","imagine\\image\\palette\\color\\gray::dissolve","imagine\\image\\palette\\color\\gray::lighten","imagine\\image\\palette\\color\\gray::darken","imagine\\image\\palette\\color\\gray::grayscale","imagine\\image\\palette\\color\\gray::isopaque","imagine\\image\\palette\\color\\gray::__tostring","imagine\\image\\palette\\color\\rgb::__construct","imagine\\image\\palette\\color\\rgb::getvalue","imagine\\image\\palette\\color\\rgb::getred","imagine\\image\\palette\\color\\rgb::getgreen","imagine\\image\\palette\\color\\rgb::getblue","imagine\\image\\palette\\color\\rgb::getpalette","imagine\\image\\palette\\color\\rgb::getalpha","imagine\\image\\palette\\color\\rgb::dissolve","imagine\\image\\palette\\color\\rgb::lighten","imagine\\image\\palette\\color\\rgb::darken","imagine\\image\\palette\\color\\rgb::grayscale","imagine\\image\\palette\\color\\rgb::isopaque","imagine\\image\\palette\\color\\rgb::__tostring","imagine\\image\\palette\\grayscale::__construct","imagine\\image\\palette\\grayscale::name","imagine\\image\\palette\\grayscale::pixeldefinition","imagine\\image\\palette\\grayscale::supportsalpha","imagine\\image\\palette\\grayscale::useprofile","imagine\\image\\palette\\grayscale::profile","imagine\\image\\palette\\grayscale::color","imagine\\image\\palette\\grayscale::blend","imagine\\image\\palette\\paletteinterface::color","imagine\\image\\palette\\paletteinterface::blend","imagine\\image\\palette\\paletteinterface::useprofile","imagine\\image\\palette\\paletteinterface::profile","imagine\\image\\palette\\paletteinterface::name","imagine\\image\\palette\\paletteinterface::pixeldefinition","imagine\\image\\palette\\paletteinterface::supportsalpha","imagine\\image\\palette\\rgb::__construct","imagine\\image\\palette\\rgb::name","imagine\\image\\palette\\rgb::pixeldefinition","imagine\\image\\palette\\rgb::supportsalpha","imagine\\image\\palette\\rgb::useprofile","imagine\\image\\palette\\rgb::profile","imagine\\image\\palette\\rgb::color","imagine\\image\\palette\\rgb::blend","imagine\\image\\point::__construct","imagine\\image\\point::getx","imagine\\image\\point::gety","imagine\\image\\point::in","imagine\\image\\point::move","imagine\\image\\point::__tostring","imagine\\image\\pointinterface::getx","imagine\\image\\pointinterface::gety","imagine\\image\\pointinterface::in","imagine\\image\\pointinterface::move","imagine\\image\\pointinterface::__tostring","imagine\\image\\point\\center::__construct","imagine\\image\\point\\center::getx","imagine\\image\\point\\center::gety","imagine\\image\\point\\center::in","imagine\\image\\point\\center::move","imagine\\image\\point\\center::__tostring","imagine\\image\\profile::__construct","imagine\\image\\profile::name","imagine\\image\\profile::data","imagine\\image\\profile::frompath","imagine\\image\\profileinterface::name","imagine\\image\\profileinterface::data","imagine\\imagick\\drawer::__construct","imagine\\imagick\\drawer::arc","imagine\\imagick\\drawer::chord","imagine\\imagick\\drawer::ellipse","imagine\\imagick\\drawer::line","imagine\\imagick\\drawer::pieslice","imagine\\imagick\\drawer::dot","imagine\\imagick\\drawer::polygon","imagine\\imagick\\drawer::text","imagine\\imagick\\effects::__construct","imagine\\imagick\\effects::gamma","imagine\\imagick\\effects::negative","imagine\\imagick\\effects::grayscale","imagine\\imagick\\effects::colorize","imagine\\imagick\\effects::sharpen","imagine\\imagick\\effects::blur","imagine\\imagick\\font::__construct","imagine\\imagick\\font::box","imagine\\imagick\\image::__construct","imagine\\imagick\\image::__destruct","imagine\\imagick\\image::getimagick","imagine\\imagick\\image::copy","imagine\\imagick\\image::crop","imagine\\imagick\\image::fliphorizontally","imagine\\imagick\\image::flipvertically","imagine\\imagick\\image::strip","imagine\\imagick\\image::paste","imagine\\imagick\\image::resize","imagine\\imagick\\image::rotate","imagine\\imagick\\image::save","imagine\\imagick\\image::show","imagine\\imagick\\image::get","imagine\\imagick\\image::interlace","imagine\\imagick\\image::__tostring","imagine\\imagick\\image::draw","imagine\\imagick\\image::effects","imagine\\imagick\\image::getsize","imagine\\imagick\\image::applymask","imagine\\imagick\\image::mask","imagine\\imagick\\image::fill","imagine\\imagick\\image::histogram","imagine\\imagick\\image::getcolorat","imagine\\imagick\\image::pixeltocolor","imagine\\imagick\\image::layers","imagine\\imagick\\image::usepalette","imagine\\imagick\\image::palette","imagine\\imagick\\image::profile","imagine\\imagick\\imagine::__construct","imagine\\imagick\\imagine::open","imagine\\imagick\\imagine::create","imagine\\imagick\\imagine::load","imagine\\imagick\\imagine::read","imagine\\imagick\\imagine::font","imagine\\imagick\\layers::__construct","imagine\\imagick\\layers::merge","imagine\\imagick\\layers::animate","imagine\\imagick\\layers::coalesce","imagine\\imagick\\layers::current","imagine\\imagick\\layers::key","imagine\\imagick\\layers::next","imagine\\imagick\\layers::rewind","imagine\\imagick\\layers::valid","imagine\\imagick\\layers::count","imagine\\imagick\\layers::offsetexists","imagine\\imagick\\layers::offsetget","imagine\\imagick\\layers::offsetset","imagine\\imagick\\layers::offsetunset","imagine\\test\\constraint\\isimageequal::__construct","imagine\\test\\constraint\\isimageequal::evaluate","imagine\\test\\constraint\\isimageequal::tostring","imagine\\test\\imaginetestcase::assertimageequals"], - 'info': [["Imagine","","Imagine.html","","",3],["Imagine\\Draw","","Imagine\/Draw.html","","",3],["Imagine\\Effects","","Imagine\/Effects.html","","",3],["Imagine\\Exception","","Imagine\/Exception.html","","",3],["Imagine\\Filter","","Imagine\/Filter.html","","",3],["Imagine\\Filter\\Advanced","","Imagine\/Filter\/Advanced.html","","",3],["Imagine\\Filter\\Basic","","Imagine\/Filter\/Basic.html","","",3],["Imagine\\Gd","","Imagine\/Gd.html","","",3],["Imagine\\Gmagick","","Imagine\/Gmagick.html","","",3],["Imagine\\Image","","Imagine\/Image.html","","",3],["Imagine\\Image\\Fill","","Imagine\/Image\/Fill.html","","",3],["Imagine\\Image\\Fill\\Gradient","","Imagine\/Image\/Fill\/Gradient.html","","",3],["Imagine\\Image\\Histogram","","Imagine\/Image\/Histogram.html","","",3],["Imagine\\Image\\Metadata","","Imagine\/Image\/Metadata.html","","",3],["Imagine\\Image\\Palette","","Imagine\/Image\/Palette.html","","",3],["Imagine\\Image\\Palette\\Color","","Imagine\/Image\/Palette\/Color.html","","",3],["Imagine\\Image\\Point","","Imagine\/Image\/Point.html","","",3],["Imagine\\Imagick","","Imagine\/Imagick.html","","",3],["Imagine\\Test","","Imagine\/Test.html","","",3],["Imagine\\Test\\Constraint","","Imagine\/Test\/Constraint.html","","",3],["DrawerInterface","Imagine\\Draw","Imagine\/Draw\/DrawerInterface.html","","Interface for the drawer",1],["EffectsInterface","Imagine\\Effects","Imagine\/Effects\/EffectsInterface.html","","Interface for the effects",1],["Exception","Imagine\\Exception","Imagine\/Exception\/Exception.html","","Imagine-specific exception",1],["InvalidArgumentException","Imagine\\Exception","Imagine\/Exception\/InvalidArgumentException.html"," < InvalidArgumentException","Imagine-specific invalid argument exception",1],["NotSupportedException","Imagine\\Exception","Imagine\/Exception\/NotSupportedException.html"," < RuntimeException","Should be used when a driver does not support an operation.",1],["OutOfBoundsException","Imagine\\Exception","Imagine\/Exception\/OutOfBoundsException.html"," < OutOfBoundsException","Imagine-specific out of bounds exception",1],["RuntimeException","Imagine\\Exception","Imagine\/Exception\/RuntimeException.html"," < RuntimeException","Imagine-specific runtime exception",1],["Border","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/Border.html","","A border filter",1],["Canvas","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/Canvas.html","","A canvas filter",1],["Grayscale","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/Grayscale.html"," < OnPixelBased","The Grayscale filter calculates the gray-value based",1],["OnPixelBased","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/OnPixelBased.html","","The OnPixelBased takes a callable, and for each pixel,",1],["RelativeResize","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/RelativeResize.html","","The RelativeResize filter allows images to be resized",1],["ApplyMask","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/ApplyMask.html","","An apply mask filter",1],["Copy","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Copy.html","","A copy filter",1],["Crop","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Crop.html","","A crop filter",1],["Fill","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Fill.html","","A fill filter",1],["FlipHorizontally","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/FlipHorizontally.html","","A \"flip horizontally\" filter",1],["FlipVertically","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/FlipVertically.html","","A \"flip vertically\" filter",1],["Paste","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Paste.html","","A paste filter",1],["Resize","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Resize.html","","A resize filter",1],["Rotate","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Rotate.html","","A rotate filter",1],["Save","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Save.html","","A save filter",1],["Show","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Show.html","","A show filter",1],["Strip","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Strip.html","","A strip filter",1],["Thumbnail","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Thumbnail.html","","A thumbnail filter",1],["WebOptimization","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/WebOptimization.html","","A filter to render web-optimized images",1],["FilterInterface","Imagine\\Filter","Imagine\/Filter\/FilterInterface.html","","Interface for imagine filters",1],["ImagineAware","Imagine\\Filter","Imagine\/Filter\/ImagineAware.html","","ImagineAware base class",1],["Transformation","Imagine\\Filter","Imagine\/Filter\/Transformation.html","","A transformation filter",1],["Drawer","Imagine\\Gd","Imagine\/Gd\/Drawer.html","","Drawer implementation using the GD library",1],["Effects","Imagine\\Gd","Imagine\/Gd\/Effects.html","","Effects implementation using the GD library",1],["Font","Imagine\\Gd","Imagine\/Gd\/Font.html"," < AbstractFont","Font implementation using the GD library",1],["Image","Imagine\\Gd","Imagine\/Gd\/Image.html"," < AbstractImage","Image implementation using the GD library",1],["Imagine","Imagine\\Gd","Imagine\/Gd\/Imagine.html"," < AbstractImagine","Imagine implementation using the GD library",1],["Layers","Imagine\\Gd","Imagine\/Gd\/Layers.html"," < AbstractLayers","",1],["Drawer","Imagine\\Gmagick","Imagine\/Gmagick\/Drawer.html","","Drawer implementation using the Gmagick PHP extension",1],["Effects","Imagine\\Gmagick","Imagine\/Gmagick\/Effects.html","","Effects implementation using the Gmagick PHP extension",1],["Font","Imagine\\Gmagick","Imagine\/Gmagick\/Font.html"," < AbstractFont","Font implementation using the Gmagick PHP extension",1],["Image","Imagine\\Gmagick","Imagine\/Gmagick\/Image.html"," < AbstractImage","Image implementation using the Gmagick PHP extension",1],["Imagine","Imagine\\Gmagick","Imagine\/Gmagick\/Imagine.html"," < AbstractImagine","Imagine implementation using the Gmagick PHP extension",1],["Layers","Imagine\\Gmagick","Imagine\/Gmagick\/Layers.html"," < AbstractLayers","",1],["AbstractFont","Imagine\\Image","Imagine\/Image\/AbstractFont.html","","Abstract font base class",1],["AbstractImage","Imagine\\Image","Imagine\/Image\/AbstractImage.html","","",1],["AbstractImagine","Imagine\\Image","Imagine\/Image\/AbstractImagine.html","","",1],["AbstractLayers","Imagine\\Image","Imagine\/Image\/AbstractLayers.html","","",1],["Box","Imagine\\Image","Imagine\/Image\/Box.html","","A box implementation",1],["BoxInterface","Imagine\\Image","Imagine\/Image\/BoxInterface.html","","Interface for a box",1],["FillInterface","Imagine\\Image\\Fill","Imagine\/Image\/Fill\/FillInterface.html","","Interface for the fill",1],["Horizontal","Imagine\\Image\\Fill\\Gradient","Imagine\/Image\/Fill\/Gradient\/Horizontal.html"," < Linear","Horizontal gradient fill",1],["Linear","Imagine\\Image\\Fill\\Gradient","Imagine\/Image\/Fill\/Gradient\/Linear.html","","Linear gradient fill",1],["Vertical","Imagine\\Image\\Fill\\Gradient","Imagine\/Image\/Fill\/Gradient\/Vertical.html"," < Linear","Vertical gradient fill",1],["FontInterface","Imagine\\Image","Imagine\/Image\/FontInterface.html","","The font interface",1],["Bucket","Imagine\\Image\\Histogram","Imagine\/Image\/Histogram\/Bucket.html","","Bucket histogram",1],["Range","Imagine\\Image\\Histogram","Imagine\/Image\/Histogram\/Range.html","","Range histogram",1],["ImageInterface","Imagine\\Image","Imagine\/Image\/ImageInterface.html","","The image interface",1],["ImagineInterface","Imagine\\Image","Imagine\/Image\/ImagineInterface.html","","The imagine interface",1],["LayersInterface","Imagine\\Image","Imagine\/Image\/LayersInterface.html","","The layers interface",1],["ManipulatorInterface","Imagine\\Image","Imagine\/Image\/ManipulatorInterface.html","","The manipulator interface",1],["DefaultMetadataReader","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/DefaultMetadataReader.html","","Default metadata reader",1],["ExifMetadataReader","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/ExifMetadataReader.html","","Metadata driven by Exif information",1],["MetadataBag","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/MetadataBag.html","","An interface for Image Metadata",1],["MetadataReaderInterface","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/MetadataReaderInterface.html","","",1],["CMYK","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/CMYK.html","","",1],["ColorParser","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/ColorParser.html","","",1],["CMYK","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/CMYK.html","","",1],["ColorInterface","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/ColorInterface.html","","",1],["Gray","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/Gray.html","","",1],["RGB","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/RGB.html","","",1],["Grayscale","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/Grayscale.html","","",1],["PaletteInterface","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/PaletteInterface.html","","",1],["RGB","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/RGB.html","","",1],["Point","Imagine\\Image","Imagine\/Image\/Point.html","","The point class",1],["PointInterface","Imagine\\Image","Imagine\/Image\/PointInterface.html","","The point interface",1],["Center","Imagine\\Image\\Point","Imagine\/Image\/Point\/Center.html","","Point center",1],["Profile","Imagine\\Image","Imagine\/Image\/Profile.html","","",1],["ProfileInterface","Imagine\\Image","Imagine\/Image\/ProfileInterface.html","","",1],["Drawer","Imagine\\Imagick","Imagine\/Imagick\/Drawer.html","","Drawer implementation using the Imagick PHP extension",1],["Effects","Imagine\\Imagick","Imagine\/Imagick\/Effects.html","","Effects implementation using the Imagick PHP extension",1],["Font","Imagine\\Imagick","Imagine\/Imagick\/Font.html"," < AbstractFont","Font implementation using the Imagick PHP extension",1],["Image","Imagine\\Imagick","Imagine\/Imagick\/Image.html"," < AbstractImage","Image implementation using the Imagick PHP extension",1],["Imagine","Imagine\\Imagick","Imagine\/Imagick\/Imagine.html"," < AbstractImagine","Imagine implementation using the Imagick PHP extension",1],["Layers","Imagine\\Imagick","Imagine\/Imagick\/Layers.html"," < AbstractLayers","",1],["IsImageEqual","Imagine\\Test\\Constraint","Imagine\/Test\/Constraint\/IsImageEqual.html"," < PHPUnit_Framework_Constraint","",1],["ImagineTestCase","Imagine\\Test","Imagine\/Test\/ImagineTestCase.html"," < PHPUnit_Framework_TestCase","",1],["DrawerInterface::arc","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["DrawerInterface::chord","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["DrawerInterface::ellipse","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["DrawerInterface::line","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $outline, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["DrawerInterface::pieSlice","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["DrawerInterface::dot","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["DrawerInterface::polygon","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["DrawerInterface::text","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["EffectsInterface::gamma","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_gamma","(float $correction)","Apply gamma correction",2],["EffectsInterface::negative","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_negative","()","Invert the colors of the image",2],["EffectsInterface::grayscale","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_grayscale","()","Grayscale the image",2],["EffectsInterface::colorize","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["EffectsInterface::sharpen","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_sharpen","()","Sharpens the image",2],["EffectsInterface::blur","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_blur","(float|int $sigma)","Blur the image",2],["Border::__construct","Imagine\\Filter\\Advanced\\Border","Imagine\/Filter\/Advanced\/Border.html#method___construct","(ColorInterface<\/abbr><\/a> $color, integer $width = 1, integer $height = 1)","Constructs Border filter with given color, width and",2],["Border::apply","Imagine\\Filter\\Advanced\\Border","Imagine\/Filter\/Advanced\/Border.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Canvas::__construct","Imagine\\Filter\\Advanced\\Canvas","Imagine\/Filter\/Advanced\/Canvas.html#method___construct","(ImagineInterface<\/abbr><\/a> $imagine, BoxInterface<\/abbr><\/a> $size, PointInterface<\/abbr><\/a> $placement = null, ColorInterface<\/abbr><\/a> $background = null)","Constructs Canvas filter with given width and height",2],["Canvas::apply","Imagine\\Filter\\Advanced\\Canvas","Imagine\/Filter\/Advanced\/Canvas.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Grayscale::__construct","Imagine\\Filter\\Advanced\\Grayscale","Imagine\/Filter\/Advanced\/Grayscale.html#method___construct","()","",2],["OnPixelBased::__construct","Imagine\\Filter\\Advanced\\OnPixelBased","Imagine\/Filter\/Advanced\/OnPixelBased.html#method___construct","($callback)","",2],["OnPixelBased::apply","Imagine\\Filter\\Advanced\\OnPixelBased","Imagine\/Filter\/Advanced\/OnPixelBased.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["RelativeResize::__construct","Imagine\\Filter\\Advanced\\RelativeResize","Imagine\/Filter\/Advanced\/RelativeResize.html#method___construct","(string $method, mixed $parameter)","Constructs a RelativeResize filter with the given method",2],["RelativeResize::apply","Imagine\\Filter\\Advanced\\RelativeResize","Imagine\/Filter\/Advanced\/RelativeResize.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["ApplyMask::__construct","Imagine\\Filter\\Basic\\ApplyMask","Imagine\/Filter\/Basic\/ApplyMask.html#method___construct","(ImageInterface<\/abbr><\/a> $mask)","",2],["ApplyMask::apply","Imagine\\Filter\\Basic\\ApplyMask","Imagine\/Filter\/Basic\/ApplyMask.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Copy::apply","Imagine\\Filter\\Basic\\Copy","Imagine\/Filter\/Basic\/Copy.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Crop::__construct","Imagine\\Filter\\Basic\\Crop","Imagine\/Filter\/Basic\/Crop.html#method___construct","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Constructs a Crop filter with given x, y, coordinates",2],["Crop::apply","Imagine\\Filter\\Basic\\Crop","Imagine\/Filter\/Basic\/Crop.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Fill::__construct","Imagine\\Filter\\Basic\\Fill","Imagine\/Filter\/Basic\/Fill.html#method___construct","(FillInterface<\/abbr><\/a> $fill)","",2],["Fill::apply","Imagine\\Filter\\Basic\\Fill","Imagine\/Filter\/Basic\/Fill.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["FlipHorizontally::apply","Imagine\\Filter\\Basic\\FlipHorizontally","Imagine\/Filter\/Basic\/FlipHorizontally.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["FlipVertically::apply","Imagine\\Filter\\Basic\\FlipVertically","Imagine\/Filter\/Basic\/FlipVertically.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Paste::__construct","Imagine\\Filter\\Basic\\Paste","Imagine\/Filter\/Basic\/Paste.html#method___construct","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Constructs a Paste filter with given ImageInterface",2],["Paste::apply","Imagine\\Filter\\Basic\\Paste","Imagine\/Filter\/Basic\/Paste.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Resize::__construct","Imagine\\Filter\\Basic\\Resize","Imagine\/Filter\/Basic\/Resize.html#method___construct","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Constructs Resize filter with given width and height",2],["Resize::apply","Imagine\\Filter\\Basic\\Resize","Imagine\/Filter\/Basic\/Resize.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Rotate::__construct","Imagine\\Filter\\Basic\\Rotate","Imagine\/Filter\/Basic\/Rotate.html#method___construct","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Constructs Rotate filter with given angle and background",2],["Rotate::apply","Imagine\\Filter\\Basic\\Rotate","Imagine\/Filter\/Basic\/Rotate.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Save::__construct","Imagine\\Filter\\Basic\\Save","Imagine\/Filter\/Basic\/Save.html#method___construct","(string $path = null, array $options = array())","Constructs Save filter with given path and options",2],["Save::apply","Imagine\\Filter\\Basic\\Save","Imagine\/Filter\/Basic\/Save.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Show::__construct","Imagine\\Filter\\Basic\\Show","Imagine\/Filter\/Basic\/Show.html#method___construct","(string $format, array $options = array())","Constructs the Show filter with given format and options",2],["Show::apply","Imagine\\Filter\\Basic\\Show","Imagine\/Filter\/Basic\/Show.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Strip::apply","Imagine\\Filter\\Basic\\Strip","Imagine\/Filter\/Basic\/Strip.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Thumbnail::__construct","Imagine\\Filter\\Basic\\Thumbnail","Imagine\/Filter\/Basic\/Thumbnail.html#method___construct","(BoxInterface<\/abbr><\/a> $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Constructs the Thumbnail filter with given width, height",2],["Thumbnail::apply","Imagine\\Filter\\Basic\\Thumbnail","Imagine\/Filter\/Basic\/Thumbnail.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["WebOptimization::__construct","Imagine\\Filter\\Basic\\WebOptimization","Imagine\/Filter\/Basic\/WebOptimization.html#method___construct","($path = null, array $options = array())","",2],["WebOptimization::apply","Imagine\\Filter\\Basic\\WebOptimization","Imagine\/Filter\/Basic\/WebOptimization.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["FilterInterface::apply","Imagine\\Filter\\FilterInterface","Imagine\/Filter\/FilterInterface.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["ImagineAware::setImagine","Imagine\\Filter\\ImagineAware","Imagine\/Filter\/ImagineAware.html#method_setImagine","(ImagineInterface<\/abbr><\/a> $imagine)","Set ImagineInterface instance.",2],["ImagineAware::getImagine","Imagine\\Filter\\ImagineAware","Imagine\/Filter\/ImagineAware.html#method_getImagine","()","Get ImagineInterface instance.",2],["Transformation::__construct","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method___construct","(ImagineInterface<\/abbr><\/a> $imagine = null)","Class constructor.",2],["Transformation::applyFilter","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_applyFilter","(ImageInterface<\/abbr><\/a> $image, FilterInterface<\/abbr><\/a> $filter)","Applies a given FilterInterface onto given ImageInterface",2],["Transformation::getFilters","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_getFilters","()","Returns a list of filters sorted by their priority.",2],["Transformation::apply","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Transformation::copy","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Transformation::crop","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Transformation::flipHorizontally","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Transformation::flipVertically","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_flipVertically","()","Flips current image using vertical axis",2],["Transformation::strip","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_strip","()","Remove all profiles and comments",2],["Transformation::paste","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Transformation::applyMask","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Transformation::fill","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Transformation::resize","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Transformation::rotate","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Transformation::save","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Transformation::show","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Transformation::thumbnail","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_thumbnail","(BoxInterface<\/abbr><\/a> $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Generates a thumbnail from a current image Returns",2],["Transformation::add","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_add","(FilterInterface<\/abbr><\/a> $filter, int $priority)","Registers a given FilterInterface in an internal array",2],["Drawer::__construct","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method___construct","(resource $resource)","Constructs Drawer with a given gd image resource",2],["Drawer::arc","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["Drawer::chord","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["Drawer::ellipse","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["Drawer::line","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["Drawer::pieSlice","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["Drawer::dot","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["Drawer::polygon","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["Drawer::text","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["Effects::__construct","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method___construct","($resource)","",2],["Effects::gamma","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_gamma","(float $correction)","Apply gamma correction",2],["Effects::negative","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_negative","()","Invert the colors of the image",2],["Effects::grayscale","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_grayscale","()","Grayscale the image",2],["Effects::colorize","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["Effects::sharpen","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_sharpen","()","Sharpens the image",2],["Effects::blur","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_blur","(float|int $sigma = 1)","Blur the image",2],["Font::box","Imagine\\Gd\\Font","Imagine\/Gd\/Font.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Image::__construct","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method___construct","(resource $resource, PaletteInterface<\/abbr><\/a> $palette, MetadataBag<\/abbr><\/a> $metadata)","Constructs a new Image instance",2],["Image::__destruct","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method___destruct","()","Makes sure the current image resource is destroyed",2],["Image::getGdResource","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_getGdResource","()","Returns Gd resource",2],["Image::copy","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Image::crop","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Image::paste","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Image::resize","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Image::rotate","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Image::save","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Image::show","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Image::get","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["Image::__toString","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method___toString","()","Returns the image content as a PNG binary string",2],["Image::flipHorizontally","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Image::flipVertically","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_flipVertically","()","Flips current image using vertical axis",2],["Image::strip","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_strip","()","Remove all profiles and comments",2],["Image::draw","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["Image::effects","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_effects","()","",2],["Image::getSize","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_getSize","()","Returns current image size",2],["Image::applyMask","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Image::fill","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Image::mask","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["Image::histogram","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["Image::getColorAt","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["Image::layers","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_layers","()","Returns the image layers when applicable.",2],["Image::interlace","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["Image::palette","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_palette","()","Return the current color palette",2],["Image::profile","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["Image::usePalette","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["Imagine::__construct","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method___construct","()","",2],["Imagine::create","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["Imagine::open","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_open","(string $path)","Opens an existing image from $path",2],["Imagine::load","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_load","(string $string)","Loads an image from a binary $string",2],["Imagine::read","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["Imagine::font","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Layers::__construct","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method___construct","(Image<\/abbr><\/a> $image, PaletteInterface<\/abbr><\/a> $palette, $resource)","",2],["Layers::merge","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_merge","()","Merge layers into the original objects",2],["Layers::coalesce","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_coalesce","()","Coalesce layers.",2],["Layers::animate","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["Layers::current","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_current","()","{@inheritdoc}",2],["Layers::key","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_key","()","{@inheritdoc}",2],["Layers::next","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_next","()","{@inheritdoc}",2],["Layers::rewind","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_rewind","()","{@inheritdoc}",2],["Layers::valid","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_valid","()","{@inheritdoc}",2],["Layers::count","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_count","()","{@inheritdoc}",2],["Layers::offsetExists","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetExists","($offset)","{@inheritdoc}",2],["Layers::offsetGet","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetGet","($offset)","{@inheritdoc}",2],["Layers::offsetSet","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetSet","($offset, $value)","{@inheritdoc}",2],["Layers::offsetUnset","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["Drawer::__construct","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method___construct","(Gmagick<\/abbr> $gmagick)","",2],["Drawer::arc","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["Drawer::chord","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["Drawer::ellipse","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["Drawer::line","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["Drawer::pieSlice","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["Drawer::dot","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["Drawer::polygon","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["Drawer::text","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["Effects::__construct","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method___construct","(Gmagick<\/abbr> $gmagick)","",2],["Effects::gamma","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_gamma","(float $correction)","Apply gamma correction",2],["Effects::negative","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_negative","()","Invert the colors of the image",2],["Effects::grayscale","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_grayscale","()","Grayscale the image",2],["Effects::colorize","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["Effects::sharpen","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_sharpen","()","Sharpens the image",2],["Effects::blur","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_blur","(float|int $sigma = 1)","Blur the image",2],["Font::__construct","Imagine\\Gmagick\\Font","Imagine\/Gmagick\/Font.html#method___construct","(Gmagick<\/abbr> $gmagick, string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Font::box","Imagine\\Gmagick\\Font","Imagine\/Gmagick\/Font.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Image::__construct","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method___construct","(Gmagick<\/abbr> $gmagick, PaletteInterface<\/abbr><\/a> $palette, MetadataBag<\/abbr><\/a> $metadata)","Constructs a new Image instance",2],["Image::__destruct","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method___destruct","()","Destroys allocated gmagick resources",2],["Image::getGmagick","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_getGmagick","()","Returns gmagick instance",2],["Image::copy","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Image::crop","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Image::flipHorizontally","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Image::flipVertically","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_flipVertically","()","Flips current image using vertical axis",2],["Image::strip","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_strip","()","Remove all profiles and comments",2],["Image::paste","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Image::resize","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Image::rotate","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Image::save","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Image::show","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Image::get","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["Image::__toString","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method___toString","()","Returns the image content as a PNG binary string",2],["Image::draw","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["Image::effects","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_effects","()","",2],["Image::getSize","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_getSize","()","Returns current image size",2],["Image::applyMask","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Image::mask","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["Image::fill","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Image::histogram","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["Image::getColorAt","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["Image::pixelToColor","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_pixelToColor","(GmagickPixel<\/abbr> $pixel)","Returns a color given a pixel, depending the Palette",2],["Image::layers","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_layers","()","Returns the image layers when applicable.",2],["Image::interlace","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["Image::usePalette","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["Image::palette","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_palette","()","Return the current color palette",2],["Image::profile","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["Imagine::__construct","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method___construct","()","",2],["Imagine::open","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_open","(string $path)","Opens an existing image from $path",2],["Imagine::create","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["Imagine::load","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_load","(string $string)","Loads an image from a binary $string",2],["Imagine::read","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["Imagine::font","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Layers::__construct","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method___construct","(Image<\/abbr><\/a> $image, PaletteInterface<\/abbr><\/a> $palette, Gmagick<\/abbr> $resource)","",2],["Layers::merge","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_merge","()","Merge layers into the original objects",2],["Layers::coalesce","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_coalesce","()","Coalesce layers.",2],["Layers::animate","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["Layers::current","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_current","()","{@inheritdoc}",2],["Layers::key","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_key","()","{@inheritdoc}",2],["Layers::next","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_next","()","{@inheritdoc}",2],["Layers::rewind","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_rewind","()","{@inheritdoc}",2],["Layers::valid","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_valid","()","{@inheritdoc}",2],["Layers::count","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_count","()","{@inheritdoc}",2],["Layers::offsetExists","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetExists","($offset)","{@inheritdoc}",2],["Layers::offsetGet","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetGet","($offset)","{@inheritdoc}",2],["Layers::offsetSet","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetSet","($offset, $image)","{@inheritdoc}",2],["Layers::offsetUnset","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["AbstractFont::__construct","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method___construct","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["AbstractFont::getFile","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method_getFile","()","Gets the fontfile for current font",2],["AbstractFont::getSize","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method_getSize","()","Gets font's integer point size",2],["AbstractFont::getColor","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method_getColor","()","Gets font's color",2],["AbstractImage::thumbnail","Imagine\\Image\\AbstractImage","Imagine\/Image\/AbstractImage.html#method_thumbnail","(BoxInterface<\/abbr><\/a> $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Generates a thumbnail from a current image Returns",2],["AbstractImage::metadata","Imagine\\Image\\AbstractImage","Imagine\/Image\/AbstractImage.html#method_metadata","()","Returns the Image's meta data",2],["AbstractImage::__clone","Imagine\\Image\\AbstractImage","Imagine\/Image\/AbstractImage.html#method___clone","()","Assures the metadata instance will be cloned, too",2],["AbstractImagine::setMetadataReader","Imagine\\Image\\AbstractImagine","Imagine\/Image\/AbstractImagine.html#method_setMetadataReader","(MetadataReaderInterface<\/abbr><\/a> $metadataReader)","",2],["AbstractImagine::getMetadataReader","Imagine\\Image\\AbstractImagine","Imagine\/Image\/AbstractImagine.html#method_getMetadataReader","()","",2],["AbstractLayers::add","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_add","(ImageInterface<\/abbr><\/a> $image)","Adds an image at the end of the layers stack",2],["AbstractLayers::set","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_set","(integer $offset, ImageInterface<\/abbr><\/a> $image)","Set an image at offset",2],["AbstractLayers::remove","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_remove","(integer $offset)","Removes the image at offset",2],["AbstractLayers::get","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_get","(integer $offset)","Returns the image at offset",2],["AbstractLayers::has","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_has","(integer $offset)","Returns true if a layer at offset is preset",2],["Box::__construct","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method___construct","(integer $width, integer $height)","Constructs the Size with given width and height",2],["Box::getWidth","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_getWidth","()","Gets current image width",2],["Box::getHeight","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_getHeight","()","Gets current image height",2],["Box::scale","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_scale","(float $ratio)","Creates new BoxInterface instance with ratios applied",2],["Box::increase","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_increase","(integer $size)","Creates new BoxInterface, adding given size to both",2],["Box::contains","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_contains","(BoxInterface<\/abbr><\/a> $box, PointInterface<\/abbr><\/a> $start = null)","Checks whether current box can fit given box at a given",2],["Box::square","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_square","()","Gets current box square, useful for getting total number",2],["Box::__toString","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method___toString","()","Returns a string representation of the current box",2],["Box::widen","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_widen","(integer $width)","Resizes box to given width, constraining proportions",2],["Box::heighten","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_heighten","(integer $height)","Resizes box to given height, constraining proportions",2],["BoxInterface::getHeight","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_getHeight","()","Gets current image height",2],["BoxInterface::getWidth","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_getWidth","()","Gets current image width",2],["BoxInterface::scale","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_scale","(float $ratio)","Creates new BoxInterface instance with ratios applied",2],["BoxInterface::increase","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_increase","(integer $size)","Creates new BoxInterface, adding given size to both",2],["BoxInterface::contains","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_contains","(BoxInterface<\/abbr><\/a> $box, PointInterface<\/abbr><\/a> $start = null)","Checks whether current box can fit given box at a given",2],["BoxInterface::square","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_square","()","Gets current box square, useful for getting total number",2],["BoxInterface::__toString","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method___toString","()","Returns a string representation of the current box",2],["BoxInterface::widen","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_widen","(integer $width)","Resizes box to given width, constraining proportions",2],["BoxInterface::heighten","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_heighten","(integer $height)","Resizes box to given height, constraining proportions",2],["FillInterface::getColor","Imagine\\Image\\Fill\\FillInterface","Imagine\/Image\/Fill\/FillInterface.html#method_getColor","(PointInterface<\/abbr><\/a> $position)","Gets color of the fill for the given position",2],["Horizontal::getDistance","Imagine\\Image\\Fill\\Gradient\\Horizontal","Imagine\/Image\/Fill\/Gradient\/Horizontal.html#method_getDistance","(PointInterface<\/abbr><\/a> $position)","{@inheritdoc}",2],["Linear::__construct","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method___construct","(integer $length, ColorInterface<\/abbr><\/a> $start, ColorInterface<\/abbr><\/a> $end)","Constructs a linear gradient with overall gradient",2],["Linear::getColor","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method_getColor","(PointInterface<\/abbr><\/a> $position)","Gets color of the fill for the given position",2],["Linear::getStart","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method_getStart","()","",2],["Linear::getEnd","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method_getEnd","()","",2],["Vertical::getDistance","Imagine\\Image\\Fill\\Gradient\\Vertical","Imagine\/Image\/Fill\/Gradient\/Vertical.html#method_getDistance","(PointInterface<\/abbr><\/a> $position)","{@inheritdoc}",2],["FontInterface::getFile","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_getFile","()","Gets the fontfile for current font",2],["FontInterface::getSize","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_getSize","()","Gets font's integer point size",2],["FontInterface::getColor","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_getColor","()","Gets font's color",2],["FontInterface::box","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Bucket::__construct","Imagine\\Image\\Histogram\\Bucket","Imagine\/Image\/Histogram\/Bucket.html#method___construct","(Range<\/abbr><\/a> $range, integer $count)","",2],["Bucket::add","Imagine\\Image\\Histogram\\Bucket","Imagine\/Image\/Histogram\/Bucket.html#method_add","(integer $value)","",2],["Bucket::count","Imagine\\Image\\Histogram\\Bucket","Imagine\/Image\/Histogram\/Bucket.html#method_count","()","",2],["Range::__construct","Imagine\\Image\\Histogram\\Range","Imagine\/Image\/Histogram\/Range.html#method___construct","(integer $start, integer $end)","",2],["Range::contains","Imagine\\Image\\Histogram\\Range","Imagine\/Image\/Histogram\/Range.html#method_contains","(integer $value)","",2],["ImageInterface::get","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["ImageInterface::__toString","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method___toString","()","Returns the image content as a PNG binary string",2],["ImageInterface::draw","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["ImageInterface::effects","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_effects","()","",2],["ImageInterface::getSize","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_getSize","()","Returns current image size",2],["ImageInterface::mask","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["ImageInterface::histogram","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["ImageInterface::getColorAt","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["ImageInterface::layers","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_layers","()","Returns the image layers when applicable.",2],["ImageInterface::interlace","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["ImageInterface::palette","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_palette","()","Return the current color palette",2],["ImageInterface::usePalette","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["ImageInterface::profile","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["ImageInterface::metadata","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_metadata","()","Returns the Image's meta data",2],["ImagineInterface::create","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["ImagineInterface::open","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_open","(string $path)","Opens an existing image from $path",2],["ImagineInterface::load","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_load","(string $string)","Loads an image from a binary $string",2],["ImagineInterface::read","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["ImagineInterface::font","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["LayersInterface::merge","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_merge","()","Merge layers into the original objects",2],["LayersInterface::animate","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["LayersInterface::coalesce","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_coalesce","()","Coalesce layers.",2],["LayersInterface::add","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_add","(ImageInterface<\/abbr><\/a> $image)","Adds an image at the end of the layers stack",2],["LayersInterface::set","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_set","(integer $offset, ImageInterface<\/abbr><\/a> $image)","Set an image at offset",2],["LayersInterface::remove","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_remove","(integer $offset)","Removes the image at offset",2],["LayersInterface::get","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_get","(integer $offset)","Returns the image at offset",2],["LayersInterface::has","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_has","(integer $offset)","Returns true if a layer at offset is preset",2],["ManipulatorInterface::copy","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_copy","()","Copies current source image into a new ImageInterface",2],["ManipulatorInterface::crop","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["ManipulatorInterface::resize","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["ManipulatorInterface::rotate","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["ManipulatorInterface::paste","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["ManipulatorInterface::save","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["ManipulatorInterface::show","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["ManipulatorInterface::flipHorizontally","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["ManipulatorInterface::flipVertically","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_flipVertically","()","Flips current image using vertical axis",2],["ManipulatorInterface::strip","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_strip","()","Remove all profiles and comments",2],["ManipulatorInterface::thumbnail","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_thumbnail","(BoxInterface<\/abbr><\/a> $size, string $mode = self::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Generates a thumbnail from a current image Returns",2],["ManipulatorInterface::applyMask","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["ManipulatorInterface::fill","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["DefaultMetadataReader::readFile","Imagine\\Image\\Metadata\\DefaultMetadataReader","Imagine\/Image\/Metadata\/DefaultMetadataReader.html#method_readFile","($file<\/abbr> $file)","Reads metadata from a file.",2],["DefaultMetadataReader::readData","Imagine\\Image\\Metadata\\DefaultMetadataReader","Imagine\/Image\/Metadata\/DefaultMetadataReader.html#method_readData","($data<\/abbr> $data)","Reads metadata from a binary string.",2],["DefaultMetadataReader::readStream","Imagine\\Image\\Metadata\\DefaultMetadataReader","Imagine\/Image\/Metadata\/DefaultMetadataReader.html#method_readStream","($resource<\/abbr> $resource)","Reads metadata from a stream.",2],["ExifMetadataReader::readFile","Imagine\\Image\\Metadata\\ExifMetadataReader","Imagine\/Image\/Metadata\/ExifMetadataReader.html#method_readFile","($file<\/abbr> $file)","Reads metadata from a file.",2],["ExifMetadataReader::readData","Imagine\\Image\\Metadata\\ExifMetadataReader","Imagine\/Image\/Metadata\/ExifMetadataReader.html#method_readData","($data<\/abbr> $data)","Reads metadata from a binary string.",2],["ExifMetadataReader::readStream","Imagine\\Image\\Metadata\\ExifMetadataReader","Imagine\/Image\/Metadata\/ExifMetadataReader.html#method_readStream","($resource<\/abbr> $resource)","Reads metadata from a stream.",2],["MetadataBag::__construct","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method___construct","(array $data = array())","",2],["MetadataBag::getIterator","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_getIterator","()","{@inheritdoc}",2],["MetadataBag::offsetExists","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetExists","($offset)","{@inheritdoc}",2],["MetadataBag::offsetSet","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetSet","($offset, $value)","{@inheritdoc}",2],["MetadataBag::offsetUnset","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["MetadataBag::offsetGet","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetGet","($offset)","{@inheritdoc}",2],["MetadataReaderInterface::readFile","Imagine\\Image\\Metadata\\MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html#method_readFile","($file<\/abbr> $file)","Reads metadata from a file.",2],["MetadataReaderInterface::readData","Imagine\\Image\\Metadata\\MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html#method_readData","($data<\/abbr> $data)","Reads metadata from a binary string.",2],["MetadataReaderInterface::readStream","Imagine\\Image\\Metadata\\MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html#method_readStream","($resource<\/abbr> $resource)","Reads metadata from a stream.",2],["CMYK::__construct","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method___construct","()","",2],["CMYK::name","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["CMYK::pixelDefinition","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["CMYK::supportsAlpha","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["CMYK::color","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["CMYK::blend","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["CMYK::useProfile","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["CMYK::profile","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["ColorParser::parseToRGB","Imagine\\Image\\Palette\\ColorParser","Imagine\/Image\/Palette\/ColorParser.html#method_parseToRGB","(string|array|integer $color)","Parses a color to a RGB tuple",2],["ColorParser::parseToCMYK","Imagine\\Image\\Palette\\ColorParser","Imagine\/Image\/Palette\/ColorParser.html#method_parseToCMYK","(string|array|integer $color)","Parses a color to a CMYK tuple",2],["ColorParser::parseToGrayscale","Imagine\\Image\\Palette\\ColorParser","Imagine\/Image\/Palette\/ColorParser.html#method_parseToGrayscale","(string|array|integer $color)","Parses a color to a grayscale value",2],["CMYK::__construct","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method___construct","(CMYK<\/abbr><\/a> $palette, array $color)","",2],["CMYK::getValue","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getValue","(string $component)","Return the value of one of the component.",2],["CMYK::getCyan","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getCyan","()","Returns Cyan value of the color",2],["CMYK::getMagenta","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getMagenta","()","Returns Magenta value of the color",2],["CMYK::getYellow","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getYellow","()","Returns Yellow value of the color",2],["CMYK::getKeyline","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getKeyline","()","Returns Key value of the color",2],["CMYK::getPalette","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getPalette","()","Returns the palette attached to the current color",2],["CMYK::getAlpha","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["CMYK::dissolve","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["CMYK::lighten","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["CMYK::darken","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["CMYK::grayscale","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_grayscale","()","Returns a gray related to the current color",2],["CMYK::isOpaque","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_isOpaque","()","Checks if the current color is opaque",2],["CMYK::__toString","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method___toString","()","Returns hex representation of the color",2],["ColorInterface::getValue","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_getValue","(string $component)","Return the value of one of the component.",2],["ColorInterface::getAlpha","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["ColorInterface::getPalette","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_getPalette","()","Returns the palette attached to the current color",2],["ColorInterface::dissolve","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["ColorInterface::lighten","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["ColorInterface::darken","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["ColorInterface::grayscale","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_grayscale","()","Returns a gray related to the current color",2],["ColorInterface::isOpaque","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_isOpaque","()","Checks if the current color is opaque",2],["Gray::__construct","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method___construct","(Grayscale<\/abbr><\/a> $palette, array $color, $alpha)","",2],["Gray::getValue","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getValue","(string $component)","Return the value of one of the component.",2],["Gray::getGray","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getGray","()","Returns Gray value of the color",2],["Gray::getPalette","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getPalette","()","Returns the palette attached to the current color",2],["Gray::getAlpha","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["Gray::dissolve","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["Gray::lighten","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["Gray::darken","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["Gray::grayscale","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_grayscale","()","Returns a gray related to the current color",2],["Gray::isOpaque","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_isOpaque","()","Checks if the current color is opaque",2],["Gray::__toString","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method___toString","()","Returns hex representation of the color",2],["RGB::__construct","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method___construct","(RGB<\/abbr><\/a> $palette, array $color, $alpha)","",2],["RGB::getValue","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getValue","(string $component)","Return the value of one of the component.",2],["RGB::getRed","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getRed","()","Returns RED value of the color",2],["RGB::getGreen","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getGreen","()","Returns GREEN value of the color",2],["RGB::getBlue","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getBlue","()","Returns BLUE value of the color",2],["RGB::getPalette","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getPalette","()","Returns the palette attached to the current color",2],["RGB::getAlpha","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["RGB::dissolve","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["RGB::lighten","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["RGB::darken","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["RGB::grayscale","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_grayscale","()","Returns a gray related to the current color",2],["RGB::isOpaque","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_isOpaque","()","Checks if the current color is opaque",2],["RGB::__toString","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method___toString","()","Returns hex representation of the color",2],["Grayscale::__construct","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method___construct","()","",2],["Grayscale::name","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["Grayscale::pixelDefinition","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["Grayscale::supportsAlpha","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["Grayscale::useProfile","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["Grayscale::profile","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["Grayscale::color","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["Grayscale::blend","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["PaletteInterface::color","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["PaletteInterface::blend","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["PaletteInterface::useProfile","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["PaletteInterface::profile","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["PaletteInterface::name","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["PaletteInterface::pixelDefinition","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["PaletteInterface::supportsAlpha","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["RGB::__construct","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method___construct","()","",2],["RGB::name","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["RGB::pixelDefinition","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["RGB::supportsAlpha","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["RGB::useProfile","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["RGB::profile","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["RGB::color","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["RGB::blend","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["Point::__construct","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method___construct","(integer $x, integer $y)","Constructs a point of coordinates",2],["Point::getX","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_getX","()","Gets points x coordinate",2],["Point::getY","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_getY","()","Gets points y coordinate",2],["Point::in","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_in","(BoxInterface<\/abbr><\/a> $box)","Checks if current coordinate is inside a given bo",2],["Point::move","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_move","(integer $amount)","Returns another point, moved by a given amount from",2],["Point::__toString","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method___toString","()","Gets a string representation for the current point",2],["PointInterface::getX","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_getX","()","Gets points x coordinate",2],["PointInterface::getY","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_getY","()","Gets points y coordinate",2],["PointInterface::in","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_in","(BoxInterface<\/abbr><\/a> $box)","Checks if current coordinate is inside a given bo",2],["PointInterface::move","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_move","(integer $amount)","Returns another point, moved by a given amount from",2],["PointInterface::__toString","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method___toString","()","Gets a string representation for the current point",2],["Center::__construct","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method___construct","(BoxInterface<\/abbr><\/a> $box)","Constructs coordinate with size instance, it needs",2],["Center::getX","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_getX","()","Gets points x coordinate",2],["Center::getY","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_getY","()","Gets points y coordinate",2],["Center::in","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_in","(BoxInterface<\/abbr><\/a> $box)","Checks if current coordinate is inside a given bo",2],["Center::move","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_move","(integer $amount)","Returns another point, moved by a given amount from",2],["Center::__toString","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method___toString","()","Gets a string representation for the current point",2],["Profile::__construct","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method___construct","($name, $data)","",2],["Profile::name","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method_name","()","Returns the name of the profile",2],["Profile::data","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method_data","()","Returns the profile data",2],["Profile::fromPath","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method_fromPath","(String $path)","Creates a profile from a path to a file",2],["ProfileInterface::name","Imagine\\Image\\ProfileInterface","Imagine\/Image\/ProfileInterface.html#method_name","()","Returns the name of the profile",2],["ProfileInterface::data","Imagine\\Image\\ProfileInterface","Imagine\/Image\/ProfileInterface.html#method_data","()","Returns the profile data",2],["Drawer::__construct","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method___construct","(Imagick<\/abbr> $imagick)","",2],["Drawer::arc","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["Drawer::chord","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["Drawer::ellipse","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["Drawer::line","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["Drawer::pieSlice","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["Drawer::dot","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["Drawer::polygon","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["Drawer::text","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["Effects::__construct","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method___construct","(Imagick<\/abbr> $imagick)","",2],["Effects::gamma","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_gamma","(float $correction)","Apply gamma correction",2],["Effects::negative","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_negative","()","Invert the colors of the image",2],["Effects::grayscale","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_grayscale","()","Grayscale the image",2],["Effects::colorize","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["Effects::sharpen","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_sharpen","()","Sharpens the image",2],["Effects::blur","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_blur","(float|int $sigma = 1)","Blur the image",2],["Font::__construct","Imagine\\Imagick\\Font","Imagine\/Imagick\/Font.html#method___construct","(Imagick<\/abbr> $imagick, string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Font::box","Imagine\\Imagick\\Font","Imagine\/Imagick\/Font.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Image::__construct","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method___construct","(Imagick<\/abbr> $imagick, PaletteInterface<\/abbr><\/a> $palette, MetadataBag<\/abbr><\/a> $metadata)","Constructs a new Image instance",2],["Image::__destruct","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method___destruct","()","Destroys allocated imagick resources",2],["Image::getImagick","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_getImagick","()","Returns the underlying \\Imagick instance",2],["Image::copy","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Image::crop","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Image::flipHorizontally","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Image::flipVertically","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_flipVertically","()","Flips current image using vertical axis",2],["Image::strip","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_strip","()","Remove all profiles and comments",2],["Image::paste","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Image::resize","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Image::rotate","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Image::save","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Image::show","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Image::get","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["Image::interlace","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["Image::__toString","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method___toString","()","Returns the image content as a PNG binary string",2],["Image::draw","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["Image::effects","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_effects","()","",2],["Image::getSize","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_getSize","()","Returns current image size",2],["Image::applyMask","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Image::mask","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["Image::fill","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Image::histogram","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["Image::getColorAt","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["Image::pixelToColor","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_pixelToColor","(ImagickPixel<\/abbr> $pixel)","Returns a color given a pixel, depending the Palette",2],["Image::layers","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_layers","()","Returns the image layers when applicable.",2],["Image::usePalette","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["Image::palette","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_palette","()","Return the current color palette",2],["Image::profile","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["Imagine::__construct","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method___construct","()","",2],["Imagine::open","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_open","(string $path)","Opens an existing image from $path",2],["Imagine::create","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["Imagine::load","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_load","(string $string)","Loads an image from a binary $string",2],["Imagine::read","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["Imagine::font","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Layers::__construct","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method___construct","(Image<\/abbr><\/a> $image, PaletteInterface<\/abbr><\/a> $palette, Imagick<\/abbr> $resource)","",2],["Layers::merge","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_merge","()","Merge layers into the original objects",2],["Layers::animate","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["Layers::coalesce","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_coalesce","()","Coalesce layers.",2],["Layers::current","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_current","()","{@inheritdoc}",2],["Layers::key","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_key","()","{@inheritdoc}",2],["Layers::next","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_next","()","{@inheritdoc}",2],["Layers::rewind","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_rewind","()","{@inheritdoc}",2],["Layers::valid","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_valid","()","{@inheritdoc}",2],["Layers::count","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_count","()","{@inheritdoc}",2],["Layers::offsetExists","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetExists","($offset)","{@inheritdoc}",2],["Layers::offsetGet","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetGet","($offset)","{@inheritdoc}",2],["Layers::offsetSet","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetSet","($offset, $image)","{@inheritdoc}",2],["Layers::offsetUnset","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["IsImageEqual::__construct","Imagine\\Test\\Constraint\\IsImageEqual","Imagine\/Test\/Constraint\/IsImageEqual.html#method___construct","(ImageInterface<\/abbr> $value, float $delta = 0.1, integer $buckets = 4)","",2],["IsImageEqual::evaluate","Imagine\\Test\\Constraint\\IsImageEqual","Imagine\/Test\/Constraint\/IsImageEqual.html#method_evaluate","($other)","{@inheritdoc}",2],["IsImageEqual::toString","Imagine\\Test\\Constraint\\IsImageEqual","Imagine\/Test\/Constraint\/IsImageEqual.html#method_toString","()","{@inheritdoc}",2],["ImagineTestCase::assertImageEquals","Imagine\\Test\\ImagineTestCase","Imagine\/Test\/ImagineTestCase.html#method_assertImageEquals","(ImageInterface<\/abbr> $expected, ImageInterface<\/abbr> $actual, string $message = '', float $delta = 0.1, integer $buckets = 4)","Asserts that two images are equal using color histogram",2]] + 'searchIndex': ["imagine","imagine\\draw","imagine\\effects","imagine\\exception","imagine\\filter","imagine\\filter\\advanced","imagine\\filter\\basic","imagine\\gd","imagine\\gmagick","imagine\\image","imagine\\image\\fill","imagine\\image\\fill\\gradient","imagine\\image\\histogram","imagine\\image\\metadata","imagine\\image\\palette","imagine\\image\\palette\\color","imagine\\image\\point","imagine\\imagick","imagine\\test","imagine\\test\\constraint","imagine\\draw\\drawerinterface","imagine\\effects\\effectsinterface","imagine\\exception\\exception","imagine\\exception\\invalidargumentexception","imagine\\exception\\notsupportedexception","imagine\\exception\\outofboundsexception","imagine\\exception\\runtimeexception","imagine\\filter\\advanced\\border","imagine\\filter\\advanced\\canvas","imagine\\filter\\advanced\\grayscale","imagine\\filter\\advanced\\onpixelbased","imagine\\filter\\advanced\\relativeresize","imagine\\filter\\basic\\applymask","imagine\\filter\\basic\\copy","imagine\\filter\\basic\\crop","imagine\\filter\\basic\\fill","imagine\\filter\\basic\\fliphorizontally","imagine\\filter\\basic\\flipvertically","imagine\\filter\\basic\\paste","imagine\\filter\\basic\\resize","imagine\\filter\\basic\\rotate","imagine\\filter\\basic\\save","imagine\\filter\\basic\\show","imagine\\filter\\basic\\strip","imagine\\filter\\basic\\thumbnail","imagine\\filter\\basic\\weboptimization","imagine\\filter\\filterinterface","imagine\\filter\\imagineaware","imagine\\filter\\transformation","imagine\\gd\\drawer","imagine\\gd\\effects","imagine\\gd\\font","imagine\\gd\\image","imagine\\gd\\imagine","imagine\\gd\\layers","imagine\\gmagick\\drawer","imagine\\gmagick\\effects","imagine\\gmagick\\font","imagine\\gmagick\\image","imagine\\gmagick\\imagine","imagine\\gmagick\\layers","imagine\\image\\abstractfont","imagine\\image\\abstractimage","imagine\\image\\abstractimagine","imagine\\image\\abstractlayers","imagine\\image\\box","imagine\\image\\boxinterface","imagine\\image\\fill\\fillinterface","imagine\\image\\fill\\gradient\\horizontal","imagine\\image\\fill\\gradient\\linear","imagine\\image\\fill\\gradient\\vertical","imagine\\image\\fontinterface","imagine\\image\\histogram\\bucket","imagine\\image\\histogram\\range","imagine\\image\\imageinterface","imagine\\image\\imagineinterface","imagine\\image\\layersinterface","imagine\\image\\manipulatorinterface","imagine\\image\\metadata\\abstractmetadatareader","imagine\\image\\metadata\\defaultmetadatareader","imagine\\image\\metadata\\exifmetadatareader","imagine\\image\\metadata\\metadatabag","imagine\\image\\metadata\\metadatareaderinterface","imagine\\image\\palette\\cmyk","imagine\\image\\palette\\colorparser","imagine\\image\\palette\\color\\cmyk","imagine\\image\\palette\\color\\colorinterface","imagine\\image\\palette\\color\\gray","imagine\\image\\palette\\color\\rgb","imagine\\image\\palette\\grayscale","imagine\\image\\palette\\paletteinterface","imagine\\image\\palette\\rgb","imagine\\image\\point","imagine\\image\\pointinterface","imagine\\image\\point\\center","imagine\\image\\profile","imagine\\image\\profileinterface","imagine\\imagick\\drawer","imagine\\imagick\\effects","imagine\\imagick\\font","imagine\\imagick\\image","imagine\\imagick\\imagine","imagine\\imagick\\layers","imagine\\test\\constraint\\isimageequal","imagine\\test\\imaginetestcase","imagine\\draw\\drawerinterface::arc","imagine\\draw\\drawerinterface::chord","imagine\\draw\\drawerinterface::ellipse","imagine\\draw\\drawerinterface::line","imagine\\draw\\drawerinterface::pieslice","imagine\\draw\\drawerinterface::dot","imagine\\draw\\drawerinterface::polygon","imagine\\draw\\drawerinterface::text","imagine\\effects\\effectsinterface::gamma","imagine\\effects\\effectsinterface::negative","imagine\\effects\\effectsinterface::grayscale","imagine\\effects\\effectsinterface::colorize","imagine\\effects\\effectsinterface::sharpen","imagine\\effects\\effectsinterface::blur","imagine\\filter\\advanced\\border::__construct","imagine\\filter\\advanced\\border::apply","imagine\\filter\\advanced\\canvas::__construct","imagine\\filter\\advanced\\canvas::apply","imagine\\filter\\advanced\\grayscale::__construct","imagine\\filter\\advanced\\onpixelbased::__construct","imagine\\filter\\advanced\\onpixelbased::apply","imagine\\filter\\advanced\\relativeresize::__construct","imagine\\filter\\advanced\\relativeresize::apply","imagine\\filter\\basic\\applymask::__construct","imagine\\filter\\basic\\applymask::apply","imagine\\filter\\basic\\copy::apply","imagine\\filter\\basic\\crop::__construct","imagine\\filter\\basic\\crop::apply","imagine\\filter\\basic\\fill::__construct","imagine\\filter\\basic\\fill::apply","imagine\\filter\\basic\\fliphorizontally::apply","imagine\\filter\\basic\\flipvertically::apply","imagine\\filter\\basic\\paste::__construct","imagine\\filter\\basic\\paste::apply","imagine\\filter\\basic\\resize::__construct","imagine\\filter\\basic\\resize::apply","imagine\\filter\\basic\\rotate::__construct","imagine\\filter\\basic\\rotate::apply","imagine\\filter\\basic\\save::__construct","imagine\\filter\\basic\\save::apply","imagine\\filter\\basic\\show::__construct","imagine\\filter\\basic\\show::apply","imagine\\filter\\basic\\strip::apply","imagine\\filter\\basic\\thumbnail::__construct","imagine\\filter\\basic\\thumbnail::apply","imagine\\filter\\basic\\weboptimization::__construct","imagine\\filter\\basic\\weboptimization::apply","imagine\\filter\\filterinterface::apply","imagine\\filter\\imagineaware::setimagine","imagine\\filter\\imagineaware::getimagine","imagine\\filter\\transformation::__construct","imagine\\filter\\transformation::applyfilter","imagine\\filter\\transformation::getfilters","imagine\\filter\\transformation::apply","imagine\\filter\\transformation::copy","imagine\\filter\\transformation::crop","imagine\\filter\\transformation::fliphorizontally","imagine\\filter\\transformation::flipvertically","imagine\\filter\\transformation::strip","imagine\\filter\\transformation::paste","imagine\\filter\\transformation::applymask","imagine\\filter\\transformation::fill","imagine\\filter\\transformation::resize","imagine\\filter\\transformation::rotate","imagine\\filter\\transformation::save","imagine\\filter\\transformation::show","imagine\\filter\\transformation::thumbnail","imagine\\filter\\transformation::add","imagine\\gd\\drawer::__construct","imagine\\gd\\drawer::arc","imagine\\gd\\drawer::chord","imagine\\gd\\drawer::ellipse","imagine\\gd\\drawer::line","imagine\\gd\\drawer::pieslice","imagine\\gd\\drawer::dot","imagine\\gd\\drawer::polygon","imagine\\gd\\drawer::text","imagine\\gd\\effects::__construct","imagine\\gd\\effects::gamma","imagine\\gd\\effects::negative","imagine\\gd\\effects::grayscale","imagine\\gd\\effects::colorize","imagine\\gd\\effects::sharpen","imagine\\gd\\effects::blur","imagine\\gd\\font::box","imagine\\gd\\image::__construct","imagine\\gd\\image::__destruct","imagine\\gd\\image::getgdresource","imagine\\gd\\image::copy","imagine\\gd\\image::crop","imagine\\gd\\image::paste","imagine\\gd\\image::resize","imagine\\gd\\image::rotate","imagine\\gd\\image::save","imagine\\gd\\image::show","imagine\\gd\\image::get","imagine\\gd\\image::__tostring","imagine\\gd\\image::fliphorizontally","imagine\\gd\\image::flipvertically","imagine\\gd\\image::strip","imagine\\gd\\image::draw","imagine\\gd\\image::effects","imagine\\gd\\image::getsize","imagine\\gd\\image::applymask","imagine\\gd\\image::fill","imagine\\gd\\image::mask","imagine\\gd\\image::histogram","imagine\\gd\\image::getcolorat","imagine\\gd\\image::layers","imagine\\gd\\image::interlace","imagine\\gd\\image::palette","imagine\\gd\\image::profile","imagine\\gd\\image::usepalette","imagine\\gd\\imagine::__construct","imagine\\gd\\imagine::create","imagine\\gd\\imagine::open","imagine\\gd\\imagine::load","imagine\\gd\\imagine::read","imagine\\gd\\imagine::font","imagine\\gd\\layers::__construct","imagine\\gd\\layers::merge","imagine\\gd\\layers::coalesce","imagine\\gd\\layers::animate","imagine\\gd\\layers::current","imagine\\gd\\layers::key","imagine\\gd\\layers::next","imagine\\gd\\layers::rewind","imagine\\gd\\layers::valid","imagine\\gd\\layers::count","imagine\\gd\\layers::offsetexists","imagine\\gd\\layers::offsetget","imagine\\gd\\layers::offsetset","imagine\\gd\\layers::offsetunset","imagine\\gmagick\\drawer::__construct","imagine\\gmagick\\drawer::arc","imagine\\gmagick\\drawer::chord","imagine\\gmagick\\drawer::ellipse","imagine\\gmagick\\drawer::line","imagine\\gmagick\\drawer::pieslice","imagine\\gmagick\\drawer::dot","imagine\\gmagick\\drawer::polygon","imagine\\gmagick\\drawer::text","imagine\\gmagick\\effects::__construct","imagine\\gmagick\\effects::gamma","imagine\\gmagick\\effects::negative","imagine\\gmagick\\effects::grayscale","imagine\\gmagick\\effects::colorize","imagine\\gmagick\\effects::sharpen","imagine\\gmagick\\effects::blur","imagine\\gmagick\\font::__construct","imagine\\gmagick\\font::box","imagine\\gmagick\\image::__construct","imagine\\gmagick\\image::__destruct","imagine\\gmagick\\image::getgmagick","imagine\\gmagick\\image::copy","imagine\\gmagick\\image::crop","imagine\\gmagick\\image::fliphorizontally","imagine\\gmagick\\image::flipvertically","imagine\\gmagick\\image::strip","imagine\\gmagick\\image::paste","imagine\\gmagick\\image::resize","imagine\\gmagick\\image::rotate","imagine\\gmagick\\image::save","imagine\\gmagick\\image::show","imagine\\gmagick\\image::get","imagine\\gmagick\\image::__tostring","imagine\\gmagick\\image::draw","imagine\\gmagick\\image::effects","imagine\\gmagick\\image::getsize","imagine\\gmagick\\image::applymask","imagine\\gmagick\\image::mask","imagine\\gmagick\\image::fill","imagine\\gmagick\\image::histogram","imagine\\gmagick\\image::getcolorat","imagine\\gmagick\\image::pixeltocolor","imagine\\gmagick\\image::layers","imagine\\gmagick\\image::interlace","imagine\\gmagick\\image::usepalette","imagine\\gmagick\\image::palette","imagine\\gmagick\\image::profile","imagine\\gmagick\\imagine::__construct","imagine\\gmagick\\imagine::open","imagine\\gmagick\\imagine::create","imagine\\gmagick\\imagine::load","imagine\\gmagick\\imagine::read","imagine\\gmagick\\imagine::font","imagine\\gmagick\\layers::__construct","imagine\\gmagick\\layers::merge","imagine\\gmagick\\layers::coalesce","imagine\\gmagick\\layers::animate","imagine\\gmagick\\layers::current","imagine\\gmagick\\layers::key","imagine\\gmagick\\layers::next","imagine\\gmagick\\layers::rewind","imagine\\gmagick\\layers::valid","imagine\\gmagick\\layers::count","imagine\\gmagick\\layers::offsetexists","imagine\\gmagick\\layers::offsetget","imagine\\gmagick\\layers::offsetset","imagine\\gmagick\\layers::offsetunset","imagine\\image\\abstractfont::__construct","imagine\\image\\abstractfont::getfile","imagine\\image\\abstractfont::getsize","imagine\\image\\abstractfont::getcolor","imagine\\image\\abstractimage::thumbnail","imagine\\image\\abstractimage::metadata","imagine\\image\\abstractimage::__clone","imagine\\image\\abstractimagine::setmetadatareader","imagine\\image\\abstractimagine::getmetadatareader","imagine\\image\\abstractlayers::add","imagine\\image\\abstractlayers::set","imagine\\image\\abstractlayers::remove","imagine\\image\\abstractlayers::get","imagine\\image\\abstractlayers::has","imagine\\image\\box::__construct","imagine\\image\\box::getwidth","imagine\\image\\box::getheight","imagine\\image\\box::scale","imagine\\image\\box::increase","imagine\\image\\box::contains","imagine\\image\\box::square","imagine\\image\\box::__tostring","imagine\\image\\box::widen","imagine\\image\\box::heighten","imagine\\image\\boxinterface::getheight","imagine\\image\\boxinterface::getwidth","imagine\\image\\boxinterface::scale","imagine\\image\\boxinterface::increase","imagine\\image\\boxinterface::contains","imagine\\image\\boxinterface::square","imagine\\image\\boxinterface::__tostring","imagine\\image\\boxinterface::widen","imagine\\image\\boxinterface::heighten","imagine\\image\\fill\\fillinterface::getcolor","imagine\\image\\fill\\gradient\\horizontal::getdistance","imagine\\image\\fill\\gradient\\linear::__construct","imagine\\image\\fill\\gradient\\linear::getcolor","imagine\\image\\fill\\gradient\\linear::getstart","imagine\\image\\fill\\gradient\\linear::getend","imagine\\image\\fill\\gradient\\vertical::getdistance","imagine\\image\\fontinterface::getfile","imagine\\image\\fontinterface::getsize","imagine\\image\\fontinterface::getcolor","imagine\\image\\fontinterface::box","imagine\\image\\histogram\\bucket::__construct","imagine\\image\\histogram\\bucket::add","imagine\\image\\histogram\\bucket::count","imagine\\image\\histogram\\range::__construct","imagine\\image\\histogram\\range::contains","imagine\\image\\imageinterface::get","imagine\\image\\imageinterface::__tostring","imagine\\image\\imageinterface::draw","imagine\\image\\imageinterface::effects","imagine\\image\\imageinterface::getsize","imagine\\image\\imageinterface::mask","imagine\\image\\imageinterface::histogram","imagine\\image\\imageinterface::getcolorat","imagine\\image\\imageinterface::layers","imagine\\image\\imageinterface::interlace","imagine\\image\\imageinterface::palette","imagine\\image\\imageinterface::usepalette","imagine\\image\\imageinterface::profile","imagine\\image\\imageinterface::metadata","imagine\\image\\imagineinterface::create","imagine\\image\\imagineinterface::open","imagine\\image\\imagineinterface::load","imagine\\image\\imagineinterface::read","imagine\\image\\imagineinterface::font","imagine\\image\\layersinterface::merge","imagine\\image\\layersinterface::animate","imagine\\image\\layersinterface::coalesce","imagine\\image\\layersinterface::add","imagine\\image\\layersinterface::set","imagine\\image\\layersinterface::remove","imagine\\image\\layersinterface::get","imagine\\image\\layersinterface::has","imagine\\image\\manipulatorinterface::copy","imagine\\image\\manipulatorinterface::crop","imagine\\image\\manipulatorinterface::resize","imagine\\image\\manipulatorinterface::rotate","imagine\\image\\manipulatorinterface::paste","imagine\\image\\manipulatorinterface::save","imagine\\image\\manipulatorinterface::show","imagine\\image\\manipulatorinterface::fliphorizontally","imagine\\image\\manipulatorinterface::flipvertically","imagine\\image\\manipulatorinterface::strip","imagine\\image\\manipulatorinterface::thumbnail","imagine\\image\\manipulatorinterface::applymask","imagine\\image\\manipulatorinterface::fill","imagine\\image\\metadata\\abstractmetadatareader::readfile","imagine\\image\\metadata\\abstractmetadatareader::readdata","imagine\\image\\metadata\\abstractmetadatareader::readstream","imagine\\image\\metadata\\exifmetadatareader::__construct","imagine\\image\\metadata\\metadatabag::__construct","imagine\\image\\metadata\\metadatabag::getiterator","imagine\\image\\metadata\\metadatabag::offsetexists","imagine\\image\\metadata\\metadatabag::offsetset","imagine\\image\\metadata\\metadatabag::offsetunset","imagine\\image\\metadata\\metadatabag::offsetget","imagine\\image\\metadata\\metadatabag::toarray","imagine\\image\\metadata\\metadatareaderinterface::readfile","imagine\\image\\metadata\\metadatareaderinterface::readdata","imagine\\image\\metadata\\metadatareaderinterface::readstream","imagine\\image\\palette\\cmyk::__construct","imagine\\image\\palette\\cmyk::name","imagine\\image\\palette\\cmyk::pixeldefinition","imagine\\image\\palette\\cmyk::supportsalpha","imagine\\image\\palette\\cmyk::color","imagine\\image\\palette\\cmyk::blend","imagine\\image\\palette\\cmyk::useprofile","imagine\\image\\palette\\cmyk::profile","imagine\\image\\palette\\colorparser::parsetorgb","imagine\\image\\palette\\colorparser::parsetocmyk","imagine\\image\\palette\\colorparser::parsetograyscale","imagine\\image\\palette\\color\\cmyk::__construct","imagine\\image\\palette\\color\\cmyk::getvalue","imagine\\image\\palette\\color\\cmyk::getcyan","imagine\\image\\palette\\color\\cmyk::getmagenta","imagine\\image\\palette\\color\\cmyk::getyellow","imagine\\image\\palette\\color\\cmyk::getkeyline","imagine\\image\\palette\\color\\cmyk::getpalette","imagine\\image\\palette\\color\\cmyk::getalpha","imagine\\image\\palette\\color\\cmyk::dissolve","imagine\\image\\palette\\color\\cmyk::lighten","imagine\\image\\palette\\color\\cmyk::darken","imagine\\image\\palette\\color\\cmyk::grayscale","imagine\\image\\palette\\color\\cmyk::isopaque","imagine\\image\\palette\\color\\cmyk::__tostring","imagine\\image\\palette\\color\\colorinterface::getvalue","imagine\\image\\palette\\color\\colorinterface::getalpha","imagine\\image\\palette\\color\\colorinterface::getpalette","imagine\\image\\palette\\color\\colorinterface::dissolve","imagine\\image\\palette\\color\\colorinterface::lighten","imagine\\image\\palette\\color\\colorinterface::darken","imagine\\image\\palette\\color\\colorinterface::grayscale","imagine\\image\\palette\\color\\colorinterface::isopaque","imagine\\image\\palette\\color\\gray::__construct","imagine\\image\\palette\\color\\gray::getvalue","imagine\\image\\palette\\color\\gray::getgray","imagine\\image\\palette\\color\\gray::getpalette","imagine\\image\\palette\\color\\gray::getalpha","imagine\\image\\palette\\color\\gray::dissolve","imagine\\image\\palette\\color\\gray::lighten","imagine\\image\\palette\\color\\gray::darken","imagine\\image\\palette\\color\\gray::grayscale","imagine\\image\\palette\\color\\gray::isopaque","imagine\\image\\palette\\color\\gray::__tostring","imagine\\image\\palette\\color\\rgb::__construct","imagine\\image\\palette\\color\\rgb::getvalue","imagine\\image\\palette\\color\\rgb::getred","imagine\\image\\palette\\color\\rgb::getgreen","imagine\\image\\palette\\color\\rgb::getblue","imagine\\image\\palette\\color\\rgb::getpalette","imagine\\image\\palette\\color\\rgb::getalpha","imagine\\image\\palette\\color\\rgb::dissolve","imagine\\image\\palette\\color\\rgb::lighten","imagine\\image\\palette\\color\\rgb::darken","imagine\\image\\palette\\color\\rgb::grayscale","imagine\\image\\palette\\color\\rgb::isopaque","imagine\\image\\palette\\color\\rgb::__tostring","imagine\\image\\palette\\grayscale::__construct","imagine\\image\\palette\\grayscale::name","imagine\\image\\palette\\grayscale::pixeldefinition","imagine\\image\\palette\\grayscale::supportsalpha","imagine\\image\\palette\\grayscale::useprofile","imagine\\image\\palette\\grayscale::profile","imagine\\image\\palette\\grayscale::color","imagine\\image\\palette\\grayscale::blend","imagine\\image\\palette\\paletteinterface::color","imagine\\image\\palette\\paletteinterface::blend","imagine\\image\\palette\\paletteinterface::useprofile","imagine\\image\\palette\\paletteinterface::profile","imagine\\image\\palette\\paletteinterface::name","imagine\\image\\palette\\paletteinterface::pixeldefinition","imagine\\image\\palette\\paletteinterface::supportsalpha","imagine\\image\\palette\\rgb::__construct","imagine\\image\\palette\\rgb::name","imagine\\image\\palette\\rgb::pixeldefinition","imagine\\image\\palette\\rgb::supportsalpha","imagine\\image\\palette\\rgb::useprofile","imagine\\image\\palette\\rgb::profile","imagine\\image\\palette\\rgb::color","imagine\\image\\palette\\rgb::blend","imagine\\image\\point::__construct","imagine\\image\\point::getx","imagine\\image\\point::gety","imagine\\image\\point::in","imagine\\image\\point::move","imagine\\image\\point::__tostring","imagine\\image\\pointinterface::getx","imagine\\image\\pointinterface::gety","imagine\\image\\pointinterface::in","imagine\\image\\pointinterface::move","imagine\\image\\pointinterface::__tostring","imagine\\image\\point\\center::__construct","imagine\\image\\point\\center::getx","imagine\\image\\point\\center::gety","imagine\\image\\point\\center::in","imagine\\image\\point\\center::move","imagine\\image\\point\\center::__tostring","imagine\\image\\profile::__construct","imagine\\image\\profile::name","imagine\\image\\profile::data","imagine\\image\\profile::frompath","imagine\\image\\profileinterface::name","imagine\\image\\profileinterface::data","imagine\\imagick\\drawer::__construct","imagine\\imagick\\drawer::arc","imagine\\imagick\\drawer::chord","imagine\\imagick\\drawer::ellipse","imagine\\imagick\\drawer::line","imagine\\imagick\\drawer::pieslice","imagine\\imagick\\drawer::dot","imagine\\imagick\\drawer::polygon","imagine\\imagick\\drawer::text","imagine\\imagick\\effects::__construct","imagine\\imagick\\effects::gamma","imagine\\imagick\\effects::negative","imagine\\imagick\\effects::grayscale","imagine\\imagick\\effects::colorize","imagine\\imagick\\effects::sharpen","imagine\\imagick\\effects::blur","imagine\\imagick\\font::__construct","imagine\\imagick\\font::box","imagine\\imagick\\image::__construct","imagine\\imagick\\image::__destruct","imagine\\imagick\\image::getimagick","imagine\\imagick\\image::copy","imagine\\imagick\\image::crop","imagine\\imagick\\image::fliphorizontally","imagine\\imagick\\image::flipvertically","imagine\\imagick\\image::strip","imagine\\imagick\\image::paste","imagine\\imagick\\image::resize","imagine\\imagick\\image::rotate","imagine\\imagick\\image::save","imagine\\imagick\\image::show","imagine\\imagick\\image::get","imagine\\imagick\\image::interlace","imagine\\imagick\\image::__tostring","imagine\\imagick\\image::draw","imagine\\imagick\\image::effects","imagine\\imagick\\image::getsize","imagine\\imagick\\image::applymask","imagine\\imagick\\image::mask","imagine\\imagick\\image::fill","imagine\\imagick\\image::histogram","imagine\\imagick\\image::getcolorat","imagine\\imagick\\image::pixeltocolor","imagine\\imagick\\image::layers","imagine\\imagick\\image::usepalette","imagine\\imagick\\image::palette","imagine\\imagick\\image::profile","imagine\\imagick\\imagine::__construct","imagine\\imagick\\imagine::open","imagine\\imagick\\imagine::create","imagine\\imagick\\imagine::load","imagine\\imagick\\imagine::read","imagine\\imagick\\imagine::font","imagine\\imagick\\layers::__construct","imagine\\imagick\\layers::merge","imagine\\imagick\\layers::animate","imagine\\imagick\\layers::coalesce","imagine\\imagick\\layers::current","imagine\\imagick\\layers::key","imagine\\imagick\\layers::next","imagine\\imagick\\layers::rewind","imagine\\imagick\\layers::valid","imagine\\imagick\\layers::count","imagine\\imagick\\layers::offsetexists","imagine\\imagick\\layers::offsetget","imagine\\imagick\\layers::offsetset","imagine\\imagick\\layers::offsetunset","imagine\\test\\constraint\\isimageequal::__construct","imagine\\test\\constraint\\isimageequal::evaluate","imagine\\test\\constraint\\isimageequal::tostring","imagine\\test\\imaginetestcase::assertimageequals"], + 'info': [["Imagine","","Imagine.html","","",3],["Imagine\\Draw","","Imagine\/Draw.html","","",3],["Imagine\\Effects","","Imagine\/Effects.html","","",3],["Imagine\\Exception","","Imagine\/Exception.html","","",3],["Imagine\\Filter","","Imagine\/Filter.html","","",3],["Imagine\\Filter\\Advanced","","Imagine\/Filter\/Advanced.html","","",3],["Imagine\\Filter\\Basic","","Imagine\/Filter\/Basic.html","","",3],["Imagine\\Gd","","Imagine\/Gd.html","","",3],["Imagine\\Gmagick","","Imagine\/Gmagick.html","","",3],["Imagine\\Image","","Imagine\/Image.html","","",3],["Imagine\\Image\\Fill","","Imagine\/Image\/Fill.html","","",3],["Imagine\\Image\\Fill\\Gradient","","Imagine\/Image\/Fill\/Gradient.html","","",3],["Imagine\\Image\\Histogram","","Imagine\/Image\/Histogram.html","","",3],["Imagine\\Image\\Metadata","","Imagine\/Image\/Metadata.html","","",3],["Imagine\\Image\\Palette","","Imagine\/Image\/Palette.html","","",3],["Imagine\\Image\\Palette\\Color","","Imagine\/Image\/Palette\/Color.html","","",3],["Imagine\\Image\\Point","","Imagine\/Image\/Point.html","","",3],["Imagine\\Imagick","","Imagine\/Imagick.html","","",3],["Imagine\\Test","","Imagine\/Test.html","","",3],["Imagine\\Test\\Constraint","","Imagine\/Test\/Constraint.html","","",3],["DrawerInterface","Imagine\\Draw","Imagine\/Draw\/DrawerInterface.html","","Interface for the drawer",1],["EffectsInterface","Imagine\\Effects","Imagine\/Effects\/EffectsInterface.html","","Interface for the effects",1],["Exception","Imagine\\Exception","Imagine\/Exception\/Exception.html","","Imagine-specific exception",1],["InvalidArgumentException","Imagine\\Exception","Imagine\/Exception\/InvalidArgumentException.html"," < InvalidArgumentException","Imagine-specific invalid argument exception",1],["NotSupportedException","Imagine\\Exception","Imagine\/Exception\/NotSupportedException.html"," < RuntimeException","Should be used when a driver does not support an operation.",1],["OutOfBoundsException","Imagine\\Exception","Imagine\/Exception\/OutOfBoundsException.html"," < OutOfBoundsException","Imagine-specific out of bounds exception",1],["RuntimeException","Imagine\\Exception","Imagine\/Exception\/RuntimeException.html"," < RuntimeException","Imagine-specific runtime exception",1],["Border","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/Border.html","","A border filter",1],["Canvas","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/Canvas.html","","A canvas filter",1],["Grayscale","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/Grayscale.html"," < OnPixelBased","The Grayscale filter calculates the gray-value based",1],["OnPixelBased","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/OnPixelBased.html","","The OnPixelBased takes a callable, and for each pixel,",1],["RelativeResize","Imagine\\Filter\\Advanced","Imagine\/Filter\/Advanced\/RelativeResize.html","","The RelativeResize filter allows images to be resized",1],["ApplyMask","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/ApplyMask.html","","An apply mask filter",1],["Copy","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Copy.html","","A copy filter",1],["Crop","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Crop.html","","A crop filter",1],["Fill","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Fill.html","","A fill filter",1],["FlipHorizontally","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/FlipHorizontally.html","","A \"flip horizontally\" filter",1],["FlipVertically","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/FlipVertically.html","","A \"flip vertically\" filter",1],["Paste","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Paste.html","","A paste filter",1],["Resize","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Resize.html","","A resize filter",1],["Rotate","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Rotate.html","","A rotate filter",1],["Save","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Save.html","","A save filter",1],["Show","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Show.html","","A show filter",1],["Strip","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Strip.html","","A strip filter",1],["Thumbnail","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/Thumbnail.html","","A thumbnail filter",1],["WebOptimization","Imagine\\Filter\\Basic","Imagine\/Filter\/Basic\/WebOptimization.html","","A filter to render web-optimized images",1],["FilterInterface","Imagine\\Filter","Imagine\/Filter\/FilterInterface.html","","Interface for imagine filters",1],["ImagineAware","Imagine\\Filter","Imagine\/Filter\/ImagineAware.html","","ImagineAware base class",1],["Transformation","Imagine\\Filter","Imagine\/Filter\/Transformation.html","","A transformation filter",1],["Drawer","Imagine\\Gd","Imagine\/Gd\/Drawer.html","","Drawer implementation using the GD library",1],["Effects","Imagine\\Gd","Imagine\/Gd\/Effects.html","","Effects implementation using the GD library",1],["Font","Imagine\\Gd","Imagine\/Gd\/Font.html"," < AbstractFont","Font implementation using the GD library",1],["Image","Imagine\\Gd","Imagine\/Gd\/Image.html"," < AbstractImage","Image implementation using the GD library",1],["Imagine","Imagine\\Gd","Imagine\/Gd\/Imagine.html"," < AbstractImagine","Imagine implementation using the GD library",1],["Layers","Imagine\\Gd","Imagine\/Gd\/Layers.html"," < AbstractLayers","",1],["Drawer","Imagine\\Gmagick","Imagine\/Gmagick\/Drawer.html","","Drawer implementation using the Gmagick PHP extension",1],["Effects","Imagine\\Gmagick","Imagine\/Gmagick\/Effects.html","","Effects implementation using the Gmagick PHP extension",1],["Font","Imagine\\Gmagick","Imagine\/Gmagick\/Font.html"," < AbstractFont","Font implementation using the Gmagick PHP extension",1],["Image","Imagine\\Gmagick","Imagine\/Gmagick\/Image.html"," < AbstractImage","Image implementation using the Gmagick PHP extension",1],["Imagine","Imagine\\Gmagick","Imagine\/Gmagick\/Imagine.html"," < AbstractImagine","Imagine implementation using the Gmagick PHP extension",1],["Layers","Imagine\\Gmagick","Imagine\/Gmagick\/Layers.html"," < AbstractLayers","",1],["AbstractFont","Imagine\\Image","Imagine\/Image\/AbstractFont.html","","Abstract font base class",1],["AbstractImage","Imagine\\Image","Imagine\/Image\/AbstractImage.html","","",1],["AbstractImagine","Imagine\\Image","Imagine\/Image\/AbstractImagine.html","","",1],["AbstractLayers","Imagine\\Image","Imagine\/Image\/AbstractLayers.html","","",1],["Box","Imagine\\Image","Imagine\/Image\/Box.html","","A box implementation",1],["BoxInterface","Imagine\\Image","Imagine\/Image\/BoxInterface.html","","Interface for a box",1],["FillInterface","Imagine\\Image\\Fill","Imagine\/Image\/Fill\/FillInterface.html","","Interface for the fill",1],["Horizontal","Imagine\\Image\\Fill\\Gradient","Imagine\/Image\/Fill\/Gradient\/Horizontal.html"," < Linear","Horizontal gradient fill",1],["Linear","Imagine\\Image\\Fill\\Gradient","Imagine\/Image\/Fill\/Gradient\/Linear.html","","Linear gradient fill",1],["Vertical","Imagine\\Image\\Fill\\Gradient","Imagine\/Image\/Fill\/Gradient\/Vertical.html"," < Linear","Vertical gradient fill",1],["FontInterface","Imagine\\Image","Imagine\/Image\/FontInterface.html","","The font interface",1],["Bucket","Imagine\\Image\\Histogram","Imagine\/Image\/Histogram\/Bucket.html","","Bucket histogram",1],["Range","Imagine\\Image\\Histogram","Imagine\/Image\/Histogram\/Range.html","","Range histogram",1],["ImageInterface","Imagine\\Image","Imagine\/Image\/ImageInterface.html","","The image interface",1],["ImagineInterface","Imagine\\Image","Imagine\/Image\/ImagineInterface.html","","The imagine interface",1],["LayersInterface","Imagine\\Image","Imagine\/Image\/LayersInterface.html","","The layers interface",1],["ManipulatorInterface","Imagine\\Image","Imagine\/Image\/ManipulatorInterface.html","","The manipulator interface",1],["AbstractMetadataReader","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/AbstractMetadataReader.html","","",1],["DefaultMetadataReader","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/DefaultMetadataReader.html"," < AbstractMetadataReader","Default metadata reader",1],["ExifMetadataReader","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/ExifMetadataReader.html"," < AbstractMetadataReader","Metadata driven by Exif information",1],["MetadataBag","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/MetadataBag.html","","An interface for Image Metadata",1],["MetadataReaderInterface","Imagine\\Image\\Metadata","Imagine\/Image\/Metadata\/MetadataReaderInterface.html","","",1],["CMYK","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/CMYK.html","","",1],["ColorParser","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/ColorParser.html","","",1],["CMYK","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/CMYK.html","","",1],["ColorInterface","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/ColorInterface.html","","",1],["Gray","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/Gray.html","","",1],["RGB","Imagine\\Image\\Palette\\Color","Imagine\/Image\/Palette\/Color\/RGB.html","","",1],["Grayscale","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/Grayscale.html","","",1],["PaletteInterface","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/PaletteInterface.html","","",1],["RGB","Imagine\\Image\\Palette","Imagine\/Image\/Palette\/RGB.html","","",1],["Point","Imagine\\Image","Imagine\/Image\/Point.html","","The point class",1],["PointInterface","Imagine\\Image","Imagine\/Image\/PointInterface.html","","The point interface",1],["Center","Imagine\\Image\\Point","Imagine\/Image\/Point\/Center.html","","Point center",1],["Profile","Imagine\\Image","Imagine\/Image\/Profile.html","","",1],["ProfileInterface","Imagine\\Image","Imagine\/Image\/ProfileInterface.html","","",1],["Drawer","Imagine\\Imagick","Imagine\/Imagick\/Drawer.html","","Drawer implementation using the Imagick PHP extension",1],["Effects","Imagine\\Imagick","Imagine\/Imagick\/Effects.html","","Effects implementation using the Imagick PHP extension",1],["Font","Imagine\\Imagick","Imagine\/Imagick\/Font.html"," < AbstractFont","Font implementation using the Imagick PHP extension",1],["Image","Imagine\\Imagick","Imagine\/Imagick\/Image.html"," < AbstractImage","Image implementation using the Imagick PHP extension",1],["Imagine","Imagine\\Imagick","Imagine\/Imagick\/Imagine.html"," < AbstractImagine","Imagine implementation using the Imagick PHP extension",1],["Layers","Imagine\\Imagick","Imagine\/Imagick\/Layers.html"," < AbstractLayers","",1],["IsImageEqual","Imagine\\Test\\Constraint","Imagine\/Test\/Constraint\/IsImageEqual.html"," < PHPUnit_Framework_Constraint","",1],["ImagineTestCase","Imagine\\Test","Imagine\/Test\/ImagineTestCase.html"," < PHPUnit_Framework_TestCase","",1],["DrawerInterface::arc","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["DrawerInterface::chord","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["DrawerInterface::ellipse","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["DrawerInterface::line","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $outline, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["DrawerInterface::pieSlice","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["DrawerInterface::dot","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["DrawerInterface::polygon","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["DrawerInterface::text","Imagine\\Draw\\DrawerInterface","Imagine\/Draw\/DrawerInterface.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["EffectsInterface::gamma","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_gamma","(float $correction)","Apply gamma correction",2],["EffectsInterface::negative","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_negative","()","Invert the colors of the image",2],["EffectsInterface::grayscale","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_grayscale","()","Grayscale the image",2],["EffectsInterface::colorize","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["EffectsInterface::sharpen","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_sharpen","()","Sharpens the image",2],["EffectsInterface::blur","Imagine\\Effects\\EffectsInterface","Imagine\/Effects\/EffectsInterface.html#method_blur","(float|int $sigma)","Blur the image",2],["Border::__construct","Imagine\\Filter\\Advanced\\Border","Imagine\/Filter\/Advanced\/Border.html#method___construct","(ColorInterface<\/abbr><\/a> $color, integer $width = 1, integer $height = 1)","Constructs Border filter with given color, width and",2],["Border::apply","Imagine\\Filter\\Advanced\\Border","Imagine\/Filter\/Advanced\/Border.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Canvas::__construct","Imagine\\Filter\\Advanced\\Canvas","Imagine\/Filter\/Advanced\/Canvas.html#method___construct","(ImagineInterface<\/abbr><\/a> $imagine, BoxInterface<\/abbr><\/a> $size, PointInterface<\/abbr><\/a> $placement = null, ColorInterface<\/abbr><\/a> $background = null)","Constructs Canvas filter with given width and height",2],["Canvas::apply","Imagine\\Filter\\Advanced\\Canvas","Imagine\/Filter\/Advanced\/Canvas.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Grayscale::__construct","Imagine\\Filter\\Advanced\\Grayscale","Imagine\/Filter\/Advanced\/Grayscale.html#method___construct","()","",2],["OnPixelBased::__construct","Imagine\\Filter\\Advanced\\OnPixelBased","Imagine\/Filter\/Advanced\/OnPixelBased.html#method___construct","($callback)","",2],["OnPixelBased::apply","Imagine\\Filter\\Advanced\\OnPixelBased","Imagine\/Filter\/Advanced\/OnPixelBased.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["RelativeResize::__construct","Imagine\\Filter\\Advanced\\RelativeResize","Imagine\/Filter\/Advanced\/RelativeResize.html#method___construct","(string $method, mixed $parameter)","Constructs a RelativeResize filter with the given method",2],["RelativeResize::apply","Imagine\\Filter\\Advanced\\RelativeResize","Imagine\/Filter\/Advanced\/RelativeResize.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["ApplyMask::__construct","Imagine\\Filter\\Basic\\ApplyMask","Imagine\/Filter\/Basic\/ApplyMask.html#method___construct","(ImageInterface<\/abbr><\/a> $mask)","",2],["ApplyMask::apply","Imagine\\Filter\\Basic\\ApplyMask","Imagine\/Filter\/Basic\/ApplyMask.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Copy::apply","Imagine\\Filter\\Basic\\Copy","Imagine\/Filter\/Basic\/Copy.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Crop::__construct","Imagine\\Filter\\Basic\\Crop","Imagine\/Filter\/Basic\/Crop.html#method___construct","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Constructs a Crop filter with given x, y, coordinates",2],["Crop::apply","Imagine\\Filter\\Basic\\Crop","Imagine\/Filter\/Basic\/Crop.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Fill::__construct","Imagine\\Filter\\Basic\\Fill","Imagine\/Filter\/Basic\/Fill.html#method___construct","(FillInterface<\/abbr><\/a> $fill)","",2],["Fill::apply","Imagine\\Filter\\Basic\\Fill","Imagine\/Filter\/Basic\/Fill.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["FlipHorizontally::apply","Imagine\\Filter\\Basic\\FlipHorizontally","Imagine\/Filter\/Basic\/FlipHorizontally.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["FlipVertically::apply","Imagine\\Filter\\Basic\\FlipVertically","Imagine\/Filter\/Basic\/FlipVertically.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Paste::__construct","Imagine\\Filter\\Basic\\Paste","Imagine\/Filter\/Basic\/Paste.html#method___construct","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Constructs a Paste filter with given ImageInterface",2],["Paste::apply","Imagine\\Filter\\Basic\\Paste","Imagine\/Filter\/Basic\/Paste.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Resize::__construct","Imagine\\Filter\\Basic\\Resize","Imagine\/Filter\/Basic\/Resize.html#method___construct","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Constructs Resize filter with given width and height",2],["Resize::apply","Imagine\\Filter\\Basic\\Resize","Imagine\/Filter\/Basic\/Resize.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Rotate::__construct","Imagine\\Filter\\Basic\\Rotate","Imagine\/Filter\/Basic\/Rotate.html#method___construct","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Constructs Rotate filter with given angle and background",2],["Rotate::apply","Imagine\\Filter\\Basic\\Rotate","Imagine\/Filter\/Basic\/Rotate.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Save::__construct","Imagine\\Filter\\Basic\\Save","Imagine\/Filter\/Basic\/Save.html#method___construct","(string $path = null, array $options = array())","Constructs Save filter with given path and options",2],["Save::apply","Imagine\\Filter\\Basic\\Save","Imagine\/Filter\/Basic\/Save.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Show::__construct","Imagine\\Filter\\Basic\\Show","Imagine\/Filter\/Basic\/Show.html#method___construct","(string $format, array $options = array())","Constructs the Show filter with given format and options",2],["Show::apply","Imagine\\Filter\\Basic\\Show","Imagine\/Filter\/Basic\/Show.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Strip::apply","Imagine\\Filter\\Basic\\Strip","Imagine\/Filter\/Basic\/Strip.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Thumbnail::__construct","Imagine\\Filter\\Basic\\Thumbnail","Imagine\/Filter\/Basic\/Thumbnail.html#method___construct","(BoxInterface<\/abbr><\/a> $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Constructs the Thumbnail filter with given width, height",2],["Thumbnail::apply","Imagine\\Filter\\Basic\\Thumbnail","Imagine\/Filter\/Basic\/Thumbnail.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["WebOptimization::__construct","Imagine\\Filter\\Basic\\WebOptimization","Imagine\/Filter\/Basic\/WebOptimization.html#method___construct","($path = null, array $options = array())","",2],["WebOptimization::apply","Imagine\\Filter\\Basic\\WebOptimization","Imagine\/Filter\/Basic\/WebOptimization.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["FilterInterface::apply","Imagine\\Filter\\FilterInterface","Imagine\/Filter\/FilterInterface.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["ImagineAware::setImagine","Imagine\\Filter\\ImagineAware","Imagine\/Filter\/ImagineAware.html#method_setImagine","(ImagineInterface<\/abbr><\/a> $imagine)","Set ImagineInterface instance.",2],["ImagineAware::getImagine","Imagine\\Filter\\ImagineAware","Imagine\/Filter\/ImagineAware.html#method_getImagine","()","Get ImagineInterface instance.",2],["Transformation::__construct","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method___construct","(ImagineInterface<\/abbr><\/a> $imagine = null)","Class constructor.",2],["Transformation::applyFilter","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_applyFilter","(ImageInterface<\/abbr><\/a> $image, FilterInterface<\/abbr><\/a> $filter)","Applies a given FilterInterface onto given ImageInterface",2],["Transformation::getFilters","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_getFilters","()","Returns a list of filters sorted by their priority.",2],["Transformation::apply","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_apply","(ImageInterface<\/abbr><\/a> $image)","Applies scheduled transformation to ImageInterface",2],["Transformation::copy","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Transformation::crop","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Transformation::flipHorizontally","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Transformation::flipVertically","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_flipVertically","()","Flips current image using vertical axis",2],["Transformation::strip","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_strip","()","Remove all profiles and comments",2],["Transformation::paste","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Transformation::applyMask","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Transformation::fill","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Transformation::resize","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Transformation::rotate","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Transformation::save","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Transformation::show","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Transformation::thumbnail","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_thumbnail","(BoxInterface<\/abbr><\/a> $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Generates a thumbnail from a current image Returns",2],["Transformation::add","Imagine\\Filter\\Transformation","Imagine\/Filter\/Transformation.html#method_add","(FilterInterface<\/abbr><\/a> $filter, int $priority)","Registers a given FilterInterface in an internal array",2],["Drawer::__construct","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method___construct","(resource $resource)","Constructs Drawer with a given gd image resource",2],["Drawer::arc","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["Drawer::chord","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["Drawer::ellipse","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["Drawer::line","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["Drawer::pieSlice","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["Drawer::dot","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["Drawer::polygon","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["Drawer::text","Imagine\\Gd\\Drawer","Imagine\/Gd\/Drawer.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["Effects::__construct","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method___construct","($resource)","",2],["Effects::gamma","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_gamma","(float $correction)","Apply gamma correction",2],["Effects::negative","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_negative","()","Invert the colors of the image",2],["Effects::grayscale","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_grayscale","()","Grayscale the image",2],["Effects::colorize","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["Effects::sharpen","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_sharpen","()","Sharpens the image",2],["Effects::blur","Imagine\\Gd\\Effects","Imagine\/Gd\/Effects.html#method_blur","(float|int $sigma = 1)","Blur the image",2],["Font::box","Imagine\\Gd\\Font","Imagine\/Gd\/Font.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Image::__construct","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method___construct","(resource $resource, PaletteInterface<\/abbr><\/a> $palette, MetadataBag<\/abbr><\/a> $metadata)","Constructs a new Image instance",2],["Image::__destruct","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method___destruct","()","Makes sure the current image resource is destroyed",2],["Image::getGdResource","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_getGdResource","()","Returns Gd resource",2],["Image::copy","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Image::crop","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Image::paste","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Image::resize","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Image::rotate","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Image::save","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Image::show","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Image::get","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["Image::__toString","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method___toString","()","Returns the image content as a PNG binary string",2],["Image::flipHorizontally","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Image::flipVertically","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_flipVertically","()","Flips current image using vertical axis",2],["Image::strip","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_strip","()","Remove all profiles and comments",2],["Image::draw","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["Image::effects","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_effects","()","",2],["Image::getSize","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_getSize","()","Returns current image size",2],["Image::applyMask","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Image::fill","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Image::mask","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["Image::histogram","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["Image::getColorAt","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["Image::layers","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_layers","()","Returns the image layers when applicable.",2],["Image::interlace","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["Image::palette","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_palette","()","Return the current color palette",2],["Image::profile","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["Image::usePalette","Imagine\\Gd\\Image","Imagine\/Gd\/Image.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["Imagine::__construct","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method___construct","()","",2],["Imagine::create","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["Imagine::open","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_open","(string $path)","Opens an existing image from $path",2],["Imagine::load","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_load","(string $string)","Loads an image from a binary $string",2],["Imagine::read","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["Imagine::font","Imagine\\Gd\\Imagine","Imagine\/Gd\/Imagine.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Layers::__construct","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method___construct","(Image<\/abbr><\/a> $image, PaletteInterface<\/abbr><\/a> $palette, $resource)","",2],["Layers::merge","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_merge","()","Merge layers into the original objects",2],["Layers::coalesce","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_coalesce","()","Coalesce layers.",2],["Layers::animate","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["Layers::current","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_current","()","{@inheritdoc}",2],["Layers::key","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_key","()","{@inheritdoc}",2],["Layers::next","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_next","()","{@inheritdoc}",2],["Layers::rewind","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_rewind","()","{@inheritdoc}",2],["Layers::valid","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_valid","()","{@inheritdoc}",2],["Layers::count","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_count","()","{@inheritdoc}",2],["Layers::offsetExists","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetExists","($offset)","{@inheritdoc}",2],["Layers::offsetGet","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetGet","($offset)","{@inheritdoc}",2],["Layers::offsetSet","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetSet","($offset, $value)","{@inheritdoc}",2],["Layers::offsetUnset","Imagine\\Gd\\Layers","Imagine\/Gd\/Layers.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["Drawer::__construct","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method___construct","(Gmagick<\/abbr> $gmagick)","",2],["Drawer::arc","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["Drawer::chord","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["Drawer::ellipse","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["Drawer::line","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["Drawer::pieSlice","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["Drawer::dot","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["Drawer::polygon","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["Drawer::text","Imagine\\Gmagick\\Drawer","Imagine\/Gmagick\/Drawer.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["Effects::__construct","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method___construct","(Gmagick<\/abbr> $gmagick)","",2],["Effects::gamma","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_gamma","(float $correction)","Apply gamma correction",2],["Effects::negative","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_negative","()","Invert the colors of the image",2],["Effects::grayscale","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_grayscale","()","Grayscale the image",2],["Effects::colorize","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["Effects::sharpen","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_sharpen","()","Sharpens the image",2],["Effects::blur","Imagine\\Gmagick\\Effects","Imagine\/Gmagick\/Effects.html#method_blur","(float|int $sigma = 1)","Blur the image",2],["Font::__construct","Imagine\\Gmagick\\Font","Imagine\/Gmagick\/Font.html#method___construct","(Gmagick<\/abbr> $gmagick, string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Font::box","Imagine\\Gmagick\\Font","Imagine\/Gmagick\/Font.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Image::__construct","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method___construct","(Gmagick<\/abbr> $gmagick, PaletteInterface<\/abbr><\/a> $palette, MetadataBag<\/abbr><\/a> $metadata)","Constructs a new Image instance",2],["Image::__destruct","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method___destruct","()","Destroys allocated gmagick resources",2],["Image::getGmagick","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_getGmagick","()","Returns gmagick instance",2],["Image::copy","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Image::crop","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Image::flipHorizontally","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Image::flipVertically","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_flipVertically","()","Flips current image using vertical axis",2],["Image::strip","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_strip","()","Remove all profiles and comments",2],["Image::paste","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Image::resize","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Image::rotate","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Image::save","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Image::show","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Image::get","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["Image::__toString","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method___toString","()","Returns the image content as a PNG binary string",2],["Image::draw","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["Image::effects","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_effects","()","",2],["Image::getSize","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_getSize","()","Returns current image size",2],["Image::applyMask","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Image::mask","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["Image::fill","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Image::histogram","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["Image::getColorAt","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["Image::pixelToColor","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_pixelToColor","(GmagickPixel<\/abbr> $pixel)","Returns a color given a pixel, depending the Palette",2],["Image::layers","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_layers","()","Returns the image layers when applicable.",2],["Image::interlace","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["Image::usePalette","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["Image::palette","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_palette","()","Return the current color palette",2],["Image::profile","Imagine\\Gmagick\\Image","Imagine\/Gmagick\/Image.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["Imagine::__construct","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method___construct","()","",2],["Imagine::open","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_open","(string $path)","Opens an existing image from $path",2],["Imagine::create","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["Imagine::load","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_load","(string $string)","Loads an image from a binary $string",2],["Imagine::read","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["Imagine::font","Imagine\\Gmagick\\Imagine","Imagine\/Gmagick\/Imagine.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Layers::__construct","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method___construct","(Image<\/abbr><\/a> $image, PaletteInterface<\/abbr><\/a> $palette, Gmagick<\/abbr> $resource)","",2],["Layers::merge","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_merge","()","Merge layers into the original objects",2],["Layers::coalesce","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_coalesce","()","Coalesce layers.",2],["Layers::animate","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["Layers::current","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_current","()","{@inheritdoc}",2],["Layers::key","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_key","()","{@inheritdoc}",2],["Layers::next","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_next","()","{@inheritdoc}",2],["Layers::rewind","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_rewind","()","{@inheritdoc}",2],["Layers::valid","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_valid","()","{@inheritdoc}",2],["Layers::count","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_count","()","{@inheritdoc}",2],["Layers::offsetExists","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetExists","($offset)","{@inheritdoc}",2],["Layers::offsetGet","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetGet","($offset)","{@inheritdoc}",2],["Layers::offsetSet","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetSet","($offset, $image)","{@inheritdoc}",2],["Layers::offsetUnset","Imagine\\Gmagick\\Layers","Imagine\/Gmagick\/Layers.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["AbstractFont::__construct","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method___construct","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["AbstractFont::getFile","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method_getFile","()","Gets the fontfile for current font",2],["AbstractFont::getSize","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method_getSize","()","Gets font's integer point size",2],["AbstractFont::getColor","Imagine\\Image\\AbstractFont","Imagine\/Image\/AbstractFont.html#method_getColor","()","Gets font's color",2],["AbstractImage::thumbnail","Imagine\\Image\\AbstractImage","Imagine\/Image\/AbstractImage.html#method_thumbnail","(BoxInterface<\/abbr><\/a> $size, string $mode = ImageInterface::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Generates a thumbnail from a current image Returns",2],["AbstractImage::metadata","Imagine\\Image\\AbstractImage","Imagine\/Image\/AbstractImage.html#method_metadata","()","Returns the Image's meta data",2],["AbstractImage::__clone","Imagine\\Image\\AbstractImage","Imagine\/Image\/AbstractImage.html#method___clone","()","Assures the metadata instance will be cloned, too",2],["AbstractImagine::setMetadataReader","Imagine\\Image\\AbstractImagine","Imagine\/Image\/AbstractImagine.html#method_setMetadataReader","(MetadataReaderInterface<\/abbr><\/a> $metadataReader)","",2],["AbstractImagine::getMetadataReader","Imagine\\Image\\AbstractImagine","Imagine\/Image\/AbstractImagine.html#method_getMetadataReader","()","",2],["AbstractLayers::add","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_add","(ImageInterface<\/abbr><\/a> $image)","Adds an image at the end of the layers stack",2],["AbstractLayers::set","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_set","(integer $offset, ImageInterface<\/abbr><\/a> $image)","Set an image at offset",2],["AbstractLayers::remove","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_remove","(integer $offset)","Removes the image at offset",2],["AbstractLayers::get","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_get","(integer $offset)","Returns the image at offset",2],["AbstractLayers::has","Imagine\\Image\\AbstractLayers","Imagine\/Image\/AbstractLayers.html#method_has","(integer $offset)","Returns true if a layer at offset is preset",2],["Box::__construct","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method___construct","(integer $width, integer $height)","Constructs the Size with given width and height",2],["Box::getWidth","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_getWidth","()","Gets current image width",2],["Box::getHeight","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_getHeight","()","Gets current image height",2],["Box::scale","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_scale","(float $ratio)","Creates new BoxInterface instance with ratios applied",2],["Box::increase","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_increase","(integer $size)","Creates new BoxInterface, adding given size to both",2],["Box::contains","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_contains","(BoxInterface<\/abbr><\/a> $box, PointInterface<\/abbr><\/a> $start = null)","Checks whether current box can fit given box at a given",2],["Box::square","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_square","()","Gets current box square, useful for getting total number",2],["Box::__toString","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method___toString","()","Returns a string representation of the current box",2],["Box::widen","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_widen","(integer $width)","Resizes box to given width, constraining proportions",2],["Box::heighten","Imagine\\Image\\Box","Imagine\/Image\/Box.html#method_heighten","(integer $height)","Resizes box to given height, constraining proportions",2],["BoxInterface::getHeight","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_getHeight","()","Gets current image height",2],["BoxInterface::getWidth","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_getWidth","()","Gets current image width",2],["BoxInterface::scale","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_scale","(float $ratio)","Creates new BoxInterface instance with ratios applied",2],["BoxInterface::increase","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_increase","(integer $size)","Creates new BoxInterface, adding given size to both",2],["BoxInterface::contains","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_contains","(BoxInterface<\/abbr><\/a> $box, PointInterface<\/abbr><\/a> $start = null)","Checks whether current box can fit given box at a given",2],["BoxInterface::square","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_square","()","Gets current box square, useful for getting total number",2],["BoxInterface::__toString","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method___toString","()","Returns a string representation of the current box",2],["BoxInterface::widen","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_widen","(integer $width)","Resizes box to given width, constraining proportions",2],["BoxInterface::heighten","Imagine\\Image\\BoxInterface","Imagine\/Image\/BoxInterface.html#method_heighten","(integer $height)","Resizes box to given height, constraining proportions",2],["FillInterface::getColor","Imagine\\Image\\Fill\\FillInterface","Imagine\/Image\/Fill\/FillInterface.html#method_getColor","(PointInterface<\/abbr><\/a> $position)","Gets color of the fill for the given position",2],["Horizontal::getDistance","Imagine\\Image\\Fill\\Gradient\\Horizontal","Imagine\/Image\/Fill\/Gradient\/Horizontal.html#method_getDistance","(PointInterface<\/abbr><\/a> $position)","{@inheritdoc}",2],["Linear::__construct","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method___construct","(integer $length, ColorInterface<\/abbr><\/a> $start, ColorInterface<\/abbr><\/a> $end)","Constructs a linear gradient with overall gradient",2],["Linear::getColor","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method_getColor","(PointInterface<\/abbr><\/a> $position)","Gets color of the fill for the given position",2],["Linear::getStart","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method_getStart","()","",2],["Linear::getEnd","Imagine\\Image\\Fill\\Gradient\\Linear","Imagine\/Image\/Fill\/Gradient\/Linear.html#method_getEnd","()","",2],["Vertical::getDistance","Imagine\\Image\\Fill\\Gradient\\Vertical","Imagine\/Image\/Fill\/Gradient\/Vertical.html#method_getDistance","(PointInterface<\/abbr><\/a> $position)","{@inheritdoc}",2],["FontInterface::getFile","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_getFile","()","Gets the fontfile for current font",2],["FontInterface::getSize","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_getSize","()","Gets font's integer point size",2],["FontInterface::getColor","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_getColor","()","Gets font's color",2],["FontInterface::box","Imagine\\Image\\FontInterface","Imagine\/Image\/FontInterface.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Bucket::__construct","Imagine\\Image\\Histogram\\Bucket","Imagine\/Image\/Histogram\/Bucket.html#method___construct","(Range<\/abbr><\/a> $range, integer $count)","",2],["Bucket::add","Imagine\\Image\\Histogram\\Bucket","Imagine\/Image\/Histogram\/Bucket.html#method_add","(integer $value)","",2],["Bucket::count","Imagine\\Image\\Histogram\\Bucket","Imagine\/Image\/Histogram\/Bucket.html#method_count","()","",2],["Range::__construct","Imagine\\Image\\Histogram\\Range","Imagine\/Image\/Histogram\/Range.html#method___construct","(integer $start, integer $end)","",2],["Range::contains","Imagine\\Image\\Histogram\\Range","Imagine\/Image\/Histogram\/Range.html#method_contains","(integer $value)","",2],["ImageInterface::get","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["ImageInterface::__toString","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method___toString","()","Returns the image content as a PNG binary string",2],["ImageInterface::draw","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["ImageInterface::effects","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_effects","()","",2],["ImageInterface::getSize","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_getSize","()","Returns current image size",2],["ImageInterface::mask","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["ImageInterface::histogram","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["ImageInterface::getColorAt","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["ImageInterface::layers","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_layers","()","Returns the image layers when applicable.",2],["ImageInterface::interlace","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["ImageInterface::palette","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_palette","()","Return the current color palette",2],["ImageInterface::usePalette","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["ImageInterface::profile","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["ImageInterface::metadata","Imagine\\Image\\ImageInterface","Imagine\/Image\/ImageInterface.html#method_metadata","()","Returns the Image's meta data",2],["ImagineInterface::create","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["ImagineInterface::open","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_open","(string $path)","Opens an existing image from $path",2],["ImagineInterface::load","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_load","(string $string)","Loads an image from a binary $string",2],["ImagineInterface::read","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["ImagineInterface::font","Imagine\\Image\\ImagineInterface","Imagine\/Image\/ImagineInterface.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["LayersInterface::merge","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_merge","()","Merge layers into the original objects",2],["LayersInterface::animate","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["LayersInterface::coalesce","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_coalesce","()","Coalesce layers.",2],["LayersInterface::add","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_add","(ImageInterface<\/abbr><\/a> $image)","Adds an image at the end of the layers stack",2],["LayersInterface::set","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_set","(integer $offset, ImageInterface<\/abbr><\/a> $image)","Set an image at offset",2],["LayersInterface::remove","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_remove","(integer $offset)","Removes the image at offset",2],["LayersInterface::get","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_get","(integer $offset)","Returns the image at offset",2],["LayersInterface::has","Imagine\\Image\\LayersInterface","Imagine\/Image\/LayersInterface.html#method_has","(integer $offset)","Returns true if a layer at offset is preset",2],["ManipulatorInterface::copy","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_copy","()","Copies current source image into a new ImageInterface",2],["ManipulatorInterface::crop","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["ManipulatorInterface::resize","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["ManipulatorInterface::rotate","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["ManipulatorInterface::paste","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["ManipulatorInterface::save","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["ManipulatorInterface::show","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["ManipulatorInterface::flipHorizontally","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["ManipulatorInterface::flipVertically","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_flipVertically","()","Flips current image using vertical axis",2],["ManipulatorInterface::strip","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_strip","()","Remove all profiles and comments",2],["ManipulatorInterface::thumbnail","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_thumbnail","(BoxInterface<\/abbr><\/a> $size, string $mode = self::THUMBNAIL_INSET, string $filter = ImageInterface::FILTER_UNDEFINED)","Generates a thumbnail from a current image Returns",2],["ManipulatorInterface::applyMask","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["ManipulatorInterface::fill","Imagine\\Image\\ManipulatorInterface","Imagine\/Image\/ManipulatorInterface.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["AbstractMetadataReader::readFile","Imagine\\Image\\Metadata\\AbstractMetadataReader","Imagine\/Image\/Metadata\/AbstractMetadataReader.html#method_readFile","($file<\/abbr> $file)","Reads metadata from a file.",2],["AbstractMetadataReader::readData","Imagine\\Image\\Metadata\\AbstractMetadataReader","Imagine\/Image\/Metadata\/AbstractMetadataReader.html#method_readData","($data<\/abbr> $data)","Reads metadata from a binary string.",2],["AbstractMetadataReader::readStream","Imagine\\Image\\Metadata\\AbstractMetadataReader","Imagine\/Image\/Metadata\/AbstractMetadataReader.html#method_readStream","($resource<\/abbr> $resource)","Reads metadata from a stream.",2],["ExifMetadataReader::__construct","Imagine\\Image\\Metadata\\ExifMetadataReader","Imagine\/Image\/Metadata\/ExifMetadataReader.html#method___construct","()","",2],["MetadataBag::__construct","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method___construct","(array $data = array())","",2],["MetadataBag::getIterator","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_getIterator","()","{@inheritdoc}",2],["MetadataBag::offsetExists","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetExists","($offset)","{@inheritdoc}",2],["MetadataBag::offsetSet","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetSet","($offset, $value)","{@inheritdoc}",2],["MetadataBag::offsetUnset","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["MetadataBag::offsetGet","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_offsetGet","($offset)","{@inheritdoc}",2],["MetadataBag::toArray","Imagine\\Image\\Metadata\\MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html#method_toArray","()","Returns metadata as an array",2],["MetadataReaderInterface::readFile","Imagine\\Image\\Metadata\\MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html#method_readFile","($file<\/abbr> $file)","Reads metadata from a file.",2],["MetadataReaderInterface::readData","Imagine\\Image\\Metadata\\MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html#method_readData","($data<\/abbr> $data)","Reads metadata from a binary string.",2],["MetadataReaderInterface::readStream","Imagine\\Image\\Metadata\\MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html#method_readStream","($resource<\/abbr> $resource)","Reads metadata from a stream.",2],["CMYK::__construct","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method___construct","()","",2],["CMYK::name","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["CMYK::pixelDefinition","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["CMYK::supportsAlpha","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["CMYK::color","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["CMYK::blend","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["CMYK::useProfile","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["CMYK::profile","Imagine\\Image\\Palette\\CMYK","Imagine\/Image\/Palette\/CMYK.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["ColorParser::parseToRGB","Imagine\\Image\\Palette\\ColorParser","Imagine\/Image\/Palette\/ColorParser.html#method_parseToRGB","(string|array|integer $color)","Parses a color to a RGB tuple",2],["ColorParser::parseToCMYK","Imagine\\Image\\Palette\\ColorParser","Imagine\/Image\/Palette\/ColorParser.html#method_parseToCMYK","(string|array|integer $color)","Parses a color to a CMYK tuple",2],["ColorParser::parseToGrayscale","Imagine\\Image\\Palette\\ColorParser","Imagine\/Image\/Palette\/ColorParser.html#method_parseToGrayscale","(string|array|integer $color)","Parses a color to a grayscale value",2],["CMYK::__construct","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method___construct","(CMYK<\/abbr><\/a> $palette, array $color)","",2],["CMYK::getValue","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getValue","(string $component)","Return the value of one of the component.",2],["CMYK::getCyan","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getCyan","()","Returns Cyan value of the color",2],["CMYK::getMagenta","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getMagenta","()","Returns Magenta value of the color",2],["CMYK::getYellow","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getYellow","()","Returns Yellow value of the color",2],["CMYK::getKeyline","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getKeyline","()","Returns Key value of the color",2],["CMYK::getPalette","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getPalette","()","Returns the palette attached to the current color",2],["CMYK::getAlpha","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["CMYK::dissolve","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["CMYK::lighten","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["CMYK::darken","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["CMYK::grayscale","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_grayscale","()","Returns a gray related to the current color",2],["CMYK::isOpaque","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method_isOpaque","()","Checks if the current color is opaque",2],["CMYK::__toString","Imagine\\Image\\Palette\\Color\\CMYK","Imagine\/Image\/Palette\/Color\/CMYK.html#method___toString","()","Returns hex representation of the color",2],["ColorInterface::getValue","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_getValue","(string $component)","Return the value of one of the component.",2],["ColorInterface::getAlpha","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["ColorInterface::getPalette","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_getPalette","()","Returns the palette attached to the current color",2],["ColorInterface::dissolve","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["ColorInterface::lighten","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["ColorInterface::darken","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["ColorInterface::grayscale","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_grayscale","()","Returns a gray related to the current color",2],["ColorInterface::isOpaque","Imagine\\Image\\Palette\\Color\\ColorInterface","Imagine\/Image\/Palette\/Color\/ColorInterface.html#method_isOpaque","()","Checks if the current color is opaque",2],["Gray::__construct","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method___construct","(Grayscale<\/abbr><\/a> $palette, array $color, $alpha)","",2],["Gray::getValue","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getValue","(string $component)","Return the value of one of the component.",2],["Gray::getGray","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getGray","()","Returns Gray value of the color",2],["Gray::getPalette","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getPalette","()","Returns the palette attached to the current color",2],["Gray::getAlpha","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["Gray::dissolve","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["Gray::lighten","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["Gray::darken","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["Gray::grayscale","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_grayscale","()","Returns a gray related to the current color",2],["Gray::isOpaque","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method_isOpaque","()","Checks if the current color is opaque",2],["Gray::__toString","Imagine\\Image\\Palette\\Color\\Gray","Imagine\/Image\/Palette\/Color\/Gray.html#method___toString","()","Returns hex representation of the color",2],["RGB::__construct","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method___construct","(RGB<\/abbr><\/a> $palette, array $color, $alpha)","",2],["RGB::getValue","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getValue","(string $component)","Return the value of one of the component.",2],["RGB::getRed","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getRed","()","Returns RED value of the color",2],["RGB::getGreen","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getGreen","()","Returns GREEN value of the color",2],["RGB::getBlue","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getBlue","()","Returns BLUE value of the color",2],["RGB::getPalette","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getPalette","()","Returns the palette attached to the current color",2],["RGB::getAlpha","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_getAlpha","()","Returns percentage of transparency of the color",2],["RGB::dissolve","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_dissolve","(integer $alpha)","Returns a copy of current color, incrementing the alpha",2],["RGB::lighten","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_lighten","(integer $shade)","Returns a copy of the current color, lightened by the",2],["RGB::darken","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_darken","(integer $shade)","Returns a copy of the current color, darkened by the",2],["RGB::grayscale","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_grayscale","()","Returns a gray related to the current color",2],["RGB::isOpaque","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method_isOpaque","()","Checks if the current color is opaque",2],["RGB::__toString","Imagine\\Image\\Palette\\Color\\RGB","Imagine\/Image\/Palette\/Color\/RGB.html#method___toString","()","Returns hex representation of the color",2],["Grayscale::__construct","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method___construct","()","",2],["Grayscale::name","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["Grayscale::pixelDefinition","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["Grayscale::supportsAlpha","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["Grayscale::useProfile","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["Grayscale::profile","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["Grayscale::color","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["Grayscale::blend","Imagine\\Image\\Palette\\Grayscale","Imagine\/Image\/Palette\/Grayscale.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["PaletteInterface::color","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["PaletteInterface::blend","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["PaletteInterface::useProfile","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["PaletteInterface::profile","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["PaletteInterface::name","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["PaletteInterface::pixelDefinition","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["PaletteInterface::supportsAlpha","Imagine\\Image\\Palette\\PaletteInterface","Imagine\/Image\/Palette\/PaletteInterface.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["RGB::__construct","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method___construct","()","",2],["RGB::name","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_name","()","Returns the name of this Palette, one of PaletteInterface::PALETTE_*",2],["RGB::pixelDefinition","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_pixelDefinition","()","Returns an array containing ColorInterface::COLOR_*",2],["RGB::supportsAlpha","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_supportsAlpha","()","Tells if alpha channel is supported in this palette",2],["RGB::useProfile","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_useProfile","(ProfileInterface<\/abbr><\/a> $profile)","Attachs an ICC profile to this Palette.",2],["RGB::profile","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_profile","()","Returns the ICC profile attached to this Palette.",2],["RGB::color","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_color","(string|array|integer $color, integer|null $alpha = null)","Returns a color given some values",2],["RGB::blend","Imagine\\Image\\Palette\\RGB","Imagine\/Image\/Palette\/RGB.html#method_blend","(ColorInterface<\/abbr><\/a> $color1, ColorInterface<\/abbr><\/a> $color2, float $amount)","Blend two colors given an amount",2],["Point::__construct","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method___construct","(integer $x, integer $y)","Constructs a point of coordinates",2],["Point::getX","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_getX","()","Gets points x coordinate",2],["Point::getY","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_getY","()","Gets points y coordinate",2],["Point::in","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_in","(BoxInterface<\/abbr><\/a> $box)","Checks if current coordinate is inside a given bo",2],["Point::move","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method_move","(integer $amount)","Returns another point, moved by a given amount from",2],["Point::__toString","Imagine\\Image\\Point","Imagine\/Image\/Point.html#method___toString","()","Gets a string representation for the current point",2],["PointInterface::getX","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_getX","()","Gets points x coordinate",2],["PointInterface::getY","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_getY","()","Gets points y coordinate",2],["PointInterface::in","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_in","(BoxInterface<\/abbr><\/a> $box)","Checks if current coordinate is inside a given bo",2],["PointInterface::move","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method_move","(integer $amount)","Returns another point, moved by a given amount from",2],["PointInterface::__toString","Imagine\\Image\\PointInterface","Imagine\/Image\/PointInterface.html#method___toString","()","Gets a string representation for the current point",2],["Center::__construct","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method___construct","(BoxInterface<\/abbr><\/a> $box)","Constructs coordinate with size instance, it needs",2],["Center::getX","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_getX","()","Gets points x coordinate",2],["Center::getY","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_getY","()","Gets points y coordinate",2],["Center::in","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_in","(BoxInterface<\/abbr><\/a> $box)","Checks if current coordinate is inside a given bo",2],["Center::move","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method_move","(integer $amount)","Returns another point, moved by a given amount from",2],["Center::__toString","Imagine\\Image\\Point\\Center","Imagine\/Image\/Point\/Center.html#method___toString","()","Gets a string representation for the current point",2],["Profile::__construct","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method___construct","($name, $data)","",2],["Profile::name","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method_name","()","Returns the name of the profile",2],["Profile::data","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method_data","()","Returns the profile data",2],["Profile::fromPath","Imagine\\Image\\Profile","Imagine\/Image\/Profile.html#method_fromPath","(String $path)","Creates a profile from a path to a file",2],["ProfileInterface::name","Imagine\\Image\\ProfileInterface","Imagine\/Image\/ProfileInterface.html#method_name","()","Returns the name of the profile",2],["ProfileInterface::data","Imagine\\Image\\ProfileInterface","Imagine\/Image\/ProfileInterface.html#method_data","()","Returns the profile data",2],["Drawer::__construct","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method___construct","(Imagick<\/abbr> $imagick)","",2],["Drawer::arc","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_arc","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws an arc on a starting at a given x, y coordinates",2],["Drawer::chord","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_chord","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but also connects end points with a straight",2],["Drawer::ellipse","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_ellipse","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws and ellipse with center at the given x, y coordinates,",2],["Drawer::line","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_line","(PointInterface<\/abbr><\/a> $start, PointInterface<\/abbr><\/a> $end, ColorInterface<\/abbr><\/a> $color, integer $thickness = 1)","Draws a line from start(x, y) to end(x, y) coordinates",2],["Drawer::pieSlice","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_pieSlice","(PointInterface<\/abbr><\/a> $center, BoxInterface<\/abbr><\/a> $size, integer $start, integer $end, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Same as arc, but connects end points and the center",2],["Drawer::dot","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_dot","(PointInterface<\/abbr><\/a> $position, ColorInterface<\/abbr><\/a> $color)","Places a one pixel point at specific coordinates and",2],["Drawer::polygon","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_polygon","(array $coordinates, ColorInterface<\/abbr><\/a> $color, Boolean $fill = false, integer $thickness = 1)","Draws a polygon using array of x, y coordinates.",2],["Drawer::text","Imagine\\Imagick\\Drawer","Imagine\/Imagick\/Drawer.html#method_text","(string $string, AbstractFont<\/abbr><\/a> $font, PointInterface<\/abbr><\/a> $position, integer $angle, integer $width = null)","Annotates image with specified text at a given position",2],["Effects::__construct","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method___construct","(Imagick<\/abbr> $imagick)","",2],["Effects::gamma","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_gamma","(float $correction)","Apply gamma correction",2],["Effects::negative","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_negative","()","Invert the colors of the image",2],["Effects::grayscale","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_grayscale","()","Grayscale the image",2],["Effects::colorize","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_colorize","(ColorInterface<\/abbr><\/a> $color)","Colorize the image",2],["Effects::sharpen","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_sharpen","()","Sharpens the image",2],["Effects::blur","Imagine\\Imagick\\Effects","Imagine\/Imagick\/Effects.html#method_blur","(float|int $sigma = 1)","Blur the image",2],["Font::__construct","Imagine\\Imagick\\Font","Imagine\/Imagick\/Font.html#method___construct","(Imagick<\/abbr> $imagick, string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Font::box","Imagine\\Imagick\\Font","Imagine\/Imagick\/Font.html#method_box","(string $string, integer $angle)","Gets BoxInterface of font size on the image based on",2],["Image::__construct","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method___construct","(Imagick<\/abbr> $imagick, PaletteInterface<\/abbr><\/a> $palette, MetadataBag<\/abbr><\/a> $metadata)","Constructs a new Image instance",2],["Image::__destruct","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method___destruct","()","Destroys allocated imagick resources",2],["Image::getImagick","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_getImagick","()","Returns the underlying \\Imagick instance",2],["Image::copy","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_copy","()","Copies current source image into a new ImageInterface",2],["Image::crop","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_crop","(PointInterface<\/abbr><\/a> $start, BoxInterface<\/abbr><\/a> $size)","Crops a specified box out of the source image (modifies",2],["Image::flipHorizontally","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_flipHorizontally","()","Flips current image using horizontal axis",2],["Image::flipVertically","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_flipVertically","()","Flips current image using vertical axis",2],["Image::strip","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_strip","()","Remove all profiles and comments",2],["Image::paste","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_paste","(ImageInterface<\/abbr><\/a> $image, PointInterface<\/abbr><\/a> $start)","Pastes an image into a parent image Throws exceptions",2],["Image::resize","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_resize","(BoxInterface<\/abbr><\/a> $size, string $filter = ImageInterface::FILTER_UNDEFINED)","Resizes current image and returns self",2],["Image::rotate","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_rotate","(integer $angle, ColorInterface<\/abbr><\/a> $background = null)","Rotates an image at the given angle.",2],["Image::save","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_save","(string $path = null, array $options = array())","Saves the image at a specified path, the target file",2],["Image::show","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_show","(string $format, array $options = array())","Outputs the image content",2],["Image::get","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_get","(string $format, array $options = array())","Returns the image content as a binary string",2],["Image::interlace","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_interlace","(string $scheme)","Enables or disables interlacing",2],["Image::__toString","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method___toString","()","Returns the image content as a PNG binary string",2],["Image::draw","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_draw","()","Instantiates and returns a DrawerInterface instance",2],["Image::effects","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_effects","()","",2],["Image::getSize","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_getSize","()","Returns current image size",2],["Image::applyMask","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_applyMask","(ImageInterface<\/abbr><\/a> $mask)","Applies a given mask to current image's alpha channel",2],["Image::mask","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_mask","()","Transforms creates a grayscale mask from current image,",2],["Image::fill","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_fill","(FillInterface<\/abbr><\/a> $fill)","Fills image with provided filling, by replacing each",2],["Image::histogram","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_histogram","()","Returns array of image colors as Imagine\\Image\\Palette\\Color\\ColorInterface",2],["Image::getColorAt","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_getColorAt","(PointInterface<\/abbr><\/a> $point)","Returns color at specified positions of current image",2],["Image::pixelToColor","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_pixelToColor","(ImagickPixel<\/abbr> $pixel)","Returns a color given a pixel, depending the Palette",2],["Image::layers","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_layers","()","Returns the image layers when applicable.",2],["Image::usePalette","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_usePalette","(PaletteInterface<\/abbr><\/a> $palette)","Set a palette for the image.",2],["Image::palette","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_palette","()","Return the current color palette",2],["Image::profile","Imagine\\Imagick\\Image","Imagine\/Imagick\/Image.html#method_profile","(ProfileInterface<\/abbr><\/a> $profile)","Applies a color profile on the Image",2],["Imagine::__construct","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method___construct","()","",2],["Imagine::open","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_open","(string $path)","Opens an existing image from $path",2],["Imagine::create","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_create","(BoxInterface<\/abbr><\/a> $size, ColorInterface<\/abbr><\/a> $color = null)","Creates a new empty image with an optional background",2],["Imagine::load","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_load","(string $string)","Loads an image from a binary $string",2],["Imagine::read","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_read","(resource $resource)","Loads an image from a resource $resource",2],["Imagine::font","Imagine\\Imagick\\Imagine","Imagine\/Imagick\/Imagine.html#method_font","(string $file, integer $size, ColorInterface<\/abbr><\/a> $color)","Constructs a font with specified $file, $size and $color",2],["Layers::__construct","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method___construct","(Image<\/abbr><\/a> $image, PaletteInterface<\/abbr><\/a> $palette, Imagick<\/abbr> $resource)","",2],["Layers::merge","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_merge","()","Merge layers into the original objects",2],["Layers::animate","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_animate","(string $format, integer $delay, integer $loops)","Animates layers",2],["Layers::coalesce","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_coalesce","()","Coalesce layers.",2],["Layers::current","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_current","()","{@inheritdoc}",2],["Layers::key","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_key","()","{@inheritdoc}",2],["Layers::next","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_next","()","{@inheritdoc}",2],["Layers::rewind","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_rewind","()","{@inheritdoc}",2],["Layers::valid","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_valid","()","{@inheritdoc}",2],["Layers::count","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_count","()","{@inheritdoc}",2],["Layers::offsetExists","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetExists","($offset)","{@inheritdoc}",2],["Layers::offsetGet","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetGet","($offset)","{@inheritdoc}",2],["Layers::offsetSet","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetSet","($offset, $image)","{@inheritdoc}",2],["Layers::offsetUnset","Imagine\\Imagick\\Layers","Imagine\/Imagick\/Layers.html#method_offsetUnset","($offset)","{@inheritdoc}",2],["IsImageEqual::__construct","Imagine\\Test\\Constraint\\IsImageEqual","Imagine\/Test\/Constraint\/IsImageEqual.html#method___construct","(ImageInterface<\/abbr> $value, float $delta = 0.1, integer $buckets = 4)","",2],["IsImageEqual::evaluate","Imagine\\Test\\Constraint\\IsImageEqual","Imagine\/Test\/Constraint\/IsImageEqual.html#method_evaluate","($other)","{@inheritdoc}",2],["IsImageEqual::toString","Imagine\\Test\\Constraint\\IsImageEqual","Imagine\/Test\/Constraint\/IsImageEqual.html#method_toString","()","{@inheritdoc}",2],["ImagineTestCase::assertImageEquals","Imagine\\Test\\ImagineTestCase","Imagine\/Test\/ImagineTestCase.html#method_assertImageEquals","(ImageInterface<\/abbr> $expected, ImageInterface<\/abbr> $actual, string $message = '', float $delta = 0.1, integer $buckets = 4)","Asserts that two images are equal using color histogram",2]] } } search_data['index']['longSearchIndex'] = search_data['index']['searchIndex'] \ No newline at end of file diff --git a/vendor/imagine/imagine/docs/API/API/traits.html b/vendor/imagine/imagine/docs/API/API/traits.html new file mode 100644 index 0000000000..607dab83df --- /dev/null +++ b/vendor/imagine/imagine/docs/API/API/traits.html @@ -0,0 +1,32 @@ + + + + + + Traits | + + + +
    + + +
    + +

    Traits

    +
    +
    +
    ImageInterfaceImageInterface $expected
    ImageInterfaceImageInterface $actual The manipulator interface +
    + Imagine\Image\Metadata\AbstractMetadataReader + + +
    +
    +
    + + + diff --git a/vendor/imagine/imagine/docs/API/API/tree.js b/vendor/imagine/imagine/docs/API/API/tree.js index 13a5f39dc8..8d6a1a759d 100644 --- a/vendor/imagine/imagine/docs/API/API/tree.js +++ b/vendor/imagine/imagine/docs/API/API/tree.js @@ -59,8 +59,9 @@ var tree = [["Imagine",,"", [["Bucket","Imagine\/Image\/Histogram\/Bucket.html","", [ ]],["Range","Imagine\/Image\/Histogram\/Range.html","", [ ]] ]],["Metadata","Imagine\/Image\/Metadata.html","", - [["DefaultMetadataReader","Imagine\/Image\/Metadata\/DefaultMetadataReader.html","", - [ ]],["ExifMetadataReader","Imagine\/Image\/Metadata\/ExifMetadataReader.html","", + [["AbstractMetadataReader","Imagine\/Image\/Metadata\/AbstractMetadataReader.html","", + [ ]],["DefaultMetadataReader","Imagine\/Image\/Metadata\/DefaultMetadataReader.html"," < AbstractMetadataReader", + [ ]],["ExifMetadataReader","Imagine\/Image\/Metadata\/ExifMetadataReader.html"," < AbstractMetadataReader", [ ]],["MetadataBag","Imagine\/Image\/Metadata\/MetadataBag.html","", [ ]],["MetadataReaderInterface","Imagine\/Image\/Metadata\/MetadataReaderInterface.html","", [ ]] ]],["Palette","Imagine\/Image\/Palette.html","", diff --git a/vendor/imagine/imagine/docs/_themes/imagine/layout.html b/vendor/imagine/imagine/docs/_themes/imagine/layout.html index 06fb21bfbf..52bb83928f 100644 --- a/vendor/imagine/imagine/docs/_themes/imagine/layout.html +++ b/vendor/imagine/imagine/docs/_themes/imagine/layout.html @@ -15,7 +15,6 @@ {%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and (sidebars != []) %} {%- set url_root = pathto('', 1) %} -{# XXX necessary? #} {%- if url_root == '#' %}{% set url_root = '' %}{% endif %} {%- if not embedded and docstitle %} {%- set titlesuffix = " — "|safe + docstitle|e %} @@ -164,6 +163,9 @@
  • Introduction
  • +
  • + Metadata +
  • Coordinates
  • diff --git a/vendor/imagine/imagine/docs/usage/introduction.rst b/vendor/imagine/imagine/docs/usage/introduction.rst index 2debba578e..be79c8c9af 100644 --- a/vendor/imagine/imagine/docs/usage/introduction.rst +++ b/vendor/imagine/imagine/docs/usage/introduction.rst @@ -189,6 +189,7 @@ The following example opens a Jpg image and saves it with it with 150 dpi horizo 'resolution-units' => ImageInterface::RESOLUTION_PIXELSPERINCH, 'resolution-x' => 150, 'resolution-y' => 120, + 'resampling-filter' => ImageInterface::FILTER_LANCZOS, ); $imagine->open('/path/to/image.jpg')->save('/path/to/image.jpg', $options); diff --git a/vendor/imagine/imagine/docs/usage/metadata.rst b/vendor/imagine/imagine/docs/usage/metadata.rst new file mode 100644 index 0000000000..95e8d82dec --- /dev/null +++ b/vendor/imagine/imagine/docs/usage/metadata.rst @@ -0,0 +1,236 @@ +Metadata +======== + +Imagine 0.6 comes with an abstraction to read Image metadata. + +Access image metadata +--------------------- + +Metadata are read with a ``Imagine\Image\Metadata\MetadataReaderInterface`` and +accessible through ``Imagine\Image\ImageInterface::metadata`` method that returns +a ``Imagine\Image\Metadata\MetadataBag`` object: + +.. code-block:: php + + open('/path/to/image.jpg'); + $metadata = $image->metadata(); + + // prints '/path/to/image.jpg' + print($metadata['filename']); + + +Change the metadata reader +-------------------------- + +Imagine comes bundled with two metadata readers: ``Imagine\Image\Metadata\DefaultMetadataReader`` +and ``Imagine\Image\Metadata\ExifMetadataReader``. + +Imagine uses the default metadata reader by default. You can easily switch to +the one you want using ``Imagine\Image\ImagineInterface::setMetadataReader`` +method. + +.. code-block:: php + + setMetadataReader(new ExifMetadataReader()); + +Default Metadata Reader ++++++++++++++++++++++++ + +The default metadata reader is a basic reader that stores original information +about the resource. + +.. code-block:: php + + setMetadataReader(new DefaultMetadataReader()) + ->open('chenille.jpg'); + $metadata = $image->metadata(); + + var_dump($metadata->toArray()); + +The previous code might produce such output: + +.. code-block:: none + + array(2) { + 'filepath' => + string(60) "/Users/romainneutron/Documents/workspace/Imagine/chenille.jpg" + 'uri' => + string(12) "chenille.jpg" + } + +Exif Metadata Reader +++++++++++++++++++++ + +Exif Metadata Reader gives the same base information as the default metadata reader +and adds exif data provided by the Exif extension. + +.. note:: + + Using the exif metadata reader adds a significant overhead to image processing. + +.. code-block:: php + + setMetadataReader(new ExifMetadataReader()) + ->open('chenille.jpg'); + $metadata = $image->metadata(); + + var_dump($metadata->toArray()); + +The previous code should produce this output: + +.. code-block:: none + + array(37) { + 'filepath' => + string(60) "/Users/romainneutron/Documents/workspace/Imagine/chenille.jpg" + 'uri' => + string(12) "chenille.jpg" + 'exif.ExposureTime' => + string(5) "1/120" + 'exif.FNumber' => + string(4) "11/5" + 'exif.ExposureProgram' => + int(2) + 'exif.ISOSpeedRatings' => + int(40) + 'exif.ExifVersion' => + string(4) "0221" + 'exif.DateTimeOriginal' => + string(19) "2014:04:06 16:11:59" + 'exif.DateTimeDigitized' => + string(19) "2014:04:06 16:11:59" + 'exif.ComponentsConfiguration' => + string(4) "\000" + 'exif.ShutterSpeedValue' => + string(9) "9488/1373" + 'exif.ApertureValue' => + string(9) "7801/3429" + 'exif.BrightnessValue' => + string(8) "4457/710" + 'exif.MeteringMode' => + int(3) + 'exif.Flash' => + int(16) + 'exif.FocalLength' => + string(6) "103/25" + 'exif.ColorSpace' => + int(1) + 'exif.ExifImageWidth' => + int(2048) + 'exif.ExifImageLength' => + int(1536) + 'exif.SensingMethod' => + int(2) + 'exif.ExposureMode' => + int(0) + 'exif.WhiteBalance' => + int(0) + 'exif.FocalLengthIn35mmFilm' => + int(30) + 'exif.SceneCaptureType' => + int(0) + 'exif.UndefinedTag:0xA433' => + string(5) "Apple" + 'exif.UndefinedTag:0xA434' => + string(34) "iPhone 5s back camera 4.12mm f/2.2" + 'ifd0.Make' => + string(5) "Apple" + 'ifd0.Model' => + string(9) "iPhone 5s" + 'ifd0.XResolution' => + string(4) "72/1" + 'ifd0.YResolution' => + string(4) "72/1" + 'ifd0.ResolutionUnit' => + int(2) + 'ifd0.Software' => + string(5) "7.0.4" + 'ifd0.DateTime' => + string(19) "2014:04:06 16:11:59" + 'ifd0.YCbCrPositioning' => + int(1) + 'ifd0.Exif_IFD_Pointer' => + int(192) + 'ifd0.GPS_IFD_Pointer' => + int(1486) + } + +Create your own metadata reader +------------------------------- + +Any metadata reader must implement ``Imagine\Image\Metadata\MetadataReaderInterface``. +However it's easier to extend ``Imagine\Image\Metadata\AbstractMetadataReader`` +to avoid missing things and focus on the purpose of the reader. + +Here's an example of a metadata reader that retrieves posix access information from +a file: + +.. code-block:: php + + posix_access($file), + ); + } + + /** + * {@inheritdoc} + */ + protected function extractFromData($data); + { + // posix informations about raw data in non-sense + return array(); + } + + /** + * {@inheritdoc} + */ + protected function extractFromStream($resource) + { + if (!stream_is_local($file)) { + return array(); + } + + if (false !== $data = @stream_get_meta_data($resource)) { + return array( + 'access' => posix_access($data['uri']), + ); + } + + return array(); + } + } + diff --git a/vendor/imagine/imagine/lib/Imagine/Filter/Advanced/OnPixelBased.php b/vendor/imagine/imagine/lib/Imagine/Filter/Advanced/OnPixelBased.php index 1bd23341d6..ef297eaf6b 100644 --- a/vendor/imagine/imagine/lib/Imagine/Filter/Advanced/OnPixelBased.php +++ b/vendor/imagine/imagine/lib/Imagine/Filter/Advanced/OnPixelBased.php @@ -43,8 +43,11 @@ class OnPixelBased implements FilterInterface */ public function apply(ImageInterface $image) { - for ($x = 0; $x < $image->getSize()->getWidth(); $x++) { - for ($y = 0; $y < $image->getSize()->getHeight(); $y++) { + $w = $image->getSize()->getWidth(); + $h = $image->getSize()->getHeight(); + + for ($x = 0; $x < $w; $x++) { + for ($y = 0; $y < $h; $y++) { call_user_func($this->callback, $image, new Point($x, $y)); } } diff --git a/vendor/imagine/imagine/lib/Imagine/Filter/Basic/Autorotate.php b/vendor/imagine/imagine/lib/Imagine/Filter/Basic/Autorotate.php new file mode 100644 index 0000000000..9c4a317115 --- /dev/null +++ b/vendor/imagine/imagine/lib/Imagine/Filter/Basic/Autorotate.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Rotates an image automatically based on exif information. + * + * Your attention please: This filter requires the use of the + * ExifMetadataReader to work. + * + * @see https://imagine.readthedocs.org/en/latest/usage/metadata.html + */ +class Autorotate implements FilterInterface +{ + private $color; + + /** + * @param string|array|ColorInterface $color A color + */ + public function __construct($color = '000000') + { + $this->color = $color; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + $metadata = $image->metadata(); + + switch (isset($metadata['ifd0.Orientation']) ? $metadata['ifd0.Orientation'] : null) { + case 3: + $image->rotate(180, $this->getColor($image)); + break; + case 6: + $image->rotate(90, $this->getColor($image)); + break; + case 8: + $image->rotate(-90, $this->getColor($image)); + break; + default: + break; + } + + return $image; + } + + private function getColor(ImageInterface $image) + { + if ($this->color instanceof ColorInterface) { + return $this->color; + } + + return $image->palette()->color($this->color); + } +} diff --git a/vendor/imagine/imagine/lib/Imagine/Filter/Transformation.php b/vendor/imagine/imagine/lib/Imagine/Filter/Transformation.php index eeb07e1117..6e77e7430d 100644 --- a/vendor/imagine/imagine/lib/Imagine/Filter/Transformation.php +++ b/vendor/imagine/imagine/lib/Imagine/Filter/Transformation.php @@ -79,10 +79,7 @@ final class Transformation implements FilterInterface, ManipulatorInterface { if ($filter instanceof ImagineAware) { if ($this->imagine === null) { - throw new InvalidArgumentException(sprintf( - 'In order to use %s pass an Imagine\Image\ImagineInterface instance '. - 'to Transformation constructor', get_class($filter) - )); + throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to Transformation constructor', get_class($filter))); } $filter->setImagine($this->imagine); } diff --git a/vendor/imagine/imagine/lib/Imagine/Gd/Drawer.php b/vendor/imagine/imagine/lib/Imagine/Gd/Drawer.php index c092192eb5..e5d74e0d94 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gd/Drawer.php +++ b/vendor/imagine/imagine/lib/Imagine/Gd/Drawer.php @@ -57,11 +57,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Draw arc operation failed'); } - if (false === imagearc( - $this->resource, $center->getX(), $center->getY(), - $size->getWidth(), $size->getHeight(), $start, $end, - $this->getColor($color) - )) { + if (false === imagearc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw arc operation failed'); } @@ -74,13 +70,14 @@ final class Drawer implements DrawerInterface } /** - * This function doesn't work properly because of a bug in GD + * This function does not work properly because of a bug in GD * * {@inheritdoc} */ public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); + if ($fill) { $style = IMG_ARC_CHORD; } else { @@ -91,11 +88,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Draw chord operation failed'); } - if (false === imagefilledarc( - $this->resource, $center->getX(), $center->getY(), - $size->getWidth(), $size->getHeight(), $start, $end, - $this->getColor($color), $style - )) { + if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { imagealphablending($this->resource, false); throw new RuntimeException('Draw chord operation failed'); } @@ -113,6 +106,7 @@ final class Drawer implements DrawerInterface public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); + if ($fill) { $callback = 'imagefilledellipse'; } else { @@ -123,10 +117,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Draw ellipse operation failed'); } - if (false === $callback( - $this->resource, $center->getX(), $center->getY(), - $size->getWidth(), $size->getHeight(), $this->getColor($color)) - ) { + if (false === $callback($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw ellipse operation failed'); } @@ -149,10 +140,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Draw line operation failed'); } - if (false === imageline( - $this->resource, $start->getX(), $start->getY(), - $end->getX(), $end->getY(), $this->getColor($color) - )) { + if (false === imageline($this->resource, $start->getX(), $start->getY(), $end->getX(), $end->getY(), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw line operation failed'); } @@ -170,6 +158,7 @@ final class Drawer implements DrawerInterface public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); + if ($fill) { $style = IMG_ARC_EDGED; } else { @@ -180,11 +169,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Draw chord operation failed'); } - if (false === imagefilledarc( - $this->resource, $center->getX(), $center->getY(), - $size->getWidth(), $size->getHeight(), $start, $end, - $this->getColor($color), $style - )) { + if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { imagealphablending($this->resource, false); throw new RuntimeException('Draw chord operation failed'); } @@ -205,10 +190,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Draw point operation failed'); } - if (false === imagesetpixel( - $this->resource, $position->getX(), $position->getY(), - $this->getColor($color) - )) { + if (false === imagesetpixel($this->resource, $position->getX(), $position->getY(), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw point operation failed'); } @@ -226,11 +208,9 @@ final class Drawer implements DrawerInterface public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); + if (count($coordinates) < 3) { - throw new InvalidArgumentException(sprintf( - 'A polygon must consist of at least 3 points, %d given', - count($coordinates) - )); + throw new InvalidArgumentException(sprintf('A polygon must consist of at least 3 points, %d given', count($coordinates))); } $points = call_user_func_array('array_merge', array_map(function (PointInterface $p) { @@ -282,10 +262,7 @@ final class Drawer implements DrawerInterface throw new RuntimeException('Font mask operation failed'); } - if (false === imagefttext( - $this->resource, $fontsize, $angle, $x, $y, - $this->getColor($font->getColor()), $fontfile, $string - )) { + if (false === imagefttext($this->resource, $fontsize, $angle, $x, $y, $this->getColor($font->getColor()), $fontfile, $string)) { imagealphablending($this->resource, false); throw new RuntimeException('Font mask operation failed'); } @@ -307,26 +284,17 @@ final class Drawer implements DrawerInterface * @return resource * * @throws RuntimeException + * @throws InvalidArgumentException */ private function getColor(ColorInterface $color) { if (!$color instanceof RGBColor) { - throw new InvalidArgumentException( - 'GD driver only supports RGB colors' - ); + throw new InvalidArgumentException('GD driver only supports RGB colors'); } - $gdColor = imagecolorallocatealpha( - $this->resource, - $color->getRed(), $color->getGreen(), $color->getBlue(), - round(127 * $color->getAlpha() / 100) - ); + $gdColor = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), (100 - $color->getAlpha()) * 127 / 100); if (false === $gdColor) { - throw new RuntimeException(sprintf( - 'Unable to allocate color "RGB(%s, %s, %s)" with '. - 'transparency of %d percent', $color->getRed(), - $color->getGreen(), $color->getBlue(), $color->getAlpha() - )); + throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); } return $gdColor; diff --git a/vendor/imagine/imagine/lib/Imagine/Gd/Effects.php b/vendor/imagine/imagine/lib/Imagine/Gd/Effects.php index 9d46307bb0..d86c4f8a27 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gd/Effects.php +++ b/vendor/imagine/imagine/lib/Imagine/Gd/Effects.php @@ -70,9 +70,7 @@ class Effects implements EffectsInterface public function colorize(ColorInterface $color) { if (!$color instanceof RGBColor) { - throw new RuntimeException( - 'Colorize effects only accepts RGB color in GD context' - ); + throw new RuntimeException('Colorize effects only accepts RGB color in GD context'); } if (false === imagefilter($this->resource, IMG_FILTER_COLORIZE, $color->getRed(), $color->getGreen(), $color->getBlue())) { diff --git a/vendor/imagine/imagine/lib/Imagine/Gd/Image.php b/vendor/imagine/imagine/lib/Imagine/Gd/Image.php index 11b80b0deb..848fe4e833 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gd/Image.php +++ b/vendor/imagine/imagine/lib/Imagine/Gd/Image.php @@ -44,7 +44,6 @@ final class Image extends AbstractImage private $layers; /** - * * @var PaletteInterface */ private $palette; @@ -89,11 +88,9 @@ final class Image extends AbstractImage final public function copy() { $size = $this->getSize(); - $copy = $this->createImage($size, 'copy'); - if (false === imagecopy($copy, $this->resource, 0, 0, 0, - 0, $size->getWidth(), $size->getHeight())) { + if (false === imagecopy($copy, $this->resource, 0, 0, 0, 0, $size->getWidth(), $size->getHeight())) { throw new RuntimeException('Image copy operation failed'); } @@ -106,11 +103,7 @@ final class Image extends AbstractImage final public function crop(PointInterface $start, BoxInterface $size) { if (!$start->in($this->getSize())) { - throw new OutOfBoundsException( - 'Crop coordinates must start at minimum 0, 0 position from '. - 'top left corner, crop height and width must be positive '. - 'integers and must not exceed the current image borders' - ); + throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); } $width = $size->getWidth(); @@ -118,8 +111,7 @@ final class Image extends AbstractImage $dest = $this->createImage($size, 'crop'); - if (false === imagecopy($dest, $this->resource, 0, 0, - $start->getX(), $start->getY(), $width, $height)) { + if (false === imagecopy($dest, $this->resource, 0, 0, $start->getX(), $start->getY(), $width, $height)) { throw new RuntimeException('Image crop operation failed'); } @@ -136,25 +128,18 @@ final class Image extends AbstractImage final public function paste(ImageInterface $image, PointInterface $start) { if (!$image instanceof self) { - throw new InvalidArgumentException(sprintf( - 'Gd\Image can only paste() Gd\Image instances, %s given', - get_class($image) - )); + throw new InvalidArgumentException(sprintf('Gd\Image can only paste() Gd\Image instances, %s given', get_class($image))); } $size = $image->getSize(); if (!$this->getSize()->contains($size, $start)) { - throw new OutOfBoundsException( - 'Cannot paste image of the given size at the specified '. - 'position, as it moves outside of the current image\'s box' - ); + throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); } imagealphablending($this->resource, true); imagealphablending($image->resource, true); - if (false === imagecopy($this->resource, $image->resource, $start->getX(), $start->getY(), - 0, 0, $size->getWidth(), $size->getHeight())) { + if (false === imagecopy($this->resource, $image->resource, $start->getX(), $start->getY(), 0, 0, $size->getWidth(), $size->getHeight())) { throw new RuntimeException('Image paste operation failed'); } @@ -181,9 +166,7 @@ final class Image extends AbstractImage imagealphablending($this->resource, true); imagealphablending($dest, true); - if (false === imagecopyresampled($dest, $this->resource, 0, 0, 0, 0, - $width, $height, imagesx($this->resource), imagesy($this->resource) - )) { + if (false === imagecopyresampled($dest, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource))) { throw new RuntimeException('Image resize operation failed'); } @@ -203,7 +186,6 @@ final class Image extends AbstractImage final public function rotate($angle, ColorInterface $background = null) { $color = $background ? $background : $this->palette->color('fff'); - $resource = imagerotate($this->resource, -1 * $angle, $this->getColor($color)); if (false === $resource) { @@ -211,7 +193,6 @@ final class Image extends AbstractImage } imagedestroy($this->resource); - $this->resource = $resource; return $this; @@ -225,9 +206,7 @@ final class Image extends AbstractImage $path = null === $path ? (isset($this->metadata['filepath']) ? $this->metadata['filepath'] : $path) : $path; if (null === $path) { - throw new RuntimeException( - 'You can omit save path only if image has been open from a file' - ); + throw new RuntimeException('You can omit save path only if image has been open from a file'); } if (isset($options['format'])) { @@ -286,8 +265,7 @@ final class Image extends AbstractImage $dest = $this->createImage($size, 'flip'); for ($i = 0; $i < $width; $i++) { - if (false === imagecopy($dest, $this->resource, $i, 0, - ($width - 1) - $i, 0, 1, $height)) { + if (false === imagecopy($dest, $this->resource, $i, 0, ($width - 1) - $i, 0, 1, $height)) { throw new RuntimeException('Horizontal flip operation failed'); } } @@ -310,8 +288,7 @@ final class Image extends AbstractImage $dest = $this->createImage($size, 'flip'); for ($i = 0; $i < $height; $i++) { - if (false === imagecopy($dest, $this->resource, 0, $i, - 0, ($height - 1) - $i, $width, 1)) { + if (false === imagecopy($dest, $this->resource, 0, $i, 0, ($height - 1) - $i, $width, 1)) { throw new RuntimeException('Vertical flip operation failed'); } } @@ -328,10 +305,7 @@ final class Image extends AbstractImage */ final public function strip() { - /** - * GD strips profiles and comment, so there's nothing to do here - */ - + // GD strips profiles and comment, so there's nothing to do here return $this; } @@ -372,11 +346,7 @@ final class Image extends AbstractImage $maskSize = $mask->getSize(); if ($size != $maskSize) { - throw new InvalidArgumentException(sprintf( - 'The given mask doesn\'t match current image\'s size, Current '. - 'mask\'s dimensions are %s, while image\'s dimensions are %s', - $maskSize, $size - )); + throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); } for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { @@ -384,14 +354,9 @@ final class Image extends AbstractImage $position = new Point($x, $y); $color = $this->getColorAt($position); $maskColor = $mask->getColorAt($position); - $round = (int) round(max($color->getAlpha(), (100 - $color->getAlpha()) * $maskColor->getRed() / 255)); - if (false === imagesetpixel( - $this->resource, - $x, $y, - $this->getColor($color->dissolve($round - $color->getAlpha())) - )) { + if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($color->dissolve($round - $color->getAlpha())))) { throw new RuntimeException('Apply mask operation failed'); } } @@ -409,11 +374,7 @@ final class Image extends AbstractImage for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { - if (false === imagesetpixel( - $this->resource, - $x, $y, - $this->getColor($fill->getColor(new Point($x, $y)))) - ) { + if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($fill->getColor(new Point($x, $y))))) { throw new RuntimeException('Fill operation failed'); } } @@ -459,21 +420,13 @@ final class Image extends AbstractImage public function getColorAt(PointInterface $point) { if (!$point->in($this->getSize())) { - throw new RuntimeException(sprintf( - 'Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', - $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight() - )); + throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); } + $index = imagecolorat($this->resource, $point->getX(), $point->getY()); $info = imagecolorsforindex($this->resource, $index); - return $this->palette->color(array( - $info['red'], - $info['green'], - $info['blue'], - ), - (int) round($info['alpha'] / 127 * 100) - ); + return $this->palette->color(array($info['red'], $info['green'], $info['blue']), max(min(100 - (int) round($info['alpha'] / 127 * 100), 100), 0)); } /** @@ -556,11 +509,7 @@ final class Image extends AbstractImage $format = $this->normalizeFormat($format); if (!$this->supported($format)) { - throw new InvalidArgumentException(sprintf( - 'Saving image in "%s" format is not supported, please use one '. - 'of the following extensions: "%s"', $format, - implode('", "', $this->supported()) - )); + throw new InvalidArgumentException(sprintf('Saving image in "%s" format is not supported, please use one of the following extensions: "%s"', $format, implode('", "', $this->supported()))); } $save = 'image'.$format; @@ -598,8 +547,7 @@ final class Image extends AbstractImage } } - if (($format === 'wbmp' || $format === 'xbm') && - isset($options['foreground'])) { + if (($format === 'wbmp' || $format === 'xbm') && isset($options['foreground'])) { $args[] = $options['foreground']; } @@ -633,8 +581,7 @@ final class Image extends AbstractImage throw new RuntimeException('Image '.$operation.' failed'); } - if (false === imagealphablending($resource, false) || - false === imagesavealpha($resource, true)) { + if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { throw new RuntimeException('Image '.$operation.' failed'); } @@ -654,31 +601,23 @@ final class Image extends AbstractImage * * Generates a GD color from Color instance * - * @param Color $color + * @param ColorInterface $color * - * @return resource + * @return integer A color identifier * * @throws RuntimeException + * @throws InvalidArgumentException */ private function getColor(ColorInterface $color) { if (!$color instanceof RGBColor) { - throw new InvalidArgumentException( - 'GD driver only supports RGB colors' - ); + throw new InvalidArgumentException('GD driver only supports RGB colors'); } - $index = imagecolorallocatealpha( - $this->resource, $color->getRed(), $color->getGreen(), - $color->getBlue(), round(127 * $color->getAlpha() / 100) - ); + $index = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * $color->getAlpha() / 100)); if (false === $index) { - throw new RuntimeException(sprintf( - 'Unable to allocate color "RGB(%s, %s, %s)" with transparency '. - 'of %d percent', $color->getRed(), $color->getGreen(), - $color->getBlue(), $color->getAlpha() - )); + throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); } return $index; @@ -727,15 +666,11 @@ final class Image extends AbstractImage private function setExceptionHandler() { set_error_handler(function ($errno, $errstr, $errfile, $errline) { - if (0 === error_reporting()) { return; } - throw new RuntimeException( - $errstr, $errno, - new \ErrorException($errstr, 0, $errno, $errfile, $errline) - ); + throw new RuntimeException($errstr, $errno, new \ErrorException($errstr, 0, $errno, $errfile, $errline)); }, E_WARNING | E_NOTICE); } diff --git a/vendor/imagine/imagine/lib/Imagine/Gd/Imagine.php b/vendor/imagine/imagine/lib/Imagine/Gd/Imagine.php index e1c5fbcff9..f9edbe6361 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gd/Imagine.php +++ b/vendor/imagine/imagine/lib/Imagine/Gd/Imagine.php @@ -40,22 +40,6 @@ final class Imagine extends AbstractImagine $this->requireGdVersion('2.0.1'); } - private function loadGdInfo() - { - if (!function_exists('gd_info')) { - throw new RuntimeException('Gd not installed'); - } - - $this->info = gd_info(); - } - - private function requireGdVersion($version) - { - if (version_compare(GD_VERSION, $version, '<')) { - throw new RuntimeException(sprintf('GD2 version %s or higher is required', $version)); - } - } - /** * {@inheritdoc} */ @@ -74,15 +58,10 @@ final class Imagine extends AbstractImagine $color = $color ? $color : $palette->color('fff'); if (!$color instanceof RGBColor) { - throw new InvalidArgumentException( - 'GD driver only supports RGB colors' - ); + throw new InvalidArgumentException('GD driver only supports RGB colors'); } - $index = imagecolorallocatealpha( - $resource, $color->getRed(), $color->getGreen(), $color->getBlue(), - round(127 * $color->getAlpha() / 100) - ); + $index = imagecolorallocatealpha($resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * $color->getAlpha() / 100)); if (false === $index) { throw new RuntimeException('Unable to allocate color'); @@ -107,9 +86,7 @@ final class Imagine extends AbstractImagine $data = @file_get_contents($path); if (false === $data) { - throw new InvalidArgumentException(sprintf( - 'File %s doesn\'t exist', $path - )); + throw new InvalidArgumentException(sprintf('File %s doesn\'t exist', $path)); } $resource = @imagecreatefromstring($data); @@ -126,13 +103,7 @@ final class Imagine extends AbstractImagine */ public function load($string) { - $resource = @imagecreatefromstring($string); - - if (!is_resource($resource)) { - throw new InvalidArgumentException('An image could not be created from the given input'); - } - - return $this->wrap($resource, new RGB(), $this->getMetadataReader()->readData($string)); + return $this->doLoad($string, $this->getMetadataReader()->readData($string)); } /** @@ -150,7 +121,7 @@ final class Imagine extends AbstractImagine throw new InvalidArgumentException('Cannot read resource content'); } - return $this->load($content); + return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); } /** @@ -183,11 +154,8 @@ final class Imagine extends AbstractImagine $resource = $truecolor; } - if (false === imagealphablending($resource, false) || - false === imagesavealpha($resource, true)) { - throw new RuntimeException( - 'Could not set alphablending, savealpha and antialias values' - ); + if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { + throw new RuntimeException('Could not set alphablending, savealpha and antialias values'); } if (function_exists('imageantialias')) { @@ -196,4 +164,31 @@ final class Imagine extends AbstractImagine return new Image($resource, $palette, $metadata); } + + private function loadGdInfo() + { + if (!function_exists('gd_info')) { + throw new RuntimeException('Gd not installed'); + } + + $this->info = gd_info(); + } + + private function requireGdVersion($version) + { + if (version_compare(GD_VERSION, $version, '<')) { + throw new RuntimeException(sprintf('GD2 version %s or higher is required', $version)); + } + } + + private function doLoad($string, MetadataBag $metadata) + { + $resource = @imagecreatefromstring($string); + + if (!is_resource($resource)) { + throw new InvalidArgumentException('An image could not be created from the given input'); + } + + return $this->wrap($resource, new RGB(), $metadata); + } } diff --git a/vendor/imagine/imagine/lib/Imagine/Gmagick/Drawer.php b/vendor/imagine/imagine/lib/Imagine/Gmagick/Drawer.php index 544978f805..de6cc90485 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gmagick/Drawer.php +++ b/vendor/imagine/imagine/lib/Imagine/Gmagick/Drawer.php @@ -13,6 +13,7 @@ namespace Imagine\Gmagick; use Imagine\Draw\DrawerInterface; use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\NotSupportedException; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractFont; use Imagine\Image\BoxInterface; @@ -70,9 +71,7 @@ final class Drawer implements DrawerInterface $arc = null; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw arc operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); } return $this; @@ -116,9 +115,7 @@ final class Drawer implements DrawerInterface $chord = null; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw chord operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); } return $this; @@ -159,9 +156,7 @@ final class Drawer implements DrawerInterface $ellipse = null; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw ellipse operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); } return $this; @@ -192,9 +187,7 @@ final class Drawer implements DrawerInterface $line = null; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw line operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); } return $this; @@ -252,12 +245,9 @@ final class Drawer implements DrawerInterface $this->gmagick->drawimage($point); $pixel = null; - $point = null; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw point operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); } return $this; @@ -269,10 +259,7 @@ final class Drawer implements DrawerInterface public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) { if (count($coordinates) < 3) { - throw new InvalidArgumentException(sprintf( - 'Polygon must consist of at least 3 coordinates, %d given', - count($coordinates) - )); + throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); } $points = array_map(function (PointInterface $p) { @@ -298,9 +285,7 @@ final class Drawer implements DrawerInterface unset($pixel, $polygon); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw polygon operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); } return $this; @@ -338,19 +323,14 @@ final class Drawer implements DrawerInterface $ydiff = 0 - min($y1, $y2); if ($width !== null) { - throw new RuntimeException('Gmagick doesn\'t support queryfontmetrics function for multiline text', 1); + throw new NotSupportedException('Gmagick doesn\'t support queryfontmetrics function for multiline text', 1); } - $this->gmagick->annotateimage( - $text, $position->getX() + $x1 + $xdiff, - $position->getY() + $y2 + $ydiff, $angle, $string - ); + $this->gmagick->annotateimage($text, $position->getX() + $x1 + $xdiff, $position->getY() + $y2 + $ydiff, $angle, $string); unset($pixel, $text); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Draw text operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); } return $this; @@ -361,7 +341,9 @@ final class Drawer implements DrawerInterface * * @param ColorInterface $color * - * @return string + * @return \GmagickPixel + * + * @throws InvalidArgumentException In case a non-opaque color is passed */ private function getColor(ColorInterface $color) { @@ -369,14 +351,6 @@ final class Drawer implements DrawerInterface throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); } - $pixel = new \GmagickPixel((string) $color); - - $pixel->setColorValue( - \Gmagick::COLOR_OPACITY, - number_format(abs(round($color->getAlpha() / 100, 1)), 1) - ); - - return $pixel; + return new \GmagickPixel((string) $color); } - } diff --git a/vendor/imagine/imagine/lib/Imagine/Gmagick/Effects.php b/vendor/imagine/imagine/lib/Imagine/Gmagick/Effects.php index d1be606ffb..3f9c5cd08d 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gmagick/Effects.php +++ b/vendor/imagine/imagine/lib/Imagine/Gmagick/Effects.php @@ -48,8 +48,7 @@ class Effects implements EffectsInterface public function negative() { if (!method_exists($this->gmagick, 'negateimage')) { - throw new NotSupportedException('Gmagick version 1.1.0 RC3 is required' - . ' for negative effect'); + throw new NotSupportedException('Gmagick version 1.1.0 RC3 is required for negative effect'); } try { diff --git a/vendor/imagine/imagine/lib/Imagine/Gmagick/Image.php b/vendor/imagine/imagine/lib/Imagine/Gmagick/Image.php index f4382f630a..569a078bad 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gmagick/Image.php +++ b/vendor/imagine/imagine/lib/Imagine/Gmagick/Image.php @@ -100,24 +100,13 @@ final class Image extends AbstractImage public function crop(PointInterface $start, BoxInterface $size) { if (!$start->in($this->getSize())) { - throw new OutOfBoundsException( - 'Crop coordinates must start at minimum 0, 0 position from '. - 'top left corner, crop height and width must be positive '. - 'integers and must not exceed the current image borders' - ); + throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); } try { - $this->gmagick->cropimage( - $size->getWidth(), - $size->getHeight(), - $start->getX(), - $start->getY() - ); + $this->gmagick->cropimage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Crop operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Crop operation failed', $e->getCode(), $e); } return $this; @@ -131,9 +120,7 @@ final class Image extends AbstractImage try { $this->gmagick->flopimage(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Horizontal flip operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Horizontal flip operation failed', $e->getCode(), $e); } return $this; @@ -147,9 +134,7 @@ final class Image extends AbstractImage try { $this->gmagick->flipimage(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Vertical flip operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); } return $this; @@ -164,9 +149,7 @@ final class Image extends AbstractImage $this->profile($this->palette->profile()); $this->gmagick->stripimage(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Strip operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Strip operation failed', $e->getCode(), $e); } return $this; @@ -178,30 +161,17 @@ final class Image extends AbstractImage public function paste(ImageInterface $image, PointInterface $start) { if (!$image instanceof self) { - throw new InvalidArgumentException(sprintf( - 'Gmagick\Image can only paste() Gmagick\Image instances, '. - '%s given', get_class($image) - )); + throw new InvalidArgumentException(sprintf('Gmagick\Image can only paste() Gmagick\Image instances, %s given', get_class($image))); } if (!$this->getSize()->contains($image->getSize(), $start)) { - throw new OutOfBoundsException( - 'Cannot paste image of the given size at the specified '. - 'position, as it moves outside of the current image\'s box' - ); + throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); } try { - $this->gmagick->compositeimage( - $image->gmagick, - \Gmagick::COMPOSITE_DEFAULT, - $start->getX(), - $start->getY() - ); + $this->gmagick->compositeimage($image->gmagick, \Gmagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Paste operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Paste operation failed', $e->getCode(), $e); } return $this; @@ -236,16 +206,9 @@ final class Image extends AbstractImage } try { - $this->gmagick->resizeimage( - $size->getWidth(), - $size->getHeight(), - $supportedFilters[$filter], - 1 - ); + $this->gmagick->resizeimage($size->getWidth(), $size->getHeight(), $supportedFilters[$filter], 1); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Resize operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Resize operation failed', $e->getCode(), $e); } return $this; @@ -264,9 +227,7 @@ final class Image extends AbstractImage unset($pixel); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Rotate operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); } return $this; @@ -280,6 +241,8 @@ final class Image extends AbstractImage * @param \Gmagick $image * @param array $options * @param string $path + * + * @throws InvalidArgumentException */ private function applyImageOptions(\Gmagick $image, array $options, $path) { @@ -323,9 +286,7 @@ final class Image extends AbstractImage $image->setCompressionQuality($compression); } - if (isset($options['resolution-units']) && isset($options['resolution-x']) - && isset($options['resolution-y'])) { - + if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERCENTIMETER); } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { @@ -346,9 +307,7 @@ final class Image extends AbstractImage $path = null === $path ? $this->gmagick->getImageFilename() : $path; if ('' === trim($path)) { - throw new RuntimeException( - 'You can omit save path only if image has been open from a file' - ); + throw new RuntimeException('You can omit save path only if image has been open from a file'); } try { @@ -356,9 +315,7 @@ final class Image extends AbstractImage $allFrames = !isset($options['animated']) || false === $options['animated']; $this->gmagick->writeimage($path, $allFrames); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Save operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Save operation failed', $e->getCode(), $e); } return $this; @@ -384,9 +341,7 @@ final class Image extends AbstractImage $options['format'] = $format; $this->prepareOutput($options); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Get operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Get operation failed', $e->getCode(), $e); } return $this->gmagick->getimagesblob(); @@ -403,7 +358,6 @@ final class Image extends AbstractImage } if (isset($options['animated']) && true === $options['animated']) { - $format = isset($options['format']) ? $options['format'] : 'gif'; $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; @@ -417,8 +371,7 @@ final class Image extends AbstractImage $this->applyImageOptions($this->gmagick, $options, $path); // flatten only if image has multiple layers - if ((!isset($options['flatten']) || $options['flatten'] === true) - && count($this->layers) > 1) { + if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { $this->flatten(); } } @@ -456,9 +409,7 @@ final class Image extends AbstractImage $width = $this->gmagick->getimagewidth(); $height = $this->gmagick->getimageheight(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Get size operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Get size operation failed', $e->getCode(), $e); } return new Box($width, $height); @@ -470,34 +421,21 @@ final class Image extends AbstractImage public function applyMask(ImageInterface $mask) { if (!$mask instanceof self) { - throw new InvalidArgumentException( - 'Can only apply instances of Imagine\Gmagick\Image as masks' - ); + throw new InvalidArgumentException('Can only apply instances of Imagine\Gmagick\Image as masks'); } $size = $this->getSize(); $maskSize = $mask->getSize(); if ($size != $maskSize) { - throw new InvalidArgumentException(sprintf( - 'The given mask doesn\'t match current image\'s size, current '. - 'mask\'s dimensions are %s, while image\'s dimensions are %s', - $maskSize, $size - )); + throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); } try { $mask = $mask->copy(); - - $this->gmagick->compositeimage( - $mask->gmagick, - \Gmagick::COMPOSITE_DEFAULT, - 0, 0 - ); + $this->gmagick->compositeimage($mask->gmagick, \Gmagick::COMPOSITE_DEFAULT, 0, 0); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Apply mask operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); } return $this; @@ -513,9 +451,7 @@ final class Image extends AbstractImage try { $mask->gmagick->modulateimage(100, 0, 100); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Mask operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Mask operation failed', $e->getCode(), $e); } return $mask; @@ -530,8 +466,11 @@ final class Image extends AbstractImage $draw = new \GmagickDraw(); $size = $this->getSize(); - for ($x = 0; $x <= $size->getWidth(); $x++) { - for ($y = 0; $y <= $size->getHeight(); $y++) { + $w = $size->getWidth(); + $h = $size->getHeight(); + + for ($x = 0; $x <= $w; $x++) { + for ($y = 0; $y <= $h; $y++) { $pixel = $this->getColor($fill->getColor(new Point($x, $y))); $draw->setfillcolor($pixel); @@ -545,9 +484,7 @@ final class Image extends AbstractImage $draw = null; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Fill operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Fill operation failed', $e->getCode(), $e); } return $this; @@ -561,19 +498,14 @@ final class Image extends AbstractImage try { $pixels = $this->gmagick->getimagehistogram(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Error while fetching histogram', $e->getCode(), $e - ); + throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); } $image = $this; - return array_map( - function (\GmagickPixel $pixel) use ($image) { - return $image->pixelToColor($pixel); - }, - $pixels - ); + return array_map(function (\GmagickPixel $pixel) use ($image) { + return $image->pixelToColor($pixel); + }, $pixels); } /** @@ -582,15 +514,13 @@ final class Image extends AbstractImage public function getColorAt(PointInterface $point) { if (!$point->in($this->getSize())) { - throw new InvalidArgumentException(sprintf( - 'Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', - $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight() - )); + throw new InvalidArgumentException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); } try { $cropped = clone $this->gmagick; - $histogram = $cropped->cropImage(1, 1, $point->getX(), $point->getY()) + $histogram = $cropped + ->cropImage(1, 1, $point->getX(), $point->getY()) ->getImageHistogram(); } catch (\GmagickException $e) { throw new RuntimeException('Unable to get the pixel'); @@ -608,7 +538,7 @@ final class Image extends AbstractImage * * Note : this method is public for PHP 5.3 compatibility * - * @param \ImagickPixel $pixel + * @param \GmagickPixel $pixel * * @return ColorInterface * @@ -639,9 +569,7 @@ final class Image extends AbstractImage return $this->palette->color( array_map(function ($color) use ($pixel, $colorMapping) { if (!isset($colorMapping[$color])) { - throw new InvalidArgumentException( - 'Color %s is not mapped in Imagick' - ); + throw new InvalidArgumentException(sprintf('Color %s is not mapped in Gmagick', $color)); } return $pixel->getcolorvalue($colorMapping[$color]) * 255; @@ -685,10 +613,7 @@ final class Image extends AbstractImage public function usePalette(PaletteInterface $palette) { if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf( - 'The palette %s is not supported by Gmagick driver', - $palette->name() - )); + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver',$palette->name())); } if ($this->palette->name() === $palette->name()) { @@ -733,9 +658,7 @@ final class Image extends AbstractImage try { $this->gmagick->profileimage('ICM', $profile->data()); } catch (\GmagickException $e) { - throw new RuntimeException(sprintf( - 'Unable to add profile %s to image', $profile->name() - ), $e->getCode(), $e); + throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); } return $this; @@ -755,9 +678,7 @@ final class Image extends AbstractImage try { $this->gmagick = $this->gmagick->flattenImages(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Flatten operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); } } } @@ -767,7 +688,9 @@ final class Image extends AbstractImage * * @param ColorInterface $color * - * @return string + * @return \GmagickPixel + * + * @throws InvalidArgumentException */ private function getColor(ColorInterface $color) { @@ -775,14 +698,7 @@ final class Image extends AbstractImage throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); } - $pixel = new \GmagickPixel((string) $color); - - $pixel->setColorValue( - \Gmagick::COLOR_OPACITY, - number_format(abs(round($color->getAlpha() / 100, 1)), 1) - ); - - return $pixel; + return new \GmagickPixel((string) $color); } /** @@ -794,7 +710,7 @@ final class Image extends AbstractImage * * @return string mime-type * - * @throws RuntimeException + * @throws InvalidArgumentException */ private function getMimeType($format) { @@ -808,10 +724,7 @@ final class Image extends AbstractImage ); if (!isset($mimeTypes[$format])) { - throw new InvalidArgumentException(sprintf( - 'Unsupported format given. Only %s are supported, %s given', - implode(", ", array_keys($mimeTypes)), $format - )); + throw new InvalidArgumentException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); } return $mimeTypes[$format]; @@ -827,10 +740,7 @@ final class Image extends AbstractImage private function setColorspace(PaletteInterface $palette) { if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf( - 'The palette %s is not supported by Gmagick driver', - $palette->name() - )); + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver', $palette->name())); } $this->gmagick->setimagecolorspace(static::$colorspaceMapping[$palette->name()]); diff --git a/vendor/imagine/imagine/lib/Imagine/Gmagick/Imagine.php b/vendor/imagine/imagine/lib/Imagine/Gmagick/Imagine.php index 64a2410f98..9f45fd2e6e 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gmagick/Imagine.php +++ b/vendor/imagine/imagine/lib/Imagine/Gmagick/Imagine.php @@ -12,6 +12,7 @@ namespace Imagine\Gmagick; use Imagine\Image\AbstractImagine; +use Imagine\Exception\NotSupportedException; use Imagine\Image\BoxInterface; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\Color\ColorInterface; @@ -42,21 +43,19 @@ class Imagine extends AbstractImagine */ public function open($path) { - if (!is_file($path)) { + $handle = @fopen($path, 'r'); + + if (false === $handle) { throw new InvalidArgumentException(sprintf('File %s doesn\'t exist', $path)); } - if (!is_readable($path)) { - throw new InvalidArgumentException(sprintf('File %s is not readable', $path)); - } + + fclose($handle); try { $gmagick = new \Gmagick($path); - $image = new Image($gmagick, $this->createPalette($gmagick), $this->getMetadataReader()->readFile($path)); } catch (\GmagickException $e) { - throw new RuntimeException( - sprintf('Could not open image %s', $path), $e->getCode(), $e - ); + throw new RuntimeException(sprintf('Could not open image %s', $path), $e->getCode(), $e); } return $image; @@ -75,7 +74,6 @@ class Imagine extends AbstractImagine try { $gmagick = new \Gmagick(); - // Gmagick does not support creation of CMYK GmagickPixel // see https://bugs.php.net/bug.php?id=64466 if ($color instanceof CMYKColor) { @@ -87,14 +85,12 @@ class Imagine extends AbstractImagine $pixel = new \GmagickPixel((string) $color); } - if ($color->getAlpha() > 0) { - // TODO: implement support for transparent background - throw new RuntimeException('alpha transparency not implemented'); + if ($color->getPalette()->supportsAlpha() && $color->getAlpha() < 100) { + throw new NotSupportedException('alpha transparency is not supported'); } $gmagick->newimage($width, $height, $pixel->getcolor(false)); $gmagick->setimagecolorspace(\Gmagick::COLORSPACE_TRANSPARENT); - // this is needed to propagate transparency $gmagick->setimagebackgroundcolor($pixel); $image = new Image($gmagick, $palette, new MetadataBag()); @@ -105,9 +101,7 @@ class Imagine extends AbstractImagine return $image; } catch (\GmagickException $e) { - throw new RuntimeException( - 'Could not create empty image', $e->getCode(), $e - ); + throw new RuntimeException('Could not create empty image', $e->getCode(), $e); } } @@ -116,16 +110,7 @@ class Imagine extends AbstractImagine */ public function load($string) { - try { - $gmagick = new \Gmagick(); - $gmagick->readimageblob($string); - } catch (\GmagickException $e) { - throw new RuntimeException( - 'Could not load image from string', $e->getCode(), $e - ); - } - - return new Image($gmagick, $this->createPalette($gmagick), $this->getMetadataReader()->readData($string)); + return $this->doLoad($string, $this->getMetadataReader()->readData($string)); } /** @@ -143,7 +128,7 @@ class Imagine extends AbstractImagine throw new InvalidArgumentException('Couldn\'t read given resource'); } - return $this->load($content); + return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); } /** @@ -152,7 +137,6 @@ class Imagine extends AbstractImagine public function font($file, $size, ColorInterface $color) { $gmagick = new \Gmagick(); - $gmagick->newimage(1, 1, 'transparent'); return new Font($gmagick, $file, $size, $color); @@ -164,18 +148,26 @@ class Imagine extends AbstractImagine case \Gmagick::COLORSPACE_SRGB: case \Gmagick::COLORSPACE_RGB: return new RGB(); - break; case \Gmagick::COLORSPACE_CMYK: return new CMYK(); - break; case \Gmagick::COLORSPACE_GRAY: return new Grayscale(); - break; default: - throw new RuntimeException( - 'Only RGB and CMYK colorspace are curently supported' - ); - break; + throw new NotSupportedException('Only RGB and CMYK colorspace are curently supported'); + } + } + + private function doLoad($content, MetadataBag $metadata) + { + try { + $gmagick = new \Gmagick(); + $gmagick->readimageblob($content); + } catch (\GmagickException $e) { + throw new RuntimeException( + 'Could not load image from string', $e->getCode(), $e + ); } + + return new Image($gmagick, $this->createPalette($gmagick), $metadata); } } diff --git a/vendor/imagine/imagine/lib/Imagine/Gmagick/Layers.php b/vendor/imagine/imagine/lib/Imagine/Gmagick/Layers.php index 394a77647c..d708812a14 100644 --- a/vendor/imagine/imagine/lib/Imagine/Gmagick/Layers.php +++ b/vendor/imagine/imagine/lib/Imagine/Gmagick/Layers.php @@ -41,6 +41,9 @@ class Layers extends AbstractLayers */ private $layers = array(); + /** + * @var PaletteInterface + */ private $palette; public function __construct(Image $image, PaletteInterface $palette, \Gmagick $resource) @@ -60,9 +63,7 @@ class Layers extends AbstractLayers $this->resource->setimageindex($offset); $this->resource->setimage($image->getGmagick()); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Failed to substitute layer', $e->getCode(), $e - ); + throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); } } } @@ -132,10 +133,7 @@ class Layers extends AbstractLayers $this->resource->setimageindex($offset); $this->layers[$offset] = new Image($this->resource->getimage(), $this->palette, new MetadataBag()); } catch (\GmagickException $e) { - throw new RuntimeException( - sprintf('Failed to extract layer %d', $offset), - $e->getCode(), $e - ); + throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); } } @@ -182,9 +180,7 @@ class Layers extends AbstractLayers try { return $this->resource->getnumberimages(); } catch (\GmagickException $e) { - throw new RuntimeException( - 'Failed to count the number of layers', $e->getCode(), $e - ); + throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); } } @@ -217,16 +213,11 @@ class Layers extends AbstractLayers $offset = count($this) - 1; } else { if (!is_int($offset)) { - throw new InvalidArgumentException( - 'Invalid offset for layer, it must be an integer' - ); + throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); } if (count($this) < $offset || 0 > $offset) { - throw new OutOfBoundsException(sprintf( - 'Invalid offset for layer, it must be a value between 0 and %d, %d given', - count($this), $offset - )); + throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); } if (isset($this[$offset])) { diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Box.php b/vendor/imagine/imagine/lib/Imagine/Image/Box.php index fc015fa828..37b85135a9 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Box.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Box.php @@ -39,10 +39,7 @@ final class Box implements BoxInterface public function __construct($width, $height) { if ($height < 1 || $width < 1) { - throw new InvalidArgumentException(sprintf( - 'Length of either side cannot be 0 or negative, current size '. - 'is %sx%s', $width, $height - )); + throw new InvalidArgumentException(sprintf('Length of either side cannot be 0 or negative, current size is %sx%s', $width, $height)); } $this->width = (int) $width; @@ -88,9 +85,7 @@ final class Box implements BoxInterface { $start = $start ? $start : new Point(0, 0); - return $start->in($this) && - $this->width >= $box->getWidth() + $start->getX() && - $this->height >= $box->getHeight() + $start->getY(); + return $start->in($this) && $this->width >= $box->getWidth() + $start->getX() && $this->height >= $box->getHeight() + $start->getY(); } /** diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Histogram/Range.php b/vendor/imagine/imagine/lib/Imagine/Image/Histogram/Range.php index 11bdc296be..9dc9f9928e 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Histogram/Range.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Histogram/Range.php @@ -37,10 +37,7 @@ final class Range public function __construct($start, $end) { if ($end <= $start) { - throw new OutOfBoundsException(sprintf( - 'Range end cannot be bigger than start, %d %d given '. - 'accordingly', $this->start, $this->end - )); + throw new OutOfBoundsException(sprintf('Range end cannot be bigger than start, %d %d given accordingly', $this->start, $this->end)); } $this->start = $start; diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/AbstractMetadataReader.php b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/AbstractMetadataReader.php new file mode 100644 index 0000000000..35c0654b9d --- /dev/null +++ b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/AbstractMetadataReader.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Metadata; + +use Imagine\Exception\InvalidArgumentException; + +abstract class AbstractMetadataReader implements MetadataReaderInterface +{ + /** + * {@inheritdoc} + */ + public function readFile($file) + { + if (stream_is_local($file)) { + if (!is_file($file)) { + throw new InvalidArgumentException(sprintf('File %s does not exist.', $file)); + } + + return new MetadataBag(array_merge(array('filepath' => realpath($file), 'uri' => $file), $this->extractFromFile($file))); + } + + return new MetadataBag(array_merge(array('uri' => $file)), $this->extractFromFile($file)); + } + + /** + * {@inheritdoc} + */ + public function readData($data) + { + return new MetadataBag($this->extractFromData($data)); + } + + /** + * {@inheritdoc} + */ + public function readStream($resource) + { + if (!is_resource($resource)) { + throw new InvalidArgumentException('Invalid resource provided.'); + } + + return new MetadataBag(array_merge($this->getStreamMetadata($resource), $this->extractFromStream($resource))); + } + + /** + * Gets the URI from a stream resource + * + * @param resource $resource + * + * @return string|null The URI f ava + */ + private function getStreamMetadata($resource) + { + $metadata = array(); + + if (false !== $data = @stream_get_meta_data($resource)) { + $metadata['uri'] = $data['uri']; + if (stream_is_local($resource)) { + $metadata['filepath'] = realpath($data['uri']); + } + } + + return $metadata; + } + + /** + * Extracts metadata from a file + * + * @param $file + * + * @return array An associative array of metadata + */ + abstract protected function extractFromFile($file); + + /** + * Extracts metadata from raw data + * + * @param $data + * + * @return array An associative array of metadata + */ + abstract protected function extractFromData($data); + + /** + * Extracts metadata from a stream + * + * @param $resource + * + * @return array An associative array of metadata + */ + abstract protected function extractFromStream($resource); +} diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/DefaultMetadataReader.php b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/DefaultMetadataReader.php index acb132e4a7..349366e06b 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/DefaultMetadataReader.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/DefaultMetadataReader.php @@ -1,5 +1,4 @@ realpath($file))); + return array(); } /** * {@inheritdoc} */ - public function readData($data) + protected function extractFromData($data) { - return new MetadataBag(); + return array(); } /** * {@inheritdoc} */ - public function readStream($resource) + protected function extractFromStream($resource) { - if (!is_resource($resource)) { - throw new InvalidArgumentException('Invalid resource provided.'); - } - - return new MetadataBag(); + return array(); } } diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/ExifMetadataReader.php b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/ExifMetadataReader.php index 6a39d77676..d767c274c2 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/ExifMetadataReader.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/ExifMetadataReader.php @@ -1,5 +1,4 @@ extract($file, array('filepath' => realpath($file))); + return $this->doReadData($data); } /** * {@inheritdoc} */ - public function readData($data) + protected function extractFromData($data) + { + return $this->doReadData($data); + } + + /** + * {@inheritdoc} + */ + protected function extractFromStream($resource) + { + return $this->doReadData(stream_get_contents($resource)); + } + + /** + * Extracts metadata from raw data, merges with existing metadata + * + * @param string $data + * + * @return MetadataBag + */ + private function doReadData($data) { if (substr($data, 0, 2) === 'II') { $mime = 'image/tiff'; @@ -43,29 +72,17 @@ class ExifMetadataReader implements MetadataReaderInterface return $this->extract('data://' . $mime . ';base64,' . base64_encode($data)); } - public function readStream($resource) - { - if (!is_resource($resource)) { - throw new InvalidArgumentException('Invalid resource provided.'); - } - - $data = stream_get_contents($resource); - - return $this->readData($data); - } - /** * Performs the exif data extraction given a path or data-URI representation. * * @param string $path The path to the file or the data-URI representation. - * @param array $data An array of extra-metadata to consider * * @return MetadataBag */ - private function extract($path, array $data = array()) + private function extract($path) { if (false === $exifData = @exif_read_data($path, null, true, false)) { - return new MetadataBag($data); + return array(); } $metadata = array(); @@ -80,6 +97,6 @@ class ExifMetadataReader implements MetadataReaderInterface } } - return new MetadataBag(array_merge($data, $metadata)); + return $metadata; } } diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataBag.php b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataBag.php index 4df50635f4..91653cb237 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataBag.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataBag.php @@ -63,4 +63,14 @@ class MetadataBag implements \ArrayAccess, \IteratorAggregate { return array_key_exists($offset, $this->data) ? $this->data[$offset] : null; } + + /** + * Returns metadata as an array + * + * @return array An associative array + */ + public function toArray() + { + return $this->data; + } } diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataReaderInterface.php b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataReaderInterface.php index 80c330a262..62fcc88174 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataReaderInterface.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Metadata/MetadataReaderInterface.php @@ -1,5 +1,4 @@ parser->parseToCMYK($color); @@ -112,9 +110,7 @@ class CMYK implements PaletteInterface public function profile() { if (!$this->profile) { - $this->profile = Profile::fromPath( - __DIR__ . '/../../resources/Adobe/CMYK/USWebUncoated.icc' - ); + $this->profile = Profile::fromPath(__DIR__ . '/../../resources/Adobe/CMYK/USWebUncoated.icc'); } return $this->profile; diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/CMYK.php b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/CMYK.php index 3c81b5ad25..3165433551 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/CMYK.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/CMYK.php @@ -64,9 +64,7 @@ final class CMYK implements ColorInterface case ColorInterface::COLOR_KEYLINE: return $this->getKeyline(); default: - throw new InvalidArgumentException(sprintf( - 'Color component %s is not valid', $component - )); + throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); } } @@ -208,11 +206,7 @@ final class CMYK implements ColorInterface private function setColor(array $color) { if (count($color) !== 4) { - throw new InvalidArgumentException( - 'Color argument must look like array(C, M, Y, K), ' . - 'where C, M, Y, K are the integer values between 0 and 255 for ' . - 'cyan, magenta, yellow and black color indexes accordingly' - ); + throw new InvalidArgumentException('Color argument must look like array(C, M, Y, K), where C, M, Y, K are the integer values between 0 and 255 for cyan, magenta, yellow and black color indexes accordingly'); } $colors = array_values($color); diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/Gray.php b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/Gray.php index 550f9a8342..c8096450fc 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/Gray.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/Gray.php @@ -48,9 +48,7 @@ final class Gray implements ColorInterface case ColorInterface::COLOR_GRAY: return $this->getGray(); default: - throw new InvalidArgumentException(sprintf( - 'Color component %s is not valid', $component - )); + throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); } } @@ -95,11 +93,7 @@ final class Gray implements ColorInterface */ public function lighten($shade) { - return $this->palette->color( - array( - min(255, $this->gray + $shade), - ), $this->alpha - ); + return $this->palette->color(array(min(255, $this->gray + $shade)), $this->alpha); } /** @@ -107,11 +101,7 @@ final class Gray implements ColorInterface */ public function darken($shade) { - return $this->palette->color( - array( - max(0, $this->gray - $shade), - ), $this->alpha - ); + return $this->palette->color(array(max(0, $this->gray - $shade)), $this->alpha); } /** @@ -127,7 +117,7 @@ final class Gray implements ColorInterface */ public function isOpaque() { - return 0 === $this->alpha; + return 100 === $this->alpha; } /** @@ -150,9 +140,7 @@ final class Gray implements ColorInterface private function setAlpha($alpha) { if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { - throw new InvalidArgumentException(sprintf( - 'Alpha must be an integer between 0 and 100, %s given', $alpha - )); + throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); } $this->alpha = $alpha; @@ -168,11 +156,7 @@ final class Gray implements ColorInterface private function setColor(array $color) { if (count($color) !== 1) { - throw new InvalidArgumentException( - 'Color argument must look like array(gray), ' . - 'where gray is the integer value between 0 and 255 for ' . - 'the grayscale' - ); + throw new InvalidArgumentException('Color argument must look like array(gray), where gray is the integer value between 0 and 255 for the grayscale'); } list($this->gray) = array_values($color); diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/RGB.php b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/RGB.php index c532ba6878..a0b4f0d017 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/RGB.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Color/RGB.php @@ -62,9 +62,7 @@ final class RGB implements ColorInterface case ColorInterface::COLOR_BLUE: return $this->getBlue(); default: - throw new InvalidArgumentException(sprintf( - 'Color component %s is not valid', $component - )); + throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); } } @@ -119,9 +117,7 @@ final class RGB implements ColorInterface */ public function dissolve($alpha) { - return $this->palette->color( - array($this->r, $this->g, $this->b), $this->alpha + $alpha - ); + return $this->palette->color(array($this->r, $this->g, $this->b), $this->alpha + $alpha); } /** @@ -167,7 +163,7 @@ final class RGB implements ColorInterface */ public function isOpaque() { - return 0 === $this->alpha; + return 100 === $this->alpha; } /** @@ -192,9 +188,7 @@ final class RGB implements ColorInterface private function setAlpha($alpha) { if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { - throw new InvalidArgumentException(sprintf( - 'Alpha must be an integer between 0 and 100, %s given', $alpha - )); + throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); } $this->alpha = $alpha; @@ -212,11 +206,7 @@ final class RGB implements ColorInterface private function setColor(array $color) { if (count($color) !== 3) { - throw new InvalidArgumentException( - 'Color argument must look like array(R, G, B), ' . - 'where R, G, B are the integer values between 0 and 255 for ' . - 'red, green and blue color indexes accordingly' - ); + throw new InvalidArgumentException('Color argument must look like array(R, G, B), where R, G, B are the integer values between 0 and 255 for red, green and blue color indexes accordingly'); } list($this->r, $this->g, $this->b) = array_values($color); diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Palette/ColorParser.php b/vendor/imagine/imagine/lib/Imagine/Image/Palette/ColorParser.php index 2091fea679..35cf4e9523 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Palette/ColorParser.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Palette/ColorParser.php @@ -88,11 +88,7 @@ class ColorParser $color = array_unique($this->parse($color)); if (1 !== count($color)) { - throw new InvalidArgumentException( - 'The provided color has different values of red, green and ' . - 'blue components. Grayscale colors must have the same values ' . - 'for these.' - ); + throw new InvalidArgumentException('The provided color has different values of red, green and blue components. Grayscale colors must have the same values for these.'); } return $color; @@ -110,22 +106,14 @@ class ColorParser private function parse($color) { if (!is_string($color) && !is_array($color) && !is_int($color)) { - throw new InvalidArgumentException(sprintf( - 'Color must be specified as a hexadecimal string, array ' . - 'or integer, %s given', gettype($color) - )); + throw new InvalidArgumentException(sprintf('Color must be specified as a hexadecimal string, array or integer, %s given', gettype($color))); } if (is_array($color)) { if (3 === count($color) || 4 === count($color)) { return array_values($color); } - throw new InvalidArgumentException( - 'Color argument if array, must look like array(R, G, B), ' . - 'or array(C, M, Y, K) where R, G, B are the integer values ' . - 'between 0 and 255 for red, green and blue or cyan, magenta, '. - 'yellow and black color indexes accordingly' - ); + throw new InvalidArgumentException('Color argument if array, must look like array(R, G, B), or array(C, M, Y, K) where R, G, B are the integer values between 0 and 255 for red, green and blue or cyan, magenta, yellow and black color indexes accordingly'); } if (is_string($color)) { @@ -137,9 +125,7 @@ class ColorParser }, explode(',', $substrColor)); if (count($components) !== 4) { - throw new InvalidArgumentException(sprintf( - 'Unable to parse color %s', $color - )); + throw new InvalidArgumentException(sprintf('Unable to parse color %s', $color)); } return $components; @@ -147,16 +133,11 @@ class ColorParser $color = ltrim($color, '#'); if (strlen($color) !== 3 && strlen($color) !== 6) { - throw new InvalidArgumentException(sprintf( - 'Color must be a hex value in regular (6 characters) or ' . - 'short (3 characters) notation, "%s" given', $color - )); + throw new InvalidArgumentException(sprintf('Color must be a hex value in regular (6 characters) or short (3 characters) notation, "%s" given', $color)); } if (strlen($color) === 3) { - $color = $color[0] . $color[0] . - $color[1] . $color[1] . - $color[2] . $color[2]; + $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2]; } $color = array_map('hexdec', str_split($color, 2)); @@ -164,11 +145,7 @@ class ColorParser } if (is_int($color)) { - $color = array( - 255 & ($color >> 16), - 255 & ($color >> 8), - 255 & $color - ); + $color = array(255 & ($color >> 16), 255 & ($color >> 8), 255 & $color); } return $color; diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Grayscale.php b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Grayscale.php index 41f7843de7..3d46cbe068 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Palette/Grayscale.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Palette/Grayscale.php @@ -52,9 +52,7 @@ class Grayscale implements PaletteInterface */ public function pixelDefinition() { - return array( - ColorInterface::COLOR_GRAY, - ); + return array(ColorInterface::COLOR_GRAY); } /** @@ -81,9 +79,7 @@ class Grayscale implements PaletteInterface public function profile() { if (!$this->profile) { - $this->profile = Profile::fromPath( - __DIR__ . '/../../resources/colormanagement.org/ISOcoated_v2_grey1c_bas.ICC' - ); + $this->profile = Profile::fromPath(__DIR__ . '/../../resources/colormanagement.org/ISOcoated_v2_grey1c_bas.ICC'); } return $this->profile; diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Palette/RGB.php b/vendor/imagine/imagine/lib/Imagine/Image/Palette/RGB.php index 4f69769212..ec36cd3cfa 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Palette/RGB.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Palette/RGB.php @@ -83,9 +83,7 @@ class RGB implements PaletteInterface public function profile() { if (!$this->profile) { - $this->profile = Profile::fromPath( - __DIR__ . '/../../resources/color.org/sRGB_IEC61966-2-1_black_scaled.icc' - ); + $this->profile = Profile::fromPath(__DIR__ . '/../../resources/color.org/sRGB_IEC61966-2-1_black_scaled.icc'); } return $this->profile; @@ -97,7 +95,7 @@ class RGB implements PaletteInterface public function color($color, $alpha = null) { if (null === $alpha) { - $alpha = 0; + $alpha = 100; } $color = $this->parser->parseToRGB($color); diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Point.php b/vendor/imagine/imagine/lib/Imagine/Image/Point.php index 27d9982075..d3f385e5d8 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Point.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Point.php @@ -39,9 +39,7 @@ final class Point implements PointInterface public function __construct($x, $y) { if ($x < 0 || $y < 0) { - throw new InvalidArgumentException( - 'A coordinate cannot be positioned outside of a bounding box' - ); + throw new InvalidArgumentException('A coordinate cannot be positioned outside of a bounding box'); } $this->x = $x; diff --git a/vendor/imagine/imagine/lib/Imagine/Image/Profile.php b/vendor/imagine/imagine/lib/Imagine/Image/Profile.php index 1d9c16038b..fda5415a6e 100644 --- a/vendor/imagine/imagine/lib/Imagine/Image/Profile.php +++ b/vendor/imagine/imagine/lib/Imagine/Image/Profile.php @@ -52,10 +52,7 @@ class Profile implements ProfileInterface public static function fromPath($path) { if (!file_exists($path) || !is_file($path) || !is_readable($path)) { - throw new InvalidArgumentException(sprintf( - 'Path %s is an invalid profile file or is not readable', - $path - )); + throw new InvalidArgumentException(sprintf('Path %s is an invalid profile file or is not readable', $path)); } return new static(basename($path), file_get_contents($path)); diff --git a/vendor/imagine/imagine/lib/Imagine/Imagick/Drawer.php b/vendor/imagine/imagine/lib/Imagine/Imagick/Drawer.php index 0f4a14c189..b56d47ad7c 100644 --- a/vendor/imagine/imagine/lib/Imagine/Imagick/Drawer.php +++ b/vendor/imagine/imagine/lib/Imagine/Imagick/Drawer.php @@ -65,9 +65,7 @@ final class Drawer implements DrawerInterface $arc->clear(); $arc->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw arc operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); } return $this; @@ -94,14 +92,8 @@ final class Drawer implements DrawerInterface $chord->setFillColor($pixel); } else { $this->line( - new Point( - round($x + $width / 2 * cos(deg2rad($start))), - round($y + $height / 2 * sin(deg2rad($start))) - ), - new Point( - round($x + $width / 2 * cos(deg2rad($end))), - round($y + $height / 2 * sin(deg2rad($end))) - ), + new Point(round($x + $width / 2 * cos(deg2rad($start))), round($y + $height / 2 * sin(deg2rad($start)))), + new Point(round($x + $width / 2 * cos(deg2rad($end))), round($y + $height / 2 * sin(deg2rad($end)))), $color ); @@ -125,9 +117,7 @@ final class Drawer implements DrawerInterface $chord->clear(); $chord->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw chord operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); } return $this; @@ -172,9 +162,7 @@ final class Drawer implements DrawerInterface $ellipse->clear(); $ellipse->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw ellipse operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); } return $this; @@ -207,9 +195,7 @@ final class Drawer implements DrawerInterface $line->clear(); $line->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw line operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); } return $this; @@ -272,9 +258,7 @@ final class Drawer implements DrawerInterface $point->clear(); $point->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw point operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); } return $this; @@ -286,18 +270,12 @@ final class Drawer implements DrawerInterface public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) { if (count($coordinates) < 3) { - throw new InvalidArgumentException(sprintf( - 'Polygon must consist of at least 3 coordinates, %d given', - count($coordinates) - )); + throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); } - $points = array_map( - function (PointInterface $p) { - return array('x' => $p->getX(), 'y' => $p->getY()); - }, - $coordinates - ); + $points = array_map(function (PointInterface $p) { + return array('x' => $p->getX(), 'y' => $p->getY()); + }, $coordinates); try { $pixel = $this->getColor($color); @@ -313,7 +291,6 @@ final class Drawer implements DrawerInterface } $polygon->polygon($points); - $this->imagick->drawImage($polygon); $pixel->clear(); @@ -322,9 +299,7 @@ final class Drawer implements DrawerInterface $polygon->clear(); $polygon->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw polygon operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); } return $this; @@ -384,9 +359,7 @@ final class Drawer implements DrawerInterface $text->clear(); $text->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Draw text operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); } return $this; @@ -402,11 +375,7 @@ final class Drawer implements DrawerInterface private function getColor(ColorInterface $color) { $pixel = new \ImagickPixel((string) $color); - - $pixel->setColorValue( - \Imagick::COLOR_OPACITY, - number_format(abs(round($color->getAlpha() / 100, 1)), 1) - ); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, number_format(round($color->getAlpha() / 100, 2), 1)); return $pixel; } diff --git a/vendor/imagine/imagine/lib/Imagine/Imagick/Image.php b/vendor/imagine/imagine/lib/Imagine/Imagick/Image.php index dbc46604ca..d73a70eb0b 100644 --- a/vendor/imagine/imagine/lib/Imagine/Imagick/Image.php +++ b/vendor/imagine/imagine/lib/Imagine/Imagick/Image.php @@ -109,9 +109,7 @@ final class Image extends AbstractImage $clone = $this->imagick->clone(); } } catch (\ImagickException $e) { - throw new RuntimeException( - 'Copy operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Copy operation failed', $e->getCode(), $e); } return new self($clone, $this->palette, clone $this->metadata); @@ -123,25 +121,15 @@ final class Image extends AbstractImage public function crop(PointInterface $start, BoxInterface $size) { if (!$start->in($this->getSize())) { - throw new OutOfBoundsException('Crop coordinates must start at '. - 'minimum 0, 0 position from top left corner, crop height and '. - 'width must be positive integers and must not exceed the '. - 'current image borders'); + throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); } try { - $this->imagick->cropImage( - $size->getWidth(), - $size->getHeight(), - $start->getX(), - $start->getY() - ); + $this->imagick->cropImage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); // Reset canvas for gif format $this->imagick->setImagePage(0, 0, 0, 0); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Crop operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Crop operation failed', $e->getCode(), $e); } return $this; @@ -155,9 +143,7 @@ final class Image extends AbstractImage try { $this->imagick->flopImage(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Horizontal Flip operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Horizontal Flip operation failed', $e->getCode(), $e); } return $this; @@ -171,9 +157,7 @@ final class Image extends AbstractImage try { $this->imagick->flipImage(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Vertical flip operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); } return $this; @@ -188,9 +172,7 @@ final class Image extends AbstractImage $this->profile($this->palette->profile()); $this->imagick->stripImage(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Strip operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Strip operation failed', $e->getCode(), $e); } return $this; @@ -202,30 +184,17 @@ final class Image extends AbstractImage public function paste(ImageInterface $image, PointInterface $start) { if (!$image instanceof self) { - throw new InvalidArgumentException(sprintf('Imagick\Image can '. - 'only paste() Imagick\Image instances, %s given', - get_class($image) - )); + throw new InvalidArgumentException(sprintf('Imagick\Image can only paste() Imagick\Image instances, %s given', get_class($image))); } if (!$this->getSize()->contains($image->getSize(), $start)) { - throw new OutOfBoundsException( - 'Cannot paste image of the given size at the specified '. - 'position, as it moves outside of the current image\'s box' - ); + throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); } try { - - $this->imagick->compositeImage( - $image->imagick, \Imagick::COMPOSITE_DEFAULT, - $start->getX(), - $start->getY() - ); + $this->imagick->compositeImage($image->imagick, \Imagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Paste operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Paste operation failed', $e->getCode(), $e); } return $this; @@ -236,40 +205,10 @@ final class Image extends AbstractImage */ public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) { - static $supportedFilters = array( - ImageInterface::FILTER_UNDEFINED => \Imagick::FILTER_UNDEFINED, - ImageInterface::FILTER_BESSEL => \Imagick::FILTER_BESSEL, - ImageInterface::FILTER_BLACKMAN => \Imagick::FILTER_BLACKMAN, - ImageInterface::FILTER_BOX => \Imagick::FILTER_BOX, - ImageInterface::FILTER_CATROM => \Imagick::FILTER_CATROM, - ImageInterface::FILTER_CUBIC => \Imagick::FILTER_CUBIC, - ImageInterface::FILTER_GAUSSIAN => \Imagick::FILTER_GAUSSIAN, - ImageInterface::FILTER_HANNING => \Imagick::FILTER_HANNING, - ImageInterface::FILTER_HAMMING => \Imagick::FILTER_HAMMING, - ImageInterface::FILTER_HERMITE => \Imagick::FILTER_HERMITE, - ImageInterface::FILTER_LANCZOS => \Imagick::FILTER_LANCZOS, - ImageInterface::FILTER_MITCHELL => \Imagick::FILTER_MITCHELL, - ImageInterface::FILTER_POINT => \Imagick::FILTER_POINT, - ImageInterface::FILTER_QUADRATIC => \Imagick::FILTER_QUADRATIC, - ImageInterface::FILTER_SINC => \Imagick::FILTER_SINC, - ImageInterface::FILTER_TRIANGLE => \Imagick::FILTER_TRIANGLE - ); - - if (!array_key_exists($filter, $supportedFilters)) { - throw new InvalidArgumentException('Unsupported filter type'); - } - try { - $this->imagick->resizeImage( - $size->getWidth(), - $size->getHeight(), - $supportedFilters[$filter], - 1 - ); + $this->imagick->resizeImage($size->getWidth(), $size->getHeight(), $this->getFilter($filter), 1); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Resize operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Resize operation failed', $e->getCode(), $e); } return $this; @@ -290,9 +229,7 @@ final class Image extends AbstractImage $pixel->clear(); $pixel->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Rotate operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); } return $this; @@ -305,18 +242,14 @@ final class Image extends AbstractImage { $path = null === $path ? $this->imagick->getImageFilename() : $path; if (null === $path) { - throw new RuntimeException( - 'You can omit save path only if image has been open from a file' - ); + throw new RuntimeException('You can omit save path only if image has been open from a file'); } try { $this->prepareOutput($options, $path); $this->imagick->writeImages($path, true); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Save operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Save operation failed', $e->getCode(), $e); } return $this; @@ -342,9 +275,7 @@ final class Image extends AbstractImage $options['format'] = $format; $this->prepareOutput($options); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Get operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Get operation failed', $e->getCode(), $e); } return $this->imagick->getImagesBlob(); @@ -382,7 +313,6 @@ final class Image extends AbstractImage } if (isset($options['animated']) && true === $options['animated']) { - $format = isset($options['format']) ? $options['format'] : 'gif'; $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; @@ -434,9 +364,7 @@ final class Image extends AbstractImage $width = $this->imagick->getImageWidth(); $height = $this->imagick->getImageHeight(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Could not get size', $e->getCode(), $e - ); + throw new RuntimeException('Could not get size', $e->getCode(), $e); } return new Box($width, $height); @@ -448,46 +376,28 @@ final class Image extends AbstractImage public function applyMask(ImageInterface $mask) { if (!$mask instanceof self) { - throw new InvalidArgumentException( - 'Can only apply instances of Imagine\Imagick\Image as masks' - ); + throw new InvalidArgumentException('Can only apply instances of Imagine\Imagick\Image as masks'); } $size = $this->getSize(); $maskSize = $mask->getSize(); if ($size != $maskSize) { - throw new InvalidArgumentException(sprintf( - 'The given mask doesn\'t match current image\'s size, Current '. - 'mask\'s dimensions are %s, while image\'s dimensions are %s', - $maskSize, $size - )); + throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); } $mask = $mask->mask(); - $mask->imagick->negateImage(true); try { // remove transparent areas of the original from the mask - $mask->imagick->compositeImage( - $this->imagick, - \Imagick::COMPOSITE_DSTIN, - 0, 0 - ); - - $this->imagick->compositeImage( - $mask->imagick, - \Imagick::COMPOSITE_COPYOPACITY, - 0, 0 - ); + $mask->imagick->compositeImage($this->imagick, \Imagick::COMPOSITE_DSTIN, 0, 0); + $this->imagick->compositeImage($mask->imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); $mask->imagick->clear(); $mask->imagick->destroy(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Apply mask operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); } return $this; @@ -504,9 +414,7 @@ final class Image extends AbstractImage $mask->imagick->modulateImage(100, 0, 100); $mask->imagick->setImageMatte(false); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Mask operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Mask operation failed', $e->getCode(), $e); } return $mask; @@ -528,19 +436,14 @@ final class Image extends AbstractImage $color = $fill->getColor(new Point($x, $y)); $pixel->setColor((string) $color); - $pixel->setColorValue( - \Imagick::COLOR_OPACITY, - number_format(abs(round($color->getAlpha() / 100, 1)), 1) - ); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, number_format(round($color->getAlpha() / 100, 2), 1)); } $iterator->syncIterator(); } } } catch (\ImagickException $e) { - throw new RuntimeException( - 'Fill operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Fill operation failed', $e->getCode(), $e); } return $this; @@ -554,19 +457,14 @@ final class Image extends AbstractImage try { $pixels = $this->imagick->getImageHistogram(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Error while fetching histogram', $e->getCode(), $e - ); + throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); } $image = $this; - return array_map( - function (\ImagickPixel $pixel) use ($image) { - return $image->pixelToColor($pixel); - }, - $pixels - ); + return array_map(function (\ImagickPixel $pixel) use ($image) { + return $image->pixelToColor($pixel); + },$pixels); } /** @@ -575,18 +473,13 @@ final class Image extends AbstractImage public function getColorAt(PointInterface $point) { if (!$point->in($this->getSize())) { - throw new RuntimeException(sprintf( - 'Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', - $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight() - )); + throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); } try { $pixel = $this->imagick->getImagePixelColor($point->getX(), $point->getY()); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Error while getting image pixel color', $e->getCode(), $e - ); + throw new RuntimeException('Error while getting image pixel color', $e->getCode(), $e); } return $this->pixelToColor($pixel); @@ -617,18 +510,13 @@ final class Image extends AbstractImage $alpha = $this->palette->supportsAlpha() ? (int) round($pixel->getColorValue(\Imagick::COLOR_ALPHA) * 100) : null; - return $this->palette->color( - array_map(function ($color) use ($pixel, $colorMapping) { - if (!isset($colorMapping[$color])) { - throw new InvalidArgumentException( - 'Color %s is not mapped in Imagick' - ); - } + return $this->palette->color(array_map(function ($color) use ($pixel, $colorMapping) { + if (!isset($colorMapping[$color])) { + throw new InvalidArgumentException(sprintf('Color %s is not mapped in Imagick', $color)); + } - return $pixel->getColorValue($colorMapping[$color]) * 255; - }, $this->palette->pixelDefinition()), - $alpha - ); + return $pixel->getColorValue($colorMapping[$color]) * 255; + }, $this->palette->pixelDefinition()), $alpha); } /** @@ -645,10 +533,7 @@ final class Image extends AbstractImage public function usePalette(PaletteInterface $palette) { if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf( - 'The palette %s is not supported by Imagick driver', - $palette->name() - )); + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); } if ($this->palette->name() === $palette->name()) { @@ -695,9 +580,7 @@ final class Image extends AbstractImage try { $this->imagick->profileImage('icc', $profile->data()); } catch (\ImagickException $e) { - throw new RuntimeException(sprintf( - 'Unable to add profile %s to image', $profile->name() - ), $e->getCode(), $e); + throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); } return $this; @@ -713,9 +596,7 @@ final class Image extends AbstractImage try { $this->imagick = $this->imagick->flattenImages(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Flatten operation failed', $e->getCode(), $e - ); + throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); } } @@ -727,6 +608,9 @@ final class Image extends AbstractImage * @param \Imagick $image * @param array $options * @param string $path + * + * @throws InvalidArgumentException + * @throws RuntimeException */ private function applyImageOptions(\Imagick $image, array $options, $path) { @@ -770,9 +654,7 @@ final class Image extends AbstractImage $image->setImageCompressionQuality($compression); } - if (isset($options['resolution-units']) && isset($options['resolution-x']) - && isset($options['resolution-y'])) { - + if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERCENTIMETER); } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { @@ -781,8 +663,13 @@ final class Image extends AbstractImage throw new RuntimeException('Unsupported image unit format'); } + $filter = ImageInterface::FILTER_UNDEFINED; + if (!empty($options['resampling-filter'])) { + $filter = $options['resampling-filter']; + } + $image->setImageResolution($options['resolution-x'], $options['resolution-y']); - $image->resampleImage($options['resolution-x'], $options['resolution-y'], \Imagick::FILTER_UNDEFINED, 0); + $image->resampleImage($options['resolution-x'], $options['resolution-y'], $this->getFilter($filter), 0); } } @@ -791,16 +678,12 @@ final class Image extends AbstractImage * * @param ColorInterface $color * - * @return string + * @return \ImagickPixel */ private function getColor(ColorInterface $color) { $pixel = new \ImagickPixel((string) $color); - - $pixel->setColorValue( - \Imagick::COLOR_OPACITY, - number_format(abs(round($color->getAlpha() / 100, 1)), 1) - ); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, number_format(round($color->getAlpha() / 100, 2), 1)); return $pixel; } @@ -814,8 +697,7 @@ final class Image extends AbstractImage */ private function isLinearOpaque(FillInterface $fill) { - return $fill instanceof Linear && - ($fill->getStart()->isOpaque() && $fill->getEnd()->isOpaque()); + return $fill instanceof Linear && $fill->getStart()->isOpaque() && $fill->getEnd()->isOpaque(); } /** @@ -827,35 +709,16 @@ final class Image extends AbstractImage { $gradient = new \Imagick(); $size = $this->getSize(); - $color = sprintf( - 'gradient:%s-%s', - (string) $fill->getStart(), - (string) $fill->getEnd() - ); + $color = sprintf('gradient:%s-%s', (string) $fill->getStart(), (string) $fill->getEnd()); if ($fill instanceof Horizontal) { - $gradient->newPseudoImage( - $size->getHeight(), - $size->getWidth(), - $color - ); - + $gradient->newPseudoImage($size->getHeight(), $size->getWidth(), $color); $gradient->rotateImage(new \ImagickPixel(), 90); } else { - $gradient->newPseudoImage( - $size->getWidth(), - $size->getHeight(), - $color - ); - } - - $this->imagick->compositeImage( - $gradient, - \Imagick::COMPOSITE_OVER, - 0, - 0 - ); + $gradient->newPseudoImage($size->getWidth(), $size->getHeight(), $color); + } + $this->imagick->compositeImage($gradient, \Imagick::COMPOSITE_OVER, 0, 0); $gradient->clear(); $gradient->destroy(); } @@ -883,10 +746,7 @@ final class Image extends AbstractImage ); if (!isset($mimeTypes[$format])) { - throw new RuntimeException(sprintf( - 'Unsupported format given. Only %s are supported, %s given', - implode(", ", array_keys($mimeTypes)), $format - )); + throw new RuntimeException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); } return $mimeTypes[$format]; @@ -909,10 +769,7 @@ final class Image extends AbstractImage ); if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf( - 'The palette %s is not supported by Imagick driver', - $palette->name() - )); + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); } $this->imagick->setType($typeMapping[$palette->name()]); @@ -934,4 +791,44 @@ final class Image extends AbstractImage return static::$supportsColorspaceConversion = method_exists('Imagick', 'setColorspace'); } + + /** + * Returns the filter if it's supported. + * + * @param string $filter + * + * @return string + * + * @throws InvalidArgumentException If the filter is unsupported. + */ + private function getFilter($filter = ImageInterface::FILTER_UNDEFINED) + { + static $supportedFilters = array( + ImageInterface::FILTER_UNDEFINED => \Imagick::FILTER_UNDEFINED, + ImageInterface::FILTER_BESSEL => \Imagick::FILTER_BESSEL, + ImageInterface::FILTER_BLACKMAN => \Imagick::FILTER_BLACKMAN, + ImageInterface::FILTER_BOX => \Imagick::FILTER_BOX, + ImageInterface::FILTER_CATROM => \Imagick::FILTER_CATROM, + ImageInterface::FILTER_CUBIC => \Imagick::FILTER_CUBIC, + ImageInterface::FILTER_GAUSSIAN => \Imagick::FILTER_GAUSSIAN, + ImageInterface::FILTER_HANNING => \Imagick::FILTER_HANNING, + ImageInterface::FILTER_HAMMING => \Imagick::FILTER_HAMMING, + ImageInterface::FILTER_HERMITE => \Imagick::FILTER_HERMITE, + ImageInterface::FILTER_LANCZOS => \Imagick::FILTER_LANCZOS, + ImageInterface::FILTER_MITCHELL => \Imagick::FILTER_MITCHELL, + ImageInterface::FILTER_POINT => \Imagick::FILTER_POINT, + ImageInterface::FILTER_QUADRATIC => \Imagick::FILTER_QUADRATIC, + ImageInterface::FILTER_SINC => \Imagick::FILTER_SINC, + ImageInterface::FILTER_TRIANGLE => \Imagick::FILTER_TRIANGLE + ); + + if (!array_key_exists($filter, $supportedFilters)) { + throw new InvalidArgumentException(sprintf( + 'The resampling filter "%s" is not supported by Imagick driver.', + $filter + )); + } + + return $supportedFilters[$filter]; + } } diff --git a/vendor/imagine/imagine/lib/Imagine/Imagick/Imagine.php b/vendor/imagine/imagine/lib/Imagine/Imagick/Imagine.php index 844ffbae8f..74e4b157dd 100644 --- a/vendor/imagine/imagine/lib/Imagine/Imagick/Imagine.php +++ b/vendor/imagine/imagine/lib/Imagine/Imagick/Imagine.php @@ -11,6 +11,7 @@ namespace Imagine\Imagick; +use Imagine\Exception\NotSupportedException; use Imagine\Image\AbstractImagine; use Imagine\Image\BoxInterface; use Imagine\Image\Metadata\MetadataBag; @@ -37,9 +38,8 @@ final class Imagine extends AbstractImagine $imagick = new \Imagick(); $v = $imagick->getVersion(); - list($version, $year, $month, $day, $q, $website) = sscanf($v['versionString'], 'ImageMagick %s %04d-%02d-%02d %s %s'); + list($version) = sscanf($v['versionString'], 'ImageMagick %s %04d-%02d-%02d %s %s'); - // imagick.setiteratorindex.php if (version_compare('6.2.9', $version) > 0) { throw new RuntimeException('Imagick version 6.2.9 or higher is required'); } @@ -53,16 +53,15 @@ final class Imagine extends AbstractImagine $handle = @fopen($path, 'r'); if (false === $handle) { - throw new InvalidArgumentException(sprintf( - 'File %s doesn\'t exist', $path - )); + throw new InvalidArgumentException(sprintf('File %s doesn\'t exist', $path)); } + fclose($handle); + try { - $image = $this->read($handle); - $image->getImagick()->setImageFilename($path); + $imagick = new \Imagick($path); + $image = new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readFile($path)); } catch (\Exception $e) { - fclose($handle); throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); } @@ -82,10 +81,7 @@ final class Imagine extends AbstractImagine try { $pixel = new \ImagickPixel((string) $color); - $pixel->setColorValue( - \Imagick::COLOR_OPACITY, - number_format(abs(round($color->getAlpha() / 100, 1)), 1) - ); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, number_format(round($color->getAlpha() / 100, 2), 1)); $imagick = new \Imagick(); $imagick->newImage($width, $height, $pixel); @@ -97,9 +93,7 @@ final class Imagine extends AbstractImagine return new Image($imagick, $palette, new MetadataBag()); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Could not create empty image', $e->getCode(), $e - ); + throw new RuntimeException('Could not create empty image', $e->getCode(), $e); } } @@ -116,9 +110,7 @@ final class Imagine extends AbstractImagine return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readData($string)); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Could not load image from string', $e->getCode(), $e - ); + throw new RuntimeException('Could not load image from string', $e->getCode(), $e); } } @@ -135,9 +127,7 @@ final class Imagine extends AbstractImagine $imagick = new \Imagick(); $imagick->readImageFile($resource); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Could not read image from resource', $e->getCode(), $e - ); + throw new RuntimeException('Could not read image from resource', $e->getCode(), $e); } return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readStream($resource)); @@ -157,18 +147,12 @@ final class Imagine extends AbstractImagine case \Imagick::COLORSPACE_RGB: case \Imagick::COLORSPACE_SRGB: return new RGB(); - break; case \Imagick::COLORSPACE_CMYK: return new CMYK(); - break; case \Imagick::COLORSPACE_GRAY: return new Grayscale(); - break; default: - throw new RuntimeException( - 'Only RGB and CMYK colorspace are curently supported' - ); - break; + throw new NotSupportedException('Only RGB and CMYK colorspace are curently supported'); } } } diff --git a/vendor/imagine/imagine/lib/Imagine/Imagick/Layers.php b/vendor/imagine/imagine/lib/Imagine/Imagick/Layers.php index fb130630dc..6ba626ef46 100644 --- a/vendor/imagine/imagine/lib/Imagine/Imagick/Layers.php +++ b/vendor/imagine/imagine/lib/Imagine/Imagick/Layers.php @@ -56,9 +56,7 @@ class Layers extends AbstractLayers $this->resource->setIteratorIndex($offset); $this->resource->setImage($image->getImagick()); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Failed to substitute layer', $e->getCode(), $e - ); + throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); } } } @@ -108,9 +106,7 @@ class Layers extends AbstractLayers try { $coalescedResource = $this->resource->coalesceImages(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Failed to coalesce layers', $e->getCode(), $e - ); + throw new RuntimeException('Failed to coalesce layers', $e->getCode(), $e); } $count = $coalescedResource->getNumberImages(); @@ -119,9 +115,7 @@ class Layers extends AbstractLayers $coalescedResource->setIteratorIndex($offset); $this->layers[$offset] = new Image($coalescedResource->getImage(), $this->palette, new MetadataBag()); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Failed to retrieve layer', $e->getCode(), $e - ); + throw new RuntimeException('Failed to retrieve layer', $e->getCode(), $e); } } } @@ -149,10 +143,7 @@ class Layers extends AbstractLayers $this->resource->setIteratorIndex($offset); $this->layers[$offset] = new Image($this->resource->getImage(), $this->palette, new MetadataBag()); } catch (\ImagickException $e) { - throw new RuntimeException( - sprintf('Failed to extract layer %d', $offset), - $e->getCode(), $e - ); + throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); } } @@ -199,9 +190,7 @@ class Layers extends AbstractLayers try { return $this->resource->getNumberImages(); } catch (\ImagickException $e) { - throw new RuntimeException( - 'Failed to count the number of layers', $e->getCode(), $e - ); + throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); } } @@ -234,16 +223,11 @@ class Layers extends AbstractLayers $offset = count($this) - 1; } else { if (!is_int($offset)) { - throw new InvalidArgumentException( - 'Invalid offset for layer, it must be an integer' - ); + throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); } if (count($this) < $offset || 0 > $offset) { - throw new OutOfBoundsException(sprintf( - 'Invalid offset for layer, it must be a value between 0 and %d, %d given', - count($this), $offset - )); + throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); } if (isset($this[$offset])) { diff --git a/vendor/imagine/imagine/lib/Imagine/Test/ImagineTestCase.php b/vendor/imagine/imagine/lib/Imagine/Test/ImagineTestCase.php index fce91755d5..0c14f77464 100644 --- a/vendor/imagine/imagine/lib/Imagine/Test/ImagineTestCase.php +++ b/vendor/imagine/imagine/lib/Imagine/Test/ImagineTestCase.php @@ -15,14 +15,16 @@ use Imagine\Test\Constraint\IsImageEqual; class ImagineTestCase extends \PHPUnit_Framework_TestCase { + const HTTP_IMAGE = 'http://imagine.readthedocs.org/en/latest/_static/logo.png'; + /** * Asserts that two images are equal using color histogram comparison method * - * @param Imagine\Image\ImageInterface $expected - * @param Imagine\Image\ImageInterface $actual - * @param string $message - * @param float $delta - * @param integer $buckets + * @param ImageInterface $expected + * @param ImageInterface $actual + * @param string $message + * @param float $delta + * @param integer $buckets */ public static function assertImageEquals($expected, $actual, $message = '', $delta = 0.1, $buckets = 4) { diff --git a/vendor/imagine/imagine/tests/Imagine/Fixtures/100-percent-black.png b/vendor/imagine/imagine/tests/Imagine/Fixtures/100-percent-black.png new file mode 100644 index 0000000000..168f5f726c Binary files /dev/null and b/vendor/imagine/imagine/tests/Imagine/Fixtures/100-percent-black.png differ diff --git a/vendor/imagine/imagine/tests/Imagine/Fixtures/65-percent-black.png b/vendor/imagine/imagine/tests/Imagine/Fixtures/65-percent-black.png new file mode 100644 index 0000000000..61b0eb6630 Binary files /dev/null and b/vendor/imagine/imagine/tests/Imagine/Fixtures/65-percent-black.png differ diff --git a/vendor/imagine/imagine/tests/Imagine/Fixtures/example.svg b/vendor/imagine/imagine/tests/Imagine/Fixtures/example.svg new file mode 100644 index 0000000000..438734c170 --- /dev/null +++ b/vendor/imagine/imagine/tests/Imagine/Fixtures/example.svg @@ -0,0 +1,69 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Filter/Advanced/GrayscaleTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Filter/Advanced/GrayscaleTest.php index b7ba1f7aae..3a60555a7c 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Filter/Advanced/GrayscaleTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Filter/Advanced/GrayscaleTest.php @@ -35,11 +35,11 @@ class GrayscaleTest extends FilterTestCase $imageHeight = $size->getHeight(); $size = $this->getMock('Imagine\\Image\\BoxInterface'); - $size->expects($this->exactly($imageWidth+1)) + $size->expects($this->once()) ->method('getWidth') ->will($this->returnValue($imageWidth)); - $size->expects($this->exactly($imageWidth * ($imageHeight+1))) + $size->expects($this->once()) ->method('getHeight') ->will($this->returnValue($imageHeight)); diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Filter/Basic/AutorotateTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Filter/Basic/AutorotateTest.php new file mode 100644 index 0000000000..13f3ea79d6 --- /dev/null +++ b/vendor/imagine/imagine/tests/Imagine/Test/Filter/Basic/AutorotateTest.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Test\Filter\Basic; + +USE Imagine\Filter\Basic\Autorotate; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Test\Filter\FilterTestCase; + +class AutorotateTest extends FilterTestCase +{ + /** + * @dataProvider provideMetadataAndRotations + */ + public function testApply($expectedRotation, MetadataBag $metadata) + { + $image = $this->getImage(); + $image->expects($this->any()) + ->method('metadata') + ->will($this->returnValue($metadata)); + + if (null === $expectedRotation) { + $image->expects($this->never()) + ->method('rotate'); + } else { + $image->expects($this->once()) + ->method('rotate') + ->with($expectedRotation); + } + + $filter = new Autorotate($this->getColor()); + $filter->apply($image); + } + + public function provideMetadataAndRotations() + { + return array( + array(null, new MetadataBag(array())), + array(null, new MetadataBag(array('ifd0.Orientation' => 0))), + array(null, new MetadataBag(array('ifd0.Orientation' => 1))), + array(null, new MetadataBag(array('ifd0.Orientation' => 2))), + array(null, new MetadataBag(array('ifd0.Orientation' => null))), + array(90, new MetadataBag(array('ifd0.Orientation' => 6))), + array(180, new MetadataBag(array('ifd0.Orientation' => 3))), + array(-90, new MetadataBag(array('ifd0.Orientation' => 8))), + ); + } +} diff --git a/vendor/imagine/imagine/tests/Imagine/Filter/Basic/WebOptimizationTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Filter/Basic/WebOptimizationTest.php similarity index 97% rename from vendor/imagine/imagine/tests/Imagine/Filter/Basic/WebOptimizationTest.php rename to vendor/imagine/imagine/tests/Imagine/Test/Filter/Basic/WebOptimizationTest.php index 7a66489323..8582a22084 100644 --- a/vendor/imagine/imagine/tests/Imagine/Filter/Basic/WebOptimizationTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Filter/Basic/WebOptimizationTest.php @@ -9,8 +9,9 @@ * file that was distributed with this source code. */ -namespace Imagine\Filter\Basic; +namespace Imagine\Test\Filter\Basic; +use Imagine\Filter\Basic\WebOptimization; use Imagine\Image\ImageInterface; use Imagine\Test\Filter\FilterTestCase; diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Gd/ImageTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Gd/ImageTest.php index ec102527a8..8356ef5aea 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Gd/ImageTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Gd/ImageTest.php @@ -106,4 +106,16 @@ class ImageTest extends AbstractImageTest parent::testRotateWithNoBackgroundColor(); } + + /** + * @dataProvider provideVariousSources + */ + public function testResolutionOnSave($source) + { + $this->markTestSkipped('Gd only supports 72 dpi resolution'); + } + + protected function getImageResolution(ImageInterface $image) + { + } } diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Gmagick/ImageTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Gmagick/ImageTest.php index 1cae6bb7a4..54acab7afd 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Gmagick/ImageTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Gmagick/ImageTest.php @@ -12,6 +12,8 @@ namespace Imagine\Test\Gmagick; use Imagine\Gmagick\Imagine; +use Imagine\Image\ImageInterface; +use Imagine\Image\Point; use Imagine\Test\Image\AbstractImageTest; class ImageTest extends AbstractImageTest @@ -29,6 +31,19 @@ class ImageTest extends AbstractImageTest } } + // We redeclare this test because Gmagick does not support alpha + public function testGetColorAt() + { + $color = $this + ->getImagine() + ->open('tests/Imagine/Fixtures/65-percent-black.png') + ->getColorAt(new Point(0, 0)); + + $this->assertEquals('#000000', (string) $color); + // Gmagick does not supports alpha + $this->assertTrue($color->isOpaque()); + } + public function provideFromAndToPalettes() { return array( @@ -67,4 +82,9 @@ class ImageTest extends AbstractImageTest { return true; } + + protected function getImageResolution(ImageInterface $image) + { + return $image->getGmagick()->getimageresolution(); + } } diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImageTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImageTest.php index 83af47ccf5..b730c1b38b 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImageTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImageTest.php @@ -19,6 +19,7 @@ use Imagine\Image\Point\Center; use Imagine\Test\ImagineTestCase; use Imagine\Image\Palette\RGB; use Imagine\Image\Profile; +use Imagine\Image\ImagineInterface; abstract class AbstractImageTest extends ImagineTestCase { @@ -555,6 +556,33 @@ abstract class AbstractImageTest extends ImagineTestCase $this->assertEquals('#0082a2', (string) $color); } + public function testGetColorAt() + { + $color = $this + ->getImagine() + ->open('tests/Imagine/Fixtures/65-percent-black.png') + ->getColorAt(new Point(0, 0)); + + $this->assertEquals('#000000', (string) $color); + $this->assertFalse($color->isOpaque()); + $this->assertEquals('65', $color->getAlpha()); + } + + public function testGetColorAtOpaque() + { + $color = $this + ->getImagine() + ->open('tests/Imagine/Fixtures/100-percent-black.png') + ->getColorAt(new Point(0, 0)); + + $this->assertEquals('#000000', (string) $color); + $this->assertTrue($color->isOpaque()); + + $this->assertSame(0, $color->getRed()); + $this->assertSame(0, $color->getGreen()); + $this->assertSame(0, $color->getBlue()); + } + public function testStripGBRImageHasGoodColors() { $color = $this @@ -619,6 +647,36 @@ abstract class AbstractImageTest extends ImagineTestCase $this->assertNotSame($originalMetadata, $clone->metadata(), 'The image\'s metadata is the same after cloning the image, but must be a new instance.'); } + /** + * @dataProvider provideVariousSources + */ + public function testResolutionOnSave($source) + { + $file = __DIR__ . '/test-resolution.jpg'; + + $image = $this->getImagine()->open($source); + $image->save($file, array( + 'resolution-units' => ImageInterface::RESOLUTION_PIXELSPERINCH, + 'resolution-x' => 150, + 'resolution-y' => 120, + 'resampling-filter' => ImageInterface::FILTER_LANCZOS, + )); + + $saved = $this->getImagine()->open($file); + $this->assertEquals(array('x' => 150, 'y' => 120), $this->getImageResolution($saved)); + unlink($file); + } + + public function provideVariousSources() + { + return array( + array(__DIR__.'/../../Fixtures/example.svg'), + array(__DIR__.'/../../Fixtures/100-percent-black.png'), + ); + } + + abstract protected function getImageResolution(ImageInterface $image); + private function getMonoLayeredImage() { return $this->getImagine()->open('tests/Imagine/Fixtures/google.png'); diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImagineTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImagineTest.php index 0f4ff55cf1..4efaafbab2 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImagineTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractImagineTest.php @@ -15,6 +15,7 @@ use Imagine\Image\Box; use Imagine\Image\Color; use Imagine\Test\ImagineTestCase; use Imagine\Image\Palette\RGB; +use Imagine\Image\ImagineInterface; abstract class AbstractImagineTest extends ImagineTestCase { @@ -31,13 +32,35 @@ abstract class AbstractImagineTest extends ImagineTestCase public function testShouldOpenAnImage() { + $source = 'tests/Imagine/Fixtures/google.png'; $factory = $this->getImagine(); - $image = $factory->open('tests/Imagine/Fixtures/google.png'); + $image = $factory->open($source); $size = $image->getSize(); $this->assertInstanceOf('Imagine\Image\ImageInterface', $image); $this->assertEquals(364, $size->getWidth()); $this->assertEquals(126, $size->getHeight()); + + $metadata = $image->metadata(); + + $this->assertEquals($source, $metadata['uri']); + $this->assertEquals(realpath($source), $metadata['filepath']); + } + + public function testShouldOpenAnHttpImage() + { + $factory = $this->getImagine(); + $image = $factory->open(self::HTTP_IMAGE); + $size = $image->getSize(); + + $this->assertInstanceOf('Imagine\Image\ImageInterface', $image); + $this->assertEquals(280, $size->getWidth()); + $this->assertEquals(140, $size->getHeight()); + + $metadata = $image->metadata(); + + $this->assertEquals(self::HTTP_IMAGE, $metadata['uri']); + $this->assertArrayNotHasKey('filepath', $metadata); } public function testShouldCreateImageFromString() @@ -49,18 +72,46 @@ abstract class AbstractImagineTest extends ImagineTestCase $this->assertInstanceOf('Imagine\Image\ImageInterface', $image); $this->assertEquals(364, $size->getWidth()); $this->assertEquals(126, $size->getHeight()); + + $metadata = $image->metadata(); + + $this->assertArrayNotHasKey('uri', $metadata); + $this->assertArrayNotHasKey('filepath', $metadata); } public function testShouldCreateImageFromResource() { + $source = 'tests/Imagine/Fixtures/google.png'; $factory = $this->getImagine(); - $resource = fopen('tests/Imagine/Fixtures/google.png', 'r'); + $resource = fopen($source, 'r'); $image = $factory->read($resource); $size = $image->getSize(); $this->assertInstanceOf('Imagine\Image\ImageInterface', $image); $this->assertEquals(364, $size->getWidth()); $this->assertEquals(126, $size->getHeight()); + + $metadata = $image->metadata(); + + $this->assertEquals($source, $metadata['uri']); + $this->assertEquals(realpath($source), $metadata['filepath']); + } + + public function testShouldCreateImageFromHttpResource() + { + $factory = $this->getImagine(); + $resource = fopen(self::HTTP_IMAGE, 'r'); + $image = $factory->read($resource); + $size = $image->getSize(); + + $this->assertInstanceOf('Imagine\Image\ImageInterface', $image); + $this->assertEquals(280, $size->getWidth()); + $this->assertEquals(140, $size->getHeight()); + + $metadata = $image->metadata(); + + $this->assertEquals(self::HTTP_IMAGE, $metadata['uri']); + $this->assertArrayNotHasKey('filepath', $metadata); } public function testShouldDetermineFontSize() @@ -79,6 +130,9 @@ abstract class AbstractImagineTest extends ImagineTestCase abstract protected function getEstimatedFontBox(); + /** + * @return ImagineInterface + */ abstract protected function getImagine(); abstract protected function isFontTestSupported(); diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractLayersTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractLayersTest.php index 93f8137c4b..81471a7e69 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractLayersTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Image/AbstractLayersTest.php @@ -16,6 +16,7 @@ use Imagine\Image\Point; use Imagine\Image\Palette\RGB; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\OutOfBoundsException; +use Imagine\Image\ImagineInterface; abstract class AbstractLayersTest extends \PHPUnit_Framework_TestCase { @@ -24,12 +25,9 @@ abstract class AbstractLayersTest extends \PHPUnit_Framework_TestCase $palette = new RGB(); $image = $this->getImagine()->create(new Box(20, 20), $palette->color('#FFFFFF')); foreach ($image->layers() as $layer) { - $layer->draw() - ->polygon( - array(new Point(0, 0),new Point(0, 20),new Point(20, 20),new Point(20, 0)), - $palette->color('#FF0000'), - true - ); + $layer + ->draw() + ->polygon(array(new Point(0, 0),new Point(0, 20),new Point(20, 20),new Point(20, 0)), $palette->color('#FF0000'), true); } $image->layers()->merge(); @@ -262,6 +260,10 @@ abstract class AbstractLayersTest extends \PHPUnit_Framework_TestCase } abstract protected function getImage($path = null); + + /** + * @return ImagineInterface + */ abstract protected function getImagine(); abstract protected function assertLayersEquals($expected, $actual); } diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Image/Metadata/MetadataReaderTestCase.php b/vendor/imagine/imagine/tests/Imagine/Test/Image/Metadata/MetadataReaderTestCase.php index 3d07e50695..3d2dd0bded 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Image/Metadata/MetadataReaderTestCase.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Image/Metadata/MetadataReaderTestCase.php @@ -12,10 +12,11 @@ namespace Imagine\Test\Image\Metadata; use Imagine\Image\Metadata\MetadataReaderInterface; +use Imagine\Test\ImagineTestCase; /** */ -abstract class MetadataReaderTestCase extends \PHPUnit_Framework_TestCase +abstract class MetadataReaderTestCase extends ImagineTestCase { /** * @return MetadataReaderInterface @@ -28,10 +29,20 @@ abstract class MetadataReaderTestCase extends \PHPUnit_Framework_TestCase $metadata = $this->getReader()->readFile($source); $this->assertInstanceOf('Imagine\Image\Metadata\MetadataBag', $metadata); $this->assertEquals(realpath($source), $metadata['filepath']); + $this->assertEquals($source, $metadata['uri']); + } + + public function testReadFromHttpFile() + { + $source = self::HTTP_IMAGE; + $metadata = $this->getReader()->readFile($source); + $this->assertInstanceOf('Imagine\Image\Metadata\MetadataBag', $metadata); + $this->assertFalse(isset($metadata['filepath'])); + $this->assertEquals($source, $metadata['uri']); } /** - * @expectedException Imagine\Exception\InvalidArgumentException + * @expectedException \Imagine\Exception\InvalidArgumentException * @expectedExceptionMessage File /path/to/no/file does not exist. */ public function testReadFromInvalidFileThrowsAnException() @@ -54,13 +65,16 @@ abstract class MetadataReaderTestCase extends \PHPUnit_Framework_TestCase public function testReadFromStream() { - $source = fopen(__DIR__ . '/../../../Fixtures/pixel-CMYK.jpg', 'r'); - $metadata = $this->getReader()->readStream($source); + $source = __DIR__ . '/../../../Fixtures/pixel-CMYK.jpg'; + $resource = fopen($source, 'r'); + $metadata = $this->getReader()->readStream($resource); $this->assertInstanceOf('Imagine\Image\Metadata\MetadataBag', $metadata); + $this->assertEquals(realpath($source), $metadata['filepath']); + $this->assertEquals($source, $metadata['uri']); } /** - * @expectedException Imagine\Exception\InvalidArgumentException + * @expectedException \Imagine\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid resource provided. */ public function testReadFromInvalidStreamThrowsAnException() diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/GrayTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/GrayTest.php index 174ae0cb4c..571242b06d 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/GrayTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/GrayTest.php @@ -20,9 +20,9 @@ class GrayTest extends AbstractColorTest public function provideOpaqueColors() { return array( - array(new Gray(new Grayscale(), array(12), 0)), - array(new Gray(new Grayscale(), array(0), 0)), - array(new Gray(new Grayscale(), array(255), 0)), + array(new Gray(new Grayscale(), array(12), 100)), + array(new Gray(new Grayscale(), array(0), 100)), + array(new Gray(new Grayscale(), array(255), 100)), ); } public function provideNotOpaqueColors() @@ -31,7 +31,7 @@ class GrayTest extends AbstractColorTest array($this->getColor()), array(new Gray(new Grayscale(), array(12), 23)), array(new Gray(new Grayscale(), array(0), 45)), - array(new Gray(new Grayscale(), array(255), 100)), + array(new Gray(new Grayscale(), array(255), 0)), ); } diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/RGBTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/RGBTest.php index fc85430853..a57cedbeca 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/RGBTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Image/Palette/Color/RGBTest.php @@ -20,9 +20,9 @@ class RGBTest extends AbstractColorTest public function provideOpaqueColors() { return array( - array(new RGB(new RGBPalette(), array(12, 123, 245), 0)), - array(new RGB(new RGBPalette(), array(0, 0, 0), 0)), - array(new RGB(new RGBPalette(), array(255, 255, 255), 0)), + array(new RGB(new RGBPalette(), array(12, 123, 245), 100)), + array(new RGB(new RGBPalette(), array(0, 0, 0), 100)), + array(new RGB(new RGBPalette(), array(255, 255, 255), 100)), ); } public function provideNotOpaqueColors() @@ -31,7 +31,7 @@ class RGBTest extends AbstractColorTest array($this->getColor()), array(new RGB(new RGBPalette(), array(12, 123, 245), 23)), array(new RGB(new RGBPalette(), array(0, 0, 0), 45)), - array(new RGB(new RGBPalette(), array(255, 255, 255), 100)), + array(new RGB(new RGBPalette(), array(255, 255, 255), 0)), ); } diff --git a/vendor/imagine/imagine/tests/Imagine/Test/Imagick/ImageTest.php b/vendor/imagine/imagine/tests/Imagine/Test/Imagick/ImageTest.php index 6333a10266..9f92b5d9e2 100644 --- a/vendor/imagine/imagine/tests/Imagine/Test/Imagick/ImageTest.php +++ b/vendor/imagine/imagine/tests/Imagine/Test/Imagick/ImageTest.php @@ -11,6 +11,7 @@ namespace Imagine\Test\Imagick; +use Imagine\Image\ImageInterface; use Imagine\Image\Metadata\MetadataBag; use Imagine\Imagick\Imagine; use Imagine\Imagick\Image; @@ -98,4 +99,9 @@ class ImageTest extends AbstractImageTest { return true; } + + protected function getImageResolution(ImageInterface $image) + { + return $image->getImagick()->getImageResolution(); + } } diff --git a/vendor/jmontoyaa/xhprof-service-provider b/vendor/jmontoyaa/xhprof-service-provider new file mode 160000 index 0000000000..5d5477c99f --- /dev/null +++ b/vendor/jmontoyaa/xhprof-service-provider @@ -0,0 +1 @@ +Subproject commit 5d5477c99f4d808edd200830fa2cecc8e8a86ae5 diff --git a/vendor/knplabs/knp-menu/doc/01-Basic-Menus.markdown b/vendor/knplabs/knp-menu/doc/01-Basic-Menus.markdown index fbb3bf1366..b610cb25cd 100644 --- a/vendor/knplabs/knp-menu/doc/01-Basic-Menus.markdown +++ b/vendor/knplabs/knp-menu/doc/01-Basic-Menus.markdown @@ -240,6 +240,8 @@ the second argument to the `render()` method: * `compressed` (default: `false`) * `allow_safe_labels` (default: `false`) * `clear_matcher` (default `true`): whether to clear the internal cache of the matcher after rendering +* `leaf_class` (default: `null`): class for leaf elements in your html tree +* `branch_class` (default: `null`): class for branch elements in your html tree >**NOTE** >When setting the `allow_safe_labels` option to `true`, you can specify that diff --git a/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php b/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php index f6400f9942..4d7db5d0ad 100644 --- a/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php +++ b/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php @@ -32,6 +32,8 @@ class ListRenderer extends Renderer implements RendererInterface 'compressed' => false, 'allow_safe_labels' => false, 'clear_matcher' => true, + 'leaf_class' => null, + 'branch_class' => null, ), $defaultOptions); parent::__construct($charset); @@ -135,6 +137,14 @@ class ListRenderer extends Renderer implements RendererInterface $class[] = $options['lastClass']; } + if ($item->hasChildren() && $options['depth'] !== 0) { + if (null !== $options['branch_class'] && $item->getDisplayChildren()) { + $class[] = $options['branch_class']; + } + } elseif (null !== $options['leaf_class']) { + $class[] = $options['leaf_class']; + } + // retrieve the attributes and put the final class string back on it $attributes = $item->getAttributes(); if (!empty($class)) { diff --git a/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/TwigRenderer.php b/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/TwigRenderer.php index bf0a18873e..4d379f05c7 100644 --- a/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/TwigRenderer.php +++ b/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/TwigRenderer.php @@ -36,6 +36,8 @@ class TwigRenderer implements RendererInterface 'compressed' => false, 'allow_safe_labels' => false, 'clear_matcher' => true, + 'leaf_class' => null, + 'branch_class' => null, ), $defaultOptions); } diff --git a/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig b/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig index 9e79e5d7c7..e07cc78f0b 100644 --- a/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig +++ b/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig @@ -63,6 +63,16 @@ {%- if item.actsLikeLast %} {%- set classes = classes|merge([options.lastClass]) %} {%- endif %} + + {# Mark item as "leaf" (no children) or as "branch" (has children that are displayed) #} + {% if item.hasChildren and options.depth is not sameas(0) %} + {% if options.branch_class is not empty and item.displayChildren %} + {%- set classes = classes|merge([options.branch_class]) %} + {% endif %} + {% elseif options.leaf_class is not empty %} + {%- set classes = classes|merge([options.leaf_class]) %} + {%- endif %} + {%- set attributes = item.attributes %} {%- if classes is not empty %} {%- set attributes = attributes|merge({'class': classes|join(' ')}) %} diff --git a/vendor/knplabs/knp-menu/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php b/vendor/knplabs/knp-menu/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php index 68ebf78918..926c63b7e7 100644 --- a/vendor/knplabs/knp-menu/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php +++ b/vendor/knplabs/knp-menu/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php @@ -312,4 +312,11 @@ abstract class AbstractRendererTest extends TestCase $rendered = '
    • Parent 1
    • Parent 2
    '; $this->assertEquals($rendered, $this->renderer->render($this->menu, array('depth' => 1,'matchingDepth' => 0))); } + + public function testLeafAndBranchRendering() + { + $rendered = '
    • Parent 1
    • Parent 2
    '; + + $this->assertEquals($rendered, $this->renderer->render($this->menu, array('depth' => 2, 'leaf_class' => 'leaf', 'branch_class' => 'branch'))); + } } diff --git a/vendor/knplabs/knp-snappy/README.markdown b/vendor/knplabs/knp-snappy/README.markdown index 3009134d26..0c6f48a137 100644 --- a/vendor/knplabs/knp-snappy/README.markdown +++ b/vendor/knplabs/knp-snappy/README.markdown @@ -102,46 +102,6 @@ $snappy = new Pdf($myProjectDirectory . '/vendor/h4cc/wkhtmltopdf-i386/bin/wkhtm $snappy = new Pdf($myProjectDirectory . '/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'); ``` -## Error handling - -From: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/1502, here is a table that explain exit codes returned by the -wkhtmltoimage binary: - -ExitCode | Explanation --------- | --------------- -0 | All OK -1 | PDF generated OK, but some request(s) did not return HTTP 200 -2 | Could not something something -X | Could not write PDF: File in use -Y | Could not write PDF: No write permission -Z | PDF generated OK, but some JavaScript requests(s) timeouted -A | Invalid arguments provided -B | Could not find input file(s) -C | Process timeout - -When you generate for example an Image, if the exit code of wkhtmltoimage is not 0 (All OK), Snappy raises a RuntimeException with the wkhtmltoimage exit code as code property of the exception. - -As explain here https://github.com/KnpLabs/KnpSnappyBundle/issues/33, in some case, you are ok with the exit code 1, -because the generated image result is acceptable even if some assets return a 404 http status. - -Example - -```php - -try { - $snappy = new Image('/usr/local/bin/wkhtmltoimage'); - $snappy->generateFromHtml($someHtml, '/tmp/preview.jpg'); -} catch (\RuntimeException $e) { - //Generation terminated, but it should be in degraded mode - if (1 == $e->getCode()) { - $this->logger->warning(); - } else { - // Generation failed - $this->logger->error(); - throw $e; - } -} -``` ## Credits diff --git a/vendor/knplabs/knp-snappy/src/Knp/Snappy/AbstractGenerator.php b/vendor/knplabs/knp-snappy/src/Knp/Snappy/AbstractGenerator.php index a3761391b4..ad098d9889 100644 --- a/vendor/knplabs/knp-snappy/src/Knp/Snappy/AbstractGenerator.php +++ b/vendor/knplabs/knp-snappy/src/Knp/Snappy/AbstractGenerator.php @@ -307,7 +307,7 @@ abstract class AbstractGenerator implements GeneratorInterface .'stdout: "%s"'."\n" .'command: %s.', $status, $stderr, $stdout, $command - ), $status); + )); } } diff --git a/vendor/knplabs/knp-snappy/test/Knp/Snappy/AbstractGeneratorTest.php b/vendor/knplabs/knp-snappy/test/Knp/Snappy/AbstractGeneratorTest.php index f683692d8c..81b4c246d6 100644 --- a/vendor/knplabs/knp-snappy/test/Knp/Snappy/AbstractGeneratorTest.php +++ b/vendor/knplabs/knp-snappy/test/Knp/Snappy/AbstractGeneratorTest.php @@ -613,7 +613,6 @@ class AbstractGeneratorTest extends \PHPUnit_Framework_TestCase $r->invokeArgs($media, array(1, '', 'Could not connect to X', 'the command')); $this->fail('1 status means failure'); } catch (\RuntimeException $e) { - $this->assertEquals(1, $e->getCode()); $this->anything('1 status means failure'); } } diff --git a/vendor/leafo/lessphp/.travis.yml b/vendor/leafo/lessphp/.travis.yml index 810c42bbee..586a11c15c 100644 --- a/vendor/leafo/lessphp/.travis.yml +++ b/vendor/leafo/lessphp/.travis.yml @@ -14,6 +14,4 @@ script: - phpunit tests matrix: - allow_failures: - - php: hhvm fast_finish: true diff --git a/vendor/leafo/lessphp/lessc.inc.php b/vendor/leafo/lessphp/lessc.inc.php index 9631a99f61..2f407c7fc8 100644 --- a/vendor/leafo/lessphp/lessc.inc.php +++ b/vendor/leafo/lessphp/lessc.inc.php @@ -346,9 +346,9 @@ class lessc { $other = array_merge($other, $stack); if ($split) { - return array(array_merge($vars, $imports), $other); + return array(array_merge($imports, $vars), $other); } else { - return array_merge($vars, $imports, $other); + return array_merge($imports, $vars, $other); } } @@ -819,7 +819,7 @@ class lessc { * The input is expected to be reduced. This function will not work on * things like expressions and variables. */ - protected function compileValue($value) { + public function compileValue($value) { switch ($value[0]) { case 'list': // [1] - delimiter diff --git a/vendor/monolog/monolog/CHANGELOG.mdown b/vendor/monolog/monolog/CHANGELOG.mdown index a657dbc293..d675996969 100644 --- a/vendor/monolog/monolog/CHANGELOG.mdown +++ b/vendor/monolog/monolog/CHANGELOG.mdown @@ -1,3 +1,22 @@ +### 1.9.1 (2014-04-24) + + * Fixed regression in RotatingFileHandler file permissions + * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records + * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative + +### 1.9.0 (2014-04-20) + + * Added LogEntriesHandler to send logs to a LogEntries account + * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler + * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes + * Added support for table formatting in FirePHPHandler via the table context key + * Added a TagProcessor to add tags to records, and support for tags in RavenHandler + * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files + * Added sound support to the PushoverHandler + * Fixed multi-threading support in StreamHandler + * Fixed empty headers issue when ChromePHPHandler received no records + * Fixed default format of the ErrorLogHandler + ### 1.8.0 (2014-03-23) * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them diff --git a/vendor/monolog/monolog/README.mdown b/vendor/monolog/monolog/README.mdown index 1179d57ee9..fd28a473a5 100644 --- a/vendor/monolog/monolog/README.mdown +++ b/vendor/monolog/monolog/README.mdown @@ -136,6 +136,7 @@ Handlers - _LogglyHandler_: Logs records to a [Loggly](http://www.loggly.com/) account. - _RollbarHandler_: Logs records to a [Rollbar](https://rollbar.com/) account. - _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server. +- _LogEntriesHandler_: Logs records to a [LogEntries](http://logentries.com/) account. ### Logging in development @@ -206,10 +207,14 @@ Processors - _ProcessIdProcessor_: Adds the process id to a log record. - _UidProcessor_: Adds a unique identifier to a log record. - _GitProcessor_: Adds the current git branch and commit to a log record. +- _TagProcessor_: Adds an array of predefined tags to a log record. Utilities --------- +- _Registry_: The `Monolog\Registry` class lets you configure global loggers that you + can then statically access from anywhere. It is not really a best practice but can + help in some older codebases or for ease of use. - _ErrorHandler_: The `Monolog\ErrorHandler` class allows you to easily register a Logger instance as an exception handler, error handler or fatal error handler. - _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log @@ -223,8 +228,7 @@ About Requirements ------------ -- Any flavor of PHP 5.3 or above should do -- [optional] PHPUnit 3.5+ to execute the test suite (phpunit --version) +- Monolog works with PHP 5.3 or above, and is also tested to work with HHVM. Submitting bugs and feature requests ------------------------------------ diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json index 2b059f31dc..bcbe1b62a8 100644 --- a/vendor/monolog/monolog/composer.json +++ b/vendor/monolog/monolog/composer.json @@ -39,7 +39,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.8.x-dev" + "dev-master": "1.9.x-dev" } } } diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php index d870767e0f..f9cca00413 100644 --- a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php +++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php @@ -123,7 +123,7 @@ class ErrorHandler { $this->logger->log( $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel, - 'Uncaught exception', + sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()), array('exception' => $e) ); diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php index 206ec2499b..ac6f58c0de 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -20,18 +20,19 @@ namespace Monolog\Formatter; */ class JsonFormatter implements FormatterInterface { - - protected $batch_mode; + protected $batchMode; + protected $appendNewline; const BATCH_MODE_JSON = 1; const BATCH_MODE_NEWLINES = 2; /** - * @param int $batch_mode + * @param int $batchMode */ - public function __construct($batch_mode = self::BATCH_MODE_JSON) + public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true) { - $this->batch_mode = $batch_mode; + $this->batchMode = $batchMode; + $this->appendNewline = $appendNewline; } /** @@ -45,7 +46,17 @@ class JsonFormatter implements FormatterInterface */ public function getBatchMode() { - return $this->batch_mode; + return $this->batchMode; + } + + /** + * True if newlines are appended to every formatted record + * + * @return bool + */ + public function isAppendingNewlines() + { + return $this->appendNewline; } /** @@ -53,7 +64,7 @@ class JsonFormatter implements FormatterInterface */ public function format(array $record) { - return json_encode($record); + return json_encode($record) . ($this->appendNewline ? "\n" : ''); } /** @@ -61,15 +72,13 @@ class JsonFormatter implements FormatterInterface */ public function formatBatch(array $records) { - switch ($this->batch_mode) { - + switch ($this->batchMode) { case static::BATCH_MODE_NEWLINES: return $this->formatBatchNewlines($records); case static::BATCH_MODE_JSON: default: return $this->formatBatchJson($records); - } } @@ -95,11 +104,13 @@ class JsonFormatter implements FormatterInterface { $instance = $this; + $oldNewline = $this->appendNewline; + $this->appendNewline = false; array_walk($records, function (&$value, $key) use ($instance) { $value = $instance->format($value); }); + $this->appendNewline = $oldNewline; return implode("\n", $records); } - } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php index 5f2709850a..5ef0d9fae2 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php @@ -18,16 +18,15 @@ namespace Monolog\Formatter; */ class LogglyFormatter extends JsonFormatter { - /** * Overrides the default batch mode to new lines for compatibility with the * Loggly bulk API. * - * @param integer $batch_mode + * @param integer $batchMode */ - public function __construct($batch_mode = self::BATCH_MODE_NEWLINES) + public function __construct($batchMode = self::BATCH_MODE_NEWLINES, $appendNewline = false) { - parent::__construct($batch_mode); + parent::__construct($batchMode, $appendNewline); } /** @@ -40,10 +39,9 @@ class LogglyFormatter extends JsonFormatter { if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTime)) { $record["timestamp"] = $record["datetime"]->format("c"); - // @todo unset the 'datetime' parameter, retained for BC + // TODO 2.0 unset the 'datetime' parameter, retained for BC } return parent::format($record); } - } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php index b084c4a529..7a7b3b3ca7 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php @@ -85,33 +85,42 @@ class LogstashFormatter extends NormalizerFormatter protected function formatV0(array $record) { + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } $message = array( '@timestamp' => $record['datetime'], - '@message' => $record['message'], - '@tags' => array($record['channel']), '@source' => $this->systemName, - '@fields' => array( - 'channel' => $record['channel'], - 'level' => $record['level'] - ) + '@fields' => array() ); - + if (isset($record['message'])) { + $message['@message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['@tags'] = array($record['channel']); + $message['@fields']['channel'] = $record['channel']; + } + if (isset($record['level'])) { + $message['@fields']['level'] = $record['level']; + } if ($this->applicationName) { $message['@type'] = $this->applicationName; } - if (isset($record['extra']['server'])) { $message['@source_host'] = $record['extra']['server']; } if (isset($record['extra']['url'])) { $message['@source_path'] = $record['extra']['url']; } - foreach ($record['extra'] as $key => $val) { - $message['@fields'][$this->extraPrefix . $key] = $val; + if (!empty($record['extra'])) { + foreach ($record['extra'] as $key => $val) { + $message['@fields'][$this->extraPrefix . $key] = $val; + } } - - foreach ($record['context'] as $key => $val) { - $message['@fields'][$this->contextPrefix . $key] = $val; + if (!empty($record['context'])) { + foreach ($record['context'] as $key => $val) { + $message['@fields'][$this->contextPrefix . $key] = $val; + } } return $message; @@ -119,26 +128,36 @@ class LogstashFormatter extends NormalizerFormatter protected function formatV1(array $record) { + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } $message = array( '@timestamp' => $record['datetime'], '@version' => 1, - 'message' => $record['message'], 'host' => $this->systemName, - 'type' => $record['channel'], - 'channel' => $record['channel'], - 'level' => $record['level_name'] ); - + if (isset($record['message'])) { + $message['message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['type'] = $record['channel']; + $message['channel'] = $record['channel']; + } + if (isset($record['level_name'])) { + $message['level'] = $record['level_name']; + } if ($this->applicationName) { $message['type'] = $this->applicationName; } - - foreach ($record['extra'] as $key => $val) { - $message[$this->extraPrefix . $key] = $val; + if (!empty($record['extra'])) { + foreach ($record['extra'] as $key => $val) { + $message[$this->extraPrefix . $key] = $val; + } } - - foreach ($record['context'] as $key => $val) { - $message[$this->contextPrefix . $key] = $val; + if (!empty($record['context'])) { + foreach ($record['context'] as $key => $val) { + $message[$this->contextPrefix . $key] = $val; + } } return $message; diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php index b3e9b18644..654710a8d1 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php @@ -22,6 +22,8 @@ use Monolog\Logger; */ class WildfireFormatter extends NormalizerFormatter { + const TABLE = 'table'; + /** * Translates Monolog log levels to Wildfire levels. */ @@ -67,13 +69,22 @@ class WildfireFormatter extends NormalizerFormatter $message = reset($message); } + if (isset($record['context'][self::TABLE])) { + $type = 'TABLE'; + $label = $record['channel'] .': '. $record['message']; + $message = $record['context'][self::TABLE]; + } else { + $type = $this->logLevels[$record['level']]; + $label = $record['channel']; + } + // Create JSON object describing the appearance of the message in the console $json = $this->toJson(array( array( - 'Type' => $this->logLevels[$record['level']], + 'Type' => $type, 'File' => $file, 'Line' => $line, - 'Label' => $record['channel'], + 'Label' => $label, ), $message, ), $handleError); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php index 00703436c5..2db0d08d65 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php @@ -64,6 +64,6 @@ class AmqpHandler extends AbstractProcessingHandler */ protected function getDefaultFormatter() { - return new JsonFormatter(); + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php index 6a80273398..183d239a64 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php @@ -28,6 +28,7 @@ class BufferHandler extends AbstractHandler protected $bufferLimit; protected $flushOnOverflow; protected $buffer = array(); + protected $initialized = false; /** * @param HandlerInterface $handler Handler. @@ -42,9 +43,6 @@ class BufferHandler extends AbstractHandler $this->handler = $handler; $this->bufferLimit = (int) $bufferLimit; $this->flushOnOverflow = $flushOnOverflow; - - // __destructor() doesn't get called on Fatal errors - register_shutdown_function(array($this, 'close')); } /** @@ -56,6 +54,12 @@ class BufferHandler extends AbstractHandler return false; } + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { if ($this->flushOnOverflow) { $this->flush(); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php index 705400b15c..ff7a7809d0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php @@ -100,15 +100,19 @@ class ChromePHPHandler extends AbstractProcessingHandler */ protected function send() { - if (self::$overflowed) { + if (self::$overflowed || !self::$sendHeaders) { return; } if (!self::$initialized) { + self::$initialized = true; + self::$sendHeaders = $this->headersAccepted(); - self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; + if (!self::$sendHeaders) { + return; + } - self::$initialized = true; + self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; } $json = @json_encode(self::$json); @@ -130,7 +134,9 @@ class ChromePHPHandler extends AbstractProcessingHandler $data = base64_encode(utf8_encode($json)); } - $this->sendHeader(self::HEADER_NAME, $data); + if (trim($data) !== '') { + $this->sendHeader(self::HEADER_NAME, $data); + } } /** @@ -153,8 +159,11 @@ class ChromePHPHandler extends AbstractProcessingHandler */ protected function headersAccepted() { - return !isset($_SERVER['HTTP_USER_AGENT']) - || preg_match('{\bChrome/\d+[\.\d+]*\b}', $_SERVER['HTTP_USER_AGENT']); + if (empty($_SERVER['HTTP_USER_AGENT'])) { + return false; + } + + return preg_match('{\bChrome/\d+[\.\d+]*\b}', $_SERVER['HTTP_USER_AGENT']); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php index 4877b345d6..b3687c3d87 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php @@ -67,6 +67,6 @@ class CouchDBHandler extends AbstractProcessingHandler */ protected function getDefaultFormatter() { - return new JsonFormatter(); + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php index 9e11c3b725..038db4e594 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php @@ -11,6 +11,7 @@ namespace Monolog\Handler; +use Monolog\Formatter\LineFormatter; use Monolog\Logger; /** @@ -53,6 +54,14 @@ class ErrorLogHandler extends AbstractProcessingHandler ); } + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); + } + /** * {@inheritdoc} */ diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php index 16276fb021..597db732ad 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php @@ -38,7 +38,7 @@ class FilterHandler extends AbstractHandler /** * @param callable|HandlerInterface $handler Handler or factory callable($record, $this). * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided - * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is an array + * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true) @@ -58,7 +58,7 @@ class FilterHandler extends AbstractHandler /** * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided - * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is an array + * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array */ public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php index 46a039ad72..fee4795088 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php @@ -131,19 +131,28 @@ class FirePHPHandler extends AbstractProcessingHandler */ protected function write(array $record) { + if (!self::$sendHeaders) { + return; + } + // WildFire-specific headers must be sent prior to any messages if (!self::$initialized) { + self::$initialized = true; + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } foreach ($this->getInitHeaders() as $header => $content) { $this->sendHeader($header, $content); } - - self::$initialized = true; } $header = $this->createRecordHeader($record); - $this->sendHeader(key($header), current($header)); + if (trim(current($header)) !== '') { + $this->sendHeader(key($header), current($header)); + } } /** @@ -153,9 +162,11 @@ class FirePHPHandler extends AbstractProcessingHandler */ protected function headersAccepted() { - return !isset($_SERVER['HTTP_USER_AGENT']) - || preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT']) - || isset($_SERVER['HTTP_X_FIREPHP_VERSION']); + if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + + return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php new file mode 100644 index 0000000000..18b3fa4f68 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * @author Robert Kaufmann III + */ +class LogEntriesHandler extends SocketHandler +{ + + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by LogEntries + * @param boolean $useSSL Whether or not SSL encryption should be used. + * @param int $level The minimum logging level to trigger this handler + * @param boolean $bubble Whether or not messages that are handled should bubble up the stack. + * + * @throws MissingExtensionExcpetion If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true) + { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); + } + + $endpoint = $useSSL ? 'ssl://api.logentries.com:20000' : 'data.logentries.com:80'; + parent::__construct($endpoint, $level, $bubble); + $this->logToken = $token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + return $this->logToken . ' ' . $record['formatted']; + } + +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php index b1dff9b64f..2c80afe7a7 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -31,6 +31,17 @@ class PushoverHandler extends SocketHandler private $highPriorityLevel; private $emergencyLevel; + /** + * Sounds the api supports by default + * @see https://pushover.net/api#sounds + * @var array + */ + private $sounds = array( + 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', + 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', + 'persistent', 'echo', 'updown', 'none', + ); + /** * @param string $token Pushover api token * @param string|array $users Pushover user id or array of ids the message will be sent to @@ -90,6 +101,12 @@ class PushoverHandler extends SocketHandler $dataArray['priority'] = 1; } + if (isset($record['context']['sound']) && in_array($record['context']['sound'], $this->sounds)) { + $dataArray['sound'] = $record['context']['sound']; + } elseif (isset($record['extra']['sound']) && in_array($record['extra']['sound'], $this->sounds)) { + $dataArray['sound'] = $record['extra']['sound']; + } + return http_build_query($dataArray); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php index 98e91691ac..b8f701eac2 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php @@ -129,6 +129,15 @@ class RavenHandler extends AbstractProcessingHandler { $options = array(); $options['level'] = $this->logLevels[$record['level']]; + $options['tags'] = array(); + if (!empty($record['extra']['tags'])) { + $options['tags'] = array_merge($options['tags'], $record['extra']['tags']); + unset($record['extra']['tags']); + } + if (!empty($record['context']['tags'])) { + $options['tags'] = array_merge($options['tags'], $record['context']['tags']); + unset($record['context']['tags']); + } if (!empty($record['context'])) { $options['extra']['context'] = $record['context']; } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php index a02ff516ee..6213d6ee59 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -33,11 +33,12 @@ class RotatingFileHandler extends StreamHandler /** * @param string $filename - * @param integer $maxFiles The maximal amount of files to keep (0 means unlimited) - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param integer $maxFiles The maximal amount of files to keep (0 means unlimited) + * @param integer $level The minimum logging level at which this handler will be triggered + * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $filePermissions Optional file permissions (default (0644) are only for owner read/write) */ - public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true) + public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null) { $this->filename = $filename; $this->maxFiles = (int) $maxFiles; @@ -45,7 +46,7 @@ class RotatingFileHandler extends StreamHandler $this->filenameFormat = '{filename}-{date}'; $this->dateFormat = 'Y-m-d'; - parent::__construct($this->getTimedFilename(), $level, $bubble); + parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission); } /** @@ -64,6 +65,8 @@ class RotatingFileHandler extends StreamHandler { $this->filenameFormat = $filenameFormat; $this->dateFormat = $dateFormat; + $this->url = $this->getTimedFilename(); + $this->close(); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php index 281752949b..5c8fc1fc43 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -25,13 +25,15 @@ class StreamHandler extends AbstractProcessingHandler protected $stream; protected $url; private $errorMessage; + protected $filePermission; /** * @param string $stream - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param integer $level The minimum logging level at which this handler will be triggered + * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $filePermissions Optional file permissions (default (0644) are only for owner read/write) */ - public function __construct($stream, $level = Logger::DEBUG, $bubble = true) + public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null) { parent::__construct($level, $bubble); if (is_resource($stream)) { @@ -39,6 +41,8 @@ class StreamHandler extends AbstractProcessingHandler } else { $this->url = $stream; } + + $this->filePermission = $filePermission; } /** @@ -57,13 +61,16 @@ class StreamHandler extends AbstractProcessingHandler */ protected function write(array $record) { - if (null === $this->stream) { + if (!is_resource($this->stream)) { if (!$this->url) { throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); } $this->errorMessage = null; set_error_handler(array($this, 'customErrorHandler')); $this->stream = fopen($this->url, 'a'); + if ($this->filePermission !== null) { + @chmod($this->url, $this->filePermission); + } restore_error_handler(); if (!is_resource($this->stream)) { $this->stream = null; diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php index 4a74db3512..f6d7f809c3 100644 --- a/vendor/monolog/monolog/src/Monolog/Logger.php +++ b/vendor/monolog/monolog/src/Monolog/Logger.php @@ -103,7 +103,7 @@ class Logger implements LoggerInterface ); /** - * @var DateTimeZone + * @var \DateTimeZone */ protected static $timezone; diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php index e48672bf2e..552fd7095a 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php @@ -26,7 +26,7 @@ class MemoryPeakUsageProcessor extends MemoryProcessor public function __invoke(array $record) { $bytes = memory_get_peak_usage($this->realUsage); - $formatted = self::formatBytes($bytes); + $formatted = $this->formatBytes($bytes); $record['extra'] = array_merge( $record['extra'], diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php index 7551043e12..7e53f47018 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php @@ -18,26 +18,40 @@ namespace Monolog\Processor; */ abstract class MemoryProcessor { + /** + * @var boolean If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. + */ protected $realUsage; /** - * @param boolean $realUsage + * @var boolean If true, then format memory size to human readable string (MB, KB, B depending on size) */ - public function __construct($realUsage = true) + protected $useFormatting; + + /** + * @param boolean $realUsage Set this to true to get the real size of memory allocated from system. + * @param boolean $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + public function __construct($realUsage = true, $useFormatting = true) { $this->realUsage = (boolean) $realUsage; + $this->useFormatting = (boolean) $useFormatting; } /** - * Formats bytes into a human readable string + * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is * - * @param int $bytes - * @return string + * @param int $bytes + * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is */ - protected static function formatBytes($bytes) + protected function formatBytes($bytes) { $bytes = (int) $bytes; + if (!$this->useFormatting) { + return $bytes; + } + if ($bytes > 1024*1024) { return round($bytes/1024/1024, 2).' MB'; } elseif ($bytes > 1024) { diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php index 2c4a8079f0..0c4dd9ab56 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php @@ -26,7 +26,7 @@ class MemoryUsageProcessor extends MemoryProcessor public function __invoke(array $record) { $bytes = memory_get_usage($this->realUsage); - $formatted = self::formatBytes($bytes); + $formatted = $this->formatBytes($bytes); $record['extra'] = array_merge( $record['extra'], diff --git a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php new file mode 100644 index 0000000000..2784cef4eb --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds a tags array into record + * + * @author Martijn Riemers + */ +class TagProcessor +{ + private $tags; + + public function __construct(array $tags = array()) + { + $this->tags = $tags; + } + + public function __invoke(array $record) + { + $record['extra']['tags'] = $this->tags; + + return $record; + } +} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php index 39cb1c5fa6..d18c4763d5 100644 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php @@ -19,13 +19,16 @@ class JsonFormatterTest extends TestCase /** * @covers Monolog\Formatter\JsonFormatter::__construct * @covers Monolog\Formatter\JsonFormatter::getBatchMode + * @covers Monolog\Formatter\JsonFormatter::isAppendingNewlines */ public function testConstruct() { $formatter = new JsonFormatter(); $this->assertEquals(JsonFormatter::BATCH_MODE_JSON, $formatter->getBatchMode()); - $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES); + $this->assertEquals(true, $formatter->isAppendingNewlines()); + $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, false); $this->assertEquals(JsonFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode()); + $this->assertEquals(false, $formatter->isAppendingNewlines()); } /** @@ -35,6 +38,10 @@ class JsonFormatterTest extends TestCase { $formatter = new JsonFormatter(); $record = $this->getRecord(); + $this->assertEquals(json_encode($record)."\n", $formatter->format($record)); + + $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + $record = $this->getRecord(); $this->assertEquals(json_encode($record), $formatter->format($record)); } diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php index 0b07e330fd..52f15a3607 100644 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php @@ -108,4 +108,35 @@ class WildfireFormatterTest extends \PHPUnit_Framework_TestCase $wildfire->formatBatch(array($record)); } + + /** + * @covers Monolog\Formatter\WildfireFormatter::format + */ + public function testTableFormat() + { + $wildfire = new WildfireFormatter(); + $record = array( + 'level' => Logger::ERROR, + 'level_name' => 'ERROR', + 'channel' => 'table-channel', + 'context' => array( + WildfireFormatter::TABLE => array( + array('col1', 'col2', 'col3'), + array('val1', 'val2', 'val3'), + array('foo1', 'foo2', 'foo3'), + array('bar1', 'bar2', 'bar3'), + ), + ), + 'datetime' => new \DateTime("@0"), + 'extra' => array(), + 'message' => 'table-message', + ); + + $message = $wildfire->format($record); + + $this->assertEquals( + '171|[{"Type":"TABLE","File":"","Line":"","Label":"table-channel: table-message"},[["col1","col2","col3"],["val1","val2","val3"],["foo1","foo2","foo3"],["bar1","bar2","bar3"]]]|', + $message + ); + } } diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php index 9fa4d50682..2f55faf8e1 100644 --- a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php @@ -22,6 +22,7 @@ class ChromePHPHandlerTest extends TestCase protected function setUp() { TestChromePHPHandler::reset(); + $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; Chrome/1.0'; } public function testHeaders() @@ -124,6 +125,7 @@ class TestChromePHPHandler extends ChromePHPHandler { self::$initialized = false; self::$overflowed = false; + self::$sendHeaders = true; self::$json['rows'] = array(); } diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php index 2b7b76d984..0eb10a63fc 100644 --- a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php @@ -22,6 +22,7 @@ class FirePHPHandlerTest extends TestCase public function setUp() { TestFirePHPHandler::reset(); + $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; FirePHP/1.0'; } public function testHeaders() @@ -79,6 +80,7 @@ class TestFirePHPHandler extends FirePHPHandler public static function reset() { self::$initialized = false; + self::$sendHeaders = true; self::$messageIndex = 1; } diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php new file mode 100644 index 0000000000..7af60be845 --- /dev/null +++ b/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\TestCase; +use Monolog\Logger; + +/** + * @author Robert Kaufmann III + */ +class LogEntriesHandlerTest extends TestCase +{ + /** + * @var resource + */ + private $res; + + /** + * @var LogEntriesHandler + */ + private $handler; + + public function testWriteContent() + { + $this->createHandler(); + $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test')); + + fseek($this->res, 0); + $content = fread($this->res, 1024); + + $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content); + } + + public function testWriteBatchContent() + { + $records = array( + $this->getRecord(), + $this->getRecord(), + $this->getRecord() + ); + $this->createHandler(); + $this->handler->handleBatch($records); + + fseek($this->res, 0); + $content = fread($this->res, 1024); + + $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content); + } + + private function createHandler() + { + $useSSL = extension_loaded('openssl'); + $args = array('testToken', $useSSL, Logger::DEBUG, true); + $this->res = fopen('php://memory', 'a'); + $this->handler = $this->getMock( + '\Monolog\Handler\LogEntriesHandler', + array('fsockopen', 'streamSetTimeout', 'closeSocket'), + $args + ); + + $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($this->handler, 'localhost:1234'); + + $this->handler->expects($this->any()) + ->method('fsockopen') + ->will($this->returnValue($this->res)); + $this->handler->expects($this->any()) + ->method('streamSetTimeout') + ->will($this->returnValue(true)); + $this->handler->expects($this->any()) + ->method('closeSocket') + ->will($this->returnValue(true)); + } +} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php index bde55b171c..8fe86961af 100644 --- a/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php @@ -73,6 +73,18 @@ class RavenHandlerTest extends TestCase $this->assertContains($record['message'], $ravenClient->lastData['message']); } + public function testTag() + { + $ravenClient = $this->getRavenClient(); + $handler = $this->getHandler($ravenClient); + + $tags = array(1, 2, 'foo'); + $record = $this->getRecord(Logger::INFO, "test", array('tags' => $tags)); + $handler->handle($record); + + $this->assertEquals($tags, $ravenClient->lastData['tags']); + } + public function testException() { $ravenClient = $this->getRavenClient(); diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php index 4bdf22c363..eb666144ea 100644 --- a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php @@ -26,4 +26,17 @@ class MemoryPeakUsageProcessorTest extends TestCase $this->assertArrayHasKey('memory_peak_usage', $record['extra']); $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']); } + + /** + * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke + * @covers Monolog\Processor\MemoryProcessor::formatBytes + */ + public function testProcessorWithoutFormatting() + { + $processor = new MemoryPeakUsageProcessor(true, false); + $record = $processor($this->getRecord()); + $this->assertArrayHasKey('memory_peak_usage', $record['extra']); + $this->assertInternalType('int', $record['extra']['memory_peak_usage']); + $this->assertGreaterThan(0, $record['extra']['memory_peak_usage']); + } } diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php index a30d6de630..4692dbfc7e 100644 --- a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php +++ b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php @@ -26,4 +26,17 @@ class MemoryUsageProcessorTest extends TestCase $this->assertArrayHasKey('memory_usage', $record['extra']); $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']); } + + /** + * @covers Monolog\Processor\MemoryUsageProcessor::__invoke + * @covers Monolog\Processor\MemoryProcessor::formatBytes + */ + public function testProcessorWithoutFormatting() + { + $processor = new MemoryUsageProcessor(true, false); + $record = $processor($this->getRecord()); + $this->assertArrayHasKey('memory_usage', $record['extra']); + $this->assertInternalType('int', $record['extra']['memory_usage']); + $this->assertGreaterThan(0, $record['extra']['memory_usage']); + } } diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php new file mode 100644 index 0000000000..851a9dc2af --- /dev/null +++ b/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\TestCase; + +class TagProcessorTest extends TestCase +{ + /** + * @covers Monolog\Processor\TagProcessor::__invoke + */ + public function testProcessor() + { + $tags = array(1, 2, 3); + $processor = new TagProcessor($tags); + $record = $processor($this->getRecord()); + + $this->assertEquals($tags, $record['extra']['tags']); + } +} diff --git a/vendor/patchwork/utf8/.travis.yml b/vendor/patchwork/utf8/.travis.yml new file mode 100644 index 0000000000..315599c911 --- /dev/null +++ b/vendor/patchwork/utf8/.travis.yml @@ -0,0 +1,16 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - hhvm + +script: + - phpunit --coverage-text + - phpunit --group unicode --coverage-text + +matrix: + allow_failures: + - php: hhvm + fast_finish: true diff --git a/vendor/patchwork/utf8/CHANGELOG.md b/vendor/patchwork/utf8/CHANGELOG.md new file mode 100644 index 0000000000..3289f8db57 --- /dev/null +++ b/vendor/patchwork/utf8/CHANGELOG.md @@ -0,0 +1,110 @@ +## v1.1.21 (2014-03-26) + +- fix #18 u::wordwrap() now relies on native behavior + +## v1.1.20 (2014-03-01) +## v1.1.19 (2014-03-01) + +- fix mb_regex_encoding() being disabled on some hosting providers + +## v1.1.18 (2014-02-02) + +- require PCRE>=7.3, the first that correctly checks UTF-8 validity +- enable HHVM on Travis CI + +## v1.1.17 (2014-01-02) + +- enable Travis CI and SensioLabsInsight +- add shims for mb_check_encoding, mb_detect_encoding, mb_detect_order, + mb_language and mb_encoding_aliases +- mbstring shim fix: alias UTF8 to UTF-8 +- more tests + +## v1.1.16 (2013-12-06) + +- fix $_FILES bootup filtering +- fix mbstring shim behavior with invalid utf8 strings + +## v1.1.15 (2013-11-23) + +- u::toAscii() is now locale sensitive and allows a substitution character +- use LSB for more extension openness +- handle null for mb_substr() shim length as in PHP 5.4.8 +- fix casts to string +- fix mbstring MB_CASE_TITLE shim on edge case +- small optimizations +- add a changelog + +## v1.1.14 (2013-11-04) + +- set default_charset to UTF-8 at bootup +- remove bootup PCRE warning +- fix iconv internal_encoding shim +- fix bootup dependencies +- add tests for normalizers consts +- readme update + +## v1.1.13 (2013-10-11) + +- new u::filter(): normalizes to UTF-8 NFC, converting from CP-1252 when needed +- new u::json_decode(), u::filter_input() and u::filter_input_array() for NFC safeness +- reference Unicode 6.3 +- more tests +- readme update + +## v1.1.12 (2013-10-03) + +- new Patchwork\TurkishUtf8 class extends Patchwork\Utf8 with Turkish specifics +- expose Patchwork\Utf8\Bootup::filterString() for UF-8 NFC strings normalization +- normalize inputs EOL to work around https://bugs.php.net/65732 +- update composer.json + +## v1.1.11 (2013-08-19) + +- updates related to PHP bugs 52211 and 61860 +- fixes and tests for iconv shim +- fixes and tests for mbstring shim + +## v1.1.10 (2013-08-13) + +- update .gitattributes export-ignore +- fixes and tests for intl::grapheme_extract() shim +- fixes and tests for iconv shim +- fixes and tests for mbstring shim + +## v1.1.9 (2013-08-04) + +- know that PHP bug 61860 has been fixed in 5.5.1 +- fix intl::grapheme_strlen() shim on edge case +- fix case sensitive encoding checks for mbstring shim +- some more fixes, tests and optimizations + +## v1.1.8 since v1.1.0 (2013-05-24) + +- filter leading combining chars in inputs for NFC safeness +- fixes, tests and optimizations +- readme update + +## v1.1.0 (2013-04-18) + +- PSR-0 autoloading and explicit bootup configuration is now required + +## v1.0.6 since v1.0.0 (2013-04-22) + +- add extra characters for ASCII transliterations +- move bootup stages in namespaced functions for greater modularity +- NFC normalization for autoglobal inputs +- better setlocale() initialization +- fix fatal error caused by multiple bootup inclusion +- fix bootup + +## v1.0.0 (2012-10-15) + +- first official release of a work started in 2007 +- Apache v2.0 / GPL v2.0 dual-licensed +- PHP portability implementations for mbstring, iconv, intl grapheme_*() and utf8_encode/decode() +- Unicode compliant and portable Normalizer +- grapheme clusters aware UTF-8 handling string functions replica +- PHP runtime environment configuration for UTF-8 +- extra functions for UTF-8 validity checks, transliterations and case folding +- covered by unit tests diff --git a/vendor/patchwork/utf8/README.md b/vendor/patchwork/utf8/README.md new file mode 100644 index 0000000000..b4735d1413 --- /dev/null +++ b/vendor/patchwork/utf8/README.md @@ -0,0 +1,145 @@ +Patchwork UTF-8 for PHP +======================= + +[![Latest Stable Version](https://poser.pugx.org/patchwork/utf8/v/stable.png)](https://packagist.org/packages/patchwork/utf8) +[![Total Downloads](https://poser.pugx.org/patchwork/utf8/downloads.png)](https://packagist.org/packages/patchwork/utf8) +[![Build Status](https://secure.travis-ci.org/nicolas-grekas/Patchwork-UTF8.png?branch=master)](http://travis-ci.org/nicolas-grekas/Patchwork-UTF8) +[![SensioLabsInsight](https://insight.sensiolabs.com/projects/666c8ae7-0997-4d27-883a-6089ce3cc76b/mini.png)](https://insight.sensiolabs.com/projects/666c8ae7-0997-4d27-883a-6089ce3cc76b) + +Patchwork UTF-8 gives PHP developpers extensive, portable and performant +handling of UTF-8 and [grapheme clusters](http://unicode.org/reports/tr29/). + +It provides both : + +- a portability layer for `mbstring`, `iconv`, and intl `Normalizer` and + `grapheme_*` functions, +- an UTF-8 grapheme clusters aware replica of native string functions. + +It can also serve as a documentation source referencing the practical problems +that arise when handling UTF-8 in PHP: Unicode concepts, related algorithms, +bugs in PHP core, workarounds, etc. + +Portability +----------- + +Unicode handling in PHP is best performed using a combo of `mbstring`, `iconv`, +`intl` and `pcre` with the `u` flag enabled. But when an application is expected +to run on many servers, you should be aware that these 4 extensions are not +always enabled. + +Patchwork UTF-8 provides pure PHP implementations for 3 of those 4 extensions. +`pcre` compiled with unicode support is required but is widely available. +The following set of portability-fallbacks allows an application to run on a +server even if one or more of those extensions are not enabled: + +- *utf8_encode, utf8_decode*, +- `mbstring`: *mb_check_encoding, mb_convert_case, mb_convert_encoding, + mb_decode_mimeheader, mb_detect_encoding, mb_detect_order, + mb_encode_mimeheader, mb_encoding_aliases, mb_internal_encoding, mb_language, + mb_list_encodings, mb_strlen, mb_strpos, mb_strrpos, mb_strtolower, + mb_strtoupper, mb_stripos, mb_stristr, mb_strrchr, mb_strrichr, mb_strripos, + mb_strstr, mb_substitute_character, mb_substr*, +- `iconv`: *iconv, iconv_mime_decode, iconv_mime_decode_headers, + iconv_get_encoding, iconv_set_encoding, iconv_mime_encode, ob_iconv_handler, + iconv_strlen, iconv_strpos, iconv_strrpos, iconv_substr*, +- `intl`: *Normalizer, grapheme_extract, grapheme_stripos, grapheme_stristr, + grapheme_strlen, grapheme_strpos, grapheme_strripos, grapheme_strrpos, + grapheme_strstr, grapheme_substr, normalizer_is_normalized, + normalizer_normalize*. + +Patchwork\Utf8 +-------------- + +[Grapheme clusters](http://unicode.org/reports/tr29/) should always be +considered when working with generic Unicode strings. The `Patchwork\Utf8` +class implements the quasi-complete set of native string functions that need +UTF-8 grapheme clusters awareness. Function names, arguments and behavior +carefully replicates native PHP string functions. + +Some more functions are also provided to help handling UTF-8 strings: + +- *filter()*: normalizes to UTF-8 NFC, converting from [CP-1252](http://wikipedia.org/wiki/CP-1252) when needed, +- *isUtf8()*: checks if a string contains well formed UTF-8 data, +- *toAscii()*: generic UTF-8 to ASCII transliteration, +- *strtocasefold()*: unicode transformation for caseless matching, +- *strtonatfold()*: generic case sensitive transformation for collation matching + +Mirrored string functions are: +*strlen, substr, strpos, stripos, strrpos, strripos, strstr, stristr, strrchr, +strrichr, strtolower, strtoupper, wordwrap, chr, count_chars, ltrim, ord, rtrim, +trim, str_ireplace, str_pad, str_shuffle, str_split, str_word_count, strcmp, +strnatcmp, strcasecmp, strnatcasecmp, strncasecmp, strncmp, strcspn, strpbrk, +strrev, strspn, strtr, substr_compare, substr_count, substr_replace, ucfirst, +lcfirst, ucwords, number_format, utf8_encode, utf8_decode, json_decode, +filter_input, filter_input_array*. + +Notably missing (but hard to replicate) are *printf*-family functions. + +The implementation favors performance over full edge cases handling. +It generally works on UTF-8 normalized strings and provides filters to get them. + +As the turkish locale requires special cares, a `Patchwork\TurkishUtf8` class +is provided for working with this locale. It clones all the features of +`Patchwork\Utf8` but knows about the turkish specifics. + +Usage +----- + +The recommended way to install Patchwork UTF-8 is [through +composer](http://getcomposer.org). Just create a `composer.json` file and run +the `php composer.phar install` command to install it: + + { + "require": { + "patchwork/utf8": "1.1.*" + } + } + +Then, early in your bootstrap sequence, you have to configure your environment: + +```php +\Patchwork\Utf8\Bootup::initAll(); // Enables the portablity layer and configures PHP for UTF-8 +\Patchwork\Utf8\Bootup::filterRequestUri(); // Redirects to an UTF-8 encoded URL if it's not already the case +\Patchwork\Utf8\Bootup::filterRequestInputs(); // Normalizes HTTP inputs to UTF-8 NFC +``` + +Run `phpunit` to see the code in action. + +Make sure that you are confident about using UTF-8 by reading +[Character Sets / Character Encoding Issues](http://www.phpwact.org/php/i18n/charsets) +and [Handling UTF-8 with PHP](http://www.phpwact.org/php/i18n/utf-8), +or [PHP et UTF-8](http://julp.lescigales.org/articles/3-php-et-utf-8.html) for french readers. + +You should also get familiar with the concept of +[Unicode Normalization](http://en.wikipedia.org/wiki/Unicode_equivalence) and +[Grapheme Clusters](http://unicode.org/reports/tr29/). + +Do not blindly replace all use of PHP's string functions. Most of the time you +will not need to, and you will be introducing a significant performance overhead +to your application. + +Screen your input on the *outer perimeter* so that only well formed UTF-8 pass +through. When dealing with badly formed UTF-8, you should not try to fix it +(see [Unicode Security Considerations](http://www.unicode.org/reports/tr36/#Deletion_of_Noncharacters)). +Instead, consider it as [CP-1252](http://wikipedia.org/wiki/CP-1252) and use +`Patchwork\Utf8::utf8_encode()` to get an UTF-8 string. Don't forget also to +choose one unicode normalization form and stick to it. NFC is now the defacto +standard. `Patchwork\Utf8::filter()` implements this behavior. + +This library is orthogonal to `mbstring.func_overload` and will not work if the +php.ini setting is enabled. + +Licensing +--------- + +Patchwork\Utf8 is free software; you can redistribute it and/or modify it under +the terms of the (at your option): +- [Apache License v2.0](http://apache.org/licenses/LICENSE-2.0.txt), or +- [GNU General Public License v2.0](http://gnu.org/licenses/gpl-2.0.txt). + +Unicode handling requires tedious work to be implemented and maintained on the +long run. As such, contributions such as unit tests, bug reports, comments or +patches licensed under both licenses are really welcomed. + +I hope many projects could adopt this code and together help solve the unicode +subject for PHP. diff --git a/vendor/patchwork/utf8/class/Normalizer.php b/vendor/patchwork/utf8/class/Normalizer.php new file mode 100644 index 0000000000..3acd5f308e --- /dev/null +++ b/vendor/patchwork/utf8/class/Normalizer.php @@ -0,0 +1,17 @@ + 'utf-8', + 'ascii' => 'us-ascii', + 'tis-620' => 'iso-8859-11', + 'cp1250' => 'windows-1250', + 'cp1251' => 'windows-1251', + 'cp1252' => 'windows-1252', + 'cp1253' => 'windows-1253', + 'cp1254' => 'windows-1254', + 'cp1255' => 'windows-1255', + 'cp1256' => 'windows-1256', + 'cp1257' => 'windows-1257', + 'cp1258' => 'windows-1258', + 'shift-jis' => 'cp932', + 'shift_jis' => 'cp932', + 'latin1' => 'iso-8859-1', + 'latin2' => 'iso-8859-2', + 'latin3' => 'iso-8859-3', + 'latin4' => 'iso-8859-4', + 'latin5' => 'iso-8859-9', + 'latin6' => 'iso-8859-10', + 'latin7' => 'iso-8859-13', + 'latin8' => 'iso-8859-14', + 'latin9' => 'iso-8859-15', + 'latin10' => 'iso-8859-16', + 'iso8859-1' => 'iso-8859-1', + 'iso8859-2' => 'iso-8859-2', + 'iso8859-3' => 'iso-8859-3', + 'iso8859-4' => 'iso-8859-4', + 'iso8859-5' => 'iso-8859-5', + 'iso8859-6' => 'iso-8859-6', + 'iso8859-7' => 'iso-8859-7', + 'iso8859-8' => 'iso-8859-8', + 'iso8859-9' => 'iso-8859-9', + 'iso8859-10' => 'iso-8859-10', + 'iso8859-11' => 'iso-8859-11', + 'iso8859-12' => 'iso-8859-12', + 'iso8859-13' => 'iso-8859-13', + 'iso8859-14' => 'iso-8859-14', + 'iso8859-15' => 'iso-8859-15', + 'iso8859-16' => 'iso-8859-16', + 'iso_8859-1' => 'iso-8859-1', + 'iso_8859-2' => 'iso-8859-2', + 'iso_8859-3' => 'iso-8859-3', + 'iso_8859-4' => 'iso-8859-4', + 'iso_8859-5' => 'iso-8859-5', + 'iso_8859-6' => 'iso-8859-6', + 'iso_8859-7' => 'iso-8859-7', + 'iso_8859-8' => 'iso-8859-8', + 'iso_8859-9' => 'iso-8859-9', + 'iso_8859-10' => 'iso-8859-10', + 'iso_8859-11' => 'iso-8859-11', + 'iso_8859-12' => 'iso-8859-12', + 'iso_8859-13' => 'iso-8859-13', + 'iso_8859-14' => 'iso-8859-14', + 'iso_8859-15' => 'iso-8859-15', + 'iso_8859-16' => 'iso-8859-16', + 'iso88591' => 'iso-8859-1', + 'iso88592' => 'iso-8859-2', + 'iso88593' => 'iso-8859-3', + 'iso88594' => 'iso-8859-4', + 'iso88595' => 'iso-8859-5', + 'iso88596' => 'iso-8859-6', + 'iso88597' => 'iso-8859-7', + 'iso88598' => 'iso-8859-8', + 'iso88599' => 'iso-8859-9', + 'iso885910' => 'iso-8859-10', + 'iso885911' => 'iso-8859-11', + 'iso885912' => 'iso-8859-12', + 'iso885913' => 'iso-8859-13', + 'iso885914' => 'iso-8859-14', + 'iso885915' => 'iso-8859-15', + 'iso885916' => 'iso-8859-16', + ), + + $translit_map = array(), + $convert_map = array(), + $error_handler, + $last_error, + + $ulen_mask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4), + $is_valid_utf8; + + + static function iconv($in_charset, $out_charset, $str) + { + if ('' === $str .= '') return ''; + + // Prepare for //IGNORE and //TRANSLIT + + $TRANSLIT = $IGNORE = ''; + + $out_charset = strtolower($out_charset); + $in_charset = strtolower($in_charset ); + + '' === $out_charset && $out_charset = 'iso-8859-1'; + '' === $in_charset && $in_charset = 'iso-8859-1'; + + if ('//translit' === substr($out_charset, -10)) + { + $TRANSLIT = '//TRANSLIT'; + $out_charset = substr($out_charset, 0, -10); + } + + if ('//ignore' === substr($out_charset, -8)) + { + $IGNORE = '//IGNORE'; + $out_charset = substr($out_charset, 0, -8); + } + + '//translit' === substr($in_charset, -10) && $in_charset = substr($in_charset, 0, -10); + '//ignore' === substr($in_charset, -8) && $in_charset = substr($in_charset, 0, -8); + + isset(self::$alias[ $in_charset]) && $in_charset = self::$alias[ $in_charset]; + isset(self::$alias[$out_charset]) && $out_charset = self::$alias[$out_charset]; + + + // Load charset maps + + if ( ('utf-8' !== $in_charset && !static::loadMap('from.', $in_charset, $in_map)) + || ('utf-8' !== $out_charset && !static::loadMap( 'to.', $out_charset, $out_map)) ) + { + user_error(sprintf(self::ERROR_WRONG_CHARSET, $in_charset, $out_charset)); + return false; + } + + + if ('utf-8' !== $in_charset) + { + // Convert input to UTF-8 + $result = ''; + if (self::map_to_utf8($result, $in_map, $str, $IGNORE)) $str = $result; + else $str = false; + self::$is_valid_utf8 = true; + } + else + { + self::$is_valid_utf8 = preg_match('//u', $str); + + if (!self::$is_valid_utf8 && !$IGNORE) + { + user_error(self::ERROR_ILLEGAL_CHARACTER); + return false; + } + + if ('utf-8' === $out_charset) + { + // UTF-8 validation + $str = self::utf8_to_utf8($str, $IGNORE); + } + } + + if ('utf-8' !== $out_charset && false !== $str) + { + // Convert output to UTF-8 + $result = ''; + if (self::map_from_utf8($result, $out_map, $str, $IGNORE, $TRANSLIT)) return $result; + else return false; + } + else return $str; + } + + static function iconv_mime_decode_headers($str, $mode = 0, $charset = INF) + { + INF === $charset && $charset = self::$internal_encoding; + + false !== strpos($str, "\r") && $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n"); + $str = explode("\n\n", $str, 2); + + $headers = array(); + + $str = preg_split('/\n(?![ \t])/', $str[0]); + foreach ($str as $str) + { + $str = self::iconv_mime_decode($str, $mode, $charset); + if (false === $str) return false; + $str = explode(':', $str, 2); + + if (2 === count($str)) + { + if (isset($headers[$str[0]])) + { + is_array($headers[$str[0]]) || $headers[$str[0]] = array($headers[$str[0]]); + $headers[$str[0]][] = ltrim($str[1]); + } + else $headers[$str[0]] = ltrim($str[1]); + } + } + + return $headers; + } + + static function iconv_mime_decode($str, $mode = 0, $charset = INF) + { + INF === $charset && $charset = self::$internal_encoding; + if (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) $charset .= '//IGNORE'; + + false !== strpos($str, "\r") && $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n"); + $str = preg_split('/\n(?![ \t])/', rtrim($str), 2); + $str = preg_replace('/[ \t]*\n[ \t]+/', ' ', rtrim($str[0])); + $str = preg_split('/=\?([^?]+)\?([bqBQ])\?(.*?)\?=/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); + + $result = self::iconv('utf-8', $charset, $str[0]); + if (false === $result) return false; + + $i = 1; + $len = count($str); + + while ($i < $len) + { + $c = strtolower($str[$i]); + if ( (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) + && 'utf-8' !== $c + && !isset(self::$alias[$c]) + && !static::loadMap('from.', $c, $d) ) $d = false; + else if ('B' === strtoupper($str[$i+1])) $d = base64_decode($str[$i+2]); + else $d = rawurldecode(strtr(str_replace('%', '%25', $str[$i+2]), '=_', '% ')); + + if (false !== $d) + { + $result .= self::iconv($c, $charset, $d); + $d = self::iconv('utf-8' , $charset, $str[$i+3]); + if ('' !== trim($d)) $result .= $d; + } + else if (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) + { + $result .= "=?{$str[$i]}?{$str[$i+1]}?{$str[$i+2]}?={$str[$i+3]}"; + } + else + { + $result = false; + break; + } + + $i += 4; + } + + return $result; + } + + static function iconv_get_encoding($type = 'all') + { + switch ($type) + { + case 'input_encoding' : return self::$input_encoding; + case 'output_encoding' : return self::$output_encoding; + case 'internal_encoding': return self::$internal_encoding; + } + + return array( + 'input_encoding' => self::$input_encoding, + 'output_encoding' => self::$output_encoding, + 'internal_encoding' => self::$internal_encoding + ); + } + + static function iconv_set_encoding($type, $charset) + { + switch ($type) + { + case 'input_encoding' : self::$input_encoding = $charset; break; + case 'output_encoding' : self::$output_encoding = $charset; break; + case 'internal_encoding': self::$internal_encoding = $charset; break; + + default: return false; + } + + return true; + } + + static function iconv_mime_encode($field_name, $field_value, $pref = INF) + { + is_array($pref) || $pref = array(); + + $pref += array( + 'scheme' => 'B', + 'input-charset' => self::$internal_encoding, + 'output-charset' => self::$internal_encoding, + 'line-length' => 76, + 'line-break-chars' => "\r\n" + ); + + preg_match('/[\x80-\xFF]/', $field_name) && $field_name = ''; + + $scheme = strtoupper(substr($pref['scheme'], 0, 1)); + $in = strtolower($pref['input-charset']); + $out = strtolower($pref['output-charset']); + + if ('utf-8' !== $in && false === $field_value = self::iconv($in, 'utf-8', $field_value)) return false; + + preg_match_all('/./us', $field_value, $chars); + + $chars = isset($chars[0]) ? $chars[0] : array(); + + $line_break = (int) $pref['line-length']; + $line_start = "=?{$pref['output-charset']}?{$scheme}?"; + $line_length = strlen($field_name) + 2 + strlen($line_start) + 2; + $line_offset = strlen($line_start) + 3; + $line_data = ''; + + $field_value = array(); + + $Q = 'Q' === $scheme; + + foreach ($chars as $c) + { + if ('utf-8' !== $out && false === $c = self::iconv('utf-8', $out, $c)) return false; + + $o = $Q + ? $c = preg_replace_callback( + '/[=_\?\x00-\x1F\x80-\xFF]/', + array(__CLASS__, 'qp_byte_callback'), + $c + ) + : base64_encode($line_data . $c); + + if (isset($o[$line_break - $line_length])) + { + $Q || $line_data = base64_encode($line_data); + $field_value[] = $line_start . $line_data . '?='; + $line_length = $line_offset; + $line_data = ''; + } + + $line_data .= $c; + $Q && $line_length += strlen($c); + } + + if ('' !== $line_data) + { + $Q || $line_data = base64_encode($line_data); + $field_value[] = $line_start . $line_data . '?='; + } + + return $field_name . ': ' . implode($pref['line-break-chars'] . ' ', $field_value); + } + + static function ob_iconv_handler($buffer, $mode) + { + return self::iconv(self::$internal_encoding, self::$output_encoding, $buffer); + } + + static function iconv_strlen($s, $encoding = INF) + { +/**/ if (extension_loaded('xml')) + return self::strlen1($s, $encoding); +/**/ else + return self::strlen2($s, $encoding); + } + + static function strlen1($s, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + if (0 !== strncasecmp($encoding, 'utf-8', 5) && false === $s = self::iconv($encoding, 'utf-8', $s)) return false; + + return strlen(utf8_decode($s)); + } + + static function strlen2($s, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + if (0 !== strncasecmp($encoding, 'utf-8', 5) && false === $s = self::iconv($encoding, 'utf-8', $s)) return false; + + $ulen_mask = self::$ulen_mask; + + $i = 0; $j = 0; + $len = strlen($s); + + while ($i < $len) + { + $u = $s[$i] & "\xF0"; + $i += isset($ulen_mask[$u]) ? $ulen_mask[$u] : 1; + ++$j; + } + + return $j; + } + + static function iconv_strpos($haystack, $needle, $offset = 0, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + + if (0 !== strncasecmp($encoding, 'utf-8', 5)) + { + if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) return false; + if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) return false; + } + + if ($offset = (int) $offset) $haystack = self::iconv_substr($haystack, $offset, 2147483647, 'utf-8'); + $pos = strpos($haystack, $needle); + return false === $pos ? false : ($offset + ($pos ? self::iconv_strlen(substr($haystack, 0, $pos), 'utf-8') : 0)); + } + + static function iconv_strrpos($haystack, $needle, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + + if (0 !== strncasecmp($encoding, 'utf-8', 5)) + { + if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) return false; + if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) return false; + } + + $pos = isset($needle[0]) ? strrpos($haystack, $needle) : false; + return false === $pos ? false : self::iconv_strlen($pos ? substr($haystack, 0, $pos) : $haystack, 'utf-8'); + } + + static function iconv_substr($s, $start, $length = 2147483647, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + if (0 === strncasecmp($encoding, 'utf-8', 5)) $encoding = INF; + else if (false === $s = self::iconv($encoding, 'utf-8', $s)) return false; + + $s .= ''; + $slen = self::iconv_strlen($s, 'utf-8'); + $start = (int) $start; + + if (0 > $start) $start += $slen; + if (0 > $start) return false; + if ($start >= $slen) return false; + + $rx = $slen - $start; + + if (0 > $length) $length += $rx; + if (0 === $length) return ''; + if (0 > $length) return false; + + if ($length > $rx) $length = $rx; + + $rx = '/^' . ($start ? self::preg_offset($start) : '') . '(' . self::preg_offset($length) . ')/u'; + + $s = preg_match($rx, $s, $s) ? $s[1] : ''; + + if (INF === $encoding) return $s; + else return self::iconv('utf-8', $encoding, $s); + } + + protected static function loadMap($type, $charset, &$map) + { + if (!isset(self::$convert_map[$type . $charset])) + { + if (false === $map = static::getData($type . $charset)) + { + if ('to.' === $type && static::loadMap('from.', $charset, $map)) $map = array_flip($map); + else return false; + } + + self::$convert_map[$type . $charset] = $map; + } + else $map = self::$convert_map[$type . $charset]; + + return true; + } + + protected static function utf8_to_utf8($str, $IGNORE) + { + $ulen_mask = self::$ulen_mask; + $valid = self::$is_valid_utf8; + + $u = $str; + $i = $j = 0; + $len = strlen($str); + + while ($i < $len) + { + if ($str[$i] < "\x80") $u[$j++] = $str[$i++]; + else + { + $ulen = $str[$i] & "\xF0"; + $ulen = isset($ulen_mask[$ulen]) ? $ulen_mask[$ulen] : 1; + $uchr = substr($str, $i, $ulen); + + if (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr))) + { + if ($IGNORE) + { + ++$i; + continue; + } + + user_error(self::ERROR_ILLEGAL_CHARACTER); + return false; + } + else $i += $ulen; + + $u[$j++] = $uchr[0]; + + isset($uchr[1]) && 0 !== ($u[$j++] = $uchr[1]) + && isset($uchr[2]) && 0 !== ($u[$j++] = $uchr[2]) + && isset($uchr[3]) && 0 !== ($u[$j++] = $uchr[3]); + } + } + + return substr($u, 0, $j); + } + + protected static function map_to_utf8(&$result, $map, $str, $IGNORE) + { + $len = strlen($str); + for ($i = 0; $i < $len; ++$i) + { + if (isset($str[$i+1], $map[$str[$i] . $str[$i+1]])) $result .= $map[$str[$i] . $str[++$i]]; + else if (isset($map[$str[$i]])) $result .= $map[$str[$i]]; + else if (!$IGNORE) + { + user_error(self::ERROR_ILLEGAL_CHARACTER); + return false; + } + } + + return true; + } + + protected static function map_from_utf8(&$result, $map, $str, $IGNORE, $TRANSLIT) + { + $ulen_mask = self::$ulen_mask; + $valid = self::$is_valid_utf8; + + if ($TRANSLIT) self::$translit_map or self::$translit_map = static::getData('translit'); + + $i = 0; + $len = strlen($str); + + while ($i < $len) + { + if ($str[$i] < "\x80") $uchr = $str[$i++]; + else + { + $ulen = $str[$i] & "\xF0"; + $ulen = isset($ulen_mask[$ulen]) ? $ulen_mask[$ulen] : 1; + $uchr = substr($str, $i, $ulen); + + if ($IGNORE && (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr)))) + { + ++$i; + continue; + } + else $i += $ulen; + } + + if (isset($map[$uchr])) + { + $result .= $map[$uchr]; + } + else if ($TRANSLIT) + { + if (isset(self::$translit_map[$uchr])) + { + $uchr = self::$translit_map[$uchr]; + } + else if ($uchr >= "\xC3\x80") + { + $uchr = \Normalizer::normalize($uchr, \Normalizer::NFD); + + if ($uchr[0] < "\x80") $uchr = $uchr[0]; + else if ($IGNORE) continue; + else return false; + } + + $str = $uchr . substr($str, $i); + $len = strlen($str); + $i = 0; + } + else if (!$IGNORE) + { + return false; + } + } + + return true; + } + + protected static function qp_byte_callback($m) + { + return '=' . strtoupper(dechex(ord($m[0]))); + } + + protected static function preg_offset($offset) + { + $rx = array(); + $offset = (int) $offset; + + while ($offset > 65535) + { + $rx[] = '.{65535}'; + $offset -= 65535; + } + + return implode('', $rx) . '.{' . $offset . '}'; + } + + protected static function getData($file) + { + $file = __DIR__ . '/charset/' . $file . '.ser'; + if (file_exists($file)) return unserialize(file_get_contents($file)); + else return false; + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Intl.php b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Intl.php new file mode 100644 index 0000000000..4a252c330d --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Intl.php @@ -0,0 +1,139 @@ + $size || 0 > $start || 0 > $type || 2 < $type) return false; + if (0 === $size) return ''; + + $next = $start; + + $s = preg_split('/(' . GRAPHEME_CLUSTER_RX . ')/u', "\r\n" . $s, $size + 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + + if (!isset($s[1])) return false; + + $i = 1; + $ret = ''; + + do + { + if (GRAPHEME_EXTR_COUNT === $type) --$size; + else if (GRAPHEME_EXTR_MAXBYTES === $type) $size -= strlen($s[$i]); + else $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE'); + + if ($size >= 0) $ret .= $s[$i]; + } + while (isset($s[++$i]) && $size > 0); + + $next += strlen($ret); + + return $ret; + } + + static function grapheme_strlen($s) + { + preg_replace('/' . GRAPHEME_CLUSTER_RX . '/u', '', $s, -1, $len); + return 0 === $len && '' !== $s ? null : $len; + } + + static function grapheme_substr($s, $start, $len = 2147483647) + { + preg_match_all('/' . GRAPHEME_CLUSTER_RX . '/u', $s, $s); + + $slen = count($s[0]); + $start = (int) $start; + + if (0 > $start) $start += $slen; + if (0 > $start) return false; + if ($start >= $slen) return false; + + $rem = $slen - $start; + + if (0 > $len) $len += $rem; + if (0 === $len) return ''; + if (0 > $len) return false; + if ($len > $rem) $len = $rem; + + return implode('', array_slice($s[0], $start, $len)); + } + + static function grapheme_substr_workaround62759($s, $start, $len) + { + // Intl based http://bugs.php.net/62759 and 55562 workaround + + if (2147483647 == $len) return grapheme_substr($s, $start); + + $s .= ''; + $slen = grapheme_strlen($s); + $start = (int) $start; + + if (0 > $start) $start += $slen; + if (0 > $start) return false; + if ($start >= $slen) return false; + + $rem = $slen - $start; + + if (0 > $len) $len += $rem; + if (0 === $len) return ''; + if (0 > $len) return false; + if ($len > $rem) $len = $rem; + + return grapheme_substr($s, $start, $len); + } + + static function grapheme_strpos ($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 0);} + static function grapheme_stripos ($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 1);} + static function grapheme_strrpos ($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 2);} + static function grapheme_strripos($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 3);} + static function grapheme_stristr ($s, $needle, $before_needle = false) {return mb_stristr($s, $needle, $before_needle, 'UTF-8');} + static function grapheme_strstr ($s, $needle, $before_needle = false) {return mb_strstr ($s, $needle, $before_needle, 'UTF-8');} + + + protected static function grapheme_position($s, $needle, $offset, $mode) + { + if (! preg_match('/./us', $needle .= '')) return false; + if (! preg_match('/./us', $s .= '')) return false; + if ($offset > 0) $s = self::grapheme_substr($s, $offset); + else if ($offset < 0) $offset = 0; + + switch ($mode) + { + case 0: $needle = iconv_strpos ($s, $needle, 0, 'UTF-8'); break; + case 1: $needle = mb_stripos ($s, $needle, 0, 'UTF-8'); break; + case 2: $needle = iconv_strrpos($s, $needle, 'UTF-8'); break; + default: $needle = mb_strripos ($s, $needle, 0, 'UTF-8'); break; + } + + return $needle ? self::grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')) + $offset : $needle; + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Mbstring.php b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Mbstring.php new file mode 100644 index 0000000000..85784b02e6 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Mbstring.php @@ -0,0 +1,442 @@ + 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); + + $i = 0; + $len = strlen($s); + + while ($i < $len) + { + $ulen = $s[$i] < "\x80" ? 1 : $ulen_mask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($map[$uchr])) + { + $uchr = $map[$uchr]; + $nlen = strlen($uchr); + + if ($nlen == $ulen) + { + $nlen = $i; + do $s[--$nlen] = $uchr[--$ulen]; + while ($ulen); + } + else + { + $s = substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + + if (INF === $encoding) return $s; + else return iconv('UTF-8', $encoding, $s); + } + + static function mb_internal_encoding($encoding = INF) + { + if (INF === $encoding) return self::$internal_encoding; + else $encoding = strtoupper($encoding); + + if ('UTF-8' === $encoding || 'UTF8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) + { + self::$internal_encoding = 'UTF8' === $encoding ? 'UTF-8' : $encoding; + + return true; + } + + return false; + } + + static function mb_language($lang = INF) + { + if (INF === $lang) return self::$language; + + switch ($lang = strtolower($lang)) + { + case 'uni': + case 'neutral': + self::$language = $lang; + return true; + } + + return false; + } + + static function mb_list_encodings() + { + return array('UTF-8'); + } + + static function mb_encoding_aliases($encoding) + { + switch (strtolower($encoding)) + { + case 'utf8': + case 'utf-8': return array('utf8'); + } + + return false; + } + + static function mb_check_encoding($var = INF, $encoding = INF) + { + if (INF === $encoding) + { + if (INF === $var) return false; + $encoding = self::$internal_encoding; + } + + return false !== mb_detect_encoding($var, array($encoding), true); + } + + static function mb_detect_encoding($str, $encoding_list = INF, $strict = false) + { + if (INF === $encoding_list) $encoding_list = self::$encoding_list; + else + { + if (! is_array($encoding_list)) $encoding_list = array_map('trim', explode(',', $encoding_list)); + $encoding_list = array_map('strtoupper', $encoding_list); + } + + foreach ($encoding_list as $enc) + { + switch ($enc) + { + case 'ASCII': + if (! preg_match('/[\x80-\xFF]/', $str)) return $enc; + break; + + case 'UTF8': + case 'UTF-8': + if (preg_match('//u', $str)) return $enc; + break; + + default: + return strncmp($enc, 'ISO-8859-', 9) ? false : $enc; + } + } + + return false; + } + + static function mb_detect_order($encoding_list = INF) + { + if (INF === $encoding_list) return self::$encoding_list; + + if (! is_array($encoding_list)) $encoding_list = array_map('trim', explode(',', $encoding_list)); + $encoding_list = array_map('strtoupper', $encoding_list); + + foreach ($encoding_list as $enc) + { + switch ($enc) + { + default: if (strncmp($enc, 'ISO-8859-', 9)) return false; + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + + self::$encoding_list = $encoding_list; + + return true; + } + + static function mb_strlen($s, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + return iconv_strlen($s, $encoding . '//IGNORE'); + } + + static function mb_strpos ($haystack, $needle, $offset = 0, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + if ('' === $needle .= '') + { + user_error(__METHOD__ . ': Empty delimiter', E_USER_WARNING); + return false; + } + else return iconv_strpos($haystack, $needle, $offset, $encoding . '//IGNORE'); + } + + static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + + if ($offset != (int) $offset) + { + $offset = 0; + } + else if ($offset = (int) $offset) + { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + + $pos = iconv_strrpos($haystack, $needle, $encoding . '//IGNORE'); + + return false !== $pos ? $offset + $pos : false; + } + + static function mb_strtolower($s, $encoding = INF) + { + return self::mb_convert_case($s, MB_CASE_LOWER, $encoding); + } + + static function mb_strtoupper($s, $encoding = INF) + { + return self::mb_convert_case($s, MB_CASE_UPPER, $encoding); + } + + static function mb_substitute_character($c = INF) + { + return INF !== $c ? false : 'none'; + } + + static function mb_substr($s, $start, $length = null, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + + if ($start < 0) + { + $start = iconv_strlen($s, $encoding . '//IGNORE') + $start; + if ($start < 0) $start = 0; + } + + if (null === $length) $length = 2147483647; + else if ($length < 0) + { + $length = iconv_strlen($s, $encoding . '//IGNORE') + $length - $start; + if ($length < 0) return ''; + } + + return iconv_substr($s, $start, $length, $encoding . '//IGNORE') . ''; + } + + static function mb_stripos($haystack, $needle, $offset = 0, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); + $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + + static function mb_stristr($haystack, $needle, $part = false, $encoding = INF) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + static function mb_strrchr($haystack, $needle, $part = false, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + static function mb_strrichr($haystack, $needle, $part = false, $encoding = INF) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + static function mb_strripos($haystack, $needle, $offset = 0, $encoding = INF) + { + INF === $encoding && $encoding = self::$internal_encoding; + $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); + $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + + static function mb_strstr($haystack, $needle, $part = false, $encoding = INF) + { + $pos = strpos($haystack, $needle); + if (false === $pos) return false; + if ($part) return substr($haystack, 0, $pos); + else return substr($haystack, $pos); + } + + + protected static function getSubpart($pos, $part, $haystack, $encoding) + { + INF === $encoding && $encoding = self::$internal_encoding; + + if (false === $pos) return false; + if ($part) return self::mb_substr($haystack, 0, $pos, $encoding); + else return self::mb_substr($haystack, $pos, null, $encoding); + } + + protected static function html_encoding_callback($m) + { + return htmlentities($m[0], ENT_COMPAT, 'UTF-8'); + } + + protected static function title_case_lower($s) + { + return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8'); + } + + protected static function title_case_upper($s) + { + return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8'); + } + + protected static function getData($file) + { + $file = __DIR__ . '/unidata/' . $file . '.ser'; + if (file_exists($file)) return unserialize(file_get_contents($file)); + else return false; + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Normalizer.php b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Normalizer.php new file mode 100644 index 0000000000..c29647036d --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Normalizer.php @@ -0,0 +1,295 @@ + 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4), + $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; + + + static function isNormalized($s, $form = self::NFC) + { + if (strspn($s .= '', self::$ASCII) === strlen($s)) return true; + if (self::NFC === $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) return true; + return false; // Pretend false as quick checks implementented in PHP won't be so quick + } + + static function normalize($s, $form = self::NFC) + { + if (!preg_match('//u', $s .= '')) return false; + + switch ($form) + { + case self::NONE: return $s; + case self::NFC: $C = true; $K = false; break; + case self::NFD: $C = false; $K = false; break; + case self::NFKC: $C = true; $K = true; break; + case self::NFKD: $C = false; $K = true; break; + default: return false; + } + + if ('' === $s) return ''; + + if ($K && empty(self::$KD)) self::$KD = static::getData('compatibilityDecomposition'); + + if (empty(self::$D)) + { + self::$D = static::getData('canonicalDecomposition'); + self::$cC = static::getData('combiningClass'); + } + + if ($C) + { + if (empty(self::$C)) self::$C = static::getData('canonicalComposition'); + return self::recompose(self::decompose($s, $K)); + } + else return self::decompose($s, $K); + } + + protected static function recompose($s) + { + $ASCII = self::$ASCII; + $compMap = self::$C; + $combClass = self::$cC; + $ulen_mask = self::$ulen_mask; + + $result = $tail = ''; + + $i = $s[0] < "\x80" ? 1 : $ulen_mask[$s[0] & "\xF0"]; + $len = strlen($s); + + $last_uchr = substr($s, 0, $i); + $last_ucls = isset($combClass[$last_uchr]) ? 256 : 0; + + while ($i < $len) + { + if ($s[$i] < "\x80") + { + // ASCII chars + + if ($tail) + { + $last_uchr .= $tail; + $tail = ''; + } + + if ($j = strspn($s, $ASCII, $i+1)) + { + $last_uchr .= substr($s, $i, $j); + $i += $j; + } + + $result .= $last_uchr; + $last_uchr = $s[$i]; + ++$i; + } + else + { + $ulen = $ulen_mask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + + if ($last_uchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $last_uchr + || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr + || $last_ucls) + { + // Table lookup and combining chars composition + + $ucls = isset($combClass[$uchr]) ? $combClass[$uchr] : 0; + + if (isset($compMap[$last_uchr . $uchr]) && (!$last_ucls || $last_ucls < $ucls)) + { + $last_uchr = $compMap[$last_uchr . $uchr]; + } + else if ($last_ucls = $ucls) $tail .= $uchr; + else + { + if ($tail) + { + $last_uchr .= $tail; + $tail = ''; + } + + $result .= $last_uchr; + $last_uchr = $uchr; + } + } + else + { + // Hangul chars + + $L = ord($last_uchr[2]) - 0x80; + $V = ord($uchr[2]) - 0xA1; + $T = 0; + + $uchr = substr($s, $i + $ulen, 3); + + if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") + { + $T = ord($uchr[2]) - 0xA7; + 0 > $T && $T += 0x40; + $ulen += 3; + } + + $L = 0xAC00 + ($L * 21 + $V) * 28 + $T; + $last_uchr = chr(0xE0 | $L>>12) . chr(0x80 | $L>>6 & 0x3F) . chr(0x80 | $L & 0x3F); + } + + $i += $ulen; + } + } + + return $result . $last_uchr . $tail; + } + + protected static function decompose($s, $c) + { + $result = ''; + + $ASCII = self::$ASCII; + $decompMap = self::$D; + $combClass = self::$cC; + $ulen_mask = self::$ulen_mask; + if ($c) $compatMap = self::$KD; + + $c = array(); + $i = 0; + $len = strlen($s); + + while ($i < $len) + { + if ($s[$i] < "\x80") + { + // ASCII chars + + if ($c) + { + ksort($c); + $result .= implode('', $c); + $c = array(); + } + + $j = 1 + strspn($s, $ASCII, $i+1); + $result .= substr($s, $i, $j); + $i += $j; + } + else + { + $ulen = $ulen_mask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($combClass[$uchr])) + { + // Combining chars, for sorting + + isset($c[$combClass[$uchr]]) || $c[$combClass[$uchr]] = ''; + $c[$combClass[$uchr]] .= isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr); + } + else + { + if ($c) + { + ksort($c); + $result .= implode('', $c); + $c = array(); + } + + if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) + { + // Table lookup + + $j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr); + + if ($uchr != $j) + { + $uchr = $j; + + $j = strlen($uchr); + $ulen = $uchr[0] < "\x80" ? 1 : $ulen_mask[$uchr[0] & "\xF0"]; + + if ($ulen != $j) + { + // Put trailing chars in $s + + $j -= $ulen; + $i -= $j; + + if (0 > $i) + { + $s = str_repeat(' ', -$i) . $s; + $len -= $i; + $i = 0; + } + + while ($j--) $s[$i+$j] = $uchr[$ulen+$j]; + + $uchr = substr($uchr, 0, $ulen); + } + } + } + else + { + // Hangul chars + + $uchr = unpack('C*', $uchr); + $j = (($uchr[1]-224) << 12) + (($uchr[2]-128) << 6) + $uchr[3] - 0xAC80; + + $uchr = "\xE1\x84" . chr(0x80 + (int) ($j / 588)) + . "\xE1\x85" . chr(0xA1 + (int) (($j % 588) / 28)); + + if ($j %= 28) + { + $uchr .= $j < 25 + ? ("\xE1\x86" . chr(0xA7 + $j)) + : ("\xE1\x87" . chr(0x67 + $j)); + } + } + + $result .= $uchr; + } + } + } + + if ($c) + { + ksort($c); + $result .= implode('', $c); + } + + return $result; + } + + protected static function getData($file) + { + $file = __DIR__ . '/unidata/' . $file . '.ser'; + if (file_exists($file)) return unserialize(file_get_contents($file)); + else return false; + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Xml.php b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Xml.php new file mode 100644 index 0000000000..6a44df8b1e --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/Xml.php @@ -0,0 +1,61 @@ +> 1, $j = 0; $i < $len; ++$i, ++$j) switch (true) + { + case $s[$i] < "\x80": $s[$j] = $s[$i]; break; + case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; + default: $s[$j] = "\xC3"; $s[++$j] = chr(ord($s[$i]) - 64); break; + } + + return substr($s, 0, $j); + } + + static function utf8_decode($s) + { + $s .= ''; + $len = strlen($s); + + for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) + { + switch ($s[$i] & "\xF0") + { + case "\xC0": + case "\xD0": + $c = (ord($s[$i] & "\x1F") << 6) | ord($s[++$i] & "\x3F"); + $s[$j] = $c < 256 ? chr($c) : '?'; + break; + + case "\xF0": ++$i; + case "\xE0": + $s[$j] = '?'; + $i += 2; + break; + + default: + $s[$j] = $s[$i]; + } + } + + return substr($s, 0, $j); + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.big5.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.big5.ser new file mode 100644 index 0000000000..379bc53fc8 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.big5.ser @@ -0,0 +1 @@ +a:13710:{s:2:"¡@";s:3:" ";s:2:"¡A";s:3:",";s:2:"¡B";s:3:"ã€";s:2:"¡C";s:3:"。";s:2:"¡D";s:3:".";s:2:"¡E";s:3:"•";s:2:"¡F";s:3:"ï¼›";s:2:"¡G";s:3:":";s:2:"¡H";s:3:"?";s:2:"¡I";s:3:"ï¼";s:2:"¡J";s:3:"︰";s:2:"¡K";s:3:"…";s:2:"¡L";s:3:"‥";s:2:"¡M";s:3:"ï¹";s:2:"¡N";s:3:"、";s:2:"¡O";s:3:"ï¹’";s:2:"¡P";s:2:"·";s:2:"¡Q";s:3:"ï¹”";s:2:"¡R";s:3:"﹕";s:2:"¡S";s:3:"ï¹–";s:2:"¡T";s:3:"ï¹—";s:2:"¡U";s:3:"|";s:2:"¡V";s:3:"–";s:2:"¡W";s:3:"︱";s:2:"¡X";s:3:"—";s:2:"¡Y";s:3:"︳";s:2:"¡Z";s:3:"�";s:2:"¡[";s:3:"︴";s:2:"¡\";s:3:"ï¹";s:2:"¡]";s:3:"(";s:2:"¡^";s:3:")";s:2:"¡_";s:3:"︵";s:2:"¡`";s:3:"︶";s:2:"¡a";s:3:"ï½›";s:2:"¡b";s:3:"ï½";s:2:"¡c";s:3:"︷";s:2:"¡d";s:3:"︸";s:2:"¡e";s:3:"〔";s:2:"¡f";s:3:"〕";s:2:"¡g";s:3:"︹";s:2:"¡h";s:3:"︺";s:2:"¡i";s:3:"ã€";s:2:"¡j";s:3:"】";s:2:"¡k";s:3:"︻";s:2:"¡l";s:3:"︼";s:2:"¡m";s:3:"《";s:2:"¡n";s:3:"》";s:2:"¡o";s:3:"︽";s:2:"¡p";s:3:"︾";s:2:"¡q";s:3:"〈";s:2:"¡r";s:3:"〉";s:2:"¡s";s:3:"︿";s:2:"¡t";s:3:"ï¹€";s:2:"¡u";s:3:"「";s:2:"¡v";s:3:"ã€";s:2:"¡w";s:3:"ï¹";s:2:"¡x";s:3:"﹂";s:2:"¡y";s:3:"『";s:2:"¡z";s:3:"ã€";s:2:"¡{";s:3:"﹃";s:2:"¡|";s:3:"﹄";s:2:"¡}";s:3:"ï¹™";s:2:"¡~";s:3:"﹚";s:2:"¡¡";s:3:"ï¹›";s:2:"¡¢";s:3:"﹜";s:2:"¡£";s:3:"ï¹";s:2:"¡¤";s:3:"﹞";s:2:"¡¥";s:3:"‘";s:2:"¡¦";s:3:"’";s:2:"¡§";s:3:"“";s:2:"¡¨";s:3:"â€";s:2:"¡©";s:3:"ã€";s:2:"¡ª";s:3:"〞";s:2:"¡«";s:3:"‵";s:2:"¡¬";s:3:"′";s:2:"¡­";s:3:"#";s:2:"¡®";s:3:"&";s:2:"¡¯";s:3:"*";s:2:"¡°";s:3:"※";s:2:"¡±";s:2:"§";s:2:"¡²";s:3:"〃";s:2:"¡³";s:3:"â—‹";s:2:"¡´";s:3:"â—";s:2:"¡µ";s:3:"â–³";s:2:"¡¶";s:3:"â–²";s:2:"¡·";s:3:"â—Ž";s:2:"¡¸";s:3:"☆";s:2:"¡¹";s:3:"★";s:2:"¡º";s:3:"â—‡";s:2:"¡»";s:3:"â—†";s:2:"¡¼";s:3:"â–¡";s:2:"¡½";s:3:"â– ";s:2:"¡¾";s:3:"â–½";s:2:"¡¿";s:3:"â–¼";s:2:"¡À";s:3:"㊣";s:2:"¡Á";s:3:"â„…";s:2:"¡Â";s:3:"‾";s:2:"¡Ã";s:3:"�";s:2:"¡Ä";s:3:"_";s:2:"¡Å";s:3:"�";s:2:"¡Æ";s:3:"﹉";s:2:"¡Ç";s:3:"﹊";s:2:"¡È";s:3:"ï¹";s:2:"¡É";s:3:"﹎";s:2:"¡Ê";s:3:"﹋";s:2:"¡Ë";s:3:"﹌";s:2:"¡Ì";s:3:"﹟";s:2:"¡Í";s:3:"ï¹ ";s:2:"¡Î";s:3:"﹡";s:2:"¡Ï";s:3:"+";s:2:"¡Ð";s:3:"ï¼";s:2:"¡Ñ";s:2:"×";s:2:"¡Ò";s:2:"÷";s:2:"¡Ó";s:2:"±";s:2:"¡Ô";s:3:"√";s:2:"¡Õ";s:3:"<";s:2:"¡Ö";s:3:">";s:2:"¡×";s:3:"ï¼";s:2:"¡Ø";s:3:"≦";s:2:"¡Ù";s:3:"≧";s:2:"¡Ú";s:3:"≠";s:2:"¡Û";s:3:"∞";s:2:"¡Ü";s:3:"≒";s:2:"¡Ý";s:3:"≡";s:2:"¡Þ";s:3:"ï¹¢";s:2:"¡ß";s:3:"ï¹£";s:2:"¡à";s:3:"﹤";s:2:"¡á";s:3:"ï¹¥";s:2:"¡â";s:3:"﹦";s:2:"¡ã";s:3:"∼";s:2:"¡ä";s:3:"∩";s:2:"¡å";s:3:"∪";s:2:"¡æ";s:3:"⊥";s:2:"¡ç";s:3:"∠";s:2:"¡è";s:3:"∟";s:2:"¡é";s:3:"⊿";s:2:"¡ê";s:3:"ã’";s:2:"¡ë";s:3:"ã‘";s:2:"¡ì";s:3:"∫";s:2:"¡í";s:3:"∮";s:2:"¡î";s:3:"∵";s:2:"¡ï";s:3:"∴";s:2:"¡ð";s:3:"♀";s:2:"¡ñ";s:3:"♂";s:2:"¡ò";s:3:"â™";s:2:"¡ó";s:3:"☉";s:2:"¡ô";s:3:"↑";s:2:"¡õ";s:3:"↓";s:2:"¡ö";s:3:"â†";s:2:"¡÷";s:3:"→";s:2:"¡ø";s:3:"↖";s:2:"¡ù";s:3:"↗";s:2:"¡ú";s:3:"↙";s:2:"¡û";s:3:"↘";s:2:"¡ü";s:3:"∥";s:2:"¡ý";s:3:"∣";s:2:"¡þ";s:3:"�";s:2:"¢@";s:3:"�";s:2:"¢A";s:3:"ï¼";s:2:"¢B";s:3:"ï¼¼";s:2:"¢C";s:3:"$";s:2:"¢D";s:2:"Â¥";s:2:"¢E";s:3:"〒";s:2:"¢F";s:2:"¢";s:2:"¢G";s:2:"£";s:2:"¢H";s:3:"ï¼…";s:2:"¢I";s:3:"ï¼ ";s:2:"¢J";s:3:"℃";s:2:"¢K";s:3:"℉";s:2:"¢L";s:3:"﹩";s:2:"¢M";s:3:"﹪";s:2:"¢N";s:3:"﹫";s:2:"¢O";s:3:"ã•";s:2:"¢P";s:3:"㎜";s:2:"¢Q";s:3:"ãŽ";s:2:"¢R";s:3:"㎞";s:2:"¢S";s:3:"ãŽ";s:2:"¢T";s:3:"㎡";s:2:"¢U";s:3:"㎎";s:2:"¢V";s:3:"ãŽ";s:2:"¢W";s:3:"ã„";s:2:"¢X";s:2:"°";s:2:"¢Y";s:3:"å…™";s:2:"¢Z";s:3:"å…›";s:2:"¢[";s:3:"å…ž";s:2:"¢\";s:3:"å…";s:2:"¢]";s:3:"å…¡";s:2:"¢^";s:3:"å…£";s:2:"¢_";s:3:"å—§";s:2:"¢`";s:3:"ç“©";s:2:"¢a";s:3:"糎";s:2:"¢b";s:3:"â–";s:2:"¢c";s:3:"â–‚";s:2:"¢d";s:3:"â–ƒ";s:2:"¢e";s:3:"â–„";s:2:"¢f";s:3:"â–…";s:2:"¢g";s:3:"â–†";s:2:"¢h";s:3:"â–‡";s:2:"¢i";s:3:"â–ˆ";s:2:"¢j";s:3:"â–";s:2:"¢k";s:3:"â–Ž";s:2:"¢l";s:3:"â–";s:2:"¢m";s:3:"â–Œ";s:2:"¢n";s:3:"â–‹";s:2:"¢o";s:3:"â–Š";s:2:"¢p";s:3:"â–‰";s:2:"¢q";s:3:"┼";s:2:"¢r";s:3:"â”´";s:2:"¢s";s:3:"┬";s:2:"¢t";s:3:"┤";s:2:"¢u";s:3:"├";s:2:"¢v";s:3:"â–”";s:2:"¢w";s:3:"─";s:2:"¢x";s:3:"│";s:2:"¢y";s:3:"â–•";s:2:"¢z";s:3:"┌";s:2:"¢{";s:3:"â”";s:2:"¢|";s:3:"â””";s:2:"¢}";s:3:"┘";s:2:"¢~";s:3:"â•­";s:2:"¢¡";s:3:"â•®";s:2:"¢¢";s:3:"â•°";s:2:"¢£";s:3:"╯";s:2:"¢¤";s:3:"â•";s:2:"¢¥";s:3:"╞";s:2:"¢¦";s:3:"╪";s:2:"¢§";s:3:"â•¡";s:2:"¢¨";s:3:"â—¢";s:2:"¢©";s:3:"â—£";s:2:"¢ª";s:3:"â—¥";s:2:"¢«";s:3:"â—¤";s:2:"¢¬";s:3:"╱";s:2:"¢­";s:3:"╲";s:2:"¢®";s:3:"╳";s:2:"¢¯";s:3:"ï¼";s:2:"¢°";s:3:"1";s:2:"¢±";s:3:"ï¼’";s:2:"¢²";s:3:"3";s:2:"¢³";s:3:"ï¼”";s:2:"¢´";s:3:"5";s:2:"¢µ";s:3:"ï¼–";s:2:"¢¶";s:3:"ï¼—";s:2:"¢·";s:3:"8";s:2:"¢¸";s:3:"ï¼™";s:2:"¢¹";s:3:"â… ";s:2:"¢º";s:3:"â…¡";s:2:"¢»";s:3:"â…¢";s:2:"¢¼";s:3:"â…£";s:2:"¢½";s:3:"â…¤";s:2:"¢¾";s:3:"â…¥";s:2:"¢¿";s:3:"â…¦";s:2:"¢À";s:3:"â…§";s:2:"¢Á";s:3:"â…¨";s:2:"¢Â";s:3:"â…©";s:2:"¢Ã";s:3:"〡";s:2:"¢Ä";s:3:"〢";s:2:"¢Å";s:3:"〣";s:2:"¢Æ";s:3:"〤";s:2:"¢Ç";s:3:"〥";s:2:"¢È";s:3:"〦";s:2:"¢É";s:3:"〧";s:2:"¢Ê";s:3:"〨";s:2:"¢Ë";s:3:"〩";s:2:"¢Ì";s:3:"�";s:2:"¢Í";s:3:"å„";s:2:"¢Î";s:3:"�";s:2:"¢Ï";s:3:"A";s:2:"¢Ð";s:3:"ï¼¢";s:2:"¢Ñ";s:3:"ï¼£";s:2:"¢Ò";s:3:"D";s:2:"¢Ó";s:3:"ï¼¥";s:2:"¢Ô";s:3:"F";s:2:"¢Õ";s:3:"ï¼§";s:2:"¢Ö";s:3:"H";s:2:"¢×";s:3:"I";s:2:"¢Ø";s:3:"J";s:2:"¢Ù";s:3:"K";s:2:"¢Ú";s:3:"L";s:2:"¢Û";s:3:"ï¼­";s:2:"¢Ü";s:3:"ï¼®";s:2:"¢Ý";s:3:"O";s:2:"¢Þ";s:3:"ï¼°";s:2:"¢ß";s:3:"ï¼±";s:2:"¢à";s:3:"ï¼²";s:2:"¢á";s:3:"ï¼³";s:2:"¢â";s:3:"ï¼´";s:2:"¢ã";s:3:"ï¼µ";s:2:"¢ä";s:3:"ï¼¶";s:2:"¢å";s:3:"ï¼·";s:2:"¢æ";s:3:"X";s:2:"¢ç";s:3:"ï¼¹";s:2:"¢è";s:3:"Z";s:2:"¢é";s:3:"ï½";s:2:"¢ê";s:3:"b";s:2:"¢ë";s:3:"c";s:2:"¢ì";s:3:"d";s:2:"¢í";s:3:"ï½…";s:2:"¢î";s:3:"f";s:2:"¢ï";s:3:"g";s:2:"¢ð";s:3:"h";s:2:"¢ñ";s:3:"i";s:2:"¢ò";s:3:"j";s:2:"¢ó";s:3:"k";s:2:"¢ô";s:3:"l";s:2:"¢õ";s:3:"ï½";s:2:"¢ö";s:3:"n";s:2:"¢÷";s:3:"ï½";s:2:"¢ø";s:3:"ï½";s:2:"¢ù";s:3:"q";s:2:"¢ú";s:3:"ï½’";s:2:"¢û";s:3:"s";s:2:"¢ü";s:3:"ï½”";s:2:"¢ý";s:3:"u";s:2:"¢þ";s:3:"ï½–";s:2:"£@";s:3:"ï½—";s:2:"£A";s:3:"x";s:2:"£B";s:3:"ï½™";s:2:"£C";s:3:"z";s:2:"£D";s:2:"Α";s:2:"£E";s:2:"Î’";s:2:"£F";s:2:"Γ";s:2:"£G";s:2:"Δ";s:2:"£H";s:2:"Ε";s:2:"£I";s:2:"Ζ";s:2:"£J";s:2:"Η";s:2:"£K";s:2:"Θ";s:2:"£L";s:2:"Ι";s:2:"£M";s:2:"Κ";s:2:"£N";s:2:"Λ";s:2:"£O";s:2:"Μ";s:2:"£P";s:2:"Î";s:2:"£Q";s:2:"Ξ";s:2:"£R";s:2:"Ο";s:2:"£S";s:2:"Π";s:2:"£T";s:2:"Ρ";s:2:"£U";s:2:"Σ";s:2:"£V";s:2:"Τ";s:2:"£W";s:2:"Î¥";s:2:"£X";s:2:"Φ";s:2:"£Y";s:2:"Χ";s:2:"£Z";s:2:"Ψ";s:2:"£[";s:2:"Ω";s:2:"£\";s:2:"α";s:2:"£]";s:2:"β";s:2:"£^";s:2:"γ";s:2:"£_";s:2:"δ";s:2:"£`";s:2:"ε";s:2:"£a";s:2:"ζ";s:2:"£b";s:2:"η";s:2:"£c";s:2:"θ";s:2:"£d";s:2:"ι";s:2:"£e";s:2:"κ";s:2:"£f";s:2:"λ";s:2:"£g";s:2:"μ";s:2:"£h";s:2:"ν";s:2:"£i";s:2:"ξ";s:2:"£j";s:2:"ο";s:2:"£k";s:2:"Ï€";s:2:"£l";s:2:"Ï";s:2:"£m";s:2:"σ";s:2:"£n";s:2:"Ï„";s:2:"£o";s:2:"Ï…";s:2:"£p";s:2:"φ";s:2:"£q";s:2:"χ";s:2:"£r";s:2:"ψ";s:2:"£s";s:2:"ω";s:2:"£t";s:3:"ã„…";s:2:"£u";s:3:"ㄆ";s:2:"£v";s:3:"ㄇ";s:2:"£w";s:3:"ㄈ";s:2:"£x";s:3:"ㄉ";s:2:"£y";s:3:"ㄊ";s:2:"£z";s:3:"ã„‹";s:2:"£{";s:3:"ㄌ";s:2:"£|";s:3:"ã„";s:2:"£}";s:3:"ㄎ";s:2:"£~";s:3:"ã„";s:2:"£¡";s:3:"ã„";s:2:"£¢";s:3:"ã„‘";s:2:"££";s:3:"ã„’";s:2:"£¤";s:3:"ã„“";s:2:"£¥";s:3:"ã„”";s:2:"£¦";s:3:"ã„•";s:2:"£§";s:3:"ã„–";s:2:"£¨";s:3:"ã„—";s:2:"£©";s:3:"ㄘ";s:2:"£ª";s:3:"ã„™";s:2:"£«";s:3:"ㄚ";s:2:"£¬";s:3:"ã„›";s:2:"£­";s:3:"ㄜ";s:2:"£®";s:3:"ã„";s:2:"£¯";s:3:"ㄞ";s:2:"£°";s:3:"ㄟ";s:2:"£±";s:3:"ã„ ";s:2:"£²";s:3:"ã„¡";s:2:"£³";s:3:"ã„¢";s:2:"£´";s:3:"ã„£";s:2:"£µ";s:3:"ㄤ";s:2:"£¶";s:3:"ã„¥";s:2:"£·";s:3:"ㄦ";s:2:"£¸";s:3:"ã„§";s:2:"£¹";s:3:"ㄨ";s:2:"£º";s:3:"ã„©";s:2:"£»";s:2:"Ë™";s:2:"£¼";s:2:"ˉ";s:2:"£½";s:2:"ËŠ";s:2:"£¾";s:2:"ˇ";s:2:"£¿";s:2:"Ë‹";s:2:"¤@";s:3:"一";s:2:"¤A";s:3:"ä¹™";s:2:"¤B";s:3:"ä¸";s:2:"¤C";s:3:"七";s:2:"¤D";s:3:"乃";s:2:"¤E";s:3:"ä¹";s:2:"¤F";s:3:"了";s:2:"¤G";s:3:"二";s:2:"¤H";s:3:"人";s:2:"¤I";s:3:"å„¿";s:2:"¤J";s:3:"å…¥";s:2:"¤K";s:3:"å…«";s:2:"¤L";s:3:"几";s:2:"¤M";s:3:"刀";s:2:"¤N";s:3:"åˆ";s:2:"¤O";s:3:"力";s:2:"¤P";s:3:"匕";s:2:"¤Q";s:3:"å";s:2:"¤R";s:3:"åœ";s:2:"¤S";s:3:"åˆ";s:2:"¤T";s:3:"三";s:2:"¤U";s:3:"下";s:2:"¤V";s:3:"丈";s:2:"¤W";s:3:"上";s:2:"¤X";s:3:"丫";s:2:"¤Y";s:3:"丸";s:2:"¤Z";s:3:"凡";s:2:"¤[";s:3:"ä¹…";s:2:"¤\";s:3:"么";s:2:"¤]";s:3:"也";s:2:"¤^";s:3:"乞";s:2:"¤_";s:3:"于";s:2:"¤`";s:3:"亡";s:2:"¤a";s:3:"å…€";s:2:"¤b";s:3:"刃";s:2:"¤c";s:3:"勺";s:2:"¤d";s:3:"åƒ";s:2:"¤e";s:3:"å‰";s:2:"¤f";s:3:"å£";s:2:"¤g";s:3:"土";s:2:"¤h";s:3:"士";s:2:"¤i";s:3:"夕";s:2:"¤j";s:3:"大";s:2:"¤k";s:3:"女";s:2:"¤l";s:3:"å­";s:2:"¤m";s:3:"å­‘";s:2:"¤n";s:3:"å­“";s:2:"¤o";s:3:"寸";s:2:"¤p";s:3:"å°";s:2:"¤q";s:3:"å°¢";s:2:"¤r";s:3:"å°¸";s:2:"¤s";s:3:"å±±";s:2:"¤t";s:3:"å·";s:2:"¤u";s:3:"å·¥";s:2:"¤v";s:3:"å·±";s:2:"¤w";s:3:"å·²";s:2:"¤x";s:3:"å·³";s:2:"¤y";s:3:"å·¾";s:2:"¤z";s:3:"å¹²";s:2:"¤{";s:3:"廾";s:2:"¤|";s:3:"弋";s:2:"¤}";s:3:"弓";s:2:"¤~";s:3:"æ‰";s:2:"¤¡";s:3:"丑";s:2:"¤¢";s:3:"ä¸";s:2:"¤£";s:3:"ä¸";s:2:"¤¤";s:3:"中";s:2:"¤¥";s:3:"丰";s:2:"¤¦";s:3:"丹";s:2:"¤§";s:3:"之";s:2:"¤¨";s:3:"å°¹";s:2:"¤©";s:3:"予";s:2:"¤ª";s:3:"云";s:2:"¤«";s:3:"井";s:2:"¤¬";s:3:"互";s:2:"¤­";s:3:"五";s:2:"¤®";s:3:"亢";s:2:"¤¯";s:3:"ä»";s:2:"¤°";s:3:"什";s:2:"¤±";s:3:"仃";s:2:"¤²";s:3:"仆";s:2:"¤³";s:3:"仇";s:2:"¤´";s:3:"ä»";s:2:"¤µ";s:3:"今";s:2:"¤¶";s:3:"介";s:2:"¤·";s:3:"仄";s:2:"¤¸";s:3:"å…ƒ";s:2:"¤¹";s:3:"å…";s:2:"¤º";s:3:"å…§";s:2:"¤»";s:3:"å…­";s:2:"¤¼";s:3:"å…®";s:2:"¤½";s:3:"å…¬";s:2:"¤¾";s:3:"冗";s:2:"¤¿";s:3:"凶";s:2:"¤À";s:3:"分";s:2:"¤Á";s:3:"切";s:2:"¤Â";s:3:"刈";s:2:"¤Ã";s:3:"å‹»";s:2:"¤Ä";s:3:"勾";s:2:"¤Å";s:3:"å‹¿";s:2:"¤Æ";s:3:"化";s:2:"¤Ç";s:3:"匹";s:2:"¤È";s:3:"åˆ";s:2:"¤É";s:3:"å‡";s:2:"¤Ê";s:3:"å…";s:2:"¤Ë";s:3:"åž";s:2:"¤Ì";s:3:"厄";s:2:"¤Í";s:3:"å‹";s:2:"¤Î";s:3:"åŠ";s:2:"¤Ï";s:3:"å";s:2:"¤Ð";s:3:"壬";s:2:"¤Ñ";s:3:"天";s:2:"¤Ò";s:3:"夫";s:2:"¤Ó";s:3:"太";s:2:"¤Ô";s:3:"夭";s:2:"¤Õ";s:3:"å­”";s:2:"¤Ö";s:3:"å°‘";s:2:"¤×";s:3:"å°¤";s:2:"¤Ø";s:3:"å°º";s:2:"¤Ù";s:3:"屯";s:2:"¤Ú";s:3:"å·´";s:2:"¤Û";s:3:"å¹»";s:2:"¤Ü";s:3:"廿";s:2:"¤Ý";s:3:"å¼”";s:2:"¤Þ";s:3:"引";s:2:"¤ß";s:3:"心";s:2:"¤à";s:3:"戈";s:2:"¤á";s:3:"戶";s:2:"¤â";s:3:"手";s:2:"¤ã";s:3:"扎";s:2:"¤ä";s:3:"支";s:2:"¤å";s:3:"æ–‡";s:2:"¤æ";s:3:"æ–—";s:2:"¤ç";s:3:"æ–¤";s:2:"¤è";s:3:"æ–¹";s:2:"¤é";s:3:"æ—¥";s:2:"¤ê";s:3:"æ›°";s:2:"¤ë";s:3:"月";s:2:"¤ì";s:3:"木";s:2:"¤í";s:3:"欠";s:2:"¤î";s:3:"æ­¢";s:2:"¤ï";s:3:"æ­¹";s:2:"¤ð";s:3:"毋";s:2:"¤ñ";s:3:"比";s:2:"¤ò";s:3:"毛";s:2:"¤ó";s:3:"æ°";s:2:"¤ô";s:3:"æ°´";s:2:"¤õ";s:3:"ç«";s:2:"¤ö";s:3:"爪";s:2:"¤÷";s:3:"父";s:2:"¤ø";s:3:"爻";s:2:"¤ù";s:3:"片";s:2:"¤ú";s:3:"牙";s:2:"¤û";s:3:"牛";s:2:"¤ü";s:3:"犬";s:2:"¤ý";s:3:"王";s:2:"¤þ";s:3:"丙";s:2:"¥@";s:3:"世";s:2:"¥A";s:3:"丕";s:2:"¥B";s:3:"且";s:2:"¥C";s:3:"丘";s:2:"¥D";s:3:"主";s:2:"¥E";s:3:"ä¹";s:2:"¥F";s:3:"ä¹";s:2:"¥G";s:3:"乎";s:2:"¥H";s:3:"以";s:2:"¥I";s:3:"付";s:2:"¥J";s:3:"ä»”";s:2:"¥K";s:3:"仕";s:2:"¥L";s:3:"ä»–";s:2:"¥M";s:3:"ä»—";s:2:"¥N";s:3:"代";s:2:"¥O";s:3:"令";s:2:"¥P";s:3:"ä»™";s:2:"¥Q";s:3:"仞";s:2:"¥R";s:3:"å……";s:2:"¥S";s:3:"å…„";s:2:"¥T";s:3:"冉";s:2:"¥U";s:3:"冊";s:2:"¥V";s:3:"冬";s:2:"¥W";s:3:"凹";s:2:"¥X";s:3:"出";s:2:"¥Y";s:3:"凸";s:2:"¥Z";s:3:"刊";s:2:"¥[";s:3:"加";s:2:"¥\";s:3:"功";s:2:"¥]";s:3:"包";s:2:"¥^";s:3:"匆";s:2:"¥_";s:3:"北";s:2:"¥`";s:3:"åŒ";s:2:"¥a";s:3:"仟";s:2:"¥b";s:3:"åŠ";s:2:"¥c";s:3:"å‰";s:2:"¥d";s:3:"å¡";s:2:"¥e";s:3:"å ";s:2:"¥f";s:3:"å¯";s:2:"¥g";s:3:"å®";s:2:"¥h";s:3:"去";s:2:"¥i";s:3:"å¯";s:2:"¥j";s:3:"å¤";s:2:"¥k";s:3:"å³";s:2:"¥l";s:3:"å¬";s:2:"¥m";s:3:"å®";s:2:"¥n";s:3:"å©";s:2:"¥o";s:3:"å¨";s:2:"¥p";s:3:"å¼";s:2:"¥q";s:3:"å¸";s:2:"¥r";s:3:"åµ";s:2:"¥s";s:3:"å«";s:2:"¥t";s:3:"å¦";s:2:"¥u";s:3:"åª";s:2:"¥v";s:3:"å²";s:2:"¥w";s:3:"å±";s:2:"¥x";s:3:"å°";s:2:"¥y";s:3:"å¥";s:2:"¥z";s:3:"å­";s:2:"¥{";s:3:"å»";s:2:"¥|";s:3:"å››";s:2:"¥}";s:3:"囚";s:2:"¥~";s:3:"外";s:2:"¥¡";s:3:"央";s:2:"¥¢";s:3:"失";s:2:"¥£";s:3:"奴";s:2:"¥¤";s:3:"奶";s:2:"¥¥";s:3:"å­•";s:2:"¥¦";s:3:"它";s:2:"¥§";s:3:"å°¼";s:2:"¥¨";s:3:"å·¨";s:2:"¥©";s:3:"å·§";s:2:"¥ª";s:3:"å·¦";s:2:"¥«";s:3:"市";s:2:"¥¬";s:3:"布";s:2:"¥­";s:3:"å¹³";s:2:"¥®";s:3:"å¹¼";s:2:"¥¯";s:3:"å¼";s:2:"¥°";s:3:"弘";s:2:"¥±";s:3:"å¼—";s:2:"¥²";s:3:"å¿…";s:2:"¥³";s:3:"戊";s:2:"¥´";s:3:"打";s:2:"¥µ";s:3:"扔";s:2:"¥¶";s:3:"扒";s:2:"¥·";s:3:"扑";s:2:"¥¸";s:3:"æ–¥";s:2:"¥¹";s:3:"æ—¦";s:2:"¥º";s:3:"朮";s:2:"¥»";s:3:"本";s:2:"¥¼";s:3:"未";s:2:"¥½";s:3:"末";s:2:"¥¾";s:3:"札";s:2:"¥¿";s:3:"æ­£";s:2:"¥À";s:3:"æ¯";s:2:"¥Á";s:3:"æ°‘";s:2:"¥Â";s:3:"æ°";s:2:"¥Ã";s:3:"æ°¸";s:2:"¥Ä";s:3:"æ±";s:2:"¥Å";s:3:"æ±€";s:2:"¥Æ";s:3:"æ°¾";s:2:"¥Ç";s:3:"犯";s:2:"¥È";s:3:"玄";s:2:"¥É";s:3:"玉";s:2:"¥Ê";s:3:"瓜";s:2:"¥Ë";s:3:"瓦";s:2:"¥Ì";s:3:"甘";s:2:"¥Í";s:3:"生";s:2:"¥Î";s:3:"用";s:2:"¥Ï";s:3:"甩";s:2:"¥Ð";s:3:"ç”°";s:2:"¥Ñ";s:3:"ç”±";s:2:"¥Ò";s:3:"甲";s:2:"¥Ó";s:3:"申";s:2:"¥Ô";s:3:"ç–‹";s:2:"¥Õ";s:3:"白";s:2:"¥Ö";s:3:"çš®";s:2:"¥×";s:3:"çš¿";s:2:"¥Ø";s:3:"ç›®";s:2:"¥Ù";s:3:"矛";s:2:"¥Ú";s:3:"矢";s:2:"¥Û";s:3:"石";s:2:"¥Ü";s:3:"示";s:2:"¥Ý";s:3:"禾";s:2:"¥Þ";s:3:"ç©´";s:2:"¥ß";s:3:"ç«‹";s:2:"¥à";s:3:"丞";s:2:"¥á";s:3:"丟";s:2:"¥â";s:3:"ä¹’";s:2:"¥ã";s:3:"乓";s:2:"¥ä";s:3:"乩";s:2:"¥å";s:3:"亙";s:2:"¥æ";s:3:"交";s:2:"¥ç";s:3:"亦";s:2:"¥è";s:3:"亥";s:2:"¥é";s:3:"仿";s:2:"¥ê";s:3:"伉";s:2:"¥ë";s:3:"ä¼™";s:2:"¥ì";s:3:"伊";s:2:"¥í";s:3:"伕";s:2:"¥î";s:3:"ä¼";s:2:"¥ï";s:3:"ä¼";s:2:"¥ð";s:3:"休";s:2:"¥ñ";s:3:"ä¼";s:2:"¥ò";s:3:"仲";s:2:"¥ó";s:3:"ä»¶";s:2:"¥ô";s:3:"ä»»";s:2:"¥õ";s:3:"ä»°";s:2:"¥ö";s:3:"仳";s:2:"¥÷";s:3:"份";s:2:"¥ø";s:3:"ä¼";s:2:"¥ù";s:3:"伋";s:2:"¥ú";s:3:"å…‰";s:2:"¥û";s:3:"å…‡";s:2:"¥ü";s:3:"å…†";s:2:"¥ý";s:3:"å…ˆ";s:2:"¥þ";s:3:"å…¨";s:2:"¦@";s:3:"å…±";s:2:"¦A";s:3:"å†";s:2:"¦B";s:3:"冰";s:2:"¦C";s:3:"列";s:2:"¦D";s:3:"刑";s:2:"¦E";s:3:"划";s:2:"¦F";s:3:"刎";s:2:"¦G";s:3:"刖";s:2:"¦H";s:3:"劣";s:2:"¦I";s:3:"匈";s:2:"¦J";s:3:"匡";s:2:"¦K";s:3:"匠";s:2:"¦L";s:3:"å°";s:2:"¦M";s:3:"å±";s:2:"¦N";s:3:"å‰";s:2:"¦O";s:3:"å";s:2:"¦P";s:3:"åŒ";s:2:"¦Q";s:3:"åŠ";s:2:"¦R";s:3:"å";s:2:"¦S";s:3:"å";s:2:"¦T";s:3:"å‹";s:2:"¦U";s:3:"å„";s:2:"¦V";s:3:"å‘";s:2:"¦W";s:3:"å";s:2:"¦X";s:3:"åˆ";s:2:"¦Y";s:3:"åƒ";s:2:"¦Z";s:3:"åŽ";s:2:"¦[";s:3:"å†";s:2:"¦\";s:3:"å’";s:2:"¦]";s:3:"å› ";s:2:"¦^";s:3:"回";s:2:"¦_";s:3:"å›";s:2:"¦`";s:3:"圳";s:2:"¦a";s:3:"地";s:2:"¦b";s:3:"在";s:2:"¦c";s:3:"圭";s:2:"¦d";s:3:"圬";s:2:"¦e";s:3:"圯";s:2:"¦f";s:3:"圩";s:2:"¦g";s:3:"夙";s:2:"¦h";s:3:"多";s:2:"¦i";s:3:"夷";s:2:"¦j";s:3:"夸";s:2:"¦k";s:3:"妄";s:2:"¦l";s:3:"奸";s:2:"¦m";s:3:"妃";s:2:"¦n";s:3:"好";s:2:"¦o";s:3:"她";s:2:"¦p";s:3:"如";s:2:"¦q";s:3:"å¦";s:2:"¦r";s:3:"å­—";s:2:"¦s";s:3:"å­˜";s:2:"¦t";s:3:"宇";s:2:"¦u";s:3:"守";s:2:"¦v";s:3:"å®…";s:2:"¦w";s:3:"安";s:2:"¦x";s:3:"寺";s:2:"¦y";s:3:"å°–";s:2:"¦z";s:3:"å±¹";s:2:"¦{";s:3:"å·ž";s:2:"¦|";s:3:"帆";s:2:"¦}";s:3:"å¹¶";s:2:"¦~";s:3:"å¹´";s:2:"¦¡";s:3:"å¼";s:2:"¦¢";s:3:"å¼›";s:2:"¦£";s:3:"å¿™";s:2:"¦¤";s:3:"å¿–";s:2:"¦¥";s:3:"戎";s:2:"¦¦";s:3:"戌";s:2:"¦§";s:3:"æˆ";s:2:"¦¨";s:3:"æˆ";s:2:"¦©";s:3:"扣";s:2:"¦ª";s:3:"扛";s:2:"¦«";s:3:"托";s:2:"¦¬";s:3:"æ”¶";s:2:"¦­";s:3:"æ—©";s:2:"¦®";s:3:"æ—¨";s:2:"¦¯";s:3:"æ—¬";s:2:"¦°";s:3:"æ—­";s:2:"¦±";s:3:"曲";s:2:"¦²";s:3:"曳";s:2:"¦³";s:3:"有";s:2:"¦´";s:3:"朽";s:2:"¦µ";s:3:"朴";s:2:"¦¶";s:3:"朱";s:2:"¦·";s:3:"朵";s:2:"¦¸";s:3:"次";s:2:"¦¹";s:3:"æ­¤";s:2:"¦º";s:3:"æ­»";s:2:"¦»";s:3:"æ°–";s:2:"¦¼";s:3:"æ±";s:2:"¦½";s:3:"æ±—";s:2:"¦¾";s:3:"æ±™";s:2:"¦¿";s:3:"江";s:2:"¦À";s:3:"æ± ";s:2:"¦Á";s:3:"æ±";s:2:"¦Â";s:3:"汕";s:2:"¦Ã";s:3:"污";s:2:"¦Ä";s:3:"æ±›";s:2:"¦Å";s:3:"æ±";s:2:"¦Æ";s:3:"汎";s:2:"¦Ç";s:3:"ç°";s:2:"¦È";s:3:"牟";s:2:"¦É";s:3:"ç‰";s:2:"¦Ê";s:3:"百";s:2:"¦Ë";s:3:"竹";s:2:"¦Ì";s:3:"ç±³";s:2:"¦Í";s:3:"糸";s:2:"¦Î";s:3:"ç¼¶";s:2:"¦Ï";s:3:"羊";s:2:"¦Ð";s:3:"ç¾½";s:2:"¦Ñ";s:3:"è€";s:2:"¦Ò";s:3:"考";s:2:"¦Ó";s:3:"而";s:2:"¦Ô";s:3:"耒";s:2:"¦Õ";s:3:"耳";s:2:"¦Ö";s:3:"è¿";s:2:"¦×";s:3:"肉";s:2:"¦Ø";s:3:"è‚‹";s:2:"¦Ù";s:3:"肌";s:2:"¦Ú";s:3:"臣";s:2:"¦Û";s:3:"自";s:2:"¦Ü";s:3:"至";s:2:"¦Ý";s:3:"臼";s:2:"¦Þ";s:3:"舌";s:2:"¦ß";s:3:"舛";s:2:"¦à";s:3:"舟";s:2:"¦á";s:3:"艮";s:2:"¦â";s:3:"色";s:2:"¦ã";s:3:"艾";s:2:"¦ä";s:3:"虫";s:2:"¦å";s:3:"è¡€";s:2:"¦æ";s:3:"行";s:2:"¦ç";s:3:"è¡£";s:2:"¦è";s:3:"西";s:2:"¦é";s:3:"阡";s:2:"¦ê";s:3:"串";s:2:"¦ë";s:3:"亨";s:2:"¦ì";s:3:"ä½";s:2:"¦í";s:3:"ä½";s:2:"¦î";s:3:"佇";s:2:"¦ï";s:3:"ä½—";s:2:"¦ð";s:3:"佞";s:2:"¦ñ";s:3:"ä¼´";s:2:"¦ò";s:3:"ä½›";s:2:"¦ó";s:3:"何";s:2:"¦ô";s:3:"ä¼°";s:2:"¦õ";s:3:"ä½";s:2:"¦ö";s:3:"佑";s:2:"¦÷";s:3:"ä¼½";s:2:"¦ø";s:3:"伺";s:2:"¦ù";s:3:"伸";s:2:"¦ú";s:3:"佃";s:2:"¦û";s:3:"ä½”";s:2:"¦ü";s:3:"ä¼¼";s:2:"¦ý";s:3:"但";s:2:"¦þ";s:3:"ä½£";s:2:"§@";s:3:"作";s:2:"§A";s:3:"ä½ ";s:2:"§B";s:3:"伯";s:2:"§C";s:3:"低";s:2:"§D";s:3:"ä¼¶";s:2:"§E";s:3:"ä½™";s:2:"§F";s:3:"ä½";s:2:"§G";s:3:"佈";s:2:"§H";s:3:"佚";s:2:"§I";s:3:"å…Œ";s:2:"§J";s:3:"å…‹";s:2:"§K";s:3:"å…";s:2:"§L";s:3:"å…µ";s:2:"§M";s:3:"冶";s:2:"§N";s:3:"冷";s:2:"§O";s:3:"別";s:2:"§P";s:3:"判";s:2:"§Q";s:3:"利";s:2:"§R";s:3:"刪";s:2:"§S";s:3:"刨";s:2:"§T";s:3:"劫";s:2:"§U";s:3:"助";s:2:"§V";s:3:"努";s:2:"§W";s:3:"劬";s:2:"§X";s:3:"匣";s:2:"§Y";s:3:"å³";s:2:"§Z";s:3:"åµ";s:2:"§[";s:3:"å";s:2:"§\";s:3:"å­";s:2:"§]";s:3:"åž";s:2:"§^";s:3:"å¾";s:2:"§_";s:3:"å¦";s:2:"§`";s:3:"呎";s:2:"§a";s:3:"å§";s:2:"§b";s:3:"呆";s:2:"§c";s:3:"呃";s:2:"§d";s:3:"å³";s:2:"§e";s:3:"呈";s:2:"§f";s:3:"å‘‚";s:2:"§g";s:3:"å›";s:2:"§h";s:3:"å©";s:2:"§i";s:3:"告";s:2:"§j";s:3:"å¹";s:2:"§k";s:3:"å»";s:2:"§l";s:3:"å¸";s:2:"§m";s:3:"å®";s:2:"§n";s:3:"åµ";s:2:"§o";s:3:"å¶";s:2:"§p";s:3:"å ";s:2:"§q";s:3:"å¼";s:2:"§r";s:3:"å‘€";s:2:"§s";s:3:"å±";s:2:"§t";s:3:"å«";s:2:"§u";s:3:"åŸ";s:2:"§v";s:3:"å¬";s:2:"§w";s:3:"囪";s:2:"§x";s:3:"å›°";s:2:"§y";s:3:"囤";s:2:"§z";s:3:"囫";s:2:"§{";s:3:"åŠ";s:2:"§|";s:3:"å‘";s:2:"§}";s:3:"å€";s:2:"§~";s:3:"å";s:2:"§¡";s:3:"å‡";s:2:"§¢";s:3:"åŽ";s:2:"§£";s:3:"圾";s:2:"§¤";s:3:"å";s:2:"§¥";s:3:"å";s:2:"§¦";s:3:"圻";s:2:"§§";s:3:"壯";s:2:"§¨";s:3:"夾";s:2:"§©";s:3:"å¦";s:2:"§ª";s:3:"妒";s:2:"§«";s:3:"妨";s:2:"§¬";s:3:"妞";s:2:"§­";s:3:"妣";s:2:"§®";s:3:"妙";s:2:"§¯";s:3:"妖";s:2:"§°";s:3:"å¦";s:2:"§±";s:3:"妤";s:2:"§²";s:3:"妓";s:2:"§³";s:3:"妊";s:2:"§´";s:3:"妥";s:2:"§µ";s:3:"å­";s:2:"§¶";s:3:"å­œ";s:2:"§·";s:3:"å­š";s:2:"§¸";s:3:"å­›";s:2:"§¹";s:3:"完";s:2:"§º";s:3:"宋";s:2:"§»";s:3:"å®";s:2:"§¼";s:3:"å°¬";s:2:"§½";s:3:"å±€";s:2:"§¾";s:3:"å±";s:2:"§¿";s:3:"å°¿";s:2:"§À";s:3:"å°¾";s:2:"§Á";s:3:"å²";s:2:"§Â";s:3:"岑";s:2:"§Ã";s:3:"å²”";s:2:"§Ä";s:3:"岌";s:2:"§Å";s:3:"å·«";s:2:"§Æ";s:3:"希";s:2:"§Ç";s:3:"åº";s:2:"§È";s:3:"庇";s:2:"§É";s:3:"床";s:2:"§Ê";s:3:"å»·";s:2:"§Ë";s:3:"弄";s:2:"§Ì";s:3:"弟";s:2:"§Í";s:3:"彤";s:2:"§Î";s:3:"å½¢";s:2:"§Ï";s:3:"å½·";s:2:"§Ð";s:3:"å½¹";s:2:"§Ñ";s:3:"忘";s:2:"§Ò";s:3:"忌";s:2:"§Ó";s:3:"å¿—";s:2:"§Ô";s:3:"å¿";s:2:"§Õ";s:3:"忱";s:2:"§Ö";s:3:"å¿«";s:2:"§×";s:3:"忸";s:2:"§Ø";s:3:"忪";s:2:"§Ù";s:3:"戒";s:2:"§Ú";s:3:"我";s:2:"§Û";s:3:"抄";s:2:"§Ü";s:3:"抗";s:2:"§Ý";s:3:"抖";s:2:"§Þ";s:3:"技";s:2:"§ß";s:3:"扶";s:2:"§à";s:3:"抉";s:2:"§á";s:3:"扭";s:2:"§â";s:3:"把";s:2:"§ã";s:3:"扼";s:2:"§ä";s:3:"找";s:2:"§å";s:3:"批";s:2:"§æ";s:3:"扳";s:2:"§ç";s:3:"抒";s:2:"§è";s:3:"扯";s:2:"§é";s:3:"折";s:2:"§ê";s:3:"扮";s:2:"§ë";s:3:"投";s:2:"§ì";s:3:"抓";s:2:"§í";s:3:"抑";s:2:"§î";s:3:"抆";s:2:"§ï";s:3:"改";s:2:"§ð";s:3:"æ”»";s:2:"§ñ";s:3:"攸";s:2:"§ò";s:3:"æ—±";s:2:"§ó";s:3:"æ›´";s:2:"§ô";s:3:"æŸ";s:2:"§õ";s:3:"æŽ";s:2:"§ö";s:3:"æ";s:2:"§÷";s:3:"æ";s:2:"§ø";s:3:"æ‘";s:2:"§ù";s:3:"æœ";s:2:"§ú";s:3:"æ–";s:2:"§û";s:3:"æž";s:2:"§ü";s:3:"æ‰";s:2:"§ý";s:3:"æ†";s:2:"§þ";s:3:"æ ";s:2:"¨@";s:3:"æ“";s:2:"¨A";s:3:"æ—";s:2:"¨B";s:3:"æ­¥";s:2:"¨C";s:3:"æ¯";s:2:"¨D";s:3:"求";s:2:"¨E";s:3:"汞";s:2:"¨F";s:3:"æ²™";s:2:"¨G";s:3:"æ²";s:2:"¨H";s:3:"沈";s:2:"¨I";s:3:"沉";s:2:"¨J";s:3:"æ²…";s:2:"¨K";s:3:"æ²›";s:2:"¨L";s:3:"汪";s:2:"¨M";s:3:"決";s:2:"¨N";s:3:"æ²";s:2:"¨O";s:3:"æ±°";s:2:"¨P";s:3:"沌";s:2:"¨Q";s:3:"汨";s:2:"¨R";s:3:"æ²–";s:2:"¨S";s:3:"æ²’";s:2:"¨T";s:3:"æ±½";s:2:"¨U";s:3:"沃";s:2:"¨V";s:3:"æ±²";s:2:"¨W";s:3:"æ±¾";s:2:"¨X";s:3:"æ±´";s:2:"¨Y";s:3:"沆";s:2:"¨Z";s:3:"æ±¶";s:2:"¨[";s:3:"æ²";s:2:"¨\";s:3:"æ²”";s:2:"¨]";s:3:"沘";s:2:"¨^";s:3:"沂";s:2:"¨_";s:3:"ç¶";s:2:"¨`";s:3:"ç¼";s:2:"¨a";s:3:"ç½";s:2:"¨b";s:3:"ç¸";s:2:"¨c";s:3:"牢";s:2:"¨d";s:3:"牡";s:2:"¨e";s:3:"牠";s:2:"¨f";s:3:"ç‹„";s:2:"¨g";s:3:"ç‹‚";s:2:"¨h";s:3:"玖";s:2:"¨i";s:3:"甬";s:2:"¨j";s:3:"甫";s:2:"¨k";s:3:"ç”·";s:2:"¨l";s:3:"甸";s:2:"¨m";s:3:"çš‚";s:2:"¨n";s:3:"盯";s:2:"¨o";s:3:"矣";s:2:"¨p";s:3:"ç§";s:2:"¨q";s:3:"ç§€";s:2:"¨r";s:3:"禿";s:2:"¨s";s:3:"ç©¶";s:2:"¨t";s:3:"ç³»";s:2:"¨u";s:3:"罕";s:2:"¨v";s:3:"è‚–";s:2:"¨w";s:3:"è‚“";s:2:"¨x";s:3:"è‚";s:2:"¨y";s:3:"肘";s:2:"¨z";s:3:"è‚›";s:2:"¨{";s:3:"肚";s:2:"¨|";s:3:"育";s:2:"¨}";s:3:"良";s:2:"¨~";s:3:"芒";s:2:"¨¡";s:3:"芋";s:2:"¨¢";s:3:"èŠ";s:2:"¨£";s:3:"見";s:2:"¨¤";s:3:"è§’";s:2:"¨¥";s:3:"言";s:2:"¨¦";s:3:"è°·";s:2:"¨§";s:3:"豆";s:2:"¨¨";s:3:"豕";s:2:"¨©";s:3:"è²";s:2:"¨ª";s:3:"赤";s:2:"¨«";s:3:"èµ°";s:2:"¨¬";s:3:"è¶³";s:2:"¨­";s:3:"身";s:2:"¨®";s:3:"車";s:2:"¨¯";s:3:"è¾›";s:2:"¨°";s:3:"è¾°";s:2:"¨±";s:3:"è¿‚";s:2:"¨²";s:3:"迆";s:2:"¨³";s:3:"è¿…";s:2:"¨´";s:3:"è¿„";s:2:"¨µ";s:3:"å·¡";s:2:"¨¶";s:3:"é‚‘";s:2:"¨·";s:3:"é‚¢";s:2:"¨¸";s:3:"邪";s:2:"¨¹";s:3:"邦";s:2:"¨º";s:3:"é‚£";s:2:"¨»";s:3:"é…‰";s:2:"¨¼";s:3:"釆";s:2:"¨½";s:3:"里";s:2:"¨¾";s:3:"防";s:2:"¨¿";s:3:"阮";s:2:"¨À";s:3:"阱";s:2:"¨Á";s:3:"阪";s:2:"¨Â";s:3:"阬";s:2:"¨Ã";s:3:"並";s:2:"¨Ä";s:3:"ä¹–";s:2:"¨Å";s:3:"ä¹³";s:2:"¨Æ";s:3:"事";s:2:"¨Ç";s:3:"些";s:2:"¨È";s:3:"亞";s:2:"¨É";s:3:"享";s:2:"¨Ê";s:3:"京";s:2:"¨Ë";s:3:"佯";s:2:"¨Ì";s:3:"ä¾";s:2:"¨Í";s:3:"ä¾";s:2:"¨Î";s:3:"ä½³";s:2:"¨Ï";s:3:"使";s:2:"¨Ð";s:3:"佬";s:2:"¨Ñ";s:3:"ä¾›";s:2:"¨Ò";s:3:"例";s:2:"¨Ó";s:3:"來";s:2:"¨Ô";s:3:"侃";s:2:"¨Õ";s:3:"ä½°";s:2:"¨Ö";s:3:"ä½µ";s:2:"¨×";s:3:"侈";s:2:"¨Ø";s:3:"佩";s:2:"¨Ù";s:3:"ä½»";s:2:"¨Ú";s:3:"ä¾–";s:2:"¨Û";s:3:"ä½¾";s:2:"¨Ü";s:3:"ä¾";s:2:"¨Ý";s:3:"侑";s:2:"¨Þ";s:3:"佺";s:2:"¨ß";s:3:"å…”";s:2:"¨à";s:3:"å…’";s:2:"¨á";s:3:"å…•";s:2:"¨â";s:3:"å…©";s:2:"¨ã";s:3:"å…·";s:2:"¨ä";s:3:"å…¶";s:2:"¨å";s:3:"å…¸";s:2:"¨æ";s:3:"冽";s:2:"¨ç";s:3:"函";s:2:"¨è";s:3:"刻";s:2:"¨é";s:3:"券";s:2:"¨ê";s:3:"刷";s:2:"¨ë";s:3:"刺";s:2:"¨ì";s:3:"到";s:2:"¨í";s:3:"刮";s:2:"¨î";s:3:"制";s:2:"¨ï";s:3:"å‰";s:2:"¨ð";s:3:"劾";s:2:"¨ñ";s:3:"劻";s:2:"¨ò";s:3:"å’";s:2:"¨ó";s:3:"å”";s:2:"¨ô";s:3:"å“";s:2:"¨õ";s:3:"å‘";s:2:"¨ö";s:3:"å¦";s:2:"¨÷";s:3:"å·";s:2:"¨ø";s:3:"å¸";s:2:"¨ù";s:3:"å¹";s:2:"¨ú";s:3:"å–";s:2:"¨û";s:3:"å”";s:2:"¨ü";s:3:"å—";s:2:"¨ý";s:3:"味";s:2:"¨þ";s:3:"呵";s:2:"©@";s:3:"å’–";s:2:"©A";s:3:"呸";s:2:"©B";s:3:"å’•";s:2:"©C";s:3:"å’€";s:2:"©D";s:3:"å‘»";s:2:"©E";s:3:"å‘·";s:2:"©F";s:3:"å’„";s:2:"©G";s:3:"å’’";s:2:"©H";s:3:"å’†";s:2:"©I";s:3:"呼";s:2:"©J";s:3:"å’";s:2:"©K";s:3:"呱";s:2:"©L";s:3:"å‘¶";s:2:"©M";s:3:"å’Œ";s:2:"©N";s:3:"å’š";s:2:"©O";s:3:"å‘¢";s:2:"©P";s:3:"周";s:2:"©Q";s:3:"å’‹";s:2:"©R";s:3:"命";s:2:"©S";s:3:"å’Ž";s:2:"©T";s:3:"固";s:2:"©U";s:3:"垃";s:2:"©V";s:3:"å·";s:2:"©W";s:3:"åª";s:2:"©X";s:3:"å©";s:2:"©Y";s:3:"å¡";s:2:"©Z";s:3:"å¦";s:2:"©[";s:3:"å¤";s:2:"©\";s:3:"å¼";s:2:"©]";s:3:"夜";s:2:"©^";s:3:"奉";s:2:"©_";s:3:"奇";s:2:"©`";s:3:"奈";s:2:"©a";s:3:"奄";s:2:"©b";s:3:"奔";s:2:"©c";s:3:"妾";s:2:"©d";s:3:"妻";s:2:"©e";s:3:"å§”";s:2:"©f";s:3:"妹";s:2:"©g";s:3:"妮";s:2:"©h";s:3:"å§‘";s:2:"©i";s:3:"姆";s:2:"©j";s:3:"å§";s:2:"©k";s:3:"å§";s:2:"©l";s:3:"å§‹";s:2:"©m";s:3:"å§“";s:2:"©n";s:3:"å§Š";s:2:"©o";s:3:"妯";s:2:"©p";s:3:"妳";s:2:"©q";s:3:"å§’";s:2:"©r";s:3:"å§…";s:2:"©s";s:3:"å­Ÿ";s:2:"©t";s:3:"å­¤";s:2:"©u";s:3:"å­£";s:2:"©v";s:3:"å®—";s:2:"©w";s:3:"定";s:2:"©x";s:3:"官";s:2:"©y";s:3:"宜";s:2:"©z";s:3:"å®™";s:2:"©{";s:3:"å®›";s:2:"©|";s:3:"å°š";s:2:"©}";s:3:"屈";s:2:"©~";s:3:"å±…";s:2:"©¡";s:3:"屆";s:2:"©¢";s:3:"å²·";s:2:"©£";s:3:"岡";s:2:"©¤";s:3:"岸";s:2:"©¥";s:3:"岩";s:2:"©¦";s:3:"岫";s:2:"©§";s:3:"å²±";s:2:"©¨";s:3:"å²³";s:2:"©©";s:3:"帘";s:2:"©ª";s:3:"帚";s:2:"©«";s:3:"帖";s:2:"©¬";s:3:"帕";s:2:"©­";s:3:"帛";s:2:"©®";s:3:"帑";s:2:"©¯";s:3:"幸";s:2:"©°";s:3:"庚";s:2:"©±";s:3:"店";s:2:"©²";s:3:"府";s:2:"©³";s:3:"底";s:2:"©´";s:3:"庖";s:2:"©µ";s:3:"å»¶";s:2:"©¶";s:3:"弦";s:2:"©·";s:3:"å¼§";s:2:"©¸";s:3:"弩";s:2:"©¹";s:3:"å¾€";s:2:"©º";s:3:"å¾";s:2:"©»";s:3:"彿";s:2:"©¼";s:3:"å½¼";s:2:"©½";s:3:"å¿";s:2:"©¾";s:3:"å¿ ";s:2:"©¿";s:3:"忽";s:2:"©À";s:3:"念";s:2:"©Á";s:3:"å¿¿";s:2:"©Â";s:3:"æ€";s:2:"©Ã";s:3:"怔";s:2:"©Ä";s:3:"怯";s:2:"©Å";s:3:"怵";s:2:"©Æ";s:3:"怖";s:2:"©Ç";s:3:"怪";s:2:"©È";s:3:"怕";s:2:"©É";s:3:"怡";s:2:"©Ê";s:3:"性";s:2:"©Ë";s:3:"怩";s:2:"©Ì";s:3:"怫";s:2:"©Í";s:3:"怛";s:2:"©Î";s:3:"或";s:2:"©Ï";s:3:"戕";s:2:"©Ð";s:3:"房";s:2:"©Ñ";s:3:"戾";s:2:"©Ò";s:3:"所";s:2:"©Ó";s:3:"承";s:2:"©Ô";s:3:"拉";s:2:"©Õ";s:3:"拌";s:2:"©Ö";s:3:"æ‹„";s:2:"©×";s:3:"抿";s:2:"©Ø";s:3:"æ‹‚";s:2:"©Ù";s:3:"抹";s:2:"©Ú";s:3:"æ‹’";s:2:"©Û";s:3:"æ‹›";s:2:"©Ü";s:3:"披";s:2:"©Ý";s:3:"æ‹“";s:2:"©Þ";s:3:"æ‹”";s:2:"©ß";s:3:"æ‹‹";s:2:"©à";s:3:"拈";s:2:"©á";s:3:"抨";s:2:"©â";s:3:"抽";s:2:"©ã";s:3:"押";s:2:"©ä";s:3:"æ‹";s:2:"©å";s:3:"æ‹™";s:2:"©æ";s:3:"拇";s:2:"©ç";s:3:"æ‹";s:2:"©è";s:3:"抵";s:2:"©é";s:3:"拚";s:2:"©ê";s:3:"抱";s:2:"©ë";s:3:"拘";s:2:"©ì";s:3:"æ‹–";s:2:"©í";s:3:"æ‹—";s:2:"©î";s:3:"拆";s:2:"©ï";s:3:"抬";s:2:"©ð";s:3:"拎";s:2:"©ñ";s:3:"放";s:2:"©ò";s:3:"æ–§";s:2:"©ó";s:3:"æ–¼";s:2:"©ô";s:3:"æ—º";s:2:"©õ";s:3:"昔";s:2:"©ö";s:3:"易";s:2:"©÷";s:3:"昌";s:2:"©ø";s:3:"昆";s:2:"©ù";s:3:"昂";s:2:"©ú";s:3:"明";s:2:"©û";s:3:"昀";s:2:"©ü";s:3:"æ˜";s:2:"©ý";s:3:"昕";s:2:"©þ";s:3:"昊";s:2:"ª@";s:3:"昇";s:2:"ªA";s:3:"æœ";s:2:"ªB";s:3:"朋";s:2:"ªC";s:3:"æ­";s:2:"ªD";s:3:"æž‹";s:2:"ªE";s:3:"æž•";s:2:"ªF";s:3:"æ±";s:2:"ªG";s:3:"æžœ";s:2:"ªH";s:3:"æ³";s:2:"ªI";s:3:"æ·";s:2:"ªJ";s:3:"枇";s:2:"ªK";s:3:"æž";s:2:"ªL";s:3:"æž—";s:2:"ªM";s:3:"æ¯";s:2:"ªN";s:3:"æ°";s:2:"ªO";s:3:"æ¿";s:2:"ªP";s:3:"枉";s:2:"ªQ";s:3:"æ¾";s:2:"ªR";s:3:"æž";s:2:"ªS";s:3:"æµ";s:2:"ªT";s:3:"æžš";s:2:"ªU";s:3:"æž“";s:2:"ªV";s:3:"æ¼";s:2:"ªW";s:3:"æª";s:2:"ªX";s:3:"æ²";s:2:"ªY";s:3:"欣";s:2:"ªZ";s:3:"æ­¦";s:2:"ª[";s:3:"æ­§";s:2:"ª\";s:3:"æ­¿";s:2:"ª]";s:3:"æ°“";s:2:"ª^";s:3:"æ°›";s:2:"ª_";s:3:"æ³£";s:2:"ª`";s:3:"注";s:2:"ªa";s:3:"æ³³";s:2:"ªb";s:3:"æ²±";s:2:"ªc";s:3:"泌";s:2:"ªd";s:3:"æ³¥";s:2:"ªe";s:3:"æ²³";s:2:"ªf";s:3:"æ²½";s:2:"ªg";s:3:"æ²¾";s:2:"ªh";s:3:"æ²¼";s:2:"ªi";s:3:"æ³¢";s:2:"ªj";s:3:"沫";s:2:"ªk";s:3:"法";s:2:"ªl";s:3:"泓";s:2:"ªm";s:3:"沸";s:2:"ªn";s:3:"泄";s:2:"ªo";s:3:"æ²¹";s:2:"ªp";s:3:"æ³";s:2:"ªq";s:3:"æ²®";s:2:"ªr";s:3:"æ³—";s:2:"ªs";s:3:"æ³…";s:2:"ªt";s:3:"æ³±";s:2:"ªu";s:3:"沿";s:2:"ªv";s:3:"æ²»";s:2:"ªw";s:3:"泡";s:2:"ªx";s:3:"æ³›";s:2:"ªy";s:3:"泊";s:2:"ªz";s:3:"沬";s:2:"ª{";s:3:"泯";s:2:"ª|";s:3:"泜";s:2:"ª}";s:3:"æ³–";s:2:"ª~";s:3:"æ³ ";s:2:"ª¡";s:3:"ç‚•";s:2:"ª¢";s:3:"炎";s:2:"ª£";s:3:"ç‚’";s:2:"ª¤";s:3:"炊";s:2:"ª¥";s:3:"ç‚™";s:2:"ª¦";s:3:"爬";s:2:"ª§";s:3:"爭";s:2:"ª¨";s:3:"爸";s:2:"ª©";s:3:"版";s:2:"ªª";s:3:"牧";s:2:"ª«";s:3:"物";s:2:"ª¬";s:3:"ç‹€";s:2:"ª­";s:3:"狎";s:2:"ª®";s:3:"ç‹™";s:2:"ª¯";s:3:"ç‹—";s:2:"ª°";s:3:"ç‹";s:2:"ª±";s:3:"玩";s:2:"ª²";s:3:"玨";s:2:"ª³";s:3:"玟";s:2:"ª´";s:3:"玫";s:2:"ªµ";s:3:"玥";s:2:"ª¶";s:3:"甽";s:2:"ª·";s:3:"ç–";s:2:"ª¸";s:3:"ç–™";s:2:"ª¹";s:3:"ç–š";s:2:"ªº";s:3:"çš„";s:2:"ª»";s:3:"盂";s:2:"ª¼";s:3:"盲";s:2:"ª½";s:3:"ç›´";s:2:"ª¾";s:3:"知";s:2:"ª¿";s:3:"矽";s:2:"ªÀ";s:3:"社";s:2:"ªÁ";s:3:"祀";s:2:"ªÂ";s:3:"ç¥";s:2:"ªÃ";s:3:"秉";s:2:"ªÄ";s:3:"秈";s:2:"ªÅ";s:3:"空";s:2:"ªÆ";s:3:"穹";s:2:"ªÇ";s:3:"竺";s:2:"ªÈ";s:3:"ç³¾";s:2:"ªÉ";s:3:"ç½”";s:2:"ªÊ";s:3:"羌";s:2:"ªË";s:3:"羋";s:2:"ªÌ";s:3:"者";s:2:"ªÍ";s:3:"肺";s:2:"ªÎ";s:3:"è‚¥";s:2:"ªÏ";s:3:"è‚¢";s:2:"ªÐ";s:3:"肱";s:2:"ªÑ";s:3:"è‚¡";s:2:"ªÒ";s:3:"è‚«";s:2:"ªÓ";s:3:"è‚©";s:2:"ªÔ";s:3:"è‚´";s:2:"ªÕ";s:3:"肪";s:2:"ªÖ";s:3:"肯";s:2:"ª×";s:3:"臥";s:2:"ªØ";s:3:"臾";s:2:"ªÙ";s:3:"èˆ";s:2:"ªÚ";s:3:"芳";s:2:"ªÛ";s:3:"èŠ";s:2:"ªÜ";s:3:"芙";s:2:"ªÝ";s:3:"芭";s:2:"ªÞ";s:3:"芽";s:2:"ªß";s:3:"芟";s:2:"ªà";s:3:"芹";s:2:"ªá";s:3:"花";s:2:"ªâ";s:3:"芬";s:2:"ªã";s:3:"芥";s:2:"ªä";s:3:"芯";s:2:"ªå";s:3:"芸";s:2:"ªæ";s:3:"芣";s:2:"ªç";s:3:"芰";s:2:"ªè";s:3:"芾";s:2:"ªé";s:3:"芷";s:2:"ªê";s:3:"虎";s:2:"ªë";s:3:"è™±";s:2:"ªì";s:3:"åˆ";s:2:"ªí";s:3:"表";s:2:"ªî";s:3:"軋";s:2:"ªï";s:3:"迎";s:2:"ªð";s:3:"è¿”";s:2:"ªñ";s:3:"è¿‘";s:2:"ªò";s:3:"邵";s:2:"ªó";s:3:"邸";s:2:"ªô";s:3:"邱";s:2:"ªõ";s:3:"é‚¶";s:2:"ªö";s:3:"采";s:2:"ª÷";s:3:"金";s:2:"ªø";s:3:"é•·";s:2:"ªù";s:3:"é–€";s:2:"ªú";s:3:"阜";s:2:"ªû";s:3:"陀";s:2:"ªü";s:3:"阿";s:2:"ªý";s:3:"阻";s:2:"ªþ";s:3:"附";s:2:"«@";s:3:"陂";s:2:"«A";s:3:"éš¹";s:2:"«B";s:3:"雨";s:2:"«C";s:3:"é’";s:2:"«D";s:3:"éž";s:2:"«E";s:3:"亟";s:2:"«F";s:3:"亭";s:2:"«G";s:3:"亮";s:2:"«H";s:3:"ä¿¡";s:2:"«I";s:3:"ä¾µ";s:2:"«J";s:3:"侯";s:2:"«K";s:3:"便";s:2:"«L";s:3:"ä¿ ";s:2:"«M";s:3:"ä¿‘";s:2:"«N";s:3:"ä¿";s:2:"«O";s:3:"ä¿";s:2:"«P";s:3:"促";s:2:"«Q";s:3:"ä¾¶";s:2:"«R";s:3:"俘";s:2:"«S";s:3:"俟";s:2:"«T";s:3:"俊";s:2:"«U";s:3:"ä¿—";s:2:"«V";s:3:"ä¾®";s:2:"«W";s:3:"ä¿";s:2:"«X";s:3:"ä¿„";s:2:"«Y";s:3:"ä¿‚";s:2:"«Z";s:3:"俚";s:2:"«[";s:3:"俎";s:2:"«\";s:3:"俞";s:2:"«]";s:3:"ä¾·";s:2:"«^";s:3:"å…—";s:2:"«_";s:3:"冒";s:2:"«`";s:3:"冑";s:2:"«a";s:3:"冠";s:2:"«b";s:3:"剎";s:2:"«c";s:3:"剃";s:2:"«d";s:3:"削";s:2:"«e";s:3:"å‰";s:2:"«f";s:3:"剌";s:2:"«g";s:3:"剋";s:2:"«h";s:3:"則";s:2:"«i";s:3:"勇";s:2:"«j";s:3:"勉";s:2:"«k";s:3:"勃";s:2:"«l";s:3:"å‹";s:2:"«m";s:3:"åŒ";s:2:"«n";s:3:"å—";s:2:"«o";s:3:"å»";s:2:"«p";s:3:"厚";s:2:"«q";s:3:"å›";s:2:"«r";s:3:"å’¬";s:2:"«s";s:3:"å“€";s:2:"«t";s:3:"å’¨";s:2:"«u";s:3:"哎";s:2:"«v";s:3:"哉";s:2:"«w";s:3:"å’¸";s:2:"«x";s:3:"å’¦";s:2:"«y";s:3:"å’³";s:2:"«z";s:3:"哇";s:2:"«{";s:3:"å“‚";s:2:"«|";s:3:"å’½";s:2:"«}";s:3:"å’ª";s:2:"«~";s:3:"å“";s:2:"«¡";s:3:"å“„";s:2:"«¢";s:3:"哈";s:2:"«£";s:3:"å’¯";s:2:"«¤";s:3:"å’«";s:2:"«¥";s:3:"å’±";s:2:"«¦";s:3:"å’»";s:2:"«§";s:3:"å’©";s:2:"«¨";s:3:"å’§";s:2:"«©";s:3:"å’¿";s:2:"«ª";s:3:"囿";s:2:"««";s:3:"åž‚";s:2:"«¬";s:3:"åž‹";s:2:"«­";s:3:"åž ";s:2:"«®";s:3:"垣";s:2:"«¯";s:3:"垢";s:2:"«°";s:3:"城";s:2:"«±";s:3:"åž®";s:2:"«²";s:3:"åž“";s:2:"«³";s:3:"奕";s:2:"«´";s:3:"契";s:2:"«µ";s:3:"å¥";s:2:"«¶";s:3:"奎";s:2:"«·";s:3:"å¥";s:2:"«¸";s:3:"å§œ";s:2:"«¹";s:3:"姘";s:2:"«º";s:3:"å§¿";s:2:"«»";s:3:"å§£";s:2:"«¼";s:3:"姨";s:2:"«½";s:3:"娃";s:2:"«¾";s:3:"å§¥";s:2:"«¿";s:3:"姪";s:2:"«À";s:3:"å§š";s:2:"«Á";s:3:"姦";s:2:"«Â";s:3:"å¨";s:2:"«Ã";s:3:"å§»";s:2:"«Ä";s:3:"å­©";s:2:"«Å";s:3:"宣";s:2:"«Æ";s:3:"宦";s:2:"«Ç";s:3:"室";s:2:"«È";s:3:"客";s:2:"«É";s:3:"宥";s:2:"«Ê";s:3:"å°";s:2:"«Ë";s:3:"屎";s:2:"«Ì";s:3:"å±";s:2:"«Í";s:3:"å±";s:2:"«Î";s:3:"屋";s:2:"«Ï";s:3:"å³™";s:2:"«Ð";s:3:"å³’";s:2:"«Ñ";s:3:"å··";s:2:"«Ò";s:3:"å¸";s:2:"«Ó";s:3:"帥";s:2:"«Ô";s:3:"帟";s:2:"«Õ";s:3:"å¹½";s:2:"«Ö";s:3:"庠";s:2:"«×";s:3:"度";s:2:"«Ø";s:3:"建";s:2:"«Ù";s:3:"弈";s:2:"«Ú";s:3:"å¼­";s:2:"«Û";s:3:"å½¥";s:2:"«Ü";s:3:"很";s:2:"«Ý";s:3:"å¾…";s:2:"«Þ";s:3:"徊";s:2:"«ß";s:3:"律";s:2:"«à";s:3:"徇";s:2:"«á";s:3:"後";s:2:"«â";s:3:"徉";s:2:"«ã";s:3:"怒";s:2:"«ä";s:3:"æ€";s:2:"«å";s:3:"怠";s:2:"«æ";s:3:"急";s:2:"«ç";s:3:"怎";s:2:"«è";s:3:"怨";s:2:"«é";s:3:"æ";s:2:"«ê";s:3:"æ°";s:2:"«ë";s:3:"æ¨";s:2:"«ì";s:3:"æ¢";s:2:"«í";s:3:"æ†";s:2:"«î";s:3:"æƒ";s:2:"«ï";s:3:"æ¬";s:2:"«ð";s:3:"æ«";s:2:"«ñ";s:3:"æª";s:2:"«ò";s:3:"æ¤";s:2:"«ó";s:3:"æ‰";s:2:"«ô";s:3:"拜";s:2:"«õ";s:3:"挖";s:2:"«ö";s:3:"按";s:2:"«÷";s:3:"拼";s:2:"«ø";s:3:"æ‹­";s:2:"«ù";s:3:"æŒ";s:2:"«ú";s:3:"æ‹®";s:2:"«û";s:3:"拽";s:2:"«ü";s:3:"指";s:2:"«ý";s:3:"拱";s:2:"«þ";s:3:"æ‹·";s:2:"¬@";s:3:"拯";s:2:"¬A";s:3:"括";s:2:"¬B";s:3:"拾";s:2:"¬C";s:3:"æ‹´";s:2:"¬D";s:3:"挑";s:2:"¬E";s:3:"挂";s:2:"¬F";s:3:"政";s:2:"¬G";s:3:"æ•…";s:2:"¬H";s:3:"æ–«";s:2:"¬I";s:3:"æ–½";s:2:"¬J";s:3:"æ—¢";s:2:"¬K";s:3:"春";s:2:"¬L";s:3:"昭";s:2:"¬M";s:3:"映";s:2:"¬N";s:3:"昧";s:2:"¬O";s:3:"是";s:2:"¬P";s:3:"星";s:2:"¬Q";s:3:"昨";s:2:"¬R";s:3:"昱";s:2:"¬S";s:3:"昤";s:2:"¬T";s:3:"æ›·";s:2:"¬U";s:3:"柿";s:2:"¬V";s:3:"染";s:2:"¬W";s:3:"柱";s:2:"¬X";s:3:"柔";s:2:"¬Y";s:3:"æŸ";s:2:"¬Z";s:3:"柬";s:2:"¬[";s:3:"æž¶";s:2:"¬\";s:3:"枯";s:2:"¬]";s:3:"柵";s:2:"¬^";s:3:"柩";s:2:"¬_";s:3:"柯";s:2:"¬`";s:3:"柄";s:2:"¬a";s:3:"柑";s:2:"¬b";s:3:"æž´";s:2:"¬c";s:3:"柚";s:2:"¬d";s:3:"查";s:2:"¬e";s:3:"枸";s:2:"¬f";s:3:"æŸ";s:2:"¬g";s:3:"柞";s:2:"¬h";s:3:"柳";s:2:"¬i";s:3:"æž°";s:2:"¬j";s:3:"柙";s:2:"¬k";s:3:"柢";s:2:"¬l";s:3:"æŸ";s:2:"¬m";s:3:"柒";s:2:"¬n";s:3:"æ­ª";s:2:"¬o";s:3:"殃";s:2:"¬p";s:3:"殆";s:2:"¬q";s:3:"段";s:2:"¬r";s:3:"毒";s:2:"¬s";s:3:"毗";s:2:"¬t";s:3:"æ°Ÿ";s:2:"¬u";s:3:"泉";s:2:"¬v";s:3:"æ´‹";s:2:"¬w";s:3:"æ´²";s:2:"¬x";s:3:"æ´ª";s:2:"¬y";s:3:"æµ";s:2:"¬z";s:3:"æ´¥";s:2:"¬{";s:3:"æ´Œ";s:2:"¬|";s:3:"æ´±";s:2:"¬}";s:3:"æ´ž";s:2:"¬~";s:3:"æ´—";s:2:"¬¡";s:3:"æ´»";s:2:"¬¢";s:3:"æ´½";s:2:"¬£";s:3:"æ´¾";s:2:"¬¤";s:3:"æ´¶";s:2:"¬¥";s:3:"æ´›";s:2:"¬¦";s:3:"æ³µ";s:2:"¬§";s:3:"æ´¹";s:2:"¬¨";s:3:"æ´§";s:2:"¬©";s:3:"æ´¸";s:2:"¬ª";s:3:"æ´©";s:2:"¬«";s:3:"æ´®";s:2:"¬¬";s:3:"æ´µ";s:2:"¬­";s:3:"æ´Ž";s:2:"¬®";s:3:"æ´«";s:2:"¬¯";s:3:"ç‚«";s:2:"¬°";s:3:"為";s:2:"¬±";s:3:"炳";s:2:"¬²";s:3:"炬";s:2:"¬³";s:3:"炯";s:2:"¬´";s:3:"ç‚­";s:2:"¬µ";s:3:"炸";s:2:"¬¶";s:3:"ç‚®";s:2:"¬·";s:3:"炤";s:2:"¬¸";s:3:"爰";s:2:"¬¹";s:3:"牲";s:2:"¬º";s:3:"牯";s:2:"¬»";s:3:"牴";s:2:"¬¼";s:3:"ç‹©";s:2:"¬½";s:3:"ç‹ ";s:2:"¬¾";s:3:"ç‹¡";s:2:"¬¿";s:3:"玷";s:2:"¬À";s:3:"çŠ";s:2:"¬Á";s:3:"玻";s:2:"¬Â";s:3:"玲";s:2:"¬Ã";s:3:"ç";s:2:"¬Ä";s:3:"ç€";s:2:"¬Å";s:3:"玳";s:2:"¬Æ";s:3:"甚";s:2:"¬Ç";s:3:"ç”­";s:2:"¬È";s:3:"ç•";s:2:"¬É";s:3:"界";s:2:"¬Ê";s:3:"畎";s:2:"¬Ë";s:3:"ç•‹";s:2:"¬Ì";s:3:"ç–«";s:2:"¬Í";s:3:"ç–¤";s:2:"¬Î";s:3:"ç–¥";s:2:"¬Ï";s:3:"ç–¢";s:2:"¬Ð";s:3:"ç–£";s:2:"¬Ñ";s:3:"癸";s:2:"¬Ò";s:3:"皆";s:2:"¬Ó";s:3:"皇";s:2:"¬Ô";s:3:"皈";s:2:"¬Õ";s:3:"盈";s:2:"¬Ö";s:3:"盆";s:2:"¬×";s:3:"盃";s:2:"¬Ø";s:3:"ç›…";s:2:"¬Ù";s:3:"çœ";s:2:"¬Ú";s:3:"盹";s:2:"¬Û";s:3:"相";s:2:"¬Ü";s:3:"眉";s:2:"¬Ý";s:3:"看";s:2:"¬Þ";s:3:"盾";s:2:"¬ß";s:3:"盼";s:2:"¬à";s:3:"眇";s:2:"¬á";s:3:"矜";s:2:"¬â";s:3:"ç ‚";s:2:"¬ã";s:3:"ç ”";s:2:"¬ä";s:3:"ç Œ";s:2:"¬å";s:3:"ç ";s:2:"¬æ";s:3:"祆";s:2:"¬ç";s:3:"祉";s:2:"¬è";s:3:"祈";s:2:"¬é";s:3:"祇";s:2:"¬ê";s:3:"禹";s:2:"¬ë";s:3:"禺";s:2:"¬ì";s:3:"ç§‘";s:2:"¬í";s:3:"ç§’";s:2:"¬î";s:3:"ç§‹";s:2:"¬ï";s:3:"ç©¿";s:2:"¬ð";s:3:"çª";s:2:"¬ñ";s:3:"ç«¿";s:2:"¬ò";s:3:"竽";s:2:"¬ó";s:3:"ç±½";s:2:"¬ô";s:3:"ç´‚";s:2:"¬õ";s:3:"ç´…";s:2:"¬ö";s:3:"ç´€";s:2:"¬÷";s:3:"ç´‰";s:2:"¬ø";s:3:"ç´‡";s:2:"¬ù";s:3:"ç´„";s:2:"¬ú";s:3:"ç´†";s:2:"¬û";s:3:"缸";s:2:"¬ü";s:3:"美";s:2:"¬ý";s:3:"羿";s:2:"¬þ";s:3:"耄";s:2:"­@";s:3:"è€";s:2:"­A";s:3:"è€";s:2:"­B";s:3:"耑";s:2:"­C";s:3:"耶";s:2:"­D";s:3:"胖";s:2:"­E";s:3:"胥";s:2:"­F";s:3:"胚";s:2:"­G";s:3:"胃";s:2:"­H";s:3:"胄";s:2:"­I";s:3:"背";s:2:"­J";s:3:"胡";s:2:"­K";s:3:"胛";s:2:"­L";s:3:"胎";s:2:"­M";s:3:"胞";s:2:"­N";s:3:"胤";s:2:"­O";s:3:"èƒ";s:2:"­P";s:3:"致";s:2:"­Q";s:3:"舢";s:2:"­R";s:3:"è‹§";s:2:"­S";s:3:"范";s:2:"­T";s:3:"茅";s:2:"­U";s:3:"è‹£";s:2:"­V";s:3:"è‹›";s:2:"­W";s:3:"苦";s:2:"­X";s:3:"茄";s:2:"­Y";s:3:"è‹¥";s:2:"­Z";s:3:"茂";s:2:"­[";s:3:"茉";s:2:"­\";s:3:"è‹’";s:2:"­]";s:3:"è‹—";s:2:"­^";s:3:"英";s:2:"­_";s:3:"èŒ";s:2:"­`";s:3:"苜";s:2:"­a";s:3:"è‹”";s:2:"­b";s:3:"è‹‘";s:2:"­c";s:3:"苞";s:2:"­d";s:3:"è‹“";s:2:"­e";s:3:"苟";s:2:"­f";s:3:"苯";s:2:"­g";s:3:"茆";s:2:"­h";s:3:"è™";s:2:"­i";s:3:"虹";s:2:"­j";s:3:"è™»";s:2:"­k";s:3:"虺";s:2:"­l";s:3:"è¡";s:2:"­m";s:3:"è¡«";s:2:"­n";s:3:"è¦";s:2:"­o";s:3:"è§”";s:2:"­p";s:3:"計";s:2:"­q";s:3:"訂";s:2:"­r";s:3:"訃";s:2:"­s";s:3:"貞";s:2:"­t";s:3:"è² ";s:2:"­u";s:3:"èµ´";s:2:"­v";s:3:"èµ³";s:2:"­w";s:3:"è¶´";s:2:"­x";s:3:"è»";s:2:"­y";s:3:"軌";s:2:"­z";s:3:"è¿°";s:2:"­{";s:3:"迦";s:2:"­|";s:3:"è¿¢";s:2:"­}";s:3:"迪";s:2:"­~";s:3:"è¿¥";s:2:"­¡";s:3:"è¿­";s:2:"­¢";s:3:"è¿«";s:2:"­£";s:3:"迤";s:2:"­¤";s:3:"迨";s:2:"­¥";s:3:"郊";s:2:"­¦";s:3:"郎";s:2:"­§";s:3:"éƒ";s:2:"­¨";s:3:"郃";s:2:"­©";s:3:"é…‹";s:2:"­ª";s:3:"é…Š";s:2:"­«";s:3:"é‡";s:2:"­¬";s:3:"é–‚";s:2:"­­";s:3:"é™";s:2:"­®";s:3:"陋";s:2:"­¯";s:3:"陌";s:2:"­°";s:3:"é™";s:2:"­±";s:3:"é¢";s:2:"­²";s:3:"é©";s:2:"­³";s:3:"韋";s:2:"­´";s:3:"韭";s:2:"­µ";s:3:"音";s:2:"­¶";s:3:"é ";s:2:"­·";s:3:"風";s:2:"­¸";s:3:"飛";s:2:"­¹";s:3:"食";s:2:"­º";s:3:"首";s:2:"­»";s:3:"香";s:2:"­¼";s:3:"乘";s:2:"­½";s:3:"亳";s:2:"­¾";s:3:"倌";s:2:"­¿";s:3:"å€";s:2:"­À";s:3:"倣";s:2:"­Á";s:3:"俯";s:2:"­Â";s:3:"倦";s:2:"­Ã";s:3:"倥";s:2:"­Ä";s:3:"俸";s:2:"­Å";s:3:"倩";s:2:"­Æ";s:3:"倖";s:2:"­Ç";s:3:"倆";s:2:"­È";s:3:"值";s:2:"­É";s:3:"借";s:2:"­Ê";s:3:"倚";s:2:"­Ë";s:3:"倒";s:2:"­Ì";s:3:"們";s:2:"­Í";s:3:"俺";s:2:"­Î";s:3:"倀";s:2:"­Ï";s:3:"倔";s:2:"­Ð";s:3:"倨";s:2:"­Ñ";s:3:"俱";s:2:"­Ò";s:3:"倡";s:2:"­Ó";s:3:"個";s:2:"­Ô";s:3:"候";s:2:"­Õ";s:3:"倘";s:2:"­Ö";s:3:"俳";s:2:"­×";s:3:"ä¿®";s:2:"­Ø";s:3:"倭";s:2:"­Ù";s:3:"倪";s:2:"­Ú";s:3:"俾";s:2:"­Û";s:3:"倫";s:2:"­Ü";s:3:"倉";s:2:"­Ý";s:3:"å…¼";s:2:"­Þ";s:3:"冤";s:2:"­ß";s:3:"冥";s:2:"­à";s:3:"冢";s:2:"­á";s:3:"å‡";s:2:"­â";s:3:"凌";s:2:"­ã";s:3:"准";s:2:"­ä";s:3:"凋";s:2:"­å";s:3:"剖";s:2:"­æ";s:3:"剜";s:2:"­ç";s:3:"剔";s:2:"­è";s:3:"剛";s:2:"­é";s:3:"å‰";s:2:"­ê";s:3:"匪";s:2:"­ë";s:3:"å¿";s:2:"­ì";s:3:"原";s:2:"­í";s:3:"åŽ";s:2:"­î";s:3:"åŸ";s:2:"­ï";s:3:"哨";s:2:"­ð";s:3:"å”";s:2:"­ñ";s:3:"å”";s:2:"­ò";s:3:"å”·";s:2:"­ó";s:3:"哼";s:2:"­ô";s:3:"å“¥";s:2:"­õ";s:3:"哲";s:2:"­ö";s:3:"唆";s:2:"­÷";s:3:"哺";s:2:"­ø";s:3:"å””";s:2:"­ù";s:3:"å“©";s:2:"­ú";s:3:"å“­";s:2:"­û";s:3:"å“¡";s:2:"­ü";s:3:"唉";s:2:"­ý";s:3:"å“®";s:2:"­þ";s:3:"哪";s:2:"®@";s:3:"哦";s:2:"®A";s:3:"å”§";s:2:"®B";s:3:"唇";s:2:"®C";s:3:"哽";s:2:"®D";s:3:"å”";s:2:"®E";s:3:"圃";s:2:"®F";s:3:"圄";s:2:"®G";s:3:"埂";s:2:"®H";s:3:"埔";s:2:"®I";s:3:"埋";s:2:"®J";s:3:"埃";s:2:"®K";s:3:"å ‰";s:2:"®L";s:3:"å¤";s:2:"®M";s:3:"套";s:2:"®N";s:3:"奘";s:2:"®O";s:3:"奚";s:2:"®P";s:3:"娑";s:2:"®Q";s:3:"娘";s:2:"®R";s:3:"娜";s:2:"®S";s:3:"娟";s:2:"®T";s:3:"娛";s:2:"®U";s:3:"娓";s:2:"®V";s:3:"姬";s:2:"®W";s:3:"娠";s:2:"®X";s:3:"娣";s:2:"®Y";s:3:"娩";s:2:"®Z";s:3:"娥";s:2:"®[";s:3:"娌";s:2:"®\";s:3:"娉";s:2:"®]";s:3:"å­«";s:2:"®^";s:3:"屘";s:2:"®_";s:3:"å®°";s:2:"®`";s:3:"害";s:2:"®a";s:3:"å®¶";s:2:"®b";s:3:"å®´";s:2:"®c";s:3:"å®®";s:2:"®d";s:3:"宵";s:2:"®e";s:3:"容";s:2:"®f";s:3:"宸";s:2:"®g";s:3:"å°„";s:2:"®h";s:3:"屑";s:2:"®i";s:3:"展";s:2:"®j";s:3:"å±";s:2:"®k";s:3:"å³­";s:2:"®l";s:3:"å³½";s:2:"®m";s:3:"å³»";s:2:"®n";s:3:"峪";s:2:"®o";s:3:"峨";s:2:"®p";s:3:"å³°";s:2:"®q";s:3:"å³¶";s:2:"®r";s:3:"å´";s:2:"®s";s:3:"å³´";s:2:"®t";s:3:"å·®";s:2:"®u";s:3:"席";s:2:"®v";s:3:"師";s:2:"®w";s:3:"庫";s:2:"®x";s:3:"庭";s:2:"®y";s:3:"座";s:2:"®z";s:3:"å¼±";s:2:"®{";s:3:"å¾’";s:2:"®|";s:3:"徑";s:2:"®}";s:3:"å¾";s:2:"®~";s:3:"æ™";s:2:"®¡";s:3:"æ£";s:2:"®¢";s:3:"æ¥";s:2:"®£";s:3:"æ";s:2:"®¤";s:3:"æ•";s:2:"®¥";s:3:"æ­";s:2:"®¦";s:3:"æ©";s:2:"®§";s:3:"æ¯";s:2:"®¨";s:3:"æ‚„";s:2:"®©";s:3:"悟";s:2:"®ª";s:3:"悚";s:2:"®«";s:3:"æ‚";s:2:"®¬";s:3:"æ‚”";s:2:"®­";s:3:"悌";s:2:"®®";s:3:"æ‚…";s:2:"®¯";s:3:"æ‚–";s:2:"®°";s:3:"扇";s:2:"®±";s:3:"拳";s:2:"®²";s:3:"挈";s:2:"®³";s:3:"æ‹¿";s:2:"®´";s:3:"æŽ";s:2:"®µ";s:3:"挾";s:2:"®¶";s:3:"振";s:2:"®·";s:3:"æ•";s:2:"®¸";s:3:"æ‚";s:2:"®¹";s:3:"æ†";s:2:"®º";s:3:"æ";s:2:"®»";s:3:"æ‰";s:2:"®¼";s:3:"挺";s:2:"®½";s:3:"æ";s:2:"®¾";s:3:"挽";s:2:"®¿";s:3:"挪";s:2:"®À";s:3:"挫";s:2:"®Á";s:3:"挨";s:2:"®Â";s:3:"æ";s:2:"®Ã";s:3:"æŒ";s:2:"®Ä";s:3:"效";s:2:"®Å";s:3:"敉";s:2:"®Æ";s:3:"æ–™";s:2:"®Ç";s:3:"æ—";s:2:"®È";s:3:"æ—…";s:2:"®É";s:3:"時";s:2:"®Ê";s:3:"晉";s:2:"®Ë";s:3:"æ™";s:2:"®Ì";s:3:"晃";s:2:"®Í";s:3:"æ™’";s:2:"®Î";s:3:"晌";s:2:"®Ï";s:3:"æ™…";s:2:"®Ð";s:3:"æ™";s:2:"®Ñ";s:3:"書";s:2:"®Ò";s:3:"朔";s:2:"®Ó";s:3:"朕";s:2:"®Ô";s:3:"朗";s:2:"®Õ";s:3:"æ ¡";s:2:"®Ö";s:3:"æ ¸";s:2:"®×";s:3:"案";s:2:"®Ø";s:3:"框";s:2:"®Ù";s:3:"æ¡“";s:2:"®Ú";s:3:"æ ¹";s:2:"®Û";s:3:"æ¡‚";s:2:"®Ü";s:3:"æ¡”";s:2:"®Ý";s:3:"æ ©";s:2:"®Þ";s:3:"梳";s:2:"®ß";s:3:"æ —";s:2:"®à";s:3:"桌";s:2:"®á";s:3:"æ¡‘";s:2:"®â";s:3:"æ ½";s:2:"®ã";s:3:"柴";s:2:"®ä";s:3:"æ¡";s:2:"®å";s:3:"æ¡€";s:2:"®æ";s:3:"æ ¼";s:2:"®ç";s:3:"桃";s:2:"®è";s:3:"æ ª";s:2:"®é";s:3:"æ¡…";s:2:"®ê";s:3:"æ “";s:2:"®ë";s:3:"æ ˜";s:2:"®ì";s:3:"æ¡";s:2:"®í";s:3:"殊";s:2:"®î";s:3:"殉";s:2:"®ï";s:3:"æ®·";s:2:"®ð";s:3:"æ°£";s:2:"®ñ";s:3:"æ°§";s:2:"®ò";s:3:"æ°¨";s:2:"®ó";s:3:"æ°¦";s:2:"®ô";s:3:"æ°¤";s:2:"®õ";s:3:"æ³°";s:2:"®ö";s:3:"浪";s:2:"®÷";s:3:"æ¶•";s:2:"®ø";s:3:"消";s:2:"®ù";s:3:"涇";s:2:"®ú";s:3:"浦";s:2:"®û";s:3:"浸";s:2:"®ü";s:3:"æµ·";s:2:"®ý";s:3:"æµ™";s:2:"®þ";s:3:"æ¶“";s:2:"¯@";s:3:"浬";s:2:"¯A";s:3:"涉";s:2:"¯B";s:3:"æµ®";s:2:"¯C";s:3:"浚";s:2:"¯D";s:3:"æµ´";s:2:"¯E";s:3:"浩";s:2:"¯F";s:3:"æ¶Œ";s:2:"¯G";s:3:"æ¶Š";s:2:"¯H";s:3:"æµ¹";s:2:"¯I";s:3:"æ¶…";s:2:"¯J";s:3:"æµ¥";s:2:"¯K";s:3:"æ¶”";s:2:"¯L";s:3:"烊";s:2:"¯M";s:3:"烘";s:2:"¯N";s:3:"烤";s:2:"¯O";s:3:"烙";s:2:"¯P";s:3:"烈";s:2:"¯Q";s:3:"çƒ";s:2:"¯R";s:3:"爹";s:2:"¯S";s:3:"特";s:2:"¯T";s:3:"狼";s:2:"¯U";s:3:"狹";s:2:"¯V";s:3:"狽";s:2:"¯W";s:3:"狸";s:2:"¯X";s:3:"ç‹·";s:2:"¯Y";s:3:"玆";s:2:"¯Z";s:3:"ç­";s:2:"¯[";s:3:"ç‰";s:2:"¯\";s:3:"ç®";s:2:"¯]";s:3:"ç ";s:2:"¯^";s:3:"çª";s:2:"¯_";s:3:"çž";s:2:"¯`";s:3:"ç•”";s:2:"¯a";s:3:"ç•";s:2:"¯b";s:3:"畜";s:2:"¯c";s:3:"畚";s:2:"¯d";s:3:"ç•™";s:2:"¯e";s:3:"ç–¾";s:2:"¯f";s:3:"ç—…";s:2:"¯g";s:3:"ç—‡";s:2:"¯h";s:3:"ç–²";s:2:"¯i";s:3:"ç–³";s:2:"¯j";s:3:"ç–½";s:2:"¯k";s:3:"ç–¼";s:2:"¯l";s:3:"ç–¹";s:2:"¯m";s:3:"ç—‚";s:2:"¯n";s:3:"ç–¸";s:2:"¯o";s:3:"çš‹";s:2:"¯p";s:3:"çš°";s:2:"¯q";s:3:"益";s:2:"¯r";s:3:"ç›";s:2:"¯s";s:3:"盎";s:2:"¯t";s:3:"眩";s:2:"¯u";s:3:"真";s:2:"¯v";s:3:"眠";s:2:"¯w";s:3:"眨";s:2:"¯x";s:3:"矩";s:2:"¯y";s:3:"ç °";s:2:"¯z";s:3:"ç §";s:2:"¯{";s:3:"ç ¸";s:2:"¯|";s:3:"ç ";s:2:"¯}";s:3:"ç ´";s:2:"¯~";s:3:"ç ·";s:2:"¯¡";s:3:"ç ¥";s:2:"¯¢";s:3:"ç ­";s:2:"¯£";s:3:"ç  ";s:2:"¯¤";s:3:"ç Ÿ";s:2:"¯¥";s:3:"ç ²";s:2:"¯¦";s:3:"祕";s:2:"¯§";s:3:"ç¥";s:2:"¯¨";s:3:"祠";s:2:"¯©";s:3:"祟";s:2:"¯ª";s:3:"祖";s:2:"¯«";s:3:"神";s:2:"¯¬";s:3:"ç¥";s:2:"¯­";s:3:"祗";s:2:"¯®";s:3:"祚";s:2:"¯¯";s:3:"秤";s:2:"¯°";s:3:"ç§£";s:2:"¯±";s:3:"ç§§";s:2:"¯²";s:3:"ç§Ÿ";s:2:"¯³";s:3:"秦";s:2:"¯´";s:3:"ç§©";s:2:"¯µ";s:3:"秘";s:2:"¯¶";s:3:"窄";s:2:"¯·";s:3:"窈";s:2:"¯¸";s:3:"ç«™";s:2:"¯¹";s:3:"笆";s:2:"¯º";s:3:"笑";s:2:"¯»";s:3:"粉";s:2:"¯¼";s:3:"ç´¡";s:2:"¯½";s:3:"ç´—";s:2:"¯¾";s:3:"ç´‹";s:2:"¯¿";s:3:"ç´Š";s:2:"¯À";s:3:"ç´ ";s:2:"¯Á";s:3:"ç´¢";s:2:"¯Â";s:3:"ç´”";s:2:"¯Ã";s:3:"ç´";s:2:"¯Ä";s:3:"ç´•";s:2:"¯Å";s:3:"ç´š";s:2:"¯Æ";s:3:"ç´œ";s:2:"¯Ç";s:3:"ç´";s:2:"¯È";s:3:"ç´™";s:2:"¯É";s:3:"ç´›";s:2:"¯Ê";s:3:"缺";s:2:"¯Ë";s:3:"罟";s:2:"¯Ì";s:3:"ç¾”";s:2:"¯Í";s:3:"ç¿…";s:2:"¯Î";s:3:"ç¿";s:2:"¯Ï";s:3:"耆";s:2:"¯Ð";s:3:"耘";s:2:"¯Ñ";s:3:"耕";s:2:"¯Ò";s:3:"耙";s:2:"¯Ó";s:3:"耗";s:2:"¯Ô";s:3:"耽";s:2:"¯Õ";s:3:"耿";s:2:"¯Ö";s:3:"胱";s:2:"¯×";s:3:"è„‚";s:2:"¯Ø";s:3:"胰";s:2:"¯Ù";s:3:"è„…";s:2:"¯Ú";s:3:"胭";s:2:"¯Û";s:3:"胴";s:2:"¯Ü";s:3:"脆";s:2:"¯Ý";s:3:"胸";s:2:"¯Þ";s:3:"胳";s:2:"¯ß";s:3:"脈";s:2:"¯à";s:3:"能";s:2:"¯á";s:3:"脊";s:2:"¯â";s:3:"胼";s:2:"¯ã";s:3:"胯";s:2:"¯ä";s:3:"臭";s:2:"¯å";s:3:"臬";s:2:"¯æ";s:3:"舀";s:2:"¯ç";s:3:"èˆ";s:2:"¯è";s:3:"航";s:2:"¯é";s:3:"舫";s:2:"¯ê";s:3:"舨";s:2:"¯ë";s:3:"般";s:2:"¯ì";s:3:"芻";s:2:"¯í";s:3:"茫";s:2:"¯î";s:3:"è’";s:2:"¯ï";s:3:"è”";s:2:"¯ð";s:3:"èŠ";s:2:"¯ñ";s:3:"茸";s:2:"¯ò";s:3:"è";s:2:"¯ó";s:3:"è‰";s:2:"¯ô";s:3:"茵";s:2:"¯õ";s:3:"茴";s:2:"¯ö";s:3:"è";s:2:"¯÷";s:3:"茲";s:2:"¯ø";s:3:"茹";s:2:"¯ù";s:3:"茶";s:2:"¯ú";s:3:"茗";s:2:"¯û";s:3:"è€";s:2:"¯ü";s:3:"茱";s:2:"¯ý";s:3:"茨";s:2:"¯þ";s:3:"èƒ";s:2:"°@";s:3:"è™”";s:2:"°A";s:3:"蚊";s:2:"°B";s:3:"蚪";s:2:"°C";s:3:"èš“";s:2:"°D";s:3:"蚤";s:2:"°E";s:3:"èš©";s:2:"°F";s:3:"蚌";s:2:"°G";s:3:"蚣";s:2:"°H";s:3:"èšœ";s:2:"°I";s:3:"è¡°";s:2:"°J";s:3:"è¡·";s:2:"°K";s:3:"è¢";s:2:"°L";s:3:"袂";s:2:"°M";s:3:"衽";s:2:"°N";s:3:"衹";s:2:"°O";s:3:"記";s:2:"°P";s:3:"è¨";s:2:"°Q";s:3:"討";s:2:"°R";s:3:"訌";s:2:"°S";s:3:"訕";s:2:"°T";s:3:"訊";s:2:"°U";s:3:"託";s:2:"°V";s:3:"訓";s:2:"°W";s:3:"訖";s:2:"°X";s:3:"è¨";s:2:"°Y";s:3:"訑";s:2:"°Z";s:3:"豈";s:2:"°[";s:3:"豺";s:2:"°\";s:3:"è±¹";s:2:"°]";s:3:"財";s:2:"°^";s:3:"è²¢";s:2:"°_";s:3:"èµ·";s:2:"°`";s:3:"躬";s:2:"°a";s:3:"è»’";s:2:"°b";s:3:"è»”";s:2:"°c";s:3:"è»";s:2:"°d";s:3:"è¾±";s:2:"°e";s:3:"é€";s:2:"°f";s:3:"逆";s:2:"°g";s:3:"è¿·";s:2:"°h";s:3:"退";s:2:"°i";s:3:"迺";s:2:"°j";s:3:"è¿´";s:2:"°k";s:3:"逃";s:2:"°l";s:3:"追";s:2:"°m";s:3:"逅";s:2:"°n";s:3:"迸";s:2:"°o";s:3:"é‚•";s:2:"°p";s:3:"郡";s:2:"°q";s:3:"éƒ";s:2:"°r";s:3:"郢";s:2:"°s";s:3:"é…’";s:2:"°t";s:3:"é…";s:2:"°u";s:3:"é…Œ";s:2:"°v";s:3:"釘";s:2:"°w";s:3:"é‡";s:2:"°x";s:3:"釗";s:2:"°y";s:3:"釜";s:2:"°z";s:3:"釙";s:2:"°{";s:3:"é–ƒ";s:2:"°|";s:3:"院";s:2:"°}";s:3:"陣";s:2:"°~";s:3:"陡";s:2:"°¡";s:3:"é™›";s:2:"°¢";s:3:"é™";s:2:"°£";s:3:"除";s:2:"°¤";s:3:"陘";s:2:"°¥";s:3:"陞";s:2:"°¦";s:3:"éš»";s:2:"°§";s:3:"飢";s:2:"°¨";s:3:"馬";s:2:"°©";s:3:"骨";s:2:"°ª";s:3:"高";s:2:"°«";s:3:"鬥";s:2:"°¬";s:3:"鬲";s:2:"°­";s:3:"鬼";s:2:"°®";s:3:"ä¹¾";s:2:"°¯";s:3:"åº";s:2:"°°";s:3:"å½";s:2:"°±";s:3:"åœ";s:2:"°²";s:3:"å‡";s:2:"°³";s:3:"åƒ";s:2:"°´";s:3:"åŒ";s:2:"°µ";s:3:"åš";s:2:"°¶";s:3:"å‰";s:2:"°·";s:3:"å¥";s:2:"°¸";s:3:"å¶";s:2:"°¹";s:3:"åŽ";s:2:"°º";s:3:"å•";s:2:"°»";s:3:"åµ";s:2:"°¼";s:3:"å´";s:2:"°½";s:3:"å·";s:2:"°¾";s:3:"å";s:2:"°¿";s:3:"å€";s:2:"°À";s:3:"å¯";s:2:"°Á";s:3:"å­";s:2:"°Â";s:3:"å…œ";s:2:"°Ã";s:3:"冕";s:2:"°Ä";s:3:"凰";s:2:"°Å";s:3:"剪";s:2:"°Æ";s:3:"副";s:2:"°Ç";s:3:"å‹’";s:2:"°È";s:3:"å‹™";s:2:"°É";s:3:"勘";s:2:"°Ê";s:3:"å‹•";s:2:"°Ë";s:3:"åŒ";s:2:"°Ì";s:3:"åŒ";s:2:"°Í";s:3:"匙";s:2:"°Î";s:3:"匿";s:2:"°Ï";s:3:"å€";s:2:"°Ð";s:3:"匾";s:2:"°Ñ";s:3:"åƒ";s:2:"°Ò";s:3:"曼";s:2:"°Ó";s:3:"商";s:2:"°Ô";s:3:"啪";s:2:"°Õ";s:3:"啦";s:2:"°Ö";s:3:"å•„";s:2:"°×";s:3:"啞";s:2:"°Ø";s:3:"å•¡";s:2:"°Ù";s:3:"啃";s:2:"°Ú";s:3:"啊";s:2:"°Û";s:3:"å”±";s:2:"°Ü";s:3:"å•–";s:2:"°Ý";s:3:"å•";s:2:"°Þ";s:3:"å••";s:2:"°ß";s:3:"唯";s:2:"°à";s:3:"啤";s:2:"°á";s:3:"唸";s:2:"°â";s:3:"å”®";s:2:"°ã";s:3:"啜";s:2:"°ä";s:3:"唬";s:2:"°å";s:3:"å•£";s:2:"°æ";s:3:"唳";s:2:"°ç";s:3:"å•";s:2:"°è";s:3:"å•—";s:2:"°é";s:3:"圈";s:2:"°ê";s:3:"國";s:2:"°ë";s:3:"圉";s:2:"°ì";s:3:"域";s:2:"°í";s:3:"å …";s:2:"°î";s:3:"å Š";s:2:"°ï";s:3:"å †";s:2:"°ð";s:3:"埠";s:2:"°ñ";s:3:"埤";s:2:"°ò";s:3:"基";s:2:"°ó";s:3:"å ‚";s:2:"°ô";s:3:"å µ";s:2:"°õ";s:3:"執";s:2:"°ö";s:3:"培";s:2:"°÷";s:3:"夠";s:2:"°ø";s:3:"奢";s:2:"°ù";s:3:"娶";s:2:"°ú";s:3:"å©";s:2:"°û";s:3:"婉";s:2:"°ü";s:3:"婦";s:2:"°ý";s:3:"婪";s:2:"°þ";s:3:"å©€";s:2:"±@";s:3:"娼";s:2:"±A";s:3:"å©¢";s:2:"±B";s:3:"婚";s:2:"±C";s:3:"婆";s:2:"±D";s:3:"婊";s:2:"±E";s:3:"å­°";s:2:"±F";s:3:"寇";s:2:"±G";s:3:"寅";s:2:"±H";s:3:"寄";s:2:"±I";s:3:"寂";s:2:"±J";s:3:"宿";s:2:"±K";s:3:"密";s:2:"±L";s:3:"å°‰";s:2:"±M";s:3:"å°ˆ";s:2:"±N";s:3:"å°‡";s:2:"±O";s:3:"å± ";s:2:"±P";s:3:"屜";s:2:"±Q";s:3:"å±";s:2:"±R";s:3:"å´‡";s:2:"±S";s:3:"å´†";s:2:"±T";s:3:"å´Ž";s:2:"±U";s:3:"å´›";s:2:"±V";s:3:"å´–";s:2:"±W";s:3:"å´¢";s:2:"±X";s:3:"å´‘";s:2:"±Y";s:3:"å´©";s:2:"±Z";s:3:"å´”";s:2:"±[";s:3:"å´™";s:2:"±\";s:3:"å´¤";s:2:"±]";s:3:"å´§";s:2:"±^";s:3:"å´—";s:2:"±_";s:3:"å·¢";s:2:"±`";s:3:"常";s:2:"±a";s:3:"帶";s:2:"±b";s:3:"帳";s:2:"±c";s:3:"帷";s:2:"±d";s:3:"康";s:2:"±e";s:3:"庸";s:2:"±f";s:3:"庶";s:2:"±g";s:3:"庵";s:2:"±h";s:3:"庾";s:2:"±i";s:3:"å¼µ";s:2:"±j";s:3:"å¼·";s:2:"±k";s:3:"å½—";s:2:"±l";s:3:"彬";s:2:"±m";s:3:"彩";s:2:"±n";s:3:"彫";s:2:"±o";s:3:"å¾—";s:2:"±p";s:3:"å¾™";s:2:"±q";s:3:"從";s:2:"±r";s:3:"徘";s:2:"±s";s:3:"御";s:2:"±t";s:3:"å¾ ";s:2:"±u";s:3:"徜";s:2:"±v";s:3:"æ¿";s:2:"±w";s:3:"æ‚£";s:2:"±x";s:3:"悉";s:2:"±y";s:3:"æ‚ ";s:2:"±z";s:3:"您";s:2:"±{";s:3:"惋";s:2:"±|";s:3:"æ‚´";s:2:"±}";s:3:"惦";s:2:"±~";s:3:"悽";s:2:"±¡";s:3:"情";s:2:"±¢";s:3:"æ‚»";s:2:"±£";s:3:"悵";s:2:"±¤";s:3:"惜";s:2:"±¥";s:3:"悼";s:2:"±¦";s:3:"惘";s:2:"±§";s:3:"惕";s:2:"±¨";s:3:"惆";s:2:"±©";s:3:"惟";s:2:"±ª";s:3:"悸";s:2:"±«";s:3:"惚";s:2:"±¬";s:3:"惇";s:2:"±­";s:3:"戚";s:2:"±®";s:3:"戛";s:2:"±¯";s:3:"扈";s:2:"±°";s:3:"掠";s:2:"±±";s:3:"控";s:2:"±²";s:3:"æ²";s:2:"±³";s:3:"掖";s:2:"±´";s:3:"探";s:2:"±µ";s:3:"接";s:2:"±¶";s:3:"æ·";s:2:"±·";s:3:"æ§";s:2:"±¸";s:3:"掘";s:2:"±¹";s:3:"措";s:2:"±º";s:3:"æ±";s:2:"±»";s:3:"掩";s:2:"±¼";s:3:"掉";s:2:"±½";s:3:"掃";s:2:"±¾";s:3:"掛";s:2:"±¿";s:3:"æ«";s:2:"±À";s:3:"推";s:2:"±Á";s:3:"掄";s:2:"±Â";s:3:"授";s:2:"±Ã";s:3:"掙";s:2:"±Ä";s:3:"採";s:2:"±Å";s:3:"掬";s:2:"±Æ";s:3:"排";s:2:"±Ç";s:3:"æŽ";s:2:"±È";s:3:"掀";s:2:"±É";s:3:"æ»";s:2:"±Ê";s:3:"æ©";s:2:"±Ë";s:3:"æ¨";s:2:"±Ì";s:3:"æº";s:2:"±Í";s:3:"æ•";s:2:"±Î";s:3:"æ•–";s:2:"±Ï";s:3:"æ•‘";s:2:"±Ð";s:3:"æ•™";s:2:"±Ñ";s:3:"æ•—";s:2:"±Ò";s:3:"啟";s:2:"±Ó";s:3:"æ•";s:2:"±Ô";s:3:"敘";s:2:"±Õ";s:3:"æ••";s:2:"±Ö";s:3:"æ•”";s:2:"±×";s:3:"æ–œ";s:2:"±Ø";s:3:"æ–›";s:2:"±Ù";s:3:"æ–¬";s:2:"±Ú";s:3:"æ—";s:2:"±Û";s:3:"æ—‹";s:2:"±Ü";s:3:"æ—Œ";s:2:"±Ý";s:3:"æ—Ž";s:2:"±Þ";s:3:"æ™";s:2:"±ß";s:3:"晚";s:2:"±à";s:3:"晤";s:2:"±á";s:3:"晨";s:2:"±â";s:3:"晦";s:2:"±ã";s:3:"晞";s:2:"±ä";s:3:"曹";s:2:"±å";s:3:"å‹—";s:2:"±æ";s:3:"望";s:2:"±ç";s:3:"æ¢";s:2:"±è";s:3:"梯";s:2:"±é";s:3:"梢";s:2:"±ê";s:3:"梓";s:2:"±ë";s:3:"梵";s:2:"±ì";s:3:"æ¡¿";s:2:"±í";s:3:"æ¡¶";s:2:"±î";s:3:"梱";s:2:"±ï";s:3:"梧";s:2:"±ð";s:3:"梗";s:2:"±ñ";s:3:"械";s:2:"±ò";s:3:"梃";s:2:"±ó";s:3:"棄";s:2:"±ô";s:3:"梭";s:2:"±õ";s:3:"梆";s:2:"±ö";s:3:"梅";s:2:"±÷";s:3:"梔";s:2:"±ø";s:3:"æ¢";s:2:"±ù";s:3:"梨";s:2:"±ú";s:3:"梟";s:2:"±û";s:3:"梡";s:2:"±ü";s:3:"梂";s:2:"±ý";s:3:"欲";s:2:"±þ";s:3:"殺";s:2:"²@";s:3:"毫";s:2:"²A";s:3:"毬";s:2:"²B";s:3:"æ°«";s:2:"²C";s:3:"æ¶Ž";s:2:"²D";s:3:"æ¶¼";s:2:"²E";s:3:"æ·³";s:2:"²F";s:3:"æ·™";s:2:"²G";s:3:"æ¶²";s:2:"²H";s:3:"æ·¡";s:2:"²I";s:3:"æ·Œ";s:2:"²J";s:3:"æ·¤";s:2:"²K";s:3:"æ·»";s:2:"²L";s:3:"æ·º";s:2:"²M";s:3:"清";s:2:"²N";s:3:"æ·‡";s:2:"²O";s:3:"æ·‹";s:2:"²P";s:3:"涯";s:2:"²Q";s:3:"æ·‘";s:2:"²R";s:3:"æ¶®";s:2:"²S";s:3:"æ·ž";s:2:"²T";s:3:"æ·¹";s:2:"²U";s:3:"涸";s:2:"²V";s:3:"æ··";s:2:"²W";s:3:"æ·µ";s:2:"²X";s:3:"æ·…";s:2:"²Y";s:3:"æ·’";s:2:"²Z";s:3:"渚";s:2:"²[";s:3:"æ¶µ";s:2:"²\";s:3:"æ·š";s:2:"²]";s:3:"æ·«";s:2:"²^";s:3:"æ·˜";s:2:"²_";s:3:"æ·ª";s:2:"²`";s:3:"æ·±";s:2:"²a";s:3:"æ·®";s:2:"²b";s:3:"æ·¨";s:2:"²c";s:3:"æ·†";s:2:"²d";s:3:"æ·„";s:2:"²e";s:3:"涪";s:2:"²f";s:3:"æ·¬";s:2:"²g";s:3:"æ¶¿";s:2:"²h";s:3:"æ·¦";s:2:"²i";s:3:"烹";s:2:"²j";s:3:"焉";s:2:"²k";s:3:"焊";s:2:"²l";s:3:"烽";s:2:"²m";s:3:"烯";s:2:"²n";s:3:"爽";s:2:"²o";s:3:"牽";s:2:"²p";s:3:"çŠ";s:2:"²q";s:3:"猜";s:2:"²r";s:3:"猛";s:2:"²s";s:3:"猖";s:2:"²t";s:3:"猓";s:2:"²u";s:3:"猙";s:2:"²v";s:3:"率";s:2:"²w";s:3:"ç…";s:2:"²x";s:3:"çŠ";s:2:"²y";s:3:"çƒ";s:2:"²z";s:3:"ç†";s:2:"²{";s:3:"ç¾";s:2:"²|";s:3:"ç";s:2:"²}";s:3:"ç“ ";s:2:"²~";s:3:"ç“¶";s:2:"²¡";s:3:"ç“·";s:2:"²¢";s:3:"甜";s:2:"²£";s:3:"產";s:2:"²¤";s:3:"ç•¥";s:2:"²¥";s:3:"畦";s:2:"²¦";s:3:"ç•¢";s:2:"²§";s:3:"ç•°";s:2:"²¨";s:3:"ç–";s:2:"²©";s:3:"ç—”";s:2:"²ª";s:3:"ç—•";s:2:"²«";s:3:"ç–µ";s:2:"²¬";s:3:"ç—Š";s:2:"²­";s:3:"ç—";s:2:"²®";s:3:"皎";s:2:"²¯";s:3:"ç›”";s:2:"²°";s:3:"ç›’";s:2:"²±";s:3:"ç››";s:2:"²²";s:3:"眷";s:2:"²³";s:3:"眾";s:2:"²´";s:3:"眼";s:2:"²µ";s:3:"眶";s:2:"²¶";s:3:"眸";s:2:"²·";s:3:"眺";s:2:"²¸";s:3:"ç¡«";s:2:"²¹";s:3:"硃";s:2:"²º";s:3:"硎";s:2:"²»";s:3:"祥";s:2:"²¼";s:3:"票";s:2:"²½";s:3:"祭";s:2:"²¾";s:3:"ç§»";s:2:"²¿";s:3:"窒";s:2:"²À";s:3:"窕";s:2:"²Á";s:3:"笠";s:2:"²Â";s:3:"笨";s:2:"²Ã";s:3:"笛";s:2:"²Ä";s:3:"第";s:2:"²Å";s:3:"符";s:2:"²Æ";s:3:"笙";s:2:"²Ç";s:3:"笞";s:2:"²È";s:3:"笮";s:2:"²É";s:3:"ç²’";s:2:"²Ê";s:3:"ç²—";s:2:"²Ë";s:3:"粕";s:2:"²Ì";s:3:"絆";s:2:"²Í";s:3:"絃";s:2:"²Î";s:3:"çµ±";s:2:"²Ï";s:3:"ç´®";s:2:"²Ð";s:3:"ç´¹";s:2:"²Ñ";s:3:"ç´¼";s:2:"²Ò";s:3:"çµ€";s:2:"²Ó";s:3:"ç´°";s:2:"²Ô";s:3:"ç´³";s:2:"²Õ";s:3:"組";s:2:"²Ö";s:3:"ç´¯";s:2:"²×";s:3:"終";s:2:"²Ø";s:3:"ç´²";s:2:"²Ù";s:3:"ç´±";s:2:"²Ú";s:3:"ç¼½";s:2:"²Û";s:3:"羞";s:2:"²Ü";s:3:"羚";s:2:"²Ý";s:3:"翌";s:2:"²Þ";s:3:"翎";s:2:"²ß";s:3:"ç¿’";s:2:"²à";s:3:"耜";s:2:"²á";s:3:"èŠ";s:2:"²â";s:3:"è†";s:2:"²ã";s:3:"脯";s:2:"²ä";s:3:"è„–";s:2:"²å";s:3:"è„£";s:2:"²æ";s:3:"è„«";s:2:"²ç";s:3:"è„©";s:2:"²è";s:3:"è„°";s:2:"²é";s:3:"脤";s:2:"²ê";s:3:"舂";s:2:"²ë";s:3:"舵";s:2:"²ì";s:3:"舷";s:2:"²í";s:3:"舶";s:2:"²î";s:3:"船";s:2:"²ï";s:3:"莎";s:2:"²ð";s:3:"莞";s:2:"²ñ";s:3:"莘";s:2:"²ò";s:3:"è¸";s:2:"²ó";s:3:"莢";s:2:"²ô";s:3:"莖";s:2:"²õ";s:3:"莽";s:2:"²ö";s:3:"莫";s:2:"²÷";s:3:"莒";s:2:"²ø";s:3:"莊";s:2:"²ù";s:3:"莓";s:2:"²ú";s:3:"莉";s:2:"²û";s:3:"莠";s:2:"²ü";s:3:"è·";s:2:"²ý";s:3:"è»";s:2:"²þ";s:3:"è¼";s:2:"³@";s:3:"莆";s:2:"³A";s:3:"莧";s:2:"³B";s:3:"處";s:2:"³C";s:3:"彪";s:2:"³D";s:3:"蛇";s:2:"³E";s:3:"蛀";s:2:"³F";s:3:"èš¶";s:2:"³G";s:3:"蛄";s:2:"³H";s:3:"èšµ";s:2:"³I";s:3:"蛆";s:2:"³J";s:3:"蛋";s:2:"³K";s:3:"èš±";s:2:"³L";s:3:"蚯";s:2:"³M";s:3:"蛉";s:2:"³N";s:3:"è¡“";s:2:"³O";s:3:"袞";s:2:"³P";s:3:"袈";s:2:"³Q";s:3:"被";s:2:"³R";s:3:"袒";s:2:"³S";s:3:"袖";s:2:"³T";s:3:"è¢";s:2:"³U";s:3:"袋";s:2:"³V";s:3:"覓";s:2:"³W";s:3:"è¦";s:2:"³X";s:3:"訪";s:2:"³Y";s:3:"è¨";s:2:"³Z";s:3:"訣";s:2:"³[";s:3:"訥";s:2:"³\";s:3:"許";s:2:"³]";s:3:"設";s:2:"³^";s:3:"訟";s:2:"³_";s:3:"訛";s:2:"³`";s:3:"訢";s:2:"³a";s:3:"豉";s:2:"³b";s:3:"豚";s:2:"³c";s:3:"販";s:2:"³d";s:3:"責";s:2:"³e";s:3:"貫";s:2:"³f";s:3:"貨";s:2:"³g";s:3:"貪";s:2:"³h";s:3:"è²§";s:2:"³i";s:3:"èµ§";s:2:"³j";s:3:"赦";s:2:"³k";s:3:"è¶¾";s:2:"³l";s:3:"趺";s:2:"³m";s:3:"è»›";s:2:"³n";s:3:"軟";s:2:"³o";s:3:"這";s:2:"³p";s:3:"é€";s:2:"³q";s:3:"通";s:2:"³r";s:3:"逗";s:2:"³s";s:3:"連";s:2:"³t";s:3:"速";s:2:"³u";s:3:"é€";s:2:"³v";s:3:"é€";s:2:"³w";s:3:"逕";s:2:"³x";s:3:"逞";s:2:"³y";s:3:"造";s:2:"³z";s:3:"é€";s:2:"³{";s:3:"逢";s:2:"³|";s:3:"逖";s:2:"³}";s:3:"逛";s:2:"³~";s:3:"途";s:2:"³¡";s:3:"部";s:2:"³¢";s:3:"郭";s:2:"³£";s:3:"都";s:2:"³¤";s:3:"é…—";s:2:"³¥";s:3:"野";s:2:"³¦";s:3:"釵";s:2:"³§";s:3:"釦";s:2:"³¨";s:3:"釣";s:2:"³©";s:3:"釧";s:2:"³ª";s:3:"釭";s:2:"³«";s:3:"釩";s:2:"³¬";s:3:"é–‰";s:2:"³­";s:3:"陪";s:2:"³®";s:3:"陵";s:2:"³¯";s:3:"陳";s:2:"³°";s:3:"陸";s:2:"³±";s:3:"é™°";s:2:"³²";s:3:"é™´";s:2:"³³";s:3:"é™¶";s:2:"³´";s:3:"é™·";s:2:"³µ";s:3:"陬";s:2:"³¶";s:3:"雀";s:2:"³·";s:3:"雪";s:2:"³¸";s:3:"雩";s:2:"³¹";s:3:"ç« ";s:2:"³º";s:3:"竟";s:2:"³»";s:3:"é ‚";s:2:"³¼";s:3:"é ƒ";s:2:"³½";s:3:"é­š";s:2:"³¾";s:3:"é³¥";s:2:"³¿";s:3:"é¹µ";s:2:"³À";s:3:"鹿";s:2:"³Á";s:3:"麥";s:2:"³Â";s:3:"麻";s:2:"³Ã";s:3:"å‚¢";s:2:"³Ä";s:3:"å‚";s:2:"³Å";s:3:"å‚…";s:2:"³Æ";s:3:"å‚™";s:2:"³Ç";s:3:"å‚‘";s:2:"³È";s:3:"å‚€";s:2:"³É";s:3:"å‚–";s:2:"³Ê";s:3:"傘";s:2:"³Ë";s:3:"傚";s:2:"³Ì";s:3:"最";s:2:"³Í";s:3:"凱";s:2:"³Î";s:3:"割";s:2:"³Ï";s:3:"剴";s:2:"³Ð";s:3:"創";s:2:"³Ñ";s:3:"剩";s:2:"³Ò";s:3:"勞";s:2:"³Ó";s:3:"å‹";s:2:"³Ô";s:3:"å‹›";s:2:"³Õ";s:3:"åš";s:2:"³Ö";s:3:"厥";s:2:"³×";s:3:"å•»";s:2:"³Ø";s:3:"å–€";s:2:"³Ù";s:3:"å–§";s:2:"³Ú";s:3:"啼";s:2:"³Û";s:3:"å–Š";s:2:"³Ü";s:3:"å–";s:2:"³Ý";s:3:"å–˜";s:2:"³Þ";s:3:"å–‚";s:2:"³ß";s:3:"å–œ";s:2:"³à";s:3:"å–ª";s:2:"³á";s:3:"å–”";s:2:"³â";s:3:"å–‡";s:2:"³ã";s:3:"å–‹";s:2:"³ä";s:3:"å–ƒ";s:2:"³å";s:3:"å–³";s:2:"³æ";s:3:"å–®";s:2:"³ç";s:3:"å–Ÿ";s:2:"³è";s:3:"唾";s:2:"³é";s:3:"å–²";s:2:"³ê";s:3:"å–š";s:2:"³ë";s:3:"å–»";s:2:"³ì";s:3:"å–¬";s:2:"³í";s:3:"å–±";s:2:"³î";s:3:"啾";s:2:"³ï";s:3:"å–‰";s:2:"³ð";s:3:"å–«";s:2:"³ñ";s:3:"å–™";s:2:"³ò";s:3:"åœ";s:2:"³ó";s:3:"å ¯";s:2:"³ô";s:3:"å ª";s:2:"³õ";s:3:"å ´";s:2:"³ö";s:3:"å ¤";s:2:"³÷";s:3:"å °";s:2:"³ø";s:3:"å ±";s:2:"³ù";s:3:"å ¡";s:2:"³ú";s:3:"å ";s:2:"³û";s:3:"å  ";s:2:"³ü";s:3:"壹";s:2:"³ý";s:3:"壺";s:2:"³þ";s:3:"奠";s:2:"´@";s:3:"å©·";s:2:"´A";s:3:"媚";s:2:"´B";s:3:"å©¿";s:2:"´C";s:3:"媒";s:2:"´D";s:3:"媛";s:2:"´E";s:3:"媧";s:2:"´F";s:3:"å­³";s:2:"´G";s:3:"å­±";s:2:"´H";s:3:"寒";s:2:"´I";s:3:"富";s:2:"´J";s:3:"寓";s:2:"´K";s:3:"å¯";s:2:"´L";s:3:"å°Š";s:2:"´M";s:3:"å°‹";s:2:"´N";s:3:"å°±";s:2:"´O";s:3:"嵌";s:2:"´P";s:3:"åµ";s:2:"´Q";s:3:"å´´";s:2:"´R";s:3:"嵇";s:2:"´S";s:3:"å·½";s:2:"´T";s:3:"å¹…";s:2:"´U";s:3:"帽";s:2:"´V";s:3:"å¹€";s:2:"´W";s:3:"幃";s:2:"´X";s:3:"å¹¾";s:2:"´Y";s:3:"廊";s:2:"´Z";s:3:"å»";s:2:"´[";s:3:"廂";s:2:"´\";s:3:"廄";s:2:"´]";s:3:"å¼¼";s:2:"´^";s:3:"å½­";s:2:"´_";s:3:"復";s:2:"´`";s:3:"循";s:2:"´a";s:3:"徨";s:2:"´b";s:3:"惑";s:2:"´c";s:3:"惡";s:2:"´d";s:3:"悲";s:2:"´e";s:3:"æ‚¶";s:2:"´f";s:3:"惠";s:2:"´g";s:3:"愜";s:2:"´h";s:3:"æ„£";s:2:"´i";s:3:"惺";s:2:"´j";s:3:"æ„•";s:2:"´k";s:3:"惰";s:2:"´l";s:3:"惻";s:2:"´m";s:3:"惴";s:2:"´n";s:3:"æ…¨";s:2:"´o";s:3:"惱";s:2:"´p";s:3:"愎";s:2:"´q";s:3:"惶";s:2:"´r";s:3:"愉";s:2:"´s";s:3:"æ„€";s:2:"´t";s:3:"æ„’";s:2:"´u";s:3:"戟";s:2:"´v";s:3:"扉";s:2:"´w";s:3:"掣";s:2:"´x";s:3:"掌";s:2:"´y";s:3:"æ";s:2:"´z";s:3:"æ€";s:2:"´{";s:3:"æ©";s:2:"´|";s:3:"æ‰";s:2:"´}";s:3:"æ†";s:2:"´~";s:3:"æ";s:2:"´¡";s:3:"æ’";s:2:"´¢";s:3:"æ£";s:2:"´£";s:3:"æ";s:2:"´¤";s:3:"æ¡";s:2:"´¥";s:3:"æ–";s:2:"´¦";s:3:"æ­";s:2:"´§";s:3:"æ®";s:2:"´¨";s:3:"æ¶";s:2:"´©";s:3:"æ´";s:2:"´ª";s:3:"æª";s:2:"´«";s:3:"æ›";s:2:"´¬";s:3:"æ‘’";s:2:"´­";s:3:"æš";s:2:"´®";s:3:"æ¹";s:2:"´¯";s:3:"敞";s:2:"´°";s:3:"敦";s:2:"´±";s:3:"æ•¢";s:2:"´²";s:3:"æ•£";s:2:"´³";s:3:"æ–‘";s:2:"´´";s:3:"æ–";s:2:"´µ";s:3:"æ–¯";s:2:"´¶";s:3:"æ™®";s:2:"´·";s:3:"æ™°";s:2:"´¸";s:3:"æ™´";s:2:"´¹";s:3:"æ™¶";s:2:"´º";s:3:"景";s:2:"´»";s:3:"æš‘";s:2:"´¼";s:3:"智";s:2:"´½";s:3:"晾";s:2:"´¾";s:3:"æ™·";s:2:"´¿";s:3:"曾";s:2:"´À";s:3:"替";s:2:"´Á";s:3:"期";s:2:"´Â";s:3:"æœ";s:2:"´Ã";s:3:"棺";s:2:"´Ä";s:3:"棕";s:2:"´Å";s:3:"棠";s:2:"´Æ";s:3:"棘";s:2:"´Ç";s:3:"棗";s:2:"´È";s:3:"椅";s:2:"´É";s:3:"棟";s:2:"´Ê";s:3:"棵";s:2:"´Ë";s:3:"森";s:2:"´Ì";s:3:"棧";s:2:"´Í";s:3:"棹";s:2:"´Î";s:3:"棒";s:2:"´Ï";s:3:"棲";s:2:"´Ð";s:3:"棣";s:2:"´Ñ";s:3:"棋";s:2:"´Ò";s:3:"æ£";s:2:"´Ó";s:3:"æ¤";s:2:"´Ô";s:3:"椒";s:2:"´Õ";s:3:"椎";s:2:"´Ö";s:3:"棉";s:2:"´×";s:3:"棚";s:2:"´Ø";s:3:"楮";s:2:"´Ù";s:3:"棻";s:2:"´Ú";s:3:"款";s:2:"´Û";s:3:"欺";s:2:"´Ü";s:3:"欽";s:2:"´Ý";s:3:"殘";s:2:"´Þ";s:3:"æ®–";s:2:"´ß";s:3:"殼";s:2:"´à";s:3:"毯";s:2:"´á";s:3:"æ°®";s:2:"´â";s:3:"æ°¯";s:2:"´ã";s:3:"æ°¬";s:2:"´ä";s:3:"港";s:2:"´å";s:3:"游";s:2:"´æ";s:3:"æ¹”";s:2:"´ç";s:3:"渡";s:2:"´è";s:3:"渲";s:2:"´é";s:3:"æ¹§";s:2:"´ê";s:3:"湊";s:2:"´ë";s:3:"渠";s:2:"´ì";s:3:"渥";s:2:"´í";s:3:"渣";s:2:"´î";s:3:"減";s:2:"´ï";s:3:"æ¹›";s:2:"´ð";s:3:"湘";s:2:"´ñ";s:3:"渤";s:2:"´ò";s:3:"æ¹–";s:2:"´ó";s:3:"æ¹®";s:2:"´ô";s:3:"渭";s:2:"´õ";s:3:"渦";s:2:"´ö";s:3:"湯";s:2:"´÷";s:3:"渴";s:2:"´ø";s:3:"æ¹";s:2:"´ù";s:3:"渺";s:2:"´ú";s:3:"測";s:2:"´û";s:3:"湃";s:2:"´ü";s:3:"æ¸";s:2:"´ý";s:3:"渾";s:2:"´þ";s:3:"滋";s:2:"µ@";s:3:"溉";s:2:"µA";s:3:"渙";s:2:"µB";s:3:"湎";s:2:"µC";s:3:"æ¹£";s:2:"µD";s:3:"湄";s:2:"µE";s:3:"æ¹²";s:2:"µF";s:3:"湩";s:2:"µG";s:3:"湟";s:2:"µH";s:3:"ç„™";s:2:"µI";s:3:"焚";s:2:"µJ";s:3:"焦";s:2:"µK";s:3:"ç„°";s:2:"µL";s:3:"ç„¡";s:2:"µM";s:3:"ç„¶";s:2:"µN";s:3:"ç…®";s:2:"µO";s:3:"焜";s:2:"µP";s:3:"牌";s:2:"µQ";s:3:"犄";s:2:"µR";s:3:"犀";s:2:"µS";s:3:"猶";s:2:"µT";s:3:"猥";s:2:"µU";s:3:"猴";s:2:"µV";s:3:"猩";s:2:"µW";s:3:"çº";s:2:"µX";s:3:"çª";s:2:"µY";s:3:"ç³";s:2:"µZ";s:3:"ç¢";s:2:"µ[";s:3:"ç¥";s:2:"µ\";s:3:"çµ";s:2:"µ]";s:3:"ç¶";s:2:"µ^";s:3:"ç´";s:2:"µ_";s:3:"ç¯";s:2:"µ`";s:3:"ç›";s:2:"µa";s:3:"ç¦";s:2:"µb";s:3:"ç¨";s:2:"µc";s:3:"甥";s:2:"µd";s:3:"甦";s:2:"µe";s:3:"ç•«";s:2:"µf";s:3:"番";s:2:"µg";s:3:"ç—¢";s:2:"µh";s:3:"ç—›";s:2:"µi";s:3:"ç—£";s:2:"µj";s:3:"ç—™";s:2:"µk";s:3:"ç—˜";s:2:"µl";s:3:"ç—ž";s:2:"µm";s:3:"ç— ";s:2:"µn";s:3:"ç™»";s:2:"µo";s:3:"發";s:2:"µp";s:3:"çš–";s:2:"µq";s:3:"çš“";s:2:"µr";s:3:"çš´";s:2:"µs";s:3:"盜";s:2:"µt";s:3:"ç";s:2:"µu";s:3:"短";s:2:"µv";s:3:"ç¡";s:2:"µw";s:3:"硬";s:2:"µx";s:3:"硯";s:2:"µy";s:3:"ç¨";s:2:"µz";s:3:"稈";s:2:"µ{";s:3:"程";s:2:"µ|";s:3:"稅";s:2:"µ}";s:3:"稀";s:2:"µ~";s:3:"窘";s:2:"µ¡";s:3:"窗";s:2:"µ¢";s:3:"窖";s:2:"µ£";s:3:"ç«¥";s:2:"µ¤";s:3:"ç«£";s:2:"µ¥";s:3:"ç­‰";s:2:"µ¦";s:3:"ç­–";s:2:"µ§";s:3:"ç­†";s:2:"µ¨";s:3:"ç­";s:2:"µ©";s:3:"ç­’";s:2:"µª";s:3:"ç­”";s:2:"µ«";s:3:"ç­";s:2:"µ¬";s:3:"ç­‹";s:2:"µ­";s:3:"ç­";s:2:"µ®";s:3:"ç­‘";s:2:"µ¯";s:3:"粟";s:2:"µ°";s:3:"ç²¥";s:2:"µ±";s:3:"絞";s:2:"µ²";s:3:"çµ";s:2:"µ³";s:3:"絨";s:2:"µ´";s:3:"絕";s:2:"µµ";s:3:"ç´«";s:2:"µ¶";s:3:"çµ®";s:2:"µ·";s:3:"çµ²";s:2:"µ¸";s:3:"絡";s:2:"µ¹";s:3:"給";s:2:"µº";s:3:"çµ¢";s:2:"µ»";s:3:"çµ°";s:2:"µ¼";s:3:"çµ³";s:2:"µ½";s:3:"å–„";s:2:"µ¾";s:3:"ç¿”";s:2:"µ¿";s:3:"ç¿•";s:2:"µÀ";s:3:"耋";s:2:"µÁ";s:3:"è’";s:2:"µÂ";s:3:"è‚…";s:2:"µÃ";s:3:"è…•";s:2:"µÄ";s:3:"è…”";s:2:"µÅ";s:3:"è…‹";s:2:"µÆ";s:3:"è…‘";s:2:"µÇ";s:3:"è…Ž";s:2:"µÈ";s:3:"脹";s:2:"µÉ";s:3:"è…†";s:2:"µÊ";s:3:"脾";s:2:"µË";s:3:"è…Œ";s:2:"µÌ";s:3:"è…“";s:2:"µÍ";s:3:"è…´";s:2:"µÎ";s:3:"舒";s:2:"µÏ";s:3:"舜";s:2:"µÐ";s:3:"è©";s:2:"µÑ";s:3:"èƒ";s:2:"µÒ";s:3:"è¸";s:2:"µÓ";s:3:"è";s:2:"µÔ";s:3:"è ";s:2:"µÕ";s:3:"è…";s:2:"µÖ";s:3:"è‹";s:2:"µ×";s:3:"è";s:2:"µØ";s:3:"è¯";s:2:"µÙ";s:3:"è±";s:2:"µÚ";s:3:"è´";s:2:"µÛ";s:3:"è‘—";s:2:"µÜ";s:3:"èŠ";s:2:"µÝ";s:3:"è°";s:2:"µÞ";s:3:"èŒ";s:2:"µß";s:3:"èŒ";s:2:"µà";s:3:"è½";s:2:"µá";s:3:"è²";s:2:"µâ";s:3:"èŠ";s:2:"µã";s:3:"è¸";s:2:"µä";s:3:"èŽ";s:2:"µå";s:3:"è„";s:2:"µæ";s:3:"èœ";s:2:"µç";s:3:"è‡";s:2:"µè";s:3:"è”";s:2:"µé";s:3:"èŸ";s:2:"µê";s:3:"è™›";s:2:"µë";s:3:"蛟";s:2:"µì";s:3:"è›™";s:2:"µí";s:3:"è›­";s:2:"µî";s:3:"è›”";s:2:"µï";s:3:"è››";s:2:"µð";s:3:"蛤";s:2:"µñ";s:3:"è›";s:2:"µò";s:3:"蛞";s:2:"µó";s:3:"è¡—";s:2:"µô";s:3:"è£";s:2:"µõ";s:3:"裂";s:2:"µö";s:3:"袱";s:2:"µ÷";s:3:"覃";s:2:"µø";s:3:"視";s:2:"µù";s:3:"註";s:2:"µú";s:3:"è© ";s:2:"µû";s:3:"è©•";s:2:"µü";s:3:"詞";s:2:"µý";s:3:"証";s:2:"µþ";s:3:"è©";s:2:"¶@";s:3:"è©”";s:2:"¶A";s:3:"è©›";s:2:"¶B";s:3:"è©";s:2:"¶C";s:3:"詆";s:2:"¶D";s:3:"訴";s:2:"¶E";s:3:"診";s:2:"¶F";s:3:"訶";s:2:"¶G";s:3:"è©–";s:2:"¶H";s:3:"象";s:2:"¶I";s:3:"貂";s:2:"¶J";s:3:"貯";s:2:"¶K";s:3:"è²¼";s:2:"¶L";s:3:"è²³";s:2:"¶M";s:3:"è²½";s:2:"¶N";s:3:"è³";s:2:"¶O";s:3:"è²»";s:2:"¶P";s:3:"è³€";s:2:"¶Q";s:3:"è²´";s:2:"¶R";s:3:"è²·";s:2:"¶S";s:3:"è²¶";s:2:"¶T";s:3:"貿";s:2:"¶U";s:3:"貸";s:2:"¶V";s:3:"è¶Š";s:2:"¶W";s:3:"è¶…";s:2:"¶X";s:3:"è¶";s:2:"¶Y";s:3:"è·Ž";s:2:"¶Z";s:3:"è·";s:2:"¶[";s:3:"è·‹";s:2:"¶\";s:3:"è·š";s:2:"¶]";s:3:"è·‘";s:2:"¶^";s:3:"è·Œ";s:2:"¶_";s:3:"è·›";s:2:"¶`";s:3:"è·†";s:2:"¶a";s:3:"è»»";s:2:"¶b";s:3:"軸";s:2:"¶c";s:3:"軼";s:2:"¶d";s:3:"辜";s:2:"¶e";s:3:"逮";s:2:"¶f";s:3:"逵";s:2:"¶g";s:3:"週";s:2:"¶h";s:3:"逸";s:2:"¶i";s:3:"進";s:2:"¶j";s:3:"逶";s:2:"¶k";s:3:"é„‚";s:2:"¶l";s:3:"郵";s:2:"¶m";s:3:"鄉";s:2:"¶n";s:3:"郾";s:2:"¶o";s:3:"é…£";s:2:"¶p";s:3:"é…¥";s:2:"¶q";s:3:"é‡";s:2:"¶r";s:3:"鈔";s:2:"¶s";s:3:"鈕";s:2:"¶t";s:3:"鈣";s:2:"¶u";s:3:"鈉";s:2:"¶v";s:3:"鈞";s:2:"¶w";s:3:"éˆ";s:2:"¶x";s:3:"éˆ";s:2:"¶y";s:3:"鈇";s:2:"¶z";s:3:"鈑";s:2:"¶{";s:3:"é–”";s:2:"¶|";s:3:"é–";s:2:"¶}";s:3:"é–‹";s:2:"¶~";s:3:"é–‘";s:2:"¶¡";s:3:"é–“";s:2:"¶¢";s:3:"é–’";s:2:"¶£";s:3:"é–Ž";s:2:"¶¤";s:3:"隊";s:2:"¶¥";s:3:"階";s:2:"¶¦";s:3:"éš‹";s:2:"¶§";s:3:"陽";s:2:"¶¨";s:3:"éš…";s:2:"¶©";s:3:"隆";s:2:"¶ª";s:3:"éš";s:2:"¶«";s:3:"陲";s:2:"¶¬";s:3:"éš„";s:2:"¶­";s:3:"é›";s:2:"¶®";s:3:"é›…";s:2:"¶¯";s:3:"雄";s:2:"¶°";s:3:"集";s:2:"¶±";s:3:"雇";s:2:"¶²";s:3:"雯";s:2:"¶³";s:3:"雲";s:2:"¶´";s:3:"韌";s:2:"¶µ";s:3:"é …";s:2:"¶¶";s:3:"é †";s:2:"¶·";s:3:"é ˆ";s:2:"¶¸";s:3:"飧";s:2:"¶¹";s:3:"飪";s:2:"¶º";s:3:"飯";s:2:"¶»";s:3:"飩";s:2:"¶¼";s:3:"飲";s:2:"¶½";s:3:"飭";s:2:"¶¾";s:3:"馮";s:2:"¶¿";s:3:"馭";s:2:"¶À";s:3:"黃";s:2:"¶Á";s:3:"é»";s:2:"¶Â";s:3:"黑";s:2:"¶Ã";s:3:"亂";s:2:"¶Ä";s:3:"å‚­";s:2:"¶Å";s:3:"債";s:2:"¶Æ";s:3:"傲";s:2:"¶Ç";s:3:"傳";s:2:"¶È";s:3:"僅";s:2:"¶É";s:3:"傾";s:2:"¶Ê";s:3:"催";s:2:"¶Ë";s:3:"å‚·";s:2:"¶Ì";s:3:"å‚»";s:2:"¶Í";s:3:"傯";s:2:"¶Î";s:3:"僇";s:2:"¶Ï";s:3:"剿";s:2:"¶Ð";s:3:"剷";s:2:"¶Ñ";s:3:"剽";s:2:"¶Ò";s:3:"募";s:2:"¶Ó";s:3:"勦";s:2:"¶Ô";s:3:"勤";s:2:"¶Õ";s:3:"å‹¢";s:2:"¶Ö";s:3:"å‹£";s:2:"¶×";s:3:"匯";s:2:"¶Ø";s:3:"å—Ÿ";s:2:"¶Ù";s:3:"å—¨";s:2:"¶Ú";s:3:"å—“";s:2:"¶Û";s:3:"å—¦";s:2:"¶Ü";s:3:"å—Ž";s:2:"¶Ý";s:3:"å—œ";s:2:"¶Þ";s:3:"å—‡";s:2:"¶ß";s:3:"å—‘";s:2:"¶à";s:3:"å—£";s:2:"¶á";s:3:"å—¤";s:2:"¶â";s:3:"å—¯";s:2:"¶ã";s:3:"å—š";s:2:"¶ä";s:3:"å—¡";s:2:"¶å";s:3:"å—…";s:2:"¶æ";s:3:"å—†";s:2:"¶ç";s:3:"å—¥";s:2:"¶è";s:3:"å—‰";s:2:"¶é";s:3:"園";s:2:"¶ê";s:3:"圓";s:2:"¶ë";s:3:"塞";s:2:"¶ì";s:3:"å¡‘";s:2:"¶í";s:3:"塘";s:2:"¶î";s:3:"å¡—";s:2:"¶ï";s:3:"塚";s:2:"¶ð";s:3:"å¡”";s:2:"¶ñ";s:3:"å¡«";s:2:"¶ò";s:3:"塌";s:2:"¶ó";s:3:"å¡­";s:2:"¶ô";s:3:"塊";s:2:"¶õ";s:3:"å¡¢";s:2:"¶ö";s:3:"å¡’";s:2:"¶÷";s:3:"å¡‹";s:2:"¶ø";s:3:"奧";s:2:"¶ù";s:3:"å«";s:2:"¶ú";s:3:"嫉";s:2:"¶û";s:3:"嫌";s:2:"¶ü";s:3:"媾";s:2:"¶ý";s:3:"媽";s:2:"¶þ";s:3:"媼";s:2:"·@";s:3:"媳";s:2:"·A";s:3:"å«‚";s:2:"·B";s:3:"媲";s:2:"·C";s:3:"嵩";s:2:"·D";s:3:"嵯";s:2:"·E";s:3:"幌";s:2:"·F";s:3:"å¹¹";s:2:"·G";s:3:"廉";s:2:"·H";s:3:"廈";s:2:"·I";s:3:"å¼’";s:2:"·J";s:3:"å½™";s:2:"·K";s:3:"徬";s:2:"·L";s:3:"å¾®";s:2:"·M";s:3:"愚";s:2:"·N";s:3:"æ„";s:2:"·O";s:3:"æ…ˆ";s:2:"·P";s:3:"感";s:2:"·Q";s:3:"想";s:2:"·R";s:3:"æ„›";s:2:"·S";s:3:"惹";s:2:"·T";s:3:"æ„";s:2:"·U";s:3:"愈";s:2:"·V";s:3:"æ…Ž";s:2:"·W";s:3:"æ…Œ";s:2:"·X";s:3:"æ…„";s:2:"·Y";s:3:"æ…";s:2:"·Z";s:3:"愾";s:2:"·[";s:3:"æ„´";s:2:"·\";s:3:"æ„§";s:2:"·]";s:3:"æ„";s:2:"·^";s:3:"愆";s:2:"·_";s:3:"æ„·";s:2:"·`";s:3:"戡";s:2:"·a";s:3:"戢";s:2:"·b";s:3:"æ“";s:2:"·c";s:3:"æ¾";s:2:"·d";s:3:"æž";s:2:"·e";s:3:"æª";s:2:"·f";s:3:"æ­";s:2:"·g";s:3:"æ½";s:2:"·h";s:3:"æ¬";s:2:"·i";s:3:"æ";s:2:"·j";s:3:"æœ";s:2:"·k";s:3:"æ”";s:2:"·l";s:3:"æ";s:2:"·m";s:3:"æ¶";s:2:"·n";s:3:"æ–";s:2:"·o";s:3:"æ—";s:2:"·p";s:3:"æ†";s:2:"·q";s:3:"敬";s:2:"·r";s:3:"æ–Ÿ";s:2:"·s";s:3:"æ–°";s:2:"·t";s:3:"æš—";s:2:"·u";s:3:"暉";s:2:"·v";s:3:"暇";s:2:"·w";s:3:"暈";s:2:"·x";s:3:"æš–";s:2:"·y";s:3:"æš„";s:2:"·z";s:3:"暘";s:2:"·{";s:3:"æš";s:2:"·|";s:3:"會";s:2:"·}";s:3:"榔";s:2:"·~";s:3:"業";s:2:"·¡";s:3:"楚";s:2:"·¢";s:3:"楷";s:2:"·£";s:3:"楠";s:2:"·¤";s:3:"楔";s:2:"·¥";s:3:"極";s:2:"·¦";s:3:"椰";s:2:"·§";s:3:"概";s:2:"·¨";s:3:"楊";s:2:"·©";s:3:"楨";s:2:"·ª";s:3:"楫";s:2:"·«";s:3:"楞";s:2:"·¬";s:3:"楓";s:2:"·­";s:3:"楹";s:2:"·®";s:3:"榆";s:2:"·¯";s:3:"æ¥";s:2:"·°";s:3:"楣";s:2:"·±";s:3:"楛";s:2:"·²";s:3:"æ­‡";s:2:"·³";s:3:"æ­²";s:2:"·´";s:3:"毀";s:2:"·µ";s:3:"殿";s:2:"·¶";s:3:"毓";s:2:"··";s:3:"毽";s:2:"·¸";s:3:"溢";s:2:"·¹";s:3:"溯";s:2:"·º";s:3:"滓";s:2:"·»";s:3:"溶";s:2:"·¼";s:3:"滂";s:2:"·½";s:3:"æº";s:2:"·¾";s:3:"æº";s:2:"·¿";s:3:"滇";s:2:"·À";s:3:"æ»…";s:2:"·Á";s:3:"溥";s:2:"·Â";s:3:"溘";s:2:"·Ã";s:3:"溼";s:2:"·Ä";s:3:"溺";s:2:"·Å";s:3:"溫";s:2:"·Æ";s:3:"滑";s:2:"·Ç";s:3:"準";s:2:"·È";s:3:"溜";s:2:"·É";s:3:"滄";s:2:"·Ê";s:3:"æ»”";s:2:"·Ë";s:3:"溪";s:2:"·Ì";s:3:"溧";s:2:"·Í";s:3:"溴";s:2:"·Î";s:3:"ç…Ž";s:2:"·Ï";s:3:"ç…™";s:2:"·Ð";s:3:"ç…©";s:2:"·Ñ";s:3:"ç…¤";s:2:"·Ò";s:3:"ç…‰";s:2:"·Ó";s:3:"ç…§";s:2:"·Ô";s:3:"ç…œ";s:2:"·Õ";s:3:"ç…¬";s:2:"·Ö";s:3:"ç…¦";s:2:"·×";s:3:"ç…Œ";s:2:"·Ø";s:3:"ç…¥";s:2:"·Ù";s:3:"ç…ž";s:2:"·Ú";s:3:"ç…†";s:2:"·Û";s:3:"ç…¨";s:2:"·Ü";s:3:"ç…–";s:2:"·Ý";s:3:"爺";s:2:"·Þ";s:3:"牒";s:2:"·ß";s:3:"猷";s:2:"·à";s:3:"ç…";s:2:"·á";s:3:"猿";s:2:"·â";s:3:"猾";s:2:"·ã";s:3:"瑯";s:2:"·ä";s:3:"瑚";s:2:"·å";s:3:"ç‘•";s:2:"·æ";s:3:"瑟";s:2:"·ç";s:3:"瑞";s:2:"·è";s:3:"ç‘";s:2:"·é";s:3:"ç¿";s:2:"·ê";s:3:"ç‘™";s:2:"·ë";s:3:"ç‘›";s:2:"·ì";s:3:"瑜";s:2:"·í";s:3:"ç•¶";s:2:"·î";s:3:"畸";s:2:"·ï";s:3:"瘀";s:2:"·ð";s:3:"ç—°";s:2:"·ñ";s:3:"ç˜";s:2:"·ò";s:3:"ç—²";s:2:"·ó";s:3:"ç—±";s:2:"·ô";s:3:"ç—º";s:2:"·õ";s:3:"ç—¿";s:2:"·ö";s:3:"ç—´";s:2:"·÷";s:3:"ç—³";s:2:"·ø";s:3:"盞";s:2:"·ù";s:3:"盟";s:2:"·ú";s:3:"ç›";s:2:"·û";s:3:"ç«";s:2:"·ü";s:3:"ç¦";s:2:"·ý";s:3:"çž";s:2:"·þ";s:3:"ç£";s:2:"¸@";s:3:"ç¹";s:2:"¸A";s:3:"çª";s:2:"¸B";s:3:"ç¬";s:2:"¸C";s:3:"çœ";s:2:"¸D";s:3:"ç¥";s:2:"¸E";s:3:"ç¨";s:2:"¸F";s:3:"ç¢";s:2:"¸G";s:3:"矮";s:2:"¸H";s:3:"碎";s:2:"¸I";s:3:"碰";s:2:"¸J";s:3:"碗";s:2:"¸K";s:3:"碘";s:2:"¸L";s:3:"碌";s:2:"¸M";s:3:"碉";s:2:"¸N";s:3:"硼";s:2:"¸O";s:3:"碑";s:2:"¸P";s:3:"碓";s:2:"¸Q";s:3:"ç¡¿";s:2:"¸R";s:3:"祺";s:2:"¸S";s:3:"祿";s:2:"¸T";s:3:"ç¦";s:2:"¸U";s:3:"è¬";s:2:"¸V";s:3:"禽";s:2:"¸W";s:3:"稜";s:2:"¸X";s:3:"稚";s:2:"¸Y";s:3:"稠";s:2:"¸Z";s:3:"稔";s:2:"¸[";s:3:"稟";s:2:"¸\";s:3:"稞";s:2:"¸]";s:3:"窟";s:2:"¸^";s:3:"窠";s:2:"¸_";s:3:"ç­·";s:2:"¸`";s:3:"節";s:2:"¸a";s:3:"ç­ ";s:2:"¸b";s:3:"ç­®";s:2:"¸c";s:3:"ç­§";s:2:"¸d";s:3:"ç²±";s:2:"¸e";s:3:"ç²³";s:2:"¸f";s:3:"ç²µ";s:2:"¸g";s:3:"ç¶“";s:2:"¸h";s:3:"çµ¹";s:2:"¸i";s:3:"ç¶‘";s:2:"¸j";s:3:"ç¶";s:2:"¸k";s:3:"ç¶";s:2:"¸l";s:3:"çµ›";s:2:"¸m";s:3:"ç½®";s:2:"¸n";s:3:"罩";s:2:"¸o";s:3:"罪";s:2:"¸p";s:3:"ç½²";s:2:"¸q";s:3:"義";s:2:"¸r";s:3:"羨";s:2:"¸s";s:3:"群";s:2:"¸t";s:3:"è–";s:2:"¸u";s:3:"è˜";s:2:"¸v";s:3:"肆";s:2:"¸w";s:3:"è‚„";s:2:"¸x";s:3:"è…±";s:2:"¸y";s:3:"è…°";s:2:"¸z";s:3:"è…¸";s:2:"¸{";s:3:"è…¥";s:2:"¸|";s:3:"è…®";s:2:"¸}";s:3:"è…³";s:2:"¸~";s:3:"è…«";s:2:"¸¡";s:3:"è…¹";s:2:"¸¢";s:3:"è…º";s:2:"¸£";s:3:"è…¦";s:2:"¸¤";s:3:"舅";s:2:"¸¥";s:3:"艇";s:2:"¸¦";s:3:"è’‚";s:2:"¸§";s:3:"è‘·";s:2:"¸¨";s:3:"è½";s:2:"¸©";s:3:"è±";s:2:"¸ª";s:3:"葵";s:2:"¸«";s:3:"葦";s:2:"¸¬";s:3:"è‘«";s:2:"¸­";s:3:"葉";s:2:"¸®";s:3:"葬";s:2:"¸¯";s:3:"è‘›";s:2:"¸°";s:3:"è¼";s:2:"¸±";s:3:"èµ";s:2:"¸²";s:3:"è‘¡";s:2:"¸³";s:3:"è‘£";s:2:"¸´";s:3:"è‘©";s:2:"¸µ";s:3:"è‘­";s:2:"¸¶";s:3:"葆";s:2:"¸·";s:3:"虞";s:2:"¸¸";s:3:"虜";s:2:"¸¹";s:3:"號";s:2:"¸º";s:3:"蛹";s:2:"¸»";s:3:"蜓";s:2:"¸¼";s:3:"蜈";s:2:"¸½";s:3:"蜇";s:2:"¸¾";s:3:"蜀";s:2:"¸¿";s:3:"蛾";s:2:"¸À";s:3:"è›»";s:2:"¸Á";s:3:"蜂";s:2:"¸Â";s:3:"蜃";s:2:"¸Ã";s:3:"蜆";s:2:"¸Ä";s:3:"蜊";s:2:"¸Å";s:3:"è¡™";s:2:"¸Æ";s:3:"裟";s:2:"¸Ç";s:3:"裔";s:2:"¸È";s:3:"裙";s:2:"¸É";s:3:"補";s:2:"¸Ê";s:3:"裘";s:2:"¸Ë";s:3:"è£";s:2:"¸Ì";s:3:"裡";s:2:"¸Í";s:3:"裊";s:2:"¸Î";s:3:"裕";s:2:"¸Ï";s:3:"裒";s:2:"¸Ð";s:3:"覜";s:2:"¸Ñ";s:3:"è§£";s:2:"¸Ò";s:3:"è©«";s:2:"¸Ó";s:3:"該";s:2:"¸Ô";s:3:"詳";s:2:"¸Õ";s:3:"試";s:2:"¸Ö";s:3:"è©©";s:2:"¸×";s:3:"è©°";s:2:"¸Ø";s:3:"誇";s:2:"¸Ù";s:3:"詼";s:2:"¸Ú";s:3:"è©£";s:2:"¸Û";s:3:"誠";s:2:"¸Ü";s:3:"話";s:2:"¸Ý";s:3:"誅";s:2:"¸Þ";s:3:"è©­";s:2:"¸ß";s:3:"è©¢";s:2:"¸à";s:3:"è©®";s:2:"¸á";s:3:"詬";s:2:"¸â";s:3:"詹";s:2:"¸ã";s:3:"è©»";s:2:"¸ä";s:3:"訾";s:2:"¸å";s:3:"詨";s:2:"¸æ";s:3:"è±¢";s:2:"¸ç";s:3:"貊";s:2:"¸è";s:3:"貉";s:2:"¸é";s:3:"賊";s:2:"¸ê";s:3:"資";s:2:"¸ë";s:3:"賈";s:2:"¸ì";s:3:"賄";s:2:"¸í";s:3:"è²²";s:2:"¸î";s:3:"賃";s:2:"¸ï";s:3:"賂";s:2:"¸ð";s:3:"è³…";s:2:"¸ñ";s:3:"è·¡";s:2:"¸ò";s:3:"è·Ÿ";s:2:"¸ó";s:3:"è·¨";s:2:"¸ô";s:3:"è·¯";s:2:"¸õ";s:3:"è·³";s:2:"¸ö";s:3:"è·º";s:2:"¸÷";s:3:"è·ª";s:2:"¸ø";s:3:"è·¤";s:2:"¸ù";s:3:"è·¦";s:2:"¸ú";s:3:"躲";s:2:"¸û";s:3:"較";s:2:"¸ü";s:3:"載";s:2:"¸ý";s:3:"軾";s:2:"¸þ";s:3:"輊";s:2:"¹@";s:3:"辟";s:2:"¹A";s:3:"è¾²";s:2:"¹B";s:3:"é‹";s:2:"¹C";s:3:"éŠ";s:2:"¹D";s:3:"é“";s:2:"¹E";s:3:"é‚";s:2:"¹F";s:3:"é”";s:2:"¹G";s:3:"逼";s:2:"¹H";s:3:"é•";s:2:"¹I";s:3:"é";s:2:"¹J";s:3:"é‡";s:2:"¹K";s:3:"é";s:2:"¹L";s:3:"éŽ";s:2:"¹M";s:3:"é";s:2:"¹N";s:3:"é‘";s:2:"¹O";s:3:"逾";s:2:"¹P";s:3:"é";s:2:"¹Q";s:3:"é„’";s:2:"¹R";s:3:"é„—";s:2:"¹S";s:3:"é…¬";s:2:"¹T";s:3:"é…ª";s:2:"¹U";s:3:"é…©";s:2:"¹V";s:3:"釉";s:2:"¹W";s:3:"鈷";s:2:"¹X";s:3:"鉗";s:2:"¹Y";s:3:"鈸";s:2:"¹Z";s:3:"鈽";s:2:"¹[";s:3:"鉀";s:2:"¹\";s:3:"鈾";s:2:"¹]";s:3:"鉛";s:2:"¹^";s:3:"鉋";s:2:"¹_";s:3:"鉤";s:2:"¹`";s:3:"鉑";s:2:"¹a";s:3:"鈴";s:2:"¹b";s:3:"鉉";s:2:"¹c";s:3:"é‰";s:2:"¹d";s:3:"鉅";s:2:"¹e";s:3:"鈹";s:2:"¹f";s:3:"鈿";s:2:"¹g";s:3:"鉚";s:2:"¹h";s:3:"é–˜";s:2:"¹i";s:3:"隘";s:2:"¹j";s:3:"éš”";s:2:"¹k";s:3:"éš•";s:2:"¹l";s:3:"é›";s:2:"¹m";s:3:"雋";s:2:"¹n";s:3:"雉";s:2:"¹o";s:3:"雊";s:2:"¹p";s:3:"é›·";s:2:"¹q";s:3:"é›»";s:2:"¹r";s:3:"雹";s:2:"¹s";s:3:"é›¶";s:2:"¹t";s:3:"é–";s:2:"¹u";s:3:"é´";s:2:"¹v";s:3:"é¶";s:2:"¹w";s:3:"é ";s:2:"¹x";s:3:"é ‘";s:2:"¹y";s:3:"é “";s:2:"¹z";s:3:"é Š";s:2:"¹{";s:3:"é ’";s:2:"¹|";s:3:"é Œ";s:2:"¹}";s:3:"飼";s:2:"¹~";s:3:"飴";s:2:"¹¡";s:3:"飽";s:2:"¹¢";s:3:"飾";s:2:"¹£";s:3:"馳";s:2:"¹¤";s:3:"馱";s:2:"¹¥";s:3:"馴";s:2:"¹¦";s:3:"é«¡";s:2:"¹§";s:3:"鳩";s:2:"¹¨";s:3:"麂";s:2:"¹©";s:3:"鼎";s:2:"¹ª";s:3:"鼓";s:2:"¹«";s:3:"é¼ ";s:2:"¹¬";s:3:"僧";s:2:"¹­";s:3:"僮";s:2:"¹®";s:3:"僥";s:2:"¹¯";s:3:"僖";s:2:"¹°";s:3:"僭";s:2:"¹±";s:3:"僚";s:2:"¹²";s:3:"僕";s:2:"¹³";s:3:"åƒ";s:2:"¹´";s:3:"僑";s:2:"¹µ";s:3:"僱";s:2:"¹¶";s:3:"僎";s:2:"¹·";s:3:"僩";s:2:"¹¸";s:3:"å…¢";s:2:"¹¹";s:3:"凳";s:2:"¹º";s:3:"劃";s:2:"¹»";s:3:"劂";s:2:"¹¼";s:3:"匱";s:2:"¹½";s:3:"厭";s:2:"¹¾";s:3:"å—¾";s:2:"¹¿";s:3:"嘀";s:2:"¹À";s:3:"嘛";s:2:"¹Á";s:3:"嘗";s:2:"¹Â";s:3:"å—½";s:2:"¹Ã";s:3:"嘔";s:2:"¹Ä";s:3:"嘆";s:2:"¹Å";s:3:"嘉";s:2:"¹Æ";s:3:"å˜";s:2:"¹Ç";s:3:"嘎";s:2:"¹È";s:3:"å—·";s:2:"¹É";s:3:"嘖";s:2:"¹Ê";s:3:"嘟";s:2:"¹Ë";s:3:"嘈";s:2:"¹Ì";s:3:"å˜";s:2:"¹Í";s:3:"å—¶";s:2:"¹Î";s:3:"團";s:2:"¹Ï";s:3:"圖";s:2:"¹Ð";s:3:"塵";s:2:"¹Ñ";s:3:"塾";s:2:"¹Ò";s:3:"境";s:2:"¹Ó";s:3:"墓";s:2:"¹Ô";s:3:"墊";s:2:"¹Õ";s:3:"塹";s:2:"¹Ö";s:3:"墅";s:2:"¹×";s:3:"塽";s:2:"¹Ø";s:3:"壽";s:2:"¹Ù";s:3:"夥";s:2:"¹Ú";s:3:"夢";s:2:"¹Û";s:3:"夤";s:2:"¹Ü";s:3:"奪";s:2:"¹Ý";s:3:"奩";s:2:"¹Þ";s:3:"å«¡";s:2:"¹ß";s:3:"嫦";s:2:"¹à";s:3:"å«©";s:2:"¹á";s:3:"å«—";s:2:"¹â";s:3:"å«–";s:2:"¹ã";s:3:"嫘";s:2:"¹ä";s:3:"å«£";s:2:"¹å";s:3:"å­µ";s:2:"¹æ";s:3:"寞";s:2:"¹ç";s:3:"寧";s:2:"¹è";s:3:"寡";s:2:"¹é";s:3:"寥";s:2:"¹ê";s:3:"實";s:2:"¹ë";s:3:"寨";s:2:"¹ì";s:3:"寢";s:2:"¹í";s:3:"寤";s:2:"¹î";s:3:"察";s:2:"¹ï";s:3:"å°";s:2:"¹ð";s:3:"å±¢";s:2:"¹ñ";s:3:"å¶„";s:2:"¹ò";s:3:"嶇";s:2:"¹ó";s:3:"å¹›";s:2:"¹ô";s:3:"å¹£";s:2:"¹õ";s:3:"幕";s:2:"¹ö";s:3:"å¹—";s:2:"¹÷";s:3:"å¹”";s:2:"¹ø";s:3:"廓";s:2:"¹ù";s:3:"å»–";s:2:"¹ú";s:3:"弊";s:2:"¹û";s:3:"彆";s:2:"¹ü";s:3:"å½°";s:2:"¹ý";s:3:"å¾¹";s:2:"¹þ";s:3:"æ…‡";s:2:"º@";s:3:"æ„¿";s:2:"ºA";s:3:"æ…‹";s:2:"ºB";s:3:"æ…·";s:2:"ºC";s:3:"æ…¢";s:2:"ºD";s:3:"æ…£";s:2:"ºE";s:3:"æ…Ÿ";s:2:"ºF";s:3:"æ…š";s:2:"ºG";s:3:"æ…˜";s:2:"ºH";s:3:"æ…µ";s:2:"ºI";s:3:"截";s:2:"ºJ";s:3:"æ’‡";s:2:"ºK";s:3:"摘";s:2:"ºL";s:3:"æ‘”";s:2:"ºM";s:3:"æ’¤";s:2:"ºN";s:3:"摸";s:2:"ºO";s:3:"摟";s:2:"ºP";s:3:"摺";s:2:"ºQ";s:3:"æ‘‘";s:2:"ºR";s:3:"æ‘§";s:2:"ºS";s:3:"æ´";s:2:"ºT";s:3:"æ‘­";s:2:"ºU";s:3:"æ‘»";s:2:"ºV";s:3:"敲";s:2:"ºW";s:3:"æ–¡";s:2:"ºX";s:3:"æ——";s:2:"ºY";s:3:"æ—–";s:2:"ºZ";s:3:"暢";s:2:"º[";s:3:"暨";s:2:"º\";s:3:"æš";s:2:"º]";s:3:"榜";s:2:"º^";s:3:"榨";s:2:"º_";s:3:"榕";s:2:"º`";s:3:"æ§";s:2:"ºa";s:3:"榮";s:2:"ºb";s:3:"æ§“";s:2:"ºc";s:3:"æ§‹";s:2:"ºd";s:3:"榛";s:2:"ºe";s:3:"榷";s:2:"ºf";s:3:"榻";s:2:"ºg";s:3:"榫";s:2:"ºh";s:3:"榴";s:2:"ºi";s:3:"æ§";s:2:"ºj";s:3:"æ§";s:2:"ºk";s:3:"榭";s:2:"ºl";s:3:"æ§Œ";s:2:"ºm";s:3:"榦";s:2:"ºn";s:3:"槃";s:2:"ºo";s:3:"榣";s:2:"ºp";s:3:"æ­‰";s:2:"ºq";s:3:"æ­Œ";s:2:"ºr";s:3:"æ°³";s:2:"ºs";s:3:"æ¼³";s:2:"ºt";s:3:"æ¼”";s:2:"ºu";s:3:"滾";s:2:"ºv";s:3:"漓";s:2:"ºw";s:3:"æ»´";s:2:"ºx";s:3:"漩";s:2:"ºy";s:3:"æ¼¾";s:2:"ºz";s:3:"æ¼ ";s:2:"º{";s:3:"漬";s:2:"º|";s:3:"æ¼";s:2:"º}";s:3:"漂";s:2:"º~";s:3:"æ¼¢";s:2:"º¡";s:3:"滿";s:2:"º¢";s:3:"滯";s:2:"º£";s:3:"漆";s:2:"º¤";s:3:"æ¼±";s:2:"º¥";s:3:"漸";s:2:"º¦";s:3:"æ¼²";s:2:"º§";s:3:"æ¼£";s:2:"º¨";s:3:"漕";s:2:"º©";s:3:"漫";s:2:"ºª";s:3:"漯";s:2:"º«";s:3:"澈";s:2:"º¬";s:3:"漪";s:2:"º­";s:3:"滬";s:2:"º®";s:3:"æ¼";s:2:"º¯";s:3:"滲";s:2:"º°";s:3:"滌";s:2:"º±";s:3:"æ»·";s:2:"º²";s:3:"熔";s:2:"º³";s:3:"熙";s:2:"º´";s:3:"ç…½";s:2:"ºµ";s:3:"熊";s:2:"º¶";s:3:"熄";s:2:"º·";s:3:"熒";s:2:"º¸";s:3:"爾";s:2:"º¹";s:3:"犒";s:2:"ºº";s:3:"犖";s:2:"º»";s:3:"ç„";s:2:"º¼";s:3:"ç";s:2:"º½";s:3:"瑤";s:2:"º¾";s:3:"ç‘£";s:2:"º¿";s:3:"瑪";s:2:"ºÀ";s:3:"ç‘°";s:2:"ºÁ";s:3:"ç‘­";s:2:"ºÂ";s:3:"甄";s:2:"ºÃ";s:3:"ç–‘";s:2:"ºÄ";s:3:"瘧";s:2:"ºÅ";s:3:"ç˜";s:2:"ºÆ";s:3:"瘋";s:2:"ºÇ";s:3:"瘉";s:2:"ºÈ";s:3:"瘓";s:2:"ºÉ";s:3:"盡";s:2:"ºÊ";s:3:"監";s:2:"ºË";s:3:"çž„";s:2:"ºÌ";s:3:"ç½";s:2:"ºÍ";s:3:"ç¿";s:2:"ºÎ";s:3:"ç¡";s:2:"ºÏ";s:3:"ç£";s:2:"ºÐ";s:3:"碟";s:2:"ºÑ";s:3:"碧";s:2:"ºÒ";s:3:"碳";s:2:"ºÓ";s:3:"碩";s:2:"ºÔ";s:3:"碣";s:2:"ºÕ";s:3:"禎";s:2:"ºÖ";s:3:"ç¦";s:2:"º×";s:3:"ç¦";s:2:"ºØ";s:3:"種";s:2:"ºÙ";s:3:"稱";s:2:"ºÚ";s:3:"窪";s:2:"ºÛ";s:3:"窩";s:2:"ºÜ";s:3:"ç«­";s:2:"ºÝ";s:3:"端";s:2:"ºÞ";s:3:"管";s:2:"ºß";s:3:"箕";s:2:"ºà";s:3:"箋";s:2:"ºá";s:3:"ç­µ";s:2:"ºâ";s:3:"ç®—";s:2:"ºã";s:3:"ç®";s:2:"ºä";s:3:"ç®”";s:2:"ºå";s:3:"ç®";s:2:"ºæ";s:3:"箸";s:2:"ºç";s:3:"箇";s:2:"ºè";s:3:"箄";s:2:"ºé";s:3:"ç²¹";s:2:"ºê";s:3:"ç²½";s:2:"ºë";s:3:"ç²¾";s:2:"ºì";s:3:"ç¶»";s:2:"ºí";s:3:"ç¶°";s:2:"ºî";s:3:"ç¶œ";s:2:"ºï";s:3:"ç¶½";s:2:"ºð";s:3:"ç¶¾";s:2:"ºñ";s:3:"ç¶ ";s:2:"ºò";s:3:"ç·Š";s:2:"ºó";s:3:"ç¶´";s:2:"ºô";s:3:"ç¶²";s:2:"ºõ";s:3:"ç¶±";s:2:"ºö";s:3:"綺";s:2:"º÷";s:3:"ç¶¢";s:2:"ºø";s:3:"ç¶¿";s:2:"ºù";s:3:"ç¶µ";s:2:"ºú";s:3:"綸";s:2:"ºû";s:3:"ç¶­";s:2:"ºü";s:3:"ç·’";s:2:"ºý";s:3:"ç·‡";s:2:"ºþ";s:3:"綬";s:2:"»@";s:3:"ç½°";s:2:"»A";s:3:"ç¿ ";s:2:"»B";s:3:"ç¿¡";s:2:"»C";s:3:"翟";s:2:"»D";s:3:"èž";s:2:"»E";s:3:"èš";s:2:"»F";s:3:"肇";s:2:"»G";s:3:"è…";s:2:"»H";s:3:"膀";s:2:"»I";s:3:"è†";s:2:"»J";s:3:"膈";s:2:"»K";s:3:"膊";s:2:"»L";s:3:"è…¿";s:2:"»M";s:3:"膂";s:2:"»N";s:3:"臧";s:2:"»O";s:3:"臺";s:2:"»P";s:3:"與";s:2:"»Q";s:3:"舔";s:2:"»R";s:3:"舞";s:2:"»S";s:3:"艋";s:2:"»T";s:3:"蓉";s:2:"»U";s:3:"è’¿";s:2:"»V";s:3:"蓆";s:2:"»W";s:3:"è“„";s:2:"»X";s:3:"è’™";s:2:"»Y";s:3:"è’ž";s:2:"»Z";s:3:"è’²";s:2:"»[";s:3:"è’œ";s:2:"»\";s:3:"è“‹";s:2:"»]";s:3:"è’¸";s:2:"»^";s:3:"è“€";s:2:"»_";s:3:"è““";s:2:"»`";s:3:"è’";s:2:"»a";s:3:"è’¼";s:2:"»b";s:3:"è“‘";s:2:"»c";s:3:"蓊";s:2:"»d";s:3:"蜿";s:2:"»e";s:3:"蜜";s:2:"»f";s:3:"蜻";s:2:"»g";s:3:"蜢";s:2:"»h";s:3:"蜥";s:2:"»i";s:3:"蜴";s:2:"»j";s:3:"蜘";s:2:"»k";s:3:"è•";s:2:"»l";s:3:"蜷";s:2:"»m";s:3:"蜩";s:2:"»n";s:3:"裳";s:2:"»o";s:3:"褂";s:2:"»p";s:3:"裴";s:2:"»q";s:3:"裹";s:2:"»r";s:3:"裸";s:2:"»s";s:3:"製";s:2:"»t";s:3:"裨";s:2:"»u";s:3:"褚";s:2:"»v";s:3:"裯";s:2:"»w";s:3:"誦";s:2:"»x";s:3:"誌";s:2:"»y";s:3:"語";s:2:"»z";s:3:"誣";s:2:"»{";s:3:"èª";s:2:"»|";s:3:"誡";s:2:"»}";s:3:"誓";s:2:"»~";s:3:"誤";s:2:"»¡";s:3:"說";s:2:"»¢";s:3:"誥";s:2:"»£";s:3:"誨";s:2:"»¤";s:3:"誘";s:2:"»¥";s:3:"誑";s:2:"»¦";s:3:"誚";s:2:"»§";s:3:"誧";s:2:"»¨";s:3:"豪";s:2:"»©";s:3:"è²";s:2:"»ª";s:3:"貌";s:2:"»«";s:3:"賓";s:2:"»¬";s:3:"賑";s:2:"»­";s:3:"è³’";s:2:"»®";s:3:"赫";s:2:"»¯";s:3:"è¶™";s:2:"»°";s:3:"è¶•";s:2:"»±";s:3:"è·¼";s:2:"»²";s:3:"è¼”";s:2:"»³";s:3:"è¼’";s:2:"»´";s:3:"輕";s:2:"»µ";s:3:"輓";s:2:"»¶";s:3:"è¾£";s:2:"»·";s:3:"é ";s:2:"»¸";s:3:"é˜";s:2:"»¹";s:3:"éœ";s:2:"»º";s:3:"é£";s:2:"»»";s:3:"é™";s:2:"»¼";s:3:"éž";s:2:"»½";s:3:"é¢";s:2:"»¾";s:3:"é";s:2:"»¿";s:3:"é›";s:2:"»À";s:3:"é„™";s:2:"»Á";s:3:"鄘";s:2:"»Â";s:3:"鄞";s:2:"»Ã";s:3:"é…µ";s:2:"»Ä";s:3:"é…¸";s:2:"»Å";s:3:"é…·";s:2:"»Æ";s:3:"é…´";s:2:"»Ç";s:3:"鉸";s:2:"»È";s:3:"銀";s:2:"»É";s:3:"銅";s:2:"»Ê";s:3:"銘";s:2:"»Ë";s:3:"銖";s:2:"»Ì";s:3:"鉻";s:2:"»Í";s:3:"銓";s:2:"»Î";s:3:"銜";s:2:"»Ï";s:3:"銨";s:2:"»Ð";s:3:"鉼";s:2:"»Ñ";s:3:"銑";s:2:"»Ò";s:3:"é–¡";s:2:"»Ó";s:3:"é–¨";s:2:"»Ô";s:3:"é–©";s:2:"»Õ";s:3:"é–£";s:2:"»Ö";s:3:"é–¥";s:2:"»×";s:3:"é–¤";s:2:"»Ø";s:3:"éš™";s:2:"»Ù";s:3:"éšœ";s:2:"»Ú";s:3:"éš›";s:2:"»Û";s:3:"雌";s:2:"»Ü";s:3:"é›’";s:2:"»Ý";s:3:"需";s:2:"»Þ";s:3:"é¼";s:2:"»ß";s:3:"éž…";s:2:"»à";s:3:"韶";s:2:"»á";s:3:"é —";s:2:"»â";s:3:"é ˜";s:2:"»ã";s:3:"颯";s:2:"»ä";s:3:"颱";s:2:"»å";s:3:"餃";s:2:"»æ";s:3:"餅";s:2:"»ç";s:3:"餌";s:2:"»è";s:3:"餉";s:2:"»é";s:3:"é§";s:2:"»ê";s:3:"骯";s:2:"»ë";s:3:"骰";s:2:"»ì";s:3:"髦";s:2:"»í";s:3:"é­";s:2:"»î";s:3:"é­‚";s:2:"»ï";s:3:"é³´";s:2:"»ð";s:3:"é³¶";s:2:"»ñ";s:3:"é³³";s:2:"»ò";s:3:"麼";s:2:"»ó";s:3:"é¼»";s:2:"»ô";s:3:"齊";s:2:"»õ";s:3:"å„„";s:2:"»ö";s:3:"å„€";s:2:"»÷";s:3:"僻";s:2:"»ø";s:3:"僵";s:2:"»ù";s:3:"價";s:2:"»ú";s:3:"å„‚";s:2:"»û";s:3:"儈";s:2:"»ü";s:3:"儉";s:2:"»ý";s:3:"å„…";s:2:"»þ";s:3:"凜";s:2:"¼@";s:3:"劇";s:2:"¼A";s:3:"劈";s:2:"¼B";s:3:"劉";s:2:"¼C";s:3:"åŠ";s:2:"¼D";s:3:"劊";s:2:"¼E";s:3:"å‹°";s:2:"¼F";s:3:"厲";s:2:"¼G";s:3:"嘮";s:2:"¼H";s:3:"嘻";s:2:"¼I";s:3:"嘹";s:2:"¼J";s:3:"嘲";s:2:"¼K";s:3:"嘿";s:2:"¼L";s:3:"嘴";s:2:"¼M";s:3:"嘩";s:2:"¼N";s:3:"噓";s:2:"¼O";s:3:"噎";s:2:"¼P";s:3:"å™—";s:2:"¼Q";s:3:"å™´";s:2:"¼R";s:3:"嘶";s:2:"¼S";s:3:"嘯";s:2:"¼T";s:3:"嘰";s:2:"¼U";s:3:"墀";s:2:"¼V";s:3:"墟";s:2:"¼W";s:3:"增";s:2:"¼X";s:3:"墳";s:2:"¼Y";s:3:"墜";s:2:"¼Z";s:3:"墮";s:2:"¼[";s:3:"墩";s:2:"¼\";s:3:"墦";s:2:"¼]";s:3:"奭";s:2:"¼^";s:3:"嬉";s:2:"¼_";s:3:"å«»";s:2:"¼`";s:3:"嬋";s:2:"¼a";s:3:"嫵";s:2:"¼b";s:3:"嬌";s:2:"¼c";s:3:"嬈";s:2:"¼d";s:3:"寮";s:2:"¼e";s:3:"寬";s:2:"¼f";s:3:"審";s:2:"¼g";s:3:"寫";s:2:"¼h";s:3:"層";s:2:"¼i";s:3:"å±¥";s:2:"¼j";s:3:"å¶";s:2:"¼k";s:3:"å¶”";s:2:"¼l";s:3:"å¹¢";s:2:"¼m";s:3:"幟";s:2:"¼n";s:3:"幡";s:2:"¼o";s:3:"廢";s:2:"¼p";s:3:"廚";s:2:"¼q";s:3:"廟";s:2:"¼r";s:3:"å»";s:2:"¼s";s:3:"廣";s:2:"¼t";s:3:"å» ";s:2:"¼u";s:3:"彈";s:2:"¼v";s:3:"å½±";s:2:"¼w";s:3:"å¾·";s:2:"¼x";s:3:"å¾µ";s:2:"¼y";s:3:"æ…¶";s:2:"¼z";s:3:"æ…§";s:2:"¼{";s:3:"æ…®";s:2:"¼|";s:3:"æ…";s:2:"¼}";s:3:"æ…•";s:2:"¼~";s:3:"憂";s:2:"¼¡";s:3:"æ…¼";s:2:"¼¢";s:3:"æ…°";s:2:"¼£";s:3:"æ…«";s:2:"¼¤";s:3:"æ…¾";s:2:"¼¥";s:3:"憧";s:2:"¼¦";s:3:"æ†";s:2:"¼§";s:3:"憫";s:2:"¼¨";s:3:"憎";s:2:"¼©";s:3:"憬";s:2:"¼ª";s:3:"憚";s:2:"¼«";s:3:"憤";s:2:"¼¬";s:3:"憔";s:2:"¼­";s:3:"憮";s:2:"¼®";s:3:"戮";s:2:"¼¯";s:3:"æ‘©";s:2:"¼°";s:3:"摯";s:2:"¼±";s:3:"摹";s:2:"¼²";s:3:"æ’ž";s:2:"¼³";s:3:"æ’²";s:2:"¼´";s:3:"æ’ˆ";s:2:"¼µ";s:3:"æ’";s:2:"¼¶";s:3:"æ’°";s:2:"¼·";s:3:"æ’¥";s:2:"¼¸";s:3:"æ’“";s:2:"¼¹";s:3:"æ’•";s:2:"¼º";s:3:"æ’©";s:2:"¼»";s:3:"æ’’";s:2:"¼¼";s:3:"æ’®";s:2:"¼½";s:3:"æ’­";s:2:"¼¾";s:3:"æ’«";s:2:"¼¿";s:3:"æ’š";s:2:"¼À";s:3:"æ’¬";s:2:"¼Á";s:3:"æ’™";s:2:"¼Â";s:3:"æ’¢";s:2:"¼Ã";s:3:"æ’³";s:2:"¼Ä";s:3:"敵";s:2:"¼Å";s:3:"æ•·";s:2:"¼Æ";s:3:"數";s:2:"¼Ç";s:3:"æš®";s:2:"¼È";s:3:"æš«";s:2:"¼É";s:3:"æš´";s:2:"¼Ê";s:3:"æš±";s:2:"¼Ë";s:3:"樣";s:2:"¼Ì";s:3:"樟";s:2:"¼Í";s:3:"槨";s:2:"¼Î";s:3:"æ¨";s:2:"¼Ï";s:3:"樞";s:2:"¼Ð";s:3:"標";s:2:"¼Ñ";s:3:"æ§½";s:2:"¼Ò";s:3:"模";s:2:"¼Ó";s:3:"樓";s:2:"¼Ô";s:3:"樊";s:2:"¼Õ";s:3:"æ§³";s:2:"¼Ö";s:3:"樂";s:2:"¼×";s:3:"樅";s:2:"¼Ø";s:3:"æ§­";s:2:"¼Ù";s:3:"樑";s:2:"¼Ú";s:3:"æ­";s:2:"¼Û";s:3:"æ­Ž";s:2:"¼Ü";s:3:"殤";s:2:"¼Ý";s:3:"毅";s:2:"¼Þ";s:3:"毆";s:2:"¼ß";s:3:"漿";s:2:"¼à";s:3:"æ½¼";s:2:"¼á";s:3:"澄";s:2:"¼â";s:3:"潑";s:2:"¼ã";s:3:"潦";s:2:"¼ä";s:3:"æ½”";s:2:"¼å";s:3:"澆";s:2:"¼æ";s:3:"æ½­";s:2:"¼ç";s:3:"æ½›";s:2:"¼è";s:3:"潸";s:2:"¼é";s:3:"æ½®";s:2:"¼ê";s:3:"澎";s:2:"¼ë";s:3:"潺";s:2:"¼ì";s:3:"æ½°";s:2:"¼í";s:3:"潤";s:2:"¼î";s:3:"æ¾—";s:2:"¼ï";s:3:"潘";s:2:"¼ð";s:3:"滕";s:2:"¼ñ";s:3:"潯";s:2:"¼ò";s:3:"æ½ ";s:2:"¼ó";s:3:"潟";s:2:"¼ô";s:3:"熟";s:2:"¼õ";s:3:"熬";s:2:"¼ö";s:3:"熱";s:2:"¼÷";s:3:"熨";s:2:"¼ø";s:3:"牖";s:2:"¼ù";s:3:"犛";s:2:"¼ú";s:3:"çŽ";s:2:"¼û";s:3:"ç—";s:2:"¼ü";s:3:"ç‘©";s:2:"¼ý";s:3:"ç’‹";s:2:"¼þ";s:3:"ç’ƒ";s:2:"½@";s:3:"瑾";s:2:"½A";s:3:"ç’€";s:2:"½B";s:3:"ç•¿";s:2:"½C";s:3:"瘠";s:2:"½D";s:3:"瘩";s:2:"½E";s:3:"瘟";s:2:"½F";s:3:"瘤";s:2:"½G";s:3:"瘦";s:2:"½H";s:3:"瘡";s:2:"½I";s:3:"瘢";s:2:"½J";s:3:"çšš";s:2:"½K";s:3:"皺";s:2:"½L";s:3:"盤";s:2:"½M";s:3:"瞎";s:2:"½N";s:3:"瞇";s:2:"½O";s:3:"瞌";s:2:"½P";s:3:"çž‘";s:2:"½Q";s:3:"çž‹";s:2:"½R";s:3:"磋";s:2:"½S";s:3:"磅";s:2:"½T";s:3:"確";s:2:"½U";s:3:"磊";s:2:"½V";s:3:"碾";s:2:"½W";s:3:"磕";s:2:"½X";s:3:"碼";s:2:"½Y";s:3:"ç£";s:2:"½Z";s:3:"稿";s:2:"½[";s:3:"稼";s:2:"½\";s:3:"ç©€";s:2:"½]";s:3:"稽";s:2:"½^";s:3:"稷";s:2:"½_";s:3:"稻";s:2:"½`";s:3:"窯";s:2:"½a";s:3:"窮";s:2:"½b";s:3:"ç®­";s:2:"½c";s:3:"ç®±";s:2:"½d";s:3:"範";s:2:"½e";s:3:"ç®´";s:2:"½f";s:3:"篆";s:2:"½g";s:3:"篇";s:2:"½h";s:3:"ç¯";s:2:"½i";s:3:"ç® ";s:2:"½j";s:3:"篌";s:2:"½k";s:3:"糊";s:2:"½l";s:3:"ç· ";s:2:"½m";s:3:"ç·´";s:2:"½n";s:3:"ç·¯";s:2:"½o";s:3:"ç·»";s:2:"½p";s:3:"ç·˜";s:2:"½q";s:3:"ç·¬";s:2:"½r";s:3:"ç·";s:2:"½s";s:3:"ç·¨";s:2:"½t";s:3:"ç·£";s:2:"½u";s:3:"ç·š";s:2:"½v";s:3:"ç·ž";s:2:"½w";s:3:"ç·©";s:2:"½x";s:3:"ç¶ž";s:2:"½y";s:3:"ç·™";s:2:"½z";s:3:"ç·²";s:2:"½{";s:3:"ç·¹";s:2:"½|";s:3:"ç½µ";s:2:"½}";s:3:"ç½·";s:2:"½~";s:3:"羯";s:2:"½¡";s:3:"ç¿©";s:2:"½¢";s:3:"耦";s:2:"½£";s:3:"膛";s:2:"½¤";s:3:"膜";s:2:"½¥";s:3:"è†";s:2:"½¦";s:3:"膠";s:2:"½§";s:3:"膚";s:2:"½¨";s:3:"膘";s:2:"½©";s:3:"è”—";s:2:"½ª";s:3:"蔽";s:2:"½«";s:3:"蔚";s:2:"½¬";s:3:"è“®";s:2:"½­";s:3:"蔬";s:2:"½®";s:3:"è”­";s:2:"½¯";s:3:"蔓";s:2:"½°";s:3:"蔑";s:2:"½±";s:3:"蔣";s:2:"½²";s:3:"蔡";s:2:"½³";s:3:"è””";s:2:"½´";s:3:"蓬";s:2:"½µ";s:3:"蔥";s:2:"½¶";s:3:"è“¿";s:2:"½·";s:3:"蔆";s:2:"½¸";s:3:"èž‚";s:2:"½¹";s:3:"è´";s:2:"½º";s:3:"è¶";s:2:"½»";s:3:"è ";s:2:"½¼";s:3:"è¦";s:2:"½½";s:3:"è¸";s:2:"½¾";s:3:"è¨";s:2:"½¿";s:3:"è™";s:2:"½À";s:3:"è—";s:2:"½Á";s:3:"èŒ";s:2:"½Â";s:3:"è“";s:2:"½Ã";s:3:"è¡›";s:2:"½Ä";s:3:"è¡";s:2:"½Å";s:3:"è¤";s:2:"½Æ";s:3:"複";s:2:"½Ç";s:3:"褒";s:2:"½È";s:3:"褓";s:2:"½É";s:3:"褕";s:2:"½Ê";s:3:"褊";s:2:"½Ë";s:3:"誼";s:2:"½Ì";s:3:"è«’";s:2:"½Í";s:3:"談";s:2:"½Î";s:3:"è«„";s:2:"½Ï";s:3:"誕";s:2:"½Ð";s:3:"è«‹";s:2:"½Ñ";s:3:"諸";s:2:"½Ò";s:3:"課";s:2:"½Ó";s:3:"諉";s:2:"½Ô";s:3:"è«‚";s:2:"½Õ";s:3:"調";s:2:"½Ö";s:3:"誰";s:2:"½×";s:3:"è«–";s:2:"½Ø";s:3:"è«";s:2:"½Ù";s:3:"誶";s:2:"½Ú";s:3:"誹";s:2:"½Û";s:3:"è«›";s:2:"½Ü";s:3:"豌";s:2:"½Ý";s:3:"豎";s:2:"½Þ";s:3:"豬";s:2:"½ß";s:3:"è³ ";s:2:"½à";s:3:"賞";s:2:"½á";s:3:"賦";s:2:"½â";s:3:"賤";s:2:"½ã";s:3:"賬";s:2:"½ä";s:3:"è³­";s:2:"½å";s:3:"è³¢";s:2:"½æ";s:3:"è³£";s:2:"½ç";s:3:"賜";s:2:"½è";s:3:"質";s:2:"½é";s:3:"賡";s:2:"½ê";s:3:"èµ­";s:2:"½ë";s:3:"è¶Ÿ";s:2:"½ì";s:3:"è¶£";s:2:"½í";s:3:"踫";s:2:"½î";s:3:"è¸";s:2:"½ï";s:3:"è¸";s:2:"½ð";s:3:"踢";s:2:"½ñ";s:3:"è¸";s:2:"½ò";s:3:"踩";s:2:"½ó";s:3:"踟";s:2:"½ô";s:3:"踡";s:2:"½õ";s:3:"踞";s:2:"½ö";s:3:"躺";s:2:"½÷";s:3:"è¼";s:2:"½ø";s:3:"è¼›";s:2:"½ù";s:3:"輟";s:2:"½ú";s:3:"輩";s:2:"½û";s:3:"輦";s:2:"½ü";s:3:"輪";s:2:"½ý";s:3:"輜";s:2:"½þ";s:3:"輞";s:2:"¾@";s:3:"è¼¥";s:2:"¾A";s:3:"é©";s:2:"¾B";s:3:"é®";s:2:"¾C";s:3:"é¨";s:2:"¾D";s:3:"é­";s:2:"¾E";s:3:"é·";s:2:"¾F";s:3:"é„°";s:2:"¾G";s:3:"é„­";s:2:"¾H";s:3:"é„§";s:2:"¾I";s:3:"鄱";s:2:"¾J";s:3:"醇";s:2:"¾K";s:3:"醉";s:2:"¾L";s:3:"醋";s:2:"¾M";s:3:"醃";s:2:"¾N";s:3:"é‹…";s:2:"¾O";s:3:"銻";s:2:"¾P";s:3:"銷";s:2:"¾Q";s:3:"鋪";s:2:"¾R";s:3:"銬";s:2:"¾S";s:3:"鋤";s:2:"¾T";s:3:"é‹";s:2:"¾U";s:3:"銳";s:2:"¾V";s:3:"銼";s:2:"¾W";s:3:"é‹’";s:2:"¾X";s:3:"鋇";s:2:"¾Y";s:3:"é‹°";s:2:"¾Z";s:3:"銲";s:2:"¾[";s:3:"é–­";s:2:"¾\";s:3:"é–±";s:2:"¾]";s:3:"霄";s:2:"¾^";s:3:"霆";s:2:"¾_";s:3:"震";s:2:"¾`";s:3:"霉";s:2:"¾a";s:3:"é ";s:2:"¾b";s:3:"éž";s:2:"¾c";s:3:"éž‹";s:2:"¾d";s:3:"éž";s:2:"¾e";s:3:"é ¡";s:2:"¾f";s:3:"é «";s:2:"¾g";s:3:"é œ";s:2:"¾h";s:3:"颳";s:2:"¾i";s:3:"養";s:2:"¾j";s:3:"餓";s:2:"¾k";s:3:"餒";s:2:"¾l";s:3:"餘";s:2:"¾m";s:3:"é§";s:2:"¾n";s:3:"é§";s:2:"¾o";s:3:"é§Ÿ";s:2:"¾p";s:3:"é§›";s:2:"¾q";s:3:"é§‘";s:2:"¾r";s:3:"é§•";s:2:"¾s";s:3:"é§’";s:2:"¾t";s:3:"é§™";s:2:"¾u";s:3:"骷";s:2:"¾v";s:3:"é«®";s:2:"¾w";s:3:"髯";s:2:"¾x";s:3:"鬧";s:2:"¾y";s:3:"é­…";s:2:"¾z";s:3:"é­„";s:2:"¾{";s:3:"é­·";s:2:"¾|";s:3:"é­¯";s:2:"¾}";s:3:"é´†";s:2:"¾~";s:3:"é´‰";s:2:"¾¡";s:3:"é´ƒ";s:2:"¾¢";s:3:"麩";s:2:"¾£";s:3:"麾";s:2:"¾¤";s:3:"黎";s:2:"¾¥";s:3:"墨";s:2:"¾¦";s:3:"é½’";s:2:"¾§";s:3:"å„’";s:2:"¾¨";s:3:"儘";s:2:"¾©";s:3:"å„”";s:2:"¾ª";s:3:"å„";s:2:"¾«";s:3:"å„•";s:2:"¾¬";s:3:"冀";s:2:"¾­";s:3:"冪";s:2:"¾®";s:3:"å‡";s:2:"¾¯";s:3:"劑";s:2:"¾°";s:3:"劓";s:2:"¾±";s:3:"勳";s:2:"¾²";s:3:"å™™";s:2:"¾³";s:3:"噫";s:2:"¾´";s:3:"噹";s:2:"¾µ";s:3:"噩";s:2:"¾¶";s:3:"噤";s:2:"¾·";s:3:"噸";s:2:"¾¸";s:3:"噪";s:2:"¾¹";s:3:"器";s:2:"¾º";s:3:"噥";s:2:"¾»";s:3:"å™±";s:2:"¾¼";s:3:"噯";s:2:"¾½";s:3:"噬";s:2:"¾¾";s:3:"噢";s:2:"¾¿";s:3:"å™¶";s:2:"¾À";s:3:"å£";s:2:"¾Á";s:3:"墾";s:2:"¾Â";s:3:"壇";s:2:"¾Ã";s:3:"壅";s:2:"¾Ä";s:3:"奮";s:2:"¾Å";s:3:"å¬";s:2:"¾Æ";s:3:"嬴";s:2:"¾Ç";s:3:"å­¸";s:2:"¾È";s:3:"寰";s:2:"¾É";s:3:"å°Ž";s:2:"¾Ê";s:3:"彊";s:2:"¾Ë";s:3:"憲";s:2:"¾Ì";s:3:"憑";s:2:"¾Í";s:3:"憩";s:2:"¾Î";s:3:"憊";s:2:"¾Ï";s:3:"æ‡";s:2:"¾Ð";s:3:"憶";s:2:"¾Ñ";s:3:"憾";s:2:"¾Ò";s:3:"懊";s:2:"¾Ó";s:3:"懈";s:2:"¾Ô";s:3:"戰";s:2:"¾Õ";s:3:"æ“…";s:2:"¾Ö";s:3:"æ“";s:2:"¾×";s:3:"æ“‹";s:2:"¾Ø";s:3:"æ’»";s:2:"¾Ù";s:3:"æ’¼";s:2:"¾Ú";s:3:"據";s:2:"¾Û";s:3:"æ“„";s:2:"¾Ü";s:3:"擇";s:2:"¾Ý";s:3:"æ“‚";s:2:"¾Þ";s:3:"æ“";s:2:"¾ß";s:3:"æ’¿";s:2:"¾à";s:3:"æ“’";s:2:"¾á";s:3:"æ“”";s:2:"¾â";s:3:"æ’¾";s:2:"¾ã";s:3:"æ•´";s:2:"¾ä";s:3:"曆";s:2:"¾å";s:3:"曉";s:2:"¾æ";s:3:"æš¹";s:2:"¾ç";s:3:"曄";s:2:"¾è";s:3:"曇";s:2:"¾é";s:3:"暸";s:2:"¾ê";s:3:"樽";s:2:"¾ë";s:3:"樸";s:2:"¾ì";s:3:"樺";s:2:"¾í";s:3:"æ©™";s:2:"¾î";s:3:"æ©«";s:2:"¾ï";s:3:"橘";s:2:"¾ð";s:3:"樹";s:2:"¾ñ";s:3:"æ©„";s:2:"¾ò";s:3:"æ©¢";s:2:"¾ó";s:3:"æ©¡";s:2:"¾ô";s:3:"æ©‹";s:2:"¾õ";s:3:"橇";s:2:"¾ö";s:3:"樵";s:2:"¾÷";s:3:"機";s:2:"¾ø";s:3:"橈";s:2:"¾ù";s:3:"æ­™";s:2:"¾ú";s:3:"æ­·";s:2:"¾û";s:3:"æ°…";s:2:"¾ü";s:3:"æ¿‚";s:2:"¾ý";s:3:"æ¾±";s:2:"¾þ";s:3:"澡";s:2:"¿@";s:3:"濃";s:2:"¿A";s:3:"澤";s:2:"¿B";s:3:"æ¿";s:2:"¿C";s:3:"æ¾§";s:2:"¿D";s:3:"æ¾³";s:2:"¿E";s:3:"æ¿€";s:2:"¿F";s:3:"æ¾¹";s:2:"¿G";s:3:"æ¾¶";s:2:"¿H";s:3:"澦";s:2:"¿I";s:3:"æ¾ ";s:2:"¿J";s:3:"æ¾´";s:2:"¿K";s:3:"熾";s:2:"¿L";s:3:"燉";s:2:"¿M";s:3:"ç‡";s:2:"¿N";s:3:"燒";s:2:"¿O";s:3:"燈";s:2:"¿P";s:3:"燕";s:2:"¿Q";s:3:"熹";s:2:"¿R";s:3:"燎";s:2:"¿S";s:3:"燙";s:2:"¿T";s:3:"燜";s:2:"¿U";s:3:"燃";s:2:"¿V";s:3:"燄";s:2:"¿W";s:3:"ç¨";s:2:"¿X";s:3:"ç’œ";s:2:"¿Y";s:3:"ç’£";s:2:"¿Z";s:3:"ç’˜";s:2:"¿[";s:3:"ç’Ÿ";s:2:"¿\";s:3:"ç’ž";s:2:"¿]";s:3:"ç“¢";s:2:"¿^";s:3:"甌";s:2:"¿_";s:3:"ç”";s:2:"¿`";s:3:"瘴";s:2:"¿a";s:3:"瘸";s:2:"¿b";s:3:"瘺";s:2:"¿c";s:3:"ç›§";s:2:"¿d";s:3:"盥";s:2:"¿e";s:3:"çž ";s:2:"¿f";s:3:"çžž";s:2:"¿g";s:3:"瞟";s:2:"¿h";s:3:"瞥";s:2:"¿i";s:3:"磨";s:2:"¿j";s:3:"磚";s:2:"¿k";s:3:"磬";s:2:"¿l";s:3:"磧";s:2:"¿m";s:3:"禦";s:2:"¿n";s:3:"ç©";s:2:"¿o";s:3:"穎";s:2:"¿p";s:3:"穆";s:2:"¿q";s:3:"穌";s:2:"¿r";s:3:"ç©‹";s:2:"¿s";s:3:"窺";s:2:"¿t";s:3:"篙";s:2:"¿u";s:3:"ç°‘";s:2:"¿v";s:3:"築";s:2:"¿w";s:3:"篤";s:2:"¿x";s:3:"篛";s:2:"¿y";s:3:"篡";s:2:"¿z";s:3:"篩";s:2:"¿{";s:3:"篦";s:2:"¿|";s:3:"糕";s:2:"¿}";s:3:"ç³–";s:2:"¿~";s:3:"縊";s:2:"¿¡";s:3:"縑";s:2:"¿¢";s:3:"縈";s:2:"¿£";s:3:"縛";s:2:"¿¤";s:3:"縣";s:2:"¿¥";s:3:"縞";s:2:"¿¦";s:3:"ç¸";s:2:"¿§";s:3:"縉";s:2:"¿¨";s:3:"ç¸";s:2:"¿©";s:3:"ç½¹";s:2:"¿ª";s:3:"ç¾²";s:2:"¿«";s:3:"ç¿°";s:2:"¿¬";s:3:"翱";s:2:"¿­";s:3:"ç¿®";s:2:"¿®";s:3:"耨";s:2:"¿¯";s:3:"膳";s:2:"¿°";s:3:"膩";s:2:"¿±";s:3:"膨";s:2:"¿²";s:3:"臻";s:2:"¿³";s:3:"興";s:2:"¿´";s:3:"艘";s:2:"¿µ";s:3:"艙";s:2:"¿¶";s:3:"蕊";s:2:"¿·";s:3:"è•™";s:2:"¿¸";s:3:"蕈";s:2:"¿¹";s:3:"蕨";s:2:"¿º";s:3:"è•©";s:2:"¿»";s:3:"蕃";s:2:"¿¼";s:3:"蕉";s:2:"¿½";s:3:"è•­";s:2:"¿¾";s:3:"蕪";s:2:"¿¿";s:3:"蕞";s:2:"¿À";s:3:"螃";s:2:"¿Á";s:3:"螟";s:2:"¿Â";s:3:"èžž";s:2:"¿Ã";s:3:"螢";s:2:"¿Ä";s:3:"èž";s:2:"¿Å";s:3:"è¡¡";s:2:"¿Æ";s:3:"褪";s:2:"¿Ç";s:3:"褲";s:2:"¿È";s:3:"褥";s:2:"¿É";s:3:"褫";s:2:"¿Ê";s:3:"褡";s:2:"¿Ë";s:3:"親";s:2:"¿Ì";s:3:"覦";s:2:"¿Í";s:3:"諦";s:2:"¿Î";s:3:"諺";s:2:"¿Ï";s:3:"è««";s:2:"¿Ð";s:3:"諱";s:2:"¿Ñ";s:3:"謀";s:2:"¿Ò";s:3:"諜";s:2:"¿Ó";s:3:"è«§";s:2:"¿Ô";s:3:"è«®";s:2:"¿Õ";s:3:"諾";s:2:"¿Ö";s:3:"è¬";s:2:"¿×";s:3:"謂";s:2:"¿Ø";s:3:"è«·";s:2:"¿Ù";s:3:"è«­";s:2:"¿Ú";s:3:"諳";s:2:"¿Û";s:3:"è«¶";s:2:"¿Ü";s:3:"諼";s:2:"¿Ý";s:3:"豫";s:2:"¿Þ";s:3:"è±­";s:2:"¿ß";s:3:"貓";s:2:"¿à";s:3:"è³´";s:2:"¿á";s:3:"蹄";s:2:"¿â";s:3:"踱";s:2:"¿ã";s:3:"踴";s:2:"¿ä";s:3:"蹂";s:2:"¿å";s:3:"踹";s:2:"¿æ";s:3:"踵";s:2:"¿ç";s:3:"è¼»";s:2:"¿è";s:3:"輯";s:2:"¿é";s:3:"輸";s:2:"¿ê";s:3:"è¼³";s:2:"¿ë";s:3:"辨";s:2:"¿ì";s:3:"辦";s:2:"¿í";s:3:"éµ";s:2:"¿î";s:3:"é´";s:2:"¿ï";s:3:"é¸";s:2:"¿ð";s:3:"é²";s:2:"¿ñ";s:3:"é¼";s:2:"¿ò";s:3:"éº";s:2:"¿ó";s:3:"é„´";s:2:"¿ô";s:3:"醒";s:2:"¿õ";s:3:"錠";s:2:"¿ö";s:3:"錶";s:2:"¿÷";s:3:"鋸";s:2:"¿ø";s:3:"錳";s:2:"¿ù";s:3:"錯";s:2:"¿ú";s:3:"錢";s:2:"¿û";s:3:"鋼";s:2:"¿ü";s:3:"錫";s:2:"¿ý";s:3:"錄";s:2:"¿þ";s:3:"錚";s:2:"À@";s:3:"éŒ";s:2:"ÀA";s:3:"錦";s:2:"ÀB";s:3:"錡";s:2:"ÀC";s:3:"錕";s:2:"ÀD";s:3:"錮";s:2:"ÀE";s:3:"錙";s:2:"ÀF";s:3:"é–»";s:2:"ÀG";s:3:"éš§";s:2:"ÀH";s:3:"隨";s:2:"ÀI";s:3:"險";s:2:"ÀJ";s:3:"雕";s:2:"ÀK";s:3:"霎";s:2:"ÀL";s:3:"霑";s:2:"ÀM";s:3:"霖";s:2:"ÀN";s:3:"éœ";s:2:"ÀO";s:3:"霓";s:2:"ÀP";s:3:"éœ";s:2:"ÀQ";s:3:"é›";s:2:"ÀR";s:3:"éœ";s:2:"ÀS";s:3:"é¦";s:2:"ÀT";s:3:"鞘";s:2:"ÀU";s:3:"é °";s:2:"ÀV";s:3:"é ¸";s:2:"ÀW";s:3:"é »";s:2:"ÀX";s:3:"é ·";s:2:"ÀY";s:3:"é ­";s:2:"ÀZ";s:3:"é ¹";s:2:"À[";s:3:"é ¤";s:2:"À\";s:3:"é¤";s:2:"À]";s:3:"館";s:2:"À^";s:3:"餞";s:2:"À_";s:3:"餛";s:2:"À`";s:3:"餡";s:2:"Àa";s:3:"餚";s:2:"Àb";s:3:"é§­";s:2:"Àc";s:3:"é§¢";s:2:"Àd";s:3:"é§±";s:2:"Àe";s:3:"骸";s:2:"Àf";s:3:"骼";s:2:"Àg";s:3:"é«»";s:2:"Àh";s:3:"é«­";s:2:"Ài";s:3:"鬨";s:2:"Àj";s:3:"鮑";s:2:"Àk";s:3:"é´•";s:2:"Àl";s:3:"é´£";s:2:"Àm";s:3:"é´¦";s:2:"Àn";s:3:"é´¨";s:2:"Ào";s:3:"é´’";s:2:"Àp";s:3:"é´›";s:2:"Àq";s:3:"默";s:2:"Àr";s:3:"é»”";s:2:"Às";s:3:"é¾";s:2:"Àt";s:3:"龜";s:2:"Àu";s:3:"優";s:2:"Àv";s:3:"償";s:2:"Àw";s:3:"å„¡";s:2:"Àx";s:3:"儲";s:2:"Ày";s:3:"勵";s:2:"Àz";s:3:"嚎";s:2:"À{";s:3:"嚀";s:2:"À|";s:3:"åš";s:2:"À}";s:3:"åš…";s:2:"À~";s:3:"嚇";s:2:"À¡";s:3:"åš";s:2:"À¢";s:3:"壕";s:2:"À£";s:3:"壓";s:2:"À¤";s:3:"壑";s:2:"À¥";s:3:"壎";s:2:"À¦";s:3:"嬰";s:2:"À§";s:3:"嬪";s:2:"À¨";s:3:"嬤";s:2:"À©";s:3:"å­º";s:2:"Àª";s:3:"å°·";s:2:"À«";s:3:"屨";s:2:"À¬";s:3:"å¶¼";s:2:"À­";s:3:"嶺";s:2:"À®";s:3:"å¶½";s:2:"À¯";s:3:"嶸";s:2:"À°";s:3:"幫";s:2:"À±";s:3:"彌";s:2:"À²";s:3:"å¾½";s:2:"À³";s:3:"應";s:2:"À´";s:3:"懂";s:2:"Àµ";s:3:"懇";s:2:"À¶";s:3:"懦";s:2:"À·";s:3:"懋";s:2:"À¸";s:3:"戲";s:2:"À¹";s:3:"戴";s:2:"Àº";s:3:"擎";s:2:"À»";s:3:"擊";s:2:"À¼";s:3:"擘";s:2:"À½";s:3:"æ“ ";s:2:"À¾";s:3:"æ“°";s:2:"À¿";s:3:"擦";s:2:"ÀÀ";s:3:"擬";s:2:"ÀÁ";s:3:"擱";s:2:"ÀÂ";s:3:"æ“¢";s:2:"ÀÃ";s:3:"æ“­";s:2:"ÀÄ";s:3:"æ–‚";s:2:"ÀÅ";s:3:"æ–ƒ";s:2:"ÀÆ";s:3:"æ›™";s:2:"ÀÇ";s:3:"æ›–";s:2:"ÀÈ";s:3:"檀";s:2:"ÀÉ";s:3:"檔";s:2:"ÀÊ";s:3:"檄";s:2:"ÀË";s:3:"檢";s:2:"ÀÌ";s:3:"檜";s:2:"ÀÍ";s:3:"æ«›";s:2:"ÀÎ";s:3:"檣";s:2:"ÀÏ";s:3:"橾";s:2:"ÀÐ";s:3:"檗";s:2:"ÀÑ";s:3:"æª";s:2:"ÀÒ";s:3:"檠";s:2:"ÀÓ";s:3:"æ­œ";s:2:"ÀÔ";s:3:"æ®®";s:2:"ÀÕ";s:3:"毚";s:2:"ÀÖ";s:3:"æ°ˆ";s:2:"À×";s:3:"濘";s:2:"ÀØ";s:3:"濱";s:2:"ÀÙ";s:3:"濟";s:2:"ÀÚ";s:3:"æ¿ ";s:2:"ÀÛ";s:3:"æ¿›";s:2:"ÀÜ";s:3:"濤";s:2:"ÀÝ";s:3:"æ¿«";s:2:"ÀÞ";s:3:"濯";s:2:"Àß";s:3:"æ¾€";s:2:"Àà";s:3:"濬";s:2:"Àá";s:3:"æ¿¡";s:2:"Àâ";s:3:"æ¿©";s:2:"Àã";s:3:"æ¿•";s:2:"Àä";s:3:"æ¿®";s:2:"Àå";s:3:"æ¿°";s:2:"Àæ";s:3:"燧";s:2:"Àç";s:3:"營";s:2:"Àè";s:3:"燮";s:2:"Àé";s:3:"燦";s:2:"Àê";s:3:"燥";s:2:"Àë";s:3:"燭";s:2:"Àì";s:3:"燬";s:2:"Àí";s:3:"燴";s:2:"Àî";s:3:"燠";s:2:"Àï";s:3:"爵";s:2:"Àð";s:3:"牆";s:2:"Àñ";s:3:"ç°";s:2:"Àò";s:3:"ç²";s:2:"Àó";s:3:"ç’©";s:2:"Àô";s:3:"ç’°";s:2:"Àõ";s:3:"ç’¦";s:2:"Àö";s:3:"ç’¨";s:2:"À÷";s:3:"癆";s:2:"Àø";s:3:"療";s:2:"Àù";s:3:"癌";s:2:"Àú";s:3:"盪";s:2:"Àû";s:3:"çž³";s:2:"Àü";s:3:"瞪";s:2:"Àý";s:3:"çž°";s:2:"Àþ";s:3:"瞬";s:2:"Á@";s:3:"çž§";s:2:"ÁA";s:3:"çž­";s:2:"ÁB";s:3:"矯";s:2:"ÁC";s:3:"磷";s:2:"ÁD";s:3:"磺";s:2:"ÁE";s:3:"磴";s:2:"ÁF";s:3:"磯";s:2:"ÁG";s:3:"ç¤";s:2:"ÁH";s:3:"禧";s:2:"ÁI";s:3:"禪";s:2:"ÁJ";s:3:"ç©—";s:2:"ÁK";s:3:"窿";s:2:"ÁL";s:3:"ç°‡";s:2:"ÁM";s:3:"ç°";s:2:"ÁN";s:3:"篾";s:2:"ÁO";s:3:"篷";s:2:"ÁP";s:3:"ç°Œ";s:2:"ÁQ";s:3:"篠";s:2:"ÁR";s:3:"ç³ ";s:2:"ÁS";s:3:"糜";s:2:"ÁT";s:3:"糞";s:2:"ÁU";s:3:"ç³¢";s:2:"ÁV";s:3:"糟";s:2:"ÁW";s:3:"ç³™";s:2:"ÁX";s:3:"ç³";s:2:"ÁY";s:3:"縮";s:2:"ÁZ";s:3:"績";s:2:"Á[";s:3:"繆";s:2:"Á\";s:3:"縷";s:2:"Á]";s:3:"縲";s:2:"Á^";s:3:"繃";s:2:"Á_";s:3:"縫";s:2:"Á`";s:3:"總";s:2:"Áa";s:3:"縱";s:2:"Áb";s:3:"ç¹…";s:2:"Ác";s:3:"ç¹";s:2:"Ád";s:3:"縴";s:2:"Áe";s:3:"縹";s:2:"Áf";s:3:"繈";s:2:"Ág";s:3:"縵";s:2:"Áh";s:3:"縿";s:2:"Ái";s:3:"縯";s:2:"Áj";s:3:"罄";s:2:"Ák";s:3:"翳";s:2:"Ál";s:3:"翼";s:2:"Ám";s:3:"è±";s:2:"Án";s:3:"è²";s:2:"Áo";s:3:"è°";s:2:"Áp";s:3:"è¯";s:2:"Áq";s:3:"è³";s:2:"Ár";s:3:"臆";s:2:"Ás";s:3:"臃";s:2:"Át";s:3:"膺";s:2:"Áu";s:3:"臂";s:2:"Áv";s:3:"臀";s:2:"Áw";s:3:"膿";s:2:"Áx";s:3:"膽";s:2:"Áy";s:3:"臉";s:2:"Áz";s:3:"膾";s:2:"Á{";s:3:"臨";s:2:"Á|";s:3:"舉";s:2:"Á}";s:3:"艱";s:2:"Á~";s:3:"è–ª";s:2:"Á¡";s:3:"è–„";s:2:"Á¢";s:3:"蕾";s:2:"Á£";s:3:"è–œ";s:2:"Á¤";s:3:"è–‘";s:2:"Á¥";s:3:"è–”";s:2:"Á¦";s:3:"è–¯";s:2:"Á§";s:3:"è–›";s:2:"Á¨";s:3:"è–‡";s:2:"Á©";s:3:"è–¨";s:2:"Áª";s:3:"è–Š";s:2:"Á«";s:3:"è™§";s:2:"Á¬";s:3:"蟀";s:2:"Á­";s:3:"蟑";s:2:"Á®";s:3:"èž³";s:2:"Á¯";s:3:"蟒";s:2:"Á°";s:3:"蟆";s:2:"Á±";s:3:"èž«";s:2:"Á²";s:3:"èž»";s:2:"Á³";s:3:"螺";s:2:"Á´";s:3:"蟈";s:2:"Áµ";s:3:"蟋";s:2:"Á¶";s:3:"褻";s:2:"Á·";s:3:"褶";s:2:"Á¸";s:3:"襄";s:2:"Á¹";s:3:"褸";s:2:"Áº";s:3:"褽";s:2:"Á»";s:3:"覬";s:2:"Á¼";s:3:"謎";s:2:"Á½";s:3:"謗";s:2:"Á¾";s:3:"謙";s:2:"Á¿";s:3:"講";s:2:"ÁÀ";s:3:"謊";s:2:"ÁÁ";s:3:"謠";s:2:"ÁÂ";s:3:"è¬";s:2:"ÁÃ";s:3:"謄";s:2:"ÁÄ";s:3:"è¬";s:2:"ÁÅ";s:3:"è±";s:2:"ÁÆ";s:3:"è°¿";s:2:"ÁÇ";s:3:"è±³";s:2:"ÁÈ";s:3:"賺";s:2:"ÁÉ";s:3:"è³½";s:2:"ÁÊ";s:3:"è³¼";s:2:"ÁË";s:3:"賸";s:2:"ÁÌ";s:3:"è³»";s:2:"ÁÍ";s:3:"趨";s:2:"ÁÎ";s:3:"蹉";s:2:"ÁÏ";s:3:"蹋";s:2:"ÁÐ";s:3:"蹈";s:2:"ÁÑ";s:3:"蹊";s:2:"ÁÒ";s:3:"轄";s:2:"ÁÓ";s:3:"è¼¾";s:2:"ÁÔ";s:3:"轂";s:2:"ÁÕ";s:3:"è½…";s:2:"ÁÖ";s:3:"輿";s:2:"Á×";s:3:"é¿";s:2:"ÁØ";s:3:"é½";s:2:"ÁÙ";s:3:"é‚„";s:2:"ÁÚ";s:3:"é‚";s:2:"ÁÛ";s:3:"é‚‚";s:2:"ÁÜ";s:3:"é‚€";s:2:"ÁÝ";s:3:"鄹";s:2:"ÁÞ";s:3:"醣";s:2:"Áß";s:3:"醞";s:2:"Áà";s:3:"醜";s:2:"Áá";s:3:"é";s:2:"Áâ";s:3:"鎂";s:2:"Áã";s:3:"錨";s:2:"Áä";s:3:"éµ";s:2:"Áå";s:3:"éŠ";s:2:"Áæ";s:3:"é¥";s:2:"Áç";s:3:"é‹";s:2:"Áè";s:3:"錘";s:2:"Áé";s:3:"é¾";s:2:"Áê";s:3:"é¬";s:2:"Áë";s:3:"é›";s:2:"Áì";s:3:"é°";s:2:"Áí";s:3:"éš";s:2:"Áî";s:3:"é”";s:2:"Áï";s:3:"é—Š";s:2:"Áð";s:3:"é—‹";s:2:"Áñ";s:3:"é—Œ";s:2:"Áò";s:3:"é—ˆ";s:2:"Áó";s:3:"é—†";s:2:"Áô";s:3:"éš±";s:2:"Áõ";s:3:"隸";s:2:"Áö";s:3:"é›–";s:2:"Á÷";s:3:"霜";s:2:"Áø";s:3:"霞";s:2:"Áù";s:3:"éž ";s:2:"Áú";s:3:"韓";s:2:"Áû";s:3:"顆";s:2:"Áü";s:3:"颶";s:2:"Áý";s:3:"餵";s:2:"Áþ";s:3:"é¨";s:2:"Â@";s:3:"é§¿";s:2:"ÂA";s:3:"é®®";s:2:"ÂB";s:3:"鮫";s:2:"ÂC";s:3:"鮪";s:2:"ÂD";s:3:"é®­";s:2:"ÂE";s:3:"é´»";s:2:"ÂF";s:3:"é´¿";s:2:"ÂG";s:3:"麋";s:2:"ÂH";s:3:"é»";s:2:"ÂI";s:3:"點";s:2:"ÂJ";s:3:"黜";s:2:"ÂK";s:3:"é»";s:2:"ÂL";s:3:"é»›";s:2:"ÂM";s:3:"é¼¾";s:2:"ÂN";s:3:"齋";s:2:"ÂO";s:3:"å¢";s:2:"ÂP";s:3:"åš•";s:2:"ÂQ";s:3:"åš®";s:2:"ÂR";s:3:"壙";s:2:"ÂS";s:3:"壘";s:2:"ÂT";s:3:"嬸";s:2:"ÂU";s:3:"å½";s:2:"ÂV";s:3:"懣";s:2:"ÂW";s:3:"戳";s:2:"ÂX";s:3:"æ“´";s:2:"ÂY";s:3:"擲";s:2:"ÂZ";s:3:"擾";s:2:"Â[";s:3:"攆";s:2:"Â\";s:3:"擺";s:2:"Â]";s:3:"æ“»";s:2:"Â^";s:3:"æ“·";s:2:"Â_";s:3:"æ–·";s:2:"Â`";s:3:"曜";s:2:"Âa";s:3:"朦";s:2:"Âb";s:3:"檳";s:2:"Âc";s:3:"檬";s:2:"Âd";s:3:"櫃";s:2:"Âe";s:3:"檻";s:2:"Âf";s:3:"檸";s:2:"Âg";s:3:"æ«‚";s:2:"Âh";s:3:"檮";s:2:"Âi";s:3:"檯";s:2:"Âj";s:3:"æ­Ÿ";s:2:"Âk";s:3:"æ­¸";s:2:"Âl";s:3:"殯";s:2:"Âm";s:3:"瀉";s:2:"Ân";s:3:"瀋";s:2:"Âo";s:3:"濾";s:2:"Âp";s:3:"瀆";s:2:"Âq";s:3:"濺";s:2:"Âr";s:3:"瀑";s:2:"Âs";s:3:"ç€";s:2:"Ât";s:3:"燻";s:2:"Âu";s:3:"燼";s:2:"Âv";s:3:"燾";s:2:"Âw";s:3:"燸";s:2:"Âx";s:3:"ç·";s:2:"Ây";s:3:"çµ";s:2:"Âz";s:3:"ç’§";s:2:"Â{";s:3:"ç’¿";s:2:"Â|";s:3:"甕";s:2:"Â}";s:3:"ç™–";s:2:"Â~";s:3:"癘";s:2:"¡";s:3:"ç™’";s:2:"¢";s:3:"çž½";s:2:"£";s:3:"çž¿";s:2:"¤";s:3:"çž»";s:2:"Â¥";s:3:"çž¼";s:2:"¦";s:3:"礎";s:2:"§";s:3:"禮";s:2:"¨";s:3:"ç©¡";s:2:"©";s:3:"ç©¢";s:2:"ª";s:3:"ç© ";s:2:"«";s:3:"ç«„";s:2:"¬";s:3:"ç«…";s:2:"­";s:3:"ç°«";s:2:"®";s:3:"ç°§";s:2:"¯";s:3:"ç°ª";s:2:"°";s:3:"ç°ž";s:2:"±";s:3:"ç°£";s:2:"²";s:3:"ç°¡";s:2:"³";s:3:"ç³§";s:2:"´";s:3:"ç¹”";s:2:"µ";s:3:"繕";s:2:"¶";s:3:"繞";s:2:"·";s:3:"繚";s:2:"¸";s:3:"繡";s:2:"¹";s:3:"ç¹’";s:2:"º";s:3:"ç¹™";s:2:"»";s:3:"罈";s:2:"¼";s:3:"翹";s:2:"½";s:3:"ç¿»";s:2:"¾";s:3:"è·";s:2:"¿";s:3:"è¶";s:2:"ÂÀ";s:3:"è‡";s:2:"ÂÁ";s:3:"è‡";s:2:"ÂÂ";s:3:"舊";s:2:"ÂÃ";s:3:"è—";s:2:"ÂÄ";s:3:"è–©";s:2:"ÂÅ";s:3:"è—";s:2:"ÂÆ";s:3:"è—";s:2:"ÂÇ";s:3:"è—‰";s:2:"ÂÈ";s:3:"è–°";s:2:"ÂÉ";s:3:"è–º";s:2:"ÂÊ";s:3:"è–¹";s:2:"ÂË";s:3:"è–¦";s:2:"ÂÌ";s:3:"蟯";s:2:"ÂÍ";s:3:"蟬";s:2:"ÂÎ";s:3:"蟲";s:2:"ÂÏ";s:3:"蟠";s:2:"ÂÐ";s:3:"覆";s:2:"ÂÑ";s:3:"覲";s:2:"ÂÒ";s:3:"è§´";s:2:"ÂÓ";s:3:"謨";s:2:"ÂÔ";s:3:"謹";s:2:"ÂÕ";s:3:"謬";s:2:"ÂÖ";s:3:"謫";s:2:"Â×";s:3:"è±";s:2:"ÂØ";s:3:"è´…";s:2:"ÂÙ";s:3:"è¹™";s:2:"ÂÚ";s:3:"è¹£";s:2:"ÂÛ";s:3:"蹦";s:2:"ÂÜ";s:3:"蹤";s:2:"ÂÝ";s:3:"蹟";s:2:"ÂÞ";s:3:"蹕";s:2:"Âß";s:3:"軀";s:2:"Âà";s:3:"轉";s:2:"Âá";s:3:"è½";s:2:"Ââ";s:3:"邇";s:2:"Âã";s:3:"邃";s:2:"Âä";s:3:"邈";s:2:"Âå";s:3:"醫";s:2:"Âæ";s:3:"醬";s:2:"Âç";s:3:"é‡";s:2:"Âè";s:3:"鎔";s:2:"Âé";s:3:"鎊";s:2:"Âê";s:3:"鎖";s:2:"Âë";s:3:"鎢";s:2:"Âì";s:3:"鎳";s:2:"Âí";s:3:"鎮";s:2:"Âî";s:3:"鎬";s:2:"Âï";s:3:"鎰";s:2:"Âð";s:3:"鎘";s:2:"Âñ";s:3:"鎚";s:2:"Âò";s:3:"鎗";s:2:"Âó";s:3:"é—”";s:2:"Âô";s:3:"é—–";s:2:"Âõ";s:3:"é—";s:2:"Âö";s:3:"é—•";s:2:"Â÷";s:3:"離";s:2:"Âø";s:3:"雜";s:2:"Âù";s:3:"é›™";s:2:"Âú";s:3:"é››";s:2:"Âû";s:3:"雞";s:2:"Âü";s:3:"霤";s:2:"Âý";s:3:"鞣";s:2:"Âþ";s:3:"鞦";s:2:"Ã@";s:3:"éž­";s:2:"ÃA";s:3:"韹";s:2:"ÃB";s:3:"é¡";s:2:"ÃC";s:3:"é¡";s:2:"ÃD";s:3:"題";s:2:"ÃE";s:3:"顎";s:2:"ÃF";s:3:"é¡“";s:2:"ÃG";s:3:"颺";s:2:"ÃH";s:3:"餾";s:2:"ÃI";s:3:"餿";s:2:"ÃJ";s:3:"餽";s:2:"ÃK";s:3:"餮";s:2:"ÃL";s:3:"馥";s:2:"ÃM";s:3:"騎";s:2:"ÃN";s:3:"é«";s:2:"ÃO";s:3:"鬃";s:2:"ÃP";s:3:"鬆";s:2:"ÃQ";s:3:"é­";s:2:"ÃR";s:3:"é­Ž";s:2:"ÃS";s:3:"é­";s:2:"ÃT";s:3:"鯊";s:2:"ÃU";s:3:"鯉";s:2:"ÃV";s:3:"鯽";s:2:"ÃW";s:3:"鯈";s:2:"ÃX";s:3:"鯀";s:2:"ÃY";s:3:"鵑";s:2:"ÃZ";s:3:"éµ";s:2:"Ã[";s:3:"éµ ";s:2:"Ã\";s:3:"é» ";s:2:"Ã]";s:3:"鼕";s:2:"Ã^";s:3:"鼬";s:2:"Ã_";s:3:"儳";s:2:"Ã`";s:3:"嚥";s:2:"Ãa";s:3:"壞";s:2:"Ãb";s:3:"壟";s:2:"Ãc";s:3:"壢";s:2:"Ãd";s:3:"寵";s:2:"Ãe";s:3:"é¾";s:2:"Ãf";s:3:"廬";s:2:"Ãg";s:3:"懲";s:2:"Ãh";s:3:"懷";s:2:"Ãi";s:3:"懶";s:2:"Ãj";s:3:"懵";s:2:"Ãk";s:3:"攀";s:2:"Ãl";s:3:"æ”";s:2:"Ãm";s:3:"æ› ";s:2:"Ãn";s:3:"æ›";s:2:"Ão";s:3:"æ«¥";s:2:"Ãp";s:3:"æ«";s:2:"Ãq";s:3:"櫚";s:2:"Ãr";s:3:"æ«“";s:2:"Ãs";s:3:"瀛";s:2:"Ãt";s:3:"瀟";s:2:"Ãu";s:3:"瀨";s:2:"Ãv";s:3:"瀚";s:2:"Ãw";s:3:"ç€";s:2:"Ãx";s:3:"瀕";s:2:"Ãy";s:3:"瀘";s:2:"Ãz";s:3:"爆";s:2:"Ã{";s:3:"çˆ";s:2:"Ã|";s:3:"牘";s:2:"Ã}";s:3:"犢";s:2:"Ã~";s:3:"ç¸";s:2:"á";s:3:"çº";s:2:"â";s:3:"ç’½";s:2:"ã";s:3:"瓊";s:2:"ä";s:3:"ç“£";s:2:"Ã¥";s:3:"ç–‡";s:2:"æ";s:3:"ç–†";s:2:"ç";s:3:"癟";s:2:"è";s:3:"癡";s:2:"é";s:3:"矇";s:2:"ê";s:3:"礙";s:2:"ë";s:3:"禱";s:2:"ì";s:3:"ç©«";s:2:"í";s:3:"ç©©";s:2:"î";s:3:"ç°¾";s:2:"ï";s:3:"ç°¿";s:2:"ð";s:3:"ç°¸";s:2:"ñ";s:3:"ç°½";s:2:"ò";s:3:"ç°·";s:2:"ó";s:3:"ç±€";s:2:"ô";s:3:"繫";s:2:"õ";s:3:"ç¹­";s:2:"ö";s:3:"ç¹¹";s:2:"÷";s:3:"繩";s:2:"ø";s:3:"繪";s:2:"ù";s:3:"ç¾…";s:2:"ú";s:3:"ç¹³";s:2:"û";s:3:"ç¾¶";s:2:"ü";s:3:"ç¾¹";s:2:"ý";s:3:"羸";s:2:"þ";s:3:"臘";s:2:"ÿ";s:3:"è—©";s:2:"ÃÀ";s:3:"è—";s:2:"ÃÁ";s:3:"è—ª";s:2:"ÃÂ";s:3:"è—•";s:2:"ÃÃ";s:3:"è—¤";s:2:"ÃÄ";s:3:"è—¥";s:2:"ÃÅ";s:3:"è—·";s:2:"ÃÆ";s:3:"蟻";s:2:"ÃÇ";s:3:"è …";s:2:"ÃÈ";s:3:"è ";s:2:"ÃÉ";s:3:"蟹";s:2:"ÃÊ";s:3:"蟾";s:2:"ÃË";s:3:"襠";s:2:"ÃÌ";s:3:"襟";s:2:"ÃÍ";s:3:"襖";s:2:"ÃÎ";s:3:"襞";s:2:"ÃÏ";s:3:"è­";s:2:"ÃÐ";s:3:"è­œ";s:2:"ÃÑ";s:3:"è­˜";s:2:"ÃÒ";s:3:"è­‰";s:2:"ÃÓ";s:3:"è­š";s:2:"ÃÔ";s:3:"è­Ž";s:2:"ÃÕ";s:3:"è­";s:2:"ÃÖ";s:3:"è­†";s:2:"Ã×";s:3:"è­™";s:2:"ÃØ";s:3:"è´ˆ";s:2:"ÃÙ";s:3:"è´Š";s:2:"ÃÚ";s:3:"è¹¼";s:2:"ÃÛ";s:3:"è¹²";s:2:"ÃÜ";s:3:"躇";s:2:"ÃÝ";s:3:"è¹¶";s:2:"ÃÞ";s:3:"蹬";s:2:"Ãß";s:3:"蹺";s:2:"Ãà";s:3:"è¹´";s:2:"Ãá";s:3:"è½”";s:2:"Ãâ";s:3:"轎";s:2:"Ãã";s:3:"è¾­";s:2:"Ãä";s:3:"邊";s:2:"Ãå";s:3:"é‚‹";s:2:"Ãæ";s:3:"醱";s:2:"Ãç";s:3:"醮";s:2:"Ãè";s:3:"é¡";s:2:"Ãé";s:3:"é‘";s:2:"Ãê";s:3:"éŸ";s:2:"Ãë";s:3:"éƒ";s:2:"Ãì";s:3:"éˆ";s:2:"Ãí";s:3:"éœ";s:2:"Ãî";s:3:"é";s:2:"Ãï";s:3:"é–";s:2:"Ãð";s:3:"é¢";s:2:"Ãñ";s:3:"é";s:2:"Ãò";s:3:"é˜";s:2:"Ãó";s:3:"é¤";s:2:"Ãô";s:3:"é—";s:2:"Ãõ";s:3:"é¨";s:2:"Ãö";s:3:"é—œ";s:2:"Ã÷";s:3:"éš´";s:2:"Ãø";s:3:"難";s:2:"Ãù";s:3:"霪";s:2:"Ãú";s:3:"霧";s:2:"Ãû";s:3:"é¡";s:2:"Ãü";s:3:"韜";s:2:"Ãý";s:3:"韻";s:2:"Ãþ";s:3:"類";s:2:"Ä@";s:3:"願";s:2:"ÄA";s:3:"é¡›";s:2:"ÄB";s:3:"颼";s:2:"ÄC";s:3:"饅";s:2:"ÄD";s:3:"饉";s:2:"ÄE";s:3:"騖";s:2:"ÄF";s:3:"騙";s:2:"ÄG";s:3:"é¬";s:2:"ÄH";s:3:"鯨";s:2:"ÄI";s:3:"鯧";s:2:"ÄJ";s:3:"鯖";s:2:"ÄK";s:3:"鯛";s:2:"ÄL";s:3:"鶉";s:2:"ÄM";s:3:"鵡";s:2:"ÄN";s:3:"éµ²";s:2:"ÄO";s:3:"鵪";s:2:"ÄP";s:3:"鵬";s:2:"ÄQ";s:3:"麒";s:2:"ÄR";s:3:"麗";s:2:"ÄS";s:3:"麓";s:2:"ÄT";s:3:"麴";s:2:"ÄU";s:3:"勸";s:2:"ÄV";s:3:"嚨";s:2:"ÄW";s:3:"åš·";s:2:"ÄX";s:3:"åš¶";s:2:"ÄY";s:3:"åš´";s:2:"ÄZ";s:3:"åš¼";s:2:"Ä[";s:3:"壤";s:2:"Ä\";s:3:"å­€";s:2:"Ä]";s:3:"å­ƒ";s:2:"Ä^";s:3:"å­½";s:2:"Ä_";s:3:"寶";s:2:"Ä`";s:3:"å·‰";s:2:"Äa";s:3:"懸";s:2:"Äb";s:3:"懺";s:2:"Äc";s:3:"攘";s:2:"Äd";s:3:"æ””";s:2:"Äe";s:3:"æ”™";s:2:"Äf";s:3:"曦";s:2:"Äg";s:3:"朧";s:2:"Äh";s:3:"櫬";s:2:"Äi";s:3:"瀾";s:2:"Äj";s:3:"瀰";s:2:"Äk";s:3:"瀲";s:2:"Äl";s:3:"çˆ";s:2:"Äm";s:3:"ç»";s:2:"Än";s:3:"ç“";s:2:"Äo";s:3:"癢";s:2:"Äp";s:3:"癥";s:2:"Äq";s:3:"礦";s:2:"Är";s:3:"礪";s:2:"Äs";s:3:"礬";s:2:"Ät";s:3:"礫";s:2:"Äu";s:3:"竇";s:2:"Äv";s:3:"ç«¶";s:2:"Äw";s:3:"籌";s:2:"Äx";s:3:"籃";s:2:"Äy";s:3:"ç±";s:2:"Äz";s:3:"糯";s:2:"Ä{";s:3:"ç³°";s:2:"Ä|";s:3:"è¾®";s:2:"Ä}";s:3:"ç¹½";s:2:"Ä~";s:3:"ç¹¼";s:2:"Ä¡";s:3:"纂";s:2:"Ä¢";s:3:"罌";s:2:"Ä£";s:3:"耀";s:2:"Ĥ";s:3:"臚";s:2:"Ä¥";s:3:"艦";s:2:"Ħ";s:3:"è—»";s:2:"ħ";s:3:"è—¹";s:2:"Ĩ";s:3:"蘑";s:2:"Ä©";s:3:"è—º";s:2:"Ī";s:3:"蘆";s:2:"Ä«";s:3:"蘋";s:2:"Ĭ";s:3:"蘇";s:2:"Ä­";s:3:"蘊";s:2:"Ä®";s:3:"è ”";s:2:"į";s:3:"è •";s:2:"İ";s:3:"襤";s:2:"ı";s:3:"覺";s:2:"IJ";s:3:"觸";s:2:"ij";s:3:"è­°";s:2:"Ä´";s:3:"è­¬";s:2:"ĵ";s:3:"è­¦";s:2:"Ķ";s:3:"è­¯";s:2:"Ä·";s:3:"è­Ÿ";s:2:"ĸ";s:3:"è­«";s:2:"Ĺ";s:3:"è´";s:2:"ĺ";s:3:"è´";s:2:"Ä»";s:3:"躉";s:2:"ļ";s:3:"èº";s:2:"Ľ";s:3:"躅";s:2:"ľ";s:3:"躂";s:2:"Ä¿";s:3:"醴";s:2:"ÄÀ";s:3:"釋";s:2:"ÄÁ";s:3:"é˜";s:2:"ÄÂ";s:3:"éƒ";s:2:"ÄÃ";s:3:"é½";s:2:"ÄÄ";s:3:"é—¡";s:2:"ÄÅ";s:3:"霰";s:2:"ÄÆ";s:3:"飄";s:2:"ÄÇ";s:3:"饒";s:2:"ÄÈ";s:3:"饑";s:2:"ÄÉ";s:3:"馨";s:2:"ÄÊ";s:3:"騫";s:2:"ÄË";s:3:"騰";s:2:"ÄÌ";s:3:"騷";s:2:"ÄÍ";s:3:"騵";s:2:"ÄÎ";s:3:"é°“";s:2:"ÄÏ";s:3:"é°";s:2:"ÄÐ";s:3:"é¹¹";s:2:"ÄÑ";s:3:"麵";s:2:"ÄÒ";s:3:"黨";s:2:"ÄÓ";s:3:"鼯";s:2:"ÄÔ";s:3:"齟";s:2:"ÄÕ";s:3:"é½£";s:2:"ÄÖ";s:3:"齡";s:2:"Ä×";s:3:"å„·";s:2:"ÄØ";s:3:"儸";s:2:"ÄÙ";s:3:"å›";s:2:"ÄÚ";s:3:"囀";s:2:"ÄÛ";s:3:"囂";s:2:"ÄÜ";s:3:"夔";s:2:"ÄÝ";s:3:"屬";s:2:"ÄÞ";s:3:"å·";s:2:"Äß";s:3:"懼";s:2:"Äà";s:3:"懾";s:2:"Äá";s:3:"æ”";s:2:"Äâ";s:3:"攜";s:2:"Äã";s:3:"æ–•";s:2:"Ää";s:3:"曩";s:2:"Äå";s:3:"æ«»";s:2:"Äæ";s:3:"欄";s:2:"Äç";s:3:"櫺";s:2:"Äè";s:3:"殲";s:2:"Äé";s:3:"çŒ";s:2:"Äê";s:3:"爛";s:2:"Äë";s:3:"犧";s:2:"Äì";s:3:"ç“–";s:2:"Äí";s:3:"ç“”";s:2:"Äî";s:3:"癩";s:2:"Äï";s:3:"矓";s:2:"Äð";s:3:"ç±";s:2:"Äñ";s:3:"çº";s:2:"Äò";s:3:"續";s:2:"Äó";s:3:"ç¾¼";s:2:"Äô";s:3:"蘗";s:2:"Äõ";s:3:"蘭";s:2:"Äö";s:3:"蘚";s:2:"Ä÷";s:3:"è £";s:2:"Äø";s:3:"è ¢";s:2:"Äù";s:3:"è ¡";s:2:"Äú";s:3:"è Ÿ";s:2:"Äû";s:3:"襪";s:2:"Äü";s:3:"襬";s:2:"Äý";s:3:"覽";s:2:"Äþ";s:3:"è­´";s:2:"Å@";s:3:"è­·";s:2:"ÅA";s:3:"è­½";s:2:"ÅB";s:3:"è´“";s:2:"ÅC";s:3:"躊";s:2:"ÅD";s:3:"èº";s:2:"ÅE";s:3:"躋";s:2:"ÅF";s:3:"轟";s:2:"ÅG";s:3:"辯";s:2:"ÅH";s:3:"醺";s:2:"ÅI";s:3:"é®";s:2:"ÅJ";s:3:"é³";s:2:"ÅK";s:3:"éµ";s:2:"ÅL";s:3:"éº";s:2:"ÅM";s:3:"é¸";s:2:"ÅN";s:3:"é²";s:2:"ÅO";s:3:"é«";s:2:"ÅP";s:3:"é—¢";s:2:"ÅQ";s:3:"霸";s:2:"ÅR";s:3:"霹";s:2:"ÅS";s:3:"露";s:2:"ÅT";s:3:"響";s:2:"ÅU";s:3:"é¡§";s:2:"ÅV";s:3:"é¡¥";s:2:"ÅW";s:3:"饗";s:2:"ÅX";s:3:"é©…";s:2:"ÅY";s:3:"驃";s:2:"ÅZ";s:3:"é©€";s:2:"Å[";s:3:"騾";s:2:"Å\";s:3:"é«";s:2:"Å]";s:3:"é­”";s:2:"Å^";s:3:"é­‘";s:2:"Å_";s:3:"é°­";s:2:"Å`";s:3:"é°¥";s:2:"Åa";s:3:"鶯";s:2:"Åb";s:3:"é¶´";s:2:"Åc";s:3:"é·‚";s:2:"Åd";s:3:"鶸";s:2:"Åe";s:3:"éº";s:2:"Åf";s:3:"黯";s:2:"Åg";s:3:"é¼™";s:2:"Åh";s:3:"齜";s:2:"Åi";s:3:"齦";s:2:"Åj";s:3:"é½§";s:2:"Åk";s:3:"儼";s:2:"Ål";s:3:"å„»";s:2:"Åm";s:3:"囈";s:2:"Ån";s:3:"囊";s:2:"Åo";s:3:"囉";s:2:"Åp";s:3:"å­¿";s:2:"Åq";s:3:"å·”";s:2:"År";s:3:"å·’";s:2:"Ås";s:3:"彎";s:2:"Åt";s:3:"懿";s:2:"Åu";s:3:"攤";s:2:"Åv";s:3:"權";s:2:"Åw";s:3:"æ­¡";s:2:"Åx";s:3:"ç‘";s:2:"Åy";s:3:"ç˜";s:2:"Åz";s:3:"玀";s:2:"Å{";s:3:"瓤";s:2:"Å|";s:3:"ç–Š";s:2:"Å}";s:3:"ç™®";s:2:"Å~";s:3:"癬";s:2:"Å¡";s:3:"禳";s:2:"Å¢";s:3:"ç± ";s:2:"Å£";s:3:"籟";s:2:"Ť";s:3:"è¾";s:2:"Å¥";s:3:"è½";s:2:"Ŧ";s:3:"臟";s:2:"ŧ";s:3:"襲";s:2:"Ũ";s:3:"襯";s:2:"Å©";s:3:"è§¼";s:2:"Ū";s:3:"讀";s:2:"Å«";s:3:"è´–";s:2:"Ŭ";s:3:"è´—";s:2:"Å­";s:3:"躑";s:2:"Å®";s:3:"躓";s:2:"ů";s:3:"轡";s:2:"Ű";s:3:"é…ˆ";s:2:"ű";s:3:"é‘„";s:2:"Ų";s:3:"é‘‘";s:2:"ų";s:3:"é‘’";s:2:"Å´";s:3:"霽";s:2:"ŵ";s:3:"霾";s:2:"Ŷ";s:3:"韃";s:2:"Å·";s:3:"éŸ";s:2:"Ÿ";s:3:"é¡«";s:2:"Ź";s:3:"饕";s:2:"ź";s:3:"é©•";s:2:"Å»";s:3:"é©";s:2:"ż";s:3:"é«’";s:2:"Ž";s:3:"鬚";s:2:"ž";s:3:"鱉";s:2:"Å¿";s:3:"é°±";s:2:"ÅÀ";s:3:"é°¾";s:2:"ÅÁ";s:3:"é°»";s:2:"ÅÂ";s:3:"é·“";s:2:"ÅÃ";s:3:"é·—";s:2:"ÅÄ";s:3:"é¼´";s:2:"ÅÅ";s:3:"齬";s:2:"ÅÆ";s:3:"齪";s:2:"ÅÇ";s:3:"é¾”";s:2:"ÅÈ";s:3:"囌";s:2:"ÅÉ";s:3:"å·–";s:2:"ÅÊ";s:3:"戀";s:2:"ÅË";s:3:"攣";s:2:"ÅÌ";s:3:"攫";s:2:"ÅÍ";s:3:"攪";s:2:"ÅÎ";s:3:"曬";s:2:"ÅÏ";s:3:"æ¬";s:2:"ÅÐ";s:3:"瓚";s:2:"ÅÑ";s:3:"竊";s:2:"ÅÒ";s:3:"籤";s:2:"ÅÓ";s:3:"ç±£";s:2:"ÅÔ";s:3:"ç±¥";s:2:"ÅÕ";s:3:"纓";s:2:"ÅÖ";s:3:"纖";s:2:"Å×";s:3:"纔";s:2:"ÅØ";s:3:"臢";s:2:"ÅÙ";s:3:"蘸";s:2:"ÅÚ";s:3:"蘿";s:2:"ÅÛ";s:3:"è ±";s:2:"ÅÜ";s:3:"變";s:2:"ÅÝ";s:3:"é‚";s:2:"ÅÞ";s:3:"é‚";s:2:"Åß";s:3:"é‘£";s:2:"Åà";s:3:"é‘ ";s:2:"Åá";s:3:"鑤";s:2:"Åâ";s:3:"é¨";s:2:"Åã";s:3:"顯";s:2:"Åä";s:3:"饜";s:2:"Åå";s:3:"驚";s:2:"Åæ";s:3:"é©›";s:2:"Åç";s:3:"é©—";s:2:"Åè";s:3:"é«“";s:2:"Åé";s:3:"é«”";s:2:"Åê";s:3:"é«‘";s:2:"Åë";s:3:"é±”";s:2:"Åì";s:3:"é±—";s:2:"Åí";s:3:"é±–";s:2:"Åî";s:3:"é·¥";s:2:"Åï";s:3:"麟";s:2:"Åð";s:3:"é»´";s:2:"Åñ";s:3:"囑";s:2:"Åò";s:3:"壩";s:2:"Åó";s:3:"攬";s:2:"Åô";s:3:"çž";s:2:"Åõ";s:3:"ç™±";s:2:"Åö";s:3:"癲";s:2:"Å÷";s:3:"矗";s:2:"Åø";s:3:"ç½";s:2:"Åù";s:3:"羈";s:2:"Åú";s:3:"è ¶";s:2:"Åû";s:3:"è ¹";s:2:"Åü";s:3:"è¡¢";s:2:"Åý";s:3:"讓";s:2:"Åþ";s:3:"è®’";s:2:"Æ@";s:3:"è®–";s:2:"ÆA";s:3:"艷";s:2:"ÆB";s:3:"è´›";s:2:"ÆC";s:3:"釀";s:2:"ÆD";s:3:"鑪";s:2:"ÆE";s:3:"é‚";s:2:"ÆF";s:3:"éˆ";s:2:"ÆG";s:3:"é„";s:2:"ÆH";s:3:"韆";s:2:"ÆI";s:3:"é¡°";s:2:"ÆJ";s:3:"驟";s:2:"ÆK";s:3:"鬢";s:2:"ÆL";s:3:"é­˜";s:2:"ÆM";s:3:"鱟";s:2:"ÆN";s:3:"é·¹";s:2:"ÆO";s:3:"é·º";s:2:"ÆP";s:3:"é¹¼";s:2:"ÆQ";s:3:"é¹½";s:2:"ÆR";s:3:"鼇";s:2:"ÆS";s:3:"é½·";s:2:"ÆT";s:3:"é½²";s:2:"ÆU";s:3:"廳";s:2:"ÆV";s:3:"欖";s:2:"ÆW";s:3:"ç£";s:2:"ÆX";s:3:"籬";s:2:"ÆY";s:3:"ç±®";s:2:"ÆZ";s:3:"è »";s:2:"Æ[";s:3:"è§€";s:2:"Æ\";s:3:"躡";s:2:"Æ]";s:3:"é‡";s:2:"Æ^";s:3:"鑲";s:2:"Æ_";s:3:"é‘°";s:2:"Æ`";s:3:"顱";s:2:"Æa";s:3:"饞";s:2:"Æb";s:3:"é«–";s:2:"Æc";s:3:"鬣";s:2:"Æd";s:3:"黌";s:2:"Æe";s:3:"ç¤";s:2:"Æf";s:3:"矚";s:2:"Æg";s:3:"讚";s:2:"Æh";s:3:"é‘·";s:2:"Æi";s:3:"韉";s:2:"Æj";s:3:"é©¢";s:2:"Æk";s:3:"é©¥";s:2:"Æl";s:3:"纜";s:2:"Æm";s:3:"讜";s:2:"Æn";s:3:"躪";s:2:"Æo";s:3:"釅";s:2:"Æp";s:3:"鑽";s:2:"Æq";s:3:"鑾";s:2:"Ær";s:3:"鑼";s:2:"Æs";s:3:"é±·";s:2:"Æt";s:3:"鱸";s:2:"Æu";s:3:"é»·";s:2:"Æv";s:3:"è±”";s:2:"Æw";s:3:"é‘¿";s:2:"Æx";s:3:"鸚";s:2:"Æy";s:3:"爨";s:2:"Æz";s:3:"驪";s:2:"Æ{";s:3:"鬱";s:2:"Æ|";s:3:"鸛";s:2:"Æ}";s:3:"鸞";s:2:"Æ~";s:3:"ç±²";s:2:"Æ¡";s:3:"ヾ";s:2:"Æ¢";s:3:"ã‚";s:2:"Æ£";s:3:"ゞ";s:2:"Ƥ";s:3:"々";s:2:"Æ¥";s:3:"ã";s:2:"Ʀ";s:3:"ã‚";s:2:"Ƨ";s:3:"ãƒ";s:2:"ƨ";s:3:"ã„";s:2:"Æ©";s:3:"ã…";s:2:"ƪ";s:3:"ã†";s:2:"Æ«";s:3:"ã‡";s:2:"Ƭ";s:3:"ãˆ";s:2:"Æ­";s:3:"ã‰";s:2:"Æ®";s:3:"ãŠ";s:2:"Ư";s:3:"ã‹";s:2:"ư";s:3:"ãŒ";s:2:"Ʊ";s:3:"ã";s:2:"Ʋ";s:3:"ãŽ";s:2:"Ƴ";s:3:"ã";s:2:"Æ´";s:3:"ã";s:2:"Ƶ";s:3:"ã‘";s:2:"ƶ";s:3:"ã’";s:2:"Æ·";s:3:"ã“";s:2:"Ƹ";s:3:"ã”";s:2:"ƹ";s:3:"ã•";s:2:"ƺ";s:3:"ã–";s:2:"Æ»";s:3:"ã—";s:2:"Ƽ";s:3:"ã˜";s:2:"ƽ";s:3:"ã™";s:2:"ƾ";s:3:"ãš";s:2:"Æ¿";s:3:"ã›";s:2:"ÆÀ";s:3:"ãœ";s:2:"ÆÁ";s:3:"ã";s:2:"ÆÂ";s:3:"ãž";s:2:"ÆÃ";s:3:"ãŸ";s:2:"ÆÄ";s:3:"ã ";s:2:"ÆÅ";s:3:"ã¡";s:2:"ÆÆ";s:3:"ã¢";s:2:"ÆÇ";s:3:"ã£";s:2:"ÆÈ";s:3:"ã¤";s:2:"ÆÉ";s:3:"ã¥";s:2:"ÆÊ";s:3:"ã¦";s:2:"ÆË";s:3:"ã§";s:2:"ÆÌ";s:3:"ã¨";s:2:"ÆÍ";s:3:"ã©";s:2:"ÆÎ";s:3:"ãª";s:2:"ÆÏ";s:3:"ã«";s:2:"ÆÐ";s:3:"ã¬";s:2:"ÆÑ";s:3:"ã­";s:2:"ÆÒ";s:3:"ã®";s:2:"ÆÓ";s:3:"ã¯";s:2:"ÆÔ";s:3:"ã°";s:2:"ÆÕ";s:3:"ã±";s:2:"ÆÖ";s:3:"ã²";s:2:"Æ×";s:3:"ã³";s:2:"ÆØ";s:3:"ã´";s:2:"ÆÙ";s:3:"ãµ";s:2:"ÆÚ";s:3:"ã¶";s:2:"ÆÛ";s:3:"ã·";s:2:"ÆÜ";s:3:"ã¸";s:2:"ÆÝ";s:3:"ã¹";s:2:"ÆÞ";s:3:"ãº";s:2:"Æß";s:3:"ã»";s:2:"Æà";s:3:"ã¼";s:2:"Æá";s:3:"ã½";s:2:"Æâ";s:3:"ã¾";s:2:"Æã";s:3:"ã¿";s:2:"Æä";s:3:"ã‚€";s:2:"Æå";s:3:"ã‚";s:2:"Ææ";s:3:"ã‚‚";s:2:"Æç";s:3:"ゃ";s:2:"Æè";s:3:"ã‚„";s:2:"Æé";s:3:"ã‚…";s:2:"Æê";s:3:"ゆ";s:2:"Æë";s:3:"ょ";s:2:"Æì";s:3:"よ";s:2:"Æí";s:3:"ら";s:2:"Æî";s:3:"り";s:2:"Æï";s:3:"ã‚‹";s:2:"Æð";s:3:"れ";s:2:"Æñ";s:3:"ã‚";s:2:"Æò";s:3:"ゎ";s:2:"Æó";s:3:"ã‚";s:2:"Æô";s:3:"ã‚";s:2:"Æõ";s:3:"ã‚‘";s:2:"Æö";s:3:"ã‚’";s:2:"Æ÷";s:3:"ã‚“";s:2:"Æø";s:3:"ã‚¡";s:2:"Æù";s:3:"ã‚¢";s:2:"Æú";s:3:"ã‚£";s:2:"Æû";s:3:"イ";s:2:"Æü";s:3:"ã‚¥";s:2:"Æý";s:3:"ウ";s:2:"Æþ";s:3:"ã‚§";s:2:"Ç@";s:3:"エ";s:2:"ÇA";s:3:"ã‚©";s:2:"ÇB";s:3:"オ";s:2:"ÇC";s:3:"ã‚«";s:2:"ÇD";s:3:"ガ";s:2:"ÇE";s:3:"ã‚­";s:2:"ÇF";s:3:"ã‚®";s:2:"ÇG";s:3:"ク";s:2:"ÇH";s:3:"ã‚°";s:2:"ÇI";s:3:"ケ";s:2:"ÇJ";s:3:"ゲ";s:2:"ÇK";s:3:"コ";s:2:"ÇL";s:3:"ã‚´";s:2:"ÇM";s:3:"サ";s:2:"ÇN";s:3:"ã‚¶";s:2:"ÇO";s:3:"ã‚·";s:2:"ÇP";s:3:"ジ";s:2:"ÇQ";s:3:"ス";s:2:"ÇR";s:3:"ズ";s:2:"ÇS";s:3:"ã‚»";s:2:"ÇT";s:3:"ゼ";s:2:"ÇU";s:3:"ソ";s:2:"ÇV";s:3:"ゾ";s:2:"ÇW";s:3:"ã‚¿";s:2:"ÇX";s:3:"ダ";s:2:"ÇY";s:3:"ãƒ";s:2:"ÇZ";s:3:"ヂ";s:2:"Ç[";s:3:"ッ";s:2:"Ç\";s:3:"ツ";s:2:"Ç]";s:3:"ヅ";s:2:"Ç^";s:3:"テ";s:2:"Ç_";s:3:"デ";s:2:"Ç`";s:3:"ト";s:2:"Ça";s:3:"ド";s:2:"Çb";s:3:"ナ";s:2:"Çc";s:3:"ニ";s:2:"Çd";s:3:"ヌ";s:2:"Çe";s:3:"ãƒ";s:2:"Çf";s:3:"ノ";s:2:"Çg";s:3:"ãƒ";s:2:"Çh";s:3:"ãƒ";s:2:"Çi";s:3:"パ";s:2:"Çj";s:3:"ヒ";s:2:"Çk";s:3:"ビ";s:2:"Çl";s:3:"ピ";s:2:"Çm";s:3:"フ";s:2:"Çn";s:3:"ブ";s:2:"Ço";s:3:"プ";s:2:"Çp";s:3:"ヘ";s:2:"Çq";s:3:"ベ";s:2:"Çr";s:3:"ペ";s:2:"Çs";s:3:"ホ";s:2:"Çt";s:3:"ボ";s:2:"Çu";s:3:"ãƒ";s:2:"Çv";s:3:"マ";s:2:"Çw";s:3:"ミ";s:2:"Çx";s:3:"ム";s:2:"Çy";s:3:"メ";s:2:"Çz";s:3:"モ";s:2:"Ç{";s:3:"ャ";s:2:"Ç|";s:3:"ヤ";s:2:"Ç}";s:3:"ュ";s:2:"Ç~";s:3:"ユ";s:2:"Ç¡";s:3:"ョ";s:2:"Ç¢";s:3:"ヨ";s:2:"Ç£";s:3:"ラ";s:2:"Ǥ";s:3:"リ";s:2:"Ç¥";s:3:"ル";s:2:"Ǧ";s:3:"レ";s:2:"ǧ";s:3:"ロ";s:2:"Ǩ";s:3:"ヮ";s:2:"Ç©";s:3:"ワ";s:2:"Ǫ";s:3:"ヰ";s:2:"Ç«";s:3:"ヱ";s:2:"Ǭ";s:3:"ヲ";s:2:"Ç­";s:3:"ン";s:2:"Ç®";s:3:"ヴ";s:2:"ǯ";s:3:"ヵ";s:2:"ǰ";s:3:"ヶ";s:2:"DZ";s:2:"Д";s:2:"Dz";s:2:"Е";s:2:"dz";s:2:"Ð";s:2:"Ç´";s:2:"Ж";s:2:"ǵ";s:2:"З";s:2:"Ƕ";s:2:"И";s:2:"Ç·";s:2:"Й";s:2:"Ǹ";s:2:"К";s:2:"ǹ";s:2:"Л";s:2:"Ǻ";s:2:"М";s:2:"Ç»";s:2:"У";s:2:"Ǽ";s:2:"Ф";s:2:"ǽ";s:2:"Ð¥";s:2:"Ǿ";s:2:"Ц";s:2:"Ç¿";s:2:"Ч";s:2:"ÇÀ";s:2:"Ш";s:2:"ÇÁ";s:2:"Щ";s:2:"ÇÂ";s:2:"Ъ";s:2:"ÇÃ";s:2:"Ы";s:2:"ÇÄ";s:2:"Ь";s:2:"ÇÅ";s:2:"Э";s:2:"ÇÆ";s:2:"Ю";s:2:"ÇÇ";s:2:"Я";s:2:"ÇÈ";s:2:"а";s:2:"ÇÉ";s:2:"б";s:2:"ÇÊ";s:2:"в";s:2:"ÇË";s:2:"г";s:2:"ÇÌ";s:2:"д";s:2:"ÇÍ";s:2:"е";s:2:"ÇÎ";s:2:"Ñ‘";s:2:"ÇÏ";s:2:"ж";s:2:"ÇÐ";s:2:"з";s:2:"ÇÑ";s:2:"и";s:2:"ÇÒ";s:2:"й";s:2:"ÇÓ";s:2:"к";s:2:"ÇÔ";s:2:"л";s:2:"ÇÕ";s:2:"м";s:2:"ÇÖ";s:2:"н";s:2:"Ç×";s:2:"о";s:2:"ÇØ";s:2:"п";s:2:"ÇÙ";s:2:"Ñ€";s:2:"ÇÚ";s:2:"Ñ";s:2:"ÇÛ";s:2:"Ñ‚";s:2:"ÇÜ";s:2:"у";s:2:"ÇÝ";s:2:"Ñ„";s:2:"ÇÞ";s:2:"Ñ…";s:2:"Çß";s:2:"ц";s:2:"Çà";s:2:"ч";s:2:"Çá";s:2:"ш";s:2:"Çâ";s:2:"щ";s:2:"Çã";s:2:"ÑŠ";s:2:"Çä";s:2:"Ñ‹";s:2:"Çå";s:2:"ÑŒ";s:2:"Çæ";s:2:"Ñ";s:2:"Çç";s:2:"ÑŽ";s:2:"Çè";s:2:"Ñ";s:2:"Çé";s:3:"â‘ ";s:2:"Çê";s:3:"â‘¡";s:2:"Çë";s:3:"â‘¢";s:2:"Çì";s:3:"â‘£";s:2:"Çí";s:3:"⑤";s:2:"Çî";s:3:"â‘¥";s:2:"Çï";s:3:"⑦";s:2:"Çð";s:3:"â‘§";s:2:"Çñ";s:3:"⑨";s:2:"Çò";s:3:"â‘©";s:2:"Çó";s:3:"â‘´";s:2:"Çô";s:3:"⑵";s:2:"Çõ";s:3:"â‘¶";s:2:"Çö";s:3:"â‘·";s:2:"Ç÷";s:3:"⑸";s:2:"Çø";s:3:"⑹";s:2:"Çù";s:3:"⑺";s:2:"Çú";s:3:"â‘»";s:2:"Çû";s:3:"⑼";s:2:"Çü";s:3:"⑽";s:2:"É@";s:3:"乂";s:2:"ÉA";s:3:"乜";s:2:"ÉB";s:3:"凵";s:2:"ÉC";s:3:"匚";s:2:"ÉD";s:3:"厂";s:2:"ÉE";s:3:"万";s:2:"ÉF";s:3:"丌";s:2:"ÉG";s:3:"乇";s:2:"ÉH";s:3:"äº";s:2:"ÉI";s:3:"å›—";s:2:"ÉJ";s:3:"兀";s:2:"ÉK";s:3:"å±®";s:2:"ÉL";s:3:"å½³";s:2:"ÉM";s:3:"ä¸";s:2:"ÉN";s:3:"冇";s:2:"ÉO";s:3:"与";s:2:"ÉP";s:3:"丮";s:2:"ÉQ";s:3:"亓";s:2:"ÉR";s:3:"仂";s:2:"ÉS";s:3:"仉";s:2:"ÉT";s:3:"仈";s:2:"ÉU";s:3:"冘";s:2:"ÉV";s:3:"勼";s:2:"ÉW";s:3:"å¬";s:2:"ÉX";s:3:"厹";s:2:"ÉY";s:3:"圠";s:2:"ÉZ";s:3:"夃";s:2:"É[";s:3:"夬";s:2:"É\";s:3:"å°";s:2:"É]";s:3:"å·¿";s:2:"É^";s:3:"æ—¡";s:2:"É_";s:3:"殳";s:2:"É`";s:3:"毌";s:2:"Éa";s:3:"æ°”";s:2:"Éb";s:3:"爿";s:2:"Éc";s:3:"丱";s:2:"Éd";s:3:"丼";s:2:"Ée";s:3:"仨";s:2:"Éf";s:3:"仜";s:2:"Ég";s:3:"仩";s:2:"Éh";s:3:"仡";s:2:"Éi";s:3:"ä»";s:2:"Éj";s:3:"仚";s:2:"Ék";s:3:"刌";s:2:"Él";s:3:"匜";s:2:"Ém";s:3:"åŒ";s:2:"Én";s:3:"圢";s:2:"Éo";s:3:"圣";s:2:"Ép";s:3:"夗";s:2:"Éq";s:3:"夯";s:2:"Ér";s:3:"å®";s:2:"És";s:3:"宄";s:2:"Ét";s:3:"å°’";s:2:"Éu";s:3:"å°»";s:2:"Év";s:3:"å±´";s:2:"Éw";s:3:"å±³";s:2:"Éx";s:3:"帄";s:2:"Éy";s:3:"庀";s:2:"Éz";s:3:"庂";s:2:"É{";s:3:"忉";s:2:"É|";s:3:"戉";s:2:"É}";s:3:"æ‰";s:2:"É~";s:3:"æ°•";s:2:"É¡";s:3:"æ°¶";s:2:"É¢";s:3:"汃";s:2:"É£";s:3:"æ°¿";s:2:"ɤ";s:3:"æ°»";s:2:"É¥";s:3:"犮";s:2:"ɦ";s:3:"犰";s:2:"ɧ";s:3:"玊";s:2:"ɨ";s:3:"禸";s:2:"É©";s:3:"肊";s:2:"ɪ";s:3:"阞";s:2:"É«";s:3:"伎";s:2:"ɬ";s:3:"优";s:2:"É­";s:3:"伬";s:2:"É®";s:3:"仵";s:2:"ɯ";s:3:"ä¼”";s:2:"ɰ";s:3:"ä»±";s:2:"ɱ";s:3:"ä¼€";s:2:"ɲ";s:3:"ä»·";s:2:"ɳ";s:3:"伈";s:2:"É´";s:3:"ä¼";s:2:"ɵ";s:3:"伂";s:2:"ɶ";s:3:"ä¼…";s:2:"É·";s:3:"ä¼¢";s:2:"ɸ";s:3:"伓";s:2:"ɹ";s:3:"伄";s:2:"ɺ";s:3:"ä»´";s:2:"É»";s:3:"ä¼’";s:2:"ɼ";s:3:"冱";s:2:"ɽ";s:3:"刓";s:2:"ɾ";s:3:"刉";s:2:"É¿";s:3:"åˆ";s:2:"ÉÀ";s:3:"劦";s:2:"ÉÁ";s:3:"匢";s:2:"ÉÂ";s:3:"匟";s:2:"ÉÃ";s:3:"å";s:2:"ÉÄ";s:3:"厊";s:2:"ÉÅ";s:3:"å‡";s:2:"ÉÆ";s:3:"囡";s:2:"ÉÇ";s:3:"囟";s:2:"ÉÈ";s:3:"圮";s:2:"ÉÉ";s:3:"圪";s:2:"ÉÊ";s:3:"圴";s:2:"ÉË";s:3:"夼";s:2:"ÉÌ";s:3:"妀";s:2:"ÉÍ";s:3:"奼";s:2:"ÉÎ";s:3:"妅";s:2:"ÉÏ";s:3:"奻";s:2:"ÉÐ";s:3:"奾";s:2:"ÉÑ";s:3:"奷";s:2:"ÉÒ";s:3:"奿";s:2:"ÉÓ";s:3:"å­–";s:2:"ÉÔ";s:3:"å°•";s:2:"ÉÕ";s:3:"å°¥";s:2:"ÉÖ";s:3:"å±¼";s:2:"É×";s:3:"屺";s:2:"ÉØ";s:3:"å±»";s:2:"ÉÙ";s:3:"å±¾";s:2:"ÉÚ";s:3:"å·Ÿ";s:2:"ÉÛ";s:3:"å¹µ";s:2:"ÉÜ";s:3:"庄";s:2:"ÉÝ";s:3:"异";s:2:"ÉÞ";s:3:"弚";s:2:"Éß";s:3:"å½´";s:2:"Éà";s:3:"å¿•";s:2:"Éá";s:3:"å¿”";s:2:"Éâ";s:3:"å¿";s:2:"Éã";s:3:"扜";s:2:"Éä";s:3:"扞";s:2:"Éå";s:3:"扤";s:2:"Éæ";s:3:"扡";s:2:"Éç";s:3:"扦";s:2:"Éè";s:3:"扢";s:2:"Éé";s:3:"扙";s:2:"Éê";s:3:"扠";s:2:"Éë";s:3:"扚";s:2:"Éì";s:3:"扥";s:2:"Éí";s:3:"æ—¯";s:2:"Éî";s:3:"æ—®";s:2:"Éï";s:3:"朾";s:2:"Éð";s:3:"朹";s:2:"Éñ";s:3:"朸";s:2:"Éò";s:3:"朻";s:2:"Éó";s:3:"机";s:2:"Éô";s:3:"朿";s:2:"Éõ";s:3:"朼";s:2:"Éö";s:3:"朳";s:2:"É÷";s:3:"æ°˜";s:2:"Éø";s:3:"汆";s:2:"Éù";s:3:"æ±’";s:2:"Éú";s:3:"汜";s:2:"Éû";s:3:"æ±";s:2:"Éü";s:3:"汊";s:2:"Éý";s:3:"æ±”";s:2:"Éþ";s:3:"汋";s:2:"Ê@";s:3:"汌";s:2:"ÊA";s:3:"ç±";s:2:"ÊB";s:3:"牞";s:2:"ÊC";s:3:"犴";s:2:"ÊD";s:3:"犵";s:2:"ÊE";s:3:"玎";s:2:"ÊF";s:3:"甪";s:2:"ÊG";s:3:"癿";s:2:"ÊH";s:3:"穵";s:2:"ÊI";s:3:"网";s:2:"ÊJ";s:3:"艸";s:2:"ÊK";s:3:"艼";s:2:"ÊL";s:3:"芀";s:2:"ÊM";s:3:"艽";s:2:"ÊN";s:3:"艿";s:2:"ÊO";s:3:"è™";s:2:"ÊP";s:3:"襾";s:2:"ÊQ";s:3:"é‚™";s:2:"ÊR";s:3:"é‚—";s:2:"ÊS";s:3:"邘";s:2:"ÊT";s:3:"é‚›";s:2:"ÊU";s:3:"é‚”";s:2:"ÊV";s:3:"阢";s:2:"ÊW";s:3:"阤";s:2:"ÊX";s:3:"阠";s:2:"ÊY";s:3:"阣";s:2:"ÊZ";s:3:"ä½–";s:2:"Ê[";s:3:"ä¼»";s:2:"Ê\";s:3:"ä½¢";s:2:"Ê]";s:3:"佉";s:2:"Ê^";s:3:"体";s:2:"Ê_";s:3:"佤";s:2:"Ê`";s:3:"ä¼¾";s:2:"Êa";s:3:"ä½§";s:2:"Êb";s:3:"ä½’";s:2:"Êc";s:3:"佟";s:2:"Êd";s:3:"ä½";s:2:"Êe";s:3:"佘";s:2:"Êf";s:3:"ä¼­";s:2:"Êg";s:3:"ä¼³";s:2:"Êh";s:3:"伿";s:2:"Êi";s:3:"佡";s:2:"Êj";s:3:"å†";s:2:"Êk";s:3:"冹";s:2:"Êl";s:3:"刜";s:2:"Êm";s:3:"刞";s:2:"Ên";s:3:"刡";s:2:"Êo";s:3:"劭";s:2:"Êp";s:3:"劮";s:2:"Êq";s:3:"匉";s:2:"Êr";s:3:"å£";s:2:"Ês";s:3:"å²";s:2:"Êt";s:3:"厎";s:2:"Êu";s:3:"åŽ";s:2:"Êv";s:3:"å°";s:2:"Êw";s:3:"å·";s:2:"Êx";s:3:"åª";s:2:"Êy";s:3:"å‘”";s:2:"Êz";s:3:"å‘…";s:2:"Ê{";s:3:"å™";s:2:"Ê|";s:3:"åœ";s:2:"Ê}";s:3:"å¥";s:2:"Ê~";s:3:"å˜";s:2:"Ê¡";s:3:"å½";s:2:"Ê¢";s:3:"å‘";s:2:"Ê£";s:3:"å‘";s:2:"ʤ";s:3:"å¨";s:2:"Ê¥";s:3:"å¤";s:2:"ʦ";s:3:"呇";s:2:"ʧ";s:3:"å›®";s:2:"ʨ";s:3:"å›§";s:2:"Ê©";s:3:"囥";s:2:"ʪ";s:3:"å";s:2:"Ê«";s:3:"å…";s:2:"ʬ";s:3:"åŒ";s:2:"Ê­";s:3:"å‰";s:2:"Ê®";s:3:"å‹";s:2:"ʯ";s:3:"å’";s:2:"ʰ";s:3:"夆";s:2:"ʱ";s:3:"奀";s:2:"ʲ";s:3:"妦";s:2:"ʳ";s:3:"妘";s:2:"Ê´";s:3:"妠";s:2:"ʵ";s:3:"妗";s:2:"ʶ";s:3:"妎";s:2:"Ê·";s:3:"妢";s:2:"ʸ";s:3:"å¦";s:2:"ʹ";s:3:"å¦";s:2:"ʺ";s:3:"妧";s:2:"Ê»";s:3:"妡";s:2:"ʼ";s:3:"宎";s:2:"ʽ";s:3:"å®’";s:2:"ʾ";s:3:"å°¨";s:2:"Ê¿";s:3:"å°ª";s:2:"ÊÀ";s:3:"å²";s:2:"ÊÁ";s:3:"å²";s:2:"ÊÂ";s:3:"岈";s:2:"ÊÃ";s:3:"岋";s:2:"ÊÄ";s:3:"岉";s:2:"ÊÅ";s:3:"å²’";s:2:"ÊÆ";s:3:"岊";s:2:"ÊÇ";s:3:"岆";s:2:"ÊÈ";s:3:"岓";s:2:"ÊÉ";s:3:"岕";s:2:"ÊÊ";s:3:"å· ";s:2:"ÊË";s:3:"帊";s:2:"ÊÌ";s:3:"帎";s:2:"ÊÍ";s:3:"庋";s:2:"ÊÎ";s:3:"庉";s:2:"ÊÏ";s:3:"庌";s:2:"ÊÐ";s:3:"庈";s:2:"ÊÑ";s:3:"åº";s:2:"ÊÒ";s:3:"å¼…";s:2:"ÊÓ";s:3:"å¼";s:2:"ÊÔ";s:3:"彸";s:2:"ÊÕ";s:3:"å½¶";s:2:"ÊÖ";s:3:"å¿’";s:2:"Ê×";s:3:"å¿‘";s:2:"ÊØ";s:3:"å¿";s:2:"ÊÙ";s:3:"å¿­";s:2:"ÊÚ";s:3:"忨";s:2:"ÊÛ";s:3:"å¿®";s:2:"ÊÜ";s:3:"忳";s:2:"ÊÝ";s:3:"å¿¡";s:2:"ÊÞ";s:3:"忤";s:2:"Êß";s:3:"å¿£";s:2:"Êà";s:3:"忺";s:2:"Êá";s:3:"忯";s:2:"Êâ";s:3:"å¿·";s:2:"Êã";s:3:"å¿»";s:2:"Êä";s:3:"怀";s:2:"Êå";s:3:"å¿´";s:2:"Êæ";s:3:"戺";s:2:"Êç";s:3:"抃";s:2:"Êè";s:3:"抌";s:2:"Êé";s:3:"抎";s:2:"Êê";s:3:"æŠ";s:2:"Êë";s:3:"抔";s:2:"Êì";s:3:"抇";s:2:"Êí";s:3:"扱";s:2:"Êî";s:3:"扻";s:2:"Êï";s:3:"扺";s:2:"Êð";s:3:"扰";s:2:"Êñ";s:3:"æŠ";s:2:"Êò";s:3:"抈";s:2:"Êó";s:3:"扷";s:2:"Êô";s:3:"扽";s:2:"Êõ";s:3:"扲";s:2:"Êö";s:3:"扴";s:2:"Ê÷";s:3:"æ”·";s:2:"Êø";s:3:"æ—°";s:2:"Êù";s:3:"æ—´";s:2:"Êú";s:3:"æ—³";s:2:"Êû";s:3:"æ—²";s:2:"Êü";s:3:"æ—µ";s:2:"Êý";s:3:"æ…";s:2:"Êþ";s:3:"æ‡";s:2:"Ë@";s:3:"æ™";s:2:"ËA";s:3:"æ•";s:2:"ËB";s:3:"æŒ";s:2:"ËC";s:3:"æˆ";s:2:"ËD";s:3:"æ";s:2:"ËE";s:3:"æ";s:2:"ËF";s:3:"æš";s:2:"ËG";s:3:"æ‹";s:2:"ËH";s:3:"æ¯";s:2:"ËI";s:3:"æ°™";s:2:"ËJ";s:3:"æ°š";s:2:"ËK";s:3:"汸";s:2:"ËL";s:3:"æ±§";s:2:"ËM";s:3:"汫";s:2:"ËN";s:3:"沄";s:2:"ËO";s:3:"沋";s:2:"ËP";s:3:"æ²";s:2:"ËQ";s:3:"æ±±";s:2:"ËR";s:3:"汯";s:2:"ËS";s:3:"汩";s:2:"ËT";s:3:"沚";s:2:"ËU";s:3:"æ±­";s:2:"ËV";s:3:"沇";s:2:"ËW";s:3:"沕";s:2:"ËX";s:3:"沜";s:2:"ËY";s:3:"汦";s:2:"ËZ";s:3:"æ±³";s:2:"Ë[";s:3:"æ±¥";s:2:"Ë\";s:3:"æ±»";s:2:"Ë]";s:3:"沎";s:2:"Ë^";s:3:"ç´";s:2:"Ë_";s:3:"çº";s:2:"Ë`";s:3:"牣";s:2:"Ëa";s:3:"犿";s:2:"Ëb";s:3:"犽";s:2:"Ëc";s:3:"狃";s:2:"Ëd";s:3:"狆";s:2:"Ëe";s:3:"ç‹";s:2:"Ëf";s:3:"犺";s:2:"Ëg";s:3:"ç‹…";s:2:"Ëh";s:3:"玕";s:2:"Ëi";s:3:"玗";s:2:"Ëj";s:3:"玓";s:2:"Ëk";s:3:"玔";s:2:"Ël";s:3:"玒";s:2:"Ëm";s:3:"町";s:2:"Ën";s:3:"甹";s:2:"Ëo";s:3:"ç–”";s:2:"Ëp";s:3:"ç–•";s:2:"Ëq";s:3:"çš";s:2:"Ër";s:3:"礽";s:2:"Ës";s:3:"耴";s:2:"Ët";s:3:"è‚•";s:2:"Ëu";s:3:"è‚™";s:2:"Ëv";s:3:"è‚";s:2:"Ëw";s:3:"è‚’";s:2:"Ëx";s:3:"肜";s:2:"Ëy";s:3:"èŠ";s:2:"Ëz";s:3:"èŠ";s:2:"Ë{";s:3:"芅";s:2:"Ë|";s:3:"芎";s:2:"Ë}";s:3:"芑";s:2:"Ë~";s:3:"芓";s:2:"Ë¡";s:3:"芊";s:2:"Ë¢";s:3:"芃";s:2:"Ë£";s:3:"芄";s:2:"ˤ";s:3:"豸";s:2:"Ë¥";s:3:"迉";s:2:"˦";s:3:"辿";s:2:"˧";s:3:"邟";s:2:"˨";s:3:"é‚¡";s:2:"Ë©";s:3:"é‚¥";s:2:"˪";s:3:"邞";s:2:"Ë«";s:3:"é‚§";s:2:"ˬ";s:3:"é‚ ";s:2:"Ë­";s:3:"阰";s:2:"Ë®";s:3:"阨";s:2:"˯";s:3:"阯";s:2:"˰";s:3:"阭";s:2:"˱";s:3:"丳";s:2:"˲";s:3:"侘";s:2:"˳";s:3:"ä½¼";s:2:"Ë´";s:3:"ä¾…";s:2:"˵";s:3:"ä½½";s:2:"˶";s:3:"ä¾€";s:2:"Ë·";s:3:"侇";s:2:"˸";s:3:"ä½¶";s:2:"˹";s:3:"ä½´";s:2:"˺";s:3:"侉";s:2:"Ë»";s:3:"侄";s:2:"˼";s:3:"ä½·";s:2:"˽";s:3:"佌";s:2:"˾";s:3:"ä¾—";s:2:"Ë¿";s:3:"佪";s:2:"ËÀ";s:3:"侚";s:2:"ËÁ";s:3:"ä½¹";s:2:"ËÂ";s:3:"ä¾";s:2:"ËÃ";s:3:"佸";s:2:"ËÄ";s:3:"ä¾";s:2:"ËÅ";s:3:"侜";s:2:"ËÆ";s:3:"ä¾”";s:2:"ËÇ";s:3:"侞";s:2:"ËÈ";s:3:"ä¾’";s:2:"ËÉ";s:3:"侂";s:2:"ËÊ";s:3:"侕";s:2:"ËË";s:3:"佫";s:2:"ËÌ";s:3:"ä½®";s:2:"ËÍ";s:3:"冞";s:2:"ËÎ";s:3:"冼";s:2:"ËÏ";s:3:"冾";s:2:"ËÐ";s:3:"刵";s:2:"ËÑ";s:3:"刲";s:2:"ËÒ";s:3:"刳";s:2:"ËÓ";s:3:"剆";s:2:"ËÔ";s:3:"刱";s:2:"ËÕ";s:3:"劼";s:2:"ËÖ";s:3:"匊";s:2:"Ë×";s:3:"匋";s:2:"ËØ";s:3:"匼";s:2:"ËÙ";s:3:"厒";s:2:"ËÚ";s:3:"厔";s:2:"ËÛ";s:3:"å’‡";s:2:"ËÜ";s:3:"å‘¿";s:2:"ËÝ";s:3:"å’";s:2:"ËÞ";s:3:"å’‘";s:2:"Ëß";s:3:"å’‚";s:2:"Ëà";s:3:"å’ˆ";s:2:"Ëá";s:3:"å‘«";s:2:"Ëâ";s:3:"呺";s:2:"Ëã";s:3:"呾";s:2:"Ëä";s:3:"å‘¥";s:2:"Ëå";s:3:"呬";s:2:"Ëæ";s:3:"å‘´";s:2:"Ëç";s:3:"呦";s:2:"Ëè";s:3:"å’";s:2:"Ëé";s:3:"呯";s:2:"Ëê";s:3:"å‘¡";s:2:"Ëë";s:3:"å‘ ";s:2:"Ëì";s:3:"å’˜";s:2:"Ëí";s:3:"å‘£";s:2:"Ëî";s:3:"å‘§";s:2:"Ëï";s:3:"呤";s:2:"Ëð";s:3:"å›·";s:2:"Ëñ";s:3:"囹";s:2:"Ëò";s:3:"å¯";s:2:"Ëó";s:3:"å²";s:2:"Ëô";s:3:"å­";s:2:"Ëõ";s:3:"å«";s:2:"Ëö";s:3:"å±";s:2:"Ë÷";s:3:"å°";s:2:"Ëø";s:3:"å¶";s:2:"Ëù";s:3:"垀";s:2:"Ëú";s:3:"åµ";s:2:"Ëû";s:3:"å»";s:2:"Ëü";s:3:"å³";s:2:"Ëý";s:3:"å´";s:2:"Ëþ";s:3:"å¢";s:2:"Ì@";s:3:"å¨";s:2:"ÌA";s:3:"å½";s:2:"ÌB";s:3:"夌";s:2:"ÌC";s:3:"奅";s:2:"ÌD";s:3:"妵";s:2:"ÌE";s:3:"妺";s:2:"ÌF";s:3:"å§";s:2:"ÌG";s:3:"å§Ž";s:2:"ÌH";s:3:"妲";s:2:"ÌI";s:3:"å§Œ";s:2:"ÌJ";s:3:"å§";s:2:"ÌK";s:3:"妶";s:2:"ÌL";s:3:"妼";s:2:"ÌM";s:3:"姃";s:2:"ÌN";s:3:"å§–";s:2:"ÌO";s:3:"妱";s:2:"ÌP";s:3:"妽";s:2:"ÌQ";s:3:"å§€";s:2:"ÌR";s:3:"姈";s:2:"ÌS";s:3:"妴";s:2:"ÌT";s:3:"姇";s:2:"ÌU";s:3:"å­¢";s:2:"ÌV";s:3:"å­¥";s:2:"ÌW";s:3:"宓";s:2:"ÌX";s:3:"宕";s:2:"ÌY";s:3:"屄";s:2:"ÌZ";s:3:"屇";s:2:"Ì[";s:3:"å²®";s:2:"Ì\";s:3:"岤";s:2:"Ì]";s:3:"å² ";s:2:"Ì^";s:3:"å²µ";s:2:"Ì_";s:3:"岯";s:2:"Ì`";s:3:"岨";s:2:"Ìa";s:3:"岬";s:2:"Ìb";s:3:"岟";s:2:"Ìc";s:3:"å²£";s:2:"Ìd";s:3:"å²­";s:2:"Ìe";s:3:"å²¢";s:2:"Ìf";s:3:"岪";s:2:"Ìg";s:3:"å²§";s:2:"Ìh";s:3:"å²";s:2:"Ìi";s:3:"å²¥";s:2:"Ìj";s:3:"å²¶";s:2:"Ìk";s:3:"å²°";s:2:"Ìl";s:3:"岦";s:2:"Ìm";s:3:"帗";s:2:"Ìn";s:3:"帔";s:2:"Ìo";s:3:"帙";s:2:"Ìp";s:3:"弨";s:2:"Ìq";s:3:"å¼¢";s:2:"Ìr";s:3:"å¼£";s:2:"Ìs";s:3:"弤";s:2:"Ìt";s:3:"å½”";s:2:"Ìu";s:3:"徂";s:2:"Ìv";s:3:"å½¾";s:2:"Ìw";s:3:"å½½";s:2:"Ìx";s:3:"忞";s:2:"Ìy";s:3:"å¿¥";s:2:"Ìz";s:3:"怭";s:2:"Ì{";s:3:"怦";s:2:"Ì|";s:3:"怙";s:2:"Ì}";s:3:"怲";s:2:"Ì~";s:3:"怋";s:2:"Ì¡";s:3:"怴";s:2:"Ì¢";s:3:"怊";s:2:"Ì£";s:3:"怗";s:2:"̤";s:3:"怳";s:2:"Ì¥";s:3:"怚";s:2:"̦";s:3:"怞";s:2:"̧";s:3:"怬";s:2:"̨";s:3:"怢";s:2:"Ì©";s:3:"æ€";s:2:"̪";s:3:"æ€";s:2:"Ì«";s:3:"怮";s:2:"̬";s:3:"怓";s:2:"Ì­";s:3:"怑";s:2:"Ì®";s:3:"怌";s:2:"̯";s:3:"怉";s:2:"̰";s:3:"怜";s:2:"̱";s:3:"戔";s:2:"̲";s:3:"戽";s:2:"̳";s:3:"抭";s:2:"Ì´";s:3:"抴";s:2:"̵";s:3:"æ‹‘";s:2:"̶";s:3:"抾";s:2:"Ì·";s:3:"抪";s:2:"̸";s:3:"抶";s:2:"̹";s:3:"拊";s:2:"̺";s:3:"抮";s:2:"Ì»";s:3:"抳";s:2:"̼";s:3:"抯";s:2:"̽";s:3:"抻";s:2:"̾";s:3:"抩";s:2:"Ì¿";s:3:"抰";s:2:"ÌÀ";s:3:"抸";s:2:"ÌÁ";s:3:"攽";s:2:"ÌÂ";s:3:"æ–¨";s:2:"ÌÃ";s:3:"æ–»";s:2:"ÌÄ";s:3:"昉";s:2:"ÌÅ";s:3:"æ—¼";s:2:"ÌÆ";s:3:"昄";s:2:"ÌÇ";s:3:"昒";s:2:"ÌÈ";s:3:"昈";s:2:"ÌÉ";s:3:"æ—»";s:2:"ÌÊ";s:3:"昃";s:2:"ÌË";s:3:"昋";s:2:"ÌÌ";s:3:"æ˜";s:2:"ÌÍ";s:3:"昅";s:2:"ÌÎ";s:3:"æ—½";s:2:"ÌÏ";s:3:"昑";s:2:"ÌÐ";s:3:"æ˜";s:2:"ÌÑ";s:3:"æ›¶";s:2:"ÌÒ";s:3:"朊";s:2:"ÌÓ";s:3:"æž…";s:2:"ÌÔ";s:3:"æ¬";s:2:"ÌÕ";s:3:"枎";s:2:"ÌÖ";s:3:"æž’";s:2:"Ì×";s:3:"æ¶";s:2:"ÌØ";s:3:"æ»";s:2:"ÌÙ";s:3:"枘";s:2:"ÌÚ";s:3:"枆";s:2:"ÌÛ";s:3:"æž„";s:2:"ÌÜ";s:3:"æ´";s:2:"ÌÝ";s:3:"æž";s:2:"ÌÞ";s:3:"枌";s:2:"Ìß";s:3:"æº";s:2:"Ìà";s:3:"枟";s:2:"Ìá";s:3:"æž‘";s:2:"Ìâ";s:3:"æž™";s:2:"Ìã";s:3:"枃";s:2:"Ìä";s:3:"æ½";s:2:"Ìå";s:3:"æž";s:2:"Ìæ";s:3:"æ¸";s:2:"Ìç";s:3:"æ¹";s:2:"Ìè";s:3:"æž”";s:2:"Ìé";s:3:"欥";s:2:"Ìê";s:3:"殀";s:2:"Ìë";s:3:"æ­¾";s:2:"Ìì";s:3:"毞";s:2:"Ìí";s:3:"æ°";s:2:"Ìî";s:3:"沓";s:2:"Ìï";s:3:"泬";s:2:"Ìð";s:3:"泫";s:2:"Ìñ";s:3:"æ³®";s:2:"Ìò";s:3:"æ³™";s:2:"Ìó";s:3:"æ²¶";s:2:"Ìô";s:3:"æ³”";s:2:"Ìõ";s:3:"æ²­";s:2:"Ìö";s:3:"æ³§";s:2:"Ì÷";s:3:"æ²·";s:2:"Ìø";s:3:"æ³";s:2:"Ìù";s:3:"泂";s:2:"Ìú";s:3:"沺";s:2:"Ìû";s:3:"泃";s:2:"Ìü";s:3:"泆";s:2:"Ìý";s:3:"æ³­";s:2:"Ìþ";s:3:"æ³²";s:2:"Í@";s:3:"æ³’";s:2:"ÍA";s:3:"æ³";s:2:"ÍB";s:3:"æ²´";s:2:"ÍC";s:3:"沊";s:2:"ÍD";s:3:"æ²";s:2:"ÍE";s:3:"æ²€";s:2:"ÍF";s:3:"泞";s:2:"ÍG";s:3:"æ³€";s:2:"ÍH";s:3:"æ´°";s:2:"ÍI";s:3:"æ³";s:2:"ÍJ";s:3:"泇";s:2:"ÍK";s:3:"æ²°";s:2:"ÍL";s:3:"æ³¹";s:2:"ÍM";s:3:"æ³";s:2:"ÍN";s:3:"泩";s:2:"ÍO";s:3:"泑";s:2:"ÍP";s:3:"ç‚”";s:2:"ÍQ";s:3:"炘";s:2:"ÍR";s:3:"ç‚…";s:2:"ÍS";s:3:"ç‚“";s:2:"ÍT";s:3:"炆";s:2:"ÍU";s:3:"ç‚„";s:2:"ÍV";s:3:"ç‚‘";s:2:"ÍW";s:3:"ç‚–";s:2:"ÍX";s:3:"ç‚‚";s:2:"ÍY";s:3:"炚";s:2:"ÍZ";s:3:"炃";s:2:"Í[";s:3:"牪";s:2:"Í\";s:3:"ç‹–";s:2:"Í]";s:3:"ç‹‹";s:2:"Í^";s:3:"狘";s:2:"Í_";s:3:"狉";s:2:"Í`";s:3:"狜";s:2:"Ía";s:3:"ç‹’";s:2:"Íb";s:3:"ç‹”";s:2:"Íc";s:3:"狚";s:2:"Íd";s:3:"狌";s:2:"Íe";s:3:"ç‹‘";s:2:"Íf";s:3:"玤";s:2:"Íg";s:3:"玡";s:2:"Íh";s:3:"玭";s:2:"Íi";s:3:"玦";s:2:"Íj";s:3:"玢";s:2:"Ík";s:3:"玠";s:2:"Íl";s:3:"玬";s:2:"Ím";s:3:"çŽ";s:2:"Ín";s:3:"ç“";s:2:"Ío";s:3:"瓨";s:2:"Íp";s:3:"甿";s:2:"Íq";s:3:"ç•€";s:2:"Ír";s:3:"甾";s:2:"Ís";s:3:"ç–Œ";s:2:"Ít";s:3:"ç–˜";s:2:"Íu";s:3:"皯";s:2:"Ív";s:3:"盳";s:2:"Íw";s:3:"ç›±";s:2:"Íx";s:3:"ç›°";s:2:"Íy";s:3:"盵";s:2:"Íz";s:3:"矸";s:2:"Í{";s:3:"矼";s:2:"Í|";s:3:"矹";s:2:"Í}";s:3:"矻";s:2:"Í~";s:3:"矺";s:2:"Í¡";s:3:"矷";s:2:"Í¢";s:3:"祂";s:2:"Í£";s:3:"礿";s:2:"ͤ";s:3:"ç§…";s:2:"Í¥";s:3:"穸";s:2:"ͦ";s:3:"ç©»";s:2:"ͧ";s:3:"ç«»";s:2:"ͨ";s:3:"ç±µ";s:2:"Í©";s:3:"ç³½";s:2:"ͪ";s:3:"耵";s:2:"Í«";s:3:"è‚";s:2:"ͬ";s:3:"è‚®";s:2:"Í­";s:3:"è‚£";s:2:"Í®";s:3:"肸";s:2:"ͯ";s:3:"肵";s:2:"Ͱ";s:3:"è‚­";s:2:"ͱ";s:3:"舠";s:2:"Ͳ";s:3:"芠";s:2:"ͳ";s:3:"è‹€";s:2:"Í´";s:3:"芫";s:2:"͵";s:3:"芚";s:2:"Ͷ";s:3:"芘";s:2:"Í·";s:3:"芛";s:2:"͸";s:3:"芵";s:2:"͹";s:3:"芧";s:2:"ͺ";s:3:"芮";s:2:"Í»";s:3:"芼";s:2:"ͼ";s:3:"芞";s:2:"ͽ";s:3:"芺";s:2:";";s:3:"芴";s:2:"Í¿";s:3:"芨";s:2:"ÍÀ";s:3:"芡";s:2:"ÍÁ";s:3:"芩";s:2:"ÍÂ";s:3:"è‹‚";s:2:"ÍÃ";s:3:"芤";s:2:"ÍÄ";s:3:"苃";s:2:"ÍÅ";s:3:"芶";s:2:"ÍÆ";s:3:"芢";s:2:"ÍÇ";s:3:"è™°";s:2:"ÍÈ";s:3:"虯";s:2:"ÍÉ";s:3:"è™­";s:2:"ÍÊ";s:3:"è™®";s:2:"ÍË";s:3:"è±–";s:2:"ÍÌ";s:3:"è¿’";s:2:"ÍÍ";s:3:"è¿‹";s:2:"ÍÎ";s:3:"è¿“";s:2:"ÍÏ";s:3:"è¿";s:2:"ÍÐ";s:3:"è¿–";s:2:"ÍÑ";s:3:"è¿•";s:2:"ÍÒ";s:3:"è¿—";s:2:"ÍÓ";s:3:"邲";s:2:"ÍÔ";s:3:"é‚´";s:2:"ÍÕ";s:3:"邯";s:2:"ÍÖ";s:3:"邳";s:2:"Í×";s:3:"é‚°";s:2:"ÍØ";s:3:"阹";s:2:"ÍÙ";s:3:"阽";s:2:"ÍÚ";s:3:"阼";s:2:"ÍÛ";s:3:"阺";s:2:"ÍÜ";s:3:"陃";s:2:"ÍÝ";s:3:"ä¿";s:2:"ÍÞ";s:3:"ä¿…";s:2:"Íß";s:3:"ä¿“";s:2:"Íà";s:3:"ä¾²";s:2:"Íá";s:3:"俉";s:2:"Íâ";s:3:"ä¿‹";s:2:"Íã";s:3:"ä¿";s:2:"Íä";s:3:"ä¿”";s:2:"Íå";s:3:"俜";s:2:"Íæ";s:3:"ä¿™";s:2:"Íç";s:3:"ä¾»";s:2:"Íè";s:3:"ä¾³";s:2:"Íé";s:3:"ä¿›";s:2:"Íê";s:3:"俇";s:2:"Íë";s:3:"ä¿–";s:2:"Íì";s:3:"侺";s:2:"Íí";s:3:"ä¿€";s:2:"Íî";s:3:"ä¾¹";s:2:"Íï";s:3:"俬";s:2:"Íð";s:3:"剄";s:2:"Íñ";s:3:"剉";s:2:"Íò";s:3:"å‹€";s:2:"Íó";s:3:"å‹‚";s:2:"Íô";s:3:"匽";s:2:"Íõ";s:3:"å¼";s:2:"Íö";s:3:"厗";s:2:"Í÷";s:3:"厖";s:2:"Íø";s:3:"厙";s:2:"Íù";s:3:"厘";s:2:"Íú";s:3:"å’º";s:2:"Íû";s:3:"å’¡";s:2:"Íü";s:3:"å’­";s:2:"Íý";s:3:"å’¥";s:2:"Íþ";s:3:"å“";s:2:"Î@";s:3:"哃";s:2:"ÎA";s:3:"èŒ";s:2:"ÎB";s:3:"å’·";s:2:"ÎC";s:3:"å’®";s:2:"ÎD";s:3:"å“–";s:2:"ÎE";s:3:"å’¶";s:2:"ÎF";s:3:"å“…";s:2:"ÎG";s:3:"哆";s:2:"ÎH";s:3:"å’ ";s:2:"ÎI";s:3:"å‘°";s:2:"ÎJ";s:3:"å’¼";s:2:"ÎK";s:3:"å’¢";s:2:"ÎL";s:3:"å’¾";s:2:"ÎM";s:3:"呲";s:2:"ÎN";s:3:"哞";s:2:"ÎO";s:3:"å’°";s:2:"ÎP";s:3:"åžµ";s:2:"ÎQ";s:3:"åžž";s:2:"ÎR";s:3:"垟";s:2:"ÎS";s:3:"垤";s:2:"ÎT";s:3:"垌";s:2:"ÎU";s:3:"åž—";s:2:"ÎV";s:3:"åž";s:2:"ÎW";s:3:"åž›";s:2:"ÎX";s:3:"åž”";s:2:"ÎY";s:3:"垘";s:2:"ÎZ";s:3:"åž";s:2:"Î[";s:3:"åž™";s:2:"Î\";s:3:"垥";s:2:"Î]";s:3:"åžš";s:2:"Î^";s:3:"åž•";s:2:"Î_";s:3:"壴";s:2:"Î`";s:3:"å¤";s:2:"Îa";s:3:"奓";s:2:"Îb";s:3:"å§¡";s:2:"Îc";s:3:"å§ž";s:2:"Îd";s:3:"å§®";s:2:"Îe";s:3:"娀";s:2:"Îf";s:3:"å§±";s:2:"Îg";s:3:"å§";s:2:"Îh";s:3:"姺";s:2:"Îi";s:3:"å§½";s:2:"Îj";s:3:"å§¼";s:2:"Îk";s:3:"å§¶";s:2:"Îl";s:3:"姤";s:2:"Îm";s:3:"å§²";s:2:"În";s:3:"å§·";s:2:"Îo";s:3:"å§›";s:2:"Îp";s:3:"å§©";s:2:"Îq";s:3:"å§³";s:2:"Îr";s:3:"å§µ";s:2:"Îs";s:3:"å§ ";s:2:"Ît";s:3:"å§¾";s:2:"Îu";s:3:"å§´";s:2:"Îv";s:3:"å§­";s:2:"Îw";s:3:"宨";s:2:"Îx";s:3:"屌";s:2:"Îy";s:3:"å³";s:2:"Îz";s:3:"峘";s:2:"Î{";s:3:"峌";s:2:"Î|";s:3:"å³—";s:2:"Î}";s:3:"峋";s:2:"Î~";s:3:"å³›";s:2:"Ρ";s:3:"峞";s:2:"΢";s:3:"峚";s:2:"Σ";s:3:"峉";s:2:"Τ";s:3:"峇";s:2:"Î¥";s:3:"峊";s:2:"Φ";s:3:"å³–";s:2:"Χ";s:3:"峓";s:2:"Ψ";s:3:"å³”";s:2:"Ω";s:3:"å³";s:2:"Ϊ";s:3:"峈";s:2:"Ϋ";s:3:"峆";s:2:"ά";s:3:"峎";s:2:"έ";s:3:"峟";s:2:"ή";s:3:"峸";s:2:"ί";s:3:"å·¹";s:2:"ΰ";s:3:"帡";s:2:"α";s:3:"帢";s:2:"β";s:3:"帣";s:2:"γ";s:3:"帠";s:2:"δ";s:3:"帤";s:2:"ε";s:3:"庰";s:2:"ζ";s:3:"庤";s:2:"η";s:3:"庢";s:2:"θ";s:3:"庛";s:2:"ι";s:3:"庣";s:2:"κ";s:3:"庥";s:2:"λ";s:3:"弇";s:2:"μ";s:3:"å¼®";s:2:"ν";s:3:"å½–";s:2:"ξ";s:3:"徆";s:2:"ο";s:3:"怷";s:2:"ÎÀ";s:3:"怹";s:2:"ÎÁ";s:3:"æ”";s:2:"ÎÂ";s:3:"æ²";s:2:"ÎÃ";s:3:"æž";s:2:"ÎÄ";s:3:"æ…";s:2:"ÎÅ";s:3:"æ“";s:2:"ÎÆ";s:3:"æ‡";s:2:"ÎÇ";s:3:"æ‰";s:2:"ÎÈ";s:3:"æ›";s:2:"ÎÉ";s:3:"æŒ";s:2:"ÎÊ";s:3:"æ€";s:2:"ÎË";s:3:"æ‚";s:2:"ÎÌ";s:3:"æŸ";s:2:"ÎÍ";s:3:"怤";s:2:"ÎÎ";s:3:"æ„";s:2:"ÎÏ";s:3:"æ˜";s:2:"ÎÐ";s:3:"æ¦";s:2:"ÎÑ";s:3:"æ®";s:2:"ÎÒ";s:3:"扂";s:2:"ÎÓ";s:3:"扃";s:2:"ÎÔ";s:3:"æ‹";s:2:"ÎÕ";s:3:"æŒ";s:2:"ÎÖ";s:3:"挋";s:2:"Î×";s:3:"拵";s:2:"ÎØ";s:3:"挎";s:2:"ÎÙ";s:3:"挃";s:2:"ÎÚ";s:3:"æ‹«";s:2:"ÎÛ";s:3:"拹";s:2:"ÎÜ";s:3:"æŒ";s:2:"ÎÝ";s:3:"挌";s:2:"ÎÞ";s:3:"拸";s:2:"Îß";s:3:"æ‹¶";s:2:"Îà";s:3:"挀";s:2:"Îá";s:3:"挓";s:2:"Îâ";s:3:"挔";s:2:"Îã";s:3:"拺";s:2:"Îä";s:3:"挕";s:2:"Îå";s:3:"æ‹»";s:2:"Îæ";s:3:"æ‹°";s:2:"Îç";s:3:"æ•";s:2:"Îè";s:3:"敃";s:2:"Îé";s:3:"æ–ª";s:2:"Îê";s:3:"æ–¿";s:2:"Îë";s:3:"昶";s:2:"Îì";s:3:"昡";s:2:"Îí";s:3:"昲";s:2:"Îî";s:3:"昵";s:2:"Îï";s:3:"昜";s:2:"Îð";s:3:"昦";s:2:"Îñ";s:3:"昢";s:2:"Îò";s:3:"昳";s:2:"Îó";s:3:"昫";s:2:"Îô";s:3:"昺";s:2:"Îõ";s:3:"æ˜";s:2:"Îö";s:3:"昴";s:2:"Î÷";s:3:"昹";s:2:"Îø";s:3:"昮";s:2:"Îù";s:3:"æœ";s:2:"Îú";s:3:"æœ";s:2:"Îû";s:3:"æŸ";s:2:"Îü";s:3:"柲";s:2:"Îý";s:3:"柈";s:2:"Îþ";s:3:"枺";s:2:"Ï@";s:3:"柜";s:2:"ÏA";s:3:"æž»";s:2:"ÏB";s:3:"柸";s:2:"ÏC";s:3:"柘";s:2:"ÏD";s:3:"柀";s:2:"ÏE";s:3:"æž·";s:2:"ÏF";s:3:"柅";s:2:"ÏG";s:3:"柫";s:2:"ÏH";s:3:"柤";s:2:"ÏI";s:3:"柟";s:2:"ÏJ";s:3:"æžµ";s:2:"ÏK";s:3:"æŸ";s:2:"ÏL";s:3:"æž³";s:2:"ÏM";s:3:"柷";s:2:"ÏN";s:3:"柶";s:2:"ÏO";s:3:"柮";s:2:"ÏP";s:3:"柣";s:2:"ÏQ";s:3:"柂";s:2:"ÏR";s:3:"æž¹";s:2:"ÏS";s:3:"柎";s:2:"ÏT";s:3:"柧";s:2:"ÏU";s:3:"柰";s:2:"ÏV";s:3:"æž²";s:2:"ÏW";s:3:"柼";s:2:"ÏX";s:3:"柆";s:2:"ÏY";s:3:"柭";s:2:"ÏZ";s:3:"柌";s:2:"Ï[";s:3:"æž®";s:2:"Ï\";s:3:"柦";s:2:"Ï]";s:3:"柛";s:2:"Ï^";s:3:"柺";s:2:"Ï_";s:3:"柉";s:2:"Ï`";s:3:"柊";s:2:"Ïa";s:3:"柃";s:2:"Ïb";s:3:"柪";s:2:"Ïc";s:3:"柋";s:2:"Ïd";s:3:"欨";s:2:"Ïe";s:3:"殂";s:2:"Ïf";s:3:"殄";s:2:"Ïg";s:3:"æ®¶";s:2:"Ïh";s:3:"毖";s:2:"Ïi";s:3:"毘";s:2:"Ïj";s:3:"毠";s:2:"Ïk";s:3:"æ° ";s:2:"Ïl";s:3:"æ°¡";s:2:"Ïm";s:3:"æ´¨";s:2:"Ïn";s:3:"æ´´";s:2:"Ïo";s:3:"æ´­";s:2:"Ïp";s:3:"æ´Ÿ";s:2:"Ïq";s:3:"æ´¼";s:2:"Ïr";s:3:"æ´¿";s:2:"Ïs";s:3:"æ´’";s:2:"Ït";s:3:"æ´Š";s:2:"Ïu";s:3:"泚";s:2:"Ïv";s:3:"æ´³";s:2:"Ïw";s:3:"æ´„";s:2:"Ïx";s:3:"æ´™";s:2:"Ïy";s:3:"æ´º";s:2:"Ïz";s:3:"æ´š";s:2:"Ï{";s:3:"æ´‘";s:2:"Ï|";s:3:"æ´€";s:2:"Ï}";s:3:"æ´";s:2:"Ï~";s:3:"浂";s:2:"Ï¡";s:3:"æ´";s:2:"Ï¢";s:3:"æ´˜";s:2:"Ï£";s:3:"æ´·";s:2:"Ϥ";s:3:"æ´ƒ";s:2:"Ï¥";s:3:"æ´";s:2:"Ϧ";s:3:"æµ€";s:2:"ϧ";s:3:"æ´‡";s:2:"Ϩ";s:3:"æ´ ";s:2:"Ï©";s:3:"æ´¬";s:2:"Ϫ";s:3:"æ´ˆ";s:2:"Ï«";s:3:"æ´¢";s:2:"Ϭ";s:3:"æ´‰";s:2:"Ï­";s:3:"æ´";s:2:"Ï®";s:3:"ç‚·";s:2:"ϯ";s:3:"炟";s:2:"ϰ";s:3:"炾";s:2:"ϱ";s:3:"炱";s:2:"ϲ";s:3:"ç‚°";s:2:"ϳ";s:3:"ç‚¡";s:2:"Ï´";s:3:"ç‚´";s:2:"ϵ";s:3:"炵";s:2:"϶";s:3:"ç‚©";s:2:"Ï·";s:3:"ç‰";s:2:"ϸ";s:3:"牉";s:2:"Ϲ";s:3:"牊";s:2:"Ϻ";s:3:"牬";s:2:"Ï»";s:3:"牰";s:2:"ϼ";s:3:"牳";s:2:"Ͻ";s:3:"牮";s:2:"Ͼ";s:3:"狊";s:2:"Ï¿";s:3:"狤";s:2:"ÏÀ";s:3:"狨";s:2:"ÏÁ";s:3:"ç‹«";s:2:"ÏÂ";s:3:"狟";s:2:"ÏÃ";s:3:"狪";s:2:"ÏÄ";s:3:"狦";s:2:"ÏÅ";s:3:"ç‹£";s:2:"ÏÆ";s:3:"玅";s:2:"ÏÇ";s:3:"çŒ";s:2:"ÏÈ";s:3:"ç‚";s:2:"ÏÉ";s:3:"çˆ";s:2:"ÏÊ";s:3:"ç…";s:2:"ÏË";s:3:"玹";s:2:"ÏÌ";s:3:"玶";s:2:"ÏÍ";s:3:"玵";s:2:"ÏÎ";s:3:"玴";s:2:"ÏÏ";s:3:"ç«";s:2:"ÏÐ";s:3:"玿";s:2:"ÏÑ";s:3:"ç‡";s:2:"ÏÒ";s:3:"玾";s:2:"ÏÓ";s:3:"çƒ";s:2:"ÏÔ";s:3:"ç†";s:2:"ÏÕ";s:3:"玸";s:2:"ÏÖ";s:3:"ç‹";s:2:"Ï×";s:3:"瓬";s:2:"ÏØ";s:3:"ç“®";s:2:"ÏÙ";s:3:"ç”®";s:2:"ÏÚ";s:3:"畇";s:2:"ÏÛ";s:3:"畈";s:2:"ÏÜ";s:3:"ç–§";s:2:"ÏÝ";s:3:"ç–ª";s:2:"ÏÞ";s:3:"癹";s:2:"Ïß";s:3:"盄";s:2:"Ïà";s:3:"眈";s:2:"Ïá";s:3:"眃";s:2:"Ïâ";s:3:"眄";s:2:"Ïã";s:3:"眅";s:2:"Ïä";s:3:"眊";s:2:"Ïå";s:3:"ç›·";s:2:"Ïæ";s:3:"ç›»";s:2:"Ïç";s:3:"盺";s:2:"Ïè";s:3:"矧";s:2:"Ïé";s:3:"矨";s:2:"Ïê";s:3:"ç †";s:2:"Ïë";s:3:"ç ‘";s:2:"Ïì";s:3:"ç ’";s:2:"Ïí";s:3:"ç …";s:2:"Ïî";s:3:"ç ";s:2:"Ïï";s:3:"ç ";s:2:"Ïð";s:3:"ç Ž";s:2:"Ïñ";s:3:"ç ‰";s:2:"Ïò";s:3:"ç ƒ";s:2:"Ïó";s:3:"ç “";s:2:"Ïô";s:3:"祊";s:2:"Ïõ";s:3:"祌";s:2:"Ïö";s:3:"祋";s:2:"Ï÷";s:3:"祅";s:2:"Ïø";s:3:"祄";s:2:"Ïù";s:3:"ç§•";s:2:"Ïú";s:3:"ç§";s:2:"Ïû";s:3:"ç§";s:2:"Ïü";s:3:"ç§–";s:2:"Ïý";s:3:"ç§Ž";s:2:"Ïþ";s:3:"窀";s:2:"Ð@";s:3:"穾";s:2:"ÐA";s:3:"ç«‘";s:2:"ÐB";s:3:"笀";s:2:"ÐC";s:3:"ç¬";s:2:"ÐD";s:3:"籺";s:2:"ÐE";s:3:"籸";s:2:"ÐF";s:3:"ç±¹";s:2:"ÐG";s:3:"籿";s:2:"ÐH";s:3:"ç²€";s:2:"ÐI";s:3:"ç²";s:2:"ÐJ";s:3:"ç´ƒ";s:2:"ÐK";s:3:"ç´ˆ";s:2:"ÐL";s:3:"ç´";s:2:"ÐM";s:3:"罘";s:2:"ÐN";s:3:"羑";s:2:"ÐO";s:3:"ç¾";s:2:"ÐP";s:3:"ç¾¾";s:2:"ÐQ";s:3:"耇";s:2:"ÐR";s:3:"耎";s:2:"ÐS";s:3:"è€";s:2:"ÐT";s:3:"耔";s:2:"ÐU";s:3:"耷";s:2:"ÐV";s:3:"胘";s:2:"ÐW";s:3:"胇";s:2:"ÐX";s:3:"胠";s:2:"ÐY";s:3:"胑";s:2:"ÐZ";s:3:"胈";s:2:"Ð[";s:3:"胂";s:2:"Ð\";s:3:"èƒ";s:2:"Ð]";s:3:"胅";s:2:"Ð^";s:3:"胣";s:2:"Ð_";s:3:"胙";s:2:"Ð`";s:3:"胜";s:2:"Ða";s:3:"胊";s:2:"Ðb";s:3:"胕";s:2:"Ðc";s:3:"胉";s:2:"Ðd";s:3:"èƒ";s:2:"Ðe";s:3:"胗";s:2:"Ðf";s:3:"胦";s:2:"Ðg";s:3:"èƒ";s:2:"Ðh";s:3:"臿";s:2:"Ði";s:3:"舡";s:2:"Ðj";s:3:"芔";s:2:"Ðk";s:3:"è‹™";s:2:"Ðl";s:3:"苾";s:2:"Ðm";s:3:"苹";s:2:"Ðn";s:3:"茇";s:2:"Ðo";s:3:"苨";s:2:"Ðp";s:3:"茀";s:2:"Ðq";s:3:"è‹•";s:2:"Ðr";s:3:"茺";s:2:"Ðs";s:3:"è‹«";s:2:"Ðt";s:3:"è‹–";s:2:"Ðu";s:3:"è‹´";s:2:"Ðv";s:3:"苬";s:2:"Ðw";s:3:"è‹¡";s:2:"Ðx";s:3:"苲";s:2:"Ðy";s:3:"苵";s:2:"Ðz";s:3:"茌";s:2:"Ð{";s:3:"è‹»";s:2:"Ð|";s:3:"è‹¶";s:2:"Ð}";s:3:"è‹°";s:2:"Ð~";s:3:"苪";s:2:"С";s:3:"苤";s:2:"Т";s:3:"è‹ ";s:2:"У";s:3:"苺";s:2:"Ф";s:3:"苳";s:2:"Ð¥";s:3:"è‹­";s:2:"Ц";s:3:"è™·";s:2:"Ч";s:3:"è™´";s:2:"Ш";s:3:"虼";s:2:"Щ";s:3:"虳";s:2:"Ъ";s:3:"è¡";s:2:"Ы";s:3:"衎";s:2:"Ь";s:3:"è¡§";s:2:"Э";s:3:"衪";s:2:"Ю";s:3:"è¡©";s:2:"Я";s:3:"è§“";s:2:"а";s:3:"訄";s:2:"б";s:3:"訇";s:2:"в";s:3:"èµ²";s:2:"г";s:3:"è¿£";s:2:"д";s:3:"è¿¡";s:2:"е";s:3:"è¿®";s:2:"ж";s:3:"è¿ ";s:2:"з";s:3:"郱";s:2:"и";s:3:"邽";s:2:"й";s:3:"é‚¿";s:2:"к";s:3:"郕";s:2:"л";s:3:"郅";s:2:"м";s:3:"邾";s:2:"н";s:3:"郇";s:2:"о";s:3:"郋";s:2:"п";s:3:"郈";s:2:"ÐÀ";s:3:"釔";s:2:"ÐÁ";s:3:"釓";s:2:"ÐÂ";s:3:"é™”";s:2:"ÐÃ";s:3:"é™";s:2:"ÐÄ";s:3:"陑";s:2:"ÐÅ";s:3:"陓";s:2:"ÐÆ";s:3:"陊";s:2:"ÐÇ";s:3:"陎";s:2:"ÐÈ";s:3:"倞";s:2:"ÐÉ";s:3:"倅";s:2:"ÐÊ";s:3:"倇";s:2:"ÐË";s:3:"倓";s:2:"ÐÌ";s:3:"倢";s:2:"ÐÍ";s:3:"倰";s:2:"ÐÎ";s:3:"倛";s:2:"ÐÏ";s:3:"俵";s:2:"ÐÐ";s:3:"ä¿´";s:2:"ÐÑ";s:3:"倳";s:2:"ÐÒ";s:3:"倷";s:2:"ÐÓ";s:3:"倬";s:2:"ÐÔ";s:3:"ä¿¶";s:2:"ÐÕ";s:3:"ä¿·";s:2:"ÐÖ";s:3:"倗";s:2:"Ð×";s:3:"倜";s:2:"ÐØ";s:3:"倠";s:2:"ÐÙ";s:3:"倧";s:2:"ÐÚ";s:3:"倵";s:2:"ÐÛ";s:3:"倯";s:2:"ÐÜ";s:3:"倱";s:2:"ÐÝ";s:3:"倎";s:2:"ÐÞ";s:3:"å…š";s:2:"Ðß";s:3:"冔";s:2:"Ðà";s:3:"冓";s:2:"Ðá";s:3:"凊";s:2:"Ðâ";s:3:"凄";s:2:"Ðã";s:3:"凅";s:2:"Ðä";s:3:"凈";s:2:"Ðå";s:3:"凎";s:2:"Ðæ";s:3:"剡";s:2:"Ðç";s:3:"剚";s:2:"Ðè";s:3:"剒";s:2:"Ðé";s:3:"剞";s:2:"Ðê";s:3:"剟";s:2:"Ðë";s:3:"剕";s:2:"Ðì";s:3:"剢";s:2:"Ðí";s:3:"å‹";s:2:"Ðî";s:3:"匎";s:2:"Ðï";s:3:"厞";s:2:"Ðð";s:3:"唦";s:2:"Ðñ";s:3:"å“¢";s:2:"Ðò";s:3:"å”—";s:2:"Ðó";s:3:"å”’";s:2:"Ðô";s:3:"å“§";s:2:"Ðõ";s:3:"哳";s:2:"Ðö";s:3:"哤";s:2:"Ð÷";s:3:"唚";s:2:"Ðø";s:3:"å“¿";s:2:"Ðù";s:3:"唄";s:2:"Ðú";s:3:"唈";s:2:"Ðû";s:3:"å“«";s:2:"Ðü";s:3:"唑";s:2:"Ðý";s:3:"å”…";s:2:"Ðþ";s:3:"哱";s:2:"Ñ@";s:3:"唊";s:2:"ÑA";s:3:"å“»";s:2:"ÑB";s:3:"å“·";s:2:"ÑC";s:3:"哸";s:2:"ÑD";s:3:"å“ ";s:2:"ÑE";s:3:"唎";s:2:"ÑF";s:3:"唃";s:2:"ÑG";s:3:"唋";s:2:"ÑH";s:3:"åœ";s:2:"ÑI";s:3:"圂";s:2:"ÑJ";s:3:"埌";s:2:"ÑK";s:3:"å ²";s:2:"ÑL";s:3:"埕";s:2:"ÑM";s:3:"埒";s:2:"ÑN";s:3:"垺";s:2:"ÑO";s:3:"埆";s:2:"ÑP";s:3:"åž½";s:2:"ÑQ";s:3:"åž¼";s:2:"ÑR";s:3:"垸";s:2:"ÑS";s:3:"åž¶";s:2:"ÑT";s:3:"åž¿";s:2:"ÑU";s:3:"埇";s:2:"ÑV";s:3:"åŸ";s:2:"ÑW";s:3:"åž¹";s:2:"ÑX";s:3:"åŸ";s:2:"ÑY";s:3:"夎";s:2:"ÑZ";s:3:"奊";s:2:"Ñ[";s:3:"娙";s:2:"Ñ\";s:3:"娖";s:2:"Ñ]";s:3:"娭";s:2:"Ñ^";s:3:"娮";s:2:"Ñ_";s:3:"娕";s:2:"Ñ`";s:3:"å¨";s:2:"Ña";s:3:"娗";s:2:"Ñb";s:3:"娊";s:2:"Ñc";s:3:"娞";s:2:"Ñd";s:3:"娳";s:2:"Ñe";s:3:"å­¬";s:2:"Ñf";s:3:"å®§";s:2:"Ñg";s:3:"å®­";s:2:"Ñh";s:3:"宬";s:2:"Ñi";s:3:"å°ƒ";s:2:"Ñj";s:3:"å±–";s:2:"Ñk";s:3:"å±”";s:2:"Ñl";s:3:"峬";s:2:"Ñm";s:3:"峿";s:2:"Ñn";s:3:"å³®";s:2:"Ño";s:3:"å³±";s:2:"Ñp";s:3:"å³·";s:2:"Ñq";s:3:"å´€";s:2:"Ñr";s:3:"å³¹";s:2:"Ñs";s:3:"帩";s:2:"Ñt";s:3:"帨";s:2:"Ñu";s:3:"庨";s:2:"Ñv";s:3:"庮";s:2:"Ñw";s:3:"庪";s:2:"Ñx";s:3:"庬";s:2:"Ñy";s:3:"å¼³";s:2:"Ñz";s:3:"å¼°";s:2:"Ñ{";s:3:"å½§";s:2:"Ñ|";s:3:"æ";s:2:"Ñ}";s:3:"æš";s:2:"Ñ~";s:3:"æ§";s:2:"Ñ¡";s:3:"æ";s:2:"Ñ¢";s:3:"æ‚¢";s:2:"Ñ£";s:3:"悈";s:2:"Ѥ";s:3:"æ‚€";s:2:"Ñ¥";s:3:"æ‚’";s:2:"Ѧ";s:3:"æ‚";s:2:"ѧ";s:3:"æ‚";s:2:"Ѩ";s:3:"悃";s:2:"Ñ©";s:3:"æ‚•";s:2:"Ѫ";s:3:"æ‚›";s:2:"Ñ«";s:3:"æ‚—";s:2:"Ѭ";s:3:"悇";s:2:"Ñ­";s:3:"悜";s:2:"Ñ®";s:3:"悎";s:2:"ѯ";s:3:"戙";s:2:"Ѱ";s:3:"扆";s:2:"ѱ";s:3:"拲";s:2:"Ѳ";s:3:"æŒ";s:2:"ѳ";s:3:"æ–";s:2:"Ñ´";s:3:"挬";s:2:"ѵ";s:3:"æ„";s:2:"Ѷ";s:3:"æ…";s:2:"Ñ·";s:3:"挶";s:2:"Ѹ";s:3:"æƒ";s:2:"ѹ";s:3:"æ¤";s:2:"Ѻ";s:3:"挹";s:2:"Ñ»";s:3:"æ‹";s:2:"Ѽ";s:3:"æŠ";s:2:"ѽ";s:3:"挼";s:2:"Ѿ";s:3:"挩";s:2:"Ñ¿";s:3:"æ";s:2:"ÑÀ";s:3:"挴";s:2:"ÑÁ";s:3:"æ˜";s:2:"ÑÂ";s:3:"æ”";s:2:"ÑÃ";s:3:"æ™";s:2:"ÑÄ";s:3:"挭";s:2:"ÑÅ";s:3:"æ‡";s:2:"ÑÆ";s:3:"挳";s:2:"ÑÇ";s:3:"æš";s:2:"ÑÈ";s:3:"æ‘";s:2:"ÑÉ";s:3:"挸";s:2:"ÑÊ";s:3:"æ—";s:2:"ÑË";s:3:"æ€";s:2:"ÑÌ";s:3:"æˆ";s:2:"ÑÍ";s:3:"敊";s:2:"ÑÎ";s:3:"敆";s:2:"ÑÏ";s:3:"æ—†";s:2:"ÑÐ";s:3:"æ—ƒ";s:2:"ÑÑ";s:3:"æ—„";s:2:"ÑÒ";s:3:"æ—‚";s:2:"ÑÓ";s:3:"晊";s:2:"ÑÔ";s:3:"晟";s:2:"ÑÕ";s:3:"晇";s:2:"ÑÖ";s:3:"晑";s:2:"Ñ×";s:3:"朒";s:2:"ÑØ";s:3:"朓";s:2:"ÑÙ";s:3:"æ Ÿ";s:2:"ÑÚ";s:3:"æ š";s:2:"ÑÛ";s:3:"桉";s:2:"ÑÜ";s:3:"æ ²";s:2:"ÑÝ";s:3:"æ ³";s:2:"ÑÞ";s:3:"æ »";s:2:"Ñß";s:3:"æ¡‹";s:2:"Ñà";s:3:"æ¡";s:2:"Ñá";s:3:"æ –";s:2:"Ñâ";s:3:"æ ±";s:2:"Ñã";s:3:"æ œ";s:2:"Ñä";s:3:"æ µ";s:2:"Ñå";s:3:"æ «";s:2:"Ñæ";s:3:"æ ­";s:2:"Ñç";s:3:"æ ¯";s:2:"Ñè";s:3:"桎";s:2:"Ñé";s:3:"æ¡„";s:2:"Ñê";s:3:"æ ´";s:2:"Ñë";s:3:"æ ";s:2:"Ñì";s:3:"æ ’";s:2:"Ñí";s:3:"æ ”";s:2:"Ñî";s:3:"æ ¦";s:2:"Ñï";s:3:"æ ¨";s:2:"Ñð";s:3:"æ ®";s:2:"Ññ";s:3:"æ¡";s:2:"Ñò";s:3:"æ º";s:2:"Ñó";s:3:"æ ¥";s:2:"Ñô";s:3:"æ  ";s:2:"Ñõ";s:3:"欬";s:2:"Ñö";s:3:"欯";s:2:"Ñ÷";s:3:"欭";s:2:"Ñø";s:3:"欱";s:2:"Ñù";s:3:"欴";s:2:"Ñú";s:3:"æ­­";s:2:"Ñû";s:3:"è‚‚";s:2:"Ñü";s:3:"殈";s:2:"Ñý";s:3:"毦";s:2:"Ñþ";s:3:"毤";s:2:"Ò@";s:3:"毨";s:2:"ÒA";s:3:"毣";s:2:"ÒB";s:3:"毢";s:2:"ÒC";s:3:"毧";s:2:"ÒD";s:3:"æ°¥";s:2:"ÒE";s:3:"浺";s:2:"ÒF";s:3:"æµ£";s:2:"ÒG";s:3:"浤";s:2:"ÒH";s:3:"æµ¶";s:2:"ÒI";s:3:"æ´";s:2:"ÒJ";s:3:"浡";s:2:"ÒK";s:3:"æ¶’";s:2:"ÒL";s:3:"浘";s:2:"ÒM";s:3:"æµ¢";s:2:"ÒN";s:3:"æµ­";s:2:"ÒO";s:3:"浯";s:2:"ÒP";s:3:"æ¶‘";s:2:"ÒQ";s:3:"æ¶";s:2:"ÒR";s:3:"æ·¯";s:2:"ÒS";s:3:"浿";s:2:"ÒT";s:3:"涆";s:2:"ÒU";s:3:"浞";s:2:"ÒV";s:3:"æµ§";s:2:"ÒW";s:3:"æµ ";s:2:"ÒX";s:3:"æ¶—";s:2:"ÒY";s:3:"æµ°";s:2:"ÒZ";s:3:"æµ¼";s:2:"Ò[";s:3:"浟";s:2:"Ò\";s:3:"æ¶‚";s:2:"Ò]";s:3:"涘";s:2:"Ò^";s:3:"æ´¯";s:2:"Ò_";s:3:"浨";s:2:"Ò`";s:3:"æ¶‹";s:2:"Òa";s:3:"æµ¾";s:2:"Òb";s:3:"æ¶€";s:2:"Òc";s:3:"æ¶„";s:2:"Òd";s:3:"æ´–";s:2:"Òe";s:3:"涃";s:2:"Òf";s:3:"æµ»";s:2:"Òg";s:3:"æµ½";s:2:"Òh";s:3:"æµµ";s:2:"Òi";s:3:"æ¶";s:2:"Òj";s:3:"烜";s:2:"Òk";s:3:"烓";s:2:"Òl";s:3:"烑";s:2:"Òm";s:3:"çƒ";s:2:"Òn";s:3:"烋";s:2:"Òo";s:3:"ç¼¹";s:2:"Òp";s:3:"烢";s:2:"Òq";s:3:"烗";s:2:"Òr";s:3:"烒";s:2:"Òs";s:3:"烞";s:2:"Òt";s:3:"烠";s:2:"Òu";s:3:"烔";s:2:"Òv";s:3:"çƒ";s:2:"Òw";s:3:"烅";s:2:"Òx";s:3:"烆";s:2:"Òy";s:3:"烇";s:2:"Òz";s:3:"烚";s:2:"Ò{";s:3:"烎";s:2:"Ò|";s:3:"烡";s:2:"Ò}";s:3:"牂";s:2:"Ò~";s:3:"牸";s:2:"Ò¡";s:3:"牷";s:2:"Ò¢";s:3:"牶";s:2:"Ò£";s:3:"猀";s:2:"Ò¤";s:3:"狺";s:2:"Ò¥";s:3:"ç‹´";s:2:"Ò¦";s:3:"狾";s:2:"Ò§";s:3:"ç‹¶";s:2:"Ò¨";s:3:"狳";s:2:"Ò©";s:3:"ç‹»";s:2:"Òª";s:3:"çŒ";s:2:"Ò«";s:3:"ç“";s:2:"Ò¬";s:3:"ç™";s:2:"Ò­";s:3:"ç¥";s:2:"Ò®";s:3:"ç–";s:2:"Ò¯";s:3:"玼";s:2:"Ò°";s:3:"ç§";s:2:"Ò±";s:3:"ç£";s:2:"Ò²";s:3:"ç©";s:2:"Ò³";s:3:"çœ";s:2:"Ò´";s:3:"ç’";s:2:"Òµ";s:3:"ç›";s:2:"Ò¶";s:3:"ç”";s:2:"Ò·";s:3:"ç";s:2:"Ò¸";s:3:"çš";s:2:"Ò¹";s:3:"ç—";s:2:"Òº";s:3:"ç˜";s:2:"Ò»";s:3:"ç¨";s:2:"Ò¼";s:3:"瓞";s:2:"Ò½";s:3:"瓟";s:2:"Ò¾";s:3:"ç“´";s:2:"Ò¿";s:3:"瓵";s:2:"ÒÀ";s:3:"甡";s:2:"ÒÁ";s:3:"ç•›";s:2:"ÒÂ";s:3:"畟";s:2:"ÒÃ";s:3:"ç–°";s:2:"ÒÄ";s:3:"ç—";s:2:"ÒÅ";s:3:"ç–»";s:2:"ÒÆ";s:3:"ç—„";s:2:"ÒÇ";s:3:"ç—€";s:2:"ÒÈ";s:3:"ç–¿";s:2:"ÒÉ";s:3:"ç–¶";s:2:"ÒÊ";s:3:"ç–º";s:2:"ÒË";s:3:"皊";s:2:"ÒÌ";s:3:"盉";s:2:"ÒÍ";s:3:"çœ";s:2:"ÒÎ";s:3:"眛";s:2:"ÒÏ";s:3:"çœ";s:2:"ÒÐ";s:3:"眓";s:2:"ÒÑ";s:3:"眒";s:2:"ÒÒ";s:3:"眣";s:2:"ÒÓ";s:3:"眑";s:2:"ÒÔ";s:3:"眕";s:2:"ÒÕ";s:3:"眙";s:2:"ÒÖ";s:3:"眚";s:2:"Ò×";s:3:"眢";s:2:"ÒØ";s:3:"眧";s:2:"ÒÙ";s:3:"ç £";s:2:"ÒÚ";s:3:"ç ¬";s:2:"ÒÛ";s:3:"ç ¢";s:2:"ÒÜ";s:3:"ç µ";s:2:"ÒÝ";s:3:"ç ¯";s:2:"ÒÞ";s:3:"ç ¨";s:2:"Òß";s:3:"ç ®";s:2:"Òà";s:3:"ç «";s:2:"Òá";s:3:"ç ¡";s:2:"Òâ";s:3:"ç ©";s:2:"Òã";s:3:"ç ³";s:2:"Òä";s:3:"ç ª";s:2:"Òå";s:3:"ç ±";s:2:"Òæ";s:3:"祔";s:2:"Òç";s:3:"祛";s:2:"Òè";s:3:"ç¥";s:2:"Òé";s:3:"祜";s:2:"Òê";s:3:"祓";s:2:"Òë";s:3:"祒";s:2:"Òì";s:3:"祑";s:2:"Òí";s:3:"ç§«";s:2:"Òî";s:3:"秬";s:2:"Òï";s:3:"ç§ ";s:2:"Òð";s:3:"ç§®";s:2:"Òñ";s:3:"ç§­";s:2:"Òò";s:3:"秪";s:2:"Òó";s:3:"ç§œ";s:2:"Òô";s:3:"ç§ž";s:2:"Òõ";s:3:"ç§";s:2:"Òö";s:3:"窆";s:2:"Ò÷";s:3:"窉";s:2:"Òø";s:3:"窅";s:2:"Òù";s:3:"窋";s:2:"Òú";s:3:"窌";s:2:"Òû";s:3:"窊";s:2:"Òü";s:3:"窇";s:2:"Òý";s:3:"竘";s:2:"Òþ";s:3:"ç¬";s:2:"Ó@";s:3:"笄";s:2:"ÓA";s:3:"笓";s:2:"ÓB";s:3:"笅";s:2:"ÓC";s:3:"ç¬";s:2:"ÓD";s:3:"笈";s:2:"ÓE";s:3:"笊";s:2:"ÓF";s:3:"笎";s:2:"ÓG";s:3:"笉";s:2:"ÓH";s:3:"笒";s:2:"ÓI";s:3:"粄";s:2:"ÓJ";s:3:"粑";s:2:"ÓK";s:3:"粊";s:2:"ÓL";s:3:"粌";s:2:"ÓM";s:3:"粈";s:2:"ÓN";s:3:"ç²";s:2:"ÓO";s:3:"ç²…";s:2:"ÓP";s:3:"ç´ž";s:2:"ÓQ";s:3:"ç´";s:2:"ÓR";s:3:"ç´‘";s:2:"ÓS";s:3:"ç´Ž";s:2:"ÓT";s:3:"ç´˜";s:2:"ÓU";s:3:"ç´–";s:2:"ÓV";s:3:"ç´“";s:2:"ÓW";s:3:"ç´Ÿ";s:2:"ÓX";s:3:"ç´’";s:2:"ÓY";s:3:"ç´";s:2:"ÓZ";s:3:"ç´Œ";s:2:"Ó[";s:3:"罜";s:2:"Ó\";s:3:"罡";s:2:"Ó]";s:3:"罞";s:2:"Ó^";s:3:"ç½ ";s:2:"Ó_";s:3:"ç½";s:2:"Ó`";s:3:"ç½›";s:2:"Óa";s:3:"ç¾–";s:2:"Ób";s:3:"ç¾’";s:2:"Óc";s:3:"翃";s:2:"Ód";s:3:"ç¿‚";s:2:"Óe";s:3:"ç¿€";s:2:"Óf";s:3:"耖";s:2:"Óg";s:3:"耾";s:2:"Óh";s:3:"耹";s:2:"Ói";s:3:"胺";s:2:"Ój";s:3:"胲";s:2:"Ók";s:3:"胹";s:2:"Ól";s:3:"胵";s:2:"Óm";s:3:"è„";s:2:"Ón";s:3:"胻";s:2:"Óo";s:3:"è„€";s:2:"Óp";s:3:"èˆ";s:2:"Óq";s:3:"舯";s:2:"Ór";s:3:"舥";s:2:"Ós";s:3:"茳";s:2:"Ót";s:3:"茭";s:2:"Óu";s:3:"è„";s:2:"Óv";s:3:"茙";s:2:"Ów";s:3:"è‘";s:2:"Óx";s:3:"茥";s:2:"Óy";s:3:"è–";s:2:"Óz";s:3:"茿";s:2:"Ó{";s:3:"è";s:2:"Ó|";s:3:"茦";s:2:"Ó}";s:3:"茜";s:2:"Ó~";s:3:"茢";s:2:"Ó¡";s:3:"è‚";s:2:"Ó¢";s:3:"èŽ";s:2:"Ó£";s:3:"茛";s:2:"Ó¤";s:3:"茪";s:2:"Ó¥";s:3:"茈";s:2:"Ó¦";s:3:"茼";s:2:"Ó§";s:3:"è";s:2:"Ó¨";s:3:"茖";s:2:"Ó©";s:3:"茤";s:2:"Óª";s:3:"茠";s:2:"Ó«";s:3:"茷";s:2:"Ó¬";s:3:"茯";s:2:"Ó­";s:3:"茩";s:2:"Ó®";s:3:"è‡";s:2:"Ó¯";s:3:"è…";s:2:"Ó°";s:3:"èŒ";s:2:"Ó±";s:3:"è“";s:2:"Ó²";s:3:"茞";s:2:"Ó³";s:3:"茬";s:2:"Ó´";s:3:"è‹";s:2:"Óµ";s:3:"茧";s:2:"Ó¶";s:3:"èˆ";s:2:"Ó·";s:3:"虓";s:2:"Ó¸";s:3:"è™’";s:2:"Ó¹";s:3:"蚢";s:2:"Óº";s:3:"蚨";s:2:"Ó»";s:3:"èš–";s:2:"Ó¼";s:3:"èš";s:2:"Ó½";s:3:"èš‘";s:2:"Ó¾";s:3:"èšž";s:2:"Ó¿";s:3:"蚇";s:2:"ÓÀ";s:3:"èš—";s:2:"ÓÁ";s:3:"蚆";s:2:"ÓÂ";s:3:"èš‹";s:2:"ÓÃ";s:3:"èšš";s:2:"ÓÄ";s:3:"èš…";s:2:"ÓÅ";s:3:"蚥";s:2:"ÓÆ";s:3:"èš™";s:2:"ÓÇ";s:3:"èš¡";s:2:"ÓÈ";s:3:"èš§";s:2:"ÓÉ";s:3:"èš•";s:2:"ÓÊ";s:3:"蚘";s:2:"ÓË";s:3:"蚎";s:2:"ÓÌ";s:3:"èš";s:2:"ÓÍ";s:3:"èš";s:2:"ÓÎ";s:3:"èš”";s:2:"ÓÏ";s:3:"衃";s:2:"ÓÐ";s:3:"è¡„";s:2:"ÓÑ";s:3:"è¡­";s:2:"ÓÒ";s:3:"衵";s:2:"ÓÓ";s:3:"è¡¶";s:2:"ÓÔ";s:3:"衲";s:2:"ÓÕ";s:3:"袀";s:2:"ÓÖ";s:3:"衱";s:2:"Ó×";s:3:"è¡¿";s:2:"ÓØ";s:3:"衯";s:2:"ÓÙ";s:3:"袃";s:2:"ÓÚ";s:3:"衾";s:2:"ÓÛ";s:3:"è¡´";s:2:"ÓÜ";s:3:"衼";s:2:"ÓÝ";s:3:"訒";s:2:"ÓÞ";s:3:"豇";s:2:"Óß";s:3:"è±—";s:2:"Óà";s:3:"è±»";s:2:"Óá";s:3:"貤";s:2:"Óâ";s:3:"è²£";s:2:"Óã";s:3:"èµ¶";s:2:"Óä";s:3:"赸";s:2:"Óå";s:3:"è¶µ";s:2:"Óæ";s:3:"è¶·";s:2:"Óç";s:3:"è¶¶";s:2:"Óè";s:3:"軑";s:2:"Óé";s:3:"軓";s:2:"Óê";s:3:"迾";s:2:"Óë";s:3:"迵";s:2:"Óì";s:3:"适";s:2:"Óí";s:3:"è¿¿";s:2:"Óî";s:3:"è¿»";s:2:"Óï";s:3:"逄";s:2:"Óð";s:3:"迼";s:2:"Óñ";s:3:"è¿¶";s:2:"Óò";s:3:"郖";s:2:"Óó";s:3:"郠";s:2:"Óô";s:3:"郙";s:2:"Óõ";s:3:"郚";s:2:"Óö";s:3:"郣";s:2:"Ó÷";s:3:"郟";s:2:"Óø";s:3:"郥";s:2:"Óù";s:3:"郘";s:2:"Óú";s:3:"郛";s:2:"Óû";s:3:"郗";s:2:"Óü";s:3:"郜";s:2:"Óý";s:3:"郤";s:2:"Óþ";s:3:"é…";s:2:"Ô@";s:3:"é…Ž";s:2:"ÔA";s:3:"é…";s:2:"ÔB";s:3:"釕";s:2:"ÔC";s:3:"釢";s:2:"ÔD";s:3:"釚";s:2:"ÔE";s:3:"陜";s:2:"ÔF";s:3:"陟";s:2:"ÔG";s:3:"éš¼";s:2:"ÔH";s:3:"飣";s:2:"ÔI";s:3:"髟";s:2:"ÔJ";s:3:"鬯";s:2:"ÔK";s:3:"乿";s:2:"ÔL";s:3:"å°";s:2:"ÔM";s:3:"åª";s:2:"ÔN";s:3:"å¡";s:2:"ÔO";s:3:"åž";s:2:"ÔP";s:3:"å ";s:2:"ÔQ";s:3:"å“";s:2:"ÔR";s:3:"å‹";s:2:"ÔS";s:3:"å";s:2:"ÔT";s:3:"å²";s:2:"ÔU";s:3:"åˆ";s:2:"ÔV";s:3:"å";s:2:"ÔW";s:3:"å";s:2:"ÔX";s:3:"å›";s:2:"ÔY";s:3:"åŠ";s:2:"ÔZ";s:3:"å¢";s:2:"Ô[";s:3:"倕";s:2:"Ô\";s:3:"å…";s:2:"Ô]";s:3:"åŸ";s:2:"Ô^";s:3:"å©";s:2:"Ô_";s:3:"å«";s:2:"Ô`";s:3:"å£";s:2:"Ôa";s:3:"å¤";s:2:"Ôb";s:3:"å†";s:2:"Ôc";s:3:"å€";s:2:"Ôd";s:3:"å®";s:2:"Ôe";s:3:"å³";s:2:"Ôf";s:3:"å—";s:2:"Ôg";s:3:"å‘";s:2:"Ôh";s:3:"å‡";s:2:"Ôi";s:3:"剫";s:2:"Ôj";s:3:"剭";s:2:"Ôk";s:3:"剬";s:2:"Ôl";s:3:"剮";s:2:"Ôm";s:3:"å‹–";s:2:"Ôn";s:3:"å‹“";s:2:"Ôo";s:3:"匭";s:2:"Ôp";s:3:"厜";s:2:"Ôq";s:3:"啵";s:2:"Ôr";s:3:"å•¶";s:2:"Ôs";s:3:"唼";s:2:"Ôt";s:3:"å•";s:2:"Ôu";s:3:"å•";s:2:"Ôv";s:3:"å”´";s:2:"Ôw";s:3:"唪";s:2:"Ôx";s:3:"å•‘";s:2:"Ôy";s:3:"å•¢";s:2:"Ôz";s:3:"å”¶";s:2:"Ô{";s:3:"唵";s:2:"Ô|";s:3:"å”°";s:2:"Ô}";s:3:"å•’";s:2:"Ô~";s:3:"å•…";s:2:"Ô¡";s:3:"唌";s:2:"Ô¢";s:3:"唲";s:2:"Ô£";s:3:"å•¥";s:2:"Ô¤";s:3:"啎";s:2:"Ô¥";s:3:"唹";s:2:"Ô¦";s:3:"啈";s:2:"Ô§";s:3:"å”­";s:2:"Ô¨";s:3:"å”»";s:2:"Ô©";s:3:"å•€";s:2:"Ôª";s:3:"å•‹";s:2:"Ô«";s:3:"圊";s:2:"Ô¬";s:3:"圇";s:2:"Ô­";s:3:"埻";s:2:"Ô®";s:3:"å ”";s:2:"Ô¯";s:3:"埢";s:2:"Ô°";s:3:"埶";s:2:"Ô±";s:3:"埜";s:2:"Ô²";s:3:"埴";s:2:"Ô³";s:3:"å €";s:2:"Ô´";s:3:"埭";s:2:"Ôµ";s:3:"埽";s:2:"Ô¶";s:3:"å ˆ";s:2:"Ô·";s:3:"埸";s:2:"Ô¸";s:3:"å ‹";s:2:"Ô¹";s:3:"埳";s:2:"Ôº";s:3:"åŸ";s:2:"Ô»";s:3:"å ‡";s:2:"Ô¼";s:3:"埮";s:2:"Ô½";s:3:"埣";s:2:"Ô¾";s:3:"埲";s:2:"Ô¿";s:3:"埥";s:2:"ÔÀ";s:3:"埬";s:2:"ÔÁ";s:3:"埡";s:2:"ÔÂ";s:3:"å Ž";s:2:"ÔÃ";s:3:"埼";s:2:"ÔÄ";s:3:"å ";s:2:"ÔÅ";s:3:"埧";s:2:"ÔÆ";s:3:"å ";s:2:"ÔÇ";s:3:"å Œ";s:2:"ÔÈ";s:3:"埱";s:2:"ÔÉ";s:3:"埩";s:2:"ÔÊ";s:3:"埰";s:2:"ÔË";s:3:"å ";s:2:"ÔÌ";s:3:"å „";s:2:"ÔÍ";s:3:"奜";s:2:"ÔÎ";s:3:"å© ";s:2:"ÔÏ";s:3:"婘";s:2:"ÔÐ";s:3:"å©•";s:2:"ÔÑ";s:3:"å©§";s:2:"ÔÒ";s:3:"婞";s:2:"ÔÓ";s:3:"娸";s:2:"ÔÔ";s:3:"娵";s:2:"ÔÕ";s:3:"å©­";s:2:"ÔÖ";s:3:"å©";s:2:"Ô×";s:3:"婟";s:2:"ÔØ";s:3:"å©¥";s:2:"ÔÙ";s:3:"婬";s:2:"ÔÚ";s:3:"å©“";s:2:"ÔÛ";s:3:"婤";s:2:"ÔÜ";s:3:"å©—";s:2:"ÔÝ";s:3:"婃";s:2:"ÔÞ";s:3:"å©";s:2:"Ôß";s:3:"å©’";s:2:"Ôà";s:3:"å©„";s:2:"Ôá";s:3:"å©›";s:2:"Ôâ";s:3:"婈";s:2:"Ôã";s:3:"媎";s:2:"Ôä";s:3:"娾";s:2:"Ôå";s:3:"å©";s:2:"Ôæ";s:3:"娹";s:2:"Ôç";s:3:"婌";s:2:"Ôè";s:3:"å©°";s:2:"Ôé";s:3:"å©©";s:2:"Ôê";s:3:"婇";s:2:"Ôë";s:3:"å©‘";s:2:"Ôì";s:3:"å©–";s:2:"Ôí";s:3:"å©‚";s:2:"Ôî";s:3:"婜";s:2:"Ôï";s:3:"å­²";s:2:"Ôð";s:3:"å­®";s:2:"Ôñ";s:3:"å¯";s:2:"Ôò";s:3:"寀";s:2:"Ôó";s:3:"å±™";s:2:"Ôô";s:3:"å´ž";s:2:"Ôõ";s:3:"å´‹";s:2:"Ôö";s:3:"å´";s:2:"Ô÷";s:3:"å´š";s:2:"Ôø";s:3:"å´ ";s:2:"Ôù";s:3:"å´Œ";s:2:"Ôú";s:3:"å´¨";s:2:"Ôû";s:3:"å´";s:2:"Ôü";s:3:"å´¦";s:2:"Ôý";s:3:"å´¥";s:2:"Ôþ";s:3:"å´";s:2:"Õ@";s:3:"å´°";s:2:"ÕA";s:3:"å´’";s:2:"ÕB";s:3:"å´£";s:2:"ÕC";s:3:"å´Ÿ";s:2:"ÕD";s:3:"å´®";s:2:"ÕE";s:3:"帾";s:2:"ÕF";s:3:"帴";s:2:"ÕG";s:3:"庱";s:2:"ÕH";s:3:"庴";s:2:"ÕI";s:3:"庹";s:2:"ÕJ";s:3:"庲";s:2:"ÕK";s:3:"庳";s:2:"ÕL";s:3:"å¼¶";s:2:"ÕM";s:3:"弸";s:2:"ÕN";s:3:"å¾›";s:2:"ÕO";s:3:"å¾–";s:2:"ÕP";s:3:"徟";s:2:"ÕQ";s:3:"悊";s:2:"ÕR";s:3:"æ‚";s:2:"ÕS";s:3:"悆";s:2:"ÕT";s:3:"悾";s:2:"ÕU";s:3:"æ‚°";s:2:"ÕV";s:3:"悺";s:2:"ÕW";s:3:"惓";s:2:"ÕX";s:3:"惔";s:2:"ÕY";s:3:"æƒ";s:2:"ÕZ";s:3:"惤";s:2:"Õ[";s:3:"惙";s:2:"Õ\";s:3:"æƒ";s:2:"Õ]";s:3:"惈";s:2:"Õ^";s:3:"悱";s:2:"Õ_";s:3:"惛";s:2:"Õ`";s:3:"æ‚·";s:2:"Õa";s:3:"惊";s:2:"Õb";s:3:"æ‚¿";s:2:"Õc";s:3:"惃";s:2:"Õd";s:3:"æƒ";s:2:"Õe";s:3:"惀";s:2:"Õf";s:3:"挲";s:2:"Õg";s:3:"æ¥";s:2:"Õh";s:3:"掊";s:2:"Õi";s:3:"掂";s:2:"Õj";s:3:"æ½";s:2:"Õk";s:3:"掽";s:2:"Õl";s:3:"掞";s:2:"Õm";s:3:"掭";s:2:"Õn";s:3:"æŽ";s:2:"Õo";s:3:"掗";s:2:"Õp";s:3:"掫";s:2:"Õq";s:3:"掎";s:2:"Õr";s:3:"æ¯";s:2:"Õs";s:3:"掇";s:2:"Õt";s:3:"æŽ";s:2:"Õu";s:3:"æ®";s:2:"Õv";s:3:"掯";s:2:"Õw";s:3:"æµ";s:2:"Õx";s:3:"掜";s:2:"Õy";s:3:"æ­";s:2:"Õz";s:3:"掮";s:2:"Õ{";s:3:"æ¼";s:2:"Õ|";s:3:"掤";s:2:"Õ}";s:3:"挻";s:2:"Õ~";s:3:"掟";s:2:"Õ¡";s:3:"æ¸";s:2:"Õ¢";s:3:"掅";s:2:"Õ£";s:3:"æŽ";s:2:"Õ¤";s:3:"掑";s:2:"Õ¥";s:3:"æŽ";s:2:"Õ¦";s:3:"æ°";s:2:"Õ§";s:3:"æ•“";s:2:"Õ¨";s:3:"æ—";s:2:"Õ©";s:3:"晥";s:2:"Õª";s:3:"晡";s:2:"Õ«";s:3:"æ™›";s:2:"Õ¬";s:3:"æ™™";s:2:"Õ­";s:3:"晜";s:2:"Õ®";s:3:"晢";s:2:"Õ¯";s:3:"朘";s:2:"Õ°";s:3:"桹";s:2:"Õ±";s:3:"梇";s:2:"Õ²";s:3:"æ¢";s:2:"Õ³";s:3:"梜";s:2:"Õ´";s:3:"æ¡­";s:2:"Õµ";s:3:"æ¡®";s:2:"Õ¶";s:3:"梮";s:2:"Õ·";s:3:"梫";s:2:"Õ¸";s:3:"楖";s:2:"Õ¹";s:3:"桯";s:2:"Õº";s:3:"梣";s:2:"Õ»";s:3:"梬";s:2:"Õ¼";s:3:"梩";s:2:"Õ½";s:3:"桵";s:2:"Õ¾";s:3:"æ¡´";s:2:"Õ¿";s:3:"梲";s:2:"ÕÀ";s:3:"æ¢";s:2:"ÕÁ";s:3:"æ¡·";s:2:"ÕÂ";s:3:"梒";s:2:"ÕÃ";s:3:"桼";s:2:"ÕÄ";s:3:"æ¡«";s:2:"ÕÅ";s:3:"桲";s:2:"ÕÆ";s:3:"梪";s:2:"ÕÇ";s:3:"梀";s:2:"ÕÈ";s:3:"桱";s:2:"ÕÉ";s:3:"桾";s:2:"ÕÊ";s:3:"梛";s:2:"ÕË";s:3:"梖";s:2:"ÕÌ";s:3:"梋";s:2:"ÕÍ";s:3:"梠";s:2:"ÕÎ";s:3:"梉";s:2:"ÕÏ";s:3:"梤";s:2:"ÕÐ";s:3:"桸";s:2:"ÕÑ";s:3:"æ¡»";s:2:"ÕÒ";s:3:"梑";s:2:"ÕÓ";s:3:"梌";s:2:"ÕÔ";s:3:"梊";s:2:"ÕÕ";s:3:"桽";s:2:"ÕÖ";s:3:"欶";s:2:"Õ×";s:3:"欳";s:2:"ÕØ";s:3:"欷";s:2:"ÕÙ";s:3:"欸";s:2:"ÕÚ";s:3:"殑";s:2:"ÕÛ";s:3:"æ®";s:2:"ÕÜ";s:3:"æ®";s:2:"ÕÝ";s:3:"殎";s:2:"ÕÞ";s:3:"殌";s:2:"Õß";s:3:"æ°ª";s:2:"Õà";s:3:"æ·€";s:2:"Õá";s:3:"æ¶«";s:2:"Õâ";s:3:"æ¶´";s:2:"Õã";s:3:"æ¶³";s:2:"Õä";s:3:"æ¹´";s:2:"Õå";s:3:"涬";s:2:"Õæ";s:3:"æ·©";s:2:"Õç";s:3:"æ·¢";s:2:"Õè";s:3:"æ¶·";s:2:"Õé";s:3:"æ·¶";s:2:"Õê";s:3:"æ·”";s:2:"Õë";s:3:"渀";s:2:"Õì";s:3:"æ·ˆ";s:2:"Õí";s:3:"æ· ";s:2:"Õî";s:3:"æ·Ÿ";s:2:"Õï";s:3:"æ·–";s:2:"Õð";s:3:"æ¶¾";s:2:"Õñ";s:3:"æ·¥";s:2:"Õò";s:3:"æ·œ";s:2:"Õó";s:3:"æ·";s:2:"Õô";s:3:"æ·›";s:2:"Õõ";s:3:"æ·´";s:2:"Õö";s:3:"æ·Š";s:2:"Õ÷";s:3:"æ¶½";s:2:"Õø";s:3:"æ·­";s:2:"Õù";s:3:"æ·°";s:2:"Õú";s:3:"涺";s:2:"Õû";s:3:"æ·•";s:2:"Õü";s:3:"æ·‚";s:2:"Õý";s:3:"æ·";s:2:"Õþ";s:3:"æ·‰";s:2:"Ö@";s:3:"æ·";s:2:"ÖA";s:3:"æ·²";s:2:"ÖB";s:3:"æ·“";s:2:"ÖC";s:3:"æ·½";s:2:"ÖD";s:3:"æ·—";s:2:"ÖE";s:3:"æ·";s:2:"ÖF";s:3:"æ·£";s:2:"ÖG";s:3:"æ¶»";s:2:"ÖH";s:3:"烺";s:2:"ÖI";s:3:"ç„";s:2:"ÖJ";s:3:"烷";s:2:"ÖK";s:3:"ç„—";s:2:"ÖL";s:3:"烴";s:2:"ÖM";s:3:"焌";s:2:"ÖN";s:3:"烰";s:2:"ÖO";s:3:"ç„„";s:2:"ÖP";s:3:"烳";s:2:"ÖQ";s:3:"ç„";s:2:"ÖR";s:3:"烼";s:2:"ÖS";s:3:"烿";s:2:"ÖT";s:3:"焆";s:2:"ÖU";s:3:"ç„“";s:2:"ÖV";s:3:"ç„€";s:2:"ÖW";s:3:"烸";s:2:"ÖX";s:3:"烶";s:2:"ÖY";s:3:"ç„‹";s:2:"ÖZ";s:3:"ç„‚";s:2:"Ö[";s:3:"焎";s:2:"Ö\";s:3:"牾";s:2:"Ö]";s:3:"牻";s:2:"Ö^";s:3:"牼";s:2:"Ö_";s:3:"牿";s:2:"Ö`";s:3:"çŒ";s:2:"Öa";s:3:"猗";s:2:"Öb";s:3:"猇";s:2:"Öc";s:3:"猑";s:2:"Öd";s:3:"猘";s:2:"Öe";s:3:"猊";s:2:"Öf";s:3:"猈";s:2:"Ög";s:3:"ç‹¿";s:2:"Öh";s:3:"çŒ";s:2:"Öi";s:3:"猞";s:2:"Öj";s:3:"玈";s:2:"Ök";s:3:"ç¶";s:2:"Öl";s:3:"ç¸";s:2:"Öm";s:3:"çµ";s:2:"Ön";s:3:"ç„";s:2:"Öo";s:3:"ç";s:2:"Öp";s:3:"ç½";s:2:"Öq";s:3:"ç‡";s:2:"Ör";s:3:"ç€";s:2:"Ös";s:3:"çº";s:2:"Öt";s:3:"ç¼";s:2:"Öu";s:3:"ç¿";s:2:"Öv";s:3:"çŒ";s:2:"Öw";s:3:"ç‹";s:2:"Öx";s:3:"ç´";s:2:"Öy";s:3:"çˆ";s:2:"Öz";s:3:"畤";s:2:"Ö{";s:3:"ç•£";s:2:"Ö|";s:3:"ç—Ž";s:2:"Ö}";s:3:"ç—’";s:2:"Ö~";s:3:"ç—";s:2:"Ö¡";s:3:"ç—‹";s:2:"Ö¢";s:3:"ç—Œ";s:2:"Ö£";s:3:"ç—‘";s:2:"Ö¤";s:3:"ç—";s:2:"Ö¥";s:3:"çš";s:2:"Ö¦";s:3:"皉";s:2:"Ö§";s:3:"盓";s:2:"Ö¨";s:3:"眹";s:2:"Ö©";s:3:"眯";s:2:"Öª";s:3:"眭";s:2:"Ö«";s:3:"眱";s:2:"Ö¬";s:3:"眲";s:2:"Ö­";s:3:"眴";s:2:"Ö®";s:3:"眳";s:2:"Ö¯";s:3:"眽";s:2:"Ö°";s:3:"眥";s:2:"Ö±";s:3:"眻";s:2:"Ö²";s:3:"眵";s:2:"Ö³";s:3:"硈";s:2:"Ö´";s:3:"ç¡’";s:2:"Öµ";s:3:"硉";s:2:"Ö¶";s:3:"ç¡";s:2:"Ö·";s:3:"硊";s:2:"Ö¸";s:3:"硌";s:2:"Ö¹";s:3:"ç ¦";s:2:"Öº";s:3:"ç¡…";s:2:"Ö»";s:3:"ç¡";s:2:"Ö¼";s:3:"祤";s:2:"Ö½";s:3:"祧";s:2:"Ö¾";s:3:"祩";s:2:"Ö¿";s:3:"祪";s:2:"ÖÀ";s:3:"祣";s:2:"ÖÁ";s:3:"祫";s:2:"ÖÂ";s:3:"祡";s:2:"ÖÃ";s:3:"离";s:2:"ÖÄ";s:3:"秺";s:2:"ÖÅ";s:3:"秸";s:2:"ÖÆ";s:3:"ç§¶";s:2:"ÖÇ";s:3:"ç§·";s:2:"ÖÈ";s:3:"çª";s:2:"ÖÉ";s:3:"窔";s:2:"ÖÊ";s:3:"çª";s:2:"ÖË";s:3:"笵";s:2:"ÖÌ";s:3:"ç­‡";s:2:"ÖÍ";s:3:"笴";s:2:"ÖÎ";s:3:"笥";s:2:"ÖÏ";s:3:"笰";s:2:"ÖÐ";s:3:"笢";s:2:"ÖÑ";s:3:"笤";s:2:"ÖÒ";s:3:"笳";s:2:"ÖÓ";s:3:"笘";s:2:"ÖÔ";s:3:"笪";s:2:"ÖÕ";s:3:"ç¬";s:2:"ÖÖ";s:3:"笱";s:2:"Ö×";s:3:"笫";s:2:"ÖØ";s:3:"笭";s:2:"ÖÙ";s:3:"笯";s:2:"ÖÚ";s:3:"笲";s:2:"ÖÛ";s:3:"笸";s:2:"ÖÜ";s:3:"笚";s:2:"ÖÝ";s:3:"笣";s:2:"ÖÞ";s:3:"ç²”";s:2:"Öß";s:3:"粘";s:2:"Öà";s:3:"ç²–";s:2:"Öá";s:3:"ç²£";s:2:"Öâ";s:3:"ç´µ";s:2:"Öã";s:3:"ç´½";s:2:"Öä";s:3:"ç´¸";s:2:"Öå";s:3:"ç´¶";s:2:"Öæ";s:3:"ç´º";s:2:"Öç";s:3:"çµ…";s:2:"Öè";s:3:"ç´¬";s:2:"Öé";s:3:"ç´©";s:2:"Öê";s:3:"çµ";s:2:"Öë";s:3:"絇";s:2:"Öì";s:3:"ç´¾";s:2:"Öí";s:3:"ç´¿";s:2:"Öî";s:3:"絊";s:2:"Öï";s:3:"ç´»";s:2:"Öð";s:3:"ç´¨";s:2:"Öñ";s:3:"ç½£";s:2:"Öò";s:3:"羕";s:2:"Öó";s:3:"羜";s:2:"Öô";s:3:"ç¾";s:2:"Öõ";s:3:"ç¾›";s:2:"Öö";s:3:"翊";s:2:"Ö÷";s:3:"ç¿‹";s:2:"Öø";s:3:"ç¿";s:2:"Öù";s:3:"ç¿";s:2:"Öú";s:3:"ç¿‘";s:2:"Öû";s:3:"翇";s:2:"Öü";s:3:"ç¿";s:2:"Öý";s:3:"翉";s:2:"Öþ";s:3:"耟";s:2:"×@";s:3:"耞";s:2:"×A";s:3:"耛";s:2:"×B";s:3:"è‡";s:2:"×C";s:3:"èƒ";s:2:"×D";s:3:"èˆ";s:2:"×E";s:3:"脘";s:2:"×F";s:3:"è„¥";s:2:"×G";s:3:"è„™";s:2:"×H";s:3:"è„›";s:2:"×I";s:3:"è„­";s:2:"×J";s:3:"脟";s:2:"×K";s:3:"脬";s:2:"×L";s:3:"脞";s:2:"×M";s:3:"è„¡";s:2:"×N";s:3:"è„•";s:2:"×O";s:3:"è„§";s:2:"×P";s:3:"è„";s:2:"×Q";s:3:"è„¢";s:2:"×R";s:3:"舑";s:2:"×S";s:3:"舸";s:2:"×T";s:3:"舳";s:2:"×U";s:3:"舺";s:2:"×V";s:3:"舴";s:2:"×W";s:3:"舲";s:2:"×X";s:3:"艴";s:2:"×Y";s:3:"èŽ";s:2:"×Z";s:3:"莣";s:2:"×[";s:3:"莨";s:2:"×\";s:3:"èŽ";s:2:"×]";s:3:"èº";s:2:"×^";s:3:"è³";s:2:"×_";s:3:"莤";s:2:"×`";s:3:"è´";s:2:"×a";s:3:"èŽ";s:2:"×b";s:3:"èŽ";s:2:"×c";s:3:"莕";s:2:"×d";s:3:"莙";s:2:"×e";s:3:"èµ";s:2:"×f";s:3:"莔";s:2:"×g";s:3:"莩";s:2:"×h";s:3:"è½";s:2:"×i";s:3:"莃";s:2:"×j";s:3:"莌";s:2:"×k";s:3:"èŽ";s:2:"×l";s:3:"莛";s:2:"×m";s:3:"莪";s:2:"×n";s:3:"莋";s:2:"×o";s:3:"è¾";s:2:"×p";s:3:"莥";s:2:"×q";s:3:"莯";s:2:"×r";s:3:"莈";s:2:"×s";s:3:"莗";s:2:"×t";s:3:"莰";s:2:"×u";s:3:"è¿";s:2:"×v";s:3:"莦";s:2:"×w";s:3:"莇";s:2:"×x";s:3:"莮";s:2:"×y";s:3:"è¶";s:2:"×z";s:3:"莚";s:2:"×{";s:3:"è™™";s:2:"×|";s:3:"è™–";s:2:"×}";s:3:"èš¿";s:2:"×~";s:3:"èš·";s:2:"ס";s:3:"蛂";s:2:"×¢";s:3:"è›";s:2:"×£";s:3:"è›…";s:2:"פ";s:3:"蚺";s:2:"×¥";s:3:"èš°";s:2:"צ";s:3:"蛈";s:2:"×§";s:3:"èš¹";s:2:"ר";s:3:"èš³";s:2:"ש";s:3:"蚸";s:2:"ת";s:3:"蛌";s:2:"׫";s:3:"èš´";s:2:"׬";s:3:"èš»";s:2:"×­";s:3:"èš¼";s:2:"×®";s:3:"蛃";s:2:"ׯ";s:3:"èš½";s:2:"×°";s:3:"èš¾";s:2:"×±";s:3:"è¡’";s:2:"ײ";s:3:"袉";s:2:"׳";s:3:"袕";s:2:"×´";s:3:"袨";s:2:"×µ";s:3:"袢";s:2:"×¶";s:3:"袪";s:2:"×·";s:3:"袚";s:2:"׸";s:3:"袑";s:2:"×¹";s:3:"袡";s:2:"׺";s:3:"袟";s:2:"×»";s:3:"袘";s:2:"×¼";s:3:"袧";s:2:"×½";s:3:"袙";s:2:"×¾";s:3:"袛";s:2:"׿";s:3:"袗";s:2:"×À";s:3:"袤";s:2:"×Á";s:3:"袬";s:2:"×Â";s:3:"袌";s:2:"×Ã";s:3:"袓";s:2:"×Ä";s:3:"袎";s:2:"×Å";s:3:"覂";s:2:"ׯ";s:3:"è§–";s:2:"×Ç";s:3:"è§™";s:2:"×È";s:3:"è§•";s:2:"×É";s:3:"訰";s:2:"×Ê";s:3:"訧";s:2:"×Ë";s:3:"訬";s:2:"×Ì";s:3:"訞";s:2:"×Í";s:3:"è°¹";s:2:"×Î";s:3:"è°»";s:2:"×Ï";s:3:"豜";s:2:"×Ð";s:3:"è±";s:2:"×Ñ";s:3:"è±½";s:2:"×Ò";s:3:"è²¥";s:2:"×Ó";s:3:"èµ½";s:2:"×Ô";s:3:"èµ»";s:2:"×Õ";s:3:"èµ¹";s:2:"×Ö";s:3:"è¶¼";s:2:"××";s:3:"è·‚";s:2:"ר";s:3:"è¶¹";s:2:"×Ù";s:3:"è¶¿";s:2:"×Ú";s:3:"è·";s:2:"×Û";s:3:"軘";s:2:"×Ü";s:3:"軞";s:2:"×Ý";s:3:"è»";s:2:"×Þ";s:3:"軜";s:2:"×ß";s:3:"è»—";s:2:"×à";s:3:"è» ";s:2:"×á";s:3:"軡";s:2:"×â";s:3:"逤";s:2:"×ã";s:3:"逋";s:2:"×ä";s:3:"逑";s:2:"×å";s:3:"逜";s:2:"׿";s:3:"逌";s:2:"×ç";s:3:"逡";s:2:"×è";s:3:"郯";s:2:"×é";s:3:"郪";s:2:"×ê";s:3:"郰";s:2:"×ë";s:3:"郴";s:2:"×ì";s:3:"郲";s:2:"×í";s:3:"郳";s:2:"×î";s:3:"郔";s:2:"×ï";s:3:"郫";s:2:"×ð";s:3:"郬";s:2:"×ñ";s:3:"郩";s:2:"×ò";s:3:"é…–";s:2:"×ó";s:3:"é…˜";s:2:"×ô";s:3:"é…š";s:2:"×õ";s:3:"é…“";s:2:"×ö";s:3:"é…•";s:2:"×÷";s:3:"釬";s:2:"×ø";s:3:"釴";s:2:"×ù";s:3:"釱";s:2:"×ú";s:3:"釳";s:2:"×û";s:3:"釸";s:2:"×ü";s:3:"釤";s:2:"×ý";s:3:"釹";s:2:"×þ";s:3:"釪";s:2:"Ø@";s:3:"釫";s:2:"ØA";s:3:"釷";s:2:"ØB";s:3:"釨";s:2:"ØC";s:3:"釮";s:2:"ØD";s:3:"镺";s:2:"ØE";s:3:"é–†";s:2:"ØF";s:3:"é–ˆ";s:2:"ØG";s:3:"陼";s:2:"ØH";s:3:"é™­";s:2:"ØI";s:3:"陫";s:2:"ØJ";s:3:"é™±";s:2:"ØK";s:3:"陯";s:2:"ØL";s:3:"éš¿";s:2:"ØM";s:3:"éª";s:2:"ØN";s:3:"é „";s:2:"ØO";s:3:"飥";s:2:"ØP";s:3:"馗";s:2:"ØQ";s:3:"å‚›";s:2:"ØR";s:3:"å‚•";s:2:"ØS";s:3:"å‚”";s:2:"ØT";s:3:"傞";s:2:"ØU";s:3:"å‚‹";s:2:"ØV";s:3:"å‚£";s:2:"ØW";s:3:"傃";s:2:"ØX";s:3:"傌";s:2:"ØY";s:3:"傎";s:2:"ØZ";s:3:"å‚";s:2:"Ø[";s:3:"å¨";s:2:"Ø\";s:3:"傜";s:2:"Ø]";s:3:"å‚’";s:2:"Ø^";s:3:"å‚‚";s:2:"Ø_";s:3:"傇";s:2:"Ø`";s:3:"å…Ÿ";s:2:"Øa";s:3:"凔";s:2:"Øb";s:3:"匒";s:2:"Øc";s:3:"匑";s:2:"Ød";s:3:"厤";s:2:"Øe";s:3:"厧";s:2:"Øf";s:3:"å–‘";s:2:"Øg";s:3:"å–¨";s:2:"Øh";s:3:"å–¥";s:2:"Øi";s:3:"å–­";s:2:"Øj";s:3:"å•·";s:2:"Øk";s:3:"å™…";s:2:"Øl";s:3:"å–¢";s:2:"Øm";s:3:"å–“";s:2:"Øn";s:3:"å–ˆ";s:2:"Øo";s:3:"å–";s:2:"Øp";s:3:"å–µ";s:2:"Øq";s:3:"å–";s:2:"Ør";s:3:"å–£";s:2:"Øs";s:3:"å–’";s:2:"Øt";s:3:"å–¤";s:2:"Øu";s:3:"啽";s:2:"Øv";s:3:"å–Œ";s:2:"Øw";s:3:"å–¦";s:2:"Øx";s:3:"å•¿";s:2:"Øy";s:3:"å–•";s:2:"Øz";s:3:"å–¡";s:2:"Ø{";s:3:"å–Ž";s:2:"Ø|";s:3:"圌";s:2:"Ø}";s:3:"å ©";s:2:"Ø~";s:3:"å ·";s:2:"Ø¡";s:3:"å ™";s:2:"Ø¢";s:3:"å ž";s:2:"Ø£";s:3:"å §";s:2:"ؤ";s:3:"å £";s:2:"Ø¥";s:3:"å ¨";s:2:"ئ";s:3:"埵";s:2:"ا";s:3:"塈";s:2:"ب";s:3:"å ¥";s:2:"Ø©";s:3:"å œ";s:2:"ت";s:3:"å ›";s:2:"Ø«";s:3:"å ³";s:2:"ج";s:3:"å ¿";s:2:"Ø­";s:3:"å ¶";s:2:"Ø®";s:3:"å ®";s:2:"د";s:3:"å ¹";s:2:"ذ";s:3:"å ¸";s:2:"ر";s:3:"å ­";s:2:"ز";s:3:"å ¬";s:2:"س";s:3:"å »";s:2:"Ø´";s:3:"奡";s:2:"ص";s:3:"媯";s:2:"ض";s:3:"媔";s:2:"Ø·";s:3:"媟";s:2:"ظ";s:3:"婺";s:2:"ع";s:3:"媢";s:2:"غ";s:3:"媞";s:2:"Ø»";s:3:"婸";s:2:"ؼ";s:3:"媦";s:2:"ؽ";s:3:"婼";s:2:"ؾ";s:3:"媥";s:2:"Ø¿";s:3:"媬";s:2:"ØÀ";s:3:"媕";s:2:"ØÁ";s:3:"媮";s:2:"ØÂ";s:3:"娷";s:2:"ØÃ";s:3:"媄";s:2:"ØÄ";s:3:"媊";s:2:"ØÅ";s:3:"媗";s:2:"ØÆ";s:3:"媃";s:2:"ØÇ";s:3:"媋";s:2:"ØÈ";s:3:"媩";s:2:"ØÉ";s:3:"å©»";s:2:"ØÊ";s:3:"婽";s:2:"ØË";s:3:"媌";s:2:"ØÌ";s:3:"媜";s:2:"ØÍ";s:3:"åª";s:2:"ØÎ";s:3:"媓";s:2:"ØÏ";s:3:"åª";s:2:"ØÐ";s:3:"寪";s:2:"ØÑ";s:3:"å¯";s:2:"ØÒ";s:3:"寋";s:2:"ØÓ";s:3:"寔";s:2:"ØÔ";s:3:"寑";s:2:"ØÕ";s:3:"寊";s:2:"ØÖ";s:3:"寎";s:2:"Ø×";s:3:"å°Œ";s:2:"ØØ";s:3:"å°°";s:2:"ØÙ";s:3:"å´·";s:2:"ØÚ";s:3:"嵃";s:2:"ØÛ";s:3:"嵫";s:2:"ØÜ";s:3:"åµ";s:2:"ØÝ";s:3:"嵋";s:2:"ØÞ";s:3:"å´¿";s:2:"Øß";s:3:"å´µ";s:2:"Øà";s:3:"嵑";s:2:"Øá";s:3:"嵎";s:2:"Øâ";s:3:"嵕";s:2:"Øã";s:3:"å´³";s:2:"Øä";s:3:"å´º";s:2:"Øå";s:3:"åµ’";s:2:"Øæ";s:3:"å´½";s:2:"Øç";s:3:"å´±";s:2:"Øè";s:3:"åµ™";s:2:"Øé";s:3:"嵂";s:2:"Øê";s:3:"å´¹";s:2:"Øë";s:3:"嵉";s:2:"Øì";s:3:"å´¸";s:2:"Øí";s:3:"å´¼";s:2:"Øî";s:3:"å´²";s:2:"Øï";s:3:"å´¶";s:2:"Øð";s:3:"åµ€";s:2:"Øñ";s:3:"åµ…";s:2:"Øò";s:3:"幄";s:2:"Øó";s:3:"å¹";s:2:"Øô";s:3:"彘";s:2:"Øõ";s:3:"徦";s:2:"Øö";s:3:"å¾¥";s:2:"Ø÷";s:3:"徫";s:2:"Øø";s:3:"惉";s:2:"Øù";s:3:"悹";s:2:"Øú";s:3:"惌";s:2:"Øû";s:3:"惢";s:2:"Øü";s:3:"惎";s:2:"Øý";s:3:"惄";s:2:"Øþ";s:3:"æ„”";s:2:"Ù@";s:3:"惲";s:2:"ÙA";s:3:"愊";s:2:"ÙB";s:3:"æ„–";s:2:"ÙC";s:3:"æ„…";s:2:"ÙD";s:3:"惵";s:2:"ÙE";s:3:"æ„“";s:2:"ÙF";s:3:"惸";s:2:"ÙG";s:3:"惼";s:2:"ÙH";s:3:"惾";s:2:"ÙI";s:3:"æƒ";s:2:"ÙJ";s:3:"愃";s:2:"ÙK";s:3:"愘";s:2:"ÙL";s:3:"æ„";s:2:"ÙM";s:3:"æ„";s:2:"ÙN";s:3:"惿";s:2:"ÙO";s:3:"æ„„";s:2:"ÙP";s:3:"æ„‹";s:2:"ÙQ";s:3:"扊";s:2:"ÙR";s:3:"掔";s:2:"ÙS";s:3:"掱";s:2:"ÙT";s:3:"掰";s:2:"ÙU";s:3:"æŽ";s:2:"ÙV";s:3:"æ¥";s:2:"ÙW";s:3:"æ¨";s:2:"ÙX";s:3:"æ¯";s:2:"ÙY";s:3:"æƒ";s:2:"ÙZ";s:3:"æ’";s:2:"Ù[";s:3:"æ³";s:2:"Ù\";s:3:"æŠ";s:2:"Ù]";s:3:"æ ";s:2:"Ù^";s:3:"æ¶";s:2:"Ù_";s:3:"æ•";s:2:"Ù`";s:3:"æ²";s:2:"Ùa";s:3:"æµ";s:2:"Ùb";s:3:"æ‘¡";s:2:"Ùc";s:3:"æŸ";s:2:"Ùd";s:3:"掾";s:2:"Ùe";s:3:"æ";s:2:"Ùf";s:3:"æœ";s:2:"Ùg";s:3:"æ„";s:2:"Ùh";s:3:"æ˜";s:2:"Ùi";s:3:"æ“";s:2:"Ùj";s:3:"æ‚";s:2:"Ùk";s:3:"æ‡";s:2:"Ùl";s:3:"æŒ";s:2:"Ùm";s:3:"æ‹";s:2:"Ùn";s:3:"æˆ";s:2:"Ùo";s:3:"æ°";s:2:"Ùp";s:3:"æ—";s:2:"Ùq";s:3:"æ™";s:2:"Ùr";s:3:"攲";s:2:"Ùs";s:3:"æ•§";s:2:"Ùt";s:3:"敪";s:2:"Ùu";s:3:"敤";s:2:"Ùv";s:3:"敜";s:2:"Ùw";s:3:"敨";s:2:"Ùx";s:3:"æ•¥";s:2:"Ùy";s:3:"æ–Œ";s:2:"Ùz";s:3:"æ–";s:2:"Ù{";s:3:"æ–ž";s:2:"Ù|";s:3:"æ–®";s:2:"Ù}";s:3:"æ—";s:2:"Ù~";s:3:"æ—’";s:2:"Ù¡";s:3:"晼";s:2:"Ù¢";s:3:"晬";s:2:"Ù£";s:3:"æ™»";s:2:"Ù¤";s:3:"暀";s:2:"Ù¥";s:3:"æ™±";s:2:"Ù¦";s:3:"晹";s:2:"Ù§";s:3:"晪";s:2:"Ù¨";s:3:"晲";s:2:"Ù©";s:3:"æœ";s:2:"Ùª";s:3:"椌";s:2:"Ù«";s:3:"棓";s:2:"Ù¬";s:3:"椄";s:2:"Ù­";s:3:"棜";s:2:"Ù®";s:3:"椪";s:2:"Ù¯";s:3:"棬";s:2:"Ù°";s:3:"棪";s:2:"Ù±";s:3:"棱";s:2:"Ù²";s:3:"æ¤";s:2:"Ù³";s:3:"棖";s:2:"Ù´";s:3:"棷";s:2:"Ùµ";s:3:"棫";s:2:"Ù¶";s:3:"棤";s:2:"Ù·";s:3:"棶";s:2:"Ù¸";s:3:"椓";s:2:"Ù¹";s:3:"æ¤";s:2:"Ùº";s:3:"棳";s:2:"Ù»";s:3:"棡";s:2:"Ù¼";s:3:"椇";s:2:"Ù½";s:3:"棌";s:2:"Ù¾";s:3:"椈";s:2:"Ù¿";s:3:"楰";s:2:"ÙÀ";s:3:"梴";s:2:"ÙÁ";s:3:"椑";s:2:"ÙÂ";s:3:"棯";s:2:"ÙÃ";s:3:"棆";s:2:"ÙÄ";s:3:"椔";s:2:"ÙÅ";s:3:"棸";s:2:"ÙÆ";s:3:"æ£";s:2:"ÙÇ";s:3:"棽";s:2:"ÙÈ";s:3:"棼";s:2:"ÙÉ";s:3:"棨";s:2:"ÙÊ";s:3:"椋";s:2:"ÙË";s:3:"椊";s:2:"ÙÌ";s:3:"椗";s:2:"ÙÍ";s:3:"棎";s:2:"ÙÎ";s:3:"棈";s:2:"ÙÏ";s:3:"æ£";s:2:"ÙÐ";s:3:"棞";s:2:"ÙÑ";s:3:"棦";s:2:"ÙÒ";s:3:"棴";s:2:"ÙÓ";s:3:"棑";s:2:"ÙÔ";s:3:"椆";s:2:"ÙÕ";s:3:"棔";s:2:"ÙÖ";s:3:"棩";s:2:"Ù×";s:3:"椕";s:2:"ÙØ";s:3:"椥";s:2:"ÙÙ";s:3:"棇";s:2:"ÙÚ";s:3:"欹";s:2:"ÙÛ";s:3:"欻";s:2:"ÙÜ";s:3:"欿";s:2:"ÙÝ";s:3:"欼";s:2:"ÙÞ";s:3:"æ®”";s:2:"Ùß";s:3:"æ®—";s:2:"Ùà";s:3:"æ®™";s:2:"Ùá";s:3:"殕";s:2:"Ùâ";s:3:"殽";s:2:"Ùã";s:3:"毰";s:2:"Ùä";s:3:"毲";s:2:"Ùå";s:3:"毳";s:2:"Ùæ";s:3:"æ°°";s:2:"Ùç";s:3:"æ·¼";s:2:"Ùè";s:3:"湆";s:2:"Ùé";s:3:"湇";s:2:"Ùê";s:3:"渟";s:2:"Ùë";s:3:"湉";s:2:"Ùì";s:3:"溈";s:2:"Ùí";s:3:"渼";s:2:"Ùî";s:3:"渽";s:2:"Ùï";s:3:"æ¹…";s:2:"Ùð";s:3:"æ¹¢";s:2:"Ùñ";s:3:"渫";s:2:"Ùò";s:3:"渿";s:2:"Ùó";s:3:"æ¹";s:2:"Ùô";s:3:"æ¹";s:2:"Ùõ";s:3:"æ¹³";s:2:"Ùö";s:3:"渜";s:2:"Ù÷";s:3:"渳";s:2:"Ùø";s:3:"湋";s:2:"Ùù";s:3:"æ¹€";s:2:"Ùú";s:3:"湑";s:2:"Ùû";s:3:"渻";s:2:"Ùü";s:3:"渃";s:2:"Ùý";s:3:"渮";s:2:"Ùþ";s:3:"湞";s:2:"Ú@";s:3:"湨";s:2:"ÚA";s:3:"湜";s:2:"ÚB";s:3:"湡";s:2:"ÚC";s:3:"渱";s:2:"ÚD";s:3:"渨";s:2:"ÚE";s:3:"æ¹ ";s:2:"ÚF";s:3:"æ¹±";s:2:"ÚG";s:3:"湫";s:2:"ÚH";s:3:"渹";s:2:"ÚI";s:3:"渢";s:2:"ÚJ";s:3:"渰";s:2:"ÚK";s:3:"湓";s:2:"ÚL";s:3:"æ¹¥";s:2:"ÚM";s:3:"渧";s:2:"ÚN";s:3:"湸";s:2:"ÚO";s:3:"湤";s:2:"ÚP";s:3:"æ¹·";s:2:"ÚQ";s:3:"湕";s:2:"ÚR";s:3:"æ¹¹";s:2:"ÚS";s:3:"æ¹’";s:2:"ÚT";s:3:"湦";s:2:"ÚU";s:3:"渵";s:2:"ÚV";s:3:"渶";s:2:"ÚW";s:3:"湚";s:2:"ÚX";s:3:"ç„ ";s:2:"ÚY";s:3:"焞";s:2:"ÚZ";s:3:"焯";s:2:"Ú[";s:3:"烻";s:2:"Ú\";s:3:"ç„®";s:2:"Ú]";s:3:"焱";s:2:"Ú^";s:3:"ç„£";s:2:"Ú_";s:3:"ç„¥";s:2:"Ú`";s:3:"ç„¢";s:2:"Úa";s:3:"焲";s:2:"Úb";s:3:"焟";s:2:"Úc";s:3:"焨";s:2:"Úd";s:3:"焺";s:2:"Úe";s:3:"ç„›";s:2:"Úf";s:3:"牋";s:2:"Úg";s:3:"牚";s:2:"Úh";s:3:"犈";s:2:"Úi";s:3:"犉";s:2:"Új";s:3:"犆";s:2:"Úk";s:3:"犅";s:2:"Úl";s:3:"犋";s:2:"Úm";s:3:"猒";s:2:"Ún";s:3:"猋";s:2:"Úo";s:3:"猰";s:2:"Úp";s:3:"猢";s:2:"Úq";s:3:"猱";s:2:"Úr";s:3:"猳";s:2:"Ús";s:3:"猧";s:2:"Út";s:3:"猲";s:2:"Úu";s:3:"猭";s:2:"Úv";s:3:"猦";s:2:"Úw";s:3:"猣";s:2:"Úx";s:3:"猵";s:2:"Úy";s:3:"猌";s:2:"Úz";s:3:"ç®";s:2:"Ú{";s:3:"ç¬";s:2:"Ú|";s:3:"ç°";s:2:"Ú}";s:3:"ç«";s:2:"Ú~";s:3:"ç–";s:2:"Ú¡";s:3:"çš";s:2:"Ú¢";s:3:"ç¡";s:2:"Ú£";s:3:"ç­";s:2:"Ú¤";s:3:"ç±";s:2:"Ú¥";s:3:"ç¤";s:2:"Ú¦";s:3:"ç£";s:2:"Ú§";s:3:"ç";s:2:"Ú¨";s:3:"ç©";s:2:"Ú©";s:3:"ç ";s:2:"Úª";s:3:"ç²";s:2:"Ú«";s:3:"ç“»";s:2:"Ú¬";s:3:"甯";s:2:"Ú­";s:3:"畯";s:2:"Ú®";s:3:"畬";s:2:"Ú¯";s:3:"ç—§";s:2:"Ú°";s:3:"ç—š";s:2:"Ú±";s:3:"ç—¡";s:2:"Ú²";s:3:"ç—¦";s:2:"Ú³";s:3:"ç—";s:2:"Ú´";s:3:"ç—Ÿ";s:2:"Úµ";s:3:"ç—¤";s:2:"Ú¶";s:3:"ç——";s:2:"Ú·";s:3:"çš•";s:2:"Ú¸";s:3:"çš’";s:2:"Ú¹";s:3:"盚";s:2:"Úº";s:3:"ç†";s:2:"Ú»";s:3:"ç‡";s:2:"Ú¼";s:3:"ç„";s:2:"Ú½";s:3:"ç";s:2:"Ú¾";s:3:"ç…";s:2:"Ú¿";s:3:"çŠ";s:2:"ÚÀ";s:3:"çŽ";s:2:"ÚÁ";s:3:"ç‹";s:2:"ÚÂ";s:3:"çŒ";s:2:"ÚÃ";s:3:"矞";s:2:"ÚÄ";s:3:"矬";s:2:"ÚÅ";s:3:"ç¡ ";s:2:"ÚÆ";s:3:"硤";s:2:"ÚÇ";s:3:"ç¡¥";s:2:"ÚÈ";s:3:"硜";s:2:"ÚÉ";s:3:"ç¡­";s:2:"ÚÊ";s:3:"硱";s:2:"ÚË";s:3:"硪";s:2:"ÚÌ";s:3:"ç¡®";s:2:"ÚÍ";s:3:"ç¡°";s:2:"ÚÎ";s:3:"ç¡©";s:2:"ÚÏ";s:3:"硨";s:2:"ÚÐ";s:3:"硞";s:2:"ÚÑ";s:3:"ç¡¢";s:2:"ÚÒ";s:3:"祴";s:2:"ÚÓ";s:3:"祳";s:2:"ÚÔ";s:3:"祲";s:2:"ÚÕ";s:3:"祰";s:2:"ÚÖ";s:3:"稂";s:2:"Ú×";s:3:"稊";s:2:"ÚØ";s:3:"稃";s:2:"ÚÙ";s:3:"稌";s:2:"ÚÚ";s:3:"稄";s:2:"ÚÛ";s:3:"窙";s:2:"ÚÜ";s:3:"竦";s:2:"ÚÝ";s:3:"竤";s:2:"ÚÞ";s:3:"ç­Š";s:2:"Úß";s:3:"笻";s:2:"Úà";s:3:"ç­„";s:2:"Úá";s:3:"ç­ˆ";s:2:"Úâ";s:3:"ç­Œ";s:2:"Úã";s:3:"ç­Ž";s:2:"Úä";s:3:"ç­€";s:2:"Úå";s:3:"ç­˜";s:2:"Úæ";s:3:"ç­…";s:2:"Úç";s:3:"ç²¢";s:2:"Úè";s:3:"粞";s:2:"Úé";s:3:"粨";s:2:"Úê";s:3:"粡";s:2:"Úë";s:3:"絘";s:2:"Úì";s:3:"絯";s:2:"Úí";s:3:"çµ£";s:2:"Úî";s:3:"絓";s:2:"Úï";s:3:"çµ–";s:2:"Úð";s:3:"çµ§";s:2:"Úñ";s:3:"絪";s:2:"Úò";s:3:"çµ";s:2:"Úó";s:3:"çµ­";s:2:"Úô";s:3:"絜";s:2:"Úõ";s:3:"絫";s:2:"Úö";s:3:"çµ’";s:2:"Ú÷";s:3:"çµ”";s:2:"Úø";s:3:"絩";s:2:"Úù";s:3:"絑";s:2:"Úú";s:3:"絟";s:2:"Úû";s:3:"絎";s:2:"Úü";s:3:"ç¼¾";s:2:"Úý";s:3:"缿";s:2:"Úþ";s:3:"ç½¥";s:2:"Û@";s:3:"罦";s:2:"ÛA";s:3:"ç¾¢";s:2:"ÛB";s:3:"ç¾ ";s:2:"ÛC";s:3:"羡";s:2:"ÛD";s:3:"ç¿—";s:2:"ÛE";s:3:"è‘";s:2:"ÛF";s:3:"è";s:2:"ÛG";s:3:"è";s:2:"ÛH";s:3:"胾";s:2:"ÛI";s:3:"胔";s:2:"ÛJ";s:3:"è…ƒ";s:2:"ÛK";s:3:"è…Š";s:2:"ÛL";s:3:"è…’";s:2:"ÛM";s:3:"è…";s:2:"ÛN";s:3:"è…‡";s:2:"ÛO";s:3:"脽";s:2:"ÛP";s:3:"è…";s:2:"ÛQ";s:3:"脺";s:2:"ÛR";s:3:"臦";s:2:"ÛS";s:3:"臮";s:2:"ÛT";s:3:"臷";s:2:"ÛU";s:3:"臸";s:2:"ÛV";s:3:"臹";s:2:"ÛW";s:3:"舄";s:2:"ÛX";s:3:"舼";s:2:"ÛY";s:3:"舽";s:2:"ÛZ";s:3:"舿";s:2:"Û[";s:3:"艵";s:2:"Û\";s:3:"茻";s:2:"Û]";s:3:"è";s:2:"Û^";s:3:"è¹";s:2:"Û_";s:3:"è£";s:2:"Û`";s:3:"è€";s:2:"Ûa";s:3:"è¨";s:2:"Ûb";s:3:"è’";s:2:"Ûc";s:3:"è§";s:2:"Ûd";s:3:"è¤";s:2:"Ûe";s:3:"è¼";s:2:"Ûf";s:3:"è¶";s:2:"Ûg";s:3:"è";s:2:"Ûh";s:3:"è†";s:2:"Ûi";s:3:"èˆ";s:2:"Ûj";s:3:"è«";s:2:"Ûk";s:3:"è£";s:2:"Ûl";s:3:"莿";s:2:"Ûm";s:3:"è";s:2:"Ûn";s:3:"è";s:2:"Ûo";s:3:"è¥";s:2:"Ûp";s:3:"è˜";s:2:"Ûq";s:3:"è¿";s:2:"Ûr";s:3:"è¡";s:2:"Ûs";s:3:"è‹";s:2:"Ût";s:3:"èŽ";s:2:"Ûu";s:3:"è–";s:2:"Ûv";s:3:"èµ";s:2:"Ûw";s:3:"è‰";s:2:"Ûx";s:3:"è‰";s:2:"Ûy";s:3:"è";s:2:"Ûz";s:3:"èž";s:2:"Û{";s:3:"è‘";s:2:"Û|";s:3:"è†";s:2:"Û}";s:3:"è‚";s:2:"Û~";s:3:"è³";s:2:"Û¡";s:3:"è•";s:2:"Û¢";s:3:"èº";s:2:"Û£";s:3:"è‡";s:2:"Û¤";s:3:"è‘";s:2:"Û¥";s:3:"èª";s:2:"Û¦";s:3:"è“";s:2:"Û§";s:3:"èƒ";s:2:"Û¨";s:3:"è¬";s:2:"Û©";s:3:"è®";s:2:"Ûª";s:3:"è„";s:2:"Û«";s:3:"è»";s:2:"Û¬";s:3:"è—";s:2:"Û­";s:3:"è¢";s:2:"Û®";s:3:"è›";s:2:"Û¯";s:3:"è›";s:2:"Û°";s:3:"è¾";s:2:"Û±";s:3:"蛘";s:2:"Û²";s:3:"蛢";s:2:"Û³";s:3:"蛦";s:2:"Û´";s:3:"蛓";s:2:"Ûµ";s:3:"蛣";s:2:"Û¶";s:3:"蛚";s:2:"Û·";s:3:"蛪";s:2:"Û¸";s:3:"è›";s:2:"Û¹";s:3:"蛫";s:2:"Ûº";s:3:"蛜";s:2:"Û»";s:3:"蛬";s:2:"Û¼";s:3:"蛩";s:2:"Û½";s:3:"è›—";s:2:"Û¾";s:3:"蛨";s:2:"Û¿";s:3:"蛑";s:2:"ÛÀ";s:3:"衈";s:2:"ÛÁ";s:3:"è¡–";s:2:"ÛÂ";s:3:"è¡•";s:2:"ÛÃ";s:3:"袺";s:2:"ÛÄ";s:3:"裗";s:2:"ÛÅ";s:3:"袹";s:2:"ÛÆ";s:3:"袸";s:2:"ÛÇ";s:3:"裀";s:2:"ÛÈ";s:3:"袾";s:2:"ÛÉ";s:3:"袶";s:2:"ÛÊ";s:3:"袼";s:2:"ÛË";s:3:"袷";s:2:"ÛÌ";s:3:"袽";s:2:"ÛÍ";s:3:"袲";s:2:"ÛÎ";s:3:"è¤";s:2:"ÛÏ";s:3:"裉";s:2:"ÛÐ";s:3:"覕";s:2:"ÛÑ";s:3:"覘";s:2:"ÛÒ";s:3:"覗";s:2:"ÛÓ";s:3:"è§";s:2:"ÛÔ";s:3:"è§š";s:2:"ÛÕ";s:3:"è§›";s:2:"ÛÖ";s:3:"詎";s:2:"Û×";s:3:"è©";s:2:"ÛØ";s:3:"訹";s:2:"ÛÙ";s:3:"è©™";s:2:"ÛÚ";s:3:"è©€";s:2:"ÛÛ";s:3:"è©—";s:2:"ÛÜ";s:3:"詘";s:2:"ÛÝ";s:3:"è©„";s:2:"ÛÞ";s:3:"è©…";s:2:"Ûß";s:3:"è©’";s:2:"Ûà";s:3:"詈";s:2:"Ûá";s:3:"è©‘";s:2:"Ûâ";s:3:"詊";s:2:"Ûã";s:3:"詌";s:2:"Ûä";s:3:"è©";s:2:"Ûå";s:3:"豟";s:2:"Ûæ";s:3:"è²";s:2:"Ûç";s:3:"è²€";s:2:"Ûè";s:3:"貺";s:2:"Ûé";s:3:"è²¾";s:2:"Ûê";s:3:"è²°";s:2:"Ûë";s:3:"è²¹";s:2:"Ûì";s:3:"è²µ";s:2:"Ûí";s:3:"è¶„";s:2:"Ûî";s:3:"è¶€";s:2:"Ûï";s:3:"趉";s:2:"Ûð";s:3:"è·˜";s:2:"Ûñ";s:3:"è·“";s:2:"Ûò";s:3:"è·";s:2:"Ûó";s:3:"è·‡";s:2:"Ûô";s:3:"è·–";s:2:"Ûõ";s:3:"è·œ";s:2:"Ûö";s:3:"è·";s:2:"Û÷";s:3:"è·•";s:2:"Ûø";s:3:"è·™";s:2:"Ûù";s:3:"è·ˆ";s:2:"Ûú";s:3:"è·—";s:2:"Ûû";s:3:"è·…";s:2:"Ûü";s:3:"軯";s:2:"Ûý";s:3:"è»·";s:2:"Ûþ";s:3:"軺";s:2:"Ü@";s:3:"軹";s:2:"ÜA";s:3:"軦";s:2:"ÜB";s:3:"è»®";s:2:"ÜC";s:3:"軥";s:2:"ÜD";s:3:"軵";s:2:"ÜE";s:3:"è»§";s:2:"ÜF";s:3:"軨";s:2:"ÜG";s:3:"è»¶";s:2:"ÜH";s:3:"軫";s:2:"ÜI";s:3:"è»±";s:2:"ÜJ";s:3:"軬";s:2:"ÜK";s:3:"è»´";s:2:"ÜL";s:3:"軩";s:2:"ÜM";s:3:"逭";s:2:"ÜN";s:3:"逴";s:2:"ÜO";s:3:"逯";s:2:"ÜP";s:3:"鄆";s:2:"ÜQ";s:3:"鄬";s:2:"ÜR";s:3:"é„„";s:2:"ÜS";s:3:"郿";s:2:"ÜT";s:3:"郼";s:2:"ÜU";s:3:"鄈";s:2:"ÜV";s:3:"郹";s:2:"ÜW";s:3:"郻";s:2:"ÜX";s:3:"é„";s:2:"ÜY";s:3:"é„€";s:2:"ÜZ";s:3:"鄇";s:2:"Ü[";s:3:"é„…";s:2:"Ü\";s:3:"鄃";s:2:"Ü]";s:3:"é…¡";s:2:"Ü^";s:3:"é…¤";s:2:"Ü_";s:3:"é…Ÿ";s:2:"Ü`";s:3:"é…¢";s:2:"Üa";s:3:"é… ";s:2:"Üb";s:3:"éˆ";s:2:"Üc";s:3:"鈊";s:2:"Üd";s:3:"鈥";s:2:"Üe";s:3:"鈃";s:2:"Üf";s:3:"鈚";s:2:"Üg";s:3:"鈦";s:2:"Üh";s:3:"éˆ";s:2:"Üi";s:3:"鈌";s:2:"Üj";s:3:"鈀";s:2:"Ük";s:3:"鈒";s:2:"Ül";s:3:"釿";s:2:"Üm";s:3:"釽";s:2:"Ün";s:3:"鈆";s:2:"Üo";s:3:"鈄";s:2:"Üp";s:3:"鈧";s:2:"Üq";s:3:"鈂";s:2:"Ür";s:3:"鈜";s:2:"Üs";s:3:"鈤";s:2:"Üt";s:3:"鈙";s:2:"Üu";s:3:"鈗";s:2:"Üv";s:3:"鈅";s:2:"Üw";s:3:"鈖";s:2:"Üx";s:3:"é•»";s:2:"Üy";s:3:"é–";s:2:"Üz";s:3:"é–Œ";s:2:"Ü{";s:3:"é–";s:2:"Ü|";s:3:"隇";s:2:"Ü}";s:3:"陾";s:2:"Ü~";s:3:"隈";s:2:"Ü¡";s:3:"隉";s:2:"Ü¢";s:3:"隃";s:2:"Ü£";s:3:"隀";s:2:"ܤ";s:3:"雂";s:2:"Ü¥";s:3:"雈";s:2:"ܦ";s:3:"雃";s:2:"ܧ";s:3:"é›±";s:2:"ܨ";s:3:"é›°";s:2:"Ü©";s:3:"é¬";s:2:"ܪ";s:3:"é°";s:2:"Ü«";s:3:"é®";s:2:"ܬ";s:3:"é ‡";s:2:"Ü­";s:3:"颩";s:2:"Ü®";s:3:"飫";s:2:"ܯ";s:3:"鳦";s:2:"ܰ";s:3:"黹";s:2:"ܱ";s:3:"亃";s:2:"ܲ";s:3:"亄";s:2:"ܳ";s:3:"亶";s:2:"Ü´";s:3:"傽";s:2:"ܵ";s:3:"å‚¿";s:2:"ܶ";s:3:"僆";s:2:"Ü·";s:3:"å‚®";s:2:"ܸ";s:3:"僄";s:2:"ܹ";s:3:"僊";s:2:"ܺ";s:3:"å‚´";s:2:"Ü»";s:3:"僈";s:2:"ܼ";s:3:"僂";s:2:"ܽ";s:3:"å‚°";s:2:"ܾ";s:3:"åƒ";s:2:"Ü¿";s:3:"傺";s:2:"ÜÀ";s:3:"傱";s:2:"ÜÁ";s:3:"僋";s:2:"ÜÂ";s:3:"僉";s:2:"ÜÃ";s:3:"å‚¶";s:2:"ÜÄ";s:3:"傸";s:2:"ÜÅ";s:3:"凗";s:2:"ÜÆ";s:3:"剺";s:2:"ÜÇ";s:3:"剸";s:2:"ÜÈ";s:3:"剻";s:2:"ÜÉ";s:3:"剼";s:2:"ÜÊ";s:3:"å—ƒ";s:2:"ÜË";s:3:"å—›";s:2:"ÜÌ";s:3:"å—Œ";s:2:"ÜÍ";s:3:"å—";s:2:"ÜÎ";s:3:"å—‹";s:2:"ÜÏ";s:3:"å—Š";s:2:"ÜÐ";s:3:"å—";s:2:"ÜÑ";s:3:"å—€";s:2:"ÜÒ";s:3:"å—”";s:2:"ÜÓ";s:3:"å—„";s:2:"ÜÔ";s:3:"å—©";s:2:"ÜÕ";s:3:"å–¿";s:2:"ÜÖ";s:3:"å—’";s:2:"Ü×";s:3:"å–";s:2:"ÜØ";s:3:"å—";s:2:"ÜÙ";s:3:"å—•";s:2:"ÜÚ";s:3:"å—¢";s:2:"ÜÛ";s:3:"å—–";s:2:"ÜÜ";s:3:"å—ˆ";s:2:"ÜÝ";s:3:"å—²";s:2:"ÜÞ";s:3:"å—";s:2:"Üß";s:3:"å—™";s:2:"Üà";s:3:"å—‚";s:2:"Üá";s:3:"圔";s:2:"Üâ";s:3:"å¡“";s:2:"Üã";s:3:"塨";s:2:"Üä";s:3:"塤";s:2:"Üå";s:3:"å¡";s:2:"Üæ";s:3:"å¡";s:2:"Üç";s:3:"塉";s:2:"Üè";s:3:"塯";s:2:"Üé";s:3:"å¡•";s:2:"Üê";s:3:"塎";s:2:"Üë";s:3:"å¡";s:2:"Üì";s:3:"å¡™";s:2:"Üí";s:3:"å¡¥";s:2:"Üî";s:3:"å¡›";s:2:"Üï";s:3:"å ½";s:2:"Üð";s:3:"å¡£";s:2:"Üñ";s:3:"塱";s:2:"Üò";s:3:"壼";s:2:"Üó";s:3:"嫇";s:2:"Üô";s:3:"å«„";s:2:"Üõ";s:3:"å«‹";s:2:"Üö";s:3:"媺";s:2:"Ü÷";s:3:"媸";s:2:"Üø";s:3:"媱";s:2:"Üù";s:3:"媵";s:2:"Üú";s:3:"媰";s:2:"Üû";s:3:"媿";s:2:"Üü";s:3:"嫈";s:2:"Üý";s:3:"媻";s:2:"Üþ";s:3:"嫆";s:2:"Ý@";s:3:"媷";s:2:"ÝA";s:3:"å«€";s:2:"ÝB";s:3:"嫊";s:2:"ÝC";s:3:"媴";s:2:"ÝD";s:3:"媶";s:2:"ÝE";s:3:"å«";s:2:"ÝF";s:3:"媹";s:2:"ÝG";s:3:"åª";s:2:"ÝH";s:3:"寖";s:2:"ÝI";s:3:"寘";s:2:"ÝJ";s:3:"寙";s:2:"ÝK";s:3:"å°Ÿ";s:2:"ÝL";s:3:"å°³";s:2:"ÝM";s:3:"åµ±";s:2:"ÝN";s:3:"åµ£";s:2:"ÝO";s:3:"嵊";s:2:"ÝP";s:3:"åµ¥";s:2:"ÝQ";s:3:"åµ²";s:2:"ÝR";s:3:"嵬";s:2:"ÝS";s:3:"嵞";s:2:"ÝT";s:3:"嵨";s:2:"ÝU";s:3:"åµ§";s:2:"ÝV";s:3:"åµ¢";s:2:"ÝW";s:3:"å·°";s:2:"ÝX";s:3:"å¹";s:2:"ÝY";s:3:"幎";s:2:"ÝZ";s:3:"幊";s:2:"Ý[";s:3:"å¹";s:2:"Ý\";s:3:"幋";s:2:"Ý]";s:3:"å»…";s:2:"Ý^";s:3:"廌";s:2:"Ý_";s:3:"廆";s:2:"Ý`";s:3:"廋";s:2:"Ýa";s:3:"廇";s:2:"Ýb";s:3:"å½€";s:2:"Ýc";s:3:"徯";s:2:"Ýd";s:3:"å¾­";s:2:"Ýe";s:3:"惷";s:2:"Ýf";s:3:"æ…‰";s:2:"Ýg";s:3:"æ…Š";s:2:"Ýh";s:3:"æ„«";s:2:"Ýi";s:3:"æ……";s:2:"Ýj";s:3:"æ„¶";s:2:"Ýk";s:3:"愲";s:2:"Ýl";s:3:"æ„®";s:2:"Ým";s:3:"æ…†";s:2:"Ýn";s:3:"愯";s:2:"Ýo";s:3:"æ…";s:2:"Ýp";s:3:"æ„©";s:2:"Ýq";s:3:"æ…€";s:2:"Ýr";s:3:"戠";s:2:"Ýs";s:3:"é…¨";s:2:"Ýt";s:3:"戣";s:2:"Ýu";s:3:"戥";s:2:"Ýv";s:3:"戤";s:2:"Ýw";s:3:"æ…";s:2:"Ýx";s:3:"æ±";s:2:"Ýy";s:3:"æ«";s:2:"Ýz";s:3:"æ";s:2:"Ý{";s:3:"æ’";s:2:"Ý|";s:3:"æ‰";s:2:"Ý}";s:3:"æ ";s:2:"Ý~";s:3:"æ¤";s:2:"Ý¡";s:3:"æ³";s:2:"Ý¢";s:3:"摃";s:2:"Ý£";s:3:"æŸ";s:2:"ݤ";s:3:"æ•";s:2:"Ý¥";s:3:"æ˜";s:2:"ݦ";s:3:"æ¹";s:2:"ݧ";s:3:"æ·";s:2:"ݨ";s:3:"æ¢";s:2:"Ý©";s:3:"æ£";s:2:"ݪ";s:3:"æŒ";s:2:"Ý«";s:3:"æ¦";s:2:"ݬ";s:3:"æ°";s:2:"Ý­";s:3:"æ¨";s:2:"Ý®";s:3:"æ‘";s:2:"ݯ";s:3:"æµ";s:2:"ݰ";s:3:"æ¯";s:2:"ݱ";s:3:"æŠ";s:2:"ݲ";s:3:"æš";s:2:"ݳ";s:3:"æ‘€";s:2:"Ý´";s:3:"æ¥";s:2:"ݵ";s:3:"æ§";s:2:"ݶ";s:3:"æ‹";s:2:"Ý·";s:3:"æ§";s:2:"ݸ";s:3:"æ›";s:2:"ݹ";s:3:"æ®";s:2:"ݺ";s:3:"æ¡";s:2:"Ý»";s:3:"æŽ";s:2:"ݼ";s:3:"敯";s:2:"ݽ";s:3:"æ–’";s:2:"ݾ";s:3:"æ—“";s:2:"Ý¿";s:3:"暆";s:2:"ÝÀ";s:3:"暌";s:2:"ÝÁ";s:3:"æš•";s:2:"ÝÂ";s:3:"æš";s:2:"ÝÃ";s:3:"æš‹";s:2:"ÝÄ";s:3:"暊";s:2:"ÝÅ";s:3:"æš™";s:2:"ÝÆ";s:3:"æš”";s:2:"ÝÇ";s:3:"晸";s:2:"ÝÈ";s:3:"朠";s:2:"ÝÉ";s:3:"楦";s:2:"ÝÊ";s:3:"楟";s:2:"ÝË";s:3:"椸";s:2:"ÝÌ";s:3:"楎";s:2:"ÝÍ";s:3:"楢";s:2:"ÝÎ";s:3:"楱";s:2:"ÝÏ";s:3:"椿";s:2:"ÝÐ";s:3:"楅";s:2:"ÝÑ";s:3:"楪";s:2:"ÝÒ";s:3:"椹";s:2:"ÝÓ";s:3:"楂";s:2:"ÝÔ";s:3:"楗";s:2:"ÝÕ";s:3:"楙";s:2:"ÝÖ";s:3:"楺";s:2:"Ý×";s:3:"楈";s:2:"ÝØ";s:3:"楉";s:2:"ÝÙ";s:3:"椵";s:2:"ÝÚ";s:3:"楬";s:2:"ÝÛ";s:3:"椳";s:2:"ÝÜ";s:3:"椽";s:2:"ÝÝ";s:3:"楥";s:2:"ÝÞ";s:3:"棰";s:2:"Ýß";s:3:"楸";s:2:"Ýà";s:3:"椴";s:2:"Ýá";s:3:"楩";s:2:"Ýâ";s:3:"楀";s:2:"Ýã";s:3:"楯";s:2:"Ýä";s:3:"楄";s:2:"Ýå";s:3:"楶";s:2:"Ýæ";s:3:"楘";s:2:"Ýç";s:3:"æ¥";s:2:"Ýè";s:3:"楴";s:2:"Ýé";s:3:"楌";s:2:"Ýê";s:3:"椻";s:2:"Ýë";s:3:"楋";s:2:"Ýì";s:3:"椷";s:2:"Ýí";s:3:"楜";s:2:"Ýî";s:3:"æ¥";s:2:"Ýï";s:3:"楑";s:2:"Ýð";s:3:"椲";s:2:"Ýñ";s:3:"楒";s:2:"Ýò";s:3:"椯";s:2:"Ýó";s:3:"楻";s:2:"Ýô";s:3:"椼";s:2:"Ýõ";s:3:"æ­†";s:2:"Ýö";s:3:"æ­…";s:2:"Ý÷";s:3:"æ­ƒ";s:2:"Ýø";s:3:"æ­‚";s:2:"Ýù";s:3:"æ­ˆ";s:2:"Ýú";s:3:"æ­";s:2:"Ýû";s:3:"æ®›";s:2:"Ýü";s:3:"ï¨";s:2:"Ýý";s:3:"毻";s:2:"Ýþ";s:3:"毼";s:2:"Þ@";s:3:"毹";s:2:"ÞA";s:3:"毷";s:2:"ÞB";s:3:"毸";s:2:"ÞC";s:3:"溛";s:2:"ÞD";s:3:"æ»–";s:2:"ÞE";s:3:"滈";s:2:"ÞF";s:3:"æº";s:2:"ÞG";s:3:"滀";s:2:"ÞH";s:3:"溟";s:2:"ÞI";s:3:"溓";s:2:"ÞJ";s:3:"溔";s:2:"ÞK";s:3:"溠";s:2:"ÞL";s:3:"溱";s:2:"ÞM";s:3:"溹";s:2:"ÞN";s:3:"滆";s:2:"ÞO";s:3:"æ»’";s:2:"ÞP";s:3:"溽";s:2:"ÞQ";s:3:"æ»";s:2:"ÞR";s:3:"溞";s:2:"ÞS";s:3:"滉";s:2:"ÞT";s:3:"溷";s:2:"ÞU";s:3:"溰";s:2:"ÞV";s:3:"æ»";s:2:"ÞW";s:3:"溦";s:2:"ÞX";s:3:"æ»";s:2:"ÞY";s:3:"溲";s:2:"ÞZ";s:3:"溾";s:2:"Þ[";s:3:"滃";s:2:"Þ\";s:3:"滜";s:2:"Þ]";s:3:"滘";s:2:"Þ^";s:3:"溙";s:2:"Þ_";s:3:"溒";s:2:"Þ`";s:3:"溎";s:2:"Þa";s:3:"æº";s:2:"Þb";s:3:"溤";s:2:"Þc";s:3:"溡";s:2:"Þd";s:3:"溿";s:2:"Þe";s:3:"溳";s:2:"Þf";s:3:"æ»";s:2:"Þg";s:3:"滊";s:2:"Þh";s:3:"溗";s:2:"Þi";s:3:"溮";s:2:"Þj";s:3:"溣";s:2:"Þk";s:3:"ç…‡";s:2:"Þl";s:3:"ç…”";s:2:"Þm";s:3:"ç…’";s:2:"Þn";s:3:"ç…£";s:2:"Þo";s:3:"ç… ";s:2:"Þp";s:3:"ç…";s:2:"Þq";s:3:"ç…";s:2:"Þr";s:3:"ç…¢";s:2:"Þs";s:3:"ç…²";s:2:"Þt";s:3:"ç…¸";s:2:"Þu";s:3:"ç…ª";s:2:"Þv";s:3:"ç…¡";s:2:"Þw";s:3:"ç…‚";s:2:"Þx";s:3:"ç…˜";s:2:"Þy";s:3:"ç…ƒ";s:2:"Þz";s:3:"ç…‹";s:2:"Þ{";s:3:"ç…°";s:2:"Þ|";s:3:"ç…Ÿ";s:2:"Þ}";s:3:"ç…";s:2:"Þ~";s:3:"ç…“";s:2:"Þ¡";s:3:"ç…„";s:2:"Þ¢";s:3:"ç…";s:2:"Þ£";s:3:"ç…š";s:2:"Þ¤";s:3:"ç‰";s:2:"Þ¥";s:3:"çŠ";s:2:"Þ¦";s:3:"犌";s:2:"Þ§";s:3:"犑";s:2:"Þ¨";s:3:"çŠ";s:2:"Þ©";s:3:"犎";s:2:"Þª";s:3:"猼";s:2:"Þ«";s:3:"ç‚";s:2:"Þ¬";s:3:"猻";s:2:"Þ­";s:3:"猺";s:2:"Þ®";s:3:"ç€";s:2:"Þ¯";s:3:"çŠ";s:2:"Þ°";s:3:"ç‰";s:2:"Þ±";s:3:"ç‘„";s:2:"Þ²";s:3:"瑊";s:2:"Þ³";s:3:"ç‘‹";s:2:"Þ´";s:3:"ç‘’";s:2:"Þµ";s:3:"ç‘‘";s:2:"Þ¶";s:3:"ç‘—";s:2:"Þ·";s:3:"ç‘€";s:2:"Þ¸";s:3:"ç‘";s:2:"Þ¹";s:3:"ç‘";s:2:"Þº";s:3:"瑎";s:2:"Þ»";s:3:"ç‘‚";s:2:"Þ¼";s:3:"瑆";s:2:"Þ½";s:3:"ç‘";s:2:"Þ¾";s:3:"ç‘”";s:2:"Þ¿";s:3:"ç“¡";s:2:"ÞÀ";s:3:"ç“¿";s:2:"ÞÁ";s:3:"瓾";s:2:"ÞÂ";s:3:"瓽";s:2:"ÞÃ";s:3:"ç”";s:2:"ÞÄ";s:3:"畹";s:2:"ÞÅ";s:3:"ç•·";s:2:"ÞÆ";s:3:"榃";s:2:"ÞÇ";s:3:"ç—¯";s:2:"ÞÈ";s:3:"ç˜";s:2:"ÞÉ";s:3:"瘃";s:2:"ÞÊ";s:3:"ç—·";s:2:"ÞË";s:3:"ç—¾";s:2:"ÞÌ";s:3:"ç—¼";s:2:"ÞÍ";s:3:"ç—¹";s:2:"ÞÎ";s:3:"ç—¸";s:2:"ÞÏ";s:3:"ç˜";s:2:"ÞÐ";s:3:"ç—»";s:2:"ÞÑ";s:3:"ç—¶";s:2:"ÞÒ";s:3:"ç—­";s:2:"ÞÓ";s:3:"ç—µ";s:2:"ÞÔ";s:3:"ç—½";s:2:"ÞÕ";s:3:"çš™";s:2:"ÞÖ";s:3:"çšµ";s:2:"Þ×";s:3:"ç›";s:2:"ÞØ";s:3:"ç•";s:2:"ÞÙ";s:3:"çŸ";s:2:"ÞÚ";s:3:"ç ";s:2:"ÞÛ";s:3:"ç’";s:2:"ÞÜ";s:3:"ç–";s:2:"ÞÝ";s:3:"çš";s:2:"ÞÞ";s:3:"ç©";s:2:"Þß";s:3:"ç§";s:2:"Þà";s:3:"ç”";s:2:"Þá";s:3:"ç™";s:2:"Þâ";s:3:"ç­";s:2:"Þã";s:3:"矠";s:2:"Þä";s:3:"碇";s:2:"Þå";s:3:"碚";s:2:"Þæ";s:3:"碔";s:2:"Þç";s:3:"ç¢";s:2:"Þè";s:3:"碄";s:2:"Þé";s:3:"碕";s:2:"Þê";s:3:"碅";s:2:"Þë";s:3:"碆";s:2:"Þì";s:3:"碡";s:2:"Þí";s:3:"碃";s:2:"Þî";s:3:"硹";s:2:"Þï";s:3:"碙";s:2:"Þð";s:3:"碀";s:2:"Þñ";s:3:"碖";s:2:"Þò";s:3:"ç¡»";s:2:"Þó";s:3:"祼";s:2:"Þô";s:3:"禂";s:2:"Þõ";s:3:"祽";s:2:"Þö";s:3:"祹";s:2:"Þ÷";s:3:"稑";s:2:"Þø";s:3:"稘";s:2:"Þù";s:3:"稙";s:2:"Þú";s:3:"稒";s:2:"Þû";s:3:"稗";s:2:"Þü";s:3:"稕";s:2:"Þý";s:3:"稢";s:2:"Þþ";s:3:"稓";s:2:"ß@";s:3:"稛";s:2:"ßA";s:3:"ç¨";s:2:"ßB";s:3:"窣";s:2:"ßC";s:3:"窢";s:2:"ßD";s:3:"窞";s:2:"ßE";s:3:"ç««";s:2:"ßF";s:3:"ç­¦";s:2:"ßG";s:3:"ç­¤";s:2:"ßH";s:3:"ç­­";s:2:"ßI";s:3:"ç­´";s:2:"ßJ";s:3:"ç­©";s:2:"ßK";s:3:"ç­²";s:2:"ßL";s:3:"ç­¥";s:2:"ßM";s:3:"ç­³";s:2:"ßN";s:3:"ç­±";s:2:"ßO";s:3:"ç­°";s:2:"ßP";s:3:"ç­¡";s:2:"ßQ";s:3:"ç­¸";s:2:"ßR";s:3:"ç­¶";s:2:"ßS";s:3:"ç­£";s:2:"ßT";s:3:"ç²²";s:2:"ßU";s:3:"ç²´";s:2:"ßV";s:3:"粯";s:2:"ßW";s:3:"綈";s:2:"ßX";s:3:"綆";s:2:"ßY";s:3:"ç¶€";s:2:"ßZ";s:3:"ç¶";s:2:"ß[";s:3:"絿";s:2:"ß\";s:3:"ç¶…";s:2:"ß]";s:3:"絺";s:2:"ß^";s:3:"ç¶Ž";s:2:"ß_";s:3:"çµ»";s:2:"ß`";s:3:"綃";s:2:"ßa";s:3:"çµ¼";s:2:"ßb";s:3:"ç¶Œ";s:2:"ßc";s:3:"ç¶”";s:2:"ßd";s:3:"ç¶„";s:2:"ße";s:3:"çµ½";s:2:"ßf";s:3:"ç¶’";s:2:"ßg";s:3:"ç½­";s:2:"ßh";s:3:"罫";s:2:"ßi";s:3:"ç½§";s:2:"ßj";s:3:"罨";s:2:"ßk";s:3:"罬";s:2:"ßl";s:3:"羦";s:2:"ßm";s:3:"ç¾¥";s:2:"ßn";s:3:"ç¾§";s:2:"ßo";s:3:"ç¿›";s:2:"ßp";s:3:"翜";s:2:"ßq";s:3:"耡";s:2:"ßr";s:3:"è…¤";s:2:"ßs";s:3:"è… ";s:2:"ßt";s:3:"è…·";s:2:"ßu";s:3:"è…œ";s:2:"ßv";s:3:"è…©";s:2:"ßw";s:3:"è…›";s:2:"ßx";s:3:"è…¢";s:2:"ßy";s:3:"è…²";s:2:"ßz";s:3:"朡";s:2:"ß{";s:3:"è…ž";s:2:"ß|";s:3:"è…¶";s:2:"ß}";s:3:"è…§";s:2:"ß~";s:3:"è…¯";s:2:"ß¡";s:3:"è…„";s:2:"ߢ";s:3:"è…¡";s:2:"ߣ";s:3:"èˆ";s:2:"ߤ";s:3:"艉";s:2:"ߥ";s:3:"艄";s:2:"ߦ";s:3:"艀";s:2:"ß§";s:3:"艂";s:2:"ߨ";s:3:"艅";s:2:"ß©";s:3:"蓱";s:2:"ߪ";s:3:"è¿";s:2:"ß«";s:3:"è‘–";s:2:"߬";s:3:"è‘¶";s:2:"ß­";s:3:"葹";s:2:"ß®";s:3:"è’";s:2:"߯";s:3:"è’";s:2:"ß°";s:3:"è‘¥";s:2:"ß±";s:3:"è‘‘";s:2:"ß²";s:3:"è‘€";s:2:"ß³";s:3:"è’†";s:2:"ß´";s:3:"è‘§";s:2:"ßµ";s:3:"è°";s:2:"ß¶";s:3:"è‘";s:2:"ß·";s:3:"葽";s:2:"߸";s:3:"葚";s:2:"ß¹";s:3:"è‘™";s:2:"ߺ";s:3:"è‘´";s:2:"ß»";s:3:"葳";s:2:"ß¼";s:3:"è‘";s:2:"ß½";s:3:"蔇";s:2:"ß¾";s:3:"葞";s:2:"ß¿";s:3:"è·";s:2:"ßÀ";s:3:"èº";s:2:"ßÁ";s:3:"è´";s:2:"ßÂ";s:3:"葺";s:2:"ßÃ";s:3:"葃";s:2:"ßÄ";s:3:"葸";s:2:"ßÅ";s:3:"è²";s:2:"߯";s:3:"è‘…";s:2:"ßÇ";s:3:"è©";s:2:"ßÈ";s:3:"è™";s:2:"ßÉ";s:3:"è‘‹";s:2:"ßÊ";s:3:"è¯";s:2:"ßË";s:3:"è‘‚";s:2:"ßÌ";s:3:"è­";s:2:"ßÍ";s:3:"葟";s:2:"ßÎ";s:3:"è‘°";s:2:"ßÏ";s:3:"è¹";s:2:"ßÐ";s:3:"葎";s:2:"ßÑ";s:3:"葌";s:2:"ßÒ";s:3:"è‘’";s:2:"ßÓ";s:3:"葯";s:2:"ßÔ";s:3:"è“…";s:2:"ßÕ";s:3:"è’Ž";s:2:"ßÖ";s:3:"è»";s:2:"ß×";s:3:"葇";s:2:"ߨ";s:3:"è¶";s:2:"ßÙ";s:3:"è³";s:2:"ßÚ";s:3:"葨";s:2:"ßÛ";s:3:"葾";s:2:"ßÜ";s:3:"è‘„";s:2:"ßÝ";s:3:"è«";s:2:"ßÞ";s:3:"è‘ ";s:2:"ßß";s:3:"è‘”";s:2:"ßà";s:3:"è‘®";s:2:"ßá";s:3:"è‘";s:2:"ßâ";s:3:"蜋";s:2:"ßã";s:3:"蜄";s:2:"ßä";s:3:"è›·";s:2:"ßå";s:3:"蜌";s:2:"ßæ";s:3:"蛺";s:2:"ßç";s:3:"è›–";s:2:"ßè";s:3:"蛵";s:2:"ßé";s:3:"è";s:2:"ßê";s:3:"蛸";s:2:"ßë";s:3:"蜎";s:2:"ßì";s:3:"蜉";s:2:"ßí";s:3:"èœ";s:2:"ßî";s:3:"è›¶";s:2:"ßï";s:3:"èœ";s:2:"ßð";s:3:"蜅";s:2:"ßñ";s:3:"裖";s:2:"ßò";s:3:"裋";s:2:"ßó";s:3:"è£";s:2:"ßô";s:3:"裎";s:2:"ßõ";s:3:"裞";s:2:"ßö";s:3:"裛";s:2:"ß÷";s:3:"裚";s:2:"ßø";s:3:"裌";s:2:"ßù";s:3:"è£";s:2:"ßú";s:3:"覅";s:2:"ßû";s:3:"覛";s:2:"ßü";s:3:"è§Ÿ";s:2:"ßý";s:3:"è§¥";s:2:"ßþ";s:3:"觤";s:2:"à@";s:3:"è§¡";s:2:"àA";s:3:"è§ ";s:2:"àB";s:3:"è§¢";s:2:"àC";s:3:"è§œ";s:2:"àD";s:3:"触";s:2:"àE";s:3:"è©¶";s:2:"àF";s:3:"誆";s:2:"àG";s:3:"è©¿";s:2:"àH";s:3:"è©¡";s:2:"àI";s:3:"訿";s:2:"àJ";s:3:"è©·";s:2:"àK";s:3:"誂";s:2:"àL";s:3:"誄";s:2:"àM";s:3:"詵";s:2:"àN";s:3:"誃";s:2:"àO";s:3:"èª";s:2:"àP";s:3:"è©´";s:2:"àQ";s:3:"詺";s:2:"àR";s:3:"è°¼";s:2:"àS";s:3:"豋";s:2:"àT";s:3:"豊";s:2:"àU";s:3:"è±¥";s:2:"àV";s:3:"豤";s:2:"àW";s:3:"豦";s:2:"àX";s:3:"貆";s:2:"àY";s:3:"貄";s:2:"àZ";s:3:"è²…";s:2:"à[";s:3:"賌";s:2:"à\";s:3:"赨";s:2:"à]";s:3:"赩";s:2:"à^";s:3:"è¶‘";s:2:"à_";s:3:"è¶Œ";s:2:"à`";s:3:"è¶Ž";s:2:"àa";s:3:"è¶";s:2:"àb";s:3:"è¶";s:2:"àc";s:3:"è¶“";s:2:"àd";s:3:"è¶”";s:2:"àe";s:3:"è¶";s:2:"àf";s:3:"è¶’";s:2:"àg";s:3:"è·°";s:2:"àh";s:3:"è· ";s:2:"ài";s:3:"è·¬";s:2:"àj";s:3:"è·±";s:2:"àk";s:3:"è·®";s:2:"àl";s:3:"è·";s:2:"àm";s:3:"è·©";s:2:"àn";s:3:"è·£";s:2:"ào";s:3:"è·¢";s:2:"àp";s:3:"è·§";s:2:"àq";s:3:"è·²";s:2:"àr";s:3:"è·«";s:2:"às";s:3:"è·´";s:2:"àt";s:3:"輆";s:2:"àu";s:3:"軿";s:2:"àv";s:3:"è¼";s:2:"àw";s:3:"è¼€";s:2:"àx";s:3:"è¼…";s:2:"ày";s:3:"輇";s:2:"àz";s:3:"輈";s:2:"à{";s:3:"輂";s:2:"à|";s:3:"輋";s:2:"à}";s:3:"é’";s:2:"à~";s:3:"逿";s:2:"à¡";s:3:"é„";s:2:"à¢";s:3:"é‰";s:2:"à£";s:3:"逽";s:2:"à¤";s:3:"é„";s:2:"à¥";s:3:"é„";s:2:"à¦";s:3:"é„";s:2:"à§";s:3:"é„‘";s:2:"à¨";s:3:"é„–";s:2:"à©";s:3:"é„”";s:2:"àª";s:3:"é„‹";s:2:"à«";s:3:"鄎";s:2:"à¬";s:3:"é…®";s:2:"à­";s:3:"é…¯";s:2:"à®";s:3:"鉈";s:2:"à¯";s:3:"鉒";s:2:"à°";s:3:"鈰";s:2:"à±";s:3:"鈺";s:2:"à²";s:3:"鉦";s:2:"à³";s:3:"鈳";s:2:"à´";s:3:"鉥";s:2:"àµ";s:3:"鉞";s:2:"à¶";s:3:"銃";s:2:"à·";s:3:"鈮";s:2:"à¸";s:3:"鉊";s:2:"à¹";s:3:"鉆";s:2:"àº";s:3:"鉭";s:2:"à»";s:3:"鉬";s:2:"à¼";s:3:"é‰";s:2:"à½";s:3:"鉠";s:2:"à¾";s:3:"鉧";s:2:"à¿";s:3:"鉯";s:2:"àÀ";s:3:"鈶";s:2:"àÁ";s:3:"鉡";s:2:"àÂ";s:3:"鉰";s:2:"àÃ";s:3:"鈱";s:2:"àÄ";s:3:"鉔";s:2:"àÅ";s:3:"鉣";s:2:"àÆ";s:3:"é‰";s:2:"àÇ";s:3:"鉲";s:2:"àÈ";s:3:"鉎";s:2:"àÉ";s:3:"鉓";s:2:"àÊ";s:3:"鉌";s:2:"àË";s:3:"鉖";s:2:"àÌ";s:3:"鈲";s:2:"àÍ";s:3:"é–Ÿ";s:2:"àÎ";s:3:"é–œ";s:2:"àÏ";s:3:"é–ž";s:2:"àÐ";s:3:"é–›";s:2:"àÑ";s:3:"éš’";s:2:"àÒ";s:3:"éš“";s:2:"àÓ";s:3:"éš‘";s:2:"àÔ";s:3:"éš—";s:2:"àÕ";s:3:"雎";s:2:"àÖ";s:3:"雺";s:2:"à×";s:3:"雽";s:2:"àØ";s:3:"雸";s:2:"àÙ";s:3:"雵";s:2:"àÚ";s:3:"é³";s:2:"àÛ";s:3:"é·";s:2:"àÜ";s:3:"é¸";s:2:"àÝ";s:3:"é²";s:2:"àÞ";s:3:"é ";s:2:"àß";s:3:"é ";s:2:"àà";s:3:"é Ž";s:2:"àá";s:3:"颬";s:2:"àâ";s:3:"飶";s:2:"àã";s:3:"飹";s:2:"àä";s:3:"馯";s:2:"àå";s:3:"馲";s:2:"àæ";s:3:"馰";s:2:"àç";s:3:"馵";s:2:"àè";s:3:"骭";s:2:"àé";s:3:"骫";s:2:"àê";s:3:"é­›";s:2:"àë";s:3:"鳪";s:2:"àì";s:3:"é³­";s:2:"àí";s:3:"é³§";s:2:"àî";s:3:"麀";s:2:"àï";s:3:"黽";s:2:"àð";s:3:"僦";s:2:"àñ";s:3:"僔";s:2:"àò";s:3:"僗";s:2:"àó";s:3:"僨";s:2:"àô";s:3:"僳";s:2:"àõ";s:3:"僛";s:2:"àö";s:3:"僪";s:2:"à÷";s:3:"åƒ";s:2:"àø";s:3:"僤";s:2:"àù";s:3:"僓";s:2:"àú";s:3:"僬";s:2:"àû";s:3:"僰";s:2:"àü";s:3:"僯";s:2:"àý";s:3:"僣";s:2:"àþ";s:3:"僠";s:2:"á@";s:3:"凘";s:2:"áA";s:3:"劀";s:2:"áB";s:3:"åŠ";s:2:"áC";s:3:"å‹©";s:2:"áD";s:3:"å‹«";s:2:"áE";s:3:"匰";s:2:"áF";s:3:"厬";s:2:"áG";s:3:"嘧";s:2:"áH";s:3:"嘕";s:2:"áI";s:3:"嘌";s:2:"áJ";s:3:"嘒";s:2:"áK";s:3:"å—¼";s:2:"áL";s:3:"å˜";s:2:"áM";s:3:"嘜";s:2:"áN";s:3:"å˜";s:2:"áO";s:3:"嘓";s:2:"áP";s:3:"嘂";s:2:"áQ";s:3:"å—º";s:2:"áR";s:3:"å˜";s:2:"áS";s:3:"嘄";s:2:"áT";s:3:"å—¿";s:2:"áU";s:3:"å—¹";s:2:"áV";s:3:"墉";s:2:"áW";s:3:"塼";s:2:"áX";s:3:"å¢";s:2:"áY";s:3:"墘";s:2:"áZ";s:3:"墆";s:2:"á[";s:3:"å¢";s:2:"á\";s:3:"å¡¿";s:2:"á]";s:3:"å¡´";s:2:"á^";s:3:"墋";s:2:"á_";s:3:"塺";s:2:"á`";s:3:"墇";s:2:"áa";s:3:"墑";s:2:"áb";s:3:"墎";s:2:"ác";s:3:"å¡¶";s:2:"ád";s:3:"墂";s:2:"áe";s:3:"墈";s:2:"áf";s:3:"å¡»";s:2:"ág";s:3:"墔";s:2:"áh";s:3:"å¢";s:2:"ái";s:3:"壾";s:2:"áj";s:3:"奫";s:2:"ák";s:3:"嫜";s:2:"ál";s:3:"å«®";s:2:"ám";s:3:"å«¥";s:2:"án";s:3:"å«•";s:2:"áo";s:3:"嫪";s:2:"áp";s:3:"嫚";s:2:"áq";s:3:"å«­";s:2:"ár";s:3:"å««";s:2:"ás";s:3:"嫳";s:2:"át";s:3:"å«¢";s:2:"áu";s:3:"å« ";s:2:"áv";s:3:"å«›";s:2:"áw";s:3:"嫬";s:2:"áx";s:3:"嫞";s:2:"áy";s:3:"å«";s:2:"áz";s:3:"å«™";s:2:"á{";s:3:"嫨";s:2:"á|";s:3:"嫟";s:2:"á}";s:3:"å­·";s:2:"á~";s:3:"寠";s:2:"á¡";s:3:"寣";s:2:"á¢";s:3:"å±£";s:2:"á£";s:3:"å¶‚";s:2:"á¤";s:3:"å¶€";s:2:"á¥";s:3:"åµ½";s:2:"á¦";s:3:"嶆";s:2:"á§";s:3:"嵺";s:2:"á¨";s:3:"å¶";s:2:"á©";s:3:"åµ·";s:2:"áª";s:3:"å¶Š";s:2:"á«";s:3:"嶉";s:2:"á¬";s:3:"嶈";s:2:"á­";s:3:"åµ¾";s:2:"á®";s:3:"åµ¼";s:2:"á¯";s:3:"å¶";s:2:"á°";s:3:"åµ¹";s:2:"á±";s:3:"嵿";s:2:"á²";s:3:"幘";s:2:"á³";s:3:"å¹™";s:2:"á´";s:3:"幓";s:2:"áµ";s:3:"廘";s:2:"á¶";s:3:"廑";s:2:"á·";s:3:"å»—";s:2:"á¸";s:3:"廎";s:2:"á¹";s:3:"廜";s:2:"áº";s:3:"廕";s:2:"á»";s:3:"å»™";s:2:"á¼";s:3:"å»’";s:2:"á½";s:3:"å»”";s:2:"á¾";s:3:"彄";s:2:"á¿";s:3:"彃";s:2:"áÀ";s:3:"彯";s:2:"áÁ";s:3:"å¾¶";s:2:"áÂ";s:3:"愬";s:2:"áÃ";s:3:"愨";s:2:"áÄ";s:3:"æ…";s:2:"áÅ";s:3:"æ…ž";s:2:"áÆ";s:3:"æ…±";s:2:"áÇ";s:3:"æ…³";s:2:"áÈ";s:3:"æ…’";s:2:"áÉ";s:3:"æ…“";s:2:"áÊ";s:3:"æ…²";s:2:"áË";s:3:"æ…¬";s:2:"áÌ";s:3:"憀";s:2:"áÍ";s:3:"æ…´";s:2:"áÎ";s:3:"æ…”";s:2:"áÏ";s:3:"æ…º";s:2:"áÐ";s:3:"æ…›";s:2:"áÑ";s:3:"æ…¥";s:2:"áÒ";s:3:"æ„»";s:2:"áÓ";s:3:"æ…ª";s:2:"áÔ";s:3:"æ…¡";s:2:"áÕ";s:3:"æ…–";s:2:"áÖ";s:3:"戩";s:2:"á×";s:3:"戧";s:2:"áØ";s:3:"戫";s:2:"áÙ";s:3:"æ«";s:2:"áÚ";s:3:"æ‘";s:2:"áÛ";s:3:"æ‘›";s:2:"áÜ";s:3:"æ‘";s:2:"áÝ";s:3:"æ‘´";s:2:"áÞ";s:3:"æ‘¶";s:2:"áß";s:3:"摲";s:2:"áà";s:3:"摳";s:2:"áá";s:3:"摽";s:2:"áâ";s:3:"摵";s:2:"áã";s:3:"摦";s:2:"áä";s:3:"æ’¦";s:2:"áå";s:3:"摎";s:2:"áæ";s:3:"æ’‚";s:2:"áç";s:3:"摞";s:2:"áè";s:3:"摜";s:2:"áé";s:3:"æ‘‹";s:2:"áê";s:3:"æ‘“";s:2:"áë";s:3:"æ‘ ";s:2:"áì";s:3:"æ‘";s:2:"áí";s:3:"æ‘¿";s:2:"áî";s:3:"æ¿";s:2:"áï";s:3:"摬";s:2:"áð";s:3:"æ‘«";s:2:"áñ";s:3:"æ‘™";s:2:"áò";s:3:"æ‘¥";s:2:"áó";s:3:"æ‘·";s:2:"áô";s:3:"敳";s:2:"áõ";s:3:"æ– ";s:2:"áö";s:3:"æš¡";s:2:"á÷";s:3:"æš ";s:2:"áø";s:3:"暟";s:2:"áù";s:3:"朅";s:2:"áú";s:3:"朄";s:2:"áû";s:3:"朢";s:2:"áü";s:3:"榱";s:2:"áý";s:3:"榶";s:2:"áþ";s:3:"槉";s:2:"â@";s:3:"榠";s:2:"âA";s:3:"æ§Ž";s:2:"âB";s:3:"榖";s:2:"âC";s:3:"榰";s:2:"âD";s:3:"榬";s:2:"âE";s:3:"榼";s:2:"âF";s:3:"榑";s:2:"âG";s:3:"榙";s:2:"âH";s:3:"榎";s:2:"âI";s:3:"榧";s:2:"âJ";s:3:"æ¦";s:2:"âK";s:3:"榩";s:2:"âL";s:3:"榾";s:2:"âM";s:3:"榯";s:2:"âN";s:3:"榿";s:2:"âO";s:3:"æ§„";s:2:"âP";s:3:"榽";s:2:"âQ";s:3:"榤";s:2:"âR";s:3:"æ§”";s:2:"âS";s:3:"榹";s:2:"âT";s:3:"æ§Š";s:2:"âU";s:3:"榚";s:2:"âV";s:3:"æ§";s:2:"âW";s:3:"榳";s:2:"âX";s:3:"榓";s:2:"âY";s:3:"榪";s:2:"âZ";s:3:"榡";s:2:"â[";s:3:"榞";s:2:"â\";s:3:"æ§™";s:2:"â]";s:3:"榗";s:2:"â^";s:3:"æ¦";s:2:"â_";s:3:"æ§‚";s:2:"â`";s:3:"榵";s:2:"âa";s:3:"榥";s:2:"âb";s:3:"槆";s:2:"âc";s:3:"æ­Š";s:2:"âd";s:3:"æ­";s:2:"âe";s:3:"æ­‹";s:2:"âf";s:3:"殞";s:2:"âg";s:3:"殟";s:2:"âh";s:3:"æ® ";s:2:"âi";s:3:"毃";s:2:"âj";s:3:"毄";s:2:"âk";s:3:"毾";s:2:"âl";s:3:"滎";s:2:"âm";s:3:"滵";s:2:"ân";s:3:"æ»±";s:2:"âo";s:3:"漃";s:2:"âp";s:3:"æ¼¥";s:2:"âq";s:3:"滸";s:2:"âr";s:3:"æ¼·";s:2:"âs";s:3:"æ»»";s:2:"ât";s:3:"æ¼®";s:2:"âu";s:3:"漉";s:2:"âv";s:3:"潎";s:2:"âw";s:3:"æ¼™";s:2:"âx";s:3:"漚";s:2:"ây";s:3:"æ¼§";s:2:"âz";s:3:"漘";s:2:"â{";s:3:"æ¼»";s:2:"â|";s:3:"æ¼’";s:2:"â}";s:3:"æ»­";s:2:"â~";s:3:"漊";s:2:"â¡";s:3:"æ¼¶";s:2:"â¢";s:3:"æ½³";s:2:"â£";s:3:"滹";s:2:"â¤";s:3:"æ»®";s:2:"â¥";s:3:"æ¼­";s:2:"â¦";s:3:"æ½€";s:2:"â§";s:3:"æ¼°";s:2:"â¨";s:3:"æ¼¼";s:2:"â©";s:3:"æ¼µ";s:2:"âª";s:3:"滫";s:2:"â«";s:3:"漇";s:2:"â¬";s:3:"漎";s:2:"â­";s:3:"潃";s:2:"â®";s:3:"æ¼…";s:2:"â¯";s:3:"滽";s:2:"â°";s:3:"æ»¶";s:2:"â±";s:3:"æ¼¹";s:2:"â²";s:3:"漜";s:2:"â³";s:3:"滼";s:2:"â´";s:3:"漺";s:2:"âµ";s:3:"漟";s:2:"â¶";s:3:"æ¼";s:2:"â·";s:3:"漞";s:2:"â¸";s:3:"漈";s:2:"â¹";s:3:"漡";s:2:"âº";s:3:"熇";s:2:"â»";s:3:"ç†";s:2:"â¼";s:3:"熉";s:2:"â½";s:3:"熀";s:2:"â¾";s:3:"熅";s:2:"â¿";s:3:"熂";s:2:"âÀ";s:3:"ç†";s:2:"âÁ";s:3:"ç…»";s:2:"âÂ";s:3:"熆";s:2:"âÃ";s:3:"ç†";s:2:"âÄ";s:3:"熗";s:2:"âÅ";s:3:"牄";s:2:"âÆ";s:3:"牓";s:2:"âÇ";s:3:"犗";s:2:"âÈ";s:3:"犕";s:2:"âÉ";s:3:"犓";s:2:"âÊ";s:3:"çƒ";s:2:"âË";s:3:"ç";s:2:"âÌ";s:3:"ç‘";s:2:"âÍ";s:3:"çŒ";s:2:"âÎ";s:3:"ç‘¢";s:2:"âÏ";s:3:"瑳";s:2:"âÐ";s:3:"瑱";s:2:"âÑ";s:3:"瑵";s:2:"âÒ";s:3:"瑲";s:2:"âÓ";s:3:"ç‘§";s:2:"âÔ";s:3:"ç‘®";s:2:"âÕ";s:3:"甀";s:2:"âÖ";s:3:"甂";s:2:"â×";s:3:"甃";s:2:"âØ";s:3:"畽";s:2:"âÙ";s:3:"ç–";s:2:"âÚ";s:3:"瘖";s:2:"âÛ";s:3:"瘈";s:2:"âÜ";s:3:"瘌";s:2:"âÝ";s:3:"瘕";s:2:"âÞ";s:3:"瘑";s:2:"âß";s:3:"瘊";s:2:"âà";s:3:"瘔";s:2:"âá";s:3:"皸";s:2:"ââ";s:3:"çž";s:2:"âã";s:3:"ç¼";s:2:"âä";s:3:"çž…";s:2:"âå";s:3:"çž‚";s:2:"âæ";s:3:"ç®";s:2:"âç";s:3:"瞀";s:2:"âè";s:3:"ç¯";s:2:"âé";s:3:"ç¾";s:2:"âê";s:3:"瞃";s:2:"âë";s:3:"碲";s:2:"âì";s:3:"碪";s:2:"âí";s:3:"碴";s:2:"âî";s:3:"碭";s:2:"âï";s:3:"碨";s:2:"âð";s:3:"硾";s:2:"âñ";s:3:"碫";s:2:"âò";s:3:"碞";s:2:"âó";s:3:"碥";s:2:"âô";s:3:"碠";s:2:"âõ";s:3:"碬";s:2:"âö";s:3:"碢";s:2:"â÷";s:3:"碤";s:2:"âø";s:3:"禘";s:2:"âù";s:3:"禊";s:2:"âú";s:3:"禋";s:2:"âû";s:3:"禖";s:2:"âü";s:3:"禕";s:2:"âý";s:3:"禔";s:2:"âþ";s:3:"禓";s:2:"ã@";s:3:"禗";s:2:"ãA";s:3:"禈";s:2:"ãB";s:3:"禒";s:2:"ãC";s:3:"ç¦";s:2:"ãD";s:3:"稫";s:2:"ãE";s:3:"穊";s:2:"ãF";s:3:"稰";s:2:"ãG";s:3:"稯";s:2:"ãH";s:3:"稨";s:2:"ãI";s:3:"稦";s:2:"ãJ";s:3:"窨";s:2:"ãK";s:3:"窫";s:2:"ãL";s:3:"窬";s:2:"ãM";s:3:"ç«®";s:2:"ãN";s:3:"箈";s:2:"ãO";s:3:"箜";s:2:"ãP";s:3:"箊";s:2:"ãQ";s:3:"箑";s:2:"ãR";s:3:"ç®";s:2:"ãS";s:3:"ç®–";s:2:"ãT";s:3:"ç®";s:2:"ãU";s:3:"箌";s:2:"ãV";s:3:"ç®›";s:2:"ãW";s:3:"箎";s:2:"ãX";s:3:"ç®…";s:2:"ãY";s:3:"箘";s:2:"ãZ";s:3:"劄";s:2:"ã[";s:3:"ç®™";s:2:"ã\";s:3:"箤";s:2:"ã]";s:3:"箂";s:2:"ã^";s:3:"ç²»";s:2:"ã_";s:3:"粿";s:2:"ã`";s:3:"ç²¼";s:2:"ãa";s:3:"粺";s:2:"ãb";s:3:"ç¶§";s:2:"ãc";s:3:"ç¶·";s:2:"ãd";s:3:"ç·‚";s:2:"ãe";s:3:"ç¶£";s:2:"ãf";s:3:"綪";s:2:"ãg";s:3:"ç·";s:2:"ãh";s:3:"ç·€";s:2:"ãi";s:3:"ç·…";s:2:"ãj";s:3:"ç¶";s:2:"ãk";s:3:"ç·Ž";s:2:"ãl";s:3:"ç·„";s:2:"ãm";s:3:"ç·†";s:2:"ãn";s:3:"ç·‹";s:2:"ão";s:3:"ç·Œ";s:2:"ãp";s:3:"綯";s:2:"ãq";s:3:"ç¶¹";s:2:"ãr";s:3:"ç¶–";s:2:"ãs";s:3:"ç¶¼";s:2:"ãt";s:3:"ç¶Ÿ";s:2:"ãu";s:3:"綦";s:2:"ãv";s:3:"ç¶®";s:2:"ãw";s:3:"ç¶©";s:2:"ãx";s:3:"ç¶¡";s:2:"ãy";s:3:"ç·‰";s:2:"ãz";s:3:"ç½³";s:2:"ã{";s:3:"ç¿¢";s:2:"ã|";s:3:"ç¿£";s:2:"ã}";s:3:"ç¿¥";s:2:"ã~";s:3:"翞";s:2:"ã¡";s:3:"耤";s:2:"ã¢";s:3:"è";s:2:"ã£";s:3:"èœ";s:2:"ã¤";s:3:"膉";s:2:"ã¥";s:3:"膆";s:2:"ã¦";s:3:"膃";s:2:"ã§";s:3:"膇";s:2:"ã¨";s:3:"è†";s:2:"ã©";s:3:"膌";s:2:"ãª";s:3:"膋";s:2:"ã«";s:3:"舕";s:2:"ã¬";s:3:"è’—";s:2:"ã­";s:3:"è’¤";s:2:"ã®";s:3:"è’¡";s:2:"ã¯";s:3:"è’Ÿ";s:2:"ã°";s:3:"è’º";s:2:"ã±";s:3:"蓎";s:2:"ã²";s:3:"è“‚";s:2:"ã³";s:3:"è’¬";s:2:"ã´";s:3:"è’®";s:2:"ãµ";s:3:"è’«";s:2:"ã¶";s:3:"è’¹";s:2:"ã·";s:3:"è’´";s:2:"ã¸";s:3:"è“";s:2:"ã¹";s:3:"è“";s:2:"ãº";s:3:"è’ª";s:2:"ã»";s:3:"è’š";s:2:"ã¼";s:3:"è’±";s:2:"ã½";s:3:"è“";s:2:"ã¾";s:3:"è’";s:2:"ã¿";s:3:"è’§";s:2:"ãÀ";s:3:"è’»";s:2:"ãÁ";s:3:"è’¢";s:2:"ãÂ";s:3:"è’”";s:2:"ãÃ";s:3:"蓇";s:2:"ãÄ";s:3:"蓌";s:2:"ãÅ";s:3:"è’›";s:2:"ãÆ";s:3:"è’©";s:2:"ãÇ";s:3:"è’¯";s:2:"ãÈ";s:3:"è’¨";s:2:"ãÉ";s:3:"è“–";s:2:"ãÊ";s:3:"è’˜";s:2:"ãË";s:3:"è’¶";s:2:"ãÌ";s:3:"è“";s:2:"ãÍ";s:3:"è’ ";s:2:"ãÎ";s:3:"è“—";s:2:"ãÏ";s:3:"è“”";s:2:"ãÐ";s:3:"è“’";s:2:"ãÑ";s:3:"è“›";s:2:"ãÒ";s:3:"è’°";s:2:"ãÓ";s:3:"è’‘";s:2:"ãÔ";s:3:"虡";s:2:"ãÕ";s:3:"蜳";s:2:"ãÖ";s:3:"蜣";s:2:"ã×";s:3:"蜨";s:2:"ãØ";s:3:"è«";s:2:"ãÙ";s:3:"è€";s:2:"ãÚ";s:3:"蜮";s:2:"ãÛ";s:3:"蜞";s:2:"ãÜ";s:3:"蜡";s:2:"ãÝ";s:3:"蜙";s:2:"ãÞ";s:3:"蜛";s:2:"ãß";s:3:"èƒ";s:2:"ãà";s:3:"蜬";s:2:"ãá";s:3:"è";s:2:"ãâ";s:3:"蜾";s:2:"ãã";s:3:"è†";s:2:"ãä";s:3:"蜠";s:2:"ãå";s:3:"蜲";s:2:"ãæ";s:3:"蜪";s:2:"ãç";s:3:"蜭";s:2:"ãè";s:3:"蜼";s:2:"ãé";s:3:"蜒";s:2:"ãê";s:3:"蜺";s:2:"ãë";s:3:"蜱";s:2:"ãì";s:3:"蜵";s:2:"ãí";s:3:"è‚";s:2:"ãî";s:3:"蜦";s:2:"ãï";s:3:"蜧";s:2:"ãð";s:3:"蜸";s:2:"ãñ";s:3:"蜤";s:2:"ãò";s:3:"蜚";s:2:"ãó";s:3:"蜰";s:2:"ãô";s:3:"蜑";s:2:"ãõ";s:3:"裷";s:2:"ãö";s:3:"裧";s:2:"ã÷";s:3:"裱";s:2:"ãø";s:3:"裲";s:2:"ãù";s:3:"裺";s:2:"ãú";s:3:"裾";s:2:"ãû";s:3:"裮";s:2:"ãü";s:3:"裼";s:2:"ãý";s:3:"裶";s:2:"ãþ";s:3:"裻";s:2:"ä@";s:3:"裰";s:2:"äA";s:3:"裬";s:2:"äB";s:3:"裫";s:2:"äC";s:3:"è¦";s:2:"äD";s:3:"覡";s:2:"äE";s:3:"覟";s:2:"äF";s:3:"覞";s:2:"äG";s:3:"è§©";s:2:"äH";s:3:"è§«";s:2:"äI";s:3:"觨";s:2:"äJ";s:3:"誫";s:2:"äK";s:3:"誙";s:2:"äL";s:3:"誋";s:2:"äM";s:3:"誒";s:2:"äN";s:3:"èª";s:2:"äO";s:3:"誖";s:2:"äP";s:3:"è°½";s:2:"äQ";s:3:"豨";s:2:"äR";s:3:"豩";s:2:"äS";s:3:"賕";s:2:"äT";s:3:"è³";s:2:"äU";s:3:"è³—";s:2:"äV";s:3:"è¶–";s:2:"äW";s:3:"踉";s:2:"äX";s:3:"踂";s:2:"äY";s:3:"è·¿";s:2:"äZ";s:3:"è¸";s:2:"ä[";s:3:"è·½";s:2:"ä\";s:3:"踊";s:2:"ä]";s:3:"踃";s:2:"ä^";s:3:"踇";s:2:"ä_";s:3:"踆";s:2:"ä`";s:3:"踅";s:2:"äa";s:3:"è·¾";s:2:"äb";s:3:"踀";s:2:"äc";s:3:"踄";s:2:"äd";s:3:"è¼";s:2:"äe";s:3:"輑";s:2:"äf";s:3:"輎";s:2:"äg";s:3:"è¼";s:2:"äh";s:3:"é„£";s:2:"äi";s:3:"鄜";s:2:"äj";s:3:"é„ ";s:2:"äk";s:3:"é„¢";s:2:"äl";s:3:"鄟";s:2:"äm";s:3:"é„";s:2:"än";s:3:"鄚";s:2:"äo";s:3:"鄤";s:2:"äp";s:3:"é„¡";s:2:"äq";s:3:"é„›";s:2:"är";s:3:"é…º";s:2:"äs";s:3:"é…²";s:2:"ät";s:3:"é…¹";s:2:"äu";s:3:"é…³";s:2:"äv";s:3:"銥";s:2:"äw";s:3:"銤";s:2:"äx";s:3:"鉶";s:2:"äy";s:3:"銛";s:2:"äz";s:3:"鉺";s:2:"ä{";s:3:"銠";s:2:"ä|";s:3:"銔";s:2:"ä}";s:3:"銪";s:2:"ä~";s:3:"éŠ";s:2:"ä¡";s:3:"銦";s:2:"ä¢";s:3:"銚";s:2:"ä£";s:3:"銫";s:2:"ä¤";s:3:"鉹";s:2:"ä¥";s:3:"銗";s:2:"ä¦";s:3:"鉿";s:2:"ä§";s:3:"銣";s:2:"ä¨";s:3:"é‹®";s:2:"ä©";s:3:"銎";s:2:"äª";s:3:"銂";s:2:"ä«";s:3:"銕";s:2:"ä¬";s:3:"銢";s:2:"ä­";s:3:"鉽";s:2:"ä®";s:3:"銈";s:2:"ä¯";s:3:"銡";s:2:"ä°";s:3:"銊";s:2:"ä±";s:3:"銆";s:2:"ä²";s:3:"銌";s:2:"ä³";s:3:"銙";s:2:"ä´";s:3:"銧";s:2:"äµ";s:3:"鉾";s:2:"ä¶";s:3:"銇";s:2:"ä·";s:3:"銩";s:2:"ä¸";s:3:"éŠ";s:2:"ä¹";s:3:"銋";s:2:"äº";s:3:"鈭";s:2:"ä»";s:3:"éšž";s:2:"ä¼";s:3:"éš¡";s:2:"ä½";s:3:"雿";s:2:"ä¾";s:3:"é˜";s:2:"ä¿";s:3:"é½";s:2:"äÀ";s:3:"éº";s:2:"äÁ";s:3:"é¾";s:2:"äÂ";s:3:"鞃";s:2:"äÃ";s:3:"鞀";s:2:"äÄ";s:3:"éž‚";s:2:"äÅ";s:3:"é»";s:2:"äÆ";s:3:"éž„";s:2:"äÇ";s:3:"éž";s:2:"äÈ";s:3:"é¿";s:2:"äÉ";s:3:"韎";s:2:"äÊ";s:3:"éŸ";s:2:"äË";s:3:"é –";s:2:"äÌ";s:3:"颭";s:2:"äÍ";s:3:"颮";s:2:"äÎ";s:3:"餂";s:2:"äÏ";s:3:"餀";s:2:"äÐ";s:3:"餇";s:2:"äÑ";s:3:"é¦";s:2:"äÒ";s:3:"馜";s:2:"äÓ";s:3:"駃";s:2:"äÔ";s:3:"馹";s:2:"äÕ";s:3:"馻";s:2:"äÖ";s:3:"馺";s:2:"ä×";s:3:"é§‚";s:2:"äØ";s:3:"馽";s:2:"äÙ";s:3:"駇";s:2:"äÚ";s:3:"骱";s:2:"äÛ";s:3:"é«£";s:2:"äÜ";s:3:"é«§";s:2:"äÝ";s:3:"鬾";s:2:"äÞ";s:3:"鬿";s:2:"äß";s:3:"é­ ";s:2:"äà";s:3:"é­¡";s:2:"äá";s:3:"é­Ÿ";s:2:"äâ";s:3:"é³±";s:2:"äã";s:3:"é³²";s:2:"ää";s:3:"é³µ";s:2:"äå";s:3:"麧";s:2:"äæ";s:3:"僿";s:2:"äç";s:3:"儃";s:2:"äè";s:3:"å„°";s:2:"äé";s:3:"僸";s:2:"äê";s:3:"儆";s:2:"äë";s:3:"儇";s:2:"äì";s:3:"僶";s:2:"äí";s:3:"僾";s:2:"äî";s:3:"å„‹";s:2:"äï";s:3:"儌";s:2:"äð";s:3:"僽";s:2:"äñ";s:3:"儊";s:2:"äò";s:3:"劋";s:2:"äó";s:3:"劌";s:2:"äô";s:3:"勱";s:2:"äõ";s:3:"勯";s:2:"äö";s:3:"噈";s:2:"ä÷";s:3:"噂";s:2:"äø";s:3:"噌";s:2:"äù";s:3:"嘵";s:2:"äú";s:3:"å™";s:2:"äû";s:3:"噊";s:2:"äü";s:3:"噉";s:2:"äý";s:3:"噆";s:2:"äþ";s:3:"噘";s:2:"å@";s:3:"噚";s:2:"åA";s:3:"噀";s:2:"åB";s:3:"嘳";s:2:"åC";s:3:"嘽";s:2:"åD";s:3:"嘬";s:2:"åE";s:3:"嘾";s:2:"åF";s:3:"嘸";s:2:"åG";s:3:"嘪";s:2:"åH";s:3:"嘺";s:2:"åI";s:3:"圚";s:2:"åJ";s:3:"墫";s:2:"åK";s:3:"å¢";s:2:"åL";s:3:"墱";s:2:"åM";s:3:"墠";s:2:"åN";s:3:"墣";s:2:"åO";s:3:"墯";s:2:"åP";s:3:"墬";s:2:"åQ";s:3:"墥";s:2:"åR";s:3:"墡";s:2:"åS";s:3:"壿";s:2:"åT";s:3:"å«¿";s:2:"åU";s:3:"å«´";s:2:"åV";s:3:"嫽";s:2:"åW";s:3:"å«·";s:2:"åX";s:3:"å«¶";s:2:"åY";s:3:"嬃";s:2:"åZ";s:3:"嫸";s:2:"å[";s:3:"嬂";s:2:"å\";s:3:"嫹";s:2:"å]";s:3:"å¬";s:2:"å^";s:3:"嬇";s:2:"å_";s:3:"嬅";s:2:"å`";s:3:"å¬";s:2:"åa";s:3:"å±§";s:2:"åb";s:3:"å¶™";s:2:"åc";s:3:"å¶—";s:2:"åd";s:3:"å¶Ÿ";s:2:"åe";s:3:"å¶’";s:2:"åf";s:3:"å¶¢";s:2:"åg";s:3:"å¶“";s:2:"åh";s:3:"å¶•";s:2:"åi";s:3:"å¶ ";s:2:"åj";s:3:"å¶œ";s:2:"åk";s:3:"å¶¡";s:2:"ål";s:3:"å¶š";s:2:"åm";s:3:"å¶ž";s:2:"ån";s:3:"幩";s:2:"åo";s:3:"å¹";s:2:"åp";s:3:"å¹ ";s:2:"åq";s:3:"幜";s:2:"år";s:3:"ç·³";s:2:"ås";s:3:"å»›";s:2:"åt";s:3:"廞";s:2:"åu";s:3:"廡";s:2:"åv";s:3:"彉";s:2:"åw";s:3:"å¾²";s:2:"åx";s:3:"憋";s:2:"åy";s:3:"憃";s:2:"åz";s:3:"æ…¹";s:2:"å{";s:3:"憱";s:2:"å|";s:3:"憰";s:2:"å}";s:3:"憢";s:2:"å~";s:3:"憉";s:2:"å¡";s:3:"憛";s:2:"å¢";s:3:"憓";s:2:"å£";s:3:"憯";s:2:"å¤";s:3:"憭";s:2:"å¥";s:3:"憟";s:2:"å¦";s:3:"憒";s:2:"å§";s:3:"憪";s:2:"å¨";s:3:"憡";s:2:"å©";s:3:"æ†";s:2:"åª";s:3:"æ…¦";s:2:"å«";s:3:"憳";s:2:"å¬";s:3:"戭";s:2:"å­";s:3:"æ‘®";s:2:"å®";s:3:"æ‘°";s:2:"å¯";s:3:"æ’–";s:2:"å°";s:3:"æ’ ";s:2:"å±";s:3:"æ’…";s:2:"å²";s:3:"æ’—";s:2:"å³";s:3:"æ’œ";s:2:"å´";s:3:"æ’";s:2:"åµ";s:3:"æ’‹";s:2:"å¶";s:3:"æ’Š";s:2:"å·";s:3:"æ’Œ";s:2:"å¸";s:3:"æ’£";s:2:"å¹";s:3:"æ’Ÿ";s:2:"åº";s:3:"摨";s:2:"å»";s:3:"æ’±";s:2:"å¼";s:3:"æ’˜";s:2:"å½";s:3:"æ•¶";s:2:"å¾";s:3:"敺";s:2:"å¿";s:3:"敹";s:2:"åÀ";s:3:"æ•»";s:2:"åÁ";s:3:"æ–²";s:2:"åÂ";s:3:"æ–³";s:2:"åÃ";s:3:"æšµ";s:2:"åÄ";s:3:"æš°";s:2:"åÅ";s:3:"æš©";s:2:"åÆ";s:3:"æš²";s:2:"åÇ";s:3:"æš·";s:2:"åÈ";s:3:"暪";s:2:"åÉ";s:3:"暯";s:2:"åÊ";s:3:"樀";s:2:"åË";s:3:"樆";s:2:"åÌ";s:3:"樗";s:2:"åÍ";s:3:"æ§¥";s:2:"åÎ";s:3:"槸";s:2:"åÏ";s:3:"樕";s:2:"åÐ";s:3:"æ§±";s:2:"åÑ";s:3:"槤";s:2:"åÒ";s:3:"樠";s:2:"åÓ";s:3:"æ§¿";s:2:"åÔ";s:3:"槬";s:2:"åÕ";s:3:"æ§¢";s:2:"åÖ";s:3:"樛";s:2:"å×";s:3:"æ¨";s:2:"åØ";s:3:"æ§¾";s:2:"åÙ";s:3:"樧";s:2:"åÚ";s:3:"æ§²";s:2:"åÛ";s:3:"æ§®";s:2:"åÜ";s:3:"樔";s:2:"åÝ";s:3:"æ§·";s:2:"åÞ";s:3:"æ§§";s:2:"åß";s:3:"æ©€";s:2:"åà";s:3:"樈";s:2:"åá";s:3:"槦";s:2:"åâ";s:3:"æ§»";s:2:"åã";s:3:"æ¨";s:2:"åä";s:3:"æ§¼";s:2:"åå";s:3:"æ§«";s:2:"åæ";s:3:"樉";s:2:"åç";s:3:"樄";s:2:"åè";s:3:"樘";s:2:"åé";s:3:"樥";s:2:"åê";s:3:"æ¨";s:2:"åë";s:3:"æ§¶";s:2:"åì";s:3:"樦";s:2:"åí";s:3:"樇";s:2:"åî";s:3:"æ§´";s:2:"åï";s:3:"樖";s:2:"åð";s:3:"æ­‘";s:2:"åñ";s:3:"殥";s:2:"åò";s:3:"殣";s:2:"åó";s:3:"殢";s:2:"åô";s:3:"殦";s:2:"åõ";s:3:"æ°";s:2:"åö";s:3:"æ°€";s:2:"å÷";s:3:"毿";s:2:"åø";s:3:"æ°‚";s:2:"åù";s:3:"æ½";s:2:"åú";s:3:"漦";s:2:"åû";s:3:"æ½¾";s:2:"åü";s:3:"澇";s:2:"åý";s:3:"濆";s:2:"åþ";s:3:"æ¾’";s:2:"æ@";s:3:"æ¾";s:2:"æA";s:3:"澉";s:2:"æB";s:3:"澌";s:2:"æC";s:3:"æ½¢";s:2:"æD";s:3:"æ½";s:2:"æE";s:3:"æ¾…";s:2:"æF";s:3:"潚";s:2:"æG";s:3:"æ¾–";s:2:"æH";s:3:"æ½¶";s:2:"æI";s:3:"潬";s:2:"æJ";s:3:"澂";s:2:"æK";s:3:"潕";s:2:"æL";s:3:"æ½²";s:2:"æM";s:3:"æ½’";s:2:"æN";s:3:"æ½";s:2:"æO";s:3:"æ½—";s:2:"æP";s:3:"æ¾”";s:2:"æQ";s:3:"澓";s:2:"æR";s:3:"æ½";s:2:"æS";s:3:"æ¼€";s:2:"æT";s:3:"潡";s:2:"æU";s:3:"潫";s:2:"æV";s:3:"æ½½";s:2:"æW";s:3:"æ½§";s:2:"æX";s:3:"æ¾";s:2:"æY";s:3:"潓";s:2:"æZ";s:3:"澋";s:2:"æ[";s:3:"潩";s:2:"æ\";s:3:"潿";s:2:"æ]";s:3:"澕";s:2:"æ^";s:3:"æ½£";s:2:"æ_";s:3:"æ½·";s:2:"æ`";s:3:"潪";s:2:"æa";s:3:"æ½»";s:2:"æb";s:3:"熲";s:2:"æc";s:3:"熯";s:2:"æd";s:3:"熛";s:2:"æe";s:3:"熰";s:2:"æf";s:3:"熠";s:2:"æg";s:3:"熚";s:2:"æh";s:3:"熩";s:2:"æi";s:3:"熵";s:2:"æj";s:3:"ç†";s:2:"æk";s:3:"熥";s:2:"æl";s:3:"熞";s:2:"æm";s:3:"熤";s:2:"æn";s:3:"熡";s:2:"æo";s:3:"熪";s:2:"æp";s:3:"熜";s:2:"æq";s:3:"熧";s:2:"ær";s:3:"熳";s:2:"æs";s:3:"犘";s:2:"æt";s:3:"犚";s:2:"æu";s:3:"ç˜";s:2:"æv";s:3:"ç’";s:2:"æw";s:3:"çž";s:2:"æx";s:3:"çŸ";s:2:"æy";s:3:"ç ";s:2:"æz";s:3:"ç";s:2:"æ{";s:3:"ç›";s:2:"æ|";s:3:"ç¡";s:2:"æ}";s:3:"çš";s:2:"æ~";s:3:"ç™";s:2:"æ¡";s:3:"ç¢";s:2:"æ¢";s:3:"ç’‡";s:2:"æ£";s:3:"ç’‰";s:2:"æ¤";s:3:"ç’Š";s:2:"æ¥";s:3:"ç’†";s:2:"æ¦";s:3:"ç’";s:2:"æ§";s:3:"瑽";s:2:"æ¨";s:3:"ç’…";s:2:"æ©";s:3:"ç’ˆ";s:2:"æª";s:3:"瑼";s:2:"æ«";s:3:"瑹";s:2:"æ¬";s:3:"甈";s:2:"æ­";s:3:"甇";s:2:"æ®";s:3:"畾";s:2:"æ¯";s:3:"瘥";s:2:"æ°";s:3:"瘞";s:2:"æ±";s:3:"瘙";s:2:"æ²";s:3:"ç˜";s:2:"æ³";s:3:"瘜";s:2:"æ´";s:3:"瘣";s:2:"æµ";s:3:"瘚";s:2:"æ¶";s:3:"瘨";s:2:"æ·";s:3:"瘛";s:2:"æ¸";s:3:"çšœ";s:2:"æ¹";s:3:"çš";s:2:"æº";s:3:"çšž";s:2:"æ»";s:3:"çš›";s:2:"æ¼";s:3:"çž";s:2:"æ½";s:3:"çž";s:2:"æ¾";s:3:"瞉";s:2:"æ¿";s:3:"瞈";s:2:"æÀ";s:3:"ç£";s:2:"æÁ";s:3:"碻";s:2:"æÂ";s:3:"ç£";s:2:"æÃ";s:3:"磌";s:2:"æÄ";s:3:"磑";s:2:"æÅ";s:3:"磎";s:2:"æÆ";s:3:"磔";s:2:"æÇ";s:3:"磈";s:2:"æÈ";s:3:"磃";s:2:"æÉ";s:3:"磄";s:2:"æÊ";s:3:"磉";s:2:"æË";s:3:"禚";s:2:"æÌ";s:3:"禡";s:2:"æÍ";s:3:"禠";s:2:"æÎ";s:3:"禜";s:2:"æÏ";s:3:"禢";s:2:"æÐ";s:3:"禛";s:2:"æÑ";s:3:"æ­¶";s:2:"æÒ";s:3:"稹";s:2:"æÓ";s:3:"窲";s:2:"æÔ";s:3:"窴";s:2:"æÕ";s:3:"窳";s:2:"æÖ";s:3:"ç®·";s:2:"æ×";s:3:"篋";s:2:"æØ";s:3:"箾";s:2:"æÙ";s:3:"箬";s:2:"æÚ";s:3:"篎";s:2:"æÛ";s:3:"箯";s:2:"æÜ";s:3:"箹";s:2:"æÝ";s:3:"篊";s:2:"æÞ";s:3:"箵";s:2:"æß";s:3:"ç³…";s:2:"æà";s:3:"糈";s:2:"æá";s:3:"糌";s:2:"æâ";s:3:"糋";s:2:"æã";s:3:"ç··";s:2:"æä";s:3:"ç·›";s:2:"æå";s:3:"ç·ª";s:2:"ææ";s:3:"ç·§";s:2:"æç";s:3:"ç·—";s:2:"æè";s:3:"ç·¡";s:2:"æé";s:3:"縃";s:2:"æê";s:3:"ç·º";s:2:"æë";s:3:"ç·¦";s:2:"æì";s:3:"ç·¶";s:2:"æí";s:3:"ç·±";s:2:"æî";s:3:"ç·°";s:2:"æï";s:3:"ç·®";s:2:"æð";s:3:"ç·Ÿ";s:2:"æñ";s:3:"ç½¶";s:2:"æò";s:3:"羬";s:2:"æó";s:3:"ç¾°";s:2:"æô";s:3:"ç¾­";s:2:"æõ";s:3:"ç¿­";s:2:"æö";s:3:"ç¿«";s:2:"æ÷";s:3:"翪";s:2:"æø";s:3:"翬";s:2:"æù";s:3:"翦";s:2:"æú";s:3:"翨";s:2:"æû";s:3:"è¤";s:2:"æü";s:3:"è§";s:2:"æý";s:3:"膣";s:2:"æþ";s:3:"膟";s:2:"ç@";s:3:"膞";s:2:"çA";s:3:"膕";s:2:"çB";s:3:"膢";s:2:"çC";s:3:"膙";s:2:"çD";s:3:"膗";s:2:"çE";s:3:"舖";s:2:"çF";s:3:"è‰";s:2:"çG";s:3:"艓";s:2:"çH";s:3:"艒";s:2:"çI";s:3:"è‰";s:2:"çJ";s:3:"艎";s:2:"çK";s:3:"艑";s:2:"çL";s:3:"蔤";s:2:"çM";s:3:"è”»";s:2:"çN";s:3:"è”";s:2:"çO";s:3:"蔀";s:2:"çP";s:3:"蔩";s:2:"çQ";s:3:"蔎";s:2:"çR";s:3:"蔉";s:2:"çS";s:3:"è”";s:2:"çT";s:3:"蔟";s:2:"çU";s:3:"蔊";s:2:"çV";s:3:"è”§";s:2:"çW";s:3:"蔜";s:2:"çX";s:3:"è“»";s:2:"çY";s:3:"蔫";s:2:"çZ";s:3:"蓺";s:2:"ç[";s:3:"蔈";s:2:"ç\";s:3:"蔌";s:2:"ç]";s:3:"è“´";s:2:"ç^";s:3:"蔪";s:2:"ç_";s:3:"蓲";s:2:"ç`";s:3:"蔕";s:2:"ça";s:3:"è“·";s:2:"çb";s:3:"è“«";s:2:"çc";s:3:"蓳";s:2:"çd";s:3:"蓼";s:2:"çe";s:3:"è”’";s:2:"çf";s:3:"蓪";s:2:"çg";s:3:"è“©";s:2:"çh";s:3:"è”–";s:2:"çi";s:3:"蓾";s:2:"çj";s:3:"蔨";s:2:"çk";s:3:"è”";s:2:"çl";s:3:"è”®";s:2:"çm";s:3:"蔂";s:2:"çn";s:3:"蓽";s:2:"ço";s:3:"蔞";s:2:"çp";s:3:"è“¶";s:2:"çq";s:3:"è”±";s:2:"çr";s:3:"蔦";s:2:"çs";s:3:"è“§";s:2:"çt";s:3:"蓨";s:2:"çu";s:3:"è“°";s:2:"çv";s:3:"蓯";s:2:"çw";s:3:"蓹";s:2:"çx";s:3:"蔘";s:2:"çy";s:3:"è” ";s:2:"çz";s:3:"è”°";s:2:"ç{";s:3:"蔋";s:2:"ç|";s:3:"è”™";s:2:"ç}";s:3:"蔯";s:2:"ç~";s:3:"虢";s:2:"ç¡";s:3:"è–";s:2:"ç¢";s:3:"è£";s:2:"ç£";s:3:"è¤";s:2:"ç¤";s:3:"è·";s:2:"ç¥";s:3:"蟡";s:2:"ç¦";s:3:"è³";s:2:"ç§";s:3:"è˜";s:2:"ç¨";s:3:"è”";s:2:"ç©";s:3:"è›";s:2:"çª";s:3:"è’";s:2:"ç«";s:3:"è¡";s:2:"ç¬";s:3:"èš";s:2:"ç­";s:3:"è‘";s:2:"ç®";s:3:"èž";s:2:"ç¯";s:3:"è­";s:2:"ç°";s:3:"èª";s:2:"ç±";s:3:"è";s:2:"ç²";s:3:"èŽ";s:2:"ç³";s:3:"èŸ";s:2:"ç´";s:3:"è";s:2:"çµ";s:3:"è¯";s:2:"ç¶";s:3:"è¬";s:2:"ç·";s:3:"èº";s:2:"ç¸";s:3:"è®";s:2:"ç¹";s:3:"èœ";s:2:"çº";s:3:"è¥";s:2:"ç»";s:3:"è";s:2:"ç¼";s:3:"è»";s:2:"ç½";s:3:"èµ";s:2:"ç¾";s:3:"è¢";s:2:"ç¿";s:3:"è§";s:2:"çÀ";s:3:"è©";s:2:"çÁ";s:3:"衚";s:2:"çÂ";s:3:"褅";s:2:"çÃ";s:3:"褌";s:2:"çÄ";s:3:"褔";s:2:"çÅ";s:3:"褋";s:2:"çÆ";s:3:"褗";s:2:"çÇ";s:3:"褘";s:2:"çÈ";s:3:"褙";s:2:"çÉ";s:3:"褆";s:2:"çÊ";s:3:"褖";s:2:"çË";s:3:"褑";s:2:"çÌ";s:3:"褎";s:2:"çÍ";s:3:"褉";s:2:"çÎ";s:3:"覢";s:2:"çÏ";s:3:"覤";s:2:"çÐ";s:3:"覣";s:2:"çÑ";s:3:"è§­";s:2:"çÒ";s:3:"è§°";s:2:"çÓ";s:3:"觬";s:2:"çÔ";s:3:"è«";s:2:"çÕ";s:3:"諆";s:2:"çÖ";s:3:"誸";s:2:"ç×";s:3:"è«“";s:2:"çØ";s:3:"è«‘";s:2:"çÙ";s:3:"è«”";s:2:"çÚ";s:3:"è«•";s:2:"çÛ";s:3:"誻";s:2:"çÜ";s:3:"è«—";s:2:"çÝ";s:3:"誾";s:2:"çÞ";s:3:"è«€";s:2:"çß";s:3:"è«…";s:2:"çà";s:3:"諘";s:2:"çá";s:3:"諃";s:2:"çâ";s:3:"誺";s:2:"çã";s:3:"誽";s:2:"çä";s:3:"è«™";s:2:"çå";s:3:"è°¾";s:2:"çæ";s:3:"è±";s:2:"çç";s:3:"è²";s:2:"çè";s:3:"è³¥";s:2:"çé";s:3:"賟";s:2:"çê";s:3:"è³™";s:2:"çë";s:3:"賨";s:2:"çì";s:3:"賚";s:2:"çí";s:3:"è³";s:2:"çî";s:3:"è³§";s:2:"çï";s:3:"è¶ ";s:2:"çð";s:3:"è¶œ";s:2:"çñ";s:3:"è¶¡";s:2:"çò";s:3:"è¶›";s:2:"çó";s:3:"踠";s:2:"çô";s:3:"踣";s:2:"çõ";s:3:"踥";s:2:"çö";s:3:"踤";s:2:"ç÷";s:3:"踮";s:2:"çø";s:3:"踕";s:2:"çù";s:3:"踛";s:2:"çú";s:3:"踖";s:2:"çû";s:3:"踑";s:2:"çü";s:3:"踙";s:2:"çý";s:3:"踦";s:2:"çþ";s:3:"踧";s:2:"è@";s:3:"踔";s:2:"èA";s:3:"踒";s:2:"èB";s:3:"踘";s:2:"èC";s:3:"踓";s:2:"èD";s:3:"踜";s:2:"èE";s:3:"踗";s:2:"èF";s:3:"踚";s:2:"èG";s:3:"輬";s:2:"èH";s:3:"輤";s:2:"èI";s:3:"輘";s:2:"èJ";s:3:"輚";s:2:"èK";s:3:"è¼ ";s:2:"èL";s:3:"è¼£";s:2:"èM";s:3:"è¼–";s:2:"èN";s:3:"è¼—";s:2:"èO";s:3:"é³";s:2:"èP";s:3:"é°";s:2:"èQ";s:3:"é¯";s:2:"èR";s:3:"é§";s:2:"èS";s:3:"é«";s:2:"èT";s:3:"鄯";s:2:"èU";s:3:"é„«";s:2:"èV";s:3:"é„©";s:2:"èW";s:3:"鄪";s:2:"èX";s:3:"鄲";s:2:"èY";s:3:"鄦";s:2:"èZ";s:3:"é„®";s:2:"è[";s:3:"醅";s:2:"è\";s:3:"醆";s:2:"è]";s:3:"醊";s:2:"è^";s:3:"é†";s:2:"è_";s:3:"醂";s:2:"è`";s:3:"醄";s:2:"èa";s:3:"醀";s:2:"èb";s:3:"é‹";s:2:"èc";s:3:"鋃";s:2:"èd";s:3:"é‹„";s:2:"èe";s:3:"é‹€";s:2:"èf";s:3:"é‹™";s:2:"èg";s:3:"銶";s:2:"èh";s:3:"é‹";s:2:"èi";s:3:"鋱";s:2:"èj";s:3:"鋟";s:2:"èk";s:3:"鋘";s:2:"èl";s:3:"é‹©";s:2:"èm";s:3:"é‹—";s:2:"èn";s:3:"é‹";s:2:"èo";s:3:"鋌";s:2:"èp";s:3:"鋯";s:2:"èq";s:3:"é‹‚";s:2:"èr";s:3:"鋨";s:2:"ès";s:3:"鋊";s:2:"èt";s:3:"鋈";s:2:"èu";s:3:"鋎";s:2:"èv";s:3:"鋦";s:2:"èw";s:3:"é‹";s:2:"èx";s:3:"é‹•";s:2:"èy";s:3:"鋉";s:2:"èz";s:3:"é‹ ";s:2:"è{";s:3:"鋞";s:2:"è|";s:3:"é‹§";s:2:"è}";s:3:"é‹‘";s:2:"è~";s:3:"é‹“";s:2:"è¡";s:3:"銵";s:2:"è¢";s:3:"é‹¡";s:2:"è£";s:3:"鋆";s:2:"è¤";s:3:"銴";s:2:"è¥";s:3:"镼";s:2:"è¦";s:3:"é–¬";s:2:"è§";s:3:"é–«";s:2:"è¨";s:3:"é–®";s:2:"è©";s:3:"é–°";s:2:"èª";s:3:"隤";s:2:"è«";s:3:"隢";s:2:"è¬";s:3:"雓";s:2:"è­";s:3:"霅";s:2:"è®";s:3:"霈";s:2:"è¯";s:3:"霂";s:2:"è°";s:3:"éš";s:2:"è±";s:3:"鞊";s:2:"è²";s:3:"鞎";s:2:"è³";s:3:"鞈";s:2:"è´";s:3:"éŸ";s:2:"èµ";s:3:"éŸ";s:2:"è¶";s:3:"é ž";s:2:"è·";s:3:"é ";s:2:"è¸";s:3:"é ¦";s:2:"è¹";s:3:"é ©";s:2:"èº";s:3:"é ¨";s:2:"è»";s:3:"é  ";s:2:"è¼";s:3:"é ›";s:2:"è½";s:3:"é §";s:2:"è¾";s:3:"颲";s:2:"è¿";s:3:"餈";s:2:"èÀ";s:3:"飺";s:2:"èÁ";s:3:"餑";s:2:"èÂ";s:3:"餔";s:2:"èÃ";s:3:"餖";s:2:"èÄ";s:3:"餗";s:2:"èÅ";s:3:"餕";s:2:"èÆ";s:3:"é§œ";s:2:"èÇ";s:3:"é§";s:2:"èÈ";s:3:"é§";s:2:"èÉ";s:3:"é§“";s:2:"èÊ";s:3:"é§”";s:2:"èË";s:3:"é§Ž";s:2:"èÌ";s:3:"駉";s:2:"èÍ";s:3:"é§–";s:2:"èÎ";s:3:"駘";s:2:"èÏ";s:3:"é§‹";s:2:"èÐ";s:3:"é§—";s:2:"èÑ";s:3:"é§Œ";s:2:"èÒ";s:3:"骳";s:2:"èÓ";s:3:"髬";s:2:"èÔ";s:3:"é««";s:2:"èÕ";s:3:"髳";s:2:"èÖ";s:3:"髲";s:2:"è×";s:3:"髱";s:2:"èØ";s:3:"é­†";s:2:"èÙ";s:3:"é­ƒ";s:2:"èÚ";s:3:"é­§";s:2:"èÛ";s:3:"é­´";s:2:"èÜ";s:3:"é­±";s:2:"èÝ";s:3:"é­¦";s:2:"èÞ";s:3:"é­¶";s:2:"èß";s:3:"é­µ";s:2:"èà";s:3:"é­°";s:2:"èá";s:3:"é­¨";s:2:"èâ";s:3:"é­¤";s:2:"èã";s:3:"é­¬";s:2:"èä";s:3:"é³¼";s:2:"èå";s:3:"鳺";s:2:"èæ";s:3:"é³½";s:2:"èç";s:3:"鳿";s:2:"èè";s:3:"é³·";s:2:"èé";s:3:"é´‡";s:2:"èê";s:3:"é´€";s:2:"èë";s:3:"é³¹";s:2:"èì";s:3:"é³»";s:2:"èí";s:3:"é´ˆ";s:2:"èî";s:3:"é´…";s:2:"èï";s:3:"é´„";s:2:"èð";s:3:"麃";s:2:"èñ";s:3:"黓";s:2:"èò";s:3:"é¼";s:2:"èó";s:3:"é¼";s:2:"èô";s:3:"儜";s:2:"èõ";s:3:"å„“";s:2:"èö";s:3:"å„—";s:2:"è÷";s:3:"儚";s:2:"èø";s:3:"å„‘";s:2:"èù";s:3:"凞";s:2:"èú";s:3:"匴";s:2:"èû";s:3:"å¡";s:2:"èü";s:3:"å™°";s:2:"èý";s:3:"å™ ";s:2:"èþ";s:3:"å™®";s:2:"é@";s:3:"噳";s:2:"éA";s:3:"噦";s:2:"éB";s:3:"噣";s:2:"éC";s:3:"å™­";s:2:"éD";s:3:"噲";s:2:"éE";s:3:"噞";s:2:"éF";s:3:"å™·";s:2:"éG";s:3:"圜";s:2:"éH";s:3:"圛";s:2:"éI";s:3:"壈";s:2:"éJ";s:3:"墽";s:2:"éK";s:3:"壉";s:2:"éL";s:3:"墿";s:2:"éM";s:3:"墺";s:2:"éN";s:3:"壂";s:2:"éO";s:3:"墼";s:2:"éP";s:3:"壆";s:2:"éQ";s:3:"嬗";s:2:"éR";s:3:"嬙";s:2:"éS";s:3:"嬛";s:2:"éT";s:3:"嬡";s:2:"éU";s:3:"嬔";s:2:"éV";s:3:"嬓";s:2:"éW";s:3:"å¬";s:2:"éX";s:3:"嬖";s:2:"éY";s:3:"嬨";s:2:"éZ";s:3:"嬚";s:2:"é[";s:3:"嬠";s:2:"é\";s:3:"嬞";s:2:"é]";s:3:"寯";s:2:"é^";s:3:"嶬";s:2:"é_";s:3:"å¶±";s:2:"é`";s:3:"å¶©";s:2:"éa";s:3:"å¶§";s:2:"éb";s:3:"å¶µ";s:2:"éc";s:3:"å¶°";s:2:"éd";s:3:"å¶®";s:2:"ée";s:3:"嶪";s:2:"éf";s:3:"嶨";s:2:"ég";s:3:"å¶²";s:2:"éh";s:3:"å¶­";s:2:"éi";s:3:"嶯";s:2:"éj";s:3:"å¶´";s:2:"ék";s:3:"å¹§";s:2:"él";s:3:"幨";s:2:"ém";s:3:"幦";s:2:"én";s:3:"幯";s:2:"éo";s:3:"廩";s:2:"ép";s:3:"å»§";s:2:"éq";s:3:"廦";s:2:"ér";s:3:"廨";s:2:"és";s:3:"廥";s:2:"ét";s:3:"彋";s:2:"éu";s:3:"å¾¼";s:2:"év";s:3:"æ†";s:2:"éw";s:3:"憨";s:2:"éx";s:3:"憖";s:2:"éy";s:3:"懅";s:2:"éz";s:3:"憴";s:2:"é{";s:3:"懆";s:2:"é|";s:3:"æ‡";s:2:"é}";s:3:"懌";s:2:"é~";s:3:"憺";s:2:"é¡";s:3:"憿";s:2:"é¢";s:3:"憸";s:2:"é£";s:3:"憌";s:2:"é¤";s:3:"æ“—";s:2:"é¥";s:3:"æ“–";s:2:"é¦";s:3:"æ“";s:2:"é§";s:3:"æ“";s:2:"é¨";s:3:"擉";s:2:"é©";s:3:"æ’½";s:2:"éª";s:3:"æ’‰";s:2:"é«";s:3:"擃";s:2:"é¬";s:3:"æ“›";s:2:"é­";s:3:"擳";s:2:"é®";s:3:"æ“™";s:2:"é¯";s:3:"攳";s:2:"é°";s:3:"æ•¿";s:2:"é±";s:3:"敼";s:2:"é²";s:3:"æ–¢";s:2:"é³";s:3:"曈";s:2:"é´";s:3:"æš¾";s:2:"éµ";s:3:"曀";s:2:"é¶";s:3:"曊";s:2:"é·";s:3:"曋";s:2:"é¸";s:3:"æ›";s:2:"é¹";s:3:"æš½";s:2:"éº";s:3:"æš»";s:2:"é»";s:3:"暺";s:2:"é¼";s:3:"曌";s:2:"é½";s:3:"朣";s:2:"é¾";s:3:"樴";s:2:"é¿";s:3:"橦";s:2:"éÀ";s:3:"橉";s:2:"éÁ";s:3:"æ©§";s:2:"éÂ";s:3:"樲";s:2:"éÃ";s:3:"橨";s:2:"éÄ";s:3:"樾";s:2:"éÅ";s:3:"æ©";s:2:"éÆ";s:3:"æ©­";s:2:"éÇ";s:3:"æ©¶";s:2:"éÈ";s:3:"æ©›";s:2:"éÉ";s:3:"æ©‘";s:2:"éÊ";s:3:"樨";s:2:"éË";s:3:"橚";s:2:"éÌ";s:3:"樻";s:2:"éÍ";s:3:"樿";s:2:"éÎ";s:3:"æ©";s:2:"éÏ";s:3:"橪";s:2:"éÐ";s:3:"橤";s:2:"éÑ";s:3:"æ©";s:2:"éÒ";s:3:"æ©";s:2:"éÓ";s:3:"æ©”";s:2:"éÔ";s:3:"橯";s:2:"éÕ";s:3:"æ©©";s:2:"éÖ";s:3:"æ© ";s:2:"é×";s:3:"樼";s:2:"éØ";s:3:"橞";s:2:"éÙ";s:3:"æ©–";s:2:"éÚ";s:3:"æ©•";s:2:"éÛ";s:3:"æ©";s:2:"éÜ";s:3:"橎";s:2:"éÝ";s:3:"橆";s:2:"éÞ";s:3:"æ­•";s:2:"éß";s:3:"æ­”";s:2:"éà";s:3:"æ­–";s:2:"éá";s:3:"æ®§";s:2:"éâ";s:3:"殪";s:2:"éã";s:3:"殫";s:2:"éä";s:3:"毈";s:2:"éå";s:3:"毇";s:2:"éæ";s:3:"æ°„";s:2:"éç";s:3:"æ°ƒ";s:2:"éè";s:3:"æ°†";s:2:"éé";s:3:"æ¾­";s:2:"éê";s:3:"æ¿‹";s:2:"éë";s:3:"æ¾£";s:2:"éì";s:3:"濇";s:2:"éí";s:3:"æ¾¼";s:2:"éî";s:3:"濎";s:2:"éï";s:3:"濈";s:2:"éð";s:3:"潞";s:2:"éñ";s:3:"æ¿„";s:2:"éò";s:3:"æ¾½";s:2:"éó";s:3:"澞";s:2:"éô";s:3:"濊";s:2:"éõ";s:3:"澨";s:2:"éö";s:3:"瀄";s:2:"é÷";s:3:"æ¾¥";s:2:"éø";s:3:"æ¾®";s:2:"éù";s:3:"澺";s:2:"éú";s:3:"澬";s:2:"éû";s:3:"澪";s:2:"éü";s:3:"æ¿";s:2:"éý";s:3:"澿";s:2:"éþ";s:3:"澸";s:2:"ê@";s:3:"æ¾¢";s:2:"êA";s:3:"濉";s:2:"êB";s:3:"澫";s:2:"êC";s:3:"æ¿";s:2:"êD";s:3:"澯";s:2:"êE";s:3:"æ¾²";s:2:"êF";s:3:"æ¾°";s:2:"êG";s:3:"燅";s:2:"êH";s:3:"燂";s:2:"êI";s:3:"熿";s:2:"êJ";s:3:"熸";s:2:"êK";s:3:"燖";s:2:"êL";s:3:"燀";s:2:"êM";s:3:"ç‡";s:2:"êN";s:3:"燋";s:2:"êO";s:3:"燔";s:2:"êP";s:3:"燊";s:2:"êQ";s:3:"燇";s:2:"êR";s:3:"ç‡";s:2:"êS";s:3:"熽";s:2:"êT";s:3:"燘";s:2:"êU";s:3:"熼";s:2:"êV";s:3:"燆";s:2:"êW";s:3:"燚";s:2:"êX";s:3:"燛";s:2:"êY";s:3:"çŠ";s:2:"êZ";s:3:"犞";s:2:"ê[";s:3:"ç©";s:2:"ê\";s:3:"ç¦";s:2:"ê]";s:3:"ç§";s:2:"ê^";s:3:"ç¬";s:2:"ê_";s:3:"ç¥";s:2:"ê`";s:3:"ç«";s:2:"êa";s:3:"çª";s:2:"êb";s:3:"ç‘¿";s:2:"êc";s:3:"ç’š";s:2:"êd";s:3:"ç’ ";s:2:"êe";s:3:"ç’”";s:2:"êf";s:3:"ç’’";s:2:"êg";s:3:"ç’•";s:2:"êh";s:3:"ç’¡";s:2:"êi";s:3:"甋";s:2:"êj";s:3:"ç–€";s:2:"êk";s:3:"瘯";s:2:"êl";s:3:"瘭";s:2:"êm";s:3:"瘱";s:2:"ên";s:3:"瘽";s:2:"êo";s:3:"瘳";s:2:"êp";s:3:"瘼";s:2:"êq";s:3:"瘵";s:2:"êr";s:3:"瘲";s:2:"ês";s:3:"瘰";s:2:"êt";s:3:"çš»";s:2:"êu";s:3:"盦";s:2:"êv";s:3:"çžš";s:2:"êw";s:3:"çž";s:2:"êx";s:3:"çž¡";s:2:"êy";s:3:"çžœ";s:2:"êz";s:3:"çž›";s:2:"ê{";s:3:"瞢";s:2:"ê|";s:3:"瞣";s:2:"ê}";s:3:"çž•";s:2:"ê~";s:3:"çž™";s:2:"ê¡";s:3:"çž—";s:2:"ê¢";s:3:"ç£";s:2:"ê£";s:3:"磩";s:2:"ê¤";s:3:"磥";s:2:"ê¥";s:3:"磪";s:2:"ê¦";s:3:"磞";s:2:"ê§";s:3:"磣";s:2:"ê¨";s:3:"磛";s:2:"ê©";s:3:"磡";s:2:"êª";s:3:"磢";s:2:"ê«";s:3:"磭";s:2:"ê¬";s:3:"磟";s:2:"ê­";s:3:"磠";s:2:"ê®";s:3:"禤";s:2:"ê¯";s:3:"ç©„";s:2:"ê°";s:3:"穈";s:2:"ê±";s:3:"穇";s:2:"ê²";s:3:"窶";s:2:"ê³";s:3:"窸";s:2:"ê´";s:3:"窵";s:2:"êµ";s:3:"窱";s:2:"ê¶";s:3:"窷";s:2:"ê·";s:3:"篞";s:2:"ê¸";s:3:"篣";s:2:"ê¹";s:3:"篧";s:2:"êº";s:3:"ç¯";s:2:"ê»";s:3:"篕";s:2:"ê¼";s:3:"篥";s:2:"ê½";s:3:"篚";s:2:"ê¾";s:3:"篨";s:2:"ê¿";s:3:"篹";s:2:"êÀ";s:3:"篔";s:2:"êÁ";s:3:"篪";s:2:"êÂ";s:3:"篢";s:2:"êÃ";s:3:"篜";s:2:"êÄ";s:3:"篫";s:2:"êÅ";s:3:"篘";s:2:"êÆ";s:3:"篟";s:2:"êÇ";s:3:"ç³’";s:2:"êÈ";s:3:"ç³”";s:2:"êÉ";s:3:"ç³—";s:2:"êÊ";s:3:"ç³";s:2:"êË";s:3:"糑";s:2:"êÌ";s:3:"縒";s:2:"êÍ";s:3:"縡";s:2:"êÎ";s:3:"縗";s:2:"êÏ";s:3:"縌";s:2:"êÐ";s:3:"縟";s:2:"êÑ";s:3:"縠";s:2:"êÒ";s:3:"縓";s:2:"êÓ";s:3:"縎";s:2:"êÔ";s:3:"縜";s:2:"êÕ";s:3:"縕";s:2:"êÖ";s:3:"縚";s:2:"ê×";s:3:"縢";s:2:"êØ";s:3:"縋";s:2:"êÙ";s:3:"ç¸";s:2:"êÚ";s:3:"縖";s:2:"êÛ";s:3:"ç¸";s:2:"êÜ";s:3:"縔";s:2:"êÝ";s:3:"縥";s:2:"êÞ";s:3:"縤";s:2:"êß";s:3:"罃";s:2:"êà";s:3:"ç½»";s:2:"êá";s:3:"ç½¼";s:2:"êâ";s:3:"罺";s:2:"êã";s:3:"ç¾±";s:2:"êä";s:3:"翯";s:2:"êå";s:3:"耪";s:2:"êæ";s:3:"耩";s:2:"êç";s:3:"è¬";s:2:"êè";s:3:"膱";s:2:"êé";s:3:"膦";s:2:"êê";s:3:"膮";s:2:"êë";s:3:"膹";s:2:"êì";s:3:"膵";s:2:"êí";s:3:"膫";s:2:"êî";s:3:"膰";s:2:"êï";s:3:"膬";s:2:"êð";s:3:"膴";s:2:"êñ";s:3:"膲";s:2:"êò";s:3:"膷";s:2:"êó";s:3:"膧";s:2:"êô";s:3:"臲";s:2:"êõ";s:3:"艕";s:2:"êö";s:3:"艖";s:2:"ê÷";s:3:"艗";s:2:"êø";s:3:"è•–";s:2:"êù";s:3:"è•…";s:2:"êú";s:3:"è•«";s:2:"êû";s:3:"è•";s:2:"êü";s:3:"è•“";s:2:"êý";s:3:"è•¡";s:2:"êþ";s:3:"蕘";s:2:"ë@";s:3:"è•€";s:2:"ëA";s:3:"蕆";s:2:"ëB";s:3:"蕤";s:2:"ëC";s:3:"è•";s:2:"ëD";s:3:"è•¢";s:2:"ëE";s:3:"è•„";s:2:"ëF";s:3:"è•‘";s:2:"ëG";s:3:"蕇";s:2:"ëH";s:3:"è•£";s:2:"ëI";s:3:"蔾";s:2:"ëJ";s:3:"è•›";s:2:"ëK";s:3:"蕱";s:2:"ëL";s:3:"蕎";s:2:"ëM";s:3:"è•®";s:2:"ëN";s:3:"蕵";s:2:"ëO";s:3:"è••";s:2:"ëP";s:3:"è•§";s:2:"ëQ";s:3:"è• ";s:2:"ëR";s:3:"è–Œ";s:2:"ëS";s:3:"蕦";s:2:"ëT";s:3:"è•";s:2:"ëU";s:3:"è•”";s:2:"ëV";s:3:"è•¥";s:2:"ëW";s:3:"蕬";s:2:"ëX";s:3:"虣";s:2:"ëY";s:3:"虥";s:2:"ëZ";s:3:"虤";s:2:"ë[";s:3:"èž›";s:2:"ë\";s:3:"èž";s:2:"ë]";s:3:"èž—";s:2:"ë^";s:3:"èž“";s:2:"ë_";s:3:"èž’";s:2:"ë`";s:3:"螈";s:2:"ëa";s:3:"èž";s:2:"ëb";s:3:"èž–";s:2:"ëc";s:3:"螘";s:2:"ëd";s:3:"è¹";s:2:"ëe";s:3:"螇";s:2:"ëf";s:3:"螣";s:2:"ëg";s:3:"èž…";s:2:"ëh";s:3:"èž";s:2:"ëi";s:3:"èž‘";s:2:"ëj";s:3:"èž";s:2:"ëk";s:3:"èž„";s:2:"ël";s:3:"èž”";s:2:"ëm";s:3:"èžœ";s:2:"ën";s:3:"èžš";s:2:"ëo";s:3:"螉";s:2:"ëp";s:3:"褞";s:2:"ëq";s:3:"褦";s:2:"ër";s:3:"褰";s:2:"ës";s:3:"褭";s:2:"ët";s:3:"褮";s:2:"ëu";s:3:"褧";s:2:"ëv";s:3:"褱";s:2:"ëw";s:3:"褢";s:2:"ëx";s:3:"褩";s:2:"ëy";s:3:"褣";s:2:"ëz";s:3:"褯";s:2:"ë{";s:3:"褬";s:2:"ë|";s:3:"褟";s:2:"ë}";s:3:"è§±";s:2:"ë~";s:3:"è« ";s:2:"ë¡";s:3:"è«¢";s:2:"ë¢";s:3:"諲";s:2:"ë£";s:3:"è«´";s:2:"ë¤";s:3:"諵";s:2:"ë¥";s:3:"è«";s:2:"ë¦";s:3:"謔";s:2:"ë§";s:3:"諤";s:2:"ë¨";s:3:"諟";s:2:"ë©";s:3:"è«°";s:2:"ëª";s:3:"諈";s:2:"ë«";s:3:"諞";s:2:"ë¬";s:3:"è«¡";s:2:"ë­";s:3:"諨";s:2:"ë®";s:3:"è«¿";s:2:"ë¯";s:3:"諯";s:2:"ë°";s:3:"è«»";s:2:"ë±";s:3:"貑";s:2:"ë²";s:3:"è²’";s:2:"ë³";s:3:"è²";s:2:"ë´";s:3:"è³µ";s:2:"ëµ";s:3:"è³®";s:2:"ë¶";s:3:"è³±";s:2:"ë·";s:3:"è³°";s:2:"ë¸";s:3:"è³³";s:2:"ë¹";s:3:"赬";s:2:"ëº";s:3:"èµ®";s:2:"ë»";s:3:"è¶¥";s:2:"ë¼";s:3:"è¶§";s:2:"ë½";s:3:"踳";s:2:"ë¾";s:3:"踾";s:2:"ë¿";s:3:"踸";s:2:"ëÀ";s:3:"è¹€";s:2:"ëÁ";s:3:"è¹…";s:2:"ëÂ";s:3:"踶";s:2:"ëÃ";s:3:"踼";s:2:"ëÄ";s:3:"踽";s:2:"ëÅ";s:3:"è¹";s:2:"ëÆ";s:3:"踰";s:2:"ëÇ";s:3:"踿";s:2:"ëÈ";s:3:"躽";s:2:"ëÉ";s:3:"è¼¶";s:2:"ëÊ";s:3:"è¼®";s:2:"ëË";s:3:"è¼µ";s:2:"ëÌ";s:3:"è¼²";s:2:"ëÍ";s:3:"è¼¹";s:2:"ëÎ";s:3:"è¼·";s:2:"ëÏ";s:3:"è¼´";s:2:"ëÐ";s:3:"é¶";s:2:"ëÑ";s:3:"é¹";s:2:"ëÒ";s:3:"é»";s:2:"ëÓ";s:3:"邆";s:2:"ëÔ";s:3:"郺";s:2:"ëÕ";s:3:"鄳";s:2:"ëÖ";s:3:"鄵";s:2:"ë×";s:3:"é„¶";s:2:"ëØ";s:3:"醓";s:2:"ëÙ";s:3:"é†";s:2:"ëÚ";s:3:"醑";s:2:"ëÛ";s:3:"é†";s:2:"ëÜ";s:3:"é†";s:2:"ëÝ";s:3:"錧";s:2:"ëÞ";s:3:"錞";s:2:"ëß";s:3:"錈";s:2:"ëà";s:3:"錟";s:2:"ëá";s:3:"錆";s:2:"ëâ";s:3:"éŒ";s:2:"ëã";s:3:"éº";s:2:"ëä";s:3:"錸";s:2:"ëå";s:3:"錼";s:2:"ëæ";s:3:"錛";s:2:"ëç";s:3:"錣";s:2:"ëè";s:3:"錒";s:2:"ëé";s:3:"éŒ";s:2:"ëê";s:3:"é†";s:2:"ëë";s:3:"錭";s:2:"ëì";s:3:"錎";s:2:"ëí";s:3:"éŒ";s:2:"ëî";s:3:"é‹‹";s:2:"ëï";s:3:"éŒ";s:2:"ëð";s:3:"鋺";s:2:"ëñ";s:3:"錥";s:2:"ëò";s:3:"錓";s:2:"ëó";s:3:"鋹";s:2:"ëô";s:3:"é‹·";s:2:"ëõ";s:3:"錴";s:2:"ëö";s:3:"錂";s:2:"ë÷";s:3:"錤";s:2:"ëø";s:3:"é‹¿";s:2:"ëù";s:3:"錩";s:2:"ëú";s:3:"錹";s:2:"ëû";s:3:"錵";s:2:"ëü";s:3:"錪";s:2:"ëý";s:3:"錔";s:2:"ëþ";s:3:"錌";s:2:"ì@";s:3:"錋";s:2:"ìA";s:3:"鋾";s:2:"ìB";s:3:"錉";s:2:"ìC";s:3:"錀";s:2:"ìD";s:3:"é‹»";s:2:"ìE";s:3:"錖";s:2:"ìF";s:3:"é–¼";s:2:"ìG";s:3:"é—";s:2:"ìH";s:3:"é–¾";s:2:"ìI";s:3:"é–¹";s:2:"ìJ";s:3:"é–º";s:2:"ìK";s:3:"é–¶";s:2:"ìL";s:3:"é–¿";s:2:"ìM";s:3:"é–µ";s:2:"ìN";s:3:"é–½";s:2:"ìO";s:3:"éš©";s:2:"ìP";s:3:"é›”";s:2:"ìQ";s:3:"霋";s:2:"ìR";s:3:"霒";s:2:"ìS";s:3:"éœ";s:2:"ìT";s:3:"éž™";s:2:"ìU";s:3:"éž—";s:2:"ìV";s:3:"éž”";s:2:"ìW";s:3:"韰";s:2:"ìX";s:3:"韸";s:2:"ìY";s:3:"é µ";s:2:"ìZ";s:3:"é ¯";s:2:"ì[";s:3:"é ²";s:2:"ì\";s:3:"餤";s:2:"ì]";s:3:"餟";s:2:"ì^";s:3:"餧";s:2:"ì_";s:3:"餩";s:2:"ì`";s:3:"馞";s:2:"ìa";s:3:"é§®";s:2:"ìb";s:3:"駬";s:2:"ìc";s:3:"é§¥";s:2:"ìd";s:3:"駤";s:2:"ìe";s:3:"é§°";s:2:"ìf";s:3:"é§£";s:2:"ìg";s:3:"駪";s:2:"ìh";s:3:"é§©";s:2:"ìi";s:3:"é§§";s:2:"ìj";s:3:"骹";s:2:"ìk";s:3:"骿";s:2:"ìl";s:3:"骴";s:2:"ìm";s:3:"骻";s:2:"ìn";s:3:"é«¶";s:2:"ìo";s:3:"髺";s:2:"ìp";s:3:"髹";s:2:"ìq";s:3:"é«·";s:2:"ìr";s:3:"鬳";s:2:"ìs";s:3:"鮀";s:2:"ìt";s:3:"é®…";s:2:"ìu";s:3:"鮇";s:2:"ìv";s:3:"é­¼";s:2:"ìw";s:3:"é­¾";s:2:"ìx";s:3:"é­»";s:2:"ìy";s:3:"鮂";s:2:"ìz";s:3:"鮓";s:2:"ì{";s:3:"é®’";s:2:"ì|";s:3:"é®";s:2:"ì}";s:3:"é­º";s:2:"ì~";s:3:"鮕";s:2:"ì¡";s:3:"é­½";s:2:"ì¢";s:3:"鮈";s:2:"ì£";s:3:"é´¥";s:2:"ì¤";s:3:"é´—";s:2:"ì¥";s:3:"é´ ";s:2:"ì¦";s:3:"é´ž";s:2:"ì§";s:3:"é´”";s:2:"ì¨";s:3:"é´©";s:2:"ì©";s:3:"é´";s:2:"ìª";s:3:"é´˜";s:2:"ì«";s:3:"é´¢";s:2:"ì¬";s:3:"é´";s:2:"ì­";s:3:"é´™";s:2:"ì®";s:3:"é´Ÿ";s:2:"ì¯";s:3:"麈";s:2:"ì°";s:3:"麆";s:2:"ì±";s:3:"麇";s:2:"ì²";s:3:"麮";s:2:"ì³";s:3:"麭";s:2:"ì´";s:3:"黕";s:2:"ìµ";s:3:"é»–";s:2:"ì¶";s:3:"黺";s:2:"ì·";s:3:"é¼’";s:2:"ì¸";s:3:"é¼½";s:2:"ì¹";s:3:"儦";s:2:"ìº";s:3:"å„¥";s:2:"ì»";s:3:"å„¢";s:2:"ì¼";s:3:"儤";s:2:"ì½";s:3:"å„ ";s:2:"ì¾";s:3:"å„©";s:2:"ì¿";s:3:"å‹´";s:2:"ìÀ";s:3:"åš“";s:2:"ìÁ";s:3:"嚌";s:2:"ìÂ";s:3:"åš";s:2:"ìÃ";s:3:"嚆";s:2:"ìÄ";s:3:"åš„";s:2:"ìÅ";s:3:"嚃";s:2:"ìÆ";s:3:"噾";s:2:"ìÇ";s:3:"åš‚";s:2:"ìÈ";s:3:"噿";s:2:"ìÉ";s:3:"åš";s:2:"ìÊ";s:3:"壖";s:2:"ìË";s:3:"壔";s:2:"ìÌ";s:3:"å£";s:2:"ìÍ";s:3:"壒";s:2:"ìÎ";s:3:"嬭";s:2:"ìÏ";s:3:"嬥";s:2:"ìÐ";s:3:"嬲";s:2:"ìÑ";s:3:"嬣";s:2:"ìÒ";s:3:"嬬";s:2:"ìÓ";s:3:"嬧";s:2:"ìÔ";s:3:"嬦";s:2:"ìÕ";s:3:"嬯";s:2:"ìÖ";s:3:"嬮";s:2:"ì×";s:3:"å­»";s:2:"ìØ";s:3:"寱";s:2:"ìÙ";s:3:"寲";s:2:"ìÚ";s:3:"å¶·";s:2:"ìÛ";s:3:"幬";s:2:"ìÜ";s:3:"幪";s:2:"ìÝ";s:3:"å¾¾";s:2:"ìÞ";s:3:"å¾»";s:2:"ìß";s:3:"懃";s:2:"ìà";s:3:"憵";s:2:"ìá";s:3:"憼";s:2:"ìâ";s:3:"懧";s:2:"ìã";s:3:"懠";s:2:"ìä";s:3:"懥";s:2:"ìå";s:3:"懤";s:2:"ìæ";s:3:"懨";s:2:"ìç";s:3:"懞";s:2:"ìè";s:3:"擯";s:2:"ìé";s:3:"æ“©";s:2:"ìê";s:3:"æ“£";s:2:"ìë";s:3:"æ“«";s:2:"ìì";s:3:"擤";s:2:"ìí";s:3:"擨";s:2:"ìî";s:3:"æ–";s:2:"ìï";s:3:"æ–€";s:2:"ìð";s:3:"æ–¶";s:2:"ìñ";s:3:"æ—š";s:2:"ìò";s:3:"æ›’";s:2:"ìó";s:3:"æª";s:2:"ìô";s:3:"檖";s:2:"ìõ";s:3:"æª";s:2:"ìö";s:3:"檥";s:2:"ì÷";s:3:"檉";s:2:"ìø";s:3:"檟";s:2:"ìù";s:3:"檛";s:2:"ìú";s:3:"檡";s:2:"ìû";s:3:"檞";s:2:"ìü";s:3:"檇";s:2:"ìý";s:3:"檓";s:2:"ìþ";s:3:"檎";s:2:"í@";s:3:"檕";s:2:"íA";s:3:"檃";s:2:"íB";s:3:"檨";s:2:"íC";s:3:"檤";s:2:"íD";s:3:"檑";s:2:"íE";s:3:"æ©¿";s:2:"íF";s:3:"檦";s:2:"íG";s:3:"檚";s:2:"íH";s:3:"檅";s:2:"íI";s:3:"檌";s:2:"íJ";s:3:"檒";s:2:"íK";s:3:"æ­›";s:2:"íL";s:3:"æ®­";s:2:"íM";s:3:"æ°‰";s:2:"íN";s:3:"濌";s:2:"íO";s:3:"澩";s:2:"íP";s:3:"æ¿´";s:2:"íQ";s:3:"æ¿”";s:2:"íR";s:3:"æ¿£";s:2:"íS";s:3:"濜";s:2:"íT";s:3:"æ¿­";s:2:"íU";s:3:"æ¿§";s:2:"íV";s:3:"濦";s:2:"íW";s:3:"濞";s:2:"íX";s:3:"濲";s:2:"íY";s:3:"æ¿";s:2:"íZ";s:3:"æ¿¢";s:2:"í[";s:3:"濨";s:2:"í\";s:3:"燡";s:2:"í]";s:3:"燱";s:2:"í^";s:3:"燨";s:2:"í_";s:3:"燲";s:2:"í`";s:3:"燤";s:2:"ía";s:3:"燰";s:2:"íb";s:3:"燢";s:2:"íc";s:3:"ç³";s:2:"íd";s:3:"ç®";s:2:"íe";s:3:"ç¯";s:2:"íf";s:3:"ç’—";s:2:"íg";s:3:"ç’²";s:2:"íh";s:3:"ç’«";s:2:"íi";s:3:"ç’";s:2:"íj";s:3:"ç’ª";s:2:"ík";s:3:"ç’­";s:2:"íl";s:3:"ç’±";s:2:"ím";s:3:"ç’¥";s:2:"ín";s:3:"ç’¯";s:2:"ío";s:3:"ç”";s:2:"íp";s:3:"甑";s:2:"íq";s:3:"ç”’";s:2:"ír";s:3:"ç”";s:2:"ís";s:3:"ç–„";s:2:"ít";s:3:"癃";s:2:"íu";s:3:"癈";s:2:"ív";s:3:"癉";s:2:"íw";s:3:"癇";s:2:"íx";s:3:"皤";s:2:"íy";s:3:"盩";s:2:"íz";s:3:"çžµ";s:2:"í{";s:3:"çž«";s:2:"í|";s:3:"çž²";s:2:"í}";s:3:"çž·";s:2:"í~";s:3:"çž¶";s:2:"í¡";s:3:"çž´";s:2:"í¢";s:3:"çž±";s:2:"í£";s:3:"瞨";s:2:"í¤";s:3:"矰";s:2:"í¥";s:3:"磳";s:2:"í¦";s:3:"磽";s:2:"í§";s:3:"礂";s:2:"í¨";s:3:"磻";s:2:"í©";s:3:"磼";s:2:"íª";s:3:"磲";s:2:"í«";s:3:"礅";s:2:"í¬";s:3:"磹";s:2:"í­";s:3:"磾";s:2:"í®";s:3:"礄";s:2:"í¯";s:3:"禫";s:2:"í°";s:3:"禨";s:2:"í±";s:3:"穜";s:2:"í²";s:3:"ç©›";s:2:"í³";s:3:"ç©–";s:2:"í´";s:3:"穘";s:2:"íµ";s:3:"ç©”";s:2:"í¶";s:3:"穚";s:2:"í·";s:3:"窾";s:2:"í¸";s:3:"ç«€";s:2:"í¹";s:3:"ç«";s:2:"íº";s:3:"ç°…";s:2:"í»";s:3:"ç°";s:2:"í¼";s:3:"篲";s:2:"í½";s:3:"ç°€";s:2:"í¾";s:3:"篿";s:2:"í¿";s:3:"篻";s:2:"íÀ";s:3:"ç°Ž";s:2:"íÁ";s:3:"篴";s:2:"íÂ";s:3:"ç°‹";s:2:"íÃ";s:3:"篳";s:2:"íÄ";s:3:"ç°‚";s:2:"íÅ";s:3:"ç°‰";s:2:"íÆ";s:3:"ç°ƒ";s:2:"íÇ";s:3:"ç°";s:2:"íÈ";s:3:"篸";s:2:"íÉ";s:3:"篽";s:2:"íÊ";s:3:"ç°†";s:2:"íË";s:3:"篰";s:2:"íÌ";s:3:"篱";s:2:"íÍ";s:3:"ç°";s:2:"íÎ";s:3:"ç°Š";s:2:"íÏ";s:3:"糨";s:2:"íÐ";s:3:"縭";s:2:"íÑ";s:3:"縼";s:2:"íÒ";s:3:"繂";s:2:"íÓ";s:3:"縳";s:2:"íÔ";s:3:"顈";s:2:"íÕ";s:3:"縸";s:2:"íÖ";s:3:"縪";s:2:"í×";s:3:"繉";s:2:"íØ";s:3:"ç¹€";s:2:"íÙ";s:3:"繇";s:2:"íÚ";s:3:"縩";s:2:"íÛ";s:3:"繌";s:2:"íÜ";s:3:"縰";s:2:"íÝ";s:3:"縻";s:2:"íÞ";s:3:"縶";s:2:"íß";s:3:"繄";s:2:"íà";s:3:"縺";s:2:"íá";s:3:"ç½…";s:2:"íâ";s:3:"罿";s:2:"íã";s:3:"ç½¾";s:2:"íä";s:3:"ç½½";s:2:"íå";s:3:"ç¿´";s:2:"íæ";s:3:"翲";s:2:"íç";s:3:"耬";s:2:"íè";s:3:"膻";s:2:"íé";s:3:"臄";s:2:"íê";s:3:"臌";s:2:"íë";s:3:"臊";s:2:"íì";s:3:"臅";s:2:"íí";s:3:"臇";s:2:"íî";s:3:"膼";s:2:"íï";s:3:"臩";s:2:"íð";s:3:"艛";s:2:"íñ";s:3:"艚";s:2:"íò";s:3:"艜";s:2:"íó";s:3:"è–ƒ";s:2:"íô";s:3:"è–€";s:2:"íõ";s:3:"è–";s:2:"íö";s:3:"è–§";s:2:"í÷";s:3:"è–•";s:2:"íø";s:3:"è– ";s:2:"íù";s:3:"è–‹";s:2:"íú";s:3:"è–£";s:2:"íû";s:3:"è•»";s:2:"íü";s:3:"è–¤";s:2:"íý";s:3:"è–š";s:2:"íþ";s:3:"è–ž";s:2:"î@";s:3:"è•·";s:2:"îA";s:3:"蕼";s:2:"îB";s:3:"è–‰";s:2:"îC";s:3:"è–¡";s:2:"îD";s:3:"蕺";s:2:"îE";s:3:"蕸";s:2:"îF";s:3:"è•—";s:2:"îG";s:3:"è–Ž";s:2:"îH";s:3:"è––";s:2:"îI";s:3:"è–†";s:2:"îJ";s:3:"è–";s:2:"îK";s:3:"è–™";s:2:"îL";s:3:"è–";s:2:"îM";s:3:"è–";s:2:"îN";s:3:"è–¢";s:2:"îO";s:3:"è–‚";s:2:"îP";s:3:"è–ˆ";s:2:"îQ";s:3:"è–…";s:2:"îR";s:3:"蕹";s:2:"îS";s:3:"è•¶";s:2:"îT";s:3:"è–˜";s:2:"îU";s:3:"è–";s:2:"îV";s:3:"è–Ÿ";s:2:"îW";s:3:"虨";s:2:"îX";s:3:"èž¾";s:2:"îY";s:3:"螪";s:2:"îZ";s:3:"èž­";s:2:"î[";s:3:"蟅";s:2:"î\";s:3:"èž°";s:2:"î]";s:3:"螬";s:2:"î^";s:3:"èž¹";s:2:"î_";s:3:"èžµ";s:2:"î`";s:3:"èž¼";s:2:"îa";s:3:"èž®";s:2:"îb";s:3:"蟉";s:2:"îc";s:3:"蟃";s:2:"îd";s:3:"蟂";s:2:"îe";s:3:"蟌";s:2:"îf";s:3:"èž·";s:2:"îg";s:3:"螯";s:2:"îh";s:3:"蟄";s:2:"îi";s:3:"蟊";s:2:"îj";s:3:"èž´";s:2:"îk";s:3:"èž¶";s:2:"îl";s:3:"èž¿";s:2:"îm";s:3:"螸";s:2:"în";s:3:"èž½";s:2:"îo";s:3:"蟞";s:2:"îp";s:3:"èž²";s:2:"îq";s:3:"褵";s:2:"îr";s:3:"褳";s:2:"îs";s:3:"褼";s:2:"ît";s:3:"褾";s:2:"îu";s:3:"è¥";s:2:"îv";s:3:"襒";s:2:"îw";s:3:"褷";s:2:"îx";s:3:"襂";s:2:"îy";s:3:"覭";s:2:"îz";s:3:"覯";s:2:"î{";s:3:"覮";s:2:"î|";s:3:"è§²";s:2:"î}";s:3:"è§³";s:2:"î~";s:3:"謞";s:2:"î¡";s:3:"謘";s:2:"î¢";s:3:"謖";s:2:"î£";s:3:"謑";s:2:"î¤";s:3:"謅";s:2:"î¥";s:3:"謋";s:2:"î¦";s:3:"謢";s:2:"î§";s:3:"è¬";s:2:"î¨";s:3:"謒";s:2:"î©";s:3:"謕";s:2:"îª";s:3:"謇";s:2:"î«";s:3:"è¬";s:2:"î¬";s:3:"謈";s:2:"î­";s:3:"謆";s:2:"î®";s:3:"謜";s:2:"î¯";s:3:"謓";s:2:"î°";s:3:"謚";s:2:"î±";s:3:"è±";s:2:"î²";s:3:"è±°";s:2:"î³";s:3:"è±²";s:2:"î´";s:3:"è±±";s:2:"îµ";s:3:"豯";s:2:"î¶";s:3:"貕";s:2:"î·";s:3:"è²”";s:2:"î¸";s:3:"è³¹";s:2:"î¹";s:3:"赯";s:2:"îº";s:3:"蹎";s:2:"î»";s:3:"è¹";s:2:"î¼";s:3:"蹓";s:2:"î½";s:3:"è¹";s:2:"î¾";s:3:"蹌";s:2:"î¿";s:3:"蹇";s:2:"îÀ";s:3:"轃";s:2:"îÁ";s:3:"è½€";s:2:"îÂ";s:3:"é‚…";s:2:"îÃ";s:3:"é¾";s:2:"îÄ";s:3:"鄸";s:2:"îÅ";s:3:"醚";s:2:"îÆ";s:3:"醢";s:2:"îÇ";s:3:"醛";s:2:"îÈ";s:3:"醙";s:2:"îÉ";s:3:"醟";s:2:"îÊ";s:3:"醡";s:2:"îË";s:3:"é†";s:2:"îÌ";s:3:"醠";s:2:"îÍ";s:3:"鎡";s:2:"îÎ";s:3:"鎃";s:2:"îÏ";s:3:"鎯";s:2:"îÐ";s:3:"é¤";s:2:"îÑ";s:3:"é–";s:2:"îÒ";s:3:"é‡";s:2:"îÓ";s:3:"é¼";s:2:"îÔ";s:3:"é˜";s:2:"îÕ";s:3:"éœ";s:2:"îÖ";s:3:"é¶";s:2:"î×";s:3:"é‰";s:2:"îØ";s:3:"é";s:2:"îÙ";s:3:"é‘";s:2:"îÚ";s:3:"é ";s:2:"îÛ";s:3:"é­";s:2:"îÜ";s:3:"éŽ";s:2:"îÝ";s:3:"éŒ";s:2:"îÞ";s:3:"éª";s:2:"îß";s:3:"é¹";s:2:"îà";s:3:"é—";s:2:"îá";s:3:"é•";s:2:"îâ";s:3:"é’";s:2:"îã";s:3:"é";s:2:"îä";s:3:"é±";s:2:"îå";s:3:"é·";s:2:"îæ";s:3:"é»";s:2:"îç";s:3:"é¡";s:2:"îè";s:3:"éž";s:2:"îé";s:3:"é£";s:2:"îê";s:3:"é§";s:2:"îë";s:3:"鎀";s:2:"îì";s:3:"éŽ";s:2:"îí";s:3:"é™";s:2:"îî";s:3:"é—‡";s:2:"îï";s:3:"é—€";s:2:"îð";s:3:"é—‰";s:2:"îñ";s:3:"é—ƒ";s:2:"îò";s:3:"é—…";s:2:"îó";s:3:"é–·";s:2:"îô";s:3:"éš®";s:2:"îõ";s:3:"éš°";s:2:"îö";s:3:"隬";s:2:"î÷";s:3:"霠";s:2:"îø";s:3:"霟";s:2:"îù";s:3:"霘";s:2:"îú";s:3:"éœ";s:2:"îû";s:3:"霙";s:2:"îü";s:3:"éžš";s:2:"îý";s:3:"éž¡";s:2:"îþ";s:3:"éžœ";s:2:"ï@";s:3:"éžž";s:2:"ïA";s:3:"éž";s:2:"ïB";s:3:"韕";s:2:"ïC";s:3:"韔";s:2:"ïD";s:3:"韱";s:2:"ïE";s:3:"é¡";s:2:"ïF";s:3:"é¡„";s:2:"ïG";s:3:"顊";s:2:"ïH";s:3:"顉";s:2:"ïI";s:3:"é¡…";s:2:"ïJ";s:3:"顃";s:2:"ïK";s:3:"餥";s:2:"ïL";s:3:"餫";s:2:"ïM";s:3:"餬";s:2:"ïN";s:3:"餪";s:2:"ïO";s:3:"餳";s:2:"ïP";s:3:"餲";s:2:"ïQ";s:3:"餯";s:2:"ïR";s:3:"餭";s:2:"ïS";s:3:"餱";s:2:"ïT";s:3:"餰";s:2:"ïU";s:3:"馘";s:2:"ïV";s:3:"馣";s:2:"ïW";s:3:"馡";s:2:"ïX";s:3:"騂";s:2:"ïY";s:3:"駺";s:2:"ïZ";s:3:"é§´";s:2:"ï[";s:3:"é§·";s:2:"ï\";s:3:"é§¹";s:2:"ï]";s:3:"駸";s:2:"ï^";s:3:"é§¶";s:2:"ï_";s:3:"é§»";s:2:"ï`";s:3:"é§½";s:2:"ïa";s:3:"é§¾";s:2:"ïb";s:3:"é§¼";s:2:"ïc";s:3:"騃";s:2:"ïd";s:3:"骾";s:2:"ïe";s:3:"髾";s:2:"ïf";s:3:"髽";s:2:"ïg";s:3:"é¬";s:2:"ïh";s:3:"髼";s:2:"ïi";s:3:"é­ˆ";s:2:"ïj";s:3:"鮚";s:2:"ïk";s:3:"鮨";s:2:"ïl";s:3:"鮞";s:2:"ïm";s:3:"é®›";s:2:"ïn";s:3:"鮦";s:2:"ïo";s:3:"鮡";s:2:"ïp";s:3:"鮥";s:2:"ïq";s:3:"鮤";s:2:"ïr";s:3:"鮆";s:2:"ïs";s:3:"鮢";s:2:"ït";s:3:"é® ";s:2:"ïu";s:3:"鮯";s:2:"ïv";s:3:"é´³";s:2:"ïw";s:3:"éµ";s:2:"ïx";s:3:"éµ§";s:2:"ïy";s:3:"é´¶";s:2:"ïz";s:3:"é´®";s:2:"ï{";s:3:"é´¯";s:2:"ï|";s:3:"é´±";s:2:"ï}";s:3:"é´¸";s:2:"ï~";s:3:"é´°";s:2:"ï¡";s:3:"éµ…";s:2:"ï¢";s:3:"鵂";s:2:"ï£";s:3:"鵃";s:2:"ï¤";s:3:"é´¾";s:2:"ï¥";s:3:"é´·";s:2:"ï¦";s:3:"éµ€";s:2:"ï§";s:3:"é´½";s:2:"ï¨";s:3:"翵";s:2:"ï©";s:3:"é´­";s:2:"ïª";s:3:"麊";s:2:"ï«";s:3:"麉";s:2:"ï¬";s:3:"éº";s:2:"ï­";s:3:"麰";s:2:"ï®";s:3:"黈";s:2:"ï¯";s:3:"黚";s:2:"ï°";s:3:"é»»";s:2:"ï±";s:3:"黿";s:2:"ï²";s:3:"鼤";s:2:"ï³";s:3:"é¼£";s:2:"ï´";s:3:"é¼¢";s:2:"ïµ";s:3:"é½”";s:2:"ï¶";s:3:"é¾ ";s:2:"ï·";s:3:"儱";s:2:"ï¸";s:3:"å„­";s:2:"ï¹";s:3:"å„®";s:2:"ïº";s:3:"嚘";s:2:"ï»";s:3:"åšœ";s:2:"ï¼";s:3:"åš—";s:2:"ï½";s:3:"åšš";s:2:"ï¾";s:3:"åš";s:2:"ï¿";s:3:"åš™";s:2:"ïÀ";s:3:"奰";s:2:"ïÁ";s:3:"嬼";s:2:"ïÂ";s:3:"屩";s:2:"ïÃ";s:3:"屪";s:2:"ïÄ";s:3:"å·€";s:2:"ïÅ";s:3:"å¹­";s:2:"ïÆ";s:3:"å¹®";s:2:"ïÇ";s:3:"懘";s:2:"ïÈ";s:3:"懟";s:2:"ïÉ";s:3:"懭";s:2:"ïÊ";s:3:"懮";s:2:"ïË";s:3:"懱";s:2:"ïÌ";s:3:"懪";s:2:"ïÍ";s:3:"懰";s:2:"ïÎ";s:3:"懫";s:2:"ïÏ";s:3:"懖";s:2:"ïÐ";s:3:"懩";s:2:"ïÑ";s:3:"æ“¿";s:2:"ïÒ";s:3:"攄";s:2:"ïÓ";s:3:"擽";s:2:"ïÔ";s:3:"擸";s:2:"ïÕ";s:3:"æ”";s:2:"ïÖ";s:3:"攃";s:2:"ï×";s:3:"擼";s:2:"ïØ";s:3:"æ–”";s:2:"ïÙ";s:3:"æ—›";s:2:"ïÚ";s:3:"曚";s:2:"ïÛ";s:3:"æ››";s:2:"ïÜ";s:3:"曘";s:2:"ïÝ";s:3:"æ«…";s:2:"ïÞ";s:3:"檹";s:2:"ïß";s:3:"檽";s:2:"ïà";s:3:"æ«¡";s:2:"ïá";s:3:"櫆";s:2:"ïâ";s:3:"檺";s:2:"ïã";s:3:"檶";s:2:"ïä";s:3:"檷";s:2:"ïå";s:3:"櫇";s:2:"ïæ";s:3:"檴";s:2:"ïç";s:3:"檭";s:2:"ïè";s:3:"æ­ž";s:2:"ïé";s:3:"毉";s:2:"ïê";s:3:"æ°‹";s:2:"ïë";s:3:"瀇";s:2:"ïì";s:3:"瀌";s:2:"ïí";s:3:"ç€";s:2:"ïî";s:3:"ç€";s:2:"ïï";s:3:"瀅";s:2:"ïð";s:3:"瀔";s:2:"ïñ";s:3:"瀎";s:2:"ïò";s:3:"æ¿¿";s:2:"ïó";s:3:"瀀";s:2:"ïô";s:3:"æ¿»";s:2:"ïõ";s:3:"瀦";s:2:"ïö";s:3:"濼";s:2:"ï÷";s:3:"æ¿·";s:2:"ïø";s:3:"瀊";s:2:"ïù";s:3:"çˆ";s:2:"ïú";s:3:"燿";s:2:"ïû";s:3:"燹";s:2:"ïü";s:3:"爃";s:2:"ïý";s:3:"燽";s:2:"ïþ";s:3:"ç¶";s:2:"ð@";s:3:"ç’¸";s:2:"ðA";s:3:"ç“€";s:2:"ðB";s:3:"ç’µ";s:2:"ðC";s:3:"ç“";s:2:"ðD";s:3:"ç’¾";s:2:"ðE";s:3:"ç’¶";s:2:"ðF";s:3:"ç’»";s:2:"ðG";s:3:"ç“‚";s:2:"ðH";s:3:"ç””";s:2:"ðI";s:3:"甓";s:2:"ðJ";s:3:"癜";s:2:"ðK";s:3:"癤";s:2:"ðL";s:3:"ç™™";s:2:"ðM";s:3:"ç™";s:2:"ðN";s:3:"癓";s:2:"ðO";s:3:"ç™—";s:2:"ðP";s:3:"癚";s:2:"ðQ";s:3:"皦";s:2:"ðR";s:3:"çš½";s:2:"ðS";s:3:"盬";s:2:"ðT";s:3:"矂";s:2:"ðU";s:3:"瞺";s:2:"ðV";s:3:"磿";s:2:"ðW";s:3:"礌";s:2:"ðX";s:3:"礓";s:2:"ðY";s:3:"礔";s:2:"ðZ";s:3:"礉";s:2:"ð[";s:3:"ç¤";s:2:"ð\";s:3:"礒";s:2:"ð]";s:3:"礑";s:2:"ð^";s:3:"禭";s:2:"ð_";s:3:"禬";s:2:"ð`";s:3:"穟";s:2:"ða";s:3:"ç°œ";s:2:"ðb";s:3:"ç°©";s:2:"ðc";s:3:"ç°™";s:2:"ðd";s:3:"ç° ";s:2:"ðe";s:3:"ç°Ÿ";s:2:"ðf";s:3:"ç°­";s:2:"ðg";s:3:"ç°";s:2:"ðh";s:3:"ç°¦";s:2:"ði";s:3:"ç°¨";s:2:"ðj";s:3:"ç°¢";s:2:"ðk";s:3:"ç°¥";s:2:"ðl";s:3:"ç°°";s:2:"ðm";s:3:"繜";s:2:"ðn";s:3:"ç¹";s:2:"ðo";s:3:"ç¹–";s:2:"ðp";s:3:"ç¹£";s:2:"ðq";s:3:"繘";s:2:"ðr";s:3:"ç¹¢";s:2:"ðs";s:3:"繟";s:2:"ðt";s:3:"繑";s:2:"ðu";s:3:"ç¹ ";s:2:"ðv";s:3:"ç¹—";s:2:"ðw";s:3:"繓";s:2:"ðx";s:3:"ç¾µ";s:2:"ðy";s:3:"ç¾³";s:2:"ðz";s:3:"ç¿·";s:2:"ð{";s:3:"翸";s:2:"ð|";s:3:"èµ";s:2:"ð}";s:3:"臑";s:2:"ð~";s:3:"臒";s:2:"ð¡";s:3:"è‡";s:2:"ð¢";s:3:"艟";s:2:"ð£";s:3:"艞";s:2:"ð¤";s:3:"è–´";s:2:"ð¥";s:3:"è—†";s:2:"ð¦";s:3:"è—€";s:2:"ð§";s:3:"è—ƒ";s:2:"ð¨";s:3:"è—‚";s:2:"ð©";s:3:"è–³";s:2:"ðª";s:3:"è–µ";s:2:"ð«";s:3:"è–½";s:2:"ð¬";s:3:"è—‡";s:2:"ð­";s:3:"è—„";s:2:"ð®";s:3:"è–¿";s:2:"ð¯";s:3:"è—‹";s:2:"ð°";s:3:"è—Ž";s:2:"ð±";s:3:"è—ˆ";s:2:"ð²";s:3:"è—…";s:2:"ð³";s:3:"è–±";s:2:"ð´";s:3:"è–¶";s:2:"ðµ";s:3:"è—’";s:2:"ð¶";s:3:"蘤";s:2:"ð·";s:3:"è–¸";s:2:"ð¸";s:3:"è–·";s:2:"ð¹";s:3:"è–¾";s:2:"ðº";s:3:"虩";s:2:"ð»";s:3:"蟧";s:2:"ð¼";s:3:"蟦";s:2:"ð½";s:3:"蟢";s:2:"ð¾";s:3:"蟛";s:2:"ð¿";s:3:"蟫";s:2:"ðÀ";s:3:"蟪";s:2:"ðÁ";s:3:"蟥";s:2:"ðÂ";s:3:"蟟";s:2:"ðÃ";s:3:"蟳";s:2:"ðÄ";s:3:"蟤";s:2:"ðÅ";s:3:"蟔";s:2:"ðÆ";s:3:"蟜";s:2:"ðÇ";s:3:"蟓";s:2:"ðÈ";s:3:"蟭";s:2:"ðÉ";s:3:"蟘";s:2:"ðÊ";s:3:"蟣";s:2:"ðË";s:3:"螤";s:2:"ðÌ";s:3:"蟗";s:2:"ðÍ";s:3:"蟙";s:2:"ðÎ";s:3:"è ";s:2:"ðÏ";s:3:"蟴";s:2:"ðÐ";s:3:"蟨";s:2:"ðÑ";s:3:"èŸ";s:2:"ðÒ";s:3:"襓";s:2:"ðÓ";s:3:"襋";s:2:"ðÔ";s:3:"è¥";s:2:"ðÕ";s:3:"襌";s:2:"ðÖ";s:3:"襆";s:2:"ð×";s:3:"è¥";s:2:"ðØ";s:3:"襑";s:2:"ðÙ";s:3:"襉";s:2:"ðÚ";s:3:"謪";s:2:"ðÛ";s:3:"謧";s:2:"ðÜ";s:3:"謣";s:2:"ðÝ";s:3:"謳";s:2:"ðÞ";s:3:"謰";s:2:"ðß";s:3:"謵";s:2:"ðà";s:3:"è­‡";s:2:"ðá";s:3:"謯";s:2:"ðâ";s:3:"謼";s:2:"ðã";s:3:"謾";s:2:"ðä";s:3:"謱";s:2:"ðå";s:3:"謥";s:2:"ðæ";s:3:"謷";s:2:"ðç";s:3:"謦";s:2:"ðè";s:3:"謶";s:2:"ðé";s:3:"謮";s:2:"ðê";s:3:"謤";s:2:"ðë";s:3:"謻";s:2:"ðì";s:3:"謽";s:2:"ðí";s:3:"謺";s:2:"ðî";s:3:"豂";s:2:"ðï";s:3:"è±µ";s:2:"ðð";s:3:"è²™";s:2:"ðñ";s:3:"貘";s:2:"ðò";s:3:"è²—";s:2:"ðó";s:3:"è³¾";s:2:"ðô";s:3:"è´„";s:2:"ðõ";s:3:"è´‚";s:2:"ðö";s:3:"è´€";s:2:"ð÷";s:3:"蹜";s:2:"ðø";s:3:"è¹¢";s:2:"ðù";s:3:"è¹ ";s:2:"ðú";s:3:"è¹—";s:2:"ðû";s:3:"è¹–";s:2:"ðü";s:3:"蹞";s:2:"ðý";s:3:"è¹¥";s:2:"ðþ";s:3:"è¹§";s:2:"ñ@";s:3:"è¹›";s:2:"ñA";s:3:"蹚";s:2:"ñB";s:3:"蹡";s:2:"ñC";s:3:"è¹";s:2:"ñD";s:3:"蹩";s:2:"ñE";s:3:"è¹”";s:2:"ñF";s:3:"轆";s:2:"ñG";s:3:"轇";s:2:"ñH";s:3:"轈";s:2:"ñI";s:3:"轋";s:2:"ñJ";s:3:"鄨";s:2:"ñK";s:3:"鄺";s:2:"ñL";s:3:"é„»";s:2:"ñM";s:3:"鄾";s:2:"ñN";s:3:"醨";s:2:"ñO";s:3:"醥";s:2:"ñP";s:3:"醧";s:2:"ñQ";s:3:"醯";s:2:"ñR";s:3:"醪";s:2:"ñS";s:3:"鎵";s:2:"ñT";s:3:"鎌";s:2:"ñU";s:3:"鎒";s:2:"ñV";s:3:"鎷";s:2:"ñW";s:3:"鎛";s:2:"ñX";s:3:"éŽ";s:2:"ñY";s:3:"鎉";s:2:"ñZ";s:3:"鎧";s:2:"ñ[";s:3:"鎎";s:2:"ñ\";s:3:"鎪";s:2:"ñ]";s:3:"鎞";s:2:"ñ^";s:3:"鎦";s:2:"ñ_";s:3:"鎕";s:2:"ñ`";s:3:"鎈";s:2:"ña";s:3:"鎙";s:2:"ñb";s:3:"鎟";s:2:"ñc";s:3:"éŽ";s:2:"ñd";s:3:"鎱";s:2:"ñe";s:3:"鎑";s:2:"ñf";s:3:"鎲";s:2:"ñg";s:3:"鎤";s:2:"ñh";s:3:"鎨";s:2:"ñi";s:3:"鎴";s:2:"ñj";s:3:"鎣";s:2:"ñk";s:3:"鎥";s:2:"ñl";s:3:"é—’";s:2:"ñm";s:3:"é—“";s:2:"ñn";s:3:"é—‘";s:2:"ño";s:3:"éš³";s:2:"ñp";s:3:"é›—";s:2:"ñq";s:3:"雚";s:2:"ñr";s:3:"å·‚";s:2:"ñs";s:3:"雟";s:2:"ñt";s:3:"雘";s:2:"ñu";s:3:"é›";s:2:"ñv";s:3:"霣";s:2:"ñw";s:3:"霢";s:2:"ñx";s:3:"霥";s:2:"ñy";s:3:"鞬";s:2:"ñz";s:3:"éž®";s:2:"ñ{";s:3:"鞨";s:2:"ñ|";s:3:"éž«";s:2:"ñ}";s:3:"鞤";s:2:"ñ~";s:3:"鞪";s:2:"ñ¡";s:3:"鞢";s:2:"ñ¢";s:3:"鞥";s:2:"ñ£";s:3:"韗";s:2:"ñ¤";s:3:"韙";s:2:"ñ¥";s:3:"韖";s:2:"ñ¦";s:3:"韘";s:2:"ñ§";s:3:"韺";s:2:"ñ¨";s:3:"é¡";s:2:"ñ©";s:3:"é¡‘";s:2:"ñª";s:3:"é¡’";s:2:"ñ«";s:3:"颸";s:2:"ñ¬";s:3:"é¥";s:2:"ñ­";s:3:"餼";s:2:"ñ®";s:3:"餺";s:2:"ñ¯";s:3:"é¨";s:2:"ñ°";s:3:"騋";s:2:"ñ±";s:3:"騉";s:2:"ñ²";s:3:"é¨";s:2:"ñ³";s:3:"騄";s:2:"ñ´";s:3:"騑";s:2:"ñµ";s:3:"騊";s:2:"ñ¶";s:3:"騅";s:2:"ñ·";s:3:"騇";s:2:"ñ¸";s:3:"騆";s:2:"ñ¹";s:3:"é«€";s:2:"ñº";s:3:"髜";s:2:"ñ»";s:3:"鬈";s:2:"ñ¼";s:3:"鬄";s:2:"ñ½";s:3:"鬅";s:2:"ñ¾";s:3:"鬩";s:2:"ñ¿";s:3:"鬵";s:2:"ñÀ";s:3:"é­Š";s:2:"ñÁ";s:3:"é­Œ";s:2:"ñÂ";s:3:"é­‹";s:2:"ñÃ";s:3:"鯇";s:2:"ñÄ";s:3:"鯆";s:2:"ñÅ";s:3:"鯃";s:2:"ñÆ";s:3:"鮿";s:2:"ñÇ";s:3:"é¯";s:2:"ñÈ";s:3:"鮵";s:2:"ñÉ";s:3:"鮸";s:2:"ñÊ";s:3:"鯓";s:2:"ñË";s:3:"é®¶";s:2:"ñÌ";s:3:"鯄";s:2:"ñÍ";s:3:"鮹";s:2:"ñÎ";s:3:"鮽";s:2:"ñÏ";s:3:"鵜";s:2:"ñÐ";s:3:"鵓";s:2:"ñÑ";s:3:"éµ";s:2:"ñÒ";s:3:"鵊";s:2:"ñÓ";s:3:"éµ›";s:2:"ñÔ";s:3:"鵋";s:2:"ñÕ";s:3:"éµ™";s:2:"ñÖ";s:3:"éµ–";s:2:"ñ×";s:3:"鵌";s:2:"ñØ";s:3:"éµ—";s:2:"ñÙ";s:3:"éµ’";s:2:"ñÚ";s:3:"éµ”";s:2:"ñÛ";s:3:"鵟";s:2:"ñÜ";s:3:"鵘";s:2:"ñÝ";s:3:"鵚";s:2:"ñÞ";s:3:"麎";s:2:"ñß";s:3:"麌";s:2:"ñà";s:3:"黟";s:2:"ñá";s:3:"é¼";s:2:"ñâ";s:3:"é¼€";s:2:"ñã";s:3:"é¼–";s:2:"ñä";s:3:"é¼¥";s:2:"ñå";s:3:"鼫";s:2:"ñæ";s:3:"鼪";s:2:"ñç";s:3:"鼩";s:2:"ñè";s:3:"鼨";s:2:"ñé";s:3:"齌";s:2:"ñê";s:3:"齕";s:2:"ñë";s:3:"å„´";s:2:"ñì";s:3:"儵";s:2:"ñí";s:3:"劖";s:2:"ñî";s:3:"å‹·";s:2:"ñï";s:3:"厴";s:2:"ñð";s:3:"åš«";s:2:"ññ";s:3:"åš­";s:2:"ñò";s:3:"嚦";s:2:"ñó";s:3:"åš§";s:2:"ñô";s:3:"嚪";s:2:"ñõ";s:3:"嚬";s:2:"ñö";s:3:"壚";s:2:"ñ÷";s:3:"å£";s:2:"ñø";s:3:"壛";s:2:"ñù";s:3:"夒";s:2:"ñú";s:3:"嬽";s:2:"ñû";s:3:"嬾";s:2:"ñü";s:3:"嬿";s:2:"ñý";s:3:"å·ƒ";s:2:"ñþ";s:3:"å¹°";s:2:"ò@";s:3:"徿";s:2:"òA";s:3:"懻";s:2:"òB";s:3:"攇";s:2:"òC";s:3:"æ”";s:2:"òD";s:3:"æ”";s:2:"òE";s:3:"攉";s:2:"òF";s:3:"攌";s:2:"òG";s:3:"攎";s:2:"òH";s:3:"æ–„";s:2:"òI";s:3:"æ—ž";s:2:"òJ";s:3:"æ—";s:2:"òK";s:3:"曞";s:2:"òL";s:3:"æ«§";s:2:"òM";s:3:"æ« ";s:2:"òN";s:3:"櫌";s:2:"òO";s:3:"æ«‘";s:2:"òP";s:3:"æ«™";s:2:"òQ";s:3:"æ«‹";s:2:"òR";s:3:"櫟";s:2:"òS";s:3:"櫜";s:2:"òT";s:3:"æ«";s:2:"òU";s:3:"æ««";s:2:"òV";s:3:"æ«";s:2:"òW";s:3:"æ«";s:2:"òX";s:3:"櫞";s:2:"òY";s:3:"æ­ ";s:2:"òZ";s:3:"æ®°";s:2:"ò[";s:3:"æ°Œ";s:2:"ò\";s:3:"瀙";s:2:"ò]";s:3:"瀧";s:2:"ò^";s:3:"瀠";s:2:"ò_";s:3:"瀖";s:2:"ò`";s:3:"瀫";s:2:"òa";s:3:"瀡";s:2:"òb";s:3:"瀢";s:2:"òc";s:3:"瀣";s:2:"òd";s:3:"瀩";s:2:"òe";s:3:"瀗";s:2:"òf";s:3:"瀤";s:2:"òg";s:3:"瀜";s:2:"òh";s:3:"瀪";s:2:"òi";s:3:"爌";s:2:"òj";s:3:"爊";s:2:"òk";s:3:"爇";s:2:"òl";s:3:"爂";s:2:"òm";s:3:"爅";s:2:"òn";s:3:"犥";s:2:"òo";s:3:"犦";s:2:"òp";s:3:"犤";s:2:"òq";s:3:"犣";s:2:"òr";s:3:"犡";s:2:"òs";s:3:"ç“‹";s:2:"òt";s:3:"ç“…";s:2:"òu";s:3:"ç’·";s:2:"òv";s:3:"瓃";s:2:"òw";s:3:"ç”–";s:2:"òx";s:3:"ç™ ";s:2:"òy";s:3:"矉";s:2:"òz";s:3:"矊";s:2:"ò{";s:3:"矄";s:2:"ò|";s:3:"矱";s:2:"ò}";s:3:"ç¤";s:2:"ò~";s:3:"礛";s:2:"ò¡";s:3:"礡";s:2:"ò¢";s:3:"礜";s:2:"ò£";s:3:"礗";s:2:"ò¤";s:3:"礞";s:2:"ò¥";s:3:"禰";s:2:"ò¦";s:3:"ç©§";s:2:"ò§";s:3:"穨";s:2:"ò¨";s:3:"ç°³";s:2:"ò©";s:3:"ç°¼";s:2:"òª";s:3:"ç°¹";s:2:"ò«";s:3:"ç°¬";s:2:"ò¬";s:3:"ç°»";s:2:"ò­";s:3:"糬";s:2:"ò®";s:3:"糪";s:2:"ò¯";s:3:"ç¹¶";s:2:"ò°";s:3:"ç¹µ";s:2:"ò±";s:3:"繸";s:2:"ò²";s:3:"ç¹°";s:2:"ò³";s:3:"ç¹·";s:2:"ò´";s:3:"繯";s:2:"òµ";s:3:"繺";s:2:"ò¶";s:3:"ç¹²";s:2:"ò·";s:3:"ç¹´";s:2:"ò¸";s:3:"繨";s:2:"ò¹";s:3:"罋";s:2:"òº";s:3:"罊";s:2:"ò»";s:3:"羃";s:2:"ò¼";s:3:"羆";s:2:"ò½";s:3:"ç¾·";s:2:"ò¾";s:3:"翽";s:2:"ò¿";s:3:"翾";s:2:"òÀ";s:3:"è¸";s:2:"òÁ";s:3:"臗";s:2:"òÂ";s:3:"臕";s:2:"òÃ";s:3:"艤";s:2:"òÄ";s:3:"艡";s:2:"òÅ";s:3:"艣";s:2:"òÆ";s:3:"è—«";s:2:"òÇ";s:3:"è—±";s:2:"òÈ";s:3:"è—­";s:2:"òÉ";s:3:"è—™";s:2:"òÊ";s:3:"è—¡";s:2:"òË";s:3:"è—¨";s:2:"òÌ";s:3:"è—š";s:2:"òÍ";s:3:"è——";s:2:"òÎ";s:3:"è—¬";s:2:"òÏ";s:3:"è—²";s:2:"òÐ";s:3:"è—¸";s:2:"òÑ";s:3:"è—˜";s:2:"òÒ";s:3:"è—Ÿ";s:2:"òÓ";s:3:"è—£";s:2:"òÔ";s:3:"è—œ";s:2:"òÕ";s:3:"è—‘";s:2:"òÖ";s:3:"è—°";s:2:"ò×";s:3:"è—¦";s:2:"òØ";s:3:"è—¯";s:2:"òÙ";s:3:"è—ž";s:2:"òÚ";s:3:"è—¢";s:2:"òÛ";s:3:"è €";s:2:"òÜ";s:3:"蟺";s:2:"òÝ";s:3:"è ƒ";s:2:"òÞ";s:3:"蟶";s:2:"òß";s:3:"蟷";s:2:"òà";s:3:"è ‰";s:2:"òá";s:3:"è Œ";s:2:"òâ";s:3:"è ‹";s:2:"òã";s:3:"è †";s:2:"òä";s:3:"蟼";s:2:"òå";s:3:"è ˆ";s:2:"òæ";s:3:"蟿";s:2:"òç";s:3:"è Š";s:2:"òè";s:3:"è ‚";s:2:"òé";s:3:"襢";s:2:"òê";s:3:"襚";s:2:"òë";s:3:"襛";s:2:"òì";s:3:"襗";s:2:"òí";s:3:"襡";s:2:"òî";s:3:"襜";s:2:"òï";s:3:"襘";s:2:"òð";s:3:"è¥";s:2:"òñ";s:3:"襙";s:2:"òò";s:3:"覈";s:2:"òó";s:3:"覷";s:2:"òô";s:3:"覶";s:2:"òõ";s:3:"è§¶";s:2:"òö";s:3:"è­";s:2:"ò÷";s:3:"è­ˆ";s:2:"òø";s:3:"è­Š";s:2:"òù";s:3:"è­€";s:2:"òú";s:3:"è­“";s:2:"òû";s:3:"è­–";s:2:"òü";s:3:"è­”";s:2:"òý";s:3:"è­‹";s:2:"òþ";s:3:"è­•";s:2:"ó@";s:3:"è­‘";s:2:"óA";s:3:"è­‚";s:2:"óB";s:3:"è­’";s:2:"óC";s:3:"è­—";s:2:"óD";s:3:"豃";s:2:"óE";s:3:"è±·";s:2:"óF";s:3:"è±¶";s:2:"óG";s:3:"貚";s:2:"óH";s:3:"è´†";s:2:"óI";s:3:"è´‡";s:2:"óJ";s:3:"è´‰";s:2:"óK";s:3:"趬";s:2:"óL";s:3:"趪";s:2:"óM";s:3:"è¶­";s:2:"óN";s:3:"è¶«";s:2:"óO";s:3:"è¹­";s:2:"óP";s:3:"蹸";s:2:"óQ";s:3:"è¹³";s:2:"óR";s:3:"蹪";s:2:"óS";s:3:"蹯";s:2:"óT";s:3:"è¹»";s:2:"óU";s:3:"軂";s:2:"óV";s:3:"è½’";s:2:"óW";s:3:"轑";s:2:"óX";s:3:"è½";s:2:"óY";s:3:"è½";s:2:"óZ";s:3:"轓";s:2:"ó[";s:3:"è¾´";s:2:"ó\";s:3:"é…€";s:2:"ó]";s:3:"é„¿";s:2:"ó^";s:3:"醰";s:2:"ó_";s:3:"醭";s:2:"ó`";s:3:"éž";s:2:"óa";s:3:"é‡";s:2:"ób";s:3:"é";s:2:"óc";s:3:"é‚";s:2:"ód";s:3:"éš";s:2:"óe";s:3:"é";s:2:"óf";s:3:"é¹";s:2:"óg";s:3:"é¬";s:2:"óh";s:3:"éŒ";s:2:"ói";s:3:"é™";s:2:"ój";s:3:"鎩";s:2:"ók";s:3:"é¦";s:2:"ól";s:3:"éŠ";s:2:"óm";s:3:"é”";s:2:"ón";s:3:"é®";s:2:"óo";s:3:"é£";s:2:"óp";s:3:"é•";s:2:"óq";s:3:"é„";s:2:"ór";s:3:"éŽ";s:2:"ós";s:3:"é€";s:2:"ót";s:3:"é’";s:2:"óu";s:3:"é§";s:2:"óv";s:3:"镽";s:2:"ów";s:3:"é—š";s:2:"óx";s:3:"é—›";s:2:"óy";s:3:"雡";s:2:"óz";s:3:"霩";s:2:"ó{";s:3:"霫";s:2:"ó|";s:3:"霬";s:2:"ó}";s:3:"霨";s:2:"ó~";s:3:"霦";s:2:"ó¡";s:3:"éž³";s:2:"ó¢";s:3:"éž·";s:2:"ó£";s:3:"éž¶";s:2:"ó¤";s:3:"éŸ";s:2:"ó¥";s:3:"韞";s:2:"ó¦";s:3:"韟";s:2:"ó§";s:3:"顜";s:2:"ó¨";s:3:"é¡™";s:2:"ó©";s:3:"é¡";s:2:"óª";s:3:"é¡—";s:2:"ó«";s:3:"颿";s:2:"ó¬";s:3:"颽";s:2:"ó­";s:3:"颻";s:2:"ó®";s:3:"颾";s:2:"ó¯";s:3:"饈";s:2:"ó°";s:3:"饇";s:2:"ó±";s:3:"饃";s:2:"ó²";s:3:"馦";s:2:"ó³";s:3:"馧";s:2:"ó´";s:3:"騚";s:2:"óµ";s:3:"騕";s:2:"ó¶";s:3:"騥";s:2:"ó·";s:3:"é¨";s:2:"ó¸";s:3:"騤";s:2:"ó¹";s:3:"騛";s:2:"óº";s:3:"騢";s:2:"ó»";s:3:"騠";s:2:"ó¼";s:3:"騧";s:2:"ó½";s:3:"騣";s:2:"ó¾";s:3:"騞";s:2:"ó¿";s:3:"騜";s:2:"óÀ";s:3:"騔";s:2:"óÁ";s:3:"é«‚";s:2:"óÂ";s:3:"鬋";s:2:"óÃ";s:3:"鬊";s:2:"óÄ";s:3:"鬎";s:2:"óÅ";s:3:"鬌";s:2:"óÆ";s:3:"鬷";s:2:"óÇ";s:3:"鯪";s:2:"óÈ";s:3:"鯫";s:2:"óÉ";s:3:"鯠";s:2:"óÊ";s:3:"鯞";s:2:"óË";s:3:"鯤";s:2:"óÌ";s:3:"鯦";s:2:"óÍ";s:3:"鯢";s:2:"óÎ";s:3:"鯰";s:2:"óÏ";s:3:"鯔";s:2:"óÐ";s:3:"鯗";s:2:"óÑ";s:3:"鯬";s:2:"óÒ";s:3:"鯜";s:2:"óÓ";s:3:"鯙";s:2:"óÔ";s:3:"鯥";s:2:"óÕ";s:3:"鯕";s:2:"óÖ";s:3:"鯡";s:2:"ó×";s:3:"鯚";s:2:"óØ";s:3:"éµ·";s:2:"óÙ";s:3:"é¶";s:2:"óÚ";s:3:"é¶Š";s:2:"óÛ";s:3:"é¶„";s:2:"óÜ";s:3:"鶈";s:2:"óÝ";s:3:"éµ±";s:2:"óÞ";s:3:"é¶€";s:2:"óß";s:3:"鵸";s:2:"óà";s:3:"鶆";s:2:"óá";s:3:"é¶‹";s:2:"óâ";s:3:"é¶Œ";s:2:"óã";s:3:"éµ½";s:2:"óä";s:3:"鵫";s:2:"óå";s:3:"éµ´";s:2:"óæ";s:3:"éµµ";s:2:"óç";s:3:"éµ°";s:2:"óè";s:3:"鵩";s:2:"óé";s:3:"é¶…";s:2:"óê";s:3:"éµ³";s:2:"óë";s:3:"éµ»";s:2:"óì";s:3:"é¶‚";s:2:"óí";s:3:"鵯";s:2:"óî";s:3:"éµ¹";s:2:"óï";s:3:"鵿";s:2:"óð";s:3:"鶇";s:2:"óñ";s:3:"鵨";s:2:"óò";s:3:"麔";s:2:"óó";s:3:"麑";s:2:"óô";s:3:"黀";s:2:"óõ";s:3:"黼";s:2:"óö";s:3:"é¼­";s:2:"ó÷";s:3:"é½€";s:2:"óø";s:3:"é½";s:2:"óù";s:3:"é½";s:2:"óú";s:3:"é½–";s:2:"óû";s:3:"é½—";s:2:"óü";s:3:"齘";s:2:"óý";s:3:"匷";s:2:"óþ";s:3:"åš²";s:2:"ô@";s:3:"åšµ";s:2:"ôA";s:3:"åš³";s:2:"ôB";s:3:"壣";s:2:"ôC";s:3:"å­…";s:2:"ôD";s:3:"å·†";s:2:"ôE";s:3:"å·‡";s:2:"ôF";s:3:"å»®";s:2:"ôG";s:3:"廯";s:2:"ôH";s:3:"å¿€";s:2:"ôI";s:3:"å¿";s:2:"ôJ";s:3:"懹";s:2:"ôK";s:3:"æ”—";s:2:"ôL";s:3:"æ”–";s:2:"ôM";s:3:"攕";s:2:"ôN";s:3:"攓";s:2:"ôO";s:3:"æ—Ÿ";s:2:"ôP";s:3:"曨";s:2:"ôQ";s:3:"曣";s:2:"ôR";s:3:"曤";s:2:"ôS";s:3:"櫳";s:2:"ôT";s:3:"æ«°";s:2:"ôU";s:3:"櫪";s:2:"ôV";s:3:"櫨";s:2:"ôW";s:3:"櫹";s:2:"ôX";s:3:"櫱";s:2:"ôY";s:3:"æ«®";s:2:"ôZ";s:3:"櫯";s:2:"ô[";s:3:"瀼";s:2:"ô\";s:3:"瀵";s:2:"ô]";s:3:"瀯";s:2:"ô^";s:3:"瀷";s:2:"ô_";s:3:"瀴";s:2:"ô`";s:3:"瀱";s:2:"ôa";s:3:"ç‚";s:2:"ôb";s:3:"瀸";s:2:"ôc";s:3:"瀿";s:2:"ôd";s:3:"瀺";s:2:"ôe";s:3:"瀹";s:2:"ôf";s:3:"ç€";s:2:"ôg";s:3:"瀻";s:2:"ôh";s:3:"瀳";s:2:"ôi";s:3:"ç";s:2:"ôj";s:3:"爓";s:2:"ôk";s:3:"爔";s:2:"ôl";s:3:"犨";s:2:"ôm";s:3:"ç½";s:2:"ôn";s:3:"ç¼";s:2:"ôo";s:3:"ç’º";s:2:"ôp";s:3:"çš«";s:2:"ôq";s:3:"皪";s:2:"ôr";s:3:"çš¾";s:2:"ôs";s:3:"ç›­";s:2:"ôt";s:3:"矌";s:2:"ôu";s:3:"矎";s:2:"ôv";s:3:"çŸ";s:2:"ôw";s:3:"çŸ";s:2:"ôx";s:3:"矲";s:2:"ôy";s:3:"礥";s:2:"ôz";s:3:"礣";s:2:"ô{";s:3:"礧";s:2:"ô|";s:3:"礨";s:2:"ô}";s:3:"礤";s:2:"ô~";s:3:"礩";s:2:"ô¡";s:3:"禲";s:2:"ô¢";s:3:"ç©®";s:2:"ô£";s:3:"穬";s:2:"ô¤";s:3:"ç©­";s:2:"ô¥";s:3:"ç«·";s:2:"ô¦";s:3:"籉";s:2:"ô§";s:3:"籈";s:2:"ô¨";s:3:"籊";s:2:"ô©";s:3:"籇";s:2:"ôª";s:3:"ç±…";s:2:"ô«";s:3:"ç³®";s:2:"ô¬";s:3:"ç¹»";s:2:"ô­";s:3:"ç¹¾";s:2:"ô®";s:3:"çº";s:2:"ô¯";s:3:"纀";s:2:"ô°";s:3:"羺";s:2:"ô±";s:3:"ç¿¿";s:2:"ô²";s:3:"è¹";s:2:"ô³";s:3:"臛";s:2:"ô´";s:3:"臙";s:2:"ôµ";s:3:"舋";s:2:"ô¶";s:3:"艨";s:2:"ô·";s:3:"艩";s:2:"ô¸";s:3:"蘢";s:2:"ô¹";s:3:"è—¿";s:2:"ôº";s:3:"è˜";s:2:"ô»";s:3:"è—¾";s:2:"ô¼";s:3:"蘛";s:2:"ô½";s:3:"蘀";s:2:"ô¾";s:3:"è—¶";s:2:"ô¿";s:3:"蘄";s:2:"ôÀ";s:3:"蘉";s:2:"ôÁ";s:3:"蘅";s:2:"ôÂ";s:3:"蘌";s:2:"ôÃ";s:3:"è—½";s:2:"ôÄ";s:3:"è ™";s:2:"ôÅ";s:3:"è ";s:2:"ôÆ";s:3:"è ‘";s:2:"ôÇ";s:3:"è —";s:2:"ôÈ";s:3:"è “";s:2:"ôÉ";s:3:"è –";s:2:"ôÊ";s:3:"襣";s:2:"ôË";s:3:"襦";s:2:"ôÌ";s:3:"覹";s:2:"ôÍ";s:3:"è§·";s:2:"ôÎ";s:3:"è­ ";s:2:"ôÏ";s:3:"è­ª";s:2:"ôÐ";s:3:"è­";s:2:"ôÑ";s:3:"è­¨";s:2:"ôÒ";s:3:"è­£";s:2:"ôÓ";s:3:"è­¥";s:2:"ôÔ";s:3:"è­§";s:2:"ôÕ";s:3:"è­­";s:2:"ôÖ";s:3:"è¶®";s:2:"ô×";s:3:"躆";s:2:"ôØ";s:3:"躈";s:2:"ôÙ";s:3:"躄";s:2:"ôÚ";s:3:"è½™";s:2:"ôÛ";s:3:"è½–";s:2:"ôÜ";s:3:"è½—";s:2:"ôÝ";s:3:"轕";s:2:"ôÞ";s:3:"轘";s:2:"ôß";s:3:"轚";s:2:"ôà";s:3:"é‚";s:2:"ôá";s:3:"é…ƒ";s:2:"ôâ";s:3:"é…";s:2:"ôã";s:3:"醷";s:2:"ôä";s:3:"醵";s:2:"ôå";s:3:"醲";s:2:"ôæ";s:3:"醳";s:2:"ôç";s:3:"é‹";s:2:"ôè";s:3:"é“";s:2:"ôé";s:3:"é»";s:2:"ôê";s:3:"é ";s:2:"ôë";s:3:"é";s:2:"ôì";s:3:"é”";s:2:"ôí";s:3:"é¾";s:2:"ôî";s:3:"é•";s:2:"ôï";s:3:"é";s:2:"ôð";s:3:"é¨";s:2:"ôñ";s:3:"é™";s:2:"ôò";s:3:"é";s:2:"ôó";s:3:"éµ";s:2:"ôô";s:3:"é€";s:2:"ôõ";s:3:"é·";s:2:"ôö";s:3:"é‡";s:2:"ô÷";s:3:"éŽ";s:2:"ôø";s:3:"é–";s:2:"ôù";s:3:"é’";s:2:"ôú";s:3:"éº";s:2:"ôû";s:3:"é‰";s:2:"ôü";s:3:"é¸";s:2:"ôý";s:3:"éŠ";s:2:"ôþ";s:3:"é¿";s:2:"õ@";s:3:"é¼";s:2:"õA";s:3:"éŒ";s:2:"õB";s:3:"é¶";s:2:"õC";s:3:"é‘";s:2:"õD";s:3:"é†";s:2:"õE";s:3:"é—ž";s:2:"õF";s:3:"é— ";s:2:"õG";s:3:"é—Ÿ";s:2:"õH";s:3:"霮";s:2:"õI";s:3:"霯";s:2:"õJ";s:3:"éž¹";s:2:"õK";s:3:"éž»";s:2:"õL";s:3:"韽";s:2:"õM";s:3:"韾";s:2:"õN";s:3:"é¡ ";s:2:"õO";s:3:"é¡¢";s:2:"õP";s:3:"é¡£";s:2:"õQ";s:3:"顟";s:2:"õR";s:3:"é£";s:2:"õS";s:3:"飂";s:2:"õT";s:3:"é¥";s:2:"õU";s:3:"饎";s:2:"õV";s:3:"饙";s:2:"õW";s:3:"饌";s:2:"õX";s:3:"饋";s:2:"õY";s:3:"饓";s:2:"õZ";s:3:"騲";s:2:"õ[";s:3:"騴";s:2:"õ\";s:3:"騱";s:2:"õ]";s:3:"騬";s:2:"õ^";s:3:"騪";s:2:"õ_";s:3:"騶";s:2:"õ`";s:3:"騩";s:2:"õa";s:3:"騮";s:2:"õb";s:3:"騸";s:2:"õc";s:3:"騭";s:2:"õd";s:3:"髇";s:2:"õe";s:3:"髊";s:2:"õf";s:3:"髆";s:2:"õg";s:3:"é¬";s:2:"õh";s:3:"鬒";s:2:"õi";s:3:"鬑";s:2:"õj";s:3:"é°‹";s:2:"õk";s:3:"é°ˆ";s:2:"õl";s:3:"鯷";s:2:"õm";s:3:"é°…";s:2:"õn";s:3:"é°’";s:2:"õo";s:3:"鯸";s:2:"õp";s:3:"é±€";s:2:"õq";s:3:"é°‡";s:2:"õr";s:3:"é°Ž";s:2:"õs";s:3:"é°†";s:2:"õt";s:3:"é°—";s:2:"õu";s:3:"é°”";s:2:"õv";s:3:"é°‰";s:2:"õw";s:3:"é¶Ÿ";s:2:"õx";s:3:"é¶™";s:2:"õy";s:3:"鶤";s:2:"õz";s:3:"é¶";s:2:"õ{";s:3:"é¶’";s:2:"õ|";s:3:"鶘";s:2:"õ}";s:3:"é¶";s:2:"õ~";s:3:"é¶›";s:2:"õ¡";s:3:"é¶ ";s:2:"õ¢";s:3:"é¶”";s:2:"õ£";s:3:"é¶œ";s:2:"õ¤";s:3:"鶪";s:2:"õ¥";s:3:"é¶—";s:2:"õ¦";s:3:"é¶¡";s:2:"õ§";s:3:"é¶š";s:2:"õ¨";s:3:"é¶¢";s:2:"õ©";s:3:"鶨";s:2:"õª";s:3:"é¶ž";s:2:"õ«";s:3:"é¶£";s:2:"õ¬";s:3:"é¶¿";s:2:"õ­";s:3:"é¶©";s:2:"õ®";s:3:"é¶–";s:2:"õ¯";s:3:"鶦";s:2:"õ°";s:3:"é¶§";s:2:"õ±";s:3:"麙";s:2:"õ²";s:3:"麛";s:2:"õ³";s:3:"麚";s:2:"õ´";s:3:"黥";s:2:"õµ";s:3:"黤";s:2:"õ¶";s:3:"é»§";s:2:"õ·";s:3:"黦";s:2:"õ¸";s:3:"é¼°";s:2:"õ¹";s:3:"é¼®";s:2:"õº";s:3:"é½›";s:2:"õ»";s:3:"é½ ";s:2:"õ¼";s:3:"齞";s:2:"õ½";s:3:"é½";s:2:"õ¾";s:3:"é½™";s:2:"õ¿";s:3:"龑";s:2:"õÀ";s:3:"儺";s:2:"õÁ";s:3:"儹";s:2:"õÂ";s:3:"劘";s:2:"õÃ";s:3:"劗";s:2:"õÄ";s:3:"囃";s:2:"õÅ";s:3:"åš½";s:2:"õÆ";s:3:"åš¾";s:2:"õÇ";s:3:"å­ˆ";s:2:"õÈ";s:3:"å­‡";s:2:"õÉ";s:3:"å·‹";s:2:"õÊ";s:3:"å·";s:2:"õË";s:3:"å»±";s:2:"õÌ";s:3:"懽";s:2:"õÍ";s:3:"æ”›";s:2:"õÎ";s:3:"欂";s:2:"õÏ";s:3:"櫼";s:2:"õÐ";s:3:"欃";s:2:"õÑ";s:3:"櫸";s:2:"õÒ";s:3:"欀";s:2:"õÓ";s:3:"çƒ";s:2:"õÔ";s:3:"ç„";s:2:"õÕ";s:3:"çŠ";s:2:"õÖ";s:3:"çˆ";s:2:"õ×";s:3:"ç‰";s:2:"õØ";s:3:"ç…";s:2:"õÙ";s:3:"ç†";s:2:"õÚ";s:3:"çˆ";s:2:"õÛ";s:3:"爚";s:2:"õÜ";s:3:"爙";s:2:"õÝ";s:3:"ç¾";s:2:"õÞ";s:3:"ç”—";s:2:"õß";s:3:"癪";s:2:"õà";s:3:"çŸ";s:2:"õá";s:3:"礭";s:2:"õâ";s:3:"礱";s:2:"õã";s:3:"礯";s:2:"õä";s:3:"ç±”";s:2:"õå";s:3:"籓";s:2:"õæ";s:3:"ç³²";s:2:"õç";s:3:"纊";s:2:"õè";s:3:"纇";s:2:"õé";s:3:"纈";s:2:"õê";s:3:"纋";s:2:"õë";s:3:"纆";s:2:"õì";s:3:"çº";s:2:"õí";s:3:"ç½";s:2:"õî";s:3:"ç¾»";s:2:"õï";s:3:"耰";s:2:"õð";s:3:"è‡";s:2:"õñ";s:3:"蘘";s:2:"õò";s:3:"蘪";s:2:"õó";s:3:"蘦";s:2:"õô";s:3:"蘟";s:2:"õõ";s:3:"蘣";s:2:"õö";s:3:"蘜";s:2:"õ÷";s:3:"蘙";s:2:"õø";s:3:"蘧";s:2:"õù";s:3:"蘮";s:2:"õú";s:3:"蘡";s:2:"õû";s:3:"蘠";s:2:"õü";s:3:"蘩";s:2:"õý";s:3:"蘞";s:2:"õþ";s:3:"蘥";s:2:"ö@";s:3:"è ©";s:2:"öA";s:3:"è ";s:2:"öB";s:3:"è ›";s:2:"öC";s:3:"è  ";s:2:"öD";s:3:"è ¤";s:2:"öE";s:3:"è œ";s:2:"öF";s:3:"è «";s:2:"öG";s:3:"衊";s:2:"öH";s:3:"襭";s:2:"öI";s:3:"襩";s:2:"öJ";s:3:"襮";s:2:"öK";s:3:"襫";s:2:"öL";s:3:"觺";s:2:"öM";s:3:"è­¹";s:2:"öN";s:3:"è­¸";s:2:"öO";s:3:"è­…";s:2:"öP";s:3:"è­º";s:2:"öQ";s:3:"è­»";s:2:"öR";s:3:"è´";s:2:"öS";s:3:"è´”";s:2:"öT";s:3:"趯";s:2:"öU";s:3:"躎";s:2:"öV";s:3:"躌";s:2:"öW";s:3:"轞";s:2:"öX";s:3:"è½›";s:2:"öY";s:3:"è½";s:2:"öZ";s:3:"é…†";s:2:"ö[";s:3:"é…„";s:2:"ö\";s:3:"é……";s:2:"ö]";s:3:"醹";s:2:"ö^";s:3:"é¿";s:2:"ö_";s:3:"é»";s:2:"ö`";s:3:"é¶";s:2:"öa";s:3:"é©";s:2:"öb";s:3:"é½";s:2:"öc";s:3:"é¼";s:2:"öd";s:3:"é°";s:2:"öe";s:3:"é¹";s:2:"öf";s:3:"éª";s:2:"ög";s:3:"é·";s:2:"öh";s:3:"é¬";s:2:"öi";s:3:"é‘€";s:2:"öj";s:3:"é±";s:2:"ök";s:3:"é—¥";s:2:"öl";s:3:"é—¤";s:2:"öm";s:3:"é—£";s:2:"ön";s:3:"霵";s:2:"öo";s:3:"霺";s:2:"öp";s:3:"éž¿";s:2:"öq";s:3:"韡";s:2:"ör";s:3:"顤";s:2:"ös";s:3:"飉";s:2:"öt";s:3:"飆";s:2:"öu";s:3:"飀";s:2:"öv";s:3:"饘";s:2:"öw";s:3:"饖";s:2:"öx";s:3:"騹";s:2:"öy";s:3:"騽";s:2:"öz";s:3:"驆";s:2:"ö{";s:3:"é©„";s:2:"ö|";s:3:"é©‚";s:2:"ö}";s:3:"é©";s:2:"ö~";s:3:"騺";s:2:"ö¡";s:3:"騿";s:2:"ö¢";s:3:"é«";s:2:"ö£";s:3:"鬕";s:2:"ö¤";s:3:"鬗";s:2:"ö¥";s:3:"鬘";s:2:"ö¦";s:3:"鬖";s:2:"ö§";s:3:"鬺";s:2:"ö¨";s:3:"é­’";s:2:"ö©";s:3:"é°«";s:2:"öª";s:3:"é°";s:2:"ö«";s:3:"é°œ";s:2:"ö¬";s:3:"é°¬";s:2:"ö­";s:3:"é°£";s:2:"ö®";s:3:"é°¨";s:2:"ö¯";s:3:"é°©";s:2:"ö°";s:3:"é°¤";s:2:"ö±";s:3:"é°¡";s:2:"ö²";s:3:"é¶·";s:2:"ö³";s:3:"é¶¶";s:2:"ö´";s:3:"é¶¼";s:2:"öµ";s:3:"é·";s:2:"ö¶";s:3:"é·‡";s:2:"ö·";s:3:"é·Š";s:2:"ö¸";s:3:"é·";s:2:"ö¹";s:3:"é¶¾";s:2:"öº";s:3:"é·…";s:2:"ö»";s:3:"é·ƒ";s:2:"ö¼";s:3:"é¶»";s:2:"ö½";s:3:"é¶µ";s:2:"ö¾";s:3:"é·Ž";s:2:"ö¿";s:3:"é¶¹";s:2:"öÀ";s:3:"鶺";s:2:"öÁ";s:3:"鶬";s:2:"öÂ";s:3:"é·ˆ";s:2:"öÃ";s:3:"é¶±";s:2:"öÄ";s:3:"é¶­";s:2:"öÅ";s:3:"é·Œ";s:2:"öÆ";s:3:"é¶³";s:2:"öÇ";s:3:"é·";s:2:"öÈ";s:3:"é¶²";s:2:"öÉ";s:3:"鹺";s:2:"öÊ";s:3:"麜";s:2:"öË";s:3:"黫";s:2:"öÌ";s:3:"é»®";s:2:"öÍ";s:3:"é»­";s:2:"öÎ";s:3:"é¼›";s:2:"öÏ";s:3:"鼘";s:2:"öÐ";s:3:"鼚";s:2:"öÑ";s:3:"é¼±";s:2:"öÒ";s:3:"齎";s:2:"öÓ";s:3:"é½¥";s:2:"öÔ";s:3:"齤";s:2:"öÕ";s:3:"é¾’";s:2:"öÖ";s:3:"亹";s:2:"ö×";s:3:"囆";s:2:"öØ";s:3:"å›…";s:2:"öÙ";s:3:"囋";s:2:"öÚ";s:3:"奱";s:2:"öÛ";s:3:"å­‹";s:2:"öÜ";s:3:"å­Œ";s:2:"öÝ";s:3:"å·•";s:2:"öÞ";s:3:"å·‘";s:2:"öß";s:3:"廲";s:2:"öà";s:3:"攡";s:2:"öá";s:3:"æ” ";s:2:"öâ";s:3:"攦";s:2:"öã";s:3:"攢";s:2:"öä";s:3:"欋";s:2:"öå";s:3:"欈";s:2:"öæ";s:3:"欉";s:2:"öç";s:3:"æ°";s:2:"öè";s:3:"ç•";s:2:"öé";s:3:"ç–";s:2:"öê";s:3:"ç—";s:2:"öë";s:3:"ç’";s:2:"öì";s:3:"爞";s:2:"öí";s:3:"爟";s:2:"öî";s:3:"犩";s:2:"öï";s:3:"ç¿";s:2:"öð";s:3:"瓘";s:2:"öñ";s:3:"ç“•";s:2:"öò";s:3:"ç“™";s:2:"öó";s:3:"ç“—";s:2:"öô";s:3:"ç™­";s:2:"öõ";s:3:"çš­";s:2:"öö";s:3:"礵";s:2:"ö÷";s:3:"禴";s:2:"öø";s:3:"ç©°";s:2:"öù";s:3:"穱";s:2:"öú";s:3:"ç±—";s:2:"öû";s:3:"籜";s:2:"öü";s:3:"ç±™";s:2:"öý";s:3:"ç±›";s:2:"öþ";s:3:"籚";s:2:"÷@";s:3:"ç³´";s:2:"÷A";s:3:"ç³±";s:2:"÷B";s:3:"纑";s:2:"÷C";s:3:"ç½";s:2:"÷D";s:3:"羇";s:2:"÷E";s:3:"臞";s:2:"÷F";s:3:"艫";s:2:"÷G";s:3:"蘴";s:2:"÷H";s:3:"蘵";s:2:"÷I";s:3:"蘳";s:2:"÷J";s:3:"蘬";s:2:"÷K";s:3:"蘲";s:2:"÷L";s:3:"蘶";s:2:"÷M";s:3:"è ¬";s:2:"÷N";s:3:"è ¨";s:2:"÷O";s:3:"è ¦";s:2:"÷P";s:3:"è ª";s:2:"÷Q";s:3:"è ¥";s:2:"÷R";s:3:"襱";s:2:"÷S";s:3:"覿";s:2:"÷T";s:3:"覾";s:2:"÷U";s:3:"è§»";s:2:"÷V";s:3:"è­¾";s:2:"÷W";s:3:"讄";s:2:"÷X";s:3:"讂";s:2:"÷Y";s:3:"讆";s:2:"÷Z";s:3:"è®…";s:2:"÷[";s:3:"è­¿";s:2:"÷\";s:3:"è´•";s:2:"÷]";s:3:"躕";s:2:"÷^";s:3:"躔";s:2:"÷_";s:3:"躚";s:2:"÷`";s:3:"躒";s:2:"÷a";s:3:"èº";s:2:"÷b";s:3:"躖";s:2:"÷c";s:3:"躗";s:2:"÷d";s:3:"è½ ";s:2:"÷e";s:3:"è½¢";s:2:"÷f";s:3:"é…‡";s:2:"÷g";s:3:"鑌";s:2:"÷h";s:3:"é‘";s:2:"÷i";s:3:"鑊";s:2:"÷j";s:3:"é‘‹";s:2:"÷k";s:3:"é‘";s:2:"÷l";s:3:"鑇";s:2:"÷m";s:3:"é‘…";s:2:"÷n";s:3:"鑈";s:2:"÷o";s:3:"鑉";s:2:"÷p";s:3:"鑆";s:2:"÷q";s:3:"霿";s:2:"÷r";s:3:"韣";s:2:"÷s";s:3:"顪";s:2:"÷t";s:3:"é¡©";s:2:"÷u";s:3:"飋";s:2:"÷v";s:3:"饔";s:2:"÷w";s:3:"饛";s:2:"÷x";s:3:"驎";s:2:"÷y";s:3:"é©“";s:2:"÷z";s:3:"é©”";s:2:"÷{";s:3:"驌";s:2:"÷|";s:3:"é©";s:2:"÷}";s:3:"驈";s:2:"÷~";s:3:"驊";s:2:"÷¡";s:3:"驉";s:2:"÷¢";s:3:"é©’";s:2:"÷£";s:3:"é©";s:2:"÷¤";s:3:"é«";s:2:"÷¥";s:3:"鬙";s:2:"÷¦";s:3:"鬫";s:2:"÷§";s:3:"鬻";s:2:"÷¨";s:3:"é­–";s:2:"÷©";s:3:"é­•";s:2:"÷ª";s:3:"鱆";s:2:"÷«";s:3:"鱈";s:2:"÷¬";s:3:"é°¿";s:2:"÷­";s:3:"鱄";s:2:"÷®";s:3:"é°¹";s:2:"÷¯";s:3:"é°³";s:2:"÷°";s:3:"é±";s:2:"÷±";s:3:"é°¼";s:2:"÷²";s:3:"é°·";s:2:"÷³";s:3:"é°´";s:2:"÷´";s:3:"é°²";s:2:"÷µ";s:3:"é°½";s:2:"÷¶";s:3:"é°¶";s:2:"÷·";s:3:"é·›";s:2:"÷¸";s:3:"é·’";s:2:"÷¹";s:3:"é·ž";s:2:"÷º";s:3:"é·š";s:2:"÷»";s:3:"é·‹";s:2:"÷¼";s:3:"é·";s:2:"÷½";s:3:"é·œ";s:2:"÷¾";s:3:"é·‘";s:2:"÷¿";s:3:"é·Ÿ";s:2:"÷À";s:3:"é·©";s:2:"÷Á";s:3:"é·™";s:2:"÷Â";s:3:"é·˜";s:2:"÷Ã";s:3:"é·–";s:2:"÷Ä";s:3:"é·µ";s:2:"÷Å";s:3:"é·•";s:2:"÷Æ";s:3:"é·";s:2:"÷Ç";s:3:"麶";s:2:"÷È";s:3:"é»°";s:2:"÷É";s:3:"é¼µ";s:2:"÷Ê";s:3:"é¼³";s:2:"÷Ë";s:3:"é¼²";s:2:"÷Ì";s:3:"齂";s:2:"÷Í";s:3:"齫";s:2:"÷Î";s:3:"龕";s:2:"÷Ï";s:3:"é¾¢";s:2:"÷Ð";s:3:"儽";s:2:"÷Ñ";s:3:"劙";s:2:"÷Ò";s:3:"壨";s:2:"÷Ó";s:3:"壧";s:2:"÷Ô";s:3:"奲";s:2:"÷Õ";s:3:"å­";s:2:"÷Ö";s:3:"å·˜";s:2:"÷×";s:3:"è ¯";s:2:"÷Ø";s:3:"å½";s:2:"÷Ù";s:3:"æˆ";s:2:"÷Ú";s:3:"戃";s:2:"÷Û";s:3:"戄";s:2:"÷Ü";s:3:"攩";s:2:"÷Ý";s:3:"攥";s:2:"÷Þ";s:3:"æ––";s:2:"÷ß";s:3:"曫";s:2:"÷à";s:3:"欑";s:2:"÷á";s:3:"欒";s:2:"÷â";s:3:"æ¬";s:2:"÷ã";s:3:"毊";s:2:"÷ä";s:3:"ç›";s:2:"÷å";s:3:"çš";s:2:"÷æ";s:3:"爢";s:2:"÷ç";s:3:"玂";s:2:"÷è";s:3:"çŽ";s:2:"÷é";s:3:"玃";s:2:"÷ê";s:3:"ç™°";s:2:"÷ë";s:3:"矔";s:2:"÷ì";s:3:"ç±§";s:2:"÷í";s:3:"籦";s:2:"÷î";s:3:"纕";s:2:"÷ï";s:3:"艬";s:2:"÷ð";s:3:"蘺";s:2:"÷ñ";s:3:"虀";s:2:"÷ò";s:3:"蘹";s:2:"÷ó";s:3:"蘼";s:2:"÷ô";s:3:"蘱";s:2:"÷õ";s:3:"蘻";s:2:"÷ö";s:3:"蘾";s:2:"÷÷";s:3:"è °";s:2:"÷ø";s:3:"è ²";s:2:"÷ù";s:3:"è ®";s:2:"÷ú";s:3:"è ³";s:2:"÷û";s:3:"襶";s:2:"÷ü";s:3:"襴";s:2:"÷ý";s:3:"襳";s:2:"÷þ";s:3:"è§¾";s:2:"ø@";s:3:"讌";s:2:"øA";s:3:"讎";s:2:"øB";s:3:"讋";s:2:"øC";s:3:"讈";s:2:"øD";s:3:"è±…";s:2:"øE";s:3:"è´™";s:2:"øF";s:3:"躘";s:2:"øG";s:3:"轤";s:2:"øH";s:3:"è½£";s:2:"øI";s:3:"醼";s:2:"øJ";s:3:"é‘¢";s:2:"øK";s:3:"é‘•";s:2:"øL";s:3:"é‘";s:2:"øM";s:3:"é‘—";s:2:"øN";s:3:"鑞";s:2:"øO";s:3:"韄";s:2:"øP";s:3:"韅";s:2:"øQ";s:3:"é €";s:2:"øR";s:3:"é©–";s:2:"øS";s:3:"é©™";s:2:"øT";s:3:"鬞";s:2:"øU";s:3:"鬟";s:2:"øV";s:3:"鬠";s:2:"øW";s:3:"é±’";s:2:"øX";s:3:"鱘";s:2:"øY";s:3:"é±";s:2:"øZ";s:3:"鱊";s:2:"ø[";s:3:"é±";s:2:"ø\";s:3:"鱋";s:2:"ø]";s:3:"鱕";s:2:"ø^";s:3:"é±™";s:2:"ø_";s:3:"鱌";s:2:"ø`";s:3:"鱎";s:2:"øa";s:3:"é·»";s:2:"øb";s:3:"é··";s:2:"øc";s:3:"é·¯";s:2:"ød";s:3:"é·£";s:2:"øe";s:3:"é·«";s:2:"øf";s:3:"é·¸";s:2:"øg";s:3:"é·¤";s:2:"øh";s:3:"é·¶";s:2:"øi";s:3:"é·¡";s:2:"øj";s:3:"é·®";s:2:"øk";s:3:"é·¦";s:2:"øl";s:3:"é·²";s:2:"øm";s:3:"é·°";s:2:"øn";s:3:"é·¢";s:2:"øo";s:3:"é·¬";s:2:"øp";s:3:"é·´";s:2:"øq";s:3:"é·³";s:2:"ør";s:3:"é·¨";s:2:"øs";s:3:"é·­";s:2:"øt";s:3:"黂";s:2:"øu";s:3:"é»";s:2:"øv";s:3:"黲";s:2:"øw";s:3:"黳";s:2:"øx";s:3:"鼆";s:2:"øy";s:3:"鼜";s:2:"øz";s:3:"鼸";s:2:"ø{";s:3:"é¼·";s:2:"ø|";s:3:"é¼¶";s:2:"ø}";s:3:"齃";s:2:"ø~";s:3:"é½";s:2:"ø¡";s:3:"é½±";s:2:"ø¢";s:3:"é½°";s:2:"ø£";s:3:"é½®";s:2:"ø¤";s:3:"齯";s:2:"ø¥";s:3:"囓";s:2:"ø¦";s:3:"å›";s:2:"ø§";s:3:"å­Ž";s:2:"ø¨";s:3:"å±­";s:2:"ø©";s:3:"æ”­";s:2:"øª";s:3:"æ›­";s:2:"ø«";s:3:"æ›®";s:2:"ø¬";s:3:"欓";s:2:"ø­";s:3:"çŸ";s:2:"ø®";s:3:"ç¡";s:2:"ø¯";s:3:"ç";s:2:"ø°";s:3:"ç ";s:2:"ø±";s:3:"爣";s:2:"ø²";s:3:"ç“›";s:2:"ø³";s:3:"ç“¥";s:2:"ø´";s:3:"矕";s:2:"øµ";s:3:"礸";s:2:"ø¶";s:3:"禷";s:2:"ø·";s:3:"禶";s:2:"ø¸";s:3:"籪";s:2:"ø¹";s:3:"纗";s:2:"øº";s:3:"羉";s:2:"ø»";s:3:"艭";s:2:"ø¼";s:3:"虃";s:2:"ø½";s:3:"è ¸";s:2:"ø¾";s:3:"è ·";s:2:"ø¿";s:3:"è µ";s:2:"øÀ";s:3:"è¡‹";s:2:"øÁ";s:3:"è®”";s:2:"øÂ";s:3:"讕";s:2:"øÃ";s:3:"躞";s:2:"øÄ";s:3:"躟";s:2:"øÅ";s:3:"躠";s:2:"øÆ";s:3:"èº";s:2:"øÇ";s:3:"醾";s:2:"øÈ";s:3:"醽";s:2:"øÉ";s:3:"釂";s:2:"øÊ";s:3:"é‘«";s:2:"øË";s:3:"鑨";s:2:"øÌ";s:3:"é‘©";s:2:"øÍ";s:3:"雥";s:2:"øÎ";s:3:"é†";s:2:"øÏ";s:3:"éƒ";s:2:"øÐ";s:3:"é‡";s:2:"øÑ";s:3:"韇";s:2:"øÒ";s:3:"韥";s:2:"øÓ";s:3:"驞";s:2:"øÔ";s:3:"é«•";s:2:"øÕ";s:3:"é­™";s:2:"øÖ";s:3:"é±£";s:2:"ø×";s:3:"é±§";s:2:"øØ";s:3:"鱦";s:2:"øÙ";s:3:"é±¢";s:2:"øÚ";s:3:"鱞";s:2:"øÛ";s:3:"é± ";s:2:"øÜ";s:3:"鸂";s:2:"øÝ";s:3:"é·¾";s:2:"øÞ";s:3:"鸇";s:2:"øß";s:3:"鸃";s:2:"øà";s:3:"鸆";s:2:"øá";s:3:"鸅";s:2:"øâ";s:3:"鸀";s:2:"øã";s:3:"é¸";s:2:"øä";s:3:"鸉";s:2:"øå";s:3:"é·¿";s:2:"øæ";s:3:"é·½";s:2:"øç";s:3:"鸄";s:2:"øè";s:3:"麠";s:2:"øé";s:3:"鼞";s:2:"øê";s:3:"齆";s:2:"øë";s:3:"é½´";s:2:"øì";s:3:"é½µ";s:2:"øí";s:3:"é½¶";s:2:"øî";s:3:"å›”";s:2:"øï";s:3:"æ”®";s:2:"øð";s:3:"æ–¸";s:2:"øñ";s:3:"欘";s:2:"øò";s:3:"欙";s:2:"øó";s:3:"欗";s:2:"øô";s:3:"欚";s:2:"øõ";s:3:"ç¢";s:2:"øö";s:3:"爦";s:2:"ø÷";s:3:"犪";s:2:"øø";s:3:"矘";s:2:"øù";s:3:"矙";s:2:"øú";s:3:"礹";s:2:"øû";s:3:"籩";s:2:"øü";s:3:"籫";s:2:"øý";s:3:"ç³¶";s:2:"øþ";s:3:"纚";s:2:"ù@";s:3:"纘";s:2:"ùA";s:3:"纛";s:2:"ùB";s:3:"纙";s:2:"ùC";s:3:"臠";s:2:"ùD";s:3:"臡";s:2:"ùE";s:3:"虆";s:2:"ùF";s:3:"虇";s:2:"ùG";s:3:"虈";s:2:"ùH";s:3:"襹";s:2:"ùI";s:3:"襺";s:2:"ùJ";s:3:"襼";s:2:"ùK";s:3:"襻";s:2:"ùL";s:3:"è§¿";s:2:"ùM";s:3:"讘";s:2:"ùN";s:3:"è®™";s:2:"ùO";s:3:"躥";s:2:"ùP";s:3:"躤";s:2:"ùQ";s:3:"躣";s:2:"ùR";s:3:"é‘®";s:2:"ùS";s:3:"é‘­";s:2:"ùT";s:3:"鑯";s:2:"ùU";s:3:"鑱";s:2:"ùV";s:3:"鑳";s:2:"ùW";s:3:"é‰";s:2:"ùX";s:3:"顲";s:2:"ùY";s:3:"饟";s:2:"ùZ";s:3:"鱨";s:2:"ù[";s:3:"é±®";s:2:"ù\";s:3:"é±­";s:2:"ù]";s:3:"鸋";s:2:"ù^";s:3:"é¸";s:2:"ù_";s:3:"é¸";s:2:"ù`";s:3:"é¸";s:2:"ùa";s:3:"鸒";s:2:"ùb";s:3:"鸑";s:2:"ùc";s:3:"麡";s:2:"ùd";s:3:"黵";s:2:"ùe";s:3:"鼉";s:2:"ùf";s:3:"齇";s:2:"ùg";s:3:"齸";s:2:"ùh";s:3:"é½»";s:2:"ùi";s:3:"齺";s:2:"ùj";s:3:"é½¹";s:2:"ùk";s:3:"圞";s:2:"ùl";s:3:"ç¦";s:2:"ùm";s:3:"籯";s:2:"ùn";s:3:"è ¼";s:2:"ùo";s:3:"è¶²";s:2:"ùp";s:3:"躦";s:2:"ùq";s:3:"釃";s:2:"ùr";s:3:"é‘´";s:2:"ùs";s:3:"鑸";s:2:"ùt";s:3:"é‘¶";s:2:"ùu";s:3:"鑵";s:2:"ùv";s:3:"é© ";s:2:"ùw";s:3:"é±´";s:2:"ùx";s:3:"é±³";s:2:"ùy";s:3:"é±±";s:2:"ùz";s:3:"é±µ";s:2:"ù{";s:3:"鸔";s:2:"ù|";s:3:"鸓";s:2:"ù}";s:3:"é»¶";s:2:"ù~";s:3:"鼊";s:2:"ù¡";s:3:"龤";s:2:"ù¢";s:3:"ç¨";s:2:"ù£";s:3:"ç¥";s:2:"ù¤";s:3:"ç³·";s:2:"ù¥";s:3:"虪";s:2:"ù¦";s:3:"è ¾";s:2:"ù§";s:3:"è ½";s:2:"ù¨";s:3:"è ¿";s:2:"ù©";s:3:"讞";s:2:"ùª";s:3:"貜";s:2:"ù«";s:3:"躩";s:2:"ù¬";s:3:"軉";s:2:"ù­";s:3:"é‹";s:2:"ù®";s:3:"顳";s:2:"ù¯";s:3:"é¡´";s:2:"ù°";s:3:"飌";s:2:"ù±";s:3:"饡";s:2:"ù²";s:3:"馫";s:2:"ù³";s:3:"驤";s:2:"ù´";s:3:"驦";s:2:"ùµ";s:3:"é©§";s:2:"ù¶";s:3:"鬤";s:2:"ù·";s:3:"鸕";s:2:"ù¸";s:3:"鸗";s:2:"ù¹";s:3:"齈";s:2:"ùº";s:3:"戇";s:2:"ù»";s:3:"欞";s:2:"ù¼";s:3:"爧";s:2:"ù½";s:3:"虌";s:2:"ù¾";s:3:"躨";s:2:"ù¿";s:3:"é’‚";s:2:"ùÀ";s:3:"é’€";s:2:"ùÁ";s:3:"é’";s:2:"ùÂ";s:3:"é©©";s:2:"ùÃ";s:3:"驨";s:2:"ùÄ";s:3:"鬮";s:2:"ùÅ";s:3:"鸙";s:2:"ùÆ";s:3:"爩";s:2:"ùÇ";s:3:"虋";s:2:"ùÈ";s:3:"讟";s:2:"ùÉ";s:3:"é’ƒ";s:2:"ùÊ";s:3:"é±¹";s:2:"ùË";s:3:"麷";s:2:"ùÌ";s:3:"癵";s:2:"ùÍ";s:3:"é©«";s:2:"ùÎ";s:3:"鱺";s:2:"ùÏ";s:3:"é¸";s:2:"ùÐ";s:3:"ç©";s:2:"ùÑ";s:3:"çª";s:2:"ùÒ";s:3:"麤";s:2:"ùÓ";s:3:"é½¾";s:2:"ùÔ";s:3:"齉";s:2:"ùÕ";s:3:"龘";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp037.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp037.ser new file mode 100644 index 0000000000..a629eb49da Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp037.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp1006.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp1006.ser new file mode 100644 index 0000000000..d3a6c4c80f Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp1006.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp1026.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp1026.ser new file mode 100644 index 0000000000..8ec9bea327 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp1026.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp424.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp424.ser new file mode 100644 index 0000000000..5e1168e51f Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp424.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp437.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp437.ser new file mode 100644 index 0000000000..aa20fd8212 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp437.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp500.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp500.ser new file mode 100644 index 0000000000..9bdfdfbc08 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp500.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp737.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp737.ser new file mode 100644 index 0000000000..d586ac9a37 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp737.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp775.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp775.ser new file mode 100644 index 0000000000..c993ef5b4d Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp775.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp850.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp850.ser new file mode 100644 index 0000000000..8035a9135a Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp850.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp852.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp852.ser new file mode 100644 index 0000000000..83d6b3c8f9 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp852.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp855.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp855.ser new file mode 100644 index 0000000000..2b99b4c536 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp855.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp856.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp856.ser new file mode 100644 index 0000000000..bcc21feb27 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp856.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp857.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp857.ser new file mode 100644 index 0000000000..a7074a46d1 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp857.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp860.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp860.ser new file mode 100644 index 0000000000..848d9fe4c2 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp860.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp861.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp861.ser new file mode 100644 index 0000000000..e0469a6fbd Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp861.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp862.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp862.ser new file mode 100644 index 0000000000..eabcebf85c Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp862.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp863.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp863.ser new file mode 100644 index 0000000000..a64d70a0b3 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp863.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp864.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp864.ser new file mode 100644 index 0000000000..1d9c371354 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp864.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp865.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp865.ser new file mode 100644 index 0000000000..816ddf373d Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp865.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp866.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp866.ser new file mode 100644 index 0000000000..8e0f7dcb07 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp866.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp869.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp869.ser new file mode 100644 index 0000000000..32de1f2a89 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp869.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp874.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp874.ser new file mode 100644 index 0000000000..030ce156f3 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp874.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp875.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp875.ser new file mode 100644 index 0000000000..e42792a2d2 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp875.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp932.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp932.ser new file mode 100644 index 0000000000..5861d4c968 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp932.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp936.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp936.ser new file mode 100644 index 0000000000..8fc183b580 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp936.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp949.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp949.ser new file mode 100644 index 0000000000..4447cdb860 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp949.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp950.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp950.ser new file mode 100644 index 0000000000..b2f11df1b5 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.cp950.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.gsm0338.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.gsm0338.ser new file mode 100644 index 0000000000..a877b832d0 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.gsm0338.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-1.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-1.ser new file mode 100644 index 0000000000..5fecd4ca2a Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-1.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-10.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-10.ser new file mode 100644 index 0000000000..3f0cce13f3 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-10.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-11.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-11.ser new file mode 100644 index 0000000000..2757b1ce7a Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-11.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-13.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-13.ser new file mode 100644 index 0000000000..55a7a3e162 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-13.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-14.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-14.ser new file mode 100644 index 0000000000..7b963ae875 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-14.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-15.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-15.ser new file mode 100644 index 0000000000..2ce20a16ea Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-15.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-16.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-16.ser new file mode 100644 index 0000000000..8da2482934 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-16.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-2.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-2.ser new file mode 100644 index 0000000000..7dbeb25b0b Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-2.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-3.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-3.ser new file mode 100644 index 0000000000..626fffe624 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-3.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-4.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-4.ser new file mode 100644 index 0000000000..f750169186 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-4.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-5.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-5.ser new file mode 100644 index 0000000000..d89cc063c8 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-5.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-6.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-6.ser new file mode 100644 index 0000000000..2dcfeb89eb Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-6.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-7.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-7.ser new file mode 100644 index 0000000000..a137558317 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-7.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-8.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-8.ser new file mode 100644 index 0000000000..4179e15bee Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-8.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-9.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-9.ser new file mode 100644 index 0000000000..be4c816ead Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.iso-8859-9.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.koi8-r.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.koi8-r.ser new file mode 100644 index 0000000000..c46860b97d Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.koi8-r.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.koi8-u.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.koi8-u.ser new file mode 100644 index 0000000000..6e5af630cb Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.koi8-u.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.mazovia.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.mazovia.ser new file mode 100644 index 0000000000..05fa2bdf8a Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.mazovia.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.nextstep.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.nextstep.ser new file mode 100644 index 0000000000..476da9c87f Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.nextstep.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.stdenc.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.stdenc.ser new file mode 100644 index 0000000000..81edeb0126 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.stdenc.ser @@ -0,0 +1 @@ +a:149:{s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"’";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:3:"‘";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"¡";s:2:"¡";s:1:"¢";s:2:"¢";s:1:"£";s:2:"£";s:1:"¤";s:3:"â„";s:1:"¥";s:2:"Â¥";s:1:"¦";s:2:"Æ’";s:1:"§";s:2:"§";s:1:"¨";s:2:"¤";s:1:"©";s:1:"'";s:1:"ª";s:3:"“";s:1:"«";s:2:"«";s:1:"¬";s:3:"‹";s:1:"­";s:3:"›";s:1:"®";s:3:"ï¬";s:1:"¯";s:3:"fl";s:1:"±";s:3:"–";s:1:"²";s:3:"†";s:1:"³";s:3:"‡";s:1:"´";s:2:"·";s:1:"¶";s:2:"¶";s:1:"·";s:3:"•";s:1:"¸";s:3:"‚";s:1:"¹";s:3:"„";s:1:"º";s:3:"â€";s:1:"»";s:2:"»";s:1:"¼";s:3:"…";s:1:"½";s:3:"‰";s:1:"¿";s:2:"¿";s:1:"Á";s:1:"`";s:1:"Â";s:2:"´";s:1:"Ã";s:2:"ˆ";s:1:"Ä";s:2:"Ëœ";s:1:"Å";s:2:"¯";s:1:"Æ";s:2:"˘";s:1:"Ç";s:2:"Ë™";s:1:"È";s:2:"¨";s:1:"Ê";s:2:"Ëš";s:1:"Ë";s:2:"¸";s:1:"Í";s:2:"Ë";s:1:"Î";s:2:"Ë›";s:1:"Ï";s:2:"ˇ";s:1:"Ð";s:3:"—";s:1:"á";s:2:"Æ";s:1:"ã";s:2:"ª";s:1:"è";s:2:"Å";s:1:"é";s:2:"Ø";s:1:"ê";s:2:"Å’";s:1:"ë";s:2:"º";s:1:"ñ";s:2:"æ";s:1:"õ";s:2:"ı";s:1:"ø";s:2:"Å‚";s:1:"ù";s:2:"ø";s:1:"ú";s:2:"Å“";s:1:"û";s:2:"ß";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.symbol.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.symbol.ser new file mode 100644 index 0000000000..889217bf22 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.symbol.ser @@ -0,0 +1 @@ +a:189:{s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:3:"∀";s:1:"#";s:1:"#";s:1:"$";s:3:"∃";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"∋";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:3:"∗";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:3:"−";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:3:"≅";s:1:"A";s:2:"Α";s:1:"B";s:2:"Î’";s:1:"C";s:2:"Χ";s:1:"D";s:2:"Δ";s:1:"E";s:2:"Ε";s:1:"F";s:2:"Φ";s:1:"G";s:2:"Γ";s:1:"H";s:2:"Η";s:1:"I";s:2:"Ι";s:1:"J";s:2:"Ï‘";s:1:"K";s:2:"Κ";s:1:"L";s:2:"Λ";s:1:"M";s:2:"Μ";s:1:"N";s:2:"Î";s:1:"O";s:2:"Ο";s:1:"P";s:2:"Π";s:1:"Q";s:2:"Θ";s:1:"R";s:2:"Ρ";s:1:"S";s:2:"Σ";s:1:"T";s:2:"Τ";s:1:"U";s:2:"Î¥";s:1:"V";s:2:"Ï‚";s:1:"W";s:2:"Ω";s:1:"X";s:2:"Ξ";s:1:"Y";s:2:"Ψ";s:1:"Z";s:2:"Ζ";s:1:"[";s:1:"[";s:1:"\";s:3:"∴";s:1:"]";s:1:"]";s:1:"^";s:3:"⊥";s:1:"_";s:1:"_";s:1:"`";s:3:"";s:1:"a";s:2:"α";s:1:"b";s:2:"β";s:1:"c";s:2:"χ";s:1:"d";s:2:"δ";s:1:"e";s:2:"ε";s:1:"f";s:2:"φ";s:1:"g";s:2:"γ";s:1:"h";s:2:"η";s:1:"i";s:2:"ι";s:1:"j";s:2:"Ï•";s:1:"k";s:2:"κ";s:1:"l";s:2:"λ";s:1:"m";s:2:"µ";s:1:"n";s:2:"ν";s:1:"o";s:2:"ο";s:1:"p";s:2:"Ï€";s:1:"q";s:2:"θ";s:1:"r";s:2:"Ï";s:1:"s";s:2:"σ";s:1:"t";s:2:"Ï„";s:1:"u";s:2:"Ï…";s:1:"v";s:2:"Ï–";s:1:"w";s:2:"ω";s:1:"x";s:2:"ξ";s:1:"y";s:2:"ψ";s:1:"z";s:2:"ζ";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:3:"∼";s:1:" ";s:3:"€";s:1:"¡";s:2:"Ï’";s:1:"¢";s:3:"′";s:1:"£";s:3:"≤";s:1:"¤";s:3:"â„";s:1:"¥";s:3:"∞";s:1:"¦";s:2:"Æ’";s:1:"§";s:3:"♣";s:1:"¨";s:3:"♦";s:1:"©";s:3:"♥";s:1:"ª";s:3:"â™ ";s:1:"«";s:3:"↔";s:1:"¬";s:3:"â†";s:1:"­";s:3:"↑";s:1:"®";s:3:"→";s:1:"¯";s:3:"↓";s:1:"°";s:2:"°";s:1:"±";s:2:"±";s:1:"²";s:3:"″";s:1:"³";s:3:"≥";s:1:"´";s:2:"×";s:1:"µ";s:3:"âˆ";s:1:"¶";s:3:"∂";s:1:"·";s:3:"•";s:1:"¸";s:2:"÷";s:1:"¹";s:3:"≠";s:1:"º";s:3:"≡";s:1:"»";s:3:"≈";s:1:"¼";s:3:"…";s:1:"½";s:3:"";s:1:"¾";s:3:"";s:1:"¿";s:3:"↵";s:1:"À";s:3:"ℵ";s:1:"Á";s:3:"â„‘";s:1:"Â";s:3:"ℜ";s:1:"Ã";s:3:"℘";s:1:"Ä";s:3:"⊗";s:1:"Å";s:3:"⊕";s:1:"Æ";s:3:"∅";s:1:"Ç";s:3:"∩";s:1:"È";s:3:"∪";s:1:"É";s:3:"⊃";s:1:"Ê";s:3:"⊇";s:1:"Ë";s:3:"⊄";s:1:"Ì";s:3:"⊂";s:1:"Í";s:3:"⊆";s:1:"Î";s:3:"∈";s:1:"Ï";s:3:"∉";s:1:"Ð";s:3:"∠";s:1:"Ñ";s:3:"∇";s:1:"Ò";s:3:"";s:1:"Ó";s:3:"ï›™";s:1:"Ô";s:3:"ï››";s:1:"Õ";s:3:"âˆ";s:1:"Ö";s:3:"√";s:1:"×";s:3:"â‹…";s:1:"Ø";s:2:"¬";s:1:"Ù";s:3:"∧";s:1:"Ú";s:3:"∨";s:1:"Û";s:3:"⇔";s:1:"Ü";s:3:"â‡";s:1:"Ý";s:3:"⇑";s:1:"Þ";s:3:"⇒";s:1:"ß";s:3:"⇓";s:1:"à";s:3:"â—Š";s:1:"á";s:3:"〈";s:1:"â";s:3:"";s:1:"ã";s:3:"";s:1:"ä";s:3:"";s:1:"å";s:3:"∑";s:1:"æ";s:3:"";s:1:"ç";s:3:"";s:1:"è";s:3:"";s:1:"é";s:3:"";s:1:"ê";s:3:"";s:1:"ë";s:3:"";s:1:"ì";s:3:"";s:1:"í";s:3:"";s:1:"î";s:3:"";s:1:"ï";s:3:"";s:1:"ñ";s:3:"〉";s:1:"ò";s:3:"∫";s:1:"ó";s:3:"⌠";s:1:"ô";s:3:"";s:1:"õ";s:3:"⌡";s:1:"ö";s:3:"";s:1:"÷";s:3:"";s:1:"ø";s:3:"";s:1:"ù";s:3:"";s:1:"ú";s:3:"";s:1:"û";s:3:"";s:1:"ü";s:3:"";s:1:"ý";s:3:"";s:1:"þ";s:3:"";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.turkish.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.turkish.ser new file mode 100644 index 0000000000..a3651e68c1 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.turkish.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.us-ascii-quotes.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.us-ascii-quotes.ser new file mode 100644 index 0000000000..f10af33590 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.us-ascii-quotes.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.us-ascii.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.us-ascii.ser new file mode 100644 index 0000000000..3a2f7e4971 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.us-ascii.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1250.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1250.ser new file mode 100644 index 0000000000..9e799cb517 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1250.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1251.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1251.ser new file mode 100644 index 0000000000..6592885cbb Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1251.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1252.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1252.ser new file mode 100644 index 0000000000..cccc26c9e7 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1252.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1253.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1253.ser new file mode 100644 index 0000000000..13c5a0b63d Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1253.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1254.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1254.ser new file mode 100644 index 0000000000..96d69722a6 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1254.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1255.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1255.ser new file mode 100644 index 0000000000..c366bfdb64 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1255.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1256.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1256.ser new file mode 100644 index 0000000000..cc98d2c691 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1256.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1257.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1257.ser new file mode 100644 index 0000000000..2a52206115 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1257.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1258.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1258.ser new file mode 100644 index 0000000000..114dd8468a Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.windows-1258.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-ce.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-ce.ser new file mode 100644 index 0000000000..246603d8ec Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-ce.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-cyrillic.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-cyrillic.ser new file mode 100644 index 0000000000..3f606d653f Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-cyrillic.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-greek.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-greek.ser new file mode 100644 index 0000000000..c4b66d93b4 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-greek.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-icelandic.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-icelandic.ser new file mode 100644 index 0000000000..15b35b1c50 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-icelandic.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-roman.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-roman.ser new file mode 100644 index 0000000000..a39e96a6b6 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.x-mac-roman.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.zdingbat.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.zdingbat.ser new file mode 100644 index 0000000000..3a894d2d31 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/from.zdingbat.ser @@ -0,0 +1 @@ +a:202:{s:1:" ";s:1:" ";s:1:"!";s:3:"âœ";s:1:""";s:3:"✂";s:1:"#";s:3:"✃";s:1:"$";s:3:"✄";s:1:"%";s:3:"☎";s:1:"&";s:3:"✆";s:1:"'";s:3:"✇";s:1:"(";s:3:"✈";s:1:")";s:3:"✉";s:1:"*";s:3:"☛";s:1:"+";s:3:"☞";s:1:",";s:3:"✌";s:1:"-";s:3:"âœ";s:1:".";s:3:"✎";s:1:"/";s:3:"âœ";i:0;s:3:"âœ";i:1;s:3:"✑";i:2;s:3:"✒";i:3;s:3:"✓";i:4;s:3:"✔";i:5;s:3:"✕";i:6;s:3:"✖";i:7;s:3:"✗";i:8;s:3:"✘";i:9;s:3:"✙";s:1:":";s:3:"✚";s:1:";";s:3:"✛";s:1:"<";s:3:"✜";s:1:"=";s:3:"âœ";s:1:">";s:3:"✞";s:1:"?";s:3:"✟";s:1:"@";s:3:"✠";s:1:"A";s:3:"✡";s:1:"B";s:3:"✢";s:1:"C";s:3:"✣";s:1:"D";s:3:"✤";s:1:"E";s:3:"✥";s:1:"F";s:3:"✦";s:1:"G";s:3:"✧";s:1:"H";s:3:"★";s:1:"I";s:3:"✩";s:1:"J";s:3:"✪";s:1:"K";s:3:"✫";s:1:"L";s:3:"✬";s:1:"M";s:3:"✭";s:1:"N";s:3:"✮";s:1:"O";s:3:"✯";s:1:"P";s:3:"✰";s:1:"Q";s:3:"✱";s:1:"R";s:3:"✲";s:1:"S";s:3:"✳";s:1:"T";s:3:"✴";s:1:"U";s:3:"✵";s:1:"V";s:3:"✶";s:1:"W";s:3:"✷";s:1:"X";s:3:"✸";s:1:"Y";s:3:"✹";s:1:"Z";s:3:"✺";s:1:"[";s:3:"✻";s:1:"\";s:3:"✼";s:1:"]";s:3:"✽";s:1:"^";s:3:"✾";s:1:"_";s:3:"✿";s:1:"`";s:3:"â€";s:1:"a";s:3:"â";s:1:"b";s:3:"â‚";s:1:"c";s:3:"âƒ";s:1:"d";s:3:"â„";s:1:"e";s:3:"â…";s:1:"f";s:3:"â†";s:1:"g";s:3:"â‡";s:1:"h";s:3:"âˆ";s:1:"i";s:3:"â‰";s:1:"j";s:3:"âŠ";s:1:"k";s:3:"â‹";s:1:"l";s:3:"â—";s:1:"m";s:3:"â";s:1:"n";s:3:"â– ";s:1:"o";s:3:"â";s:1:"p";s:3:"â";s:1:"q";s:3:"â‘";s:1:"r";s:3:"â’";s:1:"s";s:3:"â–²";s:1:"t";s:3:"â–¼";s:1:"u";s:3:"â—†";s:1:"v";s:3:"â–";s:1:"w";s:3:"â——";s:1:"x";s:3:"â˜";s:1:"y";s:3:"â™";s:1:"z";s:3:"âš";s:1:"{";s:3:"â›";s:1:"|";s:3:"âœ";s:1:"}";s:3:"â";s:1:"~";s:3:"âž";s:1:"€";s:3:"";s:1:"";s:3:"";s:1:"‚";s:3:"";s:1:"ƒ";s:3:"";s:1:"„";s:3:"";s:1:"…";s:3:"";s:1:"†";s:3:"ï£";s:1:"‡";s:3:"";s:1:"ˆ";s:3:"";s:1:"‰";s:3:"";s:1:"Š";s:3:"";s:1:"‹";s:3:"";s:1:"Œ";s:3:"";s:1:"";s:3:"";s:1:"¡";s:3:"â¡";s:1:"¢";s:3:"â¢";s:1:"£";s:3:"â£";s:1:"¤";s:3:"â¤";s:1:"¥";s:3:"â¥";s:1:"¦";s:3:"â¦";s:1:"§";s:3:"â§";s:1:"¨";s:3:"♣";s:1:"©";s:3:"♦";s:1:"ª";s:3:"♥";s:1:"«";s:3:"â™ ";s:1:"¬";s:3:"â‘ ";s:1:"­";s:3:"â‘¡";s:1:"®";s:3:"â‘¢";s:1:"¯";s:3:"â‘£";s:1:"°";s:3:"⑤";s:1:"±";s:3:"â‘¥";s:1:"²";s:3:"⑦";s:1:"³";s:3:"â‘§";s:1:"´";s:3:"⑨";s:1:"µ";s:3:"â‘©";s:1:"¶";s:3:"â¶";s:1:"·";s:3:"â·";s:1:"¸";s:3:"â¸";s:1:"¹";s:3:"â¹";s:1:"º";s:3:"âº";s:1:"»";s:3:"â»";s:1:"¼";s:3:"â¼";s:1:"½";s:3:"â½";s:1:"¾";s:3:"â¾";s:1:"¿";s:3:"â¿";s:1:"À";s:3:"➀";s:1:"Á";s:3:"âž";s:1:"Â";s:3:"âž‚";s:1:"Ã";s:3:"➃";s:1:"Ä";s:3:"âž„";s:1:"Å";s:3:"âž…";s:1:"Æ";s:3:"➆";s:1:"Ç";s:3:"➇";s:1:"È";s:3:"➈";s:1:"É";s:3:"➉";s:1:"Ê";s:3:"➊";s:1:"Ë";s:3:"âž‹";s:1:"Ì";s:3:"➌";s:1:"Í";s:3:"âž";s:1:"Î";s:3:"➎";s:1:"Ï";s:3:"âž";s:1:"Ð";s:3:"âž";s:1:"Ñ";s:3:"âž‘";s:1:"Ò";s:3:"âž’";s:1:"Ó";s:3:"âž“";s:1:"Ô";s:3:"âž”";s:1:"Õ";s:3:"→";s:1:"Ö";s:3:"↔";s:1:"×";s:3:"↕";s:1:"Ø";s:3:"➘";s:1:"Ù";s:3:"âž™";s:1:"Ú";s:3:"âžš";s:1:"Û";s:3:"âž›";s:1:"Ü";s:3:"âžœ";s:1:"Ý";s:3:"âž";s:1:"Þ";s:3:"âžž";s:1:"ß";s:3:"➟";s:1:"à";s:3:"âž ";s:1:"á";s:3:"âž¡";s:1:"â";s:3:"➢";s:1:"ã";s:3:"➣";s:1:"ä";s:3:"➤";s:1:"å";s:3:"➥";s:1:"æ";s:3:"➦";s:1:"ç";s:3:"âž§";s:1:"è";s:3:"➨";s:1:"é";s:3:"âž©";s:1:"ê";s:3:"➪";s:1:"ë";s:3:"âž«";s:1:"ì";s:3:"➬";s:1:"í";s:3:"âž­";s:1:"î";s:3:"âž®";s:1:"ï";s:3:"➯";s:1:"ñ";s:3:"âž±";s:1:"ò";s:3:"âž²";s:1:"ó";s:3:"âž³";s:1:"ô";s:3:"âž´";s:1:"õ";s:3:"âžµ";s:1:"ö";s:3:"âž¶";s:1:"÷";s:3:"âž·";s:1:"ø";s:3:"➸";s:1:"ù";s:3:"âž¹";s:1:"ú";s:3:"➺";s:1:"û";s:3:"âž»";s:1:"ü";s:3:"âž¼";s:1:"ý";s:3:"âž½";s:1:"þ";s:3:"âž¾";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.gsm0338.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.gsm0338.ser new file mode 100644 index 0000000000..e675fc33c5 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.gsm0338.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.mazovia.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.mazovia.ser new file mode 100644 index 0000000000..70a534fe73 Binary files /dev/null and b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.mazovia.ser differ diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.stdenc.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.stdenc.ser new file mode 100644 index 0000000000..0cb46281ea --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.stdenc.ser @@ -0,0 +1 @@ +a:154:{s:2:" ";s:1:" ";s:2:"­";s:1:"-";s:3:"∕";s:1:"¤";s:3:"∙";s:1:"´";s:2:"ˉ";s:1:"Å";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:3:"’";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:3:"‘";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:2:"¡";s:1:"¡";s:2:"¢";s:1:"¢";s:2:"£";s:1:"£";s:3:"â„";s:1:"¤";s:2:"Â¥";s:1:"¥";s:2:"Æ’";s:1:"¦";s:2:"§";s:1:"§";s:2:"¤";s:1:"¨";s:1:"'";s:1:"©";s:3:"“";s:1:"ª";s:2:"«";s:1:"«";s:3:"‹";s:1:"¬";s:3:"›";s:1:"­";s:3:"ï¬";s:1:"®";s:3:"fl";s:1:"¯";s:3:"–";s:1:"±";s:3:"†";s:1:"²";s:3:"‡";s:1:"³";s:2:"·";s:1:"´";s:2:"¶";s:1:"¶";s:3:"•";s:1:"·";s:3:"‚";s:1:"¸";s:3:"„";s:1:"¹";s:3:"â€";s:1:"º";s:2:"»";s:1:"»";s:3:"…";s:1:"¼";s:3:"‰";s:1:"½";s:2:"¿";s:1:"¿";s:1:"`";s:1:"Á";s:2:"´";s:1:"Â";s:2:"ˆ";s:1:"Ã";s:2:"Ëœ";s:1:"Ä";s:2:"¯";s:1:"Å";s:2:"˘";s:1:"Æ";s:2:"Ë™";s:1:"Ç";s:2:"¨";s:1:"È";s:2:"Ëš";s:1:"Ê";s:2:"¸";s:1:"Ë";s:2:"Ë";s:1:"Í";s:2:"Ë›";s:1:"Î";s:2:"ˇ";s:1:"Ï";s:3:"—";s:1:"Ð";s:2:"Æ";s:1:"á";s:2:"ª";s:1:"ã";s:2:"Å";s:1:"è";s:2:"Ø";s:1:"é";s:2:"Å’";s:1:"ê";s:2:"º";s:1:"ë";s:2:"æ";s:1:"ñ";s:2:"ı";s:1:"õ";s:2:"Å‚";s:1:"ø";s:2:"ø";s:1:"ù";s:2:"Å“";s:1:"ú";s:2:"ß";s:1:"û";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.symbol.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.symbol.ser new file mode 100644 index 0000000000..fc6150543f --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.symbol.ser @@ -0,0 +1 @@ +a:194:{s:2:" ";s:1:" ";s:3:"∆";s:1:"D";s:3:"Ω";s:1:"W";s:2:"μ";s:1:"m";s:3:"∕";s:1:"¤";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:3:"∀";s:1:""";s:1:"#";s:1:"#";s:3:"∃";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:3:"∋";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:3:"∗";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:3:"−";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:3:"≅";s:1:"@";s:2:"Α";s:1:"A";s:2:"Î’";s:1:"B";s:2:"Χ";s:1:"C";s:2:"Δ";s:1:"D";s:2:"Ε";s:1:"E";s:2:"Φ";s:1:"F";s:2:"Γ";s:1:"G";s:2:"Η";s:1:"H";s:2:"Ι";s:1:"I";s:2:"Ï‘";s:1:"J";s:2:"Κ";s:1:"K";s:2:"Λ";s:1:"L";s:2:"Μ";s:1:"M";s:2:"Î";s:1:"N";s:2:"Ο";s:1:"O";s:2:"Π";s:1:"P";s:2:"Θ";s:1:"Q";s:2:"Ρ";s:1:"R";s:2:"Σ";s:1:"S";s:2:"Τ";s:1:"T";s:2:"Î¥";s:1:"U";s:2:"Ï‚";s:1:"V";s:2:"Ω";s:1:"W";s:2:"Ξ";s:1:"X";s:2:"Ψ";s:1:"Y";s:2:"Ζ";s:1:"Z";s:1:"[";s:1:"[";s:3:"∴";s:1:"\";s:1:"]";s:1:"]";s:3:"⊥";s:1:"^";s:1:"_";s:1:"_";s:3:"";s:1:"`";s:2:"α";s:1:"a";s:2:"β";s:1:"b";s:2:"χ";s:1:"c";s:2:"δ";s:1:"d";s:2:"ε";s:1:"e";s:2:"φ";s:1:"f";s:2:"γ";s:1:"g";s:2:"η";s:1:"h";s:2:"ι";s:1:"i";s:2:"Ï•";s:1:"j";s:2:"κ";s:1:"k";s:2:"λ";s:1:"l";s:2:"µ";s:1:"m";s:2:"ν";s:1:"n";s:2:"ο";s:1:"o";s:2:"Ï€";s:1:"p";s:2:"θ";s:1:"q";s:2:"Ï";s:1:"r";s:2:"σ";s:1:"s";s:2:"Ï„";s:1:"t";s:2:"Ï…";s:1:"u";s:2:"Ï–";s:1:"v";s:2:"ω";s:1:"w";s:2:"ξ";s:1:"x";s:2:"ψ";s:1:"y";s:2:"ζ";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:3:"∼";s:1:"~";s:3:"€";s:1:" ";s:2:"Ï’";s:1:"¡";s:3:"′";s:1:"¢";s:3:"≤";s:1:"£";s:3:"â„";s:1:"¤";s:3:"∞";s:1:"¥";s:2:"Æ’";s:1:"¦";s:3:"♣";s:1:"§";s:3:"♦";s:1:"¨";s:3:"♥";s:1:"©";s:3:"â™ ";s:1:"ª";s:3:"↔";s:1:"«";s:3:"â†";s:1:"¬";s:3:"↑";s:1:"­";s:3:"→";s:1:"®";s:3:"↓";s:1:"¯";s:2:"°";s:1:"°";s:2:"±";s:1:"±";s:3:"″";s:1:"²";s:3:"≥";s:1:"³";s:2:"×";s:1:"´";s:3:"âˆ";s:1:"µ";s:3:"∂";s:1:"¶";s:3:"•";s:1:"·";s:2:"÷";s:1:"¸";s:3:"≠";s:1:"¹";s:3:"≡";s:1:"º";s:3:"≈";s:1:"»";s:3:"…";s:1:"¼";s:3:"";s:1:"½";s:3:"";s:1:"¾";s:3:"↵";s:1:"¿";s:3:"ℵ";s:1:"À";s:3:"â„‘";s:1:"Á";s:3:"ℜ";s:1:"Â";s:3:"℘";s:1:"Ã";s:3:"⊗";s:1:"Ä";s:3:"⊕";s:1:"Å";s:3:"∅";s:1:"Æ";s:3:"∩";s:1:"Ç";s:3:"∪";s:1:"È";s:3:"⊃";s:1:"É";s:3:"⊇";s:1:"Ê";s:3:"⊄";s:1:"Ë";s:3:"⊂";s:1:"Ì";s:3:"⊆";s:1:"Í";s:3:"∈";s:1:"Î";s:3:"∉";s:1:"Ï";s:3:"∠";s:1:"Ð";s:3:"∇";s:1:"Ñ";s:3:"";s:1:"Ò";s:3:"ï›™";s:1:"Ó";s:3:"ï››";s:1:"Ô";s:3:"âˆ";s:1:"Õ";s:3:"√";s:1:"Ö";s:3:"â‹…";s:1:"×";s:2:"¬";s:1:"Ø";s:3:"∧";s:1:"Ù";s:3:"∨";s:1:"Ú";s:3:"⇔";s:1:"Û";s:3:"â‡";s:1:"Ü";s:3:"⇑";s:1:"Ý";s:3:"⇒";s:1:"Þ";s:3:"⇓";s:1:"ß";s:3:"â—Š";s:1:"à";s:3:"〈";s:1:"á";s:3:"";s:1:"â";s:3:"";s:1:"ã";s:3:"";s:1:"ä";s:3:"∑";s:1:"å";s:3:"";s:1:"æ";s:3:"";s:1:"ç";s:3:"";s:1:"è";s:3:"";s:1:"é";s:3:"";s:1:"ê";s:3:"";s:1:"ë";s:3:"";s:1:"ì";s:3:"";s:1:"í";s:3:"";s:1:"î";s:3:"";s:1:"ï";s:3:"〉";s:1:"ñ";s:3:"∫";s:1:"ò";s:3:"⌠";s:1:"ó";s:3:"";s:1:"ô";s:3:"⌡";s:1:"õ";s:3:"";s:1:"ö";s:3:"";s:1:"÷";s:3:"";s:1:"ø";s:3:"";s:1:"ù";s:3:"";s:1:"ú";s:3:"";s:1:"û";s:3:"";s:1:"ü";s:3:"";s:1:"ý";s:3:"";s:1:"þ";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.zdingbat.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.zdingbat.ser new file mode 100644 index 0000000000..1f293bf8ce --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/to.zdingbat.ser @@ -0,0 +1 @@ +a:203:{s:2:" ";s:1:" ";s:1:" ";s:1:" ";s:3:"âœ";s:1:"!";s:3:"✂";s:1:""";s:3:"✃";s:1:"#";s:3:"✄";s:1:"$";s:3:"☎";s:1:"%";s:3:"✆";s:1:"&";s:3:"✇";s:1:"'";s:3:"✈";s:1:"(";s:3:"✉";s:1:")";s:3:"☛";s:1:"*";s:3:"☞";s:1:"+";s:3:"✌";s:1:",";s:3:"âœ";s:1:"-";s:3:"✎";s:1:".";s:3:"âœ";s:1:"/";s:3:"âœ";i:0;s:3:"✑";i:1;s:3:"✒";i:2;s:3:"✓";i:3;s:3:"✔";i:4;s:3:"✕";i:5;s:3:"✖";i:6;s:3:"✗";i:7;s:3:"✘";i:8;s:3:"✙";i:9;s:3:"✚";s:1:":";s:3:"✛";s:1:";";s:3:"✜";s:1:"<";s:3:"âœ";s:1:"=";s:3:"✞";s:1:">";s:3:"✟";s:1:"?";s:3:"✠";s:1:"@";s:3:"✡";s:1:"A";s:3:"✢";s:1:"B";s:3:"✣";s:1:"C";s:3:"✤";s:1:"D";s:3:"✥";s:1:"E";s:3:"✦";s:1:"F";s:3:"✧";s:1:"G";s:3:"★";s:1:"H";s:3:"✩";s:1:"I";s:3:"✪";s:1:"J";s:3:"✫";s:1:"K";s:3:"✬";s:1:"L";s:3:"✭";s:1:"M";s:3:"✮";s:1:"N";s:3:"✯";s:1:"O";s:3:"✰";s:1:"P";s:3:"✱";s:1:"Q";s:3:"✲";s:1:"R";s:3:"✳";s:1:"S";s:3:"✴";s:1:"T";s:3:"✵";s:1:"U";s:3:"✶";s:1:"V";s:3:"✷";s:1:"W";s:3:"✸";s:1:"X";s:3:"✹";s:1:"Y";s:3:"✺";s:1:"Z";s:3:"✻";s:1:"[";s:3:"✼";s:1:"\";s:3:"✽";s:1:"]";s:3:"✾";s:1:"^";s:3:"✿";s:1:"_";s:3:"â€";s:1:"`";s:3:"â";s:1:"a";s:3:"â‚";s:1:"b";s:3:"âƒ";s:1:"c";s:3:"â„";s:1:"d";s:3:"â…";s:1:"e";s:3:"â†";s:1:"f";s:3:"â‡";s:1:"g";s:3:"âˆ";s:1:"h";s:3:"â‰";s:1:"i";s:3:"âŠ";s:1:"j";s:3:"â‹";s:1:"k";s:3:"â—";s:1:"l";s:3:"â";s:1:"m";s:3:"â– ";s:1:"n";s:3:"â";s:1:"o";s:3:"â";s:1:"p";s:3:"â‘";s:1:"q";s:3:"â’";s:1:"r";s:3:"â–²";s:1:"s";s:3:"â–¼";s:1:"t";s:3:"â—†";s:1:"u";s:3:"â–";s:1:"v";s:3:"â——";s:1:"w";s:3:"â˜";s:1:"x";s:3:"â™";s:1:"y";s:3:"âš";s:1:"z";s:3:"â›";s:1:"{";s:3:"âœ";s:1:"|";s:3:"â";s:1:"}";s:3:"âž";s:1:"~";s:3:"";s:1:"€";s:3:"";s:1:"";s:3:"";s:1:"‚";s:3:"";s:1:"ƒ";s:3:"";s:1:"„";s:3:"";s:1:"…";s:3:"ï£";s:1:"†";s:3:"";s:1:"‡";s:3:"";s:1:"ˆ";s:3:"";s:1:"‰";s:3:"";s:1:"Š";s:3:"";s:1:"‹";s:3:"";s:1:"Œ";s:3:"";s:1:"";s:3:"â¡";s:1:"¡";s:3:"â¢";s:1:"¢";s:3:"â£";s:1:"£";s:3:"â¤";s:1:"¤";s:3:"â¥";s:1:"¥";s:3:"â¦";s:1:"¦";s:3:"â§";s:1:"§";s:3:"♣";s:1:"¨";s:3:"♦";s:1:"©";s:3:"♥";s:1:"ª";s:3:"â™ ";s:1:"«";s:3:"â‘ ";s:1:"¬";s:3:"â‘¡";s:1:"­";s:3:"â‘¢";s:1:"®";s:3:"â‘£";s:1:"¯";s:3:"⑤";s:1:"°";s:3:"â‘¥";s:1:"±";s:3:"⑦";s:1:"²";s:3:"â‘§";s:1:"³";s:3:"⑨";s:1:"´";s:3:"â‘©";s:1:"µ";s:3:"â¶";s:1:"¶";s:3:"â·";s:1:"·";s:3:"â¸";s:1:"¸";s:3:"â¹";s:1:"¹";s:3:"âº";s:1:"º";s:3:"â»";s:1:"»";s:3:"â¼";s:1:"¼";s:3:"â½";s:1:"½";s:3:"â¾";s:1:"¾";s:3:"â¿";s:1:"¿";s:3:"➀";s:1:"À";s:3:"âž";s:1:"Á";s:3:"âž‚";s:1:"Â";s:3:"➃";s:1:"Ã";s:3:"âž„";s:1:"Ä";s:3:"âž…";s:1:"Å";s:3:"➆";s:1:"Æ";s:3:"➇";s:1:"Ç";s:3:"➈";s:1:"È";s:3:"➉";s:1:"É";s:3:"➊";s:1:"Ê";s:3:"âž‹";s:1:"Ë";s:3:"➌";s:1:"Ì";s:3:"âž";s:1:"Í";s:3:"➎";s:1:"Î";s:3:"âž";s:1:"Ï";s:3:"âž";s:1:"Ð";s:3:"âž‘";s:1:"Ñ";s:3:"âž’";s:1:"Ò";s:3:"âž“";s:1:"Ó";s:3:"âž”";s:1:"Ô";s:3:"→";s:1:"Õ";s:3:"↔";s:1:"Ö";s:3:"↕";s:1:"×";s:3:"➘";s:1:"Ø";s:3:"âž™";s:1:"Ù";s:3:"âžš";s:1:"Ú";s:3:"âž›";s:1:"Û";s:3:"âžœ";s:1:"Ü";s:3:"âž";s:1:"Ý";s:3:"âžž";s:1:"Þ";s:3:"➟";s:1:"ß";s:3:"âž ";s:1:"à";s:3:"âž¡";s:1:"á";s:3:"➢";s:1:"â";s:3:"➣";s:1:"ã";s:3:"➤";s:1:"ä";s:3:"➥";s:1:"å";s:3:"➦";s:1:"æ";s:3:"âž§";s:1:"ç";s:3:"➨";s:1:"è";s:3:"âž©";s:1:"é";s:3:"➪";s:1:"ê";s:3:"âž«";s:1:"ë";s:3:"➬";s:1:"ì";s:3:"âž­";s:1:"í";s:3:"âž®";s:1:"î";s:3:"➯";s:1:"ï";s:3:"âž±";s:1:"ñ";s:3:"âž²";s:1:"ò";s:3:"âž³";s:1:"ó";s:3:"âž´";s:1:"ô";s:3:"âžµ";s:1:"õ";s:3:"âž¶";s:1:"ö";s:3:"âž·";s:1:"÷";s:3:"➸";s:1:"ø";s:3:"âž¹";s:1:"ù";s:3:"➺";s:1:"ú";s:3:"âž»";s:1:"û";s:3:"âž¼";s:1:"ü";s:3:"âž½";s:1:"ý";s:3:"âž¾";s:1:"þ";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/translit.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/translit.ser new file mode 100644 index 0000000000..3fd8411298 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/charset/translit.ser @@ -0,0 +1 @@ +a:3959:{s:2:"µ";s:2:"μ";s:2:"¼";s:7:" 1â„4 ";s:2:"½";s:7:" 1â„2 ";s:2:"¾";s:7:" 3â„4 ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ä¿";s:3:"L·";s:2:"Å€";s:3:"l·";s:2:"ʼn";s:3:"ʼn";s:2:"Å¿";s:1:"s";s:2:"Ç„";s:3:"DŽ";s:2:"Ç…";s:3:"Dž";s:2:"dž";s:3:"dž";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"ÇŠ";s:2:"NJ";s:2:"Ç‹";s:2:"Nj";s:2:"ÇŒ";s:2:"nj";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ï";s:2:"β";s:2:"Ï‘";s:2:"θ";s:2:"Ï’";s:2:"Î¥";s:2:"Ï•";s:2:"φ";s:2:"Ï–";s:2:"Ï€";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"Ï";s:2:"ϲ";s:2:"Ï‚";s:2:"Ï´";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ö‡";s:4:"Õ¥Ö‚";s:2:"Ùµ";s:4:"اٴ";s:2:"Ù¶";s:4:"وٴ";s:2:"Ù·";s:4:"Û‡Ù´";s:2:"Ù¸";s:4:"يٴ";s:3:"ำ";s:6:"à¹à¸²";s:3:"ຳ";s:6:"à»àº²";s:3:"ໜ";s:6:"ຫນ";s:3:"à»";s:6:"ຫມ";s:3:"ཷ";s:6:"ྲà¾";s:3:"ཹ";s:6:"ླà¾";s:3:"ẚ";s:3:"aʾ";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"â‡";s:2:"??";s:3:"âˆ";s:2:"?!";s:3:"â‰";s:2:"!?";s:3:"â—";s:12:"′′′′";s:3:"₨";s:2:"Rs";s:3:"â„€";s:3:"a/c";s:3:"â„";s:3:"a/s";s:3:"â„‚";s:1:"C";s:3:"℃";s:3:"°C";s:3:"â„…";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Æ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"â„‹";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"â„";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"â„";s:2:"ħ";s:3:"â„";s:1:"I";s:3:"â„‘";s:1:"I";s:3:"â„’";s:1:"L";s:3:"â„“";s:1:"l";s:3:"â„•";s:1:"N";s:3:"â„–";s:2:"No";s:3:"â„™";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"â„›";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"â„";s:1:"R";s:3:"â„¡";s:3:"TEL";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"ℬ";s:1:"B";s:3:"â„­";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"â„°";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"â„´";s:1:"o";s:3:"ℵ";s:2:"×";s:3:"â„¶";s:2:"ב";s:3:"â„·";s:2:"×’";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"â„»";s:3:"FAX";s:3:"ℼ";s:2:"Ï€";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"â„¿";s:2:"Π";s:3:"â…€";s:3:"∑";s:3:"â……";s:1:"D";s:3:"â…†";s:1:"d";s:3:"â…‡";s:1:"e";s:3:"â…ˆ";s:1:"i";s:3:"â…‰";s:1:"j";s:3:"â…";s:7:" 1â„7 ";s:3:"â…‘";s:7:" 1â„9 ";s:3:"â…’";s:8:" 1â„10 ";s:3:"â…“";s:7:" 1â„3 ";s:3:"â…”";s:7:" 2â„3 ";s:3:"â…•";s:7:" 1â„5 ";s:3:"â…–";s:7:" 2â„5 ";s:3:"â…—";s:7:" 3â„5 ";s:3:"â…˜";s:7:" 4â„5 ";s:3:"â…™";s:7:" 1â„6 ";s:3:"â…š";s:7:" 5â„6 ";s:3:"â…›";s:7:" 1â„8 ";s:3:"â…œ";s:7:" 3â„8 ";s:3:"â…";s:7:" 5â„8 ";s:3:"â…ž";s:7:" 7â„8 ";s:3:"â…Ÿ";s:6:" 1â„ ";s:3:"â… ";s:1:"I";s:3:"â…¡";s:2:"II";s:3:"â…¢";s:3:"III";s:3:"â…£";s:2:"IV";s:3:"â…¤";s:1:"V";s:3:"â…¥";s:2:"VI";s:3:"â…¦";s:3:"VII";s:3:"â…§";s:4:"VIII";s:3:"â…¨";s:2:"IX";s:3:"â…©";s:1:"X";s:3:"â…ª";s:2:"XI";s:3:"â…«";s:3:"XII";s:3:"â…¬";s:1:"L";s:3:"â…­";s:1:"C";s:3:"â…®";s:1:"D";s:3:"â…¯";s:1:"M";s:3:"â…°";s:1:"i";s:3:"â…±";s:2:"ii";s:3:"â…²";s:3:"iii";s:3:"â…³";s:2:"iv";s:3:"â…´";s:1:"v";s:3:"â…µ";s:2:"vi";s:3:"â…¶";s:3:"vii";s:3:"â…·";s:4:"viii";s:3:"â…¸";s:2:"ix";s:3:"â…¹";s:1:"x";s:3:"â…º";s:2:"xi";s:3:"â…»";s:3:"xii";s:3:"â…¼";s:1:"l";s:3:"â…½";s:1:"c";s:3:"â…¾";s:1:"d";s:3:"â…¿";s:1:"m";s:3:"↉";s:7:" 0â„3 ";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"â‘ ";s:3:"(1)";s:3:"â‘¡";s:3:"(2)";s:3:"â‘¢";s:3:"(3)";s:3:"â‘£";s:3:"(4)";s:3:"⑤";s:3:"(5)";s:3:"â‘¥";s:3:"(6)";s:3:"⑦";s:3:"(7)";s:3:"â‘§";s:3:"(8)";s:3:"⑨";s:3:"(9)";s:3:"â‘©";s:4:"(10)";s:3:"⑪";s:4:"(11)";s:3:"â‘«";s:4:"(12)";s:3:"⑬";s:4:"(13)";s:3:"â‘­";s:4:"(14)";s:3:"â‘®";s:4:"(15)";s:3:"⑯";s:4:"(16)";s:3:"â‘°";s:4:"(17)";s:3:"⑱";s:4:"(18)";s:3:"⑲";s:4:"(19)";s:3:"⑳";s:4:"(20)";s:3:"â‘´";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"â‘¶";s:3:"(3)";s:3:"â‘·";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"â‘»";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"â‘¿";s:4:"(12)";s:3:"â’€";s:4:"(13)";s:3:"â’";s:4:"(14)";s:3:"â’‚";s:4:"(15)";s:3:"â’ƒ";s:4:"(16)";s:3:"â’„";s:4:"(17)";s:3:"â’…";s:4:"(18)";s:3:"â’†";s:4:"(19)";s:3:"â’‡";s:4:"(20)";s:3:"â’ˆ";s:2:"1.";s:3:"â’‰";s:2:"2.";s:3:"â’Š";s:2:"3.";s:3:"â’‹";s:2:"4.";s:3:"â’Œ";s:2:"5.";s:3:"â’";s:2:"6.";s:3:"â’Ž";s:2:"7.";s:3:"â’";s:2:"8.";s:3:"â’";s:2:"9.";s:3:"â’‘";s:3:"10.";s:3:"â’’";s:3:"11.";s:3:"â’“";s:3:"12.";s:3:"â’”";s:3:"13.";s:3:"â’•";s:3:"14.";s:3:"â’–";s:3:"15.";s:3:"â’—";s:3:"16.";s:3:"â’˜";s:3:"17.";s:3:"â’™";s:3:"18.";s:3:"â’š";s:3:"19.";s:3:"â’›";s:3:"20.";s:3:"â’œ";s:3:"(a)";s:3:"â’";s:3:"(b)";s:3:"â’ž";s:3:"(c)";s:3:"â’Ÿ";s:3:"(d)";s:3:"â’ ";s:3:"(e)";s:3:"â’¡";s:3:"(f)";s:3:"â’¢";s:3:"(g)";s:3:"â’£";s:3:"(h)";s:3:"â’¤";s:3:"(i)";s:3:"â’¥";s:3:"(j)";s:3:"â’¦";s:3:"(k)";s:3:"â’§";s:3:"(l)";s:3:"â’¨";s:3:"(m)";s:3:"â’©";s:3:"(n)";s:3:"â’ª";s:3:"(o)";s:3:"â’«";s:3:"(p)";s:3:"â’¬";s:3:"(q)";s:3:"â’­";s:3:"(r)";s:3:"â’®";s:3:"(s)";s:3:"â’¯";s:3:"(t)";s:3:"â’°";s:3:"(u)";s:3:"â’±";s:3:"(v)";s:3:"â’²";s:3:"(w)";s:3:"â’³";s:3:"(x)";s:3:"â’´";s:3:"(y)";s:3:"â’µ";s:3:"(z)";s:3:"â’¶";s:3:"(A)";s:3:"â’·";s:3:"(B)";s:3:"â’¸";s:3:"(C)";s:3:"â’¹";s:3:"(D)";s:3:"â’º";s:3:"(E)";s:3:"â’»";s:3:"(F)";s:3:"â’¼";s:3:"(G)";s:3:"â’½";s:3:"(H)";s:3:"â’¾";s:3:"(I)";s:3:"â’¿";s:3:"(J)";s:3:"â“€";s:3:"(K)";s:3:"â“";s:3:"(L)";s:3:"â“‚";s:3:"(M)";s:3:"Ⓝ";s:3:"(N)";s:3:"â“„";s:3:"(O)";s:3:"â“…";s:3:"(P)";s:3:"Ⓠ";s:3:"(Q)";s:3:"Ⓡ";s:3:"(R)";s:3:"Ⓢ";s:3:"(S)";s:3:"Ⓣ";s:3:"(T)";s:3:"Ⓤ";s:3:"(U)";s:3:"â“‹";s:3:"(V)";s:3:"Ⓦ";s:3:"(W)";s:3:"â“";s:3:"(X)";s:3:"Ⓨ";s:3:"(Y)";s:3:"â“";s:3:"(Z)";s:3:"â“";s:3:"(a)";s:3:"â“‘";s:3:"(b)";s:3:"â“’";s:3:"(c)";s:3:"â““";s:3:"(d)";s:3:"â“”";s:3:"(e)";s:3:"â“•";s:3:"(f)";s:3:"â“–";s:3:"(g)";s:3:"â“—";s:3:"(h)";s:3:"ⓘ";s:3:"(i)";s:3:"â“™";s:3:"(j)";s:3:"ⓚ";s:3:"(k)";s:3:"â“›";s:3:"(l)";s:3:"ⓜ";s:3:"(m)";s:3:"â“";s:3:"(n)";s:3:"ⓞ";s:3:"(o)";s:3:"ⓟ";s:3:"(p)";s:3:"â“ ";s:3:"(q)";s:3:"â“¡";s:3:"(r)";s:3:"â“¢";s:3:"(s)";s:3:"â“£";s:3:"(t)";s:3:"ⓤ";s:3:"(u)";s:3:"â“¥";s:3:"(v)";s:3:"ⓦ";s:3:"(w)";s:3:"â“§";s:3:"(x)";s:3:"ⓨ";s:3:"(y)";s:3:"â“©";s:3:"(z)";s:3:"⓪";s:3:"(0)";s:3:"⨌";s:12:"∫∫∫∫";s:3:"â©´";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"â©¶";s:3:"===";s:3:"⺟";s:3:"æ¯";s:3:"⻳";s:3:"龟";s:3:"â¼€";s:3:"一";s:3:"â¼";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"ä¹™";s:3:"â¼…";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"å„¿";s:3:"⼊";s:3:"å…¥";s:3:"⼋";s:3:"å…«";s:3:"⼌";s:3:"冂";s:3:"â¼";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"â¼";s:3:"几";s:3:"â¼";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"â¼’";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"â¼”";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"â¼–";s:3:"匸";s:3:"â¼—";s:3:"å";s:3:"⼘";s:3:"åœ";s:3:"â¼™";s:3:"å©";s:3:"⼚";s:3:"厂";s:3:"â¼›";s:3:"厶";s:3:"⼜";s:3:"åˆ";s:3:"â¼";s:3:"å£";s:3:"⼞";s:3:"å›—";s:3:"⼟";s:3:"土";s:3:"â¼ ";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"â¼¢";s:3:"夊";s:3:"â¼£";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"â¼¥";s:3:"女";s:3:"⼦";s:3:"å­";s:3:"â¼§";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"å°";s:3:"⼪";s:3:"å°¢";s:3:"⼫";s:3:"å°¸";s:3:"⼬";s:3:"å±®";s:3:"â¼­";s:3:"å±±";s:3:"â¼®";s:3:"å·›";s:3:"⼯";s:3:"å·¥";s:3:"â¼°";s:3:"å·±";s:3:"â¼±";s:3:"å·¾";s:3:"â¼²";s:3:"å¹²";s:3:"â¼³";s:3:"幺";s:3:"â¼´";s:3:"广";s:3:"â¼µ";s:3:"å»´";s:3:"â¼¶";s:3:"廾";s:3:"â¼·";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"â¼¹";s:3:"å½";s:3:"⼺";s:3:"彡";s:3:"â¼»";s:3:"å½³";s:3:"â¼¼";s:3:"心";s:3:"â¼½";s:3:"戈";s:3:"â¼¾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"â½€";s:3:"支";s:3:"â½";s:3:"æ”´";s:3:"⽂";s:3:"æ–‡";s:3:"⽃";s:3:"æ–—";s:3:"⽄";s:3:"æ–¤";s:3:"â½…";s:3:"æ–¹";s:3:"⽆";s:3:"æ— ";s:3:"⽇";s:3:"æ—¥";s:3:"⽈";s:3:"æ›°";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"æ­¢";s:3:"â½";s:3:"æ­¹";s:3:"⽎";s:3:"殳";s:3:"â½";s:3:"毋";s:3:"â½";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"â½’";s:3:"æ°";s:3:"⽓";s:3:"æ°”";s:3:"â½”";s:3:"æ°´";s:3:"⽕";s:3:"ç«";s:3:"â½–";s:3:"爪";s:3:"â½—";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"â½™";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"â½›";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"â½";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"â½ ";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"â½¢";s:3:"甘";s:3:"â½£";s:3:"生";s:3:"⽤";s:3:"用";s:3:"â½¥";s:3:"ç”°";s:3:"⽦";s:3:"ç–‹";s:3:"â½§";s:3:"ç–’";s:3:"⽨";s:3:"ç™¶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"çš®";s:3:"⽫";s:3:"çš¿";s:3:"⽬";s:3:"ç›®";s:3:"â½­";s:3:"矛";s:3:"â½®";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"â½°";s:3:"示";s:3:"â½±";s:3:"禸";s:3:"â½²";s:3:"禾";s:3:"â½³";s:3:"ç©´";s:3:"â½´";s:3:"ç«‹";s:3:"â½µ";s:3:"竹";s:3:"â½¶";s:3:"ç±³";s:3:"â½·";s:3:"糸";s:3:"⽸";s:3:"ç¼¶";s:3:"â½¹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"â½»";s:3:"ç¾½";s:3:"â½¼";s:3:"è€";s:3:"â½½";s:3:"而";s:3:"â½¾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"â¾€";s:3:"è¿";s:3:"â¾";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"â¾…";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"è™";s:3:"â¾";s:3:"虫";s:3:"⾎";s:3:"è¡€";s:3:"â¾";s:3:"行";s:3:"â¾";s:3:"è¡£";s:3:"⾑";s:3:"襾";s:3:"â¾’";s:3:"見";s:3:"⾓";s:3:"è§’";s:3:"â¾”";s:3:"言";s:3:"⾕";s:3:"è°·";s:3:"â¾–";s:3:"豆";s:3:"â¾—";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"â¾™";s:3:"è²";s:3:"⾚";s:3:"赤";s:3:"â¾›";s:3:"èµ°";s:3:"⾜";s:3:"è¶³";s:3:"â¾";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"è¾›";s:3:"â¾ ";s:3:"è¾°";s:3:"⾡";s:3:"è¾µ";s:3:"â¾¢";s:3:"é‚‘";s:3:"â¾£";s:3:"é…‰";s:3:"⾤";s:3:"釆";s:3:"â¾¥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"â¾§";s:3:"é•·";s:3:"⾨";s:3:"é–€";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"éš¶";s:3:"⾫";s:3:"éš¹";s:3:"⾬";s:3:"雨";s:3:"â¾­";s:3:"é‘";s:3:"â¾®";s:3:"éž";s:3:"⾯";s:3:"é¢";s:3:"â¾°";s:3:"é©";s:3:"â¾±";s:3:"韋";s:3:"â¾²";s:3:"韭";s:3:"â¾³";s:3:"音";s:3:"â¾´";s:3:"é ";s:3:"â¾µ";s:3:"風";s:3:"â¾¶";s:3:"飛";s:3:"â¾·";s:3:"食";s:3:"⾸";s:3:"首";s:3:"â¾¹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"â¾»";s:3:"骨";s:3:"â¾¼";s:3:"高";s:3:"â¾½";s:3:"髟";s:3:"â¾¾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"â¿€";s:3:"鬲";s:3:"â¿";s:3:"鬼";s:3:"â¿‚";s:3:"é­š";s:3:"⿃";s:3:"é³¥";s:3:"â¿„";s:3:"é¹µ";s:3:"â¿…";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"é»";s:3:"⿊";s:3:"黑";s:3:"â¿‹";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"â¿";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"â¿";s:3:"é¼ ";s:3:"â¿";s:3:"é¼»";s:3:"â¿‘";s:3:"齊";s:3:"â¿’";s:3:"é½’";s:3:"â¿“";s:3:"é¾";s:3:"â¿”";s:3:"龜";s:3:"â¿•";s:3:"é¾ ";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"å";s:3:"〹";s:3:"å„";s:3:"〺";s:3:"å…";s:3:"ㄱ";s:3:"á„€";s:3:"ㄲ";s:3:"á„";s:3:"ㄳ";s:3:"ᆪ";s:3:"ã„´";s:3:"á„‚";s:3:"ㄵ";s:3:"ᆬ";s:3:"ã„¶";s:3:"ᆭ";s:3:"ã„·";s:3:"ᄃ";s:3:"ㄸ";s:3:"á„„";s:3:"ㄹ";s:3:"á„…";s:3:"ㄺ";s:3:"ᆰ";s:3:"ã„»";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ã„¿";s:3:"ᆵ";s:3:"ã…€";s:3:"ᄚ";s:3:"ã…";s:3:"ᄆ";s:3:"ã…‚";s:3:"ᄇ";s:3:"ã…ƒ";s:3:"ᄈ";s:3:"ã…„";s:3:"á„¡";s:3:"ã……";s:3:"ᄉ";s:3:"ã…†";s:3:"ᄊ";s:3:"ã…‡";s:3:"á„‹";s:3:"ã…ˆ";s:3:"ᄌ";s:3:"ã…‰";s:3:"á„";s:3:"ã…Š";s:3:"ᄎ";s:3:"ã…‹";s:3:"á„";s:3:"ã…Œ";s:3:"á„";s:3:"ã…";s:3:"á„‘";s:3:"ã…Ž";s:3:"á„’";s:3:"ã…";s:3:"á…¡";s:3:"ã…";s:3:"á…¢";s:3:"ã…‘";s:3:"á…£";s:3:"ã…’";s:3:"á…¤";s:3:"ã…“";s:3:"á…¥";s:3:"ã…”";s:3:"á…¦";s:3:"ã…•";s:3:"á…§";s:3:"ã…–";s:3:"á…¨";s:3:"ã…—";s:3:"á…©";s:3:"ã…˜";s:3:"á…ª";s:3:"ã…™";s:3:"á…«";s:3:"ã…š";s:3:"á…¬";s:3:"ã…›";s:3:"á…­";s:3:"ã…œ";s:3:"á…®";s:3:"ã…";s:3:"á…¯";s:3:"ã…ž";s:3:"á…°";s:3:"ã…Ÿ";s:3:"á…±";s:3:"ã… ";s:3:"á…²";s:3:"ã…¡";s:3:"á…³";s:3:"ã…¢";s:3:"á…´";s:3:"ã…£";s:3:"á…µ";s:3:"ã…¤";s:3:"á… ";s:3:"ã…¥";s:3:"á„”";s:3:"ã…¦";s:3:"á„•";s:3:"ã…§";s:3:"ᇇ";s:3:"ã…¨";s:3:"ᇈ";s:3:"ã…©";s:3:"ᇌ";s:3:"ã…ª";s:3:"ᇎ";s:3:"ã…«";s:3:"ᇓ";s:3:"ã…¬";s:3:"ᇗ";s:3:"ã…­";s:3:"ᇙ";s:3:"ã…®";s:3:"ᄜ";s:3:"ã…¯";s:3:"á‡";s:3:"ã…°";s:3:"ᇟ";s:3:"ã…±";s:3:"á„";s:3:"ã…²";s:3:"ᄞ";s:3:"ã…³";s:3:"á„ ";s:3:"ã…´";s:3:"á„¢";s:3:"ã…µ";s:3:"á„£";s:3:"ã…¶";s:3:"á„§";s:3:"ã…·";s:3:"á„©";s:3:"ã…¸";s:3:"á„«";s:3:"ã…¹";s:3:"ᄬ";s:3:"ã…º";s:3:"á„­";s:3:"ã…»";s:3:"á„®";s:3:"ã…¼";s:3:"ᄯ";s:3:"ã…½";s:3:"ᄲ";s:3:"ã…¾";s:3:"á„¶";s:3:"ã…¿";s:3:"á…€";s:3:"ㆀ";s:3:"á…‡";s:3:"ã†";s:3:"á…Œ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"á…—";s:3:"ㆅ";s:3:"á…˜";s:3:"ㆆ";s:3:"á…™";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ã†";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㈀";s:5:"(á„€)";s:3:"ãˆ";s:5:"(á„‚)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(á„…)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(á„‹)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(á„)";s:3:"㈋";s:5:"(á„)";s:3:"㈌";s:5:"(á„‘)";s:3:"ãˆ";s:5:"(á„’)";s:3:"㈎";s:8:"(가)";s:3:"ãˆ";s:8:"(á„‚á…¡)";s:3:"ãˆ";s:8:"(다)";s:3:"㈑";s:8:"(á„…á…¡)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(á„‹á…¡)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(á„á…¡)";s:3:"㈙";s:8:"(á„á…¡)";s:3:"㈚";s:8:"(á„‘á…¡)";s:3:"㈛";s:8:"(á„’á…¡)";s:3:"㈜";s:8:"(주)";s:3:"ãˆ";s:17:"(오전)";s:3:"㈞";s:14:"(á„‹á…©á„’á…®)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(å››)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(å…­)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(å…«)";s:3:"㈨";s:5:"(ä¹)";s:3:"㈩";s:5:"(å)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(ç«)";s:3:"㈬";s:5:"(æ°´)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(æ—¥)";s:3:"㈱";s:5:"(æ ª)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(å)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(ç¥)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(å­¦)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(ä¼)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(å”)";s:3:"㉀";s:5:"(祭)";s:3:"ã‰";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:5:"(å•)";s:3:"㉅";s:5:"(å¹¼)";s:3:"㉆";s:5:"(æ–‡)";s:3:"㉇";s:5:"(ç®)";s:3:"ã‰";s:3:"PTE";s:3:"㉑";s:4:"(21)";s:3:"㉒";s:4:"(22)";s:3:"㉓";s:4:"(23)";s:3:"㉔";s:4:"(24)";s:3:"㉕";s:4:"(25)";s:3:"㉖";s:4:"(26)";s:3:"㉗";s:4:"(27)";s:3:"㉘";s:4:"(28)";s:3:"㉙";s:4:"(29)";s:3:"㉚";s:4:"(30)";s:3:"㉛";s:4:"(31)";s:3:"㉜";s:4:"(32)";s:3:"ã‰";s:4:"(33)";s:3:"㉞";s:4:"(34)";s:3:"㉟";s:4:"(35)";s:3:"㉠";s:5:"(á„€)";s:3:"㉡";s:5:"(á„‚)";s:3:"㉢";s:5:"(ᄃ)";s:3:"㉣";s:5:"(á„…)";s:3:"㉤";s:5:"(ᄆ)";s:3:"㉥";s:5:"(ᄇ)";s:3:"㉦";s:5:"(ᄉ)";s:3:"㉧";s:5:"(á„‹)";s:3:"㉨";s:5:"(ᄌ)";s:3:"㉩";s:5:"(ᄎ)";s:3:"㉪";s:5:"(á„)";s:3:"㉫";s:5:"(á„)";s:3:"㉬";s:5:"(á„‘)";s:3:"㉭";s:5:"(á„’)";s:3:"㉮";s:8:"(가)";s:3:"㉯";s:8:"(á„‚á…¡)";s:3:"㉰";s:8:"(다)";s:3:"㉱";s:8:"(á„…á…¡)";s:3:"㉲";s:8:"(마)";s:3:"㉳";s:8:"(바)";s:3:"㉴";s:8:"(사)";s:3:"㉵";s:8:"(á„‹á…¡)";s:3:"㉶";s:8:"(자)";s:3:"㉷";s:8:"(차)";s:3:"㉸";s:8:"(á„á…¡)";s:3:"㉹";s:8:"(á„á…¡)";s:3:"㉺";s:8:"(á„‘á…¡)";s:3:"㉻";s:8:"(á„’á…¡)";s:3:"㉼";s:17:"(참고)";s:3:"㉽";s:14:"(주의)";s:3:"㉾";s:8:"(á„‹á…®)";s:3:"㊀";s:5:"(一)";s:3:"ãŠ";s:5:"(二)";s:3:"㊂";s:5:"(三)";s:3:"㊃";s:5:"(å››)";s:3:"㊄";s:5:"(五)";s:3:"㊅";s:5:"(å…­)";s:3:"㊆";s:5:"(七)";s:3:"㊇";s:5:"(å…«)";s:3:"㊈";s:5:"(ä¹)";s:3:"㊉";s:5:"(å)";s:3:"㊊";s:5:"(月)";s:3:"㊋";s:5:"(ç«)";s:3:"㊌";s:5:"(æ°´)";s:3:"ãŠ";s:5:"(木)";s:3:"㊎";s:5:"(金)";s:3:"ãŠ";s:5:"(土)";s:3:"ãŠ";s:5:"(æ—¥)";s:3:"㊑";s:5:"(æ ª)";s:3:"㊒";s:5:"(有)";s:3:"㊓";s:5:"(社)";s:3:"㊔";s:5:"(å)";s:3:"㊕";s:5:"(特)";s:3:"㊖";s:5:"(財)";s:3:"㊗";s:5:"(ç¥)";s:3:"㊘";s:5:"(労)";s:3:"㊙";s:5:"(秘)";s:3:"㊚";s:5:"(ç”·)";s:3:"㊛";s:5:"(女)";s:3:"㊜";s:5:"(é©)";s:3:"ãŠ";s:5:"(優)";s:3:"㊞";s:5:"(å°)";s:3:"㊟";s:5:"(注)";s:3:"㊠";s:5:"(é …)";s:3:"㊡";s:5:"(休)";s:3:"㊢";s:5:"(写)";s:3:"㊣";s:5:"(æ­£)";s:3:"㊤";s:5:"(上)";s:3:"㊥";s:5:"(中)";s:3:"㊦";s:5:"(下)";s:3:"㊧";s:5:"(å·¦)";s:3:"㊨";s:5:"(å³)";s:3:"㊩";s:5:"(医)";s:3:"㊪";s:5:"(å®—)";s:3:"㊫";s:5:"(å­¦)";s:3:"㊬";s:5:"(監)";s:3:"㊭";s:5:"(ä¼)";s:3:"㊮";s:5:"(資)";s:3:"㊯";s:5:"(å”)";s:3:"㊰";s:5:"(夜)";s:3:"㊱";s:4:"(36)";s:3:"㊲";s:4:"(37)";s:3:"㊳";s:4:"(38)";s:3:"㊴";s:4:"(39)";s:3:"㊵";s:4:"(40)";s:3:"㊶";s:4:"(41)";s:3:"㊷";s:4:"(42)";s:3:"㊸";s:4:"(43)";s:3:"㊹";s:4:"(44)";s:3:"㊺";s:4:"(45)";s:3:"㊻";s:4:"(46)";s:3:"㊼";s:4:"(47)";s:3:"㊽";s:4:"(48)";s:3:"㊾";s:4:"(49)";s:3:"㊿";s:4:"(50)";s:3:"ã‹€";s:4:"1月";s:3:"ã‹";s:4:"2月";s:3:"ã‹‚";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"ã‹„";s:4:"5月";s:3:"ã‹…";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"ã‹‹";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"ã‹";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"ã‹";s:3:"LTD";s:3:"ã‹";s:5:"(ã‚¢)";s:3:"ã‹‘";s:5:"(イ)";s:3:"ã‹’";s:5:"(ウ)";s:3:"ã‹“";s:5:"(エ)";s:3:"ã‹”";s:5:"(オ)";s:3:"ã‹•";s:5:"(ã‚«)";s:3:"ã‹–";s:5:"(ã‚­)";s:3:"ã‹—";s:5:"(ク)";s:3:"㋘";s:5:"(ケ)";s:3:"ã‹™";s:5:"(コ)";s:3:"㋚";s:5:"(サ)";s:3:"ã‹›";s:5:"(ã‚·)";s:3:"㋜";s:5:"(ス)";s:3:"ã‹";s:5:"(ã‚»)";s:3:"㋞";s:5:"(ソ)";s:3:"㋟";s:5:"(ã‚¿)";s:3:"ã‹ ";s:5:"(ãƒ)";s:3:"ã‹¡";s:5:"(ツ)";s:3:"ã‹¢";s:5:"(テ)";s:3:"ã‹£";s:5:"(ト)";s:3:"㋤";s:5:"(ナ)";s:3:"ã‹¥";s:5:"(ニ)";s:3:"㋦";s:5:"(ヌ)";s:3:"ã‹§";s:5:"(ãƒ)";s:3:"㋨";s:5:"(ノ)";s:3:"ã‹©";s:5:"(ãƒ)";s:3:"㋪";s:5:"(ヒ)";s:3:"ã‹«";s:5:"(フ)";s:3:"㋬";s:5:"(ヘ)";s:3:"ã‹­";s:5:"(ホ)";s:3:"ã‹®";s:5:"(マ)";s:3:"㋯";s:5:"(ミ)";s:3:"ã‹°";s:5:"(ム)";s:3:"㋱";s:5:"(メ)";s:3:"㋲";s:5:"(モ)";s:3:"㋳";s:5:"(ヤ)";s:3:"ã‹´";s:5:"(ユ)";s:3:"㋵";s:5:"(ヨ)";s:3:"ã‹¶";s:5:"(ラ)";s:3:"ã‹·";s:5:"(リ)";s:3:"㋸";s:5:"(ル)";s:3:"㋹";s:5:"(レ)";s:3:"㋺";s:5:"(ロ)";s:3:"ã‹»";s:5:"(ワ)";s:3:"㋼";s:5:"(ヰ)";s:3:"㋽";s:5:"(ヱ)";s:3:"㋾";s:5:"(ヲ)";s:3:"㌀";s:12:"アパート";s:3:"ãŒ";s:12:"アルファ";s:3:"㌂";s:12:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:12:"イニング";s:3:"㌅";s:9:"インãƒ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:15:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"ãŒ";s:12:"カロリー";s:3:"㌎";s:9:"ガロン";s:3:"ãŒ";s:9:"ガンマ";s:3:"ãŒ";s:6:"ギガ";s:3:"㌑";s:9:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:12:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:15:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:9:"グラム";s:3:"㌙";s:15:"グラムトン";s:3:"㌚";s:15:"クルゼイロ";s:3:"㌛";s:12:"クローãƒ";s:3:"㌜";s:9:"ケース";s:3:"ãŒ";s:9:"コルナ";s:3:"㌞";s:9:"コーãƒ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンãƒãƒ¼ãƒ ";s:3:"㌡";s:12:"シリング";s:3:"㌢";s:9:"センãƒ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:9:"ダース";s:3:"㌥";s:6:"デシ";s:3:"㌦";s:6:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ãƒã‚¤ãƒ„";s:3:"㌫";s:15:"パーセント";s:3:"㌬";s:9:"パーツ";s:3:"㌭";s:12:"ãƒãƒ¼ãƒ¬ãƒ«";s:3:"㌮";s:15:"ピアストル";s:3:"㌯";s:9:"ピクル";s:3:"㌰";s:6:"ピコ";s:3:"㌱";s:6:"ビル";s:3:"㌲";s:15:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:15:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:6:"ペソ";s:3:"㌸";s:9:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:9:"ペンス";s:3:"㌻";s:9:"ページ";s:3:"㌼";s:9:"ベータ";s:3:"㌽";s:12:"ãƒã‚¤ãƒ³ãƒˆ";s:3:"㌾";s:9:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"ã€";s:9:"ãƒãƒ³ãƒ‰";s:3:"ã";s:9:"ホール";s:3:"ã‚";s:9:"ホーン";s:3:"ãƒ";s:12:"マイクロ";s:3:"ã„";s:9:"マイル";s:3:"ã…";s:9:"マッãƒ";s:3:"ã†";s:9:"マルク";s:3:"ã‡";s:15:"マンション";s:3:"ãˆ";s:12:"ミクロン";s:3:"ã‰";s:6:"ミリ";s:3:"ãŠ";s:15:"ミリãƒãƒ¼ãƒ«";s:3:"ã‹";s:6:"メガ";s:3:"ãŒ";s:12:"メガトン";s:3:"ã";s:12:"メートル";s:3:"ãŽ";s:9:"ヤード";s:3:"ã";s:9:"ヤール";s:3:"ã";s:9:"ユアン";s:3:"ã‘";s:12:"リットル";s:3:"ã’";s:6:"リラ";s:3:"ã“";s:9:"ルピー";s:3:"ã”";s:12:"ルーブル";s:3:"ã•";s:6:"レム";s:3:"ã–";s:15:"レントゲン";s:3:"ã—";s:9:"ワット";s:3:"ã˜";s:4:"0点";s:3:"ã™";s:4:"1点";s:3:"ãš";s:4:"2点";s:3:"ã›";s:4:"3点";s:3:"ãœ";s:4:"4点";s:3:"ã";s:4:"5点";s:3:"ãž";s:4:"6点";s:3:"ãŸ";s:4:"7点";s:3:"ã ";s:4:"8点";s:3:"ã¡";s:4:"9点";s:3:"ã¢";s:5:"10点";s:3:"ã£";s:5:"11点";s:3:"ã¤";s:5:"12点";s:3:"ã¥";s:5:"13点";s:3:"ã¦";s:5:"14点";s:3:"ã§";s:5:"15点";s:3:"ã¨";s:5:"16点";s:3:"ã©";s:5:"17点";s:3:"ãª";s:5:"18点";s:3:"ã«";s:5:"19点";s:3:"ã¬";s:5:"20点";s:3:"ã­";s:5:"21点";s:3:"ã®";s:5:"22点";s:3:"ã¯";s:5:"23点";s:3:"ã°";s:5:"24点";s:3:"ã±";s:3:"hPa";s:3:"ã²";s:2:"da";s:3:"ã³";s:2:"AU";s:3:"ã´";s:3:"bar";s:3:"ãµ";s:2:"oV";s:3:"ã¶";s:2:"pc";s:3:"ã·";s:2:"dm";s:3:"ã¸";s:4:"dm²";s:3:"ã¹";s:4:"dm³";s:3:"ãº";s:2:"IU";s:3:"ã»";s:6:"å¹³æˆ";s:3:"ã¼";s:6:"昭和";s:3:"ã½";s:6:"大正";s:3:"ã¾";s:6:"明治";s:3:"ã¿";s:12:"æ ªå¼ä¼šç¤¾";s:3:"㎀";s:2:"pA";s:3:"ãŽ";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"ãŽ";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"ãŽ";s:2:"kg";s:3:"ãŽ";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:5:"μℓ";s:3:"㎖";s:4:"mâ„“";s:3:"㎗";s:4:"dâ„“";s:3:"㎘";s:4:"kâ„“";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"ãŽ";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:4:"mm²";s:3:"㎠";s:4:"cm²";s:3:"㎡";s:3:"m²";s:3:"㎢";s:4:"km²";s:3:"㎣";s:4:"mm³";s:3:"㎤";s:4:"cm³";s:3:"㎥";s:3:"m³";s:3:"㎦";s:4:"km³";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:7:"m∕s²";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:9:"rad∕s²";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"ã€";s:3:"kΩ";s:3:"ã";s:3:"MΩ";s:3:"ã‚";s:4:"a.m.";s:3:"ãƒ";s:2:"Bq";s:3:"ã„";s:2:"cc";s:3:"ã…";s:2:"cd";s:3:"ã†";s:6:"C∕kg";s:3:"ã‡";s:3:"Co.";s:3:"ãˆ";s:2:"dB";s:3:"ã‰";s:2:"Gy";s:3:"ãŠ";s:2:"ha";s:3:"ã‹";s:2:"HP";s:3:"ãŒ";s:2:"in";s:3:"ã";s:2:"KK";s:3:"ãŽ";s:2:"KM";s:3:"ã";s:2:"kt";s:3:"ã";s:2:"lm";s:3:"ã‘";s:2:"ln";s:3:"ã’";s:3:"log";s:3:"ã“";s:2:"lx";s:3:"ã”";s:2:"mb";s:3:"ã•";s:3:"mil";s:3:"ã–";s:3:"mol";s:3:"ã—";s:2:"PH";s:3:"ã˜";s:4:"p.m.";s:3:"ã™";s:3:"PPM";s:3:"ãš";s:2:"PR";s:3:"ã›";s:2:"sr";s:3:"ãœ";s:2:"Sv";s:3:"ã";s:2:"Wb";s:3:"ãž";s:5:"V∕m";s:3:"ãŸ";s:5:"A∕m";s:3:"ã ";s:4:"1æ—¥";s:3:"ã¡";s:4:"2æ—¥";s:3:"ã¢";s:4:"3æ—¥";s:3:"ã£";s:4:"4æ—¥";s:3:"ã¤";s:4:"5æ—¥";s:3:"ã¥";s:4:"6æ—¥";s:3:"ã¦";s:4:"7æ—¥";s:3:"ã§";s:4:"8æ—¥";s:3:"ã¨";s:4:"9æ—¥";s:3:"ã©";s:5:"10æ—¥";s:3:"ãª";s:5:"11æ—¥";s:3:"ã«";s:5:"12æ—¥";s:3:"ã¬";s:5:"13æ—¥";s:3:"ã­";s:5:"14æ—¥";s:3:"ã®";s:5:"15æ—¥";s:3:"ã¯";s:5:"16æ—¥";s:3:"ã°";s:5:"17æ—¥";s:3:"ã±";s:5:"18æ—¥";s:3:"ã²";s:5:"19æ—¥";s:3:"ã³";s:5:"20æ—¥";s:3:"ã´";s:5:"21æ—¥";s:3:"ãµ";s:5:"22æ—¥";s:3:"ã¶";s:5:"23æ—¥";s:3:"ã·";s:5:"24æ—¥";s:3:"ã¸";s:5:"25æ—¥";s:3:"ã¹";s:5:"26æ—¥";s:3:"ãº";s:5:"27æ—¥";s:3:"ã»";s:5:"28æ—¥";s:3:"ã¼";s:5:"29æ—¥";s:3:"ã½";s:5:"30æ—¥";s:3:"ã¾";s:5:"31æ—¥";s:3:"ã¿";s:3:"gal";s:3:"豈";s:3:"豈";s:3:"ï¤";s:3:"æ›´";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"å¥";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"å–‡";s:3:"奈";s:3:"奈";s:3:"ï¤";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"ï¤";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"é‚";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"æ´›";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"çž";s:3:"落";s:3:"è½";s:3:"酪";s:3:"é…ª";s:3:"駱";s:3:"é§±";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"åµ";s:3:"ï¤";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"åµ";s:3:"濫";s:3:"æ¿«";s:3:"藍";s:3:"è—";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"è Ÿ";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"æ“„";s:3:"櫓";s:3:"æ«“";s:3:"爐";s:3:"çˆ";s:3:"盧";s:3:"ç›§";s:3:"老";s:3:"è€";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"è·¯";s:3:"露";s:3:"露";s:3:"魯";s:3:"é­¯";s:3:"鷺";s:3:"é·º";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"ç¶ ";s:3:"菉";s:3:"è‰";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"ï¥";s:3:"è«–";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"ç± ";s:3:"聾";s:3:"è¾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"é›·";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"å±¢";s:3:"樓";s:3:"樓";s:3:"ï¥";s:3:"æ·š";s:3:"漏";s:3:"æ¼";s:3:"ï¥";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"å‹’";s:3:"肋";s:3:"è‚‹";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"ç¶¾";s:3:"菱";s:3:"è±";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"æ‹";s:3:"樂";s:3:"樂";s:3:"ï¥";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"ç•°";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"ä¸";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"ç´¢";s:3:"參";s:3:"åƒ";s:3:"塞";s:3:"塞";s:3:"省";s:3:"çœ";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"è¾°";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"è‹¥";s:3:"掠";s:3:"掠";s:3:"略";s:3:"ç•¥";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"å…©";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"æ¢";s:3:"糧";s:3:"ç³§";s:3:"良";s:3:"良";s:3:"諒";s:3:"è«’";s:3:"量";s:3:"é‡";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"å‘‚";s:3:"ï¦";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"æ—…";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"é–­";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"æ­·";s:3:"ï¦";s:3:"è½¢";s:3:"年";s:3:"å¹´";s:3:"ï¦";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"撚";s:3:"æ’š";s:3:"漣";s:3:"æ¼£";s:3:"煉";s:3:"ç…‰";s:3:"璉";s:3:"ç’‰";s:3:"秊";s:3:"ç§Š";s:3:"練";s:3:"ç·´";s:3:"聯";s:3:"è¯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"è“®";s:3:"連";s:3:"連";s:3:"鍊";s:3:"éŠ";s:3:"列";s:3:"列";s:3:"ï¦";s:3:"劣";s:3:"咽";s:3:"å’½";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"æ»";s:3:"殮";s:3:"æ®®";s:3:"簾";s:3:"ç°¾";s:3:"獵";s:3:"çµ";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"ç‘©";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"è†";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"é›¶";s:3:"靈";s:3:"éˆ";s:3:"領";s:3:"é ˜";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"å°¿";s:3:"料";s:3:"æ–™";s:3:"樂";s:3:"樂";s:3:"ï§€";s:3:"燎";s:3:"ï§";s:3:"療";s:3:"ï§‚";s:3:"蓼";s:3:"遼";s:3:"é¼";s:3:"ï§„";s:3:"é¾";s:3:"ï§…";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"æ»";s:3:"柳";s:3:"柳";s:3:"ï§Š";s:3:"æµ";s:3:"ï§‹";s:3:"溜";s:3:"ï§Œ";s:3:"ç‰";s:3:"ï§";s:3:"ç•™";s:3:"ï§Ž";s:3:"ç¡«";s:3:"ï§";s:3:"ç´";s:3:"ï§";s:3:"類";s:3:"ï§‘";s:3:"å…­";s:3:"ï§’";s:3:"戮";s:3:"ï§“";s:3:"陸";s:3:"ï§”";s:3:"倫";s:3:"ï§•";s:3:"å´™";s:3:"ï§–";s:3:"æ·ª";s:3:"ï§—";s:3:"輪";s:3:"律";s:3:"律";s:3:"ï§™";s:3:"æ…„";s:3:"ï§š";s:3:"æ —";s:3:"ï§›";s:3:"率";s:3:"ï§œ";s:3:"隆";s:3:"ï§";s:3:"利";s:3:"ï§ž";s:3:"å";s:3:"ï§Ÿ";s:3:"å±¥";s:3:"ï§ ";s:3:"易";s:3:"ï§¡";s:3:"æŽ";s:3:"ï§¢";s:3:"梨";s:3:"ï§£";s:3:"æ³¥";s:3:"理";s:3:"ç†";s:3:"ï§¥";s:3:"ç—¢";s:3:"罹";s:3:"ç½¹";s:3:"ï§§";s:3:"è£";s:3:"裡";s:3:"裡";s:3:"ï§©";s:3:"里";s:3:"離";s:3:"離";s:3:"ï§«";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"ï§­";s:3:"å";s:3:"ï§®";s:3:"ç‡";s:3:"璘";s:3:"ç’˜";s:3:"ï§°";s:3:"è—º";s:3:"ï§±";s:3:"隣";s:3:"ï§²";s:3:"é±—";s:3:"ï§³";s:3:"麟";s:3:"ï§´";s:3:"æž—";s:3:"ï§µ";s:3:"æ·‹";s:3:"ï§¶";s:3:"臨";s:3:"ï§·";s:3:"ç«‹";s:3:"笠";s:3:"笠";s:3:"ï§¹";s:3:"ç²’";s:3:"狀";s:3:"ç‹€";s:3:"ï§»";s:3:"ç‚™";s:3:"ï§¼";s:3:"è­˜";s:3:"ï§½";s:3:"什";s:3:"ï§¾";s:3:"茶";s:3:"ï§¿";s:3:"刺";s:3:"切";s:3:"切";s:3:"ï¨";s:3:"度";s:3:"拓";s:3:"æ‹“";s:3:"糖";s:3:"ç³–";s:3:"宅";s:3:"å®…";s:3:"洞";s:3:"æ´ž";s:3:"暴";s:3:"æš´";s:3:"輻";s:3:"è¼»";s:3:"行";s:3:"行";s:3:"降";s:3:"é™";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"å…€";s:3:"ï¨";s:3:"å—€";s:3:"﨎";s:1:"";s:3:"ï¨";s:1:"";s:3:"ï¨";s:3:"塚";s:3:"﨑";s:1:"";s:3:"晴";s:3:"æ™´";s:3:"﨓";s:1:"";s:3:"﨔";s:1:"";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"ç¦";s:3:"靖";s:3:"é–";s:3:"ï¨";s:3:"ç²¾";s:3:"羽";s:3:"ç¾½";s:3:"﨟";s:1:"";s:3:"蘒";s:3:"蘒";s:3:"﨡";s:1:"";s:3:"諸";s:3:"諸";s:3:"﨣";s:1:"";s:3:"﨤";s:1:"";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"﨧";s:1:"";s:3:"﨨";s:1:"";s:3:"﨩";s:1:"";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"é¶´";s:3:"郞";s:3:"郞";s:3:"隷";s:3:"éš·";s:3:"侮";s:3:"ä¾®";s:3:"僧";s:3:"僧";s:3:"免";s:3:"å…";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"å‘";s:3:"喝";s:3:"å–";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"å¡€";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"å±®";s:3:"悔";s:3:"æ‚”";s:3:"慨";s:3:"æ…¨";s:3:"憎";s:3:"憎";s:3:"ï©€";s:3:"懲";s:3:"ï©";s:3:"æ•";s:3:"ï©‚";s:3:"æ—¢";s:3:"暑";s:3:"æš‘";s:3:"ï©„";s:3:"梅";s:3:"ï©…";s:3:"æµ·";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"æ¼¢";s:3:"煮";s:3:"ç…®";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"ç¢";s:3:"ï©‹";s:3:"碑";s:3:"社";s:3:"社";s:3:"ï©";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"ï©";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:3:"ï©‘";s:3:"ç¥";s:3:"ï©’";s:3:"ç¦";s:3:"ï©“";s:3:"禎";s:3:"ï©”";s:3:"ç©€";s:3:"ï©•";s:3:"çª";s:3:"ï©–";s:3:"節";s:3:"ï©—";s:3:"ç·´";s:3:"縉";s:3:"縉";s:3:"ï©™";s:3:"ç¹";s:3:"署";s:3:"ç½²";s:3:"ï©›";s:3:"者";s:3:"臭";s:3:"臭";s:3:"ï©";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"è‘—";s:3:"ï© ";s:3:"è¤";s:3:"ï©¡";s:3:"視";s:3:"ï©¢";s:3:"è¬";s:3:"ï©£";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"ï©¥";s:3:"è´ˆ";s:3:"辶";s:3:"è¾¶";s:3:"ï©§";s:3:"逸";s:3:"難";s:3:"難";s:3:"ï©©";s:3:"響";s:3:"頻";s:3:"é »";s:3:"ï©«";s:3:"æµ";s:3:"𤋮";s:4:"𤋮";s:3:"ï©­";s:3:"舘";s:3:"ï©°";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"å…¨";s:3:"侀";s:3:"ä¾€";s:3:"ï©´";s:3:"å……";s:3:"冀";s:3:"冀";s:3:"ï©¶";s:3:"勇";s:3:"ï©·";s:3:"勺";s:3:"喝";s:3:"å–";s:3:"啕";s:3:"å••";s:3:"喙";s:3:"å–™";s:3:"ï©»";s:3:"å—¢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"ï©¿";s:3:"奔";s:3:"婢";s:3:"å©¢";s:3:"ïª";s:3:"嬨";s:3:"廒";s:3:"å»’";s:3:"廙";s:3:"å»™";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"å¾­";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"æ…Ž";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"æ… ";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"ïª";s:3:"æ„";s:3:"搜";s:3:"æœ";s:3:"ïª";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"晴";s:3:"æ™´";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"æ–";s:3:"歹";s:3:"æ­¹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"æµ";s:3:"滛";s:3:"æ»›";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"æ¼¢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"ç…®";s:3:"ïª";s:3:"çž§";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"ç”»";s:3:"瘝";s:3:"ç˜";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"ç››";s:3:"直";s:3:"ç›´";s:3:"睊";s:3:"çŠ";s:3:"着";s:3:"ç€";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"ç±»";s:3:"絛";s:3:"çµ›";s:3:"練";s:3:"ç·´";s:3:"缾";s:3:"ç¼¾";s:3:"者";s:3:"者";s:3:"荒";s:3:"è’";s:3:"華";s:3:"è¯";s:3:"蝹";s:3:"è¹";s:3:"襁";s:3:"è¥";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"è«‹";s:3:"謁";s:3:"è¬";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"è«­";s:3:"謹";s:3:"謹";s:3:"ï«€";s:3:"變";s:3:"ï«";s:3:"è´ˆ";s:3:"ï«‚";s:3:"輸";s:3:"遲";s:3:"é²";s:3:"ï«„";s:3:"醙";s:3:"ï«…";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"é–";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"ï«‹";s:3:"é ‹";s:3:"頻";s:3:"é »";s:3:"ï«";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"ï«";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«‘";s:4:"ð£•";s:3:"ï«’";s:3:"ã®";s:3:"ï«“";s:3:"䀘";s:3:"ï«”";s:3:"䀹";s:3:"ï«•";s:4:"𥉉";s:3:"ï«–";s:4:"ð¥³";s:3:"ï«—";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"ï«™";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"ï¬";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:3:"Å¿t";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"Õ´Õ¶";s:3:"ﬔ";s:4:"Õ´Õ¥";s:3:"ﬕ";s:4:"Õ´Õ«";s:3:"ﬖ";s:4:"Õ¾Õ¶";s:3:"ﬗ";s:4:"Õ´Õ­";s:3:"ﬠ";s:2:"×¢";s:3:"ﬡ";s:2:"×";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"×”";s:3:"ﬤ";s:2:"×›";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"×";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"ï­";s:4:"×ל";s:3:"﹉";s:3:"‾";s:3:"﹊";s:3:"‾";s:3:"﹋";s:3:"‾";s:3:"﹌";s:3:"‾";s:3:"ï¹";s:1:"_";s:3:"﹎";s:1:"_";s:3:"ï¹";s:1:"_";s:3:"ï¹";s:1:",";s:3:"﹑";s:3:"ã€";s:3:"ï¹’";s:1:".";s:3:"ï¹”";s:1:";";s:3:"﹕";s:1:":";s:3:"ï¹–";s:1:"?";s:3:"ï¹—";s:1:"!";s:3:"﹘";s:3:"—";s:3:"ï¹™";s:1:"(";s:3:"﹚";s:1:")";s:3:"ï¹›";s:1:"{";s:3:"﹜";s:1:"}";s:3:"ï¹";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"ï¹ ";s:1:"&";s:3:"﹡";s:1:"*";s:3:"ï¹¢";s:1:"+";s:3:"ï¹£";s:1:"-";s:3:"﹤";s:1:"<";s:3:"ï¹¥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ï¼";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"ï¼…";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"ï¼";s:1:"-";s:3:".";s:1:".";s:3:"ï¼";s:1:"/";s:3:"ï¼";s:1:"0";s:3:"1";s:1:"1";s:3:"ï¼’";s:1:"2";s:3:"3";s:1:"3";s:3:"ï¼”";s:1:"4";s:3:"5";s:1:"5";s:3:"ï¼–";s:1:"6";s:3:"ï¼—";s:1:"7";s:3:"8";s:1:"8";s:3:"ï¼™";s:1:"9";s:3:":";s:1:":";s:3:"ï¼›";s:1:";";s:3:"<";s:1:"<";s:3:"ï¼";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"ï¼ ";s:1:"@";s:3:"A";s:1:"A";s:3:"ï¼¢";s:1:"B";s:3:"ï¼£";s:1:"C";s:3:"D";s:1:"D";s:3:"ï¼¥";s:1:"E";s:3:"F";s:1:"F";s:3:"ï¼§";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"ï¼­";s:1:"M";s:3:"ï¼®";s:1:"N";s:3:"O";s:1:"O";s:3:"ï¼°";s:1:"P";s:3:"ï¼±";s:1:"Q";s:3:"ï¼²";s:1:"R";s:3:"ï¼³";s:1:"S";s:3:"ï¼´";s:1:"T";s:3:"ï¼µ";s:1:"U";s:3:"ï¼¶";s:1:"V";s:3:"ï¼·";s:1:"W";s:3:"X";s:1:"X";s:3:"ï¼¹";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"ï¼»";s:1:"[";s:3:"ï¼¼";s:1:"\";s:3:"ï¼½";s:1:"]";s:3:"ï¼¾";s:1:"^";s:3:"_";s:1:"_";s:3:"ï½€";s:1:"`";s:3:"ï½";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"ï½…";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"ï½";s:1:"m";s:3:"n";s:1:"n";s:3:"ï½";s:1:"o";s:3:"ï½";s:1:"p";s:3:"q";s:1:"q";s:3:"ï½’";s:1:"r";s:3:"s";s:1:"s";s:3:"ï½”";s:1:"t";s:3:"u";s:1:"u";s:3:"ï½–";s:1:"v";s:3:"ï½—";s:1:"w";s:3:"x";s:1:"x";s:3:"ï½™";s:1:"y";s:3:"z";s:1:"z";s:3:"ï½›";s:1:"{";s:3:"|";s:1:"|";s:3:"ï½";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"ï½ ";s:3:"⦆";s:3:"。";s:3:"。";s:3:"ï½¢";s:3:"「";s:3:"ï½£";s:3:"ã€";s:3:"、";s:3:"ã€";s:3:"ï½¥";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ï½§";s:3:"ã‚¡";s:3:"ィ";s:3:"ã‚£";s:3:"ゥ";s:3:"ã‚¥";s:3:"ェ";s:3:"ã‚§";s:3:"ォ";s:3:"ã‚©";s:3:"ャ";s:3:"ャ";s:3:"ï½­";s:3:"ュ";s:3:"ï½®";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ï½°";s:3:"ー";s:3:"ï½±";s:3:"ã‚¢";s:3:"ï½²";s:3:"イ";s:3:"ï½³";s:3:"ウ";s:3:"ï½´";s:3:"エ";s:3:"ï½µ";s:3:"オ";s:3:"ï½¶";s:3:"ã‚«";s:3:"ï½·";s:3:"ã‚­";s:3:"ク";s:3:"ク";s:3:"ï½¹";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"ï½»";s:3:"サ";s:3:"ï½¼";s:3:"ã‚·";s:3:"ï½½";s:3:"ス";s:3:"ï½¾";s:3:"ã‚»";s:3:"ソ";s:3:"ソ";s:3:"ï¾€";s:3:"ã‚¿";s:3:"ï¾";s:3:"ãƒ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ï¾…";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ãƒ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ãƒ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ï¾";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"ï¾";s:3:"マ";s:3:"ï¾";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"ï¾’";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ï¾”";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ï¾–";s:3:"ヨ";s:3:"ï¾—";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ï¾™";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ï¾›";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ï¾";s:3:"ン";s:3:"゙";s:3:"ã‚™";s:3:"゚";s:3:"゚";s:3:"ï¾ ";s:3:"ã…¤";s:3:"ᄀ";s:3:"ㄱ";s:3:"ï¾¢";s:3:"ㄲ";s:3:"ï¾£";s:3:"ㄳ";s:3:"ᄂ";s:3:"ã„´";s:3:"ï¾¥";s:3:"ㄵ";s:3:"ᆭ";s:3:"ã„¶";s:3:"ï¾§";s:3:"ã„·";s:3:"ᄄ";s:3:"ㄸ";s:3:"ᄅ";s:3:"ㄹ";s:3:"ᆰ";s:3:"ㄺ";s:3:"ᆱ";s:3:"ã„»";s:3:"ᆲ";s:3:"ㄼ";s:3:"ï¾­";s:3:"ㄽ";s:3:"ï¾®";s:3:"ㄾ";s:3:"ᆵ";s:3:"ã„¿";s:3:"ï¾°";s:3:"ã…€";s:3:"ï¾±";s:3:"ã…";s:3:"ï¾²";s:3:"ã…‚";s:3:"ï¾³";s:3:"ã…ƒ";s:3:"ï¾´";s:3:"ã…„";s:3:"ï¾µ";s:3:"ã……";s:3:"ï¾¶";s:3:"ã…†";s:3:"ï¾·";s:3:"ã…‡";s:3:"ᄌ";s:3:"ã…ˆ";s:3:"ï¾¹";s:3:"ã…‰";s:3:"ᄎ";s:3:"ã…Š";s:3:"ï¾»";s:3:"ã…‹";s:3:"ï¾¼";s:3:"ã…Œ";s:3:"ï¾½";s:3:"ã…";s:3:"ï¾¾";s:3:"ã…Ž";s:3:"ï¿‚";s:3:"ã…";s:3:"ᅢ";s:3:"ã…";s:3:"ï¿„";s:3:"ã…‘";s:3:"ï¿…";s:3:"ã…’";s:3:"ᅥ";s:3:"ã…“";s:3:"ᅦ";s:3:"ã…”";s:3:"ᅧ";s:3:"ã…•";s:3:"ï¿‹";s:3:"ã…–";s:3:"ᅩ";s:3:"ã…—";s:3:"ï¿";s:3:"ã…˜";s:3:"ᅫ";s:3:"ã…™";s:3:"ï¿";s:3:"ã…š";s:3:"ï¿’";s:3:"ã…›";s:3:"ï¿“";s:3:"ã…œ";s:3:"ï¿”";s:3:"ã…";s:3:"ï¿•";s:3:"ã…ž";s:3:"ï¿–";s:3:"ã…Ÿ";s:3:"ï¿—";s:3:"ã… ";s:3:"ᅳ";s:3:"ã…¡";s:3:"ï¿›";s:3:"ã…¢";s:3:"ᅵ";s:3:"ã…£";s:3:"ï¿ ";s:2:"¢";s:3:"ï¿¡";s:2:"£";s:3:"ï¿¢";s:2:"¬";s:3:"ï¿£";s:2:"¯";s:3:"¦";s:2:"¦";s:3:"ï¿¥";s:2:"Â¥";s:3:"₩";s:3:"â‚©";s:3:"│";s:3:"│";s:3:"ï¿©";s:3:"â†";s:3:"↑";s:3:"↑";s:3:"ï¿«";s:3:"→";s:3:"↓";s:3:"↓";s:3:"ï¿­";s:3:"â– ";s:3:"ï¿®";s:3:"â—‹";s:4:"ð€";s:1:"A";s:4:"ð";s:1:"B";s:4:"ð‚";s:1:"C";s:4:"ðƒ";s:1:"D";s:4:"ð„";s:1:"E";s:4:"ð…";s:1:"F";s:4:"ð†";s:1:"G";s:4:"ð‡";s:1:"H";s:4:"ðˆ";s:1:"I";s:4:"ð‰";s:1:"J";s:4:"ðŠ";s:1:"K";s:4:"ð‹";s:1:"L";s:4:"ðŒ";s:1:"M";s:4:"ð";s:1:"N";s:4:"ðŽ";s:1:"O";s:4:"ð";s:1:"P";s:4:"ð";s:1:"Q";s:4:"ð‘";s:1:"R";s:4:"ð’";s:1:"S";s:4:"ð“";s:1:"T";s:4:"ð”";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð–";s:1:"W";s:4:"ð—";s:1:"X";s:4:"ð˜";s:1:"Y";s:4:"ð™";s:1:"Z";s:4:"ðš";s:1:"a";s:4:"ð›";s:1:"b";s:4:"ðœ";s:1:"c";s:4:"ð";s:1:"d";s:4:"ðž";s:1:"e";s:4:"ðŸ";s:1:"f";s:4:"ð ";s:1:"g";s:4:"ð¡";s:1:"h";s:4:"ð¢";s:1:"i";s:4:"ð£";s:1:"j";s:4:"ð¤";s:1:"k";s:4:"ð¥";s:1:"l";s:4:"ð¦";s:1:"m";s:4:"ð§";s:1:"n";s:4:"ð¨";s:1:"o";s:4:"ð©";s:1:"p";s:4:"ðª";s:1:"q";s:4:"ð«";s:1:"r";s:4:"ð¬";s:1:"s";s:4:"ð­";s:1:"t";s:4:"ð®";s:1:"u";s:4:"ð¯";s:1:"v";s:4:"ð°";s:1:"w";s:4:"ð±";s:1:"x";s:4:"ð²";s:1:"y";s:4:"ð³";s:1:"z";s:4:"ð´";s:1:"A";s:4:"ðµ";s:1:"B";s:4:"ð¶";s:1:"C";s:4:"ð·";s:1:"D";s:4:"ð¸";s:1:"E";s:4:"ð¹";s:1:"F";s:4:"ðº";s:1:"G";s:4:"ð»";s:1:"H";s:4:"ð¼";s:1:"I";s:4:"ð½";s:1:"J";s:4:"ð¾";s:1:"K";s:4:"ð¿";s:1:"L";s:4:"ð‘€";s:1:"M";s:4:"ð‘";s:1:"N";s:4:"ð‘‚";s:1:"O";s:4:"ð‘ƒ";s:1:"P";s:4:"ð‘„";s:1:"Q";s:4:"ð‘…";s:1:"R";s:4:"ð‘†";s:1:"S";s:4:"ð‘‡";s:1:"T";s:4:"ð‘ˆ";s:1:"U";s:4:"ð‘‰";s:1:"V";s:4:"ð‘Š";s:1:"W";s:4:"ð‘‹";s:1:"X";s:4:"ð‘Œ";s:1:"Y";s:4:"ð‘";s:1:"Z";s:4:"ð‘Ž";s:1:"a";s:4:"ð‘";s:1:"b";s:4:"ð‘";s:1:"c";s:4:"ð‘‘";s:1:"d";s:4:"ð‘’";s:1:"e";s:4:"ð‘“";s:1:"f";s:4:"ð‘”";s:1:"g";s:4:"ð‘–";s:1:"i";s:4:"ð‘—";s:1:"j";s:4:"ð‘˜";s:1:"k";s:4:"ð‘™";s:1:"l";s:4:"ð‘š";s:1:"m";s:4:"ð‘›";s:1:"n";s:4:"ð‘œ";s:1:"o";s:4:"ð‘";s:1:"p";s:4:"ð‘ž";s:1:"q";s:4:"ð‘Ÿ";s:1:"r";s:4:"ð‘ ";s:1:"s";s:4:"ð‘¡";s:1:"t";s:4:"ð‘¢";s:1:"u";s:4:"ð‘£";s:1:"v";s:4:"ð‘¤";s:1:"w";s:4:"ð‘¥";s:1:"x";s:4:"ð‘¦";s:1:"y";s:4:"ð‘§";s:1:"z";s:4:"ð‘¨";s:1:"A";s:4:"ð‘©";s:1:"B";s:4:"ð‘ª";s:1:"C";s:4:"ð‘«";s:1:"D";s:4:"ð‘¬";s:1:"E";s:4:"ð‘­";s:1:"F";s:4:"ð‘®";s:1:"G";s:4:"ð‘¯";s:1:"H";s:4:"ð‘°";s:1:"I";s:4:"ð‘±";s:1:"J";s:4:"ð‘²";s:1:"K";s:4:"ð‘³";s:1:"L";s:4:"ð‘´";s:1:"M";s:4:"ð‘µ";s:1:"N";s:4:"ð‘¶";s:1:"O";s:4:"ð‘·";s:1:"P";s:4:"ð‘¸";s:1:"Q";s:4:"ð‘¹";s:1:"R";s:4:"ð‘º";s:1:"S";s:4:"ð‘»";s:1:"T";s:4:"ð‘¼";s:1:"U";s:4:"ð‘½";s:1:"V";s:4:"ð‘¾";s:1:"W";s:4:"ð‘¿";s:1:"X";s:4:"ð’€";s:1:"Y";s:4:"ð’";s:1:"Z";s:4:"ð’‚";s:1:"a";s:4:"ð’ƒ";s:1:"b";s:4:"ð’„";s:1:"c";s:4:"ð’…";s:1:"d";s:4:"ð’†";s:1:"e";s:4:"ð’‡";s:1:"f";s:4:"ð’ˆ";s:1:"g";s:4:"ð’‰";s:1:"h";s:4:"ð’Š";s:1:"i";s:4:"ð’‹";s:1:"j";s:4:"ð’Œ";s:1:"k";s:4:"ð’";s:1:"l";s:4:"ð’Ž";s:1:"m";s:4:"ð’";s:1:"n";s:4:"ð’";s:1:"o";s:4:"ð’‘";s:1:"p";s:4:"ð’’";s:1:"q";s:4:"ð’“";s:1:"r";s:4:"ð’”";s:1:"s";s:4:"ð’•";s:1:"t";s:4:"ð’–";s:1:"u";s:4:"ð’—";s:1:"v";s:4:"ð’˜";s:1:"w";s:4:"ð’™";s:1:"x";s:4:"ð’š";s:1:"y";s:4:"ð’›";s:1:"z";s:4:"ð’œ";s:1:"A";s:4:"ð’ž";s:1:"C";s:4:"ð’Ÿ";s:1:"D";s:4:"ð’¢";s:1:"G";s:4:"ð’¥";s:1:"J";s:4:"ð’¦";s:1:"K";s:4:"ð’©";s:1:"N";s:4:"ð’ª";s:1:"O";s:4:"ð’«";s:1:"P";s:4:"ð’¬";s:1:"Q";s:4:"ð’®";s:1:"S";s:4:"ð’¯";s:1:"T";s:4:"ð’°";s:1:"U";s:4:"ð’±";s:1:"V";s:4:"ð’²";s:1:"W";s:4:"ð’³";s:1:"X";s:4:"ð’´";s:1:"Y";s:4:"ð’µ";s:1:"Z";s:4:"ð’¶";s:1:"a";s:4:"ð’·";s:1:"b";s:4:"ð’¸";s:1:"c";s:4:"ð’¹";s:1:"d";s:4:"ð’»";s:1:"f";s:4:"ð’½";s:1:"h";s:4:"ð’¾";s:1:"i";s:4:"ð’¿";s:1:"j";s:4:"ð“€";s:1:"k";s:4:"ð“";s:1:"l";s:4:"ð“‚";s:1:"m";s:4:"ð“ƒ";s:1:"n";s:4:"ð“…";s:1:"p";s:4:"ð“†";s:1:"q";s:4:"ð“‡";s:1:"r";s:4:"ð“ˆ";s:1:"s";s:4:"ð“‰";s:1:"t";s:4:"ð“Š";s:1:"u";s:4:"ð“‹";s:1:"v";s:4:"ð“Œ";s:1:"w";s:4:"ð“";s:1:"x";s:4:"ð“Ž";s:1:"y";s:4:"ð“";s:1:"z";s:4:"ð“";s:1:"A";s:4:"ð“‘";s:1:"B";s:4:"ð“’";s:1:"C";s:4:"ð““";s:1:"D";s:4:"ð“”";s:1:"E";s:4:"ð“•";s:1:"F";s:4:"ð“–";s:1:"G";s:4:"ð“—";s:1:"H";s:4:"ð“˜";s:1:"I";s:4:"ð“™";s:1:"J";s:4:"ð“š";s:1:"K";s:4:"ð“›";s:1:"L";s:4:"ð“œ";s:1:"M";s:4:"ð“";s:1:"N";s:4:"ð“ž";s:1:"O";s:4:"ð“Ÿ";s:1:"P";s:4:"ð“ ";s:1:"Q";s:4:"ð“¡";s:1:"R";s:4:"ð“¢";s:1:"S";s:4:"ð“£";s:1:"T";s:4:"ð“¤";s:1:"U";s:4:"ð“¥";s:1:"V";s:4:"ð“¦";s:1:"W";s:4:"ð“§";s:1:"X";s:4:"ð“¨";s:1:"Y";s:4:"ð“©";s:1:"Z";s:4:"ð“ª";s:1:"a";s:4:"ð“«";s:1:"b";s:4:"ð“¬";s:1:"c";s:4:"ð“­";s:1:"d";s:4:"ð“®";s:1:"e";s:4:"ð“¯";s:1:"f";s:4:"ð“°";s:1:"g";s:4:"ð“±";s:1:"h";s:4:"ð“²";s:1:"i";s:4:"ð“³";s:1:"j";s:4:"ð“´";s:1:"k";s:4:"ð“µ";s:1:"l";s:4:"ð“¶";s:1:"m";s:4:"ð“·";s:1:"n";s:4:"ð“¸";s:1:"o";s:4:"ð“¹";s:1:"p";s:4:"ð“º";s:1:"q";s:4:"ð“»";s:1:"r";s:4:"ð“¼";s:1:"s";s:4:"ð“½";s:1:"t";s:4:"ð“¾";s:1:"u";s:4:"ð“¿";s:1:"v";s:4:"ð”€";s:1:"w";s:4:"ð”";s:1:"x";s:4:"ð”‚";s:1:"y";s:4:"ð”ƒ";s:1:"z";s:4:"ð”„";s:1:"A";s:4:"ð”…";s:1:"B";s:4:"ð”‡";s:1:"D";s:4:"ð”ˆ";s:1:"E";s:4:"ð”‰";s:1:"F";s:4:"ð”Š";s:1:"G";s:4:"ð”";s:1:"J";s:4:"ð”Ž";s:1:"K";s:4:"ð”";s:1:"L";s:4:"ð”";s:1:"M";s:4:"ð”‘";s:1:"N";s:4:"ð”’";s:1:"O";s:4:"ð”“";s:1:"P";s:4:"ð””";s:1:"Q";s:4:"ð”–";s:1:"S";s:4:"ð”—";s:1:"T";s:4:"ð”˜";s:1:"U";s:4:"ð”™";s:1:"V";s:4:"ð”š";s:1:"W";s:4:"ð”›";s:1:"X";s:4:"ð”œ";s:1:"Y";s:4:"ð”ž";s:1:"a";s:4:"ð”Ÿ";s:1:"b";s:4:"ð” ";s:1:"c";s:4:"ð”¡";s:1:"d";s:4:"ð”¢";s:1:"e";s:4:"ð”£";s:1:"f";s:4:"ð”¤";s:1:"g";s:4:"ð”¥";s:1:"h";s:4:"ð”¦";s:1:"i";s:4:"ð”§";s:1:"j";s:4:"ð”¨";s:1:"k";s:4:"ð”©";s:1:"l";s:4:"ð”ª";s:1:"m";s:4:"ð”«";s:1:"n";s:4:"ð”¬";s:1:"o";s:4:"ð”­";s:1:"p";s:4:"ð”®";s:1:"q";s:4:"ð”¯";s:1:"r";s:4:"ð”°";s:1:"s";s:4:"ð”±";s:1:"t";s:4:"ð”²";s:1:"u";s:4:"ð”³";s:1:"v";s:4:"ð”´";s:1:"w";s:4:"ð”µ";s:1:"x";s:4:"ð”¶";s:1:"y";s:4:"ð”·";s:1:"z";s:4:"ð”¸";s:1:"A";s:4:"ð”¹";s:1:"B";s:4:"ð”»";s:1:"D";s:4:"ð”¼";s:1:"E";s:4:"ð”½";s:1:"F";s:4:"ð”¾";s:1:"G";s:4:"ð•€";s:1:"I";s:4:"ð•";s:1:"J";s:4:"ð•‚";s:1:"K";s:4:"ð•ƒ";s:1:"L";s:4:"ð•„";s:1:"M";s:4:"ð•†";s:1:"O";s:4:"ð•Š";s:1:"S";s:4:"ð•‹";s:1:"T";s:4:"ð•Œ";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð•Ž";s:1:"W";s:4:"ð•";s:1:"X";s:4:"ð•";s:1:"Y";s:4:"ð•’";s:1:"a";s:4:"ð•“";s:1:"b";s:4:"ð•”";s:1:"c";s:4:"ð••";s:1:"d";s:4:"ð•–";s:1:"e";s:4:"ð•—";s:1:"f";s:4:"ð•˜";s:1:"g";s:4:"ð•™";s:1:"h";s:4:"ð•š";s:1:"i";s:4:"ð•›";s:1:"j";s:4:"ð•œ";s:1:"k";s:4:"ð•";s:1:"l";s:4:"ð•ž";s:1:"m";s:4:"ð•Ÿ";s:1:"n";s:4:"ð• ";s:1:"o";s:4:"ð•¡";s:1:"p";s:4:"ð•¢";s:1:"q";s:4:"ð•£";s:1:"r";s:4:"ð•¤";s:1:"s";s:4:"ð•¥";s:1:"t";s:4:"ð•¦";s:1:"u";s:4:"ð•§";s:1:"v";s:4:"ð•¨";s:1:"w";s:4:"ð•©";s:1:"x";s:4:"ð•ª";s:1:"y";s:4:"ð•«";s:1:"z";s:4:"ð•¬";s:1:"A";s:4:"ð•­";s:1:"B";s:4:"ð•®";s:1:"C";s:4:"ð•¯";s:1:"D";s:4:"ð•°";s:1:"E";s:4:"ð•±";s:1:"F";s:4:"ð•²";s:1:"G";s:4:"ð•³";s:1:"H";s:4:"ð•´";s:1:"I";s:4:"ð•µ";s:1:"J";s:4:"ð•¶";s:1:"K";s:4:"ð•·";s:1:"L";s:4:"ð•¸";s:1:"M";s:4:"ð•¹";s:1:"N";s:4:"ð•º";s:1:"O";s:4:"ð•»";s:1:"P";s:4:"ð•¼";s:1:"Q";s:4:"ð•½";s:1:"R";s:4:"ð•¾";s:1:"S";s:4:"ð•¿";s:1:"T";s:4:"ð–€";s:1:"U";s:4:"ð–";s:1:"V";s:4:"ð–‚";s:1:"W";s:4:"ð–ƒ";s:1:"X";s:4:"ð–„";s:1:"Y";s:4:"ð–…";s:1:"Z";s:4:"ð–†";s:1:"a";s:4:"ð–‡";s:1:"b";s:4:"ð–ˆ";s:1:"c";s:4:"ð–‰";s:1:"d";s:4:"ð–Š";s:1:"e";s:4:"ð–‹";s:1:"f";s:4:"ð–Œ";s:1:"g";s:4:"ð–";s:1:"h";s:4:"ð–Ž";s:1:"i";s:4:"ð–";s:1:"j";s:4:"ð–";s:1:"k";s:4:"ð–‘";s:1:"l";s:4:"ð–’";s:1:"m";s:4:"ð–“";s:1:"n";s:4:"ð–”";s:1:"o";s:4:"ð–•";s:1:"p";s:4:"ð––";s:1:"q";s:4:"ð–—";s:1:"r";s:4:"ð–˜";s:1:"s";s:4:"ð–™";s:1:"t";s:4:"ð–š";s:1:"u";s:4:"ð–›";s:1:"v";s:4:"ð–œ";s:1:"w";s:4:"ð–";s:1:"x";s:4:"ð–ž";s:1:"y";s:4:"ð–Ÿ";s:1:"z";s:4:"ð– ";s:1:"A";s:4:"ð–¡";s:1:"B";s:4:"ð–¢";s:1:"C";s:4:"ð–£";s:1:"D";s:4:"ð–¤";s:1:"E";s:4:"ð–¥";s:1:"F";s:4:"ð–¦";s:1:"G";s:4:"ð–§";s:1:"H";s:4:"ð–¨";s:1:"I";s:4:"ð–©";s:1:"J";s:4:"ð–ª";s:1:"K";s:4:"ð–«";s:1:"L";s:4:"ð–¬";s:1:"M";s:4:"ð–­";s:1:"N";s:4:"ð–®";s:1:"O";s:4:"ð–¯";s:1:"P";s:4:"ð–°";s:1:"Q";s:4:"ð–±";s:1:"R";s:4:"ð–²";s:1:"S";s:4:"ð–³";s:1:"T";s:4:"ð–´";s:1:"U";s:4:"ð–µ";s:1:"V";s:4:"ð–¶";s:1:"W";s:4:"ð–·";s:1:"X";s:4:"ð–¸";s:1:"Y";s:4:"ð–¹";s:1:"Z";s:4:"ð–º";s:1:"a";s:4:"ð–»";s:1:"b";s:4:"ð–¼";s:1:"c";s:4:"ð–½";s:1:"d";s:4:"ð–¾";s:1:"e";s:4:"ð–¿";s:1:"f";s:4:"ð—€";s:1:"g";s:4:"ð—";s:1:"h";s:4:"ð—‚";s:1:"i";s:4:"ð—ƒ";s:1:"j";s:4:"ð—„";s:1:"k";s:4:"ð—…";s:1:"l";s:4:"ð—†";s:1:"m";s:4:"ð—‡";s:1:"n";s:4:"ð—ˆ";s:1:"o";s:4:"ð—‰";s:1:"p";s:4:"ð—Š";s:1:"q";s:4:"ð—‹";s:1:"r";s:4:"ð—Œ";s:1:"s";s:4:"ð—";s:1:"t";s:4:"ð—Ž";s:1:"u";s:4:"ð—";s:1:"v";s:4:"ð—";s:1:"w";s:4:"ð—‘";s:1:"x";s:4:"ð—’";s:1:"y";s:4:"ð—“";s:1:"z";s:4:"ð—”";s:1:"A";s:4:"ð—•";s:1:"B";s:4:"ð—–";s:1:"C";s:4:"ð——";s:1:"D";s:4:"ð—˜";s:1:"E";s:4:"ð—™";s:1:"F";s:4:"ð—š";s:1:"G";s:4:"ð—›";s:1:"H";s:4:"ð—œ";s:1:"I";s:4:"ð—";s:1:"J";s:4:"ð—ž";s:1:"K";s:4:"ð—Ÿ";s:1:"L";s:4:"ð— ";s:1:"M";s:4:"ð—¡";s:1:"N";s:4:"ð—¢";s:1:"O";s:4:"ð—£";s:1:"P";s:4:"ð—¤";s:1:"Q";s:4:"ð—¥";s:1:"R";s:4:"ð—¦";s:1:"S";s:4:"ð—§";s:1:"T";s:4:"ð—¨";s:1:"U";s:4:"ð—©";s:1:"V";s:4:"ð—ª";s:1:"W";s:4:"ð—«";s:1:"X";s:4:"ð—¬";s:1:"Y";s:4:"ð—­";s:1:"Z";s:4:"ð—®";s:1:"a";s:4:"ð—¯";s:1:"b";s:4:"ð—°";s:1:"c";s:4:"ð—±";s:1:"d";s:4:"ð—²";s:1:"e";s:4:"ð—³";s:1:"f";s:4:"ð—´";s:1:"g";s:4:"ð—µ";s:1:"h";s:4:"ð—¶";s:1:"i";s:4:"ð—·";s:1:"j";s:4:"ð—¸";s:1:"k";s:4:"ð—¹";s:1:"l";s:4:"ð—º";s:1:"m";s:4:"ð—»";s:1:"n";s:4:"ð—¼";s:1:"o";s:4:"ð—½";s:1:"p";s:4:"ð—¾";s:1:"q";s:4:"ð—¿";s:1:"r";s:4:"ð˜€";s:1:"s";s:4:"ð˜";s:1:"t";s:4:"ð˜‚";s:1:"u";s:4:"ð˜ƒ";s:1:"v";s:4:"ð˜„";s:1:"w";s:4:"ð˜…";s:1:"x";s:4:"ð˜†";s:1:"y";s:4:"ð˜‡";s:1:"z";s:4:"ð˜ˆ";s:1:"A";s:4:"ð˜‰";s:1:"B";s:4:"ð˜Š";s:1:"C";s:4:"ð˜‹";s:1:"D";s:4:"ð˜Œ";s:1:"E";s:4:"ð˜";s:1:"F";s:4:"ð˜Ž";s:1:"G";s:4:"ð˜";s:1:"H";s:4:"ð˜";s:1:"I";s:4:"ð˜‘";s:1:"J";s:4:"ð˜’";s:1:"K";s:4:"ð˜“";s:1:"L";s:4:"ð˜”";s:1:"M";s:4:"ð˜•";s:1:"N";s:4:"ð˜–";s:1:"O";s:4:"ð˜—";s:1:"P";s:4:"ð˜˜";s:1:"Q";s:4:"ð˜™";s:1:"R";s:4:"ð˜š";s:1:"S";s:4:"ð˜›";s:1:"T";s:4:"ð˜œ";s:1:"U";s:4:"ð˜";s:1:"V";s:4:"ð˜ž";s:1:"W";s:4:"ð˜Ÿ";s:1:"X";s:4:"ð˜ ";s:1:"Y";s:4:"ð˜¡";s:1:"Z";s:4:"ð˜¢";s:1:"a";s:4:"ð˜£";s:1:"b";s:4:"ð˜¤";s:1:"c";s:4:"ð˜¥";s:1:"d";s:4:"ð˜¦";s:1:"e";s:4:"ð˜§";s:1:"f";s:4:"ð˜¨";s:1:"g";s:4:"ð˜©";s:1:"h";s:4:"ð˜ª";s:1:"i";s:4:"ð˜«";s:1:"j";s:4:"ð˜¬";s:1:"k";s:4:"ð˜­";s:1:"l";s:4:"ð˜®";s:1:"m";s:4:"ð˜¯";s:1:"n";s:4:"ð˜°";s:1:"o";s:4:"ð˜±";s:1:"p";s:4:"ð˜²";s:1:"q";s:4:"ð˜³";s:1:"r";s:4:"ð˜´";s:1:"s";s:4:"ð˜µ";s:1:"t";s:4:"ð˜¶";s:1:"u";s:4:"ð˜·";s:1:"v";s:4:"ð˜¸";s:1:"w";s:4:"ð˜¹";s:1:"x";s:4:"ð˜º";s:1:"y";s:4:"ð˜»";s:1:"z";s:4:"ð˜¼";s:1:"A";s:4:"ð˜½";s:1:"B";s:4:"ð˜¾";s:1:"C";s:4:"ð˜¿";s:1:"D";s:4:"ð™€";s:1:"E";s:4:"ð™";s:1:"F";s:4:"ð™‚";s:1:"G";s:4:"ð™ƒ";s:1:"H";s:4:"ð™„";s:1:"I";s:4:"ð™…";s:1:"J";s:4:"ð™†";s:1:"K";s:4:"ð™‡";s:1:"L";s:4:"ð™ˆ";s:1:"M";s:4:"ð™‰";s:1:"N";s:4:"ð™Š";s:1:"O";s:4:"ð™‹";s:1:"P";s:4:"ð™Œ";s:1:"Q";s:4:"ð™";s:1:"R";s:4:"ð™Ž";s:1:"S";s:4:"ð™";s:1:"T";s:4:"ð™";s:1:"U";s:4:"ð™‘";s:1:"V";s:4:"ð™’";s:1:"W";s:4:"ð™“";s:1:"X";s:4:"ð™”";s:1:"Y";s:4:"ð™•";s:1:"Z";s:4:"ð™–";s:1:"a";s:4:"ð™—";s:1:"b";s:4:"ð™˜";s:1:"c";s:4:"ð™™";s:1:"d";s:4:"ð™š";s:1:"e";s:4:"ð™›";s:1:"f";s:4:"ð™œ";s:1:"g";s:4:"ð™";s:1:"h";s:4:"ð™ž";s:1:"i";s:4:"ð™Ÿ";s:1:"j";s:4:"ð™ ";s:1:"k";s:4:"ð™¡";s:1:"l";s:4:"ð™¢";s:1:"m";s:4:"ð™£";s:1:"n";s:4:"ð™¤";s:1:"o";s:4:"ð™¥";s:1:"p";s:4:"ð™¦";s:1:"q";s:4:"ð™§";s:1:"r";s:4:"ð™¨";s:1:"s";s:4:"ð™©";s:1:"t";s:4:"ð™ª";s:1:"u";s:4:"ð™«";s:1:"v";s:4:"ð™¬";s:1:"w";s:4:"ð™­";s:1:"x";s:4:"ð™®";s:1:"y";s:4:"ð™¯";s:1:"z";s:4:"ð™°";s:1:"A";s:4:"ð™±";s:1:"B";s:4:"ð™²";s:1:"C";s:4:"ð™³";s:1:"D";s:4:"ð™´";s:1:"E";s:4:"ð™µ";s:1:"F";s:4:"ð™¶";s:1:"G";s:4:"ð™·";s:1:"H";s:4:"ð™¸";s:1:"I";s:4:"ð™¹";s:1:"J";s:4:"ð™º";s:1:"K";s:4:"ð™»";s:1:"L";s:4:"ð™¼";s:1:"M";s:4:"ð™½";s:1:"N";s:4:"ð™¾";s:1:"O";s:4:"ð™¿";s:1:"P";s:4:"ðš€";s:1:"Q";s:4:"ðš";s:1:"R";s:4:"ðš‚";s:1:"S";s:4:"ðšƒ";s:1:"T";s:4:"ðš„";s:1:"U";s:4:"ðš…";s:1:"V";s:4:"ðš†";s:1:"W";s:4:"ðš‡";s:1:"X";s:4:"ðšˆ";s:1:"Y";s:4:"ðš‰";s:1:"Z";s:4:"ðšŠ";s:1:"a";s:4:"ðš‹";s:1:"b";s:4:"ðšŒ";s:1:"c";s:4:"ðš";s:1:"d";s:4:"ðšŽ";s:1:"e";s:4:"ðš";s:1:"f";s:4:"ðš";s:1:"g";s:4:"ðš‘";s:1:"h";s:4:"ðš’";s:1:"i";s:4:"ðš“";s:1:"j";s:4:"ðš”";s:1:"k";s:4:"ðš•";s:1:"l";s:4:"ðš–";s:1:"m";s:4:"ðš—";s:1:"n";s:4:"ðš˜";s:1:"o";s:4:"ðš™";s:1:"p";s:4:"ðšš";s:1:"q";s:4:"ðš›";s:1:"r";s:4:"ðšœ";s:1:"s";s:4:"ðš";s:1:"t";s:4:"ðšž";s:1:"u";s:4:"ðšŸ";s:1:"v";s:4:"ðš ";s:1:"w";s:4:"ðš¡";s:1:"x";s:4:"ðš¢";s:1:"y";s:4:"ðš£";s:1:"z";s:4:"ðš¤";s:2:"ı";s:4:"ðš¥";s:2:"È·";s:4:"ðš¨";s:2:"Α";s:4:"ðš©";s:2:"Î’";s:4:"ðšª";s:2:"Γ";s:4:"ðš«";s:2:"Δ";s:4:"ðš¬";s:2:"Ε";s:4:"ðš­";s:2:"Ζ";s:4:"ðš®";s:2:"Η";s:4:"ðš¯";s:2:"Θ";s:4:"ðš°";s:2:"Ι";s:4:"ðš±";s:2:"Κ";s:4:"ðš²";s:2:"Λ";s:4:"ðš³";s:2:"Μ";s:4:"ðš´";s:2:"Î";s:4:"ðšµ";s:2:"Ξ";s:4:"ðš¶";s:2:"Ο";s:4:"ðš·";s:2:"Π";s:4:"ðš¸";s:2:"Ρ";s:4:"ðš¹";s:2:"Ï´";s:4:"ðšº";s:2:"Σ";s:4:"ðš»";s:2:"Τ";s:4:"ðš¼";s:2:"Î¥";s:4:"ðš½";s:2:"Φ";s:4:"ðš¾";s:2:"Χ";s:4:"ðš¿";s:2:"Ψ";s:4:"ð›€";s:2:"Ω";s:4:"ð›";s:3:"∇";s:4:"ð›‚";s:2:"α";s:4:"ð›ƒ";s:2:"β";s:4:"ð›„";s:2:"γ";s:4:"ð›…";s:2:"δ";s:4:"ð›†";s:2:"ε";s:4:"ð›‡";s:2:"ζ";s:4:"ð›ˆ";s:2:"η";s:4:"ð›‰";s:2:"θ";s:4:"ð›Š";s:2:"ι";s:4:"ð›‹";s:2:"κ";s:4:"ð›Œ";s:2:"λ";s:4:"ð›";s:2:"μ";s:4:"ð›Ž";s:2:"ν";s:4:"ð›";s:2:"ξ";s:4:"ð›";s:2:"ο";s:4:"ð›‘";s:2:"Ï€";s:4:"ð›’";s:2:"Ï";s:4:"ð›“";s:2:"Ï‚";s:4:"ð›”";s:2:"σ";s:4:"ð›•";s:2:"Ï„";s:4:"ð›–";s:2:"Ï…";s:4:"ð›—";s:2:"φ";s:4:"ð›˜";s:2:"χ";s:4:"ð›™";s:2:"ψ";s:4:"ð›š";s:2:"ω";s:4:"ð››";s:3:"∂";s:4:"ð›œ";s:2:"ϵ";s:4:"ð›";s:2:"Ï‘";s:4:"ð›ž";s:2:"ϰ";s:4:"ð›Ÿ";s:2:"Ï•";s:4:"ð› ";s:2:"ϱ";s:4:"ð›¡";s:2:"Ï–";s:4:"ð›¢";s:2:"Α";s:4:"ð›£";s:2:"Î’";s:4:"ð›¤";s:2:"Γ";s:4:"ð›¥";s:2:"Δ";s:4:"ð›¦";s:2:"Ε";s:4:"ð›§";s:2:"Ζ";s:4:"ð›¨";s:2:"Η";s:4:"ð›©";s:2:"Θ";s:4:"ð›ª";s:2:"Ι";s:4:"ð›«";s:2:"Κ";s:4:"ð›¬";s:2:"Λ";s:4:"ð›­";s:2:"Μ";s:4:"ð›®";s:2:"Î";s:4:"ð›¯";s:2:"Ξ";s:4:"ð›°";s:2:"Ο";s:4:"ð›±";s:2:"Π";s:4:"ð›²";s:2:"Ρ";s:4:"ð›³";s:2:"Ï´";s:4:"ð›´";s:2:"Σ";s:4:"ð›µ";s:2:"Τ";s:4:"ð›¶";s:2:"Î¥";s:4:"ð›·";s:2:"Φ";s:4:"ð›¸";s:2:"Χ";s:4:"ð›¹";s:2:"Ψ";s:4:"ð›º";s:2:"Ω";s:4:"ð›»";s:3:"∇";s:4:"ð›¼";s:2:"α";s:4:"ð›½";s:2:"β";s:4:"ð›¾";s:2:"γ";s:4:"ð›¿";s:2:"δ";s:4:"ðœ€";s:2:"ε";s:4:"ðœ";s:2:"ζ";s:4:"ðœ‚";s:2:"η";s:4:"ðœƒ";s:2:"θ";s:4:"ðœ„";s:2:"ι";s:4:"ðœ…";s:2:"κ";s:4:"ðœ†";s:2:"λ";s:4:"ðœ‡";s:2:"μ";s:4:"ðœˆ";s:2:"ν";s:4:"ðœ‰";s:2:"ξ";s:4:"ðœŠ";s:2:"ο";s:4:"ðœ‹";s:2:"Ï€";s:4:"ðœŒ";s:2:"Ï";s:4:"ðœ";s:2:"Ï‚";s:4:"ðœŽ";s:2:"σ";s:4:"ðœ";s:2:"Ï„";s:4:"ðœ";s:2:"Ï…";s:4:"ðœ‘";s:2:"φ";s:4:"ðœ’";s:2:"χ";s:4:"ðœ“";s:2:"ψ";s:4:"ðœ”";s:2:"ω";s:4:"ðœ•";s:3:"∂";s:4:"ðœ–";s:2:"ϵ";s:4:"ðœ—";s:2:"Ï‘";s:4:"ðœ˜";s:2:"ϰ";s:4:"ðœ™";s:2:"Ï•";s:4:"ðœš";s:2:"ϱ";s:4:"ðœ›";s:2:"Ï–";s:4:"ðœœ";s:2:"Α";s:4:"ðœ";s:2:"Î’";s:4:"ðœž";s:2:"Γ";s:4:"ðœŸ";s:2:"Δ";s:4:"ðœ ";s:2:"Ε";s:4:"ðœ¡";s:2:"Ζ";s:4:"ðœ¢";s:2:"Η";s:4:"ðœ£";s:2:"Θ";s:4:"ðœ¤";s:2:"Ι";s:4:"ðœ¥";s:2:"Κ";s:4:"ðœ¦";s:2:"Λ";s:4:"ðœ§";s:2:"Μ";s:4:"ðœ¨";s:2:"Î";s:4:"ðœ©";s:2:"Ξ";s:4:"ðœª";s:2:"Ο";s:4:"ðœ«";s:2:"Π";s:4:"ðœ¬";s:2:"Ρ";s:4:"ðœ­";s:2:"Ï´";s:4:"ðœ®";s:2:"Σ";s:4:"ðœ¯";s:2:"Τ";s:4:"ðœ°";s:2:"Î¥";s:4:"ðœ±";s:2:"Φ";s:4:"ðœ²";s:2:"Χ";s:4:"ðœ³";s:2:"Ψ";s:4:"ðœ´";s:2:"Ω";s:4:"ðœµ";s:3:"∇";s:4:"ðœ¶";s:2:"α";s:4:"ðœ·";s:2:"β";s:4:"ðœ¸";s:2:"γ";s:4:"ðœ¹";s:2:"δ";s:4:"ðœº";s:2:"ε";s:4:"ðœ»";s:2:"ζ";s:4:"ðœ¼";s:2:"η";s:4:"ðœ½";s:2:"θ";s:4:"ðœ¾";s:2:"ι";s:4:"ðœ¿";s:2:"κ";s:4:"ð€";s:2:"λ";s:4:"ð";s:2:"μ";s:4:"ð‚";s:2:"ν";s:4:"ðƒ";s:2:"ξ";s:4:"ð„";s:2:"ο";s:4:"ð…";s:2:"Ï€";s:4:"ð†";s:2:"Ï";s:4:"ð‡";s:2:"Ï‚";s:4:"ðˆ";s:2:"σ";s:4:"ð‰";s:2:"Ï„";s:4:"ðŠ";s:2:"Ï…";s:4:"ð‹";s:2:"φ";s:4:"ðŒ";s:2:"χ";s:4:"ð";s:2:"ψ";s:4:"ðŽ";s:2:"ω";s:4:"ð";s:3:"∂";s:4:"ð";s:2:"ϵ";s:4:"ð‘";s:2:"Ï‘";s:4:"ð’";s:2:"ϰ";s:4:"ð“";s:2:"Ï•";s:4:"ð”";s:2:"ϱ";s:4:"ð•";s:2:"Ï–";s:4:"ð–";s:2:"Α";s:4:"ð—";s:2:"Î’";s:4:"ð˜";s:2:"Γ";s:4:"ð™";s:2:"Δ";s:4:"ðš";s:2:"Ε";s:4:"ð›";s:2:"Ζ";s:4:"ðœ";s:2:"Η";s:4:"ð";s:2:"Θ";s:4:"ðž";s:2:"Ι";s:4:"ðŸ";s:2:"Κ";s:4:"ð ";s:2:"Λ";s:4:"ð¡";s:2:"Μ";s:4:"ð¢";s:2:"Î";s:4:"ð£";s:2:"Ξ";s:4:"ð¤";s:2:"Ο";s:4:"ð¥";s:2:"Π";s:4:"ð¦";s:2:"Ρ";s:4:"ð§";s:2:"Ï´";s:4:"ð¨";s:2:"Σ";s:4:"ð©";s:2:"Τ";s:4:"ðª";s:2:"Î¥";s:4:"ð«";s:2:"Φ";s:4:"ð¬";s:2:"Χ";s:4:"ð­";s:2:"Ψ";s:4:"ð®";s:2:"Ω";s:4:"ð¯";s:3:"∇";s:4:"ð°";s:2:"α";s:4:"ð±";s:2:"β";s:4:"ð²";s:2:"γ";s:4:"ð³";s:2:"δ";s:4:"ð´";s:2:"ε";s:4:"ðµ";s:2:"ζ";s:4:"ð¶";s:2:"η";s:4:"ð·";s:2:"θ";s:4:"ð¸";s:2:"ι";s:4:"ð¹";s:2:"κ";s:4:"ðº";s:2:"λ";s:4:"ð»";s:2:"μ";s:4:"ð¼";s:2:"ν";s:4:"ð½";s:2:"ξ";s:4:"ð¾";s:2:"ο";s:4:"ð¿";s:2:"Ï€";s:4:"ðž€";s:2:"Ï";s:4:"ðž";s:2:"Ï‚";s:4:"ðž‚";s:2:"σ";s:4:"ðžƒ";s:2:"Ï„";s:4:"ðž„";s:2:"Ï…";s:4:"ðž…";s:2:"φ";s:4:"ðž†";s:2:"χ";s:4:"ðž‡";s:2:"ψ";s:4:"ðžˆ";s:2:"ω";s:4:"ðž‰";s:3:"∂";s:4:"ðžŠ";s:2:"ϵ";s:4:"ðž‹";s:2:"Ï‘";s:4:"ðžŒ";s:2:"ϰ";s:4:"ðž";s:2:"Ï•";s:4:"ðžŽ";s:2:"ϱ";s:4:"ðž";s:2:"Ï–";s:4:"ðž";s:2:"Α";s:4:"ðž‘";s:2:"Î’";s:4:"ðž’";s:2:"Γ";s:4:"ðž“";s:2:"Δ";s:4:"ðž”";s:2:"Ε";s:4:"ðž•";s:2:"Ζ";s:4:"ðž–";s:2:"Η";s:4:"ðž—";s:2:"Θ";s:4:"ðž˜";s:2:"Ι";s:4:"ðž™";s:2:"Κ";s:4:"ðžš";s:2:"Λ";s:4:"ðž›";s:2:"Μ";s:4:"ðžœ";s:2:"Î";s:4:"ðž";s:2:"Ξ";s:4:"ðžž";s:2:"Ο";s:4:"ðžŸ";s:2:"Π";s:4:"ðž ";s:2:"Ρ";s:4:"ðž¡";s:2:"Ï´";s:4:"ðž¢";s:2:"Σ";s:4:"ðž£";s:2:"Τ";s:4:"ðž¤";s:2:"Î¥";s:4:"ðž¥";s:2:"Φ";s:4:"ðž¦";s:2:"Χ";s:4:"ðž§";s:2:"Ψ";s:4:"ðž¨";s:2:"Ω";s:4:"ðž©";s:3:"∇";s:4:"ðžª";s:2:"α";s:4:"ðž«";s:2:"β";s:4:"ðž¬";s:2:"γ";s:4:"ðž­";s:2:"δ";s:4:"ðž®";s:2:"ε";s:4:"ðž¯";s:2:"ζ";s:4:"ðž°";s:2:"η";s:4:"ðž±";s:2:"θ";s:4:"ðž²";s:2:"ι";s:4:"ðž³";s:2:"κ";s:4:"ðž´";s:2:"λ";s:4:"ðžµ";s:2:"μ";s:4:"ðž¶";s:2:"ν";s:4:"ðž·";s:2:"ξ";s:4:"ðž¸";s:2:"ο";s:4:"ðž¹";s:2:"Ï€";s:4:"ðžº";s:2:"Ï";s:4:"ðž»";s:2:"Ï‚";s:4:"ðž¼";s:2:"σ";s:4:"ðž½";s:2:"Ï„";s:4:"ðž¾";s:2:"Ï…";s:4:"ðž¿";s:2:"φ";s:4:"ðŸ€";s:2:"χ";s:4:"ðŸ";s:2:"ψ";s:4:"ðŸ‚";s:2:"ω";s:4:"ðŸƒ";s:3:"∂";s:4:"ðŸ„";s:2:"ϵ";s:4:"ðŸ…";s:2:"Ï‘";s:4:"ðŸ†";s:2:"ϰ";s:4:"ðŸ‡";s:2:"Ï•";s:4:"ðŸˆ";s:2:"ϱ";s:4:"ðŸ‰";s:2:"Ï–";s:4:"ðŸŠ";s:2:"Ïœ";s:4:"ðŸ‹";s:2:"Ï";s:4:"ðŸŽ";s:1:"0";s:4:"ðŸ";s:1:"1";s:4:"ðŸ";s:1:"2";s:4:"ðŸ‘";s:1:"3";s:4:"ðŸ’";s:1:"4";s:4:"ðŸ“";s:1:"5";s:4:"ðŸ”";s:1:"6";s:4:"ðŸ•";s:1:"7";s:4:"ðŸ–";s:1:"8";s:4:"ðŸ—";s:1:"9";s:4:"ðŸ˜";s:1:"0";s:4:"ðŸ™";s:1:"1";s:4:"ðŸš";s:1:"2";s:4:"ðŸ›";s:1:"3";s:4:"ðŸœ";s:1:"4";s:4:"ðŸ";s:1:"5";s:4:"ðŸž";s:1:"6";s:4:"ðŸŸ";s:1:"7";s:4:"ðŸ ";s:1:"8";s:4:"ðŸ¡";s:1:"9";s:4:"ðŸ¢";s:1:"0";s:4:"ðŸ£";s:1:"1";s:4:"ðŸ¤";s:1:"2";s:4:"ðŸ¥";s:1:"3";s:4:"ðŸ¦";s:1:"4";s:4:"ðŸ§";s:1:"5";s:4:"ðŸ¨";s:1:"6";s:4:"ðŸ©";s:1:"7";s:4:"ðŸª";s:1:"8";s:4:"ðŸ«";s:1:"9";s:4:"ðŸ¬";s:1:"0";s:4:"ðŸ­";s:1:"1";s:4:"ðŸ®";s:1:"2";s:4:"ðŸ¯";s:1:"3";s:4:"ðŸ°";s:1:"4";s:4:"ðŸ±";s:1:"5";s:4:"ðŸ²";s:1:"6";s:4:"ðŸ³";s:1:"7";s:4:"ðŸ´";s:1:"8";s:4:"ðŸµ";s:1:"9";s:4:"ðŸ¶";s:1:"0";s:4:"ðŸ·";s:1:"1";s:4:"ðŸ¸";s:1:"2";s:4:"ðŸ¹";s:1:"3";s:4:"ðŸº";s:1:"4";s:4:"ðŸ»";s:1:"5";s:4:"ðŸ¼";s:1:"6";s:4:"ðŸ½";s:1:"7";s:4:"ðŸ¾";s:1:"8";s:4:"ðŸ¿";s:1:"9";s:4:"𞸀";s:2:"ا";s:4:"ðž¸";s:2:"ب";s:4:"𞸂";s:2:"ج";s:4:"𞸃";s:2:"د";s:4:"𞸅";s:2:"Ùˆ";s:4:"𞸆";s:2:"ز";s:4:"𞸇";s:2:"Ø­";s:4:"𞸈";s:2:"Ø·";s:4:"𞸉";s:2:"ÙŠ";s:4:"𞸊";s:2:"Ùƒ";s:4:"𞸋";s:2:"Ù„";s:4:"𞸌";s:2:"Ù…";s:4:"ðž¸";s:2:"Ù†";s:4:"𞸎";s:2:"س";s:4:"ðž¸";s:2:"ع";s:4:"ðž¸";s:2:"Ù";s:4:"𞸑";s:2:"ص";s:4:"𞸒";s:2:"Ù‚";s:4:"𞸓";s:2:"ر";s:4:"𞸔";s:2:"Ø´";s:4:"𞸕";s:2:"ت";s:4:"𞸖";s:2:"Ø«";s:4:"𞸗";s:2:"Ø®";s:4:"𞸘";s:2:"ذ";s:4:"𞸙";s:2:"ض";s:4:"𞸚";s:2:"ظ";s:4:"𞸛";s:2:"غ";s:4:"𞸜";s:2:"Ù®";s:4:"ðž¸";s:2:"Úº";s:4:"𞸞";s:2:"Ú¡";s:4:"𞸟";s:2:"Ù¯";s:4:"𞸡";s:2:"ب";s:4:"𞸢";s:2:"ج";s:4:"𞸤";s:2:"Ù‡";s:4:"𞸧";s:2:"Ø­";s:4:"𞸩";s:2:"ÙŠ";s:4:"𞸪";s:2:"Ùƒ";s:4:"𞸫";s:2:"Ù„";s:4:"𞸬";s:2:"Ù…";s:4:"𞸭";s:2:"Ù†";s:4:"𞸮";s:2:"س";s:4:"𞸯";s:2:"ع";s:4:"𞸰";s:2:"Ù";s:4:"𞸱";s:2:"ص";s:4:"𞸲";s:2:"Ù‚";s:4:"𞸴";s:2:"Ø´";s:4:"𞸵";s:2:"ت";s:4:"𞸶";s:2:"Ø«";s:4:"𞸷";s:2:"Ø®";s:4:"𞸹";s:2:"ض";s:4:"𞸻";s:2:"غ";s:4:"𞹂";s:2:"ج";s:4:"𞹇";s:2:"Ø­";s:4:"𞹉";s:2:"ÙŠ";s:4:"𞹋";s:2:"Ù„";s:4:"ðž¹";s:2:"Ù†";s:4:"𞹎";s:2:"س";s:4:"ðž¹";s:2:"ع";s:4:"𞹑";s:2:"ص";s:4:"ðž¹’";s:2:"Ù‚";s:4:"ðž¹”";s:2:"Ø´";s:4:"ðž¹—";s:2:"Ø®";s:4:"ðž¹™";s:2:"ض";s:4:"ðž¹›";s:2:"غ";s:4:"ðž¹";s:2:"Úº";s:4:"𞹟";s:2:"Ù¯";s:4:"𞹡";s:2:"ب";s:4:"ðž¹¢";s:2:"ج";s:4:"𞹤";s:2:"Ù‡";s:4:"ðž¹§";s:2:"Ø­";s:4:"𞹨";s:2:"Ø·";s:4:"𞹩";s:2:"ÙŠ";s:4:"𞹪";s:2:"Ùƒ";s:4:"𞹬";s:2:"Ù…";s:4:"ðž¹­";s:2:"Ù†";s:4:"ðž¹®";s:2:"س";s:4:"𞹯";s:2:"ع";s:4:"ðž¹°";s:2:"Ù";s:4:"ðž¹±";s:2:"ص";s:4:"ðž¹²";s:2:"Ù‚";s:4:"ðž¹´";s:2:"Ø´";s:4:"ðž¹µ";s:2:"ت";s:4:"ðž¹¶";s:2:"Ø«";s:4:"ðž¹·";s:2:"Ø®";s:4:"ðž¹¹";s:2:"ض";s:4:"𞹺";s:2:"ظ";s:4:"ðž¹»";s:2:"غ";s:4:"ðž¹¼";s:2:"Ù®";s:4:"ðž¹¾";s:2:"Ú¡";s:4:"𞺀";s:2:"ا";s:4:"ðžº";s:2:"ب";s:4:"𞺂";s:2:"ج";s:4:"𞺃";s:2:"د";s:4:"𞺄";s:2:"Ù‡";s:4:"𞺅";s:2:"Ùˆ";s:4:"𞺆";s:2:"ز";s:4:"𞺇";s:2:"Ø­";s:4:"𞺈";s:2:"Ø·";s:4:"𞺉";s:2:"ÙŠ";s:4:"𞺋";s:2:"Ù„";s:4:"𞺌";s:2:"Ù…";s:4:"ðžº";s:2:"Ù†";s:4:"𞺎";s:2:"س";s:4:"ðžº";s:2:"ع";s:4:"ðžº";s:2:"Ù";s:4:"𞺑";s:2:"ص";s:4:"𞺒";s:2:"Ù‚";s:4:"𞺓";s:2:"ر";s:4:"𞺔";s:2:"Ø´";s:4:"𞺕";s:2:"ت";s:4:"𞺖";s:2:"Ø«";s:4:"𞺗";s:2:"Ø®";s:4:"𞺘";s:2:"ذ";s:4:"𞺙";s:2:"ض";s:4:"𞺚";s:2:"ظ";s:4:"𞺛";s:2:"غ";s:4:"𞺡";s:2:"ب";s:4:"𞺢";s:2:"ج";s:4:"𞺣";s:2:"د";s:4:"𞺥";s:2:"Ùˆ";s:4:"𞺦";s:2:"ز";s:4:"𞺧";s:2:"Ø­";s:4:"𞺨";s:2:"Ø·";s:4:"𞺩";s:2:"ÙŠ";s:4:"𞺫";s:2:"Ù„";s:4:"𞺬";s:2:"Ù…";s:4:"𞺭";s:2:"Ù†";s:4:"𞺮";s:2:"س";s:4:"𞺯";s:2:"ع";s:4:"𞺰";s:2:"Ù";s:4:"𞺱";s:2:"ص";s:4:"𞺲";s:2:"Ù‚";s:4:"𞺳";s:2:"ر";s:4:"𞺴";s:2:"Ø´";s:4:"𞺵";s:2:"ت";s:4:"𞺶";s:2:"Ø«";s:4:"𞺷";s:2:"Ø®";s:4:"𞺸";s:2:"ذ";s:4:"𞺹";s:2:"ض";s:4:"𞺺";s:2:"ظ";s:4:"𞺻";s:2:"غ";s:4:"🄀";s:2:"0.";s:4:"ðŸ„";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"ðŸ„";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"ðŸ„";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:3:"(C)";s:4:"🄬";s:3:"(R)";s:4:"🄭";s:4:"(CD)";s:4:"🄮";s:4:"(WZ)";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"ðŸ…";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"ðŸ…";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"ðŸ…";s:2:"WC";s:4:"ðŸ†";s:2:"DJ";s:4:"🈀";s:6:"ã»ã‹";s:4:"ðŸˆ";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"ðŸˆ";s:3:"手";s:4:"🈑";s:3:"å­—";s:4:"🈒";s:3:"åŒ";s:4:"🈓";s:3:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"è§£";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"ç„¡";s:4:"🈛";s:3:"æ–™";s:4:"🈜";s:3:"å‰";s:4:"ðŸˆ";s:3:"後";s:4:"🈞";s:3:"å†";s:4:"🈟";s:3:"æ–°";s:4:"🈠";s:3:"åˆ";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"å¹";s:4:"🈦";s:3:"æ¼”";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"æ•";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"éŠ";s:4:"🈬";s:3:"å·¦";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"å³";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"èµ°";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"ç¦";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"åˆ";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"å–¶";s:4:"🉀";s:9:"〔本〕";s:4:"ðŸ‰";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔å‹ã€•";s:4:"🉈";s:9:"〔敗〕";s:4:"ðŸ‰";s:5:"(å¾—)";s:4:"🉑";s:5:"(å¯)";s:4:"丽";s:3:"丽";s:4:"ð¯ ";s:3:"丸";s:4:"乁";s:3:"ä¹";s:4:"𠄢";s:4:"ð „¢";s:4:"你";s:3:"ä½ ";s:4:"侮";s:3:"ä¾®";s:4:"侻";s:3:"ä¾»";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"åº";s:4:"備";s:3:"å‚™";s:4:"僧";s:3:"僧";s:4:"像";s:3:"åƒ";s:4:"㒞";s:3:"ã’ž";s:4:"ð¯ ";s:4:"𠘺";s:4:"免";s:3:"å…";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"具";s:3:"å…·";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"ã’¹";s:4:"內";s:3:"å…§";s:4:"再";s:3:"å†";s:4:"𠕋";s:4:"ð •‹";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"ð¯ ";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"å‰";s:4:"卑";s:3:"å‘";s:4:"博";s:3:"åš";s:4:"即";s:3:"å³";s:4:"卽";s:3:"å½";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"ç°";s:4:"及";s:3:"åŠ";s:4:"叟";s:3:"åŸ";s:4:"𠭣";s:4:"ð ­£";s:4:"叫";s:3:"å«";s:4:"叱";s:3:"å±";s:4:"吆";s:3:"å†";s:4:"咞";s:3:"å’ž";s:4:"吸";s:3:"å¸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"å’¢";s:4:"ð¯¡";s:3:"å“¶";s:4:"唐";s:3:"å”";s:4:"啓";s:3:"å•“";s:4:"啣";s:3:"å•£";s:4:"善";s:3:"å–„";s:4:"善";s:3:"å–„";s:4:"喙";s:3:"å–™";s:4:"喫";s:3:"å–«";s:4:"喳";s:3:"å–³";s:4:"嗂";s:3:"å—‚";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"ð¯¡";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"ð¯¡";s:3:"å™´";s:4:"ð¯¡";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"å ";s:4:"型";s:3:"åž‹";s:4:"堲";s:3:"å ²";s:4:"報";s:3:"å ±";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"ð¯¡";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"ã›®";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"å°†";s:4:"当";s:3:"当";s:4:"尢";s:3:"å°¢";s:4:"㞁";s:3:"ãž";s:4:"屠";s:3:"å± ";s:4:"屮";s:3:"å±®";s:4:"峀";s:3:"å³€";s:4:"岍";s:3:"å²";s:4:"𡷤";s:4:"ð¡·¤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"ð¡·¦";s:4:"嵮";s:3:"åµ®";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"åµ¼";s:4:"ð¯¢";s:3:"å·¡";s:4:"巢";s:3:"å·¢";s:4:"㠯";s:3:"ã ¯";s:4:"巽";s:3:"å·½";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"ã¡¢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"ð¯¢";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"èˆ";s:4:"弢";s:3:"å¼¢";s:4:"弢";s:3:"å¼¢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"å½¢";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"ð¯¢";s:3:"å¿";s:4:"志";s:3:"å¿—";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"æ‚";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"æ‚”";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"æ…ˆ";s:4:"慌";s:3:"æ…Œ";s:4:"慎";s:3:"æ…Ž";s:4:"慌";s:3:"æ…Œ";s:4:"慺";s:3:"æ…º";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"æˆ";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"æ‰";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"æ‹”";s:4:"捐";s:3:"æ";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"æ¨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"æ¤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"æ¢";s:4:"揅";s:3:"æ…";s:4:"ð¯£";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"æ‘©";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"æ’";s:4:"摷";s:3:"æ‘·";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"æ•";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"æ—£";s:4:"書";s:3:"書";s:4:"ð¯£";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"ð¯£";s:3:"æš‘";s:4:"ð¯£";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"æšœ";s:4:"肭";s:3:"è‚­";s:4:"䏙";s:3:"ä™";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"æž";s:4:"杓";s:3:"æ“";s:4:"ð¯£";s:4:"ð£ƒ";s:4:"㭉";s:3:"ã­‰";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"æž…";s:4:"桒";s:3:"æ¡’";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"æ Ÿ";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"ã®";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"æ«›";s:4:"㰘";s:3:"ã°˜";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"æ­”";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"æ­²";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"æ®»";s:4:"𣪍";s:4:"ð£ª";s:4:"𡴋";s:4:"ð¡´‹";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"æ³";s:4:"汧";s:3:"æ±§";s:4:"洖";s:3:"æ´–";s:4:"派";s:3:"æ´¾";s:4:"ð¯¤";s:3:"æµ·";s:4:"流";s:3:"æµ";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"æ¶…";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"æ´´";s:4:"港";s:3:"港";s:4:"湮";s:3:"æ¹®";s:4:"㴳";s:3:"ã´³";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"ð¯¤";s:4:"𣻑";s:4:"淹";s:3:"æ·¹";s:4:"ð¯¤";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"ã¶–";s:4:"灊";s:3:"çŠ";s:4:"災";s:3:"ç½";s:4:"灷";s:3:"ç·";s:4:"炭";s:3:"ç‚­";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"ç……";s:4:"ð¯¤";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"ç‰";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"çº";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"ç’…";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"ã¼›";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"ç•°";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"ç˜";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"ð¥„";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"ç›´";s:4:"ð¯¥";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"çŠ";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"çž‹";s:4:"䁆";s:3:"ä†";s:4:"䂖";s:3:"ä‚–";s:4:"ð¯¥";s:4:"ð¥";s:4:"硎";s:3:"硎";s:4:"ð¯¥";s:3:"碌";s:4:"ð¯¥";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"ç¦";s:4:"秫";s:3:"ç§«";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"ç©€";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"ç©";s:4:"𥥼";s:4:"𥥼";s:4:"ð¯¥";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"ç«®";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"ç³’";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"ç³£";s:4:"紀";s:3:"ç´€";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"çµ£";s:4:"䌁";s:3:"äŒ";s:4:"緇";s:3:"ç·‡";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"ç¹…";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"ä™";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"è ";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"è°";s:4:"𣍟";s:4:"ð£Ÿ";s:4:"ð¯¦";s:3:"ä•";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"ä‹";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"èˆ";s:4:"舄";s:3:"舄";s:4:"ð¯¦";s:3:"辞";s:4:"䑫";s:3:"ä‘«";s:4:"ð¯¦";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"芝";s:3:"èŠ";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"è‹¥";s:4:"茝";s:3:"èŒ";s:4:"荣";s:3:"è£";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"ð¯¦";s:3:"莽";s:4:"菧";s:3:"è§";s:4:"著";s:3:"è‘—";s:4:"荓";s:3:"è“";s:4:"菊";s:3:"èŠ";s:4:"菌";s:3:"èŒ";s:4:"菜";s:3:"èœ";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"è”–";s:4:"𧏊";s:4:"ð§Š";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"ä•";s:4:"䕡";s:3:"ä•¡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"ä•«";s:4:"虐";s:3:"è™";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"è™§";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"èš©";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"è¹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"è«";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"ä——";s:4:"蟡";s:3:"蟡";s:4:"ð¯§";s:3:"è ";s:4:"䗹";s:3:"ä—¹";s:4:"衠";s:3:"è¡ ";s:4:"衣";s:3:"è¡£";s:4:"𧙧";s:4:"ð§™§";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"ã’»";s:4:"𧢮";s:4:"ð§¢®";s:4:"𧥦";s:4:"𧥦";s:4:"ð¯§";s:3:"äš¾";s:4:"䛇";s:3:"䛇";s:4:"ð¯§";s:3:"誠";s:4:"ð¯§";s:3:"è«­";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"è³";s:4:"贛";s:3:"è´›";s:4:"起";s:3:"èµ·";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"ð  „";s:4:"跋";s:3:"è·‹";s:4:"趼";s:3:"è¶¼";s:4:"跰";s:3:"è·°";s:4:"ð¯§";s:4:"𠣞";s:4:"軔";s:3:"è»”";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"é‚”";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"é„‘";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"é„›";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"é‹—";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"é¹";s:4:"鐕";s:3:"é•";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"é–‹";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"é–·";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"å¶²";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"ð©……";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"ä©®";s:4:"䩶";s:3:"ä©¶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"ð©Š";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"ð©’–";s:4:"頋";s:3:"é ‹";s:4:"頋";s:3:"é ‹";s:4:"頩";s:3:"é ©";s:4:"ð¯¨";s:4:"ð©–¶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"é§‚";s:4:"駾";s:3:"é§¾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"é±€";s:4:"鳽";s:3:"é³½";s:4:"ð¯¨";s:3:"䳎";s:4:"䳭";s:3:"ä³­";s:4:"ð¯¨";s:3:"éµ§";s:4:"ð¯¨";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"äµ–";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"é¼…";s:4:"鼏";s:3:"é¼";s:4:"鼖";s:3:"é¼–";s:4:"鼻";s:3:"é¼»";s:4:"ð¯¨";s:4:"𪘀";s:2:"Æ";s:2:"AE";s:2:"Ã";s:1:"D";s:2:"Ø";s:1:"O";s:2:"Þ";s:2:"TH";s:2:"ß";s:2:"ss";s:2:"æ";s:2:"ae";s:2:"ð";s:1:"d";s:2:"ø";s:1:"o";s:2:"þ";s:2:"th";s:2:"Ä";s:1:"D";s:2:"Ä‘";s:1:"d";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"ı";s:1:"i";s:2:"ĸ";s:1:"q";s:2:"Å";s:1:"L";s:2:"Å‚";s:1:"l";s:2:"ÅŠ";s:1:"N";s:2:"Å‹";s:1:"n";s:2:"Å’";s:2:"OE";s:2:"Å“";s:2:"oe";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"Æ€";s:1:"b";s:2:"Æ";s:1:"B";s:2:"Æ‚";s:1:"B";s:2:"ƃ";s:1:"b";s:2:"Ƈ";s:1:"C";s:2:"ƈ";s:1:"c";s:2:"Ɖ";s:1:"D";s:2:"ÆŠ";s:1:"D";s:2:"Æ‹";s:1:"D";s:2:"ÆŒ";s:1:"d";s:2:"Æ";s:1:"E";s:2:"Æ‘";s:1:"F";s:2:"Æ’";s:1:"f";s:2:"Æ“";s:1:"G";s:2:"Æ•";s:2:"hv";s:2:"Æ–";s:1:"I";s:2:"Æ—";s:1:"I";s:2:"Ƙ";s:1:"K";s:2:"Æ™";s:1:"k";s:2:"Æš";s:1:"l";s:2:"Æ";s:1:"N";s:2:"Æž";s:1:"n";s:2:"Æ¢";s:2:"OI";s:2:"Æ£";s:2:"oi";s:2:"Ƥ";s:1:"P";s:2:"Æ¥";s:1:"p";s:2:"Æ«";s:1:"t";s:2:"Ƭ";s:1:"T";s:2:"Æ­";s:1:"t";s:2:"Æ®";s:1:"T";s:2:"Ʋ";s:1:"V";s:2:"Ƴ";s:1:"Y";s:2:"Æ´";s:1:"y";s:2:"Ƶ";s:1:"Z";s:2:"ƶ";s:1:"z";s:2:"Ǥ";s:1:"G";s:2:"Ç¥";s:1:"g";s:2:"È¡";s:1:"d";s:2:"Ȥ";s:1:"Z";s:2:"È¥";s:1:"z";s:2:"È´";s:1:"l";s:2:"ȵ";s:1:"n";s:2:"ȶ";s:1:"t";s:2:"È·";s:1:"j";s:2:"ȸ";s:2:"db";s:2:"ȹ";s:2:"qp";s:2:"Ⱥ";s:1:"A";s:2:"È»";s:1:"C";s:2:"ȼ";s:1:"c";s:2:"Ƚ";s:1:"L";s:2:"Ⱦ";s:1:"T";s:2:"È¿";s:1:"s";s:2:"É€";s:1:"z";s:2:"Ƀ";s:1:"B";s:2:"É„";s:1:"U";s:2:"Ɇ";s:1:"E";s:2:"ɇ";s:1:"e";s:2:"Ɉ";s:1:"J";s:2:"ɉ";s:1:"j";s:2:"ÉŒ";s:1:"R";s:2:"É";s:1:"r";s:2:"ÉŽ";s:1:"Y";s:2:"É";s:1:"y";s:2:"É“";s:1:"b";s:2:"É•";s:1:"c";s:2:"É–";s:1:"d";s:2:"É—";s:1:"d";s:2:"É›";s:1:"e";s:2:"ÉŸ";s:1:"j";s:2:"É ";s:1:"g";s:2:"É¡";s:1:"g";s:2:"É¢";s:1:"G";s:2:"ɦ";s:1:"h";s:2:"ɧ";s:1:"h";s:2:"ɨ";s:1:"i";s:2:"ɪ";s:1:"I";s:2:"É«";s:1:"l";s:2:"ɬ";s:1:"l";s:2:"É­";s:1:"l";s:2:"ɱ";s:1:"m";s:2:"ɲ";s:1:"n";s:2:"ɳ";s:1:"n";s:2:"É´";s:1:"N";s:2:"ɶ";s:2:"OE";s:2:"ɼ";s:1:"r";s:2:"ɽ";s:1:"r";s:2:"ɾ";s:1:"r";s:2:"Ê€";s:1:"R";s:2:"Ê‚";s:1:"s";s:2:"ʈ";s:1:"t";s:2:"ʉ";s:1:"u";s:2:"Ê‹";s:1:"v";s:2:"Ê";s:1:"Y";s:2:"Ê";s:1:"z";s:2:"Ê‘";s:1:"z";s:2:"Ê™";s:1:"B";s:2:"Ê›";s:1:"G";s:2:"Êœ";s:1:"H";s:2:"Ê";s:1:"j";s:2:"ÊŸ";s:1:"L";s:2:"Ê ";s:1:"q";s:2:"Ê£";s:2:"dz";s:2:"Ê¥";s:2:"dz";s:2:"ʦ";s:2:"ts";s:2:"ʪ";s:2:"ls";s:2:"Ê«";s:2:"lz";s:3:"á´€";s:1:"A";s:3:"á´";s:2:"AE";s:3:"á´ƒ";s:1:"B";s:3:"á´„";s:1:"C";s:3:"á´…";s:1:"D";s:3:"á´†";s:1:"D";s:3:"á´‡";s:1:"E";s:3:"á´Š";s:1:"J";s:3:"á´‹";s:1:"K";s:3:"á´Œ";s:1:"L";s:3:"á´";s:1:"M";s:3:"á´";s:1:"O";s:3:"á´˜";s:1:"P";s:3:"á´›";s:1:"T";s:3:"á´œ";s:1:"U";s:3:"á´ ";s:1:"V";s:3:"á´¡";s:1:"W";s:3:"á´¢";s:1:"Z";s:3:"ᵫ";s:2:"ue";s:3:"ᵬ";s:1:"b";s:3:"áµ­";s:1:"d";s:3:"áµ®";s:1:"f";s:3:"ᵯ";s:1:"m";s:3:"áµ°";s:1:"n";s:3:"áµ±";s:1:"p";s:3:"áµ²";s:1:"r";s:3:"áµ³";s:1:"r";s:3:"áµ´";s:1:"s";s:3:"áµµ";s:1:"t";s:3:"áµ¶";s:1:"z";s:3:"ᵺ";s:2:"th";s:3:"áµ»";s:1:"I";s:3:"áµ½";s:1:"p";s:3:"áµ¾";s:1:"U";s:3:"á¶€";s:1:"b";s:3:"á¶";s:1:"d";s:3:"á¶‚";s:1:"f";s:3:"ᶃ";s:1:"g";s:3:"á¶„";s:1:"k";s:3:"á¶…";s:1:"l";s:3:"ᶆ";s:1:"m";s:3:"ᶇ";s:1:"n";s:3:"ᶈ";s:1:"p";s:3:"ᶉ";s:1:"r";s:3:"á¶Š";s:1:"s";s:3:"á¶Œ";s:1:"v";s:3:"á¶";s:1:"x";s:3:"á¶Ž";s:1:"z";s:3:"á¶";s:1:"a";s:3:"á¶‘";s:1:"d";s:3:"á¶’";s:1:"e";s:3:"á¶“";s:1:"e";s:3:"á¶–";s:1:"i";s:3:"á¶™";s:1:"u";s:3:"ẜ";s:1:"s";s:3:"áº";s:1:"s";s:3:"ẞ";s:2:"SS";s:3:"Ỻ";s:2:"LL";s:3:"á»»";s:2:"ll";s:3:"Ỽ";s:1:"V";s:3:"ỽ";s:1:"v";s:3:"Ỿ";s:1:"Y";s:3:"ỿ";s:1:"y";s:2:"©";s:3:"(C)";s:2:"®";s:3:"(R)";s:3:"â‚ ";s:2:"CE";s:3:"â‚¢";s:2:"Cr";s:3:"â‚£";s:3:"Fr.";s:3:"₤";s:2:"L.";s:3:"â‚§";s:3:"Pts";s:3:"₹";s:2:"Rs";s:3:"℞";s:2:"Rx";s:3:"〇";s:1:"0";s:3:"‘";s:1:"'";s:3:"’";s:1:"'";s:3:"‚";s:1:",";s:3:"‛";s:1:"'";s:3:"“";s:1:""";s:3:"â€";s:1:""";s:3:"„";s:2:",,";s:3:"‟";s:1:""";s:3:"′";s:1:"'";s:3:"ã€";s:1:""";s:3:"〞";s:1:""";s:2:"«";s:2:"<<";s:2:"»";s:2:">>";s:3:"‹";s:1:"<";s:3:"›";s:1:">";s:3:"â€";s:1:"-";s:3:"‑";s:1:"-";s:3:"‒";s:1:"-";s:3:"–";s:1:"-";s:3:"—";s:1:"-";s:3:"―";s:1:"-";s:3:"︱";s:1:"-";s:3:"︲";s:1:"-";s:3:"‖";s:2:"||";s:3:"â„";s:1:"/";s:3:"â…";s:1:"[";s:3:"â†";s:1:"]";s:3:"âŽ";s:1:"*";s:3:"ã€";s:1:",";s:3:"。";s:1:".";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"《";s:2:"<<";s:3:"》";s:2:">>";s:3:"〔";s:1:"[";s:3:"〕";s:1:"]";s:3:"〘";s:1:"[";s:3:"〙";s:1:"]";s:3:"〚";s:1:"[";s:3:"〛";s:1:"]";s:3:"ï¸";s:1:",";s:3:"︑";s:1:",";s:3:"︒";s:1:".";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:1:"[";s:3:"︺";s:1:"]";s:3:"︽";s:2:"<<";s:3:"︾";s:2:">>";s:3:"︿";s:1:"<";s:3:"ï¹€";s:1:">";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:2:"×";s:1:"*";s:2:"÷";s:1:"/";s:3:"−";s:1:"-";s:3:"∕";s:1:"/";s:3:"∖";s:1:"\";s:3:"∣";s:1:"|";s:3:"∥";s:2:"||";s:3:"≪";s:2:"<<";s:3:"≫";s:2:">>";s:3:"⦅";s:2:"((";s:3:"⦆";s:2:"))";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/canonicalComposition.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/canonicalComposition.ser new file mode 100644 index 0000000000..e75cfcfee6 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/canonicalComposition.ser @@ -0,0 +1 @@ +a:933:{s:3:"AÌ€";s:2:"À";s:3:"AÌ";s:2:"Ã";s:3:"AÌ‚";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"AÌŠ";s:2:"Ã…";s:3:"Ç";s:2:"Ç";s:3:"EÌ€";s:2:"È";s:3:"EÌ";s:2:"É";s:3:"EÌ‚";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"IÌ€";s:2:"ÃŒ";s:3:"IÌ";s:2:"Ã";s:3:"IÌ‚";s:2:"ÃŽ";s:3:"Ï";s:2:"Ã";s:3:"Ñ";s:2:"Ñ";s:3:"OÌ€";s:2:"Ã’";s:3:"OÌ";s:2:"Ó";s:3:"OÌ‚";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"UÌ€";s:2:"Ù";s:3:"UÌ";s:2:"Ú";s:3:"UÌ‚";s:2:"Û";s:3:"Ü";s:2:"Ü";s:3:"YÌ";s:2:"Ã";s:3:"aÌ€";s:2:"à";s:3:"aÌ";s:2:"á";s:3:"aÌ‚";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"aÌŠ";s:2:"Ã¥";s:3:"ç";s:2:"ç";s:3:"eÌ€";s:2:"è";s:3:"eÌ";s:2:"é";s:3:"eÌ‚";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"iÌ€";s:2:"ì";s:3:"iÌ";s:2:"í";s:3:"iÌ‚";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"oÌ€";s:2:"ò";s:3:"oÌ";s:2:"ó";s:3:"oÌ‚";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"uÌ€";s:2:"ù";s:3:"uÌ";s:2:"ú";s:3:"uÌ‚";s:2:"û";s:3:"ü";s:2:"ü";s:3:"yÌ";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"AÌ„";s:2:"Ä€";s:3:"aÌ„";s:2:"Ä";s:3:"Ă";s:2:"Ä‚";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ä„";s:3:"ą";s:2:"Ä…";s:3:"CÌ";s:2:"Ć";s:3:"cÌ";s:2:"ć";s:3:"CÌ‚";s:2:"Ĉ";s:3:"cÌ‚";s:2:"ĉ";s:3:"Ċ";s:2:"ÄŠ";s:3:"ċ";s:2:"Ä‹";s:3:"CÌŒ";s:2:"ÄŒ";s:3:"cÌŒ";s:2:"Ä";s:3:"DÌŒ";s:2:"ÄŽ";s:3:"dÌŒ";s:2:"Ä";s:3:"EÌ„";s:2:"Ä’";s:3:"eÌ„";s:2:"Ä“";s:3:"Ĕ";s:2:"Ä”";s:3:"ĕ";s:2:"Ä•";s:3:"Ė";s:2:"Ä–";s:3:"ė";s:2:"Ä—";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"Ä™";s:3:"EÌŒ";s:2:"Äš";s:3:"eÌŒ";s:2:"Ä›";s:3:"GÌ‚";s:2:"Äœ";s:3:"gÌ‚";s:2:"Ä";s:3:"Ğ";s:2:"Äž";s:3:"ğ";s:2:"ÄŸ";s:3:"Ġ";s:2:"Ä ";s:3:"ġ";s:2:"Ä¡";s:3:"Ģ";s:2:"Ä¢";s:3:"ģ";s:2:"Ä£";s:3:"HÌ‚";s:2:"Ĥ";s:3:"hÌ‚";s:2:"Ä¥";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"Ä©";s:3:"IÌ„";s:2:"Ī";s:3:"iÌ„";s:2:"Ä«";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"Ä­";s:3:"Į";s:2:"Ä®";s:3:"į";s:2:"į";s:3:"İ";s:2:"İ";s:3:"JÌ‚";s:2:"Ä´";s:3:"jÌ‚";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"Ä·";s:3:"LÌ";s:2:"Ĺ";s:3:"lÌ";s:2:"ĺ";s:3:"Ļ";s:2:"Ä»";s:3:"ļ";s:2:"ļ";s:3:"LÌŒ";s:2:"Ľ";s:3:"lÌŒ";s:2:"ľ";s:3:"NÌ";s:2:"Ń";s:3:"nÌ";s:2:"Å„";s:3:"Ņ";s:2:"Å…";s:3:"ņ";s:2:"ņ";s:3:"NÌŒ";s:2:"Ň";s:3:"nÌŒ";s:2:"ň";s:3:"OÌ„";s:2:"ÅŒ";s:3:"oÌ„";s:2:"Å";s:3:"Ŏ";s:2:"ÅŽ";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å";s:3:"oÌ‹";s:2:"Å‘";s:3:"RÌ";s:2:"Å”";s:3:"rÌ";s:2:"Å•";s:3:"Ŗ";s:2:"Å–";s:3:"ŗ";s:2:"Å—";s:3:"RÌŒ";s:2:"Ř";s:3:"rÌŒ";s:2:"Å™";s:3:"SÌ";s:2:"Åš";s:3:"sÌ";s:2:"Å›";s:3:"SÌ‚";s:2:"Åœ";s:3:"sÌ‚";s:2:"Å";s:3:"Ş";s:2:"Åž";s:3:"ş";s:2:"ÅŸ";s:3:"SÌŒ";s:2:"Å ";s:3:"sÌŒ";s:2:"Å¡";s:3:"Ţ";s:2:"Å¢";s:3:"ţ";s:2:"Å£";s:3:"TÌŒ";s:2:"Ť";s:3:"tÌŒ";s:2:"Å¥";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"Å©";s:3:"UÌ„";s:2:"Ū";s:3:"uÌ„";s:2:"Å«";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"Å­";s:3:"UÌŠ";s:2:"Å®";s:3:"uÌŠ";s:2:"ů";s:3:"UÌ‹";s:2:"Ű";s:3:"uÌ‹";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"WÌ‚";s:2:"Å´";s:3:"wÌ‚";s:2:"ŵ";s:3:"YÌ‚";s:2:"Ŷ";s:3:"yÌ‚";s:2:"Å·";s:3:"Ÿ";s:2:"Ÿ";s:3:"ZÌ";s:2:"Ź";s:3:"zÌ";s:2:"ź";s:3:"Ż";s:2:"Å»";s:3:"ż";s:2:"ż";s:3:"ZÌŒ";s:2:"Ž";s:3:"zÌŒ";s:2:"ž";s:3:"OÌ›";s:2:"Æ ";s:3:"oÌ›";s:2:"Æ¡";s:3:"UÌ›";s:2:"Ư";s:3:"uÌ›";s:2:"ư";s:3:"AÌŒ";s:2:"Ç";s:3:"aÌŒ";s:2:"ÇŽ";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç";s:3:"OÌŒ";s:2:"Ç‘";s:3:"oÌŒ";s:2:"Ç’";s:3:"UÌŒ";s:2:"Ç“";s:3:"uÌŒ";s:2:"Ç”";s:4:"Ǖ";s:2:"Ç•";s:4:"ǖ";s:2:"Ç–";s:4:"ÜÌ";s:2:"Ç—";s:4:"üÌ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ç™";s:4:"ǚ";s:2:"Çš";s:4:"Ǜ";s:2:"Ç›";s:4:"ǜ";s:2:"Çœ";s:4:"Ǟ";s:2:"Çž";s:4:"ǟ";s:2:"ÇŸ";s:4:"Ǡ";s:2:"Ç ";s:4:"ǡ";s:2:"Ç¡";s:4:"Ǣ";s:2:"Ç¢";s:4:"ǣ";s:2:"Ç£";s:3:"GÌŒ";s:2:"Ǧ";s:3:"gÌŒ";s:2:"ǧ";s:3:"KÌŒ";s:2:"Ǩ";s:3:"kÌŒ";s:2:"Ç©";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"Ç«";s:4:"Ǭ";s:2:"Ǭ";s:4:"ǭ";s:2:"Ç­";s:4:"Æ·ÌŒ";s:2:"Ç®";s:4:"Ê’ÌŒ";s:2:"ǯ";s:3:"jÌŒ";s:2:"ǰ";s:3:"GÌ";s:2:"Ç´";s:3:"gÌ";s:2:"ǵ";s:3:"NÌ€";s:2:"Ǹ";s:3:"nÌ€";s:2:"ǹ";s:4:"Ã…Ì";s:2:"Ǻ";s:4:"Ã¥Ì";s:2:"Ç»";s:4:"ÆÌ";s:2:"Ǽ";s:4:"æÌ";s:2:"ǽ";s:4:"ØÌ";s:2:"Ǿ";s:4:"øÌ";s:2:"Ç¿";s:3:"AÌ";s:2:"È€";s:3:"aÌ";s:2:"È";s:3:"AÌ‘";s:2:"È‚";s:3:"aÌ‘";s:2:"ȃ";s:3:"EÌ";s:2:"È„";s:3:"eÌ";s:2:"È…";s:3:"EÌ‘";s:2:"Ȇ";s:3:"eÌ‘";s:2:"ȇ";s:3:"IÌ";s:2:"Ȉ";s:3:"iÌ";s:2:"ȉ";s:3:"IÌ‘";s:2:"ÈŠ";s:3:"iÌ‘";s:2:"È‹";s:3:"OÌ";s:2:"ÈŒ";s:3:"oÌ";s:2:"È";s:3:"OÌ‘";s:2:"ÈŽ";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È";s:3:"rÌ";s:2:"È‘";s:3:"RÌ‘";s:2:"È’";s:3:"rÌ‘";s:2:"È“";s:3:"UÌ";s:2:"È”";s:3:"uÌ";s:2:"È•";s:3:"UÌ‘";s:2:"È–";s:3:"uÌ‘";s:2:"È—";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"È™";s:3:"Ț";s:2:"Èš";s:3:"ț";s:2:"È›";s:3:"HÌŒ";s:2:"Èž";s:3:"hÌŒ";s:2:"ÈŸ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"È©";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"È«";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"È­";s:3:"Ȯ";s:2:"È®";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"Ȱ";s:4:"ȱ";s:2:"ȱ";s:3:"YÌ„";s:2:"Ȳ";s:3:"yÌ„";s:2:"ȳ";s:4:"¨Ì";s:2:"Î…";s:4:"ΑÌ";s:2:"Ά";s:4:"ΕÌ";s:2:"Έ";s:4:"ΗÌ";s:2:"Ή";s:4:"ΙÌ";s:2:"Ί";s:4:"ΟÌ";s:2:"ÎŒ";s:4:"Î¥Ì";s:2:"ÎŽ";s:4:"ΩÌ";s:2:"Î";s:4:"ÏŠÌ";s:2:"Î";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"αÌ";s:2:"ά";s:4:"εÌ";s:2:"έ";s:4:"ηÌ";s:2:"ή";s:4:"ιÌ";s:2:"ί";s:4:"Ï‹Ì";s:2:"ΰ";s:4:"ϊ";s:2:"ÏŠ";s:4:"ϋ";s:2:"Ï‹";s:4:"οÌ";s:2:"ÏŒ";s:4:"Ï…Ì";s:2:"Ï";s:4:"ωÌ";s:2:"ÏŽ";s:4:"Ï’Ì";s:2:"Ï“";s:4:"ϔ";s:2:"Ï”";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ð";s:4:"ГÌ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"КÌ";s:2:"ÐŒ";s:4:"Ѝ";s:2:"Ð";s:4:"Ў";s:2:"ÐŽ";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"Ñ";s:4:"ё";s:2:"Ñ‘";s:4:"гÌ";s:2:"Ñ“";s:4:"ї";s:2:"Ñ—";s:4:"кÌ";s:2:"Ñœ";s:4:"ѝ";s:2:"Ñ";s:4:"ў";s:2:"Ñž";s:4:"Ñ´Ì";s:2:"Ѷ";s:4:"ѵÌ";s:2:"Ñ·";s:4:"Ӂ";s:2:"Ó";s:4:"ӂ";s:2:"Ó‚";s:4:"Ð̆";s:2:"Ó";s:4:"ӑ";s:2:"Ó‘";s:4:"Ð̈";s:2:"Ó’";s:4:"ӓ";s:2:"Ó“";s:4:"Ӗ";s:2:"Ó–";s:4:"ӗ";s:2:"Ó—";s:4:"Ӛ";s:2:"Óš";s:4:"ӛ";s:2:"Ó›";s:4:"Ӝ";s:2:"Óœ";s:4:"ӝ";s:2:"Ó";s:4:"Ӟ";s:2:"Óž";s:4:"ӟ";s:2:"ÓŸ";s:4:"Ӣ";s:2:"Ó¢";s:4:"ӣ";s:2:"Ó£";s:4:"Ӥ";s:2:"Ó¤";s:4:"ӥ";s:2:"Ó¥";s:4:"Ӧ";s:2:"Ó¦";s:4:"ӧ";s:2:"Ó§";s:4:"Ӫ";s:2:"Óª";s:4:"ӫ";s:2:"Ó«";s:4:"Ӭ";s:2:"Ó¬";s:4:"Ñ̈";s:2:"Ó­";s:4:"Ӯ";s:2:"Ó®";s:4:"ӯ";s:2:"Ó¯";s:4:"Ӱ";s:2:"Ó°";s:4:"ӱ";s:2:"Ó±";s:4:"Ӳ";s:2:"Ó²";s:4:"ӳ";s:2:"Ó³";s:4:"Ӵ";s:2:"Ó´";s:4:"ӵ";s:2:"Óµ";s:4:"Ӹ";s:2:"Ó¸";s:4:"ӹ";s:2:"Ó¹";s:4:"آ";s:2:"Ø¢";s:4:"أ";s:2:"Ø£";s:4:"ÙˆÙ”";s:2:"ؤ";s:4:"إ";s:2:"Ø¥";s:4:"ÙŠÙ”";s:2:"ئ";s:4:"Û•Ù”";s:2:"Û€";s:4:"ÛÙ”";s:2:"Û‚";s:4:"Û’Ù”";s:2:"Û“";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"à§‹";s:6:"ৌ";s:3:"à§Œ";s:6:"ୈ";s:3:"à­ˆ";s:6:"ୋ";s:3:"à­‹";s:6:"ୌ";s:3:"à­Œ";s:6:"ஔ";s:3:"à®”";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"à³€";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"à·š";s:6:"à·™à·";s:3:"à·œ";s:6:"ෝ";s:3:"à·";s:6:"ෞ";s:3:"à·ž";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"á¬á¬µ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"á­€";s:6:"ᭁ";s:3:"á­";s:6:"ᭃ";s:3:"á­ƒ";s:3:"AÌ¥";s:3:"Ḁ";s:3:"aÌ¥";s:3:"á¸";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"BÌ£";s:3:"Ḅ";s:3:"bÌ£";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"ÇÌ";s:3:"Ḉ";s:4:"çÌ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"DÌ£";s:3:"Ḍ";s:3:"dÌ£";s:3:"á¸";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"á¸";s:3:"ḑ";s:3:"ḑ";s:3:"DÌ­";s:3:"Ḓ";s:3:"dÌ­";s:3:"ḓ";s:4:"Ä’Ì€";s:3:"Ḕ";s:4:"ḕ";s:3:"ḕ";s:4:"Ä’Ì";s:3:"Ḗ";s:4:"Ä“Ì";s:3:"ḗ";s:3:"EÌ­";s:3:"Ḙ";s:3:"eÌ­";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"á¸";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"GÌ„";s:3:"Ḡ";s:3:"gÌ„";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"HÌ£";s:3:"Ḥ";s:3:"hÌ£";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"HÌ®";s:3:"Ḫ";s:3:"hÌ®";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:4:"ÃÌ";s:3:"Ḯ";s:4:"ïÌ";s:3:"ḯ";s:3:"KÌ";s:3:"Ḱ";s:3:"kÌ";s:3:"ḱ";s:3:"KÌ£";s:3:"Ḳ";s:3:"kÌ£";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"LÌ£";s:3:"Ḷ";s:3:"lÌ£";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"LÌ­";s:3:"Ḽ";s:3:"lÌ­";s:3:"ḽ";s:3:"MÌ";s:3:"Ḿ";s:3:"mÌ";s:3:"ḿ";s:3:"Ṁ";s:3:"á¹€";s:3:"ṁ";s:3:"á¹";s:3:"MÌ£";s:3:"Ṃ";s:3:"mÌ£";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"á¹…";s:3:"NÌ£";s:3:"Ṇ";s:3:"nÌ£";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"NÌ­";s:3:"Ṋ";s:3:"nÌ­";s:3:"ṋ";s:4:"ÕÌ";s:3:"Ṍ";s:4:"õÌ";s:3:"á¹";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"á¹";s:4:"Ṑ";s:3:"á¹";s:4:"ÅÌ€";s:3:"ṑ";s:4:"ÅŒÌ";s:3:"á¹’";s:4:"ÅÌ";s:3:"ṓ";s:3:"PÌ";s:3:"á¹”";s:3:"pÌ";s:3:"ṕ";s:3:"Ṗ";s:3:"á¹–";s:3:"ṗ";s:3:"á¹—";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"á¹™";s:3:"RÌ£";s:3:"Ṛ";s:3:"rÌ£";s:3:"á¹›";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"á¹";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"á¹ ";s:3:"ṡ";s:3:"ṡ";s:3:"SÌ£";s:3:"á¹¢";s:3:"sÌ£";s:3:"á¹£";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"á¹¥";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"á¹§";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"TÌ£";s:3:"Ṭ";s:3:"tÌ£";s:3:"á¹­";s:3:"Ṯ";s:3:"á¹®";s:3:"ṯ";s:3:"ṯ";s:3:"TÌ­";s:3:"á¹°";s:3:"tÌ­";s:3:"á¹±";s:3:"Ṳ";s:3:"á¹²";s:3:"ṳ";s:3:"á¹³";s:3:"Ṵ";s:3:"á¹´";s:3:"ṵ";s:3:"á¹µ";s:3:"UÌ­";s:3:"á¹¶";s:3:"uÌ­";s:3:"á¹·";s:4:"ŨÌ";s:3:"Ṹ";s:4:"Å©Ì";s:3:"á¹¹";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"á¹»";s:3:"Ṽ";s:3:"á¹¼";s:3:"ṽ";s:3:"á¹½";s:3:"VÌ£";s:3:"á¹¾";s:3:"vÌ£";s:3:"ṿ";s:3:"WÌ€";s:3:"Ẁ";s:3:"wÌ€";s:3:"áº";s:3:"WÌ";s:3:"Ẃ";s:3:"wÌ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"WÌ£";s:3:"Ẉ";s:3:"wÌ£";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"áº";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"áº";s:3:"zÌ‚";s:3:"ẑ";s:3:"ZÌ£";s:3:"Ẓ";s:3:"zÌ£";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"wÌŠ";s:3:"ẘ";s:3:"yÌŠ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"AÌ£";s:3:"Ạ";s:3:"aÌ£";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"ÂÌ";s:3:"Ấ";s:4:"âÌ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ä‚Ì";s:3:"Ắ";s:4:"ăÌ";s:3:"ắ";s:4:"Ằ";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"EÌ£";s:3:"Ẹ";s:3:"eÌ£";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"ÊÌ";s:3:"Ế";s:4:"êÌ";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"á»";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"á»…";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"IÌ£";s:3:"Ị";s:3:"iÌ£";s:3:"ị";s:3:"OÌ£";s:3:"Ọ";s:3:"oÌ£";s:3:"á»";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"á»";s:4:"ÔÌ";s:3:"á»";s:4:"ôÌ";s:3:"ố";s:4:"Ồ";s:3:"á»’";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"á»”";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"á»–";s:4:"ỗ";s:3:"á»—";s:5:"Ộ";s:3:"Ộ";s:5:"á»Ì‚";s:3:"á»™";s:4:"Æ Ì";s:3:"Ớ";s:4:"Æ¡Ì";s:3:"á»›";s:4:"Ờ";s:3:"Ờ";s:4:"ờ";s:3:"á»";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"á» ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"ợ";s:3:"ợ";s:3:"UÌ£";s:3:"Ụ";s:3:"uÌ£";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"á»§";s:4:"ƯÌ";s:3:"Ứ";s:4:"ưÌ";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"ừ";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"á»­";s:4:"Ữ";s:3:"á»®";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"á»°";s:4:"ự";s:3:"á»±";s:3:"YÌ€";s:3:"Ỳ";s:3:"yÌ€";s:3:"ỳ";s:3:"YÌ£";s:3:"á»´";s:3:"yÌ£";s:3:"ỵ";s:3:"Ỷ";s:3:"á»¶";s:3:"ỷ";s:3:"á»·";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"á¼€";s:4:"ἁ";s:3:"á¼";s:5:"ἂ";s:3:"ἂ";s:5:"á¼Ì€";s:3:"ἃ";s:5:"á¼€Ì";s:3:"ἄ";s:5:"á¼Ì";s:3:"á¼…";s:5:"ἆ";s:3:"ἆ";s:5:"á¼Í‚";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"ἈÌ";s:3:"Ἄ";s:5:"ἉÌ";s:3:"á¼";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"á¼";s:4:"ἑ";s:3:"ἑ";s:5:"á¼Ì€";s:3:"á¼’";s:5:"ἓ";s:3:"ἓ";s:5:"á¼Ì";s:3:"á¼”";s:5:"ἑÌ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"á¼™";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"á¼›";s:5:"ἘÌ";s:3:"Ἔ";s:5:"á¼™Ì";s:3:"á¼";s:4:"ἠ";s:3:"á¼ ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"á¼¢";s:5:"ἣ";s:3:"á¼£";s:5:"á¼ Ì";s:3:"ἤ";s:5:"ἡÌ";s:3:"á¼¥";s:5:"á¼ Í‚";s:3:"ἦ";s:5:"ἧ";s:3:"á¼§";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"ἨÌ";s:3:"Ἤ";s:5:"ἩÌ";s:3:"á¼­";s:5:"Ἦ";s:3:"á¼®";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"á¼°";s:4:"ἱ";s:3:"á¼±";s:5:"á¼°Ì€";s:3:"á¼²";s:5:"ἳ";s:3:"á¼³";s:5:"á¼°Ì";s:3:"á¼´";s:5:"á¼±Ì";s:3:"á¼µ";s:5:"á¼°Í‚";s:3:"á¼¶";s:5:"ἷ";s:3:"á¼·";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"á¼¹";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"á¼»";s:5:"ἸÌ";s:3:"á¼¼";s:5:"á¼¹Ì";s:3:"á¼½";s:5:"Ἶ";s:3:"á¼¾";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"á½€";s:4:"ὁ";s:3:"á½";s:5:"ὂ";s:3:"ὂ";s:5:"á½Ì€";s:3:"ὃ";s:5:"á½€Ì";s:3:"ὄ";s:5:"á½Ì";s:3:"á½…";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"ὈÌ";s:3:"Ὄ";s:5:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"á½";s:4:"Ï…Ì”";s:3:"ὑ";s:5:"á½Ì€";s:3:"á½’";s:5:"ὓ";s:3:"ὓ";s:5:"á½Ì";s:3:"á½”";s:5:"ὑÌ";s:3:"ὕ";s:5:"á½Í‚";s:3:"á½–";s:5:"ὗ";s:3:"á½—";s:4:"Ὑ";s:3:"á½™";s:5:"Ὓ";s:3:"á½›";s:5:"á½™Ì";s:3:"á½";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"á½ ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"á½¢";s:5:"ὣ";s:3:"á½£";s:5:"á½ Ì";s:3:"ὤ";s:5:"ὡÌ";s:3:"á½¥";s:5:"á½ Í‚";s:3:"ὦ";s:5:"ὧ";s:3:"á½§";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"ὨÌ";s:3:"Ὤ";s:5:"ὩÌ";s:3:"á½­";s:5:"Ὦ";s:3:"á½®";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"á½°";s:4:"ὲ";s:3:"á½²";s:4:"ὴ";s:3:"á½´";s:4:"ὶ";s:3:"á½¶";s:4:"ὸ";s:3:"ὸ";s:4:"Ï…Ì€";s:3:"ὺ";s:4:"ὼ";s:3:"á½¼";s:5:"ᾀ";s:3:"á¾€";s:5:"á¼Í…";s:3:"á¾";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"á¼…Í…";s:3:"á¾…";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"á¼Í…";s:3:"á¾";s:5:"ᾎ";s:3:"ᾎ";s:5:"á¼Í…";s:3:"á¾";s:5:"á¼ Í…";s:3:"á¾";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"á¾’";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"á¾”";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"á¾–";s:5:"á¼§Í…";s:3:"á¾—";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"á¾™";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"á¾›";s:5:"ᾜ";s:3:"ᾜ";s:5:"á¼­Í…";s:3:"á¾";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"á½ Í…";s:3:"á¾ ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"á¾¢";s:5:"ᾣ";s:3:"á¾£";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"á¾¥";s:5:"ᾦ";s:3:"ᾦ";s:5:"á½§Í…";s:3:"á¾§";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"á½­Í…";s:3:"á¾­";s:5:"ᾮ";s:3:"á¾®";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"á¾°";s:4:"ᾱ";s:3:"á¾±";s:5:"á½°Í…";s:3:"á¾²";s:4:"ᾳ";s:3:"á¾³";s:4:"ᾴ";s:3:"á¾´";s:4:"ᾶ";s:3:"á¾¶";s:5:"á¾¶Í…";s:3:"á¾·";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"á¾¹";s:4:"Ὰ";s:3:"Ὰ";s:4:"ᾼ";s:3:"á¾¼";s:4:"῁";s:3:"á¿";s:5:"á½´Í…";s:3:"á¿‚";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"á¿„";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:4:"Ὴ";s:3:"Ὴ";s:4:"ῌ";s:3:"ῌ";s:5:"῍";s:3:"á¿";s:5:"᾿Ì";s:3:"῎";s:5:"῏";s:3:"á¿";s:4:"ῐ";s:3:"á¿";s:4:"ῑ";s:3:"á¿‘";s:4:"ÏŠÌ€";s:3:"á¿’";s:4:"ῖ";s:3:"á¿–";s:4:"ÏŠÍ‚";s:3:"á¿—";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"á¿™";s:4:"Ὶ";s:3:"Ὶ";s:5:"῝";s:3:"á¿";s:5:"῾Ì";s:3:"῞";s:5:"῟";s:3:"῟";s:4:"ῠ";s:3:"á¿ ";s:4:"Ï…Ì„";s:3:"á¿¡";s:4:"ῢ";s:3:"á¿¢";s:4:"ÏÌ“";s:3:"ῤ";s:4:"ÏÌ”";s:3:"á¿¥";s:4:"Ï…Í‚";s:3:"ῦ";s:4:"ῧ";s:3:"á¿§";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"á¿©";s:4:"Ὺ";s:3:"Ὺ";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"á¿­";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ÏŽÍ…";s:3:"á¿´";s:4:"ῶ";s:3:"á¿¶";s:5:"á¿¶Í…";s:3:"á¿·";s:4:"Ὸ";s:3:"Ὸ";s:4:"Ὼ";s:3:"Ὼ";s:4:"ῼ";s:3:"ῼ";s:5:"â†Ì¸";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"â‡Ì¸";s:3:"â‡";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"â‡";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"â‰";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"â‰Ì¸";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"âŠ";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"â‹ ";s:5:"⋡";s:3:"â‹¡";s:5:"⋢";s:3:"â‹¢";s:5:"⋣";s:3:"â‹£";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"â‹«";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"â‹­";s:6:"ã‹ã‚™";s:3:"ãŒ";s:6:"ãã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ã‘ã‚™";s:3:"ã’";s:6:"ã“ã‚™";s:3:"ã”";s:6:"ã•ã‚™";s:3:"ã–";s:6:"ã—ã‚™";s:3:"ã˜";s:6:"ã™ã‚™";s:3:"ãš";s:6:"ã›ã‚™";s:3:"ãœ";s:6:"ãã‚™";s:3:"ãž";s:6:"ãŸã‚™";s:3:"ã ";s:6:"ã¡ã‚™";s:3:"ã¢";s:6:"ã¤ã‚™";s:3:"ã¥";s:6:"ã¦ã‚™";s:3:"ã§";s:6:"ã¨ã‚™";s:3:"ã©";s:6:"ã¯ã‚™";s:3:"ã°";s:6:"ã¯ã‚š";s:3:"ã±";s:6:"ã²ã‚™";s:3:"ã³";s:6:"ã²ã‚š";s:3:"ã´";s:6:"ãµã‚™";s:3:"ã¶";s:6:"ãµã‚š";s:3:"ã·";s:6:"ã¸ã‚™";s:3:"ã¹";s:6:"ã¸ã‚š";s:3:"ãº";s:6:"ã»ã‚™";s:3:"ã¼";s:6:"ã»ã‚š";s:3:"ã½";s:6:"ã†ã‚™";s:3:"ã‚”";s:6:"ã‚ã‚™";s:3:"ゞ";s:6:"ã‚«ã‚™";s:3:"ガ";s:6:"ã‚­ã‚™";s:3:"ã‚®";s:6:"グ";s:3:"ã‚°";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ã‚´";s:6:"ザ";s:3:"ã‚¶";s:6:"ã‚·ã‚™";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ã‚¿ã‚™";s:3:"ダ";s:6:"ãƒã‚™";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"ãƒã‚™";s:3:"ãƒ";s:6:"ãƒã‚š";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ãƒ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:8:"𑂚";s:4:"ð‘‚š";s:8:"𑂜";s:4:"ð‘‚œ";s:8:"𑂫";s:4:"ð‘‚«";s:8:"𑄮";s:4:"ð‘„®";s:8:"𑄯";s:4:"𑄯";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/canonicalDecomposition.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/canonicalDecomposition.ser new file mode 100644 index 0000000000..c1ee2b60f9 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/canonicalDecomposition.ser @@ -0,0 +1 @@ +a:2053:{s:2:"À";s:3:"AÌ€";s:2:"Ã";s:3:"AÌ";s:2:"Â";s:3:"AÌ‚";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Ã…";s:3:"AÌŠ";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"EÌ€";s:2:"É";s:3:"EÌ";s:2:"Ê";s:3:"EÌ‚";s:2:"Ë";s:3:"Ë";s:2:"ÃŒ";s:3:"IÌ€";s:2:"Ã";s:3:"IÌ";s:2:"ÃŽ";s:3:"IÌ‚";s:2:"Ã";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ã’";s:3:"OÌ€";s:2:"Ó";s:3:"OÌ";s:2:"Ô";s:3:"OÌ‚";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"UÌ€";s:2:"Ú";s:3:"UÌ";s:2:"Û";s:3:"UÌ‚";s:2:"Ü";s:3:"Ü";s:2:"Ã";s:3:"YÌ";s:2:"à";s:3:"aÌ€";s:2:"á";s:3:"aÌ";s:2:"â";s:3:"aÌ‚";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"Ã¥";s:3:"aÌŠ";s:2:"ç";s:3:"ç";s:2:"è";s:3:"eÌ€";s:2:"é";s:3:"eÌ";s:2:"ê";s:3:"eÌ‚";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"iÌ€";s:2:"í";s:3:"iÌ";s:2:"î";s:3:"iÌ‚";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"oÌ€";s:2:"ó";s:3:"oÌ";s:2:"ô";s:3:"oÌ‚";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"uÌ€";s:2:"ú";s:3:"uÌ";s:2:"û";s:3:"uÌ‚";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"yÌ";s:2:"ÿ";s:3:"ÿ";s:2:"Ä€";s:3:"AÌ„";s:2:"Ä";s:3:"aÌ„";s:2:"Ä‚";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ä„";s:3:"Ą";s:2:"Ä…";s:3:"ą";s:2:"Ć";s:3:"CÌ";s:2:"ć";s:3:"cÌ";s:2:"Ĉ";s:3:"CÌ‚";s:2:"ĉ";s:3:"cÌ‚";s:2:"ÄŠ";s:3:"Ċ";s:2:"Ä‹";s:3:"ċ";s:2:"ÄŒ";s:3:"CÌŒ";s:2:"Ä";s:3:"cÌŒ";s:2:"ÄŽ";s:3:"DÌŒ";s:2:"Ä";s:3:"dÌŒ";s:2:"Ä’";s:3:"EÌ„";s:2:"Ä“";s:3:"eÌ„";s:2:"Ä”";s:3:"Ĕ";s:2:"Ä•";s:3:"ĕ";s:2:"Ä–";s:3:"Ė";s:2:"Ä—";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"Ä™";s:3:"ę";s:2:"Äš";s:3:"EÌŒ";s:2:"Ä›";s:3:"eÌŒ";s:2:"Äœ";s:3:"GÌ‚";s:2:"Ä";s:3:"gÌ‚";s:2:"Äž";s:3:"Ğ";s:2:"ÄŸ";s:3:"ğ";s:2:"Ä ";s:3:"Ġ";s:2:"Ä¡";s:3:"ġ";s:2:"Ä¢";s:3:"Ģ";s:2:"Ä£";s:3:"ģ";s:2:"Ĥ";s:3:"HÌ‚";s:2:"Ä¥";s:3:"hÌ‚";s:2:"Ĩ";s:3:"Ĩ";s:2:"Ä©";s:3:"ĩ";s:2:"Ī";s:3:"IÌ„";s:2:"Ä«";s:3:"iÌ„";s:2:"Ĭ";s:3:"Ĭ";s:2:"Ä­";s:3:"ĭ";s:2:"Ä®";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"Ä´";s:3:"JÌ‚";s:2:"ĵ";s:3:"jÌ‚";s:2:"Ķ";s:3:"Ķ";s:2:"Ä·";s:3:"ķ";s:2:"Ĺ";s:3:"LÌ";s:2:"ĺ";s:3:"lÌ";s:2:"Ä»";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"LÌŒ";s:2:"ľ";s:3:"lÌŒ";s:2:"Ń";s:3:"NÌ";s:2:"Å„";s:3:"nÌ";s:2:"Å…";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"NÌŒ";s:2:"ň";s:3:"nÌŒ";s:2:"ÅŒ";s:3:"OÌ„";s:2:"Å";s:3:"oÌ„";s:2:"ÅŽ";s:3:"Ŏ";s:2:"Å";s:3:"ŏ";s:2:"Å";s:3:"OÌ‹";s:2:"Å‘";s:3:"oÌ‹";s:2:"Å”";s:3:"RÌ";s:2:"Å•";s:3:"rÌ";s:2:"Å–";s:3:"Ŗ";s:2:"Å—";s:3:"ŗ";s:2:"Ř";s:3:"RÌŒ";s:2:"Å™";s:3:"rÌŒ";s:2:"Åš";s:3:"SÌ";s:2:"Å›";s:3:"sÌ";s:2:"Åœ";s:3:"SÌ‚";s:2:"Å";s:3:"sÌ‚";s:2:"Åž";s:3:"Ş";s:2:"ÅŸ";s:3:"ş";s:2:"Å ";s:3:"SÌŒ";s:2:"Å¡";s:3:"sÌŒ";s:2:"Å¢";s:3:"Ţ";s:2:"Å£";s:3:"ţ";s:2:"Ť";s:3:"TÌŒ";s:2:"Å¥";s:3:"tÌŒ";s:2:"Ũ";s:3:"Ũ";s:2:"Å©";s:3:"ũ";s:2:"Ū";s:3:"UÌ„";s:2:"Å«";s:3:"uÌ„";s:2:"Ŭ";s:3:"Ŭ";s:2:"Å­";s:3:"ŭ";s:2:"Å®";s:3:"UÌŠ";s:2:"ů";s:3:"uÌŠ";s:2:"Ű";s:3:"UÌ‹";s:2:"ű";s:3:"uÌ‹";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Å´";s:3:"WÌ‚";s:2:"ŵ";s:3:"wÌ‚";s:2:"Ŷ";s:3:"YÌ‚";s:2:"Å·";s:3:"yÌ‚";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"ZÌ";s:2:"ź";s:3:"zÌ";s:2:"Å»";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"ZÌŒ";s:2:"ž";s:3:"zÌŒ";s:2:"Æ ";s:3:"OÌ›";s:2:"Æ¡";s:3:"oÌ›";s:2:"Ư";s:3:"UÌ›";s:2:"ư";s:3:"uÌ›";s:2:"Ç";s:3:"AÌŒ";s:2:"ÇŽ";s:3:"aÌŒ";s:2:"Ç";s:3:"IÌŒ";s:2:"Ç";s:3:"iÌŒ";s:2:"Ç‘";s:3:"OÌŒ";s:2:"Ç’";s:3:"oÌŒ";s:2:"Ç“";s:3:"UÌŒ";s:2:"Ç”";s:3:"uÌŒ";s:2:"Ç•";s:5:"Ǖ";s:2:"Ç–";s:5:"ǖ";s:2:"Ç—";s:5:"ÜÌ";s:2:"ǘ";s:5:"üÌ";s:2:"Ç™";s:5:"Ǚ";s:2:"Çš";s:5:"ǚ";s:2:"Ç›";s:5:"Ǜ";s:2:"Çœ";s:5:"ǜ";s:2:"Çž";s:5:"Ǟ";s:2:"ÇŸ";s:5:"ǟ";s:2:"Ç ";s:5:"Ǡ";s:2:"Ç¡";s:5:"ǡ";s:2:"Ç¢";s:4:"Ǣ";s:2:"Ç£";s:4:"ǣ";s:2:"Ǧ";s:3:"GÌŒ";s:2:"ǧ";s:3:"gÌŒ";s:2:"Ǩ";s:3:"KÌŒ";s:2:"Ç©";s:3:"kÌŒ";s:2:"Ǫ";s:3:"Ǫ";s:2:"Ç«";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"Ç­";s:5:"ǭ";s:2:"Ç®";s:4:"Æ·ÌŒ";s:2:"ǯ";s:4:"Ê’ÌŒ";s:2:"ǰ";s:3:"jÌŒ";s:2:"Ç´";s:3:"GÌ";s:2:"ǵ";s:3:"gÌ";s:2:"Ǹ";s:3:"NÌ€";s:2:"ǹ";s:3:"nÌ€";s:2:"Ǻ";s:5:"AÌŠÌ";s:2:"Ç»";s:5:"aÌŠÌ";s:2:"Ǽ";s:4:"ÆÌ";s:2:"ǽ";s:4:"æÌ";s:2:"Ǿ";s:4:"ØÌ";s:2:"Ç¿";s:4:"øÌ";s:2:"È€";s:3:"AÌ";s:2:"È";s:3:"aÌ";s:2:"È‚";s:3:"AÌ‘";s:2:"ȃ";s:3:"aÌ‘";s:2:"È„";s:3:"EÌ";s:2:"È…";s:3:"eÌ";s:2:"Ȇ";s:3:"EÌ‘";s:2:"ȇ";s:3:"eÌ‘";s:2:"Ȉ";s:3:"IÌ";s:2:"ȉ";s:3:"iÌ";s:2:"ÈŠ";s:3:"IÌ‘";s:2:"È‹";s:3:"iÌ‘";s:2:"ÈŒ";s:3:"OÌ";s:2:"È";s:3:"oÌ";s:2:"ÈŽ";s:3:"OÌ‘";s:2:"È";s:3:"oÌ‘";s:2:"È";s:3:"RÌ";s:2:"È‘";s:3:"rÌ";s:2:"È’";s:3:"RÌ‘";s:2:"È“";s:3:"rÌ‘";s:2:"È”";s:3:"UÌ";s:2:"È•";s:3:"uÌ";s:2:"È–";s:3:"UÌ‘";s:2:"È—";s:3:"uÌ‘";s:2:"Ș";s:3:"Ș";s:2:"È™";s:3:"ș";s:2:"Èš";s:3:"Ț";s:2:"È›";s:3:"ț";s:2:"Èž";s:3:"HÌŒ";s:2:"ÈŸ";s:3:"hÌŒ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"È©";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"È«";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"È­";s:5:"ȭ";s:2:"È®";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"YÌ„";s:2:"ȳ";s:3:"yÌ„";s:2:"Í€";s:2:"Ì€";s:2:"Í";s:2:"Ì";s:2:"̓";s:2:"Ì“";s:2:"Í„";s:4:"̈Ì";s:2:"Í´";s:2:"ʹ";s:2:";";s:1:";";s:2:"Î…";s:4:"¨Ì";s:2:"Ά";s:4:"ΑÌ";s:2:"·";s:2:"·";s:2:"Έ";s:4:"ΕÌ";s:2:"Ή";s:4:"ΗÌ";s:2:"Ί";s:4:"ΙÌ";s:2:"ÎŒ";s:4:"ΟÌ";s:2:"ÎŽ";s:4:"Î¥Ì";s:2:"Î";s:4:"ΩÌ";s:2:"Î";s:6:"ϊÌ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"αÌ";s:2:"έ";s:4:"εÌ";s:2:"ή";s:4:"ηÌ";s:2:"ί";s:4:"ιÌ";s:2:"ΰ";s:6:"ϋÌ";s:2:"ÏŠ";s:4:"ϊ";s:2:"Ï‹";s:4:"ϋ";s:2:"ÏŒ";s:4:"οÌ";s:2:"Ï";s:4:"Ï…Ì";s:2:"ÏŽ";s:4:"ωÌ";s:2:"Ï“";s:4:"Ï’Ì";s:2:"Ï”";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ð";s:4:"Ё";s:2:"Ѓ";s:4:"ГÌ";s:2:"Ї";s:4:"Ї";s:2:"ÐŒ";s:4:"КÌ";s:2:"Ð";s:4:"Ѝ";s:2:"ÐŽ";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"Ñ";s:4:"ѐ";s:2:"Ñ‘";s:4:"ё";s:2:"Ñ“";s:4:"гÌ";s:2:"Ñ—";s:4:"ї";s:2:"Ñœ";s:4:"кÌ";s:2:"Ñ";s:4:"ѝ";s:2:"Ñž";s:4:"ў";s:2:"Ѷ";s:4:"Ñ´Ì";s:2:"Ñ·";s:4:"ѵÌ";s:2:"Ó";s:4:"Ӂ";s:2:"Ó‚";s:4:"ӂ";s:2:"Ó";s:4:"Ð̆";s:2:"Ó‘";s:4:"ӑ";s:2:"Ó’";s:4:"Ð̈";s:2:"Ó“";s:4:"ӓ";s:2:"Ó–";s:4:"Ӗ";s:2:"Ó—";s:4:"ӗ";s:2:"Óš";s:4:"Ӛ";s:2:"Ó›";s:4:"ӛ";s:2:"Óœ";s:4:"Ӝ";s:2:"Ó";s:4:"ӝ";s:2:"Óž";s:4:"Ӟ";s:2:"ÓŸ";s:4:"ӟ";s:2:"Ó¢";s:4:"Ӣ";s:2:"Ó£";s:4:"ӣ";s:2:"Ó¤";s:4:"Ӥ";s:2:"Ó¥";s:4:"ӥ";s:2:"Ó¦";s:4:"Ӧ";s:2:"Ó§";s:4:"ӧ";s:2:"Óª";s:4:"Ӫ";s:2:"Ó«";s:4:"ӫ";s:2:"Ó¬";s:4:"Ӭ";s:2:"Ó­";s:4:"Ñ̈";s:2:"Ó®";s:4:"Ӯ";s:2:"Ó¯";s:4:"ӯ";s:2:"Ó°";s:4:"Ӱ";s:2:"Ó±";s:4:"ӱ";s:2:"Ó²";s:4:"Ӳ";s:2:"Ó³";s:4:"ӳ";s:2:"Ó´";s:4:"Ӵ";s:2:"Óµ";s:4:"ӵ";s:2:"Ó¸";s:4:"Ӹ";s:2:"Ó¹";s:4:"ӹ";s:2:"Ø¢";s:4:"آ";s:2:"Ø£";s:4:"أ";s:2:"ؤ";s:4:"ÙˆÙ”";s:2:"Ø¥";s:4:"إ";s:2:"ئ";s:4:"ÙŠÙ”";s:2:"Û€";s:4:"Û•Ù”";s:2:"Û‚";s:4:"ÛÙ”";s:2:"Û“";s:4:"Û’Ù”";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"à¥";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"à§‹";s:6:"ো";s:3:"à§Œ";s:6:"ৌ";s:3:"à§œ";s:6:"ড়";s:3:"à§";s:6:"ঢ়";s:3:"à§Ÿ";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"à©™";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"à©›";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"à­ˆ";s:6:"ୈ";s:3:"à­‹";s:6:"ୋ";s:3:"à­Œ";s:6:"ୌ";s:3:"à­œ";s:6:"ଡ଼";s:3:"à­";s:6:"ଢ଼";s:3:"à®”";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"à³€";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"à·š";s:6:"ේ";s:3:"à·œ";s:6:"à·™à·";s:3:"à·";s:9:"à·™à·à·Š";s:3:"à·ž";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"à½";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"à¾";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"à¾";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"à¾à¾µ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"á¬á¬µ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"á­€";s:6:"ᭀ";s:3:"á­";s:6:"ᭁ";s:3:"á­ƒ";s:6:"ᭃ";s:3:"Ḁ";s:3:"AÌ¥";s:3:"á¸";s:3:"aÌ¥";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"BÌ£";s:3:"ḅ";s:3:"bÌ£";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"ÇÌ";s:3:"ḉ";s:5:"çÌ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"DÌ£";s:3:"á¸";s:3:"dÌ£";s:3:"Ḏ";s:3:"Ḏ";s:3:"á¸";s:3:"ḏ";s:3:"á¸";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"DÌ­";s:3:"ḓ";s:3:"dÌ­";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"EÌ„Ì";s:3:"ḗ";s:5:"eÌ„Ì";s:3:"Ḙ";s:3:"EÌ­";s:3:"ḙ";s:3:"eÌ­";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"á¸";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"GÌ„";s:3:"ḡ";s:3:"gÌ„";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"HÌ£";s:3:"ḥ";s:3:"hÌ£";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"HÌ®";s:3:"ḫ";s:3:"hÌ®";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"ÏÌ";s:3:"ḯ";s:5:"ïÌ";s:3:"Ḱ";s:3:"KÌ";s:3:"ḱ";s:3:"kÌ";s:3:"Ḳ";s:3:"KÌ£";s:3:"ḳ";s:3:"kÌ£";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"LÌ£";s:3:"ḷ";s:3:"lÌ£";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"LÌ­";s:3:"ḽ";s:3:"lÌ­";s:3:"Ḿ";s:3:"MÌ";s:3:"ḿ";s:3:"mÌ";s:3:"á¹€";s:3:"Ṁ";s:3:"á¹";s:3:"ṁ";s:3:"Ṃ";s:3:"MÌ£";s:3:"ṃ";s:3:"mÌ£";s:3:"Ṅ";s:3:"Ṅ";s:3:"á¹…";s:3:"ṅ";s:3:"Ṇ";s:3:"NÌ£";s:3:"ṇ";s:3:"nÌ£";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"NÌ­";s:3:"ṋ";s:3:"nÌ­";s:3:"Ṍ";s:5:"ÕÌ";s:3:"á¹";s:5:"õÌ";s:3:"Ṏ";s:5:"Ṏ";s:3:"á¹";s:5:"ṏ";s:3:"á¹";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"á¹’";s:5:"OÌ„Ì";s:3:"ṓ";s:5:"oÌ„Ì";s:3:"á¹”";s:3:"PÌ";s:3:"ṕ";s:3:"pÌ";s:3:"á¹–";s:3:"Ṗ";s:3:"á¹—";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"á¹™";s:3:"ṙ";s:3:"Ṛ";s:3:"RÌ£";s:3:"á¹›";s:3:"rÌ£";s:3:"Ṝ";s:5:"Ṝ";s:3:"á¹";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"á¹ ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"á¹¢";s:3:"SÌ£";s:3:"á¹£";s:3:"sÌ£";s:3:"Ṥ";s:5:"SÌ̇";s:3:"á¹¥";s:5:"sÌ̇";s:3:"Ṧ";s:5:"Ṧ";s:3:"á¹§";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"TÌ£";s:3:"á¹­";s:3:"tÌ£";s:3:"á¹®";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"á¹°";s:3:"TÌ­";s:3:"á¹±";s:3:"tÌ­";s:3:"á¹²";s:3:"Ṳ";s:3:"á¹³";s:3:"ṳ";s:3:"á¹´";s:3:"Ṵ";s:3:"á¹µ";s:3:"ṵ";s:3:"á¹¶";s:3:"UÌ­";s:3:"á¹·";s:3:"uÌ­";s:3:"Ṹ";s:5:"ŨÌ";s:3:"á¹¹";s:5:"ũÌ";s:3:"Ṻ";s:5:"Ṻ";s:3:"á¹»";s:5:"ṻ";s:3:"á¹¼";s:3:"Ṽ";s:3:"á¹½";s:3:"ṽ";s:3:"á¹¾";s:3:"VÌ£";s:3:"ṿ";s:3:"vÌ£";s:3:"Ẁ";s:3:"WÌ€";s:3:"áº";s:3:"wÌ€";s:3:"Ẃ";s:3:"WÌ";s:3:"ẃ";s:3:"wÌ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"WÌ£";s:3:"ẉ";s:3:"wÌ£";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"áº";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"áº";s:3:"ẏ";s:3:"áº";s:3:"ZÌ‚";s:3:"ẑ";s:3:"zÌ‚";s:3:"Ẓ";s:3:"ZÌ£";s:3:"ẓ";s:3:"zÌ£";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"wÌŠ";s:3:"ẙ";s:3:"yÌŠ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"AÌ£";s:3:"ạ";s:3:"aÌ£";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"AÌ‚Ì";s:3:"ấ";s:5:"aÌ‚Ì";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"ĂÌ";s:3:"ắ";s:5:"ăÌ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"EÌ£";s:3:"ẹ";s:3:"eÌ£";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"EÌ‚Ì";s:3:"ế";s:5:"eÌ‚Ì";s:3:"Ề";s:5:"Ề";s:3:"á»";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"á»…";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"IÌ£";s:3:"ị";s:3:"iÌ£";s:3:"Ọ";s:3:"OÌ£";s:3:"á»";s:3:"oÌ£";s:3:"Ỏ";s:3:"Ỏ";s:3:"á»";s:3:"ỏ";s:3:"á»";s:5:"OÌ‚Ì";s:3:"ố";s:5:"oÌ‚Ì";s:3:"á»’";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"á»”";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"á»–";s:5:"Ỗ";s:3:"á»—";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"á»™";s:5:"ộ";s:3:"Ớ";s:5:"OÌ›Ì";s:3:"á»›";s:5:"oÌ›Ì";s:3:"Ờ";s:5:"Ờ";s:3:"á»";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"á» ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"UÌ£";s:3:"ụ";s:3:"uÌ£";s:3:"Ủ";s:3:"Ủ";s:3:"á»§";s:3:"ủ";s:3:"Ứ";s:5:"UÌ›Ì";s:3:"ứ";s:5:"uÌ›Ì";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"á»­";s:5:"ử";s:3:"á»®";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"á»°";s:5:"Ự";s:3:"á»±";s:5:"ự";s:3:"Ỳ";s:3:"YÌ€";s:3:"ỳ";s:3:"yÌ€";s:3:"á»´";s:3:"YÌ£";s:3:"ỵ";s:3:"yÌ£";s:3:"á»¶";s:3:"Ỷ";s:3:"á»·";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"á¼€";s:4:"ἀ";s:3:"á¼";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἀÌ";s:3:"á¼…";s:6:"ἁÌ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"ἈÌ";s:3:"á¼";s:6:"ἉÌ";s:3:"Ἆ";s:6:"Ἆ";s:3:"á¼";s:6:"Ἇ";s:3:"á¼";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"á¼’";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"á¼”";s:6:"ἐÌ";s:3:"ἕ";s:6:"ἑÌ";s:3:"Ἐ";s:4:"Ἐ";s:3:"á¼™";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"á¼›";s:6:"Ἓ";s:3:"Ἔ";s:6:"ἘÌ";s:3:"á¼";s:6:"ἙÌ";s:3:"á¼ ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"á¼¢";s:6:"ἢ";s:3:"á¼£";s:6:"ἣ";s:3:"ἤ";s:6:"ἠÌ";s:3:"á¼¥";s:6:"ἡÌ";s:3:"ἦ";s:6:"ἦ";s:3:"á¼§";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"ἨÌ";s:3:"á¼­";s:6:"ἩÌ";s:3:"á¼®";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"á¼°";s:4:"ἰ";s:3:"á¼±";s:4:"ἱ";s:3:"á¼²";s:6:"ἲ";s:3:"á¼³";s:6:"ἳ";s:3:"á¼´";s:6:"ἰÌ";s:3:"á¼µ";s:6:"ἱÌ";s:3:"á¼¶";s:6:"ἶ";s:3:"á¼·";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"á¼¹";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"á¼»";s:6:"Ἳ";s:3:"á¼¼";s:6:"ἸÌ";s:3:"á¼½";s:6:"ἹÌ";s:3:"á¼¾";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"á½€";s:4:"ὀ";s:3:"á½";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὀÌ";s:3:"á½…";s:6:"ὁÌ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"ὈÌ";s:3:"á½";s:6:"ὉÌ";s:3:"á½";s:4:"Ï…Ì“";s:3:"ὑ";s:4:"Ï…Ì”";s:3:"á½’";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"á½”";s:6:"Ï…Ì“Ì";s:3:"ὕ";s:6:"Ï…Ì”Ì";s:3:"á½–";s:6:"ὖ";s:3:"á½—";s:6:"ὗ";s:3:"á½™";s:4:"Ὑ";s:3:"á½›";s:6:"Ὓ";s:3:"á½";s:6:"ὙÌ";s:3:"Ὗ";s:6:"Ὗ";s:3:"á½ ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"á½¢";s:6:"ὢ";s:3:"á½£";s:6:"ὣ";s:3:"ὤ";s:6:"ὠÌ";s:3:"á½¥";s:6:"ὡÌ";s:3:"ὦ";s:6:"ὦ";s:3:"á½§";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"ὨÌ";s:3:"á½­";s:6:"ὩÌ";s:3:"á½®";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"á½°";s:4:"ὰ";s:3:"á½±";s:4:"αÌ";s:3:"á½²";s:4:"ὲ";s:3:"á½³";s:4:"εÌ";s:3:"á½´";s:4:"ὴ";s:3:"á½µ";s:4:"ηÌ";s:3:"á½¶";s:4:"ὶ";s:3:"á½·";s:4:"ιÌ";s:3:"ὸ";s:4:"ὸ";s:3:"á½¹";s:4:"οÌ";s:3:"ὺ";s:4:"Ï…Ì€";s:3:"á½»";s:4:"Ï…Ì";s:3:"á½¼";s:4:"ὼ";s:3:"á½½";s:4:"ωÌ";s:3:"á¾€";s:6:"ᾀ";s:3:"á¾";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ἀÌÍ…";s:3:"á¾…";s:8:"ἁÌÍ…";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ἈÌÍ…";s:3:"á¾";s:8:"ἉÌÍ…";s:3:"ᾎ";s:8:"ᾎ";s:3:"á¾";s:8:"ᾏ";s:3:"á¾";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"á¾’";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"á¾”";s:8:"ἠÌÍ…";s:3:"ᾕ";s:8:"ἡÌÍ…";s:3:"á¾–";s:8:"ᾖ";s:3:"á¾—";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"á¾™";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"á¾›";s:8:"ᾛ";s:3:"ᾜ";s:8:"ἨÌÍ…";s:3:"á¾";s:8:"ἩÌÍ…";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"á¾ ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"á¾¢";s:8:"ᾢ";s:3:"á¾£";s:8:"ᾣ";s:3:"ᾤ";s:8:"ὠÌÍ…";s:3:"á¾¥";s:8:"ὡÌÍ…";s:3:"ᾦ";s:8:"ᾦ";s:3:"á¾§";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ὨÌÍ…";s:3:"á¾­";s:8:"ὩÌÍ…";s:3:"á¾®";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"á¾°";s:4:"ᾰ";s:3:"á¾±";s:4:"ᾱ";s:3:"á¾²";s:6:"ᾲ";s:3:"á¾³";s:4:"ᾳ";s:3:"á¾´";s:6:"αÌÍ…";s:3:"á¾¶";s:4:"ᾶ";s:3:"á¾·";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"á¾¹";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"á¾»";s:4:"ΑÌ";s:3:"á¾¼";s:4:"ᾼ";s:3:"á¾¾";s:2:"ι";s:3:"á¿";s:4:"῁";s:3:"á¿‚";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"á¿„";s:6:"ηÌÍ…";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"ΕÌ";s:3:"Ὴ";s:4:"Ὴ";s:3:"á¿‹";s:4:"ΗÌ";s:3:"ῌ";s:4:"ῌ";s:3:"á¿";s:5:"῍";s:3:"῎";s:5:"᾿Ì";s:3:"á¿";s:5:"῏";s:3:"á¿";s:4:"ῐ";s:3:"á¿‘";s:4:"ῑ";s:3:"á¿’";s:6:"ῒ";s:3:"á¿“";s:6:"ϊÌ";s:3:"á¿–";s:4:"ῖ";s:3:"á¿—";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"á¿™";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"á¿›";s:4:"ΙÌ";s:3:"á¿";s:5:"῝";s:3:"῞";s:5:"῾Ì";s:3:"῟";s:5:"῟";s:3:"á¿ ";s:4:"ῠ";s:3:"á¿¡";s:4:"Ï…Ì„";s:3:"á¿¢";s:6:"ῢ";s:3:"á¿£";s:6:"ϋÌ";s:3:"ῤ";s:4:"ÏÌ“";s:3:"á¿¥";s:4:"ÏÌ”";s:3:"ῦ";s:4:"Ï…Í‚";s:3:"á¿§";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"á¿©";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"á¿«";s:4:"Î¥Ì";s:3:"Ῥ";s:4:"Ῥ";s:3:"á¿­";s:4:"῭";s:3:"á¿®";s:4:"¨Ì";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"á¿´";s:6:"ωÌÍ…";s:3:"á¿¶";s:4:"ῶ";s:3:"á¿·";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"ΟÌ";s:3:"Ὼ";s:4:"Ὼ";s:3:"á¿»";s:4:"ΩÌ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:"â€";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"â„«";s:3:"AÌŠ";s:3:"↚";s:5:"â†Ì¸";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"â‡";s:5:"â‡Ì¸";s:3:"⇎";s:5:"⇎";s:3:"â‡";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"â‰";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"â‰Ì¸";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"âŠ";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"â‹ ";s:5:"⋠";s:3:"â‹¡";s:5:"⋡";s:3:"â‹¢";s:5:"⋢";s:3:"â‹£";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"â‹«";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"â‹­";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"⫝̸";s:5:"â«Ì¸";s:3:"ãŒ";s:6:"ã‹ã‚™";s:3:"ãŽ";s:6:"ãã‚™";s:3:"ã";s:6:"ãã‚™";s:3:"ã’";s:6:"ã‘ã‚™";s:3:"ã”";s:6:"ã“ã‚™";s:3:"ã–";s:6:"ã•ã‚™";s:3:"ã˜";s:6:"ã—ã‚™";s:3:"ãš";s:6:"ã™ã‚™";s:3:"ãœ";s:6:"ã›ã‚™";s:3:"ãž";s:6:"ãã‚™";s:3:"ã ";s:6:"ãŸã‚™";s:3:"ã¢";s:6:"ã¡ã‚™";s:3:"ã¥";s:6:"ã¤ã‚™";s:3:"ã§";s:6:"ã¦ã‚™";s:3:"ã©";s:6:"ã¨ã‚™";s:3:"ã°";s:6:"ã¯ã‚™";s:3:"ã±";s:6:"ã¯ã‚š";s:3:"ã³";s:6:"ã²ã‚™";s:3:"ã´";s:6:"ã²ã‚š";s:3:"ã¶";s:6:"ãµã‚™";s:3:"ã·";s:6:"ãµã‚š";s:3:"ã¹";s:6:"ã¸ã‚™";s:3:"ãº";s:6:"ã¸ã‚š";s:3:"ã¼";s:6:"ã»ã‚™";s:3:"ã½";s:6:"ã»ã‚š";s:3:"ã‚”";s:6:"ã†ã‚™";s:3:"ゞ";s:6:"ã‚ã‚™";s:3:"ガ";s:6:"ã‚«ã‚™";s:3:"ã‚®";s:6:"ã‚­ã‚™";s:3:"ã‚°";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ã‚´";s:6:"ゴ";s:3:"ã‚¶";s:6:"ザ";s:3:"ジ";s:6:"ã‚·ã‚™";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ã‚¿ã‚™";s:3:"ヂ";s:6:"ãƒã‚™";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"ãƒ";s:6:"ãƒã‚™";s:3:"パ";s:6:"ãƒã‚š";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ãƒ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"ï¤";s:3:"æ›´";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"å¥";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"å–‡";s:3:"奈";s:3:"奈";s:3:"ï¤";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"ï¤";s:3:"ç¾…";s:3:"ï¤";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"é‚";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"æ´›";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"çž";s:3:"落";s:3:"è½";s:3:"酪";s:3:"é…ª";s:3:"駱";s:3:"é§±";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"åµ";s:3:"ï¤";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"åµ";s:3:"濫";s:3:"æ¿«";s:3:"藍";s:3:"è—";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"è Ÿ";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"æ“„";s:3:"櫓";s:3:"æ«“";s:3:"爐";s:3:"çˆ";s:3:"盧";s:3:"ç›§";s:3:"老";s:3:"è€";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"è·¯";s:3:"露";s:3:"露";s:3:"魯";s:3:"é­¯";s:3:"鷺";s:3:"é·º";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"ç¶ ";s:3:"菉";s:3:"è‰";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"ï¥";s:3:"è«–";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"ç± ";s:3:"聾";s:3:"è¾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"é›·";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"å±¢";s:3:"樓";s:3:"樓";s:3:"ï¥";s:3:"æ·š";s:3:"漏";s:3:"æ¼";s:3:"ï¥";s:3:"ç´¯";s:3:"ï¥";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"å‹’";s:3:"肋";s:3:"è‚‹";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"ç¶¾";s:3:"菱";s:3:"è±";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"æ‹";s:3:"樂";s:3:"樂";s:3:"ï¥";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"ç•°";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"ä¸";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"ç´¢";s:3:"參";s:3:"åƒ";s:3:"塞";s:3:"塞";s:3:"省";s:3:"çœ";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"è¾°";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"è‹¥";s:3:"掠";s:3:"掠";s:3:"略";s:3:"ç•¥";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"å…©";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"æ¢";s:3:"糧";s:3:"ç³§";s:3:"良";s:3:"良";s:3:"諒";s:3:"è«’";s:3:"量";s:3:"é‡";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"å‘‚";s:3:"ï¦";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"æ—…";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"é–­";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"æ­·";s:3:"ï¦";s:3:"è½¢";s:3:"年";s:3:"å¹´";s:3:"ï¦";s:3:"æ†";s:3:"ï¦";s:3:"戀";s:3:"撚";s:3:"æ’š";s:3:"漣";s:3:"æ¼£";s:3:"煉";s:3:"ç…‰";s:3:"璉";s:3:"ç’‰";s:3:"秊";s:3:"ç§Š";s:3:"練";s:3:"ç·´";s:3:"聯";s:3:"è¯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"è“®";s:3:"連";s:3:"連";s:3:"鍊";s:3:"éŠ";s:3:"列";s:3:"列";s:3:"ï¦";s:3:"劣";s:3:"咽";s:3:"å’½";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"æ»";s:3:"殮";s:3:"æ®®";s:3:"簾";s:3:"ç°¾";s:3:"獵";s:3:"çµ";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"ç‘©";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"è†";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"é›¶";s:3:"靈";s:3:"éˆ";s:3:"領";s:3:"é ˜";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"å°¿";s:3:"料";s:3:"æ–™";s:3:"樂";s:3:"樂";s:3:"ï§€";s:3:"燎";s:3:"ï§";s:3:"療";s:3:"ï§‚";s:3:"蓼";s:3:"遼";s:3:"é¼";s:3:"ï§„";s:3:"é¾";s:3:"ï§…";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"æ»";s:3:"柳";s:3:"柳";s:3:"ï§Š";s:3:"æµ";s:3:"ï§‹";s:3:"溜";s:3:"ï§Œ";s:3:"ç‰";s:3:"ï§";s:3:"ç•™";s:3:"ï§Ž";s:3:"ç¡«";s:3:"ï§";s:3:"ç´";s:3:"ï§";s:3:"類";s:3:"ï§‘";s:3:"å…­";s:3:"ï§’";s:3:"戮";s:3:"ï§“";s:3:"陸";s:3:"ï§”";s:3:"倫";s:3:"ï§•";s:3:"å´™";s:3:"ï§–";s:3:"æ·ª";s:3:"ï§—";s:3:"輪";s:3:"律";s:3:"律";s:3:"ï§™";s:3:"æ…„";s:3:"ï§š";s:3:"æ —";s:3:"ï§›";s:3:"率";s:3:"ï§œ";s:3:"隆";s:3:"ï§";s:3:"利";s:3:"ï§ž";s:3:"å";s:3:"ï§Ÿ";s:3:"å±¥";s:3:"ï§ ";s:3:"易";s:3:"ï§¡";s:3:"æŽ";s:3:"ï§¢";s:3:"梨";s:3:"ï§£";s:3:"æ³¥";s:3:"理";s:3:"ç†";s:3:"ï§¥";s:3:"ç—¢";s:3:"罹";s:3:"ç½¹";s:3:"ï§§";s:3:"è£";s:3:"裡";s:3:"裡";s:3:"ï§©";s:3:"里";s:3:"離";s:3:"離";s:3:"ï§«";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"ï§­";s:3:"å";s:3:"ï§®";s:3:"ç‡";s:3:"璘";s:3:"ç’˜";s:3:"ï§°";s:3:"è—º";s:3:"ï§±";s:3:"隣";s:3:"ï§²";s:3:"é±—";s:3:"ï§³";s:3:"麟";s:3:"ï§´";s:3:"æž—";s:3:"ï§µ";s:3:"æ·‹";s:3:"ï§¶";s:3:"臨";s:3:"ï§·";s:3:"ç«‹";s:3:"笠";s:3:"笠";s:3:"ï§¹";s:3:"ç²’";s:3:"狀";s:3:"ç‹€";s:3:"ï§»";s:3:"ç‚™";s:3:"ï§¼";s:3:"è­˜";s:3:"ï§½";s:3:"什";s:3:"ï§¾";s:3:"茶";s:3:"ï§¿";s:3:"刺";s:3:"切";s:3:"切";s:3:"ï¨";s:3:"度";s:3:"拓";s:3:"æ‹“";s:3:"糖";s:3:"ç³–";s:3:"宅";s:3:"å®…";s:3:"洞";s:3:"æ´ž";s:3:"暴";s:3:"æš´";s:3:"輻";s:3:"è¼»";s:3:"行";s:3:"行";s:3:"降";s:3:"é™";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"å…€";s:3:"ï¨";s:3:"å—€";s:3:"ï¨";s:3:"塚";s:3:"晴";s:3:"æ™´";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"ç¦";s:3:"靖";s:3:"é–";s:3:"ï¨";s:3:"ç²¾";s:3:"羽";s:3:"ç¾½";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"é¶´";s:3:"郞";s:3:"郞";s:3:"隷";s:3:"éš·";s:3:"侮";s:3:"ä¾®";s:3:"僧";s:3:"僧";s:3:"免";s:3:"å…";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"å‘";s:3:"喝";s:3:"å–";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"å¡€";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"å±®";s:3:"悔";s:3:"æ‚”";s:3:"慨";s:3:"æ…¨";s:3:"憎";s:3:"憎";s:3:"ï©€";s:3:"懲";s:3:"ï©";s:3:"æ•";s:3:"ï©‚";s:3:"æ—¢";s:3:"暑";s:3:"æš‘";s:3:"ï©„";s:3:"梅";s:3:"ï©…";s:3:"æµ·";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"æ¼¢";s:3:"煮";s:3:"ç…®";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"ç¢";s:3:"ï©‹";s:3:"碑";s:3:"社";s:3:"社";s:3:"ï©";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"ï©";s:3:"ç¥";s:3:"ï©";s:3:"祖";s:3:"ï©‘";s:3:"ç¥";s:3:"ï©’";s:3:"ç¦";s:3:"ï©“";s:3:"禎";s:3:"ï©”";s:3:"ç©€";s:3:"ï©•";s:3:"çª";s:3:"ï©–";s:3:"節";s:3:"ï©—";s:3:"ç·´";s:3:"縉";s:3:"縉";s:3:"ï©™";s:3:"ç¹";s:3:"署";s:3:"ç½²";s:3:"ï©›";s:3:"者";s:3:"臭";s:3:"臭";s:3:"ï©";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"è‘—";s:3:"ï© ";s:3:"è¤";s:3:"ï©¡";s:3:"視";s:3:"ï©¢";s:3:"è¬";s:3:"ï©£";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"ï©¥";s:3:"è´ˆ";s:3:"辶";s:3:"è¾¶";s:3:"ï©§";s:3:"逸";s:3:"難";s:3:"難";s:3:"ï©©";s:3:"響";s:3:"頻";s:3:"é »";s:3:"ï©«";s:3:"æµ";s:3:"𤋮";s:4:"𤋮";s:3:"ï©­";s:3:"舘";s:3:"ï©°";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"å…¨";s:3:"侀";s:3:"ä¾€";s:3:"ï©´";s:3:"å……";s:3:"冀";s:3:"冀";s:3:"ï©¶";s:3:"勇";s:3:"ï©·";s:3:"勺";s:3:"喝";s:3:"å–";s:3:"啕";s:3:"å••";s:3:"喙";s:3:"å–™";s:3:"ï©»";s:3:"å—¢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"ï©¿";s:3:"奔";s:3:"婢";s:3:"å©¢";s:3:"ïª";s:3:"嬨";s:3:"廒";s:3:"å»’";s:3:"廙";s:3:"å»™";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"å¾­";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"æ…Ž";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"æ… ";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"ïª";s:3:"æ„";s:3:"搜";s:3:"æœ";s:3:"ïª";s:3:"æ‘’";s:3:"ïª";s:3:"æ•–";s:3:"晴";s:3:"æ™´";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"æ–";s:3:"歹";s:3:"æ­¹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"æµ";s:3:"滛";s:3:"æ»›";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"æ¼¢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"ç…®";s:3:"ïª";s:3:"çž§";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"ç”»";s:3:"瘝";s:3:"ç˜";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"ç››";s:3:"直";s:3:"ç›´";s:3:"睊";s:3:"çŠ";s:3:"着";s:3:"ç€";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"ç±»";s:3:"絛";s:3:"çµ›";s:3:"練";s:3:"ç·´";s:3:"缾";s:3:"ç¼¾";s:3:"者";s:3:"者";s:3:"荒";s:3:"è’";s:3:"華";s:3:"è¯";s:3:"蝹";s:3:"è¹";s:3:"襁";s:3:"è¥";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"è«‹";s:3:"謁";s:3:"è¬";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"è«­";s:3:"謹";s:3:"謹";s:3:"ï«€";s:3:"變";s:3:"ï«";s:3:"è´ˆ";s:3:"ï«‚";s:3:"輸";s:3:"遲";s:3:"é²";s:3:"ï«„";s:3:"醙";s:3:"ï«…";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"é–";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"ï«‹";s:3:"é ‹";s:3:"頻";s:3:"é »";s:3:"ï«";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"ï«";s:4:"𢡊";s:3:"ï«";s:4:"𢡄";s:3:"ï«‘";s:4:"ð£•";s:3:"ï«’";s:3:"ã®";s:3:"ï«“";s:3:"䀘";s:3:"ï«”";s:3:"䀹";s:3:"ï«•";s:4:"𥉉";s:3:"ï«–";s:4:"ð¥³";s:3:"ï«—";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"ï«™";s:3:"龎";s:3:"ï¬";s:4:"×™Ö´";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"ש×";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּ×";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"×Ö·";s:3:"אָ";s:4:"×Ö¸";s:3:"אּ";s:4:"×Ö¼";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"×’Ö¼";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"×”Ö¼";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"×–Ö¼";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"×™Ö¼";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"×›Ö¼";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"ï­€";s:4:"× Ö¼";s:3:"ï­";s:4:"סּ";s:3:"ï­ƒ";s:4:"×£Ö¼";s:3:"ï­„";s:4:"פּ";s:3:"ï­†";s:4:"צּ";s:3:"ï­‡";s:4:"×§Ö¼";s:3:"ï­ˆ";s:4:"רּ";s:3:"ï­‰";s:4:"שּ";s:3:"ï­Š";s:4:"תּ";s:3:"ï­‹";s:4:"וֹ";s:3:"ï­Œ";s:4:"בֿ";s:3:"ï­";s:4:"×›Ö¿";s:3:"ï­Ž";s:4:"פֿ";s:4:"ð‘‚š";s:8:"𑂚";s:4:"ð‘‚œ";s:8:"𑂜";s:4:"ð‘‚«";s:8:"𑂫";s:4:"ð‘„®";s:8:"𑄮";s:4:"𑄯";s:8:"𑄯";s:4:"ð…ž";s:8:"ð…—ð…¥";s:4:"ð…Ÿ";s:8:"ð…˜ð…¥";s:4:"ð… ";s:12:"ð…˜ð…¥ð…®";s:4:"ð…¡";s:12:"ð…˜ð…¥ð…¯";s:4:"ð…¢";s:12:"ð…˜ð…¥ð…°";s:4:"ð…£";s:12:"ð…˜ð…¥ð…±";s:4:"ð…¤";s:12:"ð…˜ð…¥ð…²";s:4:"ð†»";s:8:"ð†¹ð…¥";s:4:"ð†¼";s:8:"ð†ºð…¥";s:4:"ð†½";s:12:"ð†¹ð…¥ð…®";s:4:"ð†¾";s:12:"ð†ºð…¥ð…®";s:4:"ð†¿";s:12:"ð†¹ð…¥ð…¯";s:4:"ð‡€";s:12:"ð†ºð…¥ð…¯";s:4:"丽";s:3:"丽";s:4:"ð¯ ";s:3:"丸";s:4:"乁";s:3:"ä¹";s:4:"𠄢";s:4:"ð „¢";s:4:"你";s:3:"ä½ ";s:4:"侮";s:3:"ä¾®";s:4:"侻";s:3:"ä¾»";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"åº";s:4:"備";s:3:"å‚™";s:4:"僧";s:3:"僧";s:4:"像";s:3:"åƒ";s:4:"㒞";s:3:"ã’ž";s:4:"ð¯ ";s:4:"𠘺";s:4:"免";s:3:"å…";s:4:"ð¯ ";s:3:"å…”";s:4:"ð¯ ";s:3:"å…¤";s:4:"具";s:3:"å…·";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"ã’¹";s:4:"內";s:3:"å…§";s:4:"再";s:3:"å†";s:4:"𠕋";s:4:"ð •‹";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"ð¯ ";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"å‰";s:4:"卑";s:3:"å‘";s:4:"博";s:3:"åš";s:4:"即";s:3:"å³";s:4:"卽";s:3:"å½";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"卿";s:3:"å¿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"ç°";s:4:"及";s:3:"åŠ";s:4:"叟";s:3:"åŸ";s:4:"𠭣";s:4:"ð ­£";s:4:"叫";s:3:"å«";s:4:"叱";s:3:"å±";s:4:"吆";s:3:"å†";s:4:"咞";s:3:"å’ž";s:4:"吸";s:3:"å¸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"å’¢";s:4:"ð¯¡";s:3:"å“¶";s:4:"唐";s:3:"å”";s:4:"啓";s:3:"å•“";s:4:"啣";s:3:"å•£";s:4:"善";s:3:"å–„";s:4:"善";s:3:"å–„";s:4:"喙";s:3:"å–™";s:4:"喫";s:3:"å–«";s:4:"喳";s:3:"å–³";s:4:"嗂";s:3:"å—‚";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"ð¯¡";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"ð¯¡";s:3:"å™´";s:4:"ð¯¡";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"å ";s:4:"型";s:3:"åž‹";s:4:"堲";s:3:"å ²";s:4:"報";s:3:"å ±";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"ð¯¡";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"ã›®";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"å°†";s:4:"当";s:3:"当";s:4:"尢";s:3:"å°¢";s:4:"㞁";s:3:"ãž";s:4:"屠";s:3:"å± ";s:4:"屮";s:3:"å±®";s:4:"峀";s:3:"å³€";s:4:"岍";s:3:"å²";s:4:"𡷤";s:4:"ð¡·¤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"ð¡·¦";s:4:"嵮";s:3:"åµ®";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"åµ¼";s:4:"ð¯¢";s:3:"å·¡";s:4:"巢";s:3:"å·¢";s:4:"㠯";s:3:"ã ¯";s:4:"巽";s:3:"å·½";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"ã¡¢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"ð¯¢";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"ð¯¢";s:4:"𪎒";s:4:"ð¯¢";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"èˆ";s:4:"弢";s:3:"å¼¢";s:4:"弢";s:3:"å¼¢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"å½¢";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"ð¯¢";s:3:"å¿";s:4:"志";s:3:"å¿—";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"æ‚";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"æ‚”";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"æ…ˆ";s:4:"慌";s:3:"æ…Œ";s:4:"慎";s:3:"æ…Ž";s:4:"慌";s:3:"æ…Œ";s:4:"慺";s:3:"æ…º";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"æˆ";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"æ‰";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"æ‹”";s:4:"捐";s:3:"æ";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"æ¨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"æ¤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"æ¢";s:4:"揅";s:3:"æ…";s:4:"ð¯£";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"æ‘©";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"æ’";s:4:"摷";s:3:"æ‘·";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"æ•";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"æ—£";s:4:"書";s:3:"書";s:4:"ð¯£";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"ð¯£";s:3:"æš‘";s:4:"ð¯£";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"æšœ";s:4:"肭";s:3:"è‚­";s:4:"䏙";s:3:"ä™";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"æž";s:4:"杓";s:3:"æ“";s:4:"ð¯£";s:4:"ð£ƒ";s:4:"㭉";s:3:"ã­‰";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"æž…";s:4:"桒";s:3:"æ¡’";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"æ Ÿ";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"ã®";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"æ«›";s:4:"㰘";s:3:"ã°˜";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"æ­”";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"æ­²";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"æ®»";s:4:"𣪍";s:4:"ð£ª";s:4:"𡴋";s:4:"ð¡´‹";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"æ³";s:4:"汧";s:3:"æ±§";s:4:"洖";s:3:"æ´–";s:4:"派";s:3:"æ´¾";s:4:"ð¯¤";s:3:"æµ·";s:4:"流";s:3:"æµ";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"æ¶…";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"æ´´";s:4:"港";s:3:"港";s:4:"湮";s:3:"æ¹®";s:4:"㴳";s:3:"ã´³";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"ð¯¤";s:4:"𣻑";s:4:"淹";s:3:"æ·¹";s:4:"ð¯¤";s:3:"æ½®";s:4:"ð¯¤";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"ã¶–";s:4:"灊";s:3:"çŠ";s:4:"災";s:3:"ç½";s:4:"灷";s:3:"ç·";s:4:"炭";s:3:"ç‚­";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"ç……";s:4:"ð¯¤";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"ç‰";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"çº";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"ç’…";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"ã¼›";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"ç•°";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"ç˜";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"ð¥„";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"ç›´";s:4:"ð¯¥";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"çŠ";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"çž‹";s:4:"䁆";s:3:"ä†";s:4:"䂖";s:3:"ä‚–";s:4:"ð¯¥";s:4:"ð¥";s:4:"硎";s:3:"硎";s:4:"ð¯¥";s:3:"碌";s:4:"ð¯¥";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"ç¦";s:4:"秫";s:3:"ç§«";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"ç©€";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"ç©";s:4:"𥥼";s:4:"𥥼";s:4:"ð¯¥";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"ç«®";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"ç³’";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"ç³£";s:4:"紀";s:3:"ç´€";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"çµ£";s:4:"䌁";s:3:"äŒ";s:4:"緇";s:3:"ç·‡";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"ç¹…";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"ä™";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"è ";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"è°";s:4:"𣍟";s:4:"ð£Ÿ";s:4:"ð¯¦";s:3:"ä•";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"ä‹";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"èˆ";s:4:"舄";s:3:"舄";s:4:"ð¯¦";s:3:"辞";s:4:"䑫";s:3:"ä‘«";s:4:"ð¯¦";s:3:"芑";s:4:"ð¯¦";s:3:"芋";s:4:"芝";s:3:"èŠ";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"è‹¥";s:4:"茝";s:3:"èŒ";s:4:"荣";s:3:"è£";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"ð¯¦";s:3:"莽";s:4:"菧";s:3:"è§";s:4:"著";s:3:"è‘—";s:4:"荓";s:3:"è“";s:4:"菊";s:3:"èŠ";s:4:"菌";s:3:"èŒ";s:4:"菜";s:3:"èœ";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"è”–";s:4:"𧏊";s:4:"ð§Š";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"ä•";s:4:"䕡";s:3:"ä•¡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"ä•«";s:4:"虐";s:3:"è™";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"è™§";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"èš©";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"è¹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"è«";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"ä——";s:4:"蟡";s:3:"蟡";s:4:"ð¯§";s:3:"è ";s:4:"䗹";s:3:"ä—¹";s:4:"衠";s:3:"è¡ ";s:4:"衣";s:3:"è¡£";s:4:"𧙧";s:4:"ð§™§";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"ã’»";s:4:"𧢮";s:4:"ð§¢®";s:4:"𧥦";s:4:"𧥦";s:4:"ð¯§";s:3:"äš¾";s:4:"䛇";s:3:"䛇";s:4:"ð¯§";s:3:"誠";s:4:"ð¯§";s:3:"è«­";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"è³";s:4:"贛";s:3:"è´›";s:4:"起";s:3:"èµ·";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"ð  „";s:4:"跋";s:3:"è·‹";s:4:"趼";s:3:"è¶¼";s:4:"跰";s:3:"è·°";s:4:"ð¯§";s:4:"𠣞";s:4:"軔";s:3:"è»”";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"é‚”";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"é„‘";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"é„›";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"é‹—";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"é¹";s:4:"鐕";s:3:"é•";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"é–‹";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"é–·";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"å¶²";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"ð©……";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"ä©®";s:4:"䩶";s:3:"ä©¶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"ð©Š";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"ð©’–";s:4:"頋";s:3:"é ‹";s:4:"頋";s:3:"é ‹";s:4:"頩";s:3:"é ©";s:4:"ð¯¨";s:4:"ð©–¶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"é§‚";s:4:"駾";s:3:"é§¾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"é±€";s:4:"鳽";s:3:"é³½";s:4:"ð¯¨";s:3:"䳎";s:4:"䳭";s:3:"ä³­";s:4:"ð¯¨";s:3:"éµ§";s:4:"ð¯¨";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"äµ–";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"é¼…";s:4:"鼏";s:3:"é¼";s:4:"鼖";s:3:"é¼–";s:4:"鼻";s:3:"é¼»";s:4:"ð¯¨";s:4:"𪘀";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/combiningClass.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/combiningClass.ser new file mode 100644 index 0000000000..6812d01dec --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/combiningClass.ser @@ -0,0 +1 @@ +a:653:{s:2:"Ì€";i:230;s:2:"Ì";i:230;s:2:"Ì‚";i:230;s:2:"̃";i:230;s:2:"Ì„";i:230;s:2:"Ì…";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"ÌŠ";i:230;s:2:"Ì‹";i:230;s:2:"ÌŒ";i:230;s:2:"Ì";i:230;s:2:"ÌŽ";i:230;s:2:"Ì";i:230;s:2:"Ì";i:230;s:2:"Ì‘";i:230;s:2:"Ì’";i:230;s:2:"Ì“";i:230;s:2:"Ì”";i:230;s:2:"Ì•";i:232;s:2:"Ì–";i:220;s:2:"Ì—";i:220;s:2:"̘";i:220;s:2:"Ì™";i:220;s:2:"Ìš";i:232;s:2:"Ì›";i:216;s:2:"Ìœ";i:220;s:2:"Ì";i:220;s:2:"Ìž";i:220;s:2:"ÌŸ";i:220;s:2:"Ì ";i:220;s:2:"Ì¡";i:202;s:2:"Ì¢";i:202;s:2:"Ì£";i:220;s:2:"̤";i:220;s:2:"Ì¥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"Ì©";i:220;s:2:"̪";i:220;s:2:"Ì«";i:220;s:2:"̬";i:220;s:2:"Ì­";i:220;s:2:"Ì®";i:220;s:2:"̯";i:220;s:2:"̰";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"Ì´";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"Ì·";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"Ì»";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"Ì¿";i:230;s:2:"Í€";i:230;s:2:"Í";i:230;s:2:"Í‚";i:230;s:2:"̓";i:230;s:2:"Í„";i:230;s:2:"Í…";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"ÍŠ";i:230;s:2:"Í‹";i:230;s:2:"ÍŒ";i:230;s:2:"Í";i:220;s:2:"ÍŽ";i:220;s:2:"Í";i:230;s:2:"Í‘";i:230;s:2:"Í’";i:230;s:2:"Í“";i:220;s:2:"Í”";i:220;s:2:"Í•";i:220;s:2:"Í–";i:220;s:2:"Í—";i:230;s:2:"͘";i:232;s:2:"Í™";i:220;s:2:"Íš";i:220;s:2:"Í›";i:230;s:2:"Íœ";i:233;s:2:"Í";i:234;s:2:"Íž";i:234;s:2:"ÍŸ";i:233;s:2:"Í ";i:234;s:2:"Í¡";i:234;s:2:"Í¢";i:233;s:2:"Í£";i:230;s:2:"ͤ";i:230;s:2:"Í¥";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"Í©";i:230;s:2:"ͪ";i:230;s:2:"Í«";i:230;s:2:"ͬ";i:230;s:2:"Í­";i:230;s:2:"Í®";i:230;s:2:"ͯ";i:230;s:2:"Òƒ";i:230;s:2:"Ò„";i:230;s:2:"Ò…";i:230;s:2:"Ò†";i:230;s:2:"Ò‡";i:230;s:2:"Ö‘";i:220;s:2:"Ö’";i:230;s:2:"Ö“";i:230;s:2:"Ö”";i:230;s:2:"Ö•";i:230;s:2:"Ö–";i:220;s:2:"Ö—";i:230;s:2:"Ö˜";i:230;s:2:"Ö™";i:230;s:2:"Öš";i:222;s:2:"Ö›";i:220;s:2:"Öœ";i:230;s:2:"Ö";i:230;s:2:"Öž";i:230;s:2:"ÖŸ";i:230;s:2:"Ö ";i:230;s:2:"Ö¡";i:230;s:2:"Ö¢";i:220;s:2:"Ö£";i:220;s:2:"Ö¤";i:220;s:2:"Ö¥";i:220;s:2:"Ö¦";i:220;s:2:"Ö§";i:220;s:2:"Ö¨";i:230;s:2:"Ö©";i:230;s:2:"Öª";i:220;s:2:"Ö«";i:230;s:2:"Ö¬";i:230;s:2:"Ö­";i:222;s:2:"Ö®";i:228;s:2:"Ö¯";i:230;s:2:"Ö°";i:10;s:2:"Ö±";i:11;s:2:"Ö²";i:12;s:2:"Ö³";i:13;s:2:"Ö´";i:14;s:2:"Öµ";i:15;s:2:"Ö¶";i:16;s:2:"Ö·";i:17;s:2:"Ö¸";i:18;s:2:"Ö¹";i:19;s:2:"Öº";i:19;s:2:"Ö»";i:20;s:2:"Ö¼";i:21;s:2:"Ö½";i:22;s:2:"Ö¿";i:23;s:2:"×";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"×…";i:220;s:2:"ׇ";i:18;s:2:"Ø";i:230;s:2:"Ø‘";i:230;s:2:"Ø’";i:230;s:2:"Ø“";i:230;s:2:"Ø”";i:230;s:2:"Ø•";i:230;s:2:"Ø–";i:230;s:2:"Ø—";i:230;s:2:"ؘ";i:30;s:2:"Ø™";i:31;s:2:"Øš";i:32;s:2:"Ù‹";i:27;s:2:"ÙŒ";i:28;s:2:"Ù";i:29;s:2:"ÙŽ";i:30;s:2:"Ù";i:31;s:2:"Ù";i:32;s:2:"Ù‘";i:33;s:2:"Ù’";i:34;s:2:"Ù“";i:230;s:2:"Ù”";i:230;s:2:"Ù•";i:220;s:2:"Ù–";i:220;s:2:"Ù—";i:230;s:2:"Ù˜";i:230;s:2:"Ù™";i:230;s:2:"Ùš";i:230;s:2:"Ù›";i:230;s:2:"Ùœ";i:220;s:2:"Ù";i:230;s:2:"Ùž";i:230;s:2:"ÙŸ";i:220;s:2:"Ù°";i:35;s:2:"Û–";i:230;s:2:"Û—";i:230;s:2:"Û˜";i:230;s:2:"Û™";i:230;s:2:"Ûš";i:230;s:2:"Û›";i:230;s:2:"Ûœ";i:230;s:2:"ÛŸ";i:230;s:2:"Û ";i:230;s:2:"Û¡";i:230;s:2:"Û¢";i:230;s:2:"Û£";i:220;s:2:"Û¤";i:230;s:2:"Û§";i:230;s:2:"Û¨";i:230;s:2:"Ûª";i:220;s:2:"Û«";i:230;s:2:"Û¬";i:230;s:2:"Û­";i:220;s:2:"Ü‘";i:36;s:2:"ܰ";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"Ü´";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"Ü·";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"Ü»";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"Ü¿";i:230;s:2:"Ý€";i:230;s:2:"Ý";i:230;s:2:"Ý‚";i:220;s:2:"݃";i:230;s:2:"Ý„";i:220;s:2:"Ý…";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"ÝŠ";i:230;s:2:"ß«";i:230;s:2:"߬";i:230;s:2:"ß­";i:230;s:2:"ß®";i:230;s:2:"߯";i:230;s:2:"ß°";i:230;s:2:"ß±";i:230;s:2:"ß²";i:220;s:2:"ß³";i:230;s:3:"à –";i:230;s:3:"à —";i:230;s:3:"à ˜";i:230;s:3:"à ™";i:230;s:3:"à ›";i:230;s:3:"à œ";i:230;s:3:"à ";i:230;s:3:"à ž";i:230;s:3:"à Ÿ";i:230;s:3:"à  ";i:230;s:3:"à ¡";i:230;s:3:"à ¢";i:230;s:3:"à £";i:230;s:3:"à ¥";i:230;s:3:"à ¦";i:230;s:3:"à §";i:230;s:3:"à ©";i:230;s:3:"à ª";i:230;s:3:"à «";i:230;s:3:"à ¬";i:230;s:3:"à ­";i:230;s:3:"à¡™";i:220;s:3:"࡚";i:220;s:3:"à¡›";i:220;s:3:"ࣤ";i:230;s:3:"ࣥ";i:230;s:3:"ࣦ";i:220;s:3:"ࣧ";i:230;s:3:"ࣨ";i:230;s:3:"ࣩ";i:220;s:3:"࣪";i:230;s:3:"࣫";i:230;s:3:"࣬";i:230;s:3:"࣭";i:220;s:3:"࣮";i:220;s:3:"࣯";i:220;s:3:"ࣰ";i:27;s:3:"ࣱ";i:28;s:3:"ࣲ";i:29;s:3:"ࣳ";i:230;s:3:"ࣴ";i:230;s:3:"ࣵ";i:230;s:3:"ࣶ";i:220;s:3:"ࣷ";i:230;s:3:"ࣸ";i:230;s:3:"ࣹ";i:220;s:3:"ࣺ";i:220;s:3:"ࣻ";i:230;s:3:"ࣼ";i:230;s:3:"ࣽ";i:230;s:3:"ࣾ";i:230;s:3:"़";i:7;s:3:"à¥";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"à§";i:9;s:3:"਼";i:7;s:3:"à©";i:9;s:3:"઼";i:7;s:3:"à«";i:9;s:3:"଼";i:7;s:3:"à­";i:9;s:3:"à¯";i:9;s:3:"à±";i:9;s:3:"ౕ";i:84;s:3:"à±–";i:91;s:3:"಼";i:7;s:3:"à³";i:9;s:3:"àµ";i:9;s:3:"à·Š";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"á‚";i:220;s:3:"á";i:230;s:3:"áž";i:230;s:3:"áŸ";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"áŸ";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"á© ";i:9;s:3:"᩵";i:230;s:3:"á©¶";i:230;s:3:"á©·";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"á©»";i:230;s:3:"᩼";i:230;s:3:"á©¿";i:220;s:3:"᬴";i:7;s:3:"á­„";i:9;s:3:"á­«";i:230;s:3:"á­¬";i:220;s:3:"á­­";i:230;s:3:"á­®";i:230;s:3:"á­¯";i:230;s:3:"á­°";i:230;s:3:"á­±";i:230;s:3:"á­²";i:230;s:3:"á­³";i:230;s:3:"᮪";i:9;s:3:"᮫";i:9;s:3:"᯦";i:7;s:3:"᯲";i:9;s:3:"᯳";i:9;s:3:"á°·";i:7;s:3:"á³";i:230;s:3:"᳑";i:230;s:3:"á³’";i:230;s:3:"á³”";i:1;s:3:"᳕";i:220;s:3:"á³–";i:220;s:3:"á³—";i:220;s:3:"᳘";i:220;s:3:"á³™";i:220;s:3:"᳚";i:230;s:3:"á³›";i:230;s:3:"᳜";i:220;s:3:"á³";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"á³ ";i:230;s:3:"á³¢";i:1;s:3:"á³£";i:1;s:3:"᳤";i:1;s:3:"á³¥";i:1;s:3:"᳦";i:1;s:3:"á³§";i:1;s:3:"᳨";i:1;s:3:"á³­";i:220;s:3:"á³´";i:230;s:3:"á·€";i:230;s:3:"á·";i:230;s:3:"á·‚";i:220;s:3:"á·ƒ";i:230;s:3:"á·„";i:230;s:3:"á·…";i:230;s:3:"á·†";i:230;s:3:"á·‡";i:230;s:3:"á·ˆ";i:230;s:3:"á·‰";i:230;s:3:"á·Š";i:220;s:3:"á·‹";i:230;s:3:"á·Œ";i:230;s:3:"á·";i:234;s:3:"á·Ž";i:214;s:3:"á·";i:220;s:3:"á·";i:202;s:3:"á·‘";i:230;s:3:"á·’";i:230;s:3:"á·“";i:230;s:3:"á·”";i:230;s:3:"á·•";i:230;s:3:"á·–";i:230;s:3:"á·—";i:230;s:3:"á·˜";i:230;s:3:"á·™";i:230;s:3:"á·š";i:230;s:3:"á·›";i:230;s:3:"á·œ";i:230;s:3:"á·";i:230;s:3:"á·ž";i:230;s:3:"á·Ÿ";i:230;s:3:"á· ";i:230;s:3:"á·¡";i:230;s:3:"á·¢";i:230;s:3:"á·£";i:230;s:3:"á·¤";i:230;s:3:"á·¥";i:230;s:3:"á·¦";i:230;s:3:"á·¼";i:233;s:3:"á·½";i:220;s:3:"á·¾";i:230;s:3:"á·¿";i:220;s:3:"âƒ";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"â³°";i:230;s:3:"â³±";i:230;s:3:"⵿";i:9;s:3:"â· ";i:230;s:3:"â·¡";i:230;s:3:"â·¢";i:230;s:3:"â·£";i:230;s:3:"â·¤";i:230;s:3:"â·¥";i:230;s:3:"â·¦";i:230;s:3:"â·§";i:230;s:3:"â·¨";i:230;s:3:"â·©";i:230;s:3:"â·ª";i:230;s:3:"â·«";i:230;s:3:"â·¬";i:230;s:3:"â·­";i:230;s:3:"â·®";i:230;s:3:"â·¯";i:230;s:3:"â·°";i:230;s:3:"â·±";i:230;s:3:"â·²";i:230;s:3:"â·³";i:230;s:3:"â·´";i:230;s:3:"â·µ";i:230;s:3:"â·¶";i:230;s:3:"â··";i:230;s:3:"â·¸";i:230;s:3:"â·¹";i:230;s:3:"â·º";i:230;s:3:"â·»";i:230;s:3:"â·¼";i:230;s:3:"â·½";i:230;s:3:"â·¾";i:230;s:3:"â·¿";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"ã‚™";i:8;s:3:"゚";i:8;s:3:"꙯";i:230;s:3:"ê™´";i:230;s:3:"ꙵ";i:230;s:3:"ê™¶";i:230;s:3:"ê™·";i:230;s:3:"ꙸ";i:230;s:3:"ꙹ";i:230;s:3:"ꙺ";i:230;s:3:"ê™»";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"ꚟ";i:230;s:3:"ê›°";i:230;s:3:"ê›±";i:230;s:3:"ê †";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"ê§€";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"ê«";i:230;s:3:"ê«¶";i:9;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"ð‡½";i:220;s:4:"ð¨";i:220;s:4:"ð¨";i:230;s:4:"ð¨¸";i:230;s:4:"ð¨¹";i:1;s:4:"ð¨º";i:220;s:4:"ð¨¿";i:9;s:4:"ð‘†";i:9;s:4:"ð‘‚¹";i:9;s:4:"𑂺";i:7;s:4:"ð‘„€";i:230;s:4:"ð‘„";i:230;s:4:"ð‘„‚";i:230;s:4:"ð‘„³";i:9;s:4:"ð‘„´";i:9;s:4:"𑇀";i:9;s:4:"𑚶";i:9;s:4:"𑚷";i:7;s:4:"ð…¥";i:216;s:4:"ð…¦";i:216;s:4:"ð…§";i:1;s:4:"ð…¨";i:1;s:4:"ð…©";i:1;s:4:"ð…­";i:226;s:4:"ð…®";i:216;s:4:"ð…¯";i:216;s:4:"ð…°";i:216;s:4:"ð…±";i:216;s:4:"ð…²";i:216;s:4:"ð…»";i:220;s:4:"ð…¼";i:220;s:4:"ð…½";i:220;s:4:"ð…¾";i:220;s:4:"ð…¿";i:220;s:4:"ð†€";i:220;s:4:"ð†";i:220;s:4:"ð†‚";i:220;s:4:"ð†…";i:230;s:4:"ð††";i:230;s:4:"ð†‡";i:230;s:4:"ð†ˆ";i:230;s:4:"ð†‰";i:230;s:4:"ð†Š";i:220;s:4:"ð†‹";i:220;s:4:"ð†ª";i:230;s:4:"ð†«";i:230;s:4:"ð†¬";i:230;s:4:"ð†­";i:230;s:4:"ð‰‚";i:230;s:4:"ð‰ƒ";i:230;s:4:"ð‰„";i:230;} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/compatibilityDecomposition.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/compatibilityDecomposition.ser new file mode 100644 index 0000000000..24482dd22c --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/compatibilityDecomposition.ser @@ -0,0 +1 @@ +a:3671:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" Ì„";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" Ì";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1â„4";s:2:"½";s:5:"1â„2";s:2:"¾";s:5:"3â„4";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ä¿";s:3:"L·";s:2:"Å€";s:3:"l·";s:2:"ʼn";s:3:"ʼn";s:2:"Å¿";s:1:"s";s:2:"Ç„";s:4:"DZÌŒ";s:2:"Ç…";s:4:"DzÌŒ";s:2:"dž";s:4:"dzÌŒ";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"ÇŠ";s:2:"NJ";s:2:"Ç‹";s:2:"Nj";s:2:"ÇŒ";s:2:"nj";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"ʰ";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"Ê´";s:2:"ɹ";s:2:"ʵ";s:2:"É»";s:2:"ʶ";s:2:"Ê";s:2:"Ê·";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"Ë™";s:3:" ̇";s:2:"Ëš";s:3:" ÌŠ";s:2:"Ë›";s:3:" ̨";s:2:"Ëœ";s:3:" ̃";s:2:"Ë";s:3:" Ì‹";s:2:"Ë ";s:2:"É£";s:2:"Ë¡";s:1:"l";s:2:"Ë¢";s:1:"s";s:2:"Ë£";s:1:"x";s:2:"ˤ";s:2:"Ê•";s:2:"ͺ";s:3:" Í…";s:2:"΄";s:3:" Ì";s:2:"Î…";s:5:" ̈Ì";s:2:"Ï";s:2:"β";s:2:"Ï‘";s:2:"θ";s:2:"Ï’";s:2:"Î¥";s:2:"Ï“";s:4:"Î¥Ì";s:2:"Ï”";s:4:"Ϋ";s:2:"Ï•";s:2:"φ";s:2:"Ï–";s:2:"Ï€";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"Ï";s:2:"ϲ";s:2:"Ï‚";s:2:"Ï´";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ö‡";s:4:"Õ¥Ö‚";s:2:"Ùµ";s:4:"اٴ";s:2:"Ù¶";s:4:"وٴ";s:2:"Ù·";s:4:"Û‡Ù´";s:2:"Ù¸";s:4:"يٴ";s:3:"ำ";s:6:"à¹à¸²";s:3:"ຳ";s:6:"à»àº²";s:3:"ໜ";s:6:"ຫນ";s:3:"à»";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"ჼ";s:3:"ნ";s:3:"á´¬";s:1:"A";s:3:"á´­";s:2:"Æ";s:3:"á´®";s:1:"B";s:3:"á´°";s:1:"D";s:3:"á´±";s:1:"E";s:3:"á´²";s:2:"ÆŽ";s:3:"á´³";s:1:"G";s:3:"á´´";s:1:"H";s:3:"á´µ";s:1:"I";s:3:"á´¶";s:1:"J";s:3:"á´·";s:1:"K";s:3:"á´¸";s:1:"L";s:3:"á´¹";s:1:"M";s:3:"á´º";s:1:"N";s:3:"á´¼";s:1:"O";s:3:"á´½";s:2:"È¢";s:3:"á´¾";s:1:"P";s:3:"á´¿";s:1:"R";s:3:"áµ€";s:1:"T";s:3:"áµ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"É";s:3:"áµ…";s:2:"É‘";s:3:"ᵆ";s:3:"á´‚";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"É™";s:3:"ᵋ";s:2:"É›";s:3:"ᵌ";s:2:"Éœ";s:3:"áµ";s:1:"g";s:3:"áµ";s:1:"k";s:3:"áµ";s:1:"m";s:3:"ᵑ";s:2:"Å‹";s:3:"áµ’";s:1:"o";s:3:"ᵓ";s:2:"É”";s:3:"áµ”";s:3:"á´–";s:3:"ᵕ";s:3:"á´—";s:3:"áµ–";s:1:"p";s:3:"áµ—";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"áµ™";s:3:"á´";s:3:"ᵚ";s:2:"ɯ";s:3:"áµ›";s:1:"v";s:3:"ᵜ";s:3:"á´¥";s:3:"áµ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"áµ ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"áµ¢";s:1:"i";s:3:"áµ£";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"áµ¥";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"áµ§";s:2:"γ";s:3:"ᵨ";s:2:"Ï";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"á¶›";s:2:"É’";s:3:"á¶œ";s:1:"c";s:3:"á¶";s:2:"É•";s:3:"á¶ž";s:2:"ð";s:3:"á¶Ÿ";s:2:"Éœ";s:3:"á¶ ";s:1:"f";s:3:"á¶¡";s:2:"ÉŸ";s:3:"á¶¢";s:2:"É¡";s:3:"á¶£";s:2:"É¥";s:3:"ᶤ";s:2:"ɨ";s:3:"á¶¥";s:2:"É©";s:3:"ᶦ";s:2:"ɪ";s:3:"á¶§";s:3:"áµ»";s:3:"ᶨ";s:2:"Ê";s:3:"á¶©";s:2:"É­";s:3:"ᶪ";s:3:"á¶…";s:3:"á¶«";s:2:"ÊŸ";s:3:"ᶬ";s:2:"ɱ";s:3:"á¶­";s:2:"ɰ";s:3:"á¶®";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"á¶°";s:2:"É´";s:3:"á¶±";s:2:"ɵ";s:3:"á¶²";s:2:"ɸ";s:3:"á¶³";s:2:"Ê‚";s:3:"á¶´";s:2:"ʃ";s:3:"á¶µ";s:2:"Æ«";s:3:"á¶¶";s:2:"ʉ";s:3:"á¶·";s:2:"ÊŠ";s:3:"ᶸ";s:3:"á´œ";s:3:"á¶¹";s:2:"Ê‹";s:3:"ᶺ";s:2:"ÊŒ";s:3:"á¶»";s:1:"z";s:3:"á¶¼";s:2:"Ê";s:3:"á¶½";s:2:"Ê‘";s:3:"á¶¾";s:2:"Ê’";s:3:"á¶¿";s:2:"θ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"á¾½";s:3:" Ì“";s:3:"᾿";s:3:" Ì“";s:3:"á¿€";s:3:" Í‚";s:3:"á¿";s:5:" ̈͂";s:3:"á¿";s:5:" ̓̀";s:3:"῎";s:5:" Ì“Ì";s:3:"á¿";s:5:" ̓͂";s:3:"á¿";s:5:" ̔̀";s:3:"῞";s:5:" Ì”Ì";s:3:"῟";s:5:" ̔͂";s:3:"á¿­";s:5:" ̈̀";s:3:"á¿®";s:5:" ̈Ì";s:3:"´";s:3:" Ì";s:3:"῾";s:3:" Ì”";s:3:" ";s:1:" ";s:3:"â€";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"â€";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" Ì…";s:3:"â‡";s:2:"??";s:3:"âˆ";s:2:"?!";s:3:"â‰";s:2:"!?";s:3:"â—";s:12:"′′′′";s:3:"âŸ";s:1:" ";s:3:"â°";s:1:"0";s:3:"â±";s:1:"i";s:3:"â´";s:1:"4";s:3:"âµ";s:1:"5";s:3:"â¶";s:1:"6";s:3:"â·";s:1:"7";s:3:"â¸";s:1:"8";s:3:"â¹";s:1:"9";s:3:"âº";s:1:"+";s:3:"â»";s:3:"−";s:3:"â¼";s:1:"=";s:3:"â½";s:1:"(";s:3:"â¾";s:1:")";s:3:"â¿";s:1:"n";s:3:"â‚€";s:1:"0";s:3:"â‚";s:1:"1";s:3:"â‚‚";s:1:"2";s:3:"₃";s:1:"3";s:3:"â‚„";s:1:"4";s:3:"â‚…";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"₊";s:1:"+";s:3:"â‚‹";s:3:"−";s:3:"₌";s:1:"=";s:3:"â‚";s:1:"(";s:3:"₎";s:1:")";s:3:"â‚";s:1:"a";s:3:"â‚‘";s:1:"e";s:3:"â‚’";s:1:"o";s:3:"â‚“";s:1:"x";s:3:"â‚”";s:2:"É™";s:3:"â‚•";s:1:"h";s:3:"â‚–";s:1:"k";s:3:"â‚—";s:1:"l";s:3:"ₘ";s:1:"m";s:3:"â‚™";s:1:"n";s:3:"ₚ";s:1:"p";s:3:"â‚›";s:1:"s";s:3:"ₜ";s:1:"t";s:3:"₨";s:2:"Rs";s:3:"â„€";s:3:"a/c";s:3:"â„";s:3:"a/s";s:3:"â„‚";s:1:"C";s:3:"℃";s:3:"°C";s:3:"â„…";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Æ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"â„‹";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"â„";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"â„";s:2:"ħ";s:3:"â„";s:1:"I";s:3:"â„‘";s:1:"I";s:3:"â„’";s:1:"L";s:3:"â„“";s:1:"l";s:3:"â„•";s:1:"N";s:3:"â„–";s:2:"No";s:3:"â„™";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"â„›";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"â„";s:1:"R";s:3:"â„ ";s:2:"SM";s:3:"â„¡";s:3:"TEL";s:3:"â„¢";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"ℬ";s:1:"B";s:3:"â„­";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"â„°";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"â„´";s:1:"o";s:3:"ℵ";s:2:"×";s:3:"â„¶";s:2:"ב";s:3:"â„·";s:2:"×’";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"â„»";s:3:"FAX";s:3:"ℼ";s:2:"Ï€";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"â„¿";s:2:"Π";s:3:"â…€";s:3:"∑";s:3:"â……";s:1:"D";s:3:"â…†";s:1:"d";s:3:"â…‡";s:1:"e";s:3:"â…ˆ";s:1:"i";s:3:"â…‰";s:1:"j";s:3:"â…";s:5:"1â„7";s:3:"â…‘";s:5:"1â„9";s:3:"â…’";s:6:"1â„10";s:3:"â…“";s:5:"1â„3";s:3:"â…”";s:5:"2â„3";s:3:"â…•";s:5:"1â„5";s:3:"â…–";s:5:"2â„5";s:3:"â…—";s:5:"3â„5";s:3:"â…˜";s:5:"4â„5";s:3:"â…™";s:5:"1â„6";s:3:"â…š";s:5:"5â„6";s:3:"â…›";s:5:"1â„8";s:3:"â…œ";s:5:"3â„8";s:3:"â…";s:5:"5â„8";s:3:"â…ž";s:5:"7â„8";s:3:"â…Ÿ";s:4:"1â„";s:3:"â… ";s:1:"I";s:3:"â…¡";s:2:"II";s:3:"â…¢";s:3:"III";s:3:"â…£";s:2:"IV";s:3:"â…¤";s:1:"V";s:3:"â…¥";s:2:"VI";s:3:"â…¦";s:3:"VII";s:3:"â…§";s:4:"VIII";s:3:"â…¨";s:2:"IX";s:3:"â…©";s:1:"X";s:3:"â…ª";s:2:"XI";s:3:"â…«";s:3:"XII";s:3:"â…¬";s:1:"L";s:3:"â…­";s:1:"C";s:3:"â…®";s:1:"D";s:3:"â…¯";s:1:"M";s:3:"â…°";s:1:"i";s:3:"â…±";s:2:"ii";s:3:"â…²";s:3:"iii";s:3:"â…³";s:2:"iv";s:3:"â…´";s:1:"v";s:3:"â…µ";s:2:"vi";s:3:"â…¶";s:3:"vii";s:3:"â…·";s:4:"viii";s:3:"â…¸";s:2:"ix";s:3:"â…¹";s:1:"x";s:3:"â…º";s:2:"xi";s:3:"â…»";s:3:"xii";s:3:"â…¼";s:1:"l";s:3:"â…½";s:1:"c";s:3:"â…¾";s:1:"d";s:3:"â…¿";s:1:"m";s:3:"↉";s:5:"0â„3";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"â‘ ";s:1:"1";s:3:"â‘¡";s:1:"2";s:3:"â‘¢";s:1:"3";s:3:"â‘£";s:1:"4";s:3:"⑤";s:1:"5";s:3:"â‘¥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"â‘§";s:1:"8";s:3:"⑨";s:1:"9";s:3:"â‘©";s:2:"10";s:3:"⑪";s:2:"11";s:3:"â‘«";s:2:"12";s:3:"⑬";s:2:"13";s:3:"â‘­";s:2:"14";s:3:"â‘®";s:2:"15";s:3:"⑯";s:2:"16";s:3:"â‘°";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"â‘´";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"â‘¶";s:3:"(3)";s:3:"â‘·";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"â‘»";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"â‘¿";s:4:"(12)";s:3:"â’€";s:4:"(13)";s:3:"â’";s:4:"(14)";s:3:"â’‚";s:4:"(15)";s:3:"â’ƒ";s:4:"(16)";s:3:"â’„";s:4:"(17)";s:3:"â’…";s:4:"(18)";s:3:"â’†";s:4:"(19)";s:3:"â’‡";s:4:"(20)";s:3:"â’ˆ";s:2:"1.";s:3:"â’‰";s:2:"2.";s:3:"â’Š";s:2:"3.";s:3:"â’‹";s:2:"4.";s:3:"â’Œ";s:2:"5.";s:3:"â’";s:2:"6.";s:3:"â’Ž";s:2:"7.";s:3:"â’";s:2:"8.";s:3:"â’";s:2:"9.";s:3:"â’‘";s:3:"10.";s:3:"â’’";s:3:"11.";s:3:"â’“";s:3:"12.";s:3:"â’”";s:3:"13.";s:3:"â’•";s:3:"14.";s:3:"â’–";s:3:"15.";s:3:"â’—";s:3:"16.";s:3:"â’˜";s:3:"17.";s:3:"â’™";s:3:"18.";s:3:"â’š";s:3:"19.";s:3:"â’›";s:3:"20.";s:3:"â’œ";s:3:"(a)";s:3:"â’";s:3:"(b)";s:3:"â’ž";s:3:"(c)";s:3:"â’Ÿ";s:3:"(d)";s:3:"â’ ";s:3:"(e)";s:3:"â’¡";s:3:"(f)";s:3:"â’¢";s:3:"(g)";s:3:"â’£";s:3:"(h)";s:3:"â’¤";s:3:"(i)";s:3:"â’¥";s:3:"(j)";s:3:"â’¦";s:3:"(k)";s:3:"â’§";s:3:"(l)";s:3:"â’¨";s:3:"(m)";s:3:"â’©";s:3:"(n)";s:3:"â’ª";s:3:"(o)";s:3:"â’«";s:3:"(p)";s:3:"â’¬";s:3:"(q)";s:3:"â’­";s:3:"(r)";s:3:"â’®";s:3:"(s)";s:3:"â’¯";s:3:"(t)";s:3:"â’°";s:3:"(u)";s:3:"â’±";s:3:"(v)";s:3:"â’²";s:3:"(w)";s:3:"â’³";s:3:"(x)";s:3:"â’´";s:3:"(y)";s:3:"â’µ";s:3:"(z)";s:3:"â’¶";s:1:"A";s:3:"â’·";s:1:"B";s:3:"â’¸";s:1:"C";s:3:"â’¹";s:1:"D";s:3:"â’º";s:1:"E";s:3:"â’»";s:1:"F";s:3:"â’¼";s:1:"G";s:3:"â’½";s:1:"H";s:3:"â’¾";s:1:"I";s:3:"â’¿";s:1:"J";s:3:"â“€";s:1:"K";s:3:"â“";s:1:"L";s:3:"â“‚";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"â“„";s:1:"O";s:3:"â“…";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"Ⓤ";s:1:"U";s:3:"â“‹";s:1:"V";s:3:"Ⓦ";s:1:"W";s:3:"â“";s:1:"X";s:3:"Ⓨ";s:1:"Y";s:3:"â“";s:1:"Z";s:3:"â“";s:1:"a";s:3:"â“‘";s:1:"b";s:3:"â“’";s:1:"c";s:3:"â““";s:1:"d";s:3:"â“”";s:1:"e";s:3:"â“•";s:1:"f";s:3:"â“–";s:1:"g";s:3:"â“—";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"â“™";s:1:"j";s:3:"ⓚ";s:1:"k";s:3:"â“›";s:1:"l";s:3:"ⓜ";s:1:"m";s:3:"â“";s:1:"n";s:3:"ⓞ";s:1:"o";s:3:"ⓟ";s:1:"p";s:3:"â“ ";s:1:"q";s:3:"â“¡";s:1:"r";s:3:"â“¢";s:1:"s";s:3:"â“£";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"â“¥";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"â“§";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"â“©";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"â©´";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"â©¶";s:3:"===";s:3:"â±¼";s:1:"j";s:3:"â±½";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"æ¯";s:3:"⻳";s:3:"龟";s:3:"â¼€";s:3:"一";s:3:"â¼";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"ä¹™";s:3:"â¼…";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"å„¿";s:3:"⼊";s:3:"å…¥";s:3:"⼋";s:3:"å…«";s:3:"⼌";s:3:"冂";s:3:"â¼";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"â¼";s:3:"几";s:3:"â¼";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"â¼’";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"â¼”";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"â¼–";s:3:"匸";s:3:"â¼—";s:3:"å";s:3:"⼘";s:3:"åœ";s:3:"â¼™";s:3:"å©";s:3:"⼚";s:3:"厂";s:3:"â¼›";s:3:"厶";s:3:"⼜";s:3:"åˆ";s:3:"â¼";s:3:"å£";s:3:"⼞";s:3:"å›—";s:3:"⼟";s:3:"土";s:3:"â¼ ";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"â¼¢";s:3:"夊";s:3:"â¼£";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"â¼¥";s:3:"女";s:3:"⼦";s:3:"å­";s:3:"â¼§";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"å°";s:3:"⼪";s:3:"å°¢";s:3:"⼫";s:3:"å°¸";s:3:"⼬";s:3:"å±®";s:3:"â¼­";s:3:"å±±";s:3:"â¼®";s:3:"å·›";s:3:"⼯";s:3:"å·¥";s:3:"â¼°";s:3:"å·±";s:3:"â¼±";s:3:"å·¾";s:3:"â¼²";s:3:"å¹²";s:3:"â¼³";s:3:"幺";s:3:"â¼´";s:3:"广";s:3:"â¼µ";s:3:"å»´";s:3:"â¼¶";s:3:"廾";s:3:"â¼·";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"â¼¹";s:3:"å½";s:3:"⼺";s:3:"彡";s:3:"â¼»";s:3:"å½³";s:3:"â¼¼";s:3:"心";s:3:"â¼½";s:3:"戈";s:3:"â¼¾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"â½€";s:3:"支";s:3:"â½";s:3:"æ”´";s:3:"⽂";s:3:"æ–‡";s:3:"⽃";s:3:"æ–—";s:3:"⽄";s:3:"æ–¤";s:3:"â½…";s:3:"æ–¹";s:3:"⽆";s:3:"æ— ";s:3:"⽇";s:3:"æ—¥";s:3:"⽈";s:3:"æ›°";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"æ­¢";s:3:"â½";s:3:"æ­¹";s:3:"⽎";s:3:"殳";s:3:"â½";s:3:"毋";s:3:"â½";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"â½’";s:3:"æ°";s:3:"⽓";s:3:"æ°”";s:3:"â½”";s:3:"æ°´";s:3:"⽕";s:3:"ç«";s:3:"â½–";s:3:"爪";s:3:"â½—";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"â½™";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"â½›";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"â½";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"â½ ";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"â½¢";s:3:"甘";s:3:"â½£";s:3:"生";s:3:"⽤";s:3:"用";s:3:"â½¥";s:3:"ç”°";s:3:"⽦";s:3:"ç–‹";s:3:"â½§";s:3:"ç–’";s:3:"⽨";s:3:"ç™¶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"çš®";s:3:"⽫";s:3:"çš¿";s:3:"⽬";s:3:"ç›®";s:3:"â½­";s:3:"矛";s:3:"â½®";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"â½°";s:3:"示";s:3:"â½±";s:3:"禸";s:3:"â½²";s:3:"禾";s:3:"â½³";s:3:"ç©´";s:3:"â½´";s:3:"ç«‹";s:3:"â½µ";s:3:"竹";s:3:"â½¶";s:3:"ç±³";s:3:"â½·";s:3:"糸";s:3:"⽸";s:3:"ç¼¶";s:3:"â½¹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"â½»";s:3:"ç¾½";s:3:"â½¼";s:3:"è€";s:3:"â½½";s:3:"而";s:3:"â½¾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"â¾€";s:3:"è¿";s:3:"â¾";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"â¾…";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"è™";s:3:"â¾";s:3:"虫";s:3:"⾎";s:3:"è¡€";s:3:"â¾";s:3:"行";s:3:"â¾";s:3:"è¡£";s:3:"⾑";s:3:"襾";s:3:"â¾’";s:3:"見";s:3:"⾓";s:3:"è§’";s:3:"â¾”";s:3:"言";s:3:"⾕";s:3:"è°·";s:3:"â¾–";s:3:"豆";s:3:"â¾—";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"â¾™";s:3:"è²";s:3:"⾚";s:3:"赤";s:3:"â¾›";s:3:"èµ°";s:3:"⾜";s:3:"è¶³";s:3:"â¾";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"è¾›";s:3:"â¾ ";s:3:"è¾°";s:3:"⾡";s:3:"è¾µ";s:3:"â¾¢";s:3:"é‚‘";s:3:"â¾£";s:3:"é…‰";s:3:"⾤";s:3:"釆";s:3:"â¾¥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"â¾§";s:3:"é•·";s:3:"⾨";s:3:"é–€";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"éš¶";s:3:"⾫";s:3:"éš¹";s:3:"⾬";s:3:"雨";s:3:"â¾­";s:3:"é‘";s:3:"â¾®";s:3:"éž";s:3:"⾯";s:3:"é¢";s:3:"â¾°";s:3:"é©";s:3:"â¾±";s:3:"韋";s:3:"â¾²";s:3:"韭";s:3:"â¾³";s:3:"音";s:3:"â¾´";s:3:"é ";s:3:"â¾µ";s:3:"風";s:3:"â¾¶";s:3:"飛";s:3:"â¾·";s:3:"食";s:3:"⾸";s:3:"首";s:3:"â¾¹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"â¾»";s:3:"骨";s:3:"â¾¼";s:3:"高";s:3:"â¾½";s:3:"髟";s:3:"â¾¾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"â¿€";s:3:"鬲";s:3:"â¿";s:3:"鬼";s:3:"â¿‚";s:3:"é­š";s:3:"⿃";s:3:"é³¥";s:3:"â¿„";s:3:"é¹µ";s:3:"â¿…";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"é»";s:3:"⿊";s:3:"黑";s:3:"â¿‹";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"â¿";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"â¿";s:3:"é¼ ";s:3:"â¿";s:3:"é¼»";s:3:"â¿‘";s:3:"齊";s:3:"â¿’";s:3:"é½’";s:3:"â¿“";s:3:"é¾";s:3:"â¿”";s:3:"龜";s:3:"â¿•";s:3:"é¾ ";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"å";s:3:"〹";s:3:"å„";s:3:"〺";s:3:"å…";s:3:"ã‚›";s:4:" ã‚™";s:3:"゜";s:4:" ゚";s:3:"ゟ";s:6:"より";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"á„€";s:3:"ㄲ";s:3:"á„";s:3:"ㄳ";s:3:"ᆪ";s:3:"ã„´";s:3:"á„‚";s:3:"ㄵ";s:3:"ᆬ";s:3:"ã„¶";s:3:"ᆭ";s:3:"ã„·";s:3:"ᄃ";s:3:"ㄸ";s:3:"á„„";s:3:"ㄹ";s:3:"á„…";s:3:"ㄺ";s:3:"ᆰ";s:3:"ã„»";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ã„¿";s:3:"ᆵ";s:3:"ã…€";s:3:"ᄚ";s:3:"ã…";s:3:"ᄆ";s:3:"ã…‚";s:3:"ᄇ";s:3:"ã…ƒ";s:3:"ᄈ";s:3:"ã…„";s:3:"á„¡";s:3:"ã……";s:3:"ᄉ";s:3:"ã…†";s:3:"ᄊ";s:3:"ã…‡";s:3:"á„‹";s:3:"ã…ˆ";s:3:"ᄌ";s:3:"ã…‰";s:3:"á„";s:3:"ã…Š";s:3:"ᄎ";s:3:"ã…‹";s:3:"á„";s:3:"ã…Œ";s:3:"á„";s:3:"ã…";s:3:"á„‘";s:3:"ã…Ž";s:3:"á„’";s:3:"ã…";s:3:"á…¡";s:3:"ã…";s:3:"á…¢";s:3:"ã…‘";s:3:"á…£";s:3:"ã…’";s:3:"á…¤";s:3:"ã…“";s:3:"á…¥";s:3:"ã…”";s:3:"á…¦";s:3:"ã…•";s:3:"á…§";s:3:"ã…–";s:3:"á…¨";s:3:"ã…—";s:3:"á…©";s:3:"ã…˜";s:3:"á…ª";s:3:"ã…™";s:3:"á…«";s:3:"ã…š";s:3:"á…¬";s:3:"ã…›";s:3:"á…­";s:3:"ã…œ";s:3:"á…®";s:3:"ã…";s:3:"á…¯";s:3:"ã…ž";s:3:"á…°";s:3:"ã…Ÿ";s:3:"á…±";s:3:"ã… ";s:3:"á…²";s:3:"ã…¡";s:3:"á…³";s:3:"ã…¢";s:3:"á…´";s:3:"ã…£";s:3:"á…µ";s:3:"ã…¤";s:3:"á… ";s:3:"ã…¥";s:3:"á„”";s:3:"ã…¦";s:3:"á„•";s:3:"ã…§";s:3:"ᇇ";s:3:"ã…¨";s:3:"ᇈ";s:3:"ã…©";s:3:"ᇌ";s:3:"ã…ª";s:3:"ᇎ";s:3:"ã…«";s:3:"ᇓ";s:3:"ã…¬";s:3:"ᇗ";s:3:"ã…­";s:3:"ᇙ";s:3:"ã…®";s:3:"ᄜ";s:3:"ã…¯";s:3:"á‡";s:3:"ã…°";s:3:"ᇟ";s:3:"ã…±";s:3:"á„";s:3:"ã…²";s:3:"ᄞ";s:3:"ã…³";s:3:"á„ ";s:3:"ã…´";s:3:"á„¢";s:3:"ã…µ";s:3:"á„£";s:3:"ã…¶";s:3:"á„§";s:3:"ã…·";s:3:"á„©";s:3:"ã…¸";s:3:"á„«";s:3:"ã…¹";s:3:"ᄬ";s:3:"ã…º";s:3:"á„­";s:3:"ã…»";s:3:"á„®";s:3:"ã…¼";s:3:"ᄯ";s:3:"ã…½";s:3:"ᄲ";s:3:"ã…¾";s:3:"á„¶";s:3:"ã…¿";s:3:"á…€";s:3:"ㆀ";s:3:"á…‡";s:3:"ã†";s:3:"á…Œ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"á…—";s:3:"ㆅ";s:3:"á…˜";s:3:"ㆆ";s:3:"á…™";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ã†";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"å››";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"ä¹™";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"ä¸";s:3:"ã†";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(á„€)";s:3:"ãˆ";s:5:"(á„‚)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(á„…)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(á„‹)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(á„)";s:3:"㈋";s:5:"(á„)";s:3:"㈌";s:5:"(á„‘)";s:3:"ãˆ";s:5:"(á„’)";s:3:"㈎";s:8:"(가)";s:3:"ãˆ";s:8:"(á„‚á…¡)";s:3:"ãˆ";s:8:"(다)";s:3:"㈑";s:8:"(á„…á…¡)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(á„‹á…¡)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(á„á…¡)";s:3:"㈙";s:8:"(á„á…¡)";s:3:"㈚";s:8:"(á„‘á…¡)";s:3:"㈛";s:8:"(á„’á…¡)";s:3:"㈜";s:8:"(주)";s:3:"ãˆ";s:17:"(오전)";s:3:"㈞";s:14:"(á„‹á…©á„’á…®)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(å››)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(å…­)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(å…«)";s:3:"㈨";s:5:"(ä¹)";s:3:"㈩";s:5:"(å)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(ç«)";s:3:"㈬";s:5:"(æ°´)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(æ—¥)";s:3:"㈱";s:5:"(æ ª)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(å)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(ç¥)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(å­¦)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(ä¼)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(å”)";s:3:"㉀";s:5:"(祭)";s:3:"ã‰";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"å•";s:3:"㉅";s:3:"å¹¼";s:3:"㉆";s:3:"æ–‡";s:3:"㉇";s:3:"ç®";s:3:"ã‰";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"ã‰";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"á„€";s:3:"㉡";s:3:"á„‚";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"á„…";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"á„‹";s:3:"㉨";s:3:"ᄌ";s:3:"㉩";s:3:"ᄎ";s:3:"㉪";s:3:"á„";s:3:"㉫";s:3:"á„";s:3:"㉬";s:3:"á„‘";s:3:"㉭";s:3:"á„’";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"á„‚á…¡";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"á„…á…¡";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"á„‹á…¡";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"차";s:3:"㉸";s:6:"á„á…¡";s:3:"㉹";s:6:"á„á…¡";s:3:"㉺";s:6:"á„‘á…¡";s:3:"㉻";s:6:"á„’á…¡";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"á„‹á…®";s:3:"㊀";s:3:"一";s:3:"ãŠ";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"å››";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"å…­";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"å…«";s:3:"㊈";s:3:"ä¹";s:3:"㊉";s:3:"å";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"ç«";s:3:"㊌";s:3:"æ°´";s:3:"ãŠ";s:3:"木";s:3:"㊎";s:3:"金";s:3:"ãŠ";s:3:"土";s:3:"ãŠ";s:3:"æ—¥";s:3:"㊑";s:3:"æ ª";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"å";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"ç¥";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"ç”·";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"é©";s:3:"ãŠ";s:3:"優";s:3:"㊞";s:3:"å°";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"é …";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"æ­£";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"å·¦";s:3:"㊨";s:3:"å³";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"å®—";s:3:"㊫";s:3:"å­¦";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"ä¼";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"å”";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"ã‹€";s:4:"1月";s:3:"ã‹";s:4:"2月";s:3:"ã‹‚";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"ã‹„";s:4:"5月";s:3:"ã‹…";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"ã‹‹";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"ã‹";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"ã‹";s:3:"LTD";s:3:"ã‹";s:3:"ã‚¢";s:3:"ã‹‘";s:3:"イ";s:3:"ã‹’";s:3:"ウ";s:3:"ã‹“";s:3:"エ";s:3:"ã‹”";s:3:"オ";s:3:"ã‹•";s:3:"ã‚«";s:3:"ã‹–";s:3:"ã‚­";s:3:"ã‹—";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"ã‹™";s:3:"コ";s:3:"㋚";s:3:"サ";s:3:"ã‹›";s:3:"ã‚·";s:3:"㋜";s:3:"ス";s:3:"ã‹";s:3:"ã‚»";s:3:"㋞";s:3:"ソ";s:3:"㋟";s:3:"ã‚¿";s:3:"ã‹ ";s:3:"ãƒ";s:3:"ã‹¡";s:3:"ツ";s:3:"ã‹¢";s:3:"テ";s:3:"ã‹£";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"ã‹¥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"ã‹§";s:3:"ãƒ";s:3:"㋨";s:3:"ノ";s:3:"ã‹©";s:3:"ãƒ";s:3:"㋪";s:3:"ヒ";s:3:"ã‹«";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"ã‹­";s:3:"ホ";s:3:"ã‹®";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"ã‹°";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"ã‹´";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"ã‹¶";s:3:"ラ";s:3:"ã‹·";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"ã‹»";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"ã‚¢ãƒã‚šãƒ¼ãƒˆ";s:3:"ãŒ";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インãƒ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"ãŒ";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"ãŒ";s:12:"ガンマ";s:3:"ãŒ";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローãƒ";s:3:"㌜";s:9:"ケース";s:3:"ãŒ";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンãƒãƒ¼ãƒ ";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センãƒ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ãƒã‚¤ãƒ„";s:3:"㌫";s:18:"ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ";s:3:"㌬";s:12:"ãƒã‚šãƒ¼ãƒ„";s:3:"㌭";s:15:"ãƒã‚™ãƒ¼ãƒ¬ãƒ«";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"ã€";s:15:"ポンド";s:3:"ã";s:9:"ホール";s:3:"ã‚";s:9:"ホーン";s:3:"ãƒ";s:12:"マイクロ";s:3:"ã„";s:9:"マイル";s:3:"ã…";s:9:"マッãƒ";s:3:"ã†";s:9:"マルク";s:3:"ã‡";s:15:"マンション";s:3:"ãˆ";s:12:"ミクロン";s:3:"ã‰";s:6:"ミリ";s:3:"ãŠ";s:18:"ミリãƒã‚™ãƒ¼ãƒ«";s:3:"ã‹";s:9:"メガ";s:3:"ãŒ";s:15:"メガトン";s:3:"ã";s:12:"メートル";s:3:"ãŽ";s:12:"ヤード";s:3:"ã";s:9:"ヤール";s:3:"ã";s:9:"ユアン";s:3:"ã‘";s:12:"リットル";s:3:"ã’";s:6:"リラ";s:3:"ã“";s:12:"ルピー";s:3:"ã”";s:15:"ルーブル";s:3:"ã•";s:6:"レム";s:3:"ã–";s:18:"レントゲン";s:3:"ã—";s:9:"ワット";s:3:"ã˜";s:4:"0点";s:3:"ã™";s:4:"1点";s:3:"ãš";s:4:"2点";s:3:"ã›";s:4:"3点";s:3:"ãœ";s:4:"4点";s:3:"ã";s:4:"5点";s:3:"ãž";s:4:"6点";s:3:"ãŸ";s:4:"7点";s:3:"ã ";s:4:"8点";s:3:"ã¡";s:4:"9点";s:3:"ã¢";s:5:"10点";s:3:"ã£";s:5:"11点";s:3:"ã¤";s:5:"12点";s:3:"ã¥";s:5:"13点";s:3:"ã¦";s:5:"14点";s:3:"ã§";s:5:"15点";s:3:"ã¨";s:5:"16点";s:3:"ã©";s:5:"17点";s:3:"ãª";s:5:"18点";s:3:"ã«";s:5:"19点";s:3:"ã¬";s:5:"20点";s:3:"ã­";s:5:"21点";s:3:"ã®";s:5:"22点";s:3:"ã¯";s:5:"23点";s:3:"ã°";s:5:"24点";s:3:"ã±";s:3:"hPa";s:3:"ã²";s:2:"da";s:3:"ã³";s:2:"AU";s:3:"ã´";s:3:"bar";s:3:"ãµ";s:2:"oV";s:3:"ã¶";s:2:"pc";s:3:"ã·";s:2:"dm";s:3:"ã¸";s:3:"dm2";s:3:"ã¹";s:3:"dm3";s:3:"ãº";s:2:"IU";s:3:"ã»";s:6:"å¹³æˆ";s:3:"ã¼";s:6:"昭和";s:3:"ã½";s:6:"大正";s:3:"ã¾";s:6:"明治";s:3:"ã¿";s:12:"æ ªå¼ä¼šç¤¾";s:3:"㎀";s:2:"pA";s:3:"ãŽ";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"ãŽ";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"ãŽ";s:2:"kg";s:3:"ãŽ";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"ãŽ";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"ã€";s:3:"kΩ";s:3:"ã";s:3:"MΩ";s:3:"ã‚";s:4:"a.m.";s:3:"ãƒ";s:2:"Bq";s:3:"ã„";s:2:"cc";s:3:"ã…";s:2:"cd";s:3:"ã†";s:6:"C∕kg";s:3:"ã‡";s:3:"Co.";s:3:"ãˆ";s:2:"dB";s:3:"ã‰";s:2:"Gy";s:3:"ãŠ";s:2:"ha";s:3:"ã‹";s:2:"HP";s:3:"ãŒ";s:2:"in";s:3:"ã";s:2:"KK";s:3:"ãŽ";s:2:"KM";s:3:"ã";s:2:"kt";s:3:"ã";s:2:"lm";s:3:"ã‘";s:2:"ln";s:3:"ã’";s:3:"log";s:3:"ã“";s:2:"lx";s:3:"ã”";s:2:"mb";s:3:"ã•";s:3:"mil";s:3:"ã–";s:3:"mol";s:3:"ã—";s:2:"PH";s:3:"ã˜";s:4:"p.m.";s:3:"ã™";s:3:"PPM";s:3:"ãš";s:2:"PR";s:3:"ã›";s:2:"sr";s:3:"ãœ";s:2:"Sv";s:3:"ã";s:2:"Wb";s:3:"ãž";s:5:"V∕m";s:3:"ãŸ";s:5:"A∕m";s:3:"ã ";s:4:"1æ—¥";s:3:"ã¡";s:4:"2æ—¥";s:3:"ã¢";s:4:"3æ—¥";s:3:"ã£";s:4:"4æ—¥";s:3:"ã¤";s:4:"5æ—¥";s:3:"ã¥";s:4:"6æ—¥";s:3:"ã¦";s:4:"7æ—¥";s:3:"ã§";s:4:"8æ—¥";s:3:"ã¨";s:4:"9æ—¥";s:3:"ã©";s:5:"10æ—¥";s:3:"ãª";s:5:"11æ—¥";s:3:"ã«";s:5:"12æ—¥";s:3:"ã¬";s:5:"13æ—¥";s:3:"ã­";s:5:"14æ—¥";s:3:"ã®";s:5:"15æ—¥";s:3:"ã¯";s:5:"16æ—¥";s:3:"ã°";s:5:"17æ—¥";s:3:"ã±";s:5:"18æ—¥";s:3:"ã²";s:5:"19æ—¥";s:3:"ã³";s:5:"20æ—¥";s:3:"ã´";s:5:"21æ—¥";s:3:"ãµ";s:5:"22æ—¥";s:3:"ã¶";s:5:"23æ—¥";s:3:"ã·";s:5:"24æ—¥";s:3:"ã¸";s:5:"25æ—¥";s:3:"ã¹";s:5:"26æ—¥";s:3:"ãº";s:5:"27æ—¥";s:3:"ã»";s:5:"28æ—¥";s:3:"ã¼";s:5:"29æ—¥";s:3:"ã½";s:5:"30æ—¥";s:3:"ã¾";s:5:"31æ—¥";s:3:"ã¿";s:3:"gal";s:3:"ê°";s:3:"ê¯";s:3:"ꟸ";s:2:"Ħ";s:3:"ꟹ";s:2:"Å“";s:3:"ff";s:2:"ff";s:3:"ï¬";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"Õ´Õ¶";s:3:"ﬔ";s:4:"Õ´Õ¥";s:3:"ﬕ";s:4:"Õ´Õ«";s:3:"ﬖ";s:4:"Õ¾Õ¶";s:3:"ﬗ";s:4:"Õ´Õ­";s:3:"ﬠ";s:2:"×¢";s:3:"ﬡ";s:2:"×";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"×”";s:3:"ﬤ";s:2:"×›";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"×";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"ï­";s:4:"×ל";s:3:"ï­";s:2:"Ù±";s:3:"ï­‘";s:2:"Ù±";s:3:"ï­’";s:2:"Ù»";s:3:"ï­“";s:2:"Ù»";s:3:"ï­”";s:2:"Ù»";s:3:"ï­•";s:2:"Ù»";s:3:"ï­–";s:2:"Ù¾";s:3:"ï­—";s:2:"Ù¾";s:3:"ï­˜";s:2:"Ù¾";s:3:"ï­™";s:2:"Ù¾";s:3:"ï­š";s:2:"Ú€";s:3:"ï­›";s:2:"Ú€";s:3:"ï­œ";s:2:"Ú€";s:3:"ï­";s:2:"Ú€";s:3:"ï­ž";s:2:"Ùº";s:3:"ï­Ÿ";s:2:"Ùº";s:3:"ï­ ";s:2:"Ùº";s:3:"ï­¡";s:2:"Ùº";s:3:"ï­¢";s:2:"Ù¿";s:3:"ï­£";s:2:"Ù¿";s:3:"ï­¤";s:2:"Ù¿";s:3:"ï­¥";s:2:"Ù¿";s:3:"ï­¦";s:2:"Ù¹";s:3:"ï­§";s:2:"Ù¹";s:3:"ï­¨";s:2:"Ù¹";s:3:"ï­©";s:2:"Ù¹";s:3:"ï­ª";s:2:"Ú¤";s:3:"ï­«";s:2:"Ú¤";s:3:"ï­¬";s:2:"Ú¤";s:3:"ï­­";s:2:"Ú¤";s:3:"ï­®";s:2:"Ú¦";s:3:"ï­¯";s:2:"Ú¦";s:3:"ï­°";s:2:"Ú¦";s:3:"ï­±";s:2:"Ú¦";s:3:"ï­²";s:2:"Ú„";s:3:"ï­³";s:2:"Ú„";s:3:"ï­´";s:2:"Ú„";s:3:"ï­µ";s:2:"Ú„";s:3:"ï­¶";s:2:"Úƒ";s:3:"ï­·";s:2:"Úƒ";s:3:"ï­¸";s:2:"Úƒ";s:3:"ï­¹";s:2:"Úƒ";s:3:"ï­º";s:2:"Ú†";s:3:"ï­»";s:2:"Ú†";s:3:"ï­¼";s:2:"Ú†";s:3:"ï­½";s:2:"Ú†";s:3:"ï­¾";s:2:"Ú‡";s:3:"ï­¿";s:2:"Ú‡";s:3:"ﮀ";s:2:"Ú‡";s:3:"ï®";s:2:"Ú‡";s:3:"ﮂ";s:2:"Ú";s:3:"ﮃ";s:2:"Ú";s:3:"ﮄ";s:2:"ÚŒ";s:3:"ï®…";s:2:"ÚŒ";s:3:"ﮆ";s:2:"ÚŽ";s:3:"ﮇ";s:2:"ÚŽ";s:3:"ﮈ";s:2:"Úˆ";s:3:"ﮉ";s:2:"Úˆ";s:3:"ﮊ";s:2:"Ú˜";s:3:"ﮋ";s:2:"Ú˜";s:3:"ﮌ";s:2:"Ú‘";s:3:"ï®";s:2:"Ú‘";s:3:"ﮎ";s:2:"Ú©";s:3:"ï®";s:2:"Ú©";s:3:"ï®";s:2:"Ú©";s:3:"ﮑ";s:2:"Ú©";s:3:"ï®’";s:2:"Ú¯";s:3:"ﮓ";s:2:"Ú¯";s:3:"ï®”";s:2:"Ú¯";s:3:"ﮕ";s:2:"Ú¯";s:3:"ï®–";s:2:"Ú³";s:3:"ï®—";s:2:"Ú³";s:3:"ﮘ";s:2:"Ú³";s:3:"ï®™";s:2:"Ú³";s:3:"ﮚ";s:2:"Ú±";s:3:"ï®›";s:2:"Ú±";s:3:"ﮜ";s:2:"Ú±";s:3:"ï®";s:2:"Ú±";s:3:"ﮞ";s:2:"Úº";s:3:"ﮟ";s:2:"Úº";s:3:"ï® ";s:2:"Ú»";s:3:"ﮡ";s:2:"Ú»";s:3:"ﮢ";s:2:"Ú»";s:3:"ﮣ";s:2:"Ú»";s:3:"ﮤ";s:4:"Û•Ù”";s:3:"ﮥ";s:4:"Û•Ù”";s:3:"ﮦ";s:2:"Û";s:3:"ï®§";s:2:"Û";s:3:"ﮨ";s:2:"Û";s:3:"ﮩ";s:2:"Û";s:3:"ﮪ";s:2:"Ú¾";s:3:"ﮫ";s:2:"Ú¾";s:3:"ﮬ";s:2:"Ú¾";s:3:"ï®­";s:2:"Ú¾";s:3:"ï®®";s:2:"Û’";s:3:"ﮯ";s:2:"Û’";s:3:"ï®°";s:4:"Û’Ù”";s:3:"ï®±";s:4:"Û’Ù”";s:3:"ﯓ";s:2:"Ú­";s:3:"ﯔ";s:2:"Ú­";s:3:"ﯕ";s:2:"Ú­";s:3:"ﯖ";s:2:"Ú­";s:3:"ﯗ";s:2:"Û‡";s:3:"ﯘ";s:2:"Û‡";s:3:"ﯙ";s:2:"Û†";s:3:"ﯚ";s:2:"Û†";s:3:"ﯛ";s:2:"Ûˆ";s:3:"ﯜ";s:2:"Ûˆ";s:3:"ï¯";s:4:"Û‡Ù´";s:3:"ﯞ";s:2:"Û‹";s:3:"ﯟ";s:2:"Û‹";s:3:"ﯠ";s:2:"Û…";s:3:"ﯡ";s:2:"Û…";s:3:"ﯢ";s:2:"Û‰";s:3:"ﯣ";s:2:"Û‰";s:3:"ﯤ";s:2:"Û";s:3:"ﯥ";s:2:"Û";s:3:"ﯦ";s:2:"Û";s:3:"ﯧ";s:2:"Û";s:3:"ﯨ";s:2:"Ù‰";s:3:"ﯩ";s:2:"Ù‰";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ÙŠÙ”Û•";s:3:"ﯭ";s:6:"ÙŠÙ”Û•";s:3:"ﯮ";s:6:"ÙŠÙ”Ùˆ";s:3:"ﯯ";s:6:"ÙŠÙ”Ùˆ";s:3:"ﯰ";s:6:"ÙŠÙ”Û‡";s:3:"ﯱ";s:6:"ÙŠÙ”Û‡";s:3:"ﯲ";s:6:"ÙŠÙ”Û†";s:3:"ﯳ";s:6:"ÙŠÙ”Û†";s:3:"ﯴ";s:6:"ÙŠÙ”Ûˆ";s:3:"ﯵ";s:6:"ÙŠÙ”Ûˆ";s:3:"ﯶ";s:6:"ÙŠÙ”Û";s:3:"ﯷ";s:6:"ÙŠÙ”Û";s:3:"ﯸ";s:6:"ÙŠÙ”Û";s:3:"ﯹ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯺ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯻ";s:6:"ÙŠÙ”Ù‰";s:3:"ﯼ";s:2:"ÛŒ";s:3:"ﯽ";s:2:"ÛŒ";s:3:"ﯾ";s:2:"ÛŒ";s:3:"ﯿ";s:2:"ÛŒ";s:3:"ï°€";s:6:"ئج";s:3:"ï°";s:6:"ئح";s:3:"ï°‚";s:6:"ÙŠÙ”Ù…";s:3:"ï°ƒ";s:6:"ÙŠÙ”Ù‰";s:3:"ï°„";s:6:"ÙŠÙ”ÙŠ";s:3:"ï°…";s:4:"بج";s:3:"ï°†";s:4:"بح";s:3:"ï°‡";s:4:"بخ";s:3:"ï°ˆ";s:4:"بم";s:3:"ï°‰";s:4:"بى";s:3:"ï°Š";s:4:"بي";s:3:"ï°‹";s:4:"تج";s:3:"ï°Œ";s:4:"تح";s:3:"ï°";s:4:"تخ";s:3:"ï°Ž";s:4:"تم";s:3:"ï°";s:4:"تى";s:3:"ï°";s:4:"تي";s:3:"ï°‘";s:4:"ثج";s:3:"ï°’";s:4:"ثم";s:3:"ï°“";s:4:"ثى";s:3:"ï°”";s:4:"ثي";s:3:"ï°•";s:4:"جح";s:3:"ï°–";s:4:"جم";s:3:"ï°—";s:4:"حج";s:3:"ï°˜";s:4:"حم";s:3:"ï°™";s:4:"خج";s:3:"ï°š";s:4:"خح";s:3:"ï°›";s:4:"خم";s:3:"ï°œ";s:4:"سج";s:3:"ï°";s:4:"سح";s:3:"ï°ž";s:4:"سخ";s:3:"ï°Ÿ";s:4:"سم";s:3:"ï° ";s:4:"صح";s:3:"ï°¡";s:4:"صم";s:3:"ï°¢";s:4:"ضج";s:3:"ï°£";s:4:"ضح";s:3:"ï°¤";s:4:"ضخ";s:3:"ï°¥";s:4:"ضم";s:3:"ï°¦";s:4:"طح";s:3:"ï°§";s:4:"طم";s:3:"ï°¨";s:4:"ظم";s:3:"ï°©";s:4:"عج";s:3:"ï°ª";s:4:"عم";s:3:"ï°«";s:4:"غج";s:3:"ï°¬";s:4:"غم";s:3:"ï°­";s:4:"ÙØ¬";s:3:"ï°®";s:4:"ÙØ­";s:3:"ï°¯";s:4:"ÙØ®";s:3:"ï°°";s:4:"ÙÙ…";s:3:"ï°±";s:4:"ÙÙ‰";s:3:"ï°²";s:4:"ÙÙŠ";s:3:"ï°³";s:4:"قح";s:3:"ï°´";s:4:"قم";s:3:"ï°µ";s:4:"قى";s:3:"ï°¶";s:4:"قي";s:3:"ï°·";s:4:"كا";s:3:"ï°¸";s:4:"كج";s:3:"ï°¹";s:4:"كح";s:3:"ï°º";s:4:"كخ";s:3:"ï°»";s:4:"كل";s:3:"ï°¼";s:4:"كم";s:3:"ï°½";s:4:"كى";s:3:"ï°¾";s:4:"كي";s:3:"ï°¿";s:4:"لج";s:3:"ï±€";s:4:"لح";s:3:"ï±";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ï±…";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ï±";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ï±";s:4:"نى";s:3:"ï±";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ï±’";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ï±”";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ï±–";s:4:"يح";s:3:"ï±—";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ï±™";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ï±›";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ï±";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ÙÙ‘";s:3:"ï± ";s:5:" ÙŽÙ‘";s:3:"ﱡ";s:5:" ÙÙ‘";s:3:"ï±¢";s:5:" ÙÙ‘";s:3:"ï±£";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ï±¥";s:6:"ئز";s:3:"ﱦ";s:6:"ÙŠÙ”Ù…";s:3:"ï±§";s:6:"ÙŠÙ”Ù†";s:3:"ﱨ";s:6:"ÙŠÙ”Ù‰";s:3:"ﱩ";s:6:"ÙŠÙ”ÙŠ";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ï±­";s:4:"بن";s:3:"ï±®";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ï±°";s:4:"تر";s:3:"ï±±";s:4:"تز";s:3:"ï±²";s:4:"تم";s:3:"ï±³";s:4:"تن";s:3:"ï±´";s:4:"تى";s:3:"ï±µ";s:4:"تي";s:3:"ï±¶";s:4:"ثر";s:3:"ï±·";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ï±¹";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ï±»";s:4:"ثي";s:3:"ï±¼";s:4:"ÙÙ‰";s:3:"ï±½";s:4:"ÙÙŠ";s:3:"ï±¾";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ï²€";s:4:"كا";s:3:"ï²";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ï²…";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ï²";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ï²";s:4:"ني";s:3:"ï²";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ï²’";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ï²”";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ï²–";s:4:"يي";s:3:"ï²—";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ï²™";s:6:"ئخ";s:3:"ﲚ";s:6:"ÙŠÙ”Ù…";s:3:"ï²›";s:6:"ÙŠÙ”Ù‡";s:3:"ﲜ";s:4:"بج";s:3:"ï²";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ï² ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ï²¢";s:4:"تح";s:3:"ï²£";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ï²¥";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ï²§";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ï²­";s:4:"سج";s:3:"ï²®";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ï²°";s:4:"سم";s:3:"ï²±";s:4:"صح";s:3:"ï²²";s:4:"صخ";s:3:"ï²³";s:4:"صم";s:3:"ï²´";s:4:"ضج";s:3:"ï²µ";s:4:"ضح";s:3:"ï²¶";s:4:"ضخ";s:3:"ï²·";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ï²¹";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ï²»";s:4:"عم";s:3:"ï²¼";s:4:"غج";s:3:"ï²½";s:4:"غم";s:3:"ï²¾";s:4:"ÙØ¬";s:3:"ﲿ";s:4:"ÙØ­";s:3:"ï³€";s:4:"ÙØ®";s:3:"ï³";s:4:"ÙÙ…";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ï³…";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ï³";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ï³";s:4:"مح";s:3:"ï³";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ï³’";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ï³”";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ï³–";s:4:"نه";s:3:"ï³—";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ï³™";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ï³›";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ï³";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ÙŠÙ”Ù…";s:3:"ï³ ";s:6:"ÙŠÙ”Ù‡";s:3:"ﳡ";s:4:"بم";s:3:"ï³¢";s:4:"به";s:3:"ï³£";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ï³¥";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ï³§";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ï³­";s:4:"لم";s:3:"ï³®";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ï³°";s:4:"يم";s:3:"ï³±";s:4:"يه";s:3:"ï³²";s:6:"Ù€ÙŽÙ‘";s:3:"ï³³";s:6:"Ù€ÙÙ‘";s:3:"ï³´";s:6:"Ù€ÙÙ‘";s:3:"ï³µ";s:4:"طى";s:3:"ï³¶";s:4:"طي";s:3:"ï³·";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ï³¹";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ï³»";s:4:"سى";s:3:"ï³¼";s:4:"سي";s:3:"ï³½";s:4:"شى";s:3:"ï³¾";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ï´€";s:4:"حي";s:3:"ï´";s:4:"جى";s:3:"ï´‚";s:4:"جي";s:3:"ï´ƒ";s:4:"خى";s:3:"ï´„";s:4:"خي";s:3:"ï´…";s:4:"صى";s:3:"ï´†";s:4:"صي";s:3:"ï´‡";s:4:"ضى";s:3:"ï´ˆ";s:4:"ضي";s:3:"ï´‰";s:4:"شج";s:3:"ï´Š";s:4:"شح";s:3:"ï´‹";s:4:"شخ";s:3:"ï´Œ";s:4:"شم";s:3:"ï´";s:4:"شر";s:3:"ï´Ž";s:4:"سر";s:3:"ï´";s:4:"صر";s:3:"ï´";s:4:"ضر";s:3:"ï´‘";s:4:"طى";s:3:"ï´’";s:4:"طي";s:3:"ï´“";s:4:"عى";s:3:"ï´”";s:4:"عي";s:3:"ï´•";s:4:"غى";s:3:"ï´–";s:4:"غي";s:3:"ï´—";s:4:"سى";s:3:"ï´˜";s:4:"سي";s:3:"ï´™";s:4:"شى";s:3:"ï´š";s:4:"شي";s:3:"ï´›";s:4:"حى";s:3:"ï´œ";s:4:"حي";s:3:"ï´";s:4:"جى";s:3:"ï´ž";s:4:"جي";s:3:"ï´Ÿ";s:4:"خى";s:3:"ï´ ";s:4:"خي";s:3:"ï´¡";s:4:"صى";s:3:"ï´¢";s:4:"صي";s:3:"ï´£";s:4:"ضى";s:3:"ï´¤";s:4:"ضي";s:3:"ï´¥";s:4:"شج";s:3:"ï´¦";s:4:"شح";s:3:"ï´§";s:4:"شخ";s:3:"ï´¨";s:4:"شم";s:3:"ï´©";s:4:"شر";s:3:"ï´ª";s:4:"سر";s:3:"ï´«";s:4:"صر";s:3:"ï´¬";s:4:"ضر";s:3:"ï´­";s:4:"شج";s:3:"ï´®";s:4:"شح";s:3:"ï´¯";s:4:"شخ";s:3:"ï´°";s:4:"شم";s:3:"ï´±";s:4:"سه";s:3:"ï´²";s:4:"شه";s:3:"ï´³";s:4:"طم";s:3:"ï´´";s:4:"سج";s:3:"ï´µ";s:4:"سح";s:3:"ï´¶";s:4:"سخ";s:3:"ï´·";s:4:"شج";s:3:"ï´¸";s:4:"شح";s:3:"ï´¹";s:4:"شخ";s:3:"ï´º";s:4:"طم";s:3:"ï´»";s:4:"ظم";s:3:"ï´¼";s:4:"اً";s:3:"ï´½";s:4:"اً";s:3:"ïµ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ïµ’";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ïµ”";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ïµ–";s:6:"تمح";s:3:"ïµ—";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ïµ™";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ïµ›";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ïµ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ïµ ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ïµ¢";s:6:"سمم";s:3:"ïµ£";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ïµ¥";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ïµ§";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ïµ­";s:6:"شمم";s:3:"ïµ®";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ïµ°";s:6:"ضخم";s:3:"ïµ±";s:6:"طمح";s:3:"ïµ²";s:6:"طمح";s:3:"ïµ³";s:6:"طمم";s:3:"ïµ´";s:6:"طمي";s:3:"ïµµ";s:6:"عجم";s:3:"ïµ¶";s:6:"عمم";s:3:"ïµ·";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ïµ¹";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ïµ»";s:6:"غمى";s:3:"ïµ¼";s:6:"ÙØ®Ù…";s:3:"ïµ½";s:6:"ÙØ®Ù…";s:3:"ïµ¾";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ï¶€";s:6:"لحم";s:3:"ï¶";s:6:"لحي";s:3:"ï¶‚";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ï¶„";s:6:"لجج";s:3:"ï¶…";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ï¶Š";s:6:"محم";s:3:"ï¶‹";s:6:"محي";s:3:"ï¶Œ";s:6:"مجح";s:3:"ï¶";s:6:"مجم";s:3:"ï¶Ž";s:6:"مخج";s:3:"ï¶";s:6:"مخم";s:3:"ï¶’";s:6:"مجخ";s:3:"ï¶“";s:6:"همج";s:3:"ï¶”";s:6:"همم";s:3:"ï¶•";s:6:"نحم";s:3:"ï¶–";s:6:"نحى";s:3:"ï¶—";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ï¶™";s:6:"نجى";s:3:"ï¶š";s:6:"نمي";s:3:"ï¶›";s:6:"نمى";s:3:"ï¶œ";s:6:"يمم";s:3:"ï¶";s:6:"يمم";s:3:"ï¶ž";s:6:"بخي";s:3:"ï¶Ÿ";s:6:"تجي";s:3:"ï¶ ";s:6:"تجى";s:3:"ï¶¡";s:6:"تخي";s:3:"ï¶¢";s:6:"تخى";s:3:"ï¶£";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ï¶¥";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ï¶§";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ï¶©";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ï¶«";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ï¶­";s:6:"لمي";s:3:"ï¶®";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ï¶°";s:6:"يمي";s:3:"ï¶±";s:6:"ممي";s:3:"ï¶²";s:6:"قمي";s:3:"ï¶³";s:6:"نحي";s:3:"ï¶´";s:6:"قمح";s:3:"ï¶µ";s:6:"لحم";s:3:"ï¶¶";s:6:"عمي";s:3:"ï¶·";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ï¶¹";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ï¶»";s:6:"كمم";s:3:"ï¶¼";s:6:"لجم";s:3:"ï¶½";s:6:"نجح";s:3:"ï¶¾";s:6:"جحي";s:3:"ï¶¿";s:6:"حجي";s:3:"ï·€";s:6:"مجي";s:3:"ï·";s:6:"Ùمي";s:3:"ï·‚";s:6:"بحي";s:3:"ï·ƒ";s:6:"كمم";s:3:"ï·„";s:6:"عجم";s:3:"ï·…";s:6:"صمم";s:3:"ï·†";s:6:"سخي";s:3:"ï·‡";s:6:"نجي";s:3:"ï·°";s:6:"صلے";s:3:"ï·±";s:6:"قلے";s:3:"ï·²";s:8:"الله";s:3:"ï·³";s:8:"اكبر";s:3:"ï·´";s:8:"محمد";s:3:"ï·µ";s:8:"صلعم";s:3:"ï·¶";s:8:"رسول";s:3:"ï··";s:8:"عليه";s:3:"ï·¸";s:8:"وسلم";s:3:"ï·¹";s:6:"صلى";s:3:"ï·º";s:33:"صلى الله عليه وسلم";s:3:"ï·»";s:15:"جل جلاله";s:3:"ï·¼";s:8:"ریال";s:3:"ï¸";s:1:",";s:3:"︑";s:3:"ã€";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"ã€";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"ï¹€";s:3:"〉";s:3:"ï¹";s:3:"「";s:3:"﹂";s:3:"ã€";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"ã€";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" Ì…";s:3:"﹊";s:3:" Ì…";s:3:"﹋";s:3:" Ì…";s:3:"﹌";s:3:" Ì…";s:3:"ï¹";s:1:"_";s:3:"﹎";s:1:"_";s:3:"ï¹";s:1:"_";s:3:"ï¹";s:1:",";s:3:"﹑";s:3:"ã€";s:3:"ï¹’";s:1:".";s:3:"ï¹”";s:1:";";s:3:"﹕";s:1:":";s:3:"ï¹–";s:1:"?";s:3:"ï¹—";s:1:"!";s:3:"﹘";s:3:"—";s:3:"ï¹™";s:1:"(";s:3:"﹚";s:1:")";s:3:"ï¹›";s:1:"{";s:3:"﹜";s:1:"}";s:3:"ï¹";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"ï¹ ";s:1:"&";s:3:"﹡";s:1:"*";s:3:"ï¹¢";s:1:"+";s:3:"ï¹£";s:1:"-";s:3:"﹤";s:1:"<";s:3:"ï¹¥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ï¹°";s:3:" Ù‹";s:3:"ï¹±";s:4:"ـً";s:3:"ï¹²";s:3:" ÙŒ";s:3:"ï¹´";s:3:" Ù";s:3:"ï¹¶";s:3:" ÙŽ";s:3:"ï¹·";s:4:"Ù€ÙŽ";s:3:"ﹸ";s:3:" Ù";s:3:"ï¹¹";s:4:"Ù€Ù";s:3:"ﹺ";s:3:" Ù";s:3:"ï¹»";s:4:"Ù€Ù";s:3:"ï¹¼";s:3:" Ù‘";s:3:"ï¹½";s:4:"ـّ";s:3:"ï¹¾";s:3:" Ù’";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"Ø¡";s:3:"ïº";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ÙˆÙ”";s:3:"ﺆ";s:4:"ÙˆÙ”";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ÙŠÙ”";s:3:"ﺊ";s:4:"ÙŠÙ”";s:3:"ﺋ";s:4:"ÙŠÙ”";s:3:"ﺌ";s:4:"ÙŠÙ”";s:3:"ïº";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ïº";s:2:"ب";s:3:"ïº";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"Ø©";s:3:"ﺔ";s:2:"Ø©";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"Ø«";s:3:"ﺚ";s:2:"Ø«";s:3:"ﺛ";s:2:"Ø«";s:3:"ﺜ";s:2:"Ø«";s:3:"ïº";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"Ø­";s:3:"ﺢ";s:2:"Ø­";s:3:"ﺣ";s:2:"Ø­";s:3:"ﺤ";s:2:"Ø­";s:3:"ﺥ";s:2:"Ø®";s:3:"ﺦ";s:2:"Ø®";s:3:"ﺧ";s:2:"Ø®";s:3:"ﺨ";s:2:"Ø®";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"ذ";s:3:"ﺬ";s:2:"ذ";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"Ø´";s:3:"ﺶ";s:2:"Ø´";s:3:"ﺷ";s:2:"Ø´";s:3:"ﺸ";s:2:"Ø´";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ï»";s:2:"Ø·";s:3:"ﻂ";s:2:"Ø·";s:3:"ﻃ";s:2:"Ø·";s:3:"ﻄ";s:2:"Ø·";s:3:"ï»…";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ï»";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ï»";s:2:"غ";s:3:"ï»";s:2:"غ";s:3:"ﻑ";s:2:"Ù";s:3:"ï»’";s:2:"Ù";s:3:"ﻓ";s:2:"Ù";s:3:"ï»”";s:2:"Ù";s:3:"ﻕ";s:2:"Ù‚";s:3:"ï»–";s:2:"Ù‚";s:3:"ï»—";s:2:"Ù‚";s:3:"ﻘ";s:2:"Ù‚";s:3:"ï»™";s:2:"Ùƒ";s:3:"ﻚ";s:2:"Ùƒ";s:3:"ï»›";s:2:"Ùƒ";s:3:"ﻜ";s:2:"Ùƒ";s:3:"ï»";s:2:"Ù„";s:3:"ﻞ";s:2:"Ù„";s:3:"ﻟ";s:2:"Ù„";s:3:"ï» ";s:2:"Ù„";s:3:"ﻡ";s:2:"Ù…";s:3:"ﻢ";s:2:"Ù…";s:3:"ﻣ";s:2:"Ù…";s:3:"ﻤ";s:2:"Ù…";s:3:"ﻥ";s:2:"Ù†";s:3:"ﻦ";s:2:"Ù†";s:3:"ï»§";s:2:"Ù†";s:3:"ﻨ";s:2:"Ù†";s:3:"ﻩ";s:2:"Ù‡";s:3:"ﻪ";s:2:"Ù‡";s:3:"ﻫ";s:2:"Ù‡";s:3:"ﻬ";s:2:"Ù‡";s:3:"ï»­";s:2:"Ùˆ";s:3:"ï»®";s:2:"Ùˆ";s:3:"ﻯ";s:2:"Ù‰";s:3:"ï»°";s:2:"Ù‰";s:3:"ï»±";s:2:"ÙŠ";s:3:"ﻲ";s:2:"ÙŠ";s:3:"ﻳ";s:2:"ÙŠ";s:3:"ï»´";s:2:"ÙŠ";s:3:"ﻵ";s:6:"لآ";s:3:"ï»¶";s:6:"لآ";s:3:"ï»·";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ï»»";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"ï¼";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"ï¼…";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"ï¼";s:1:"-";s:3:".";s:1:".";s:3:"ï¼";s:1:"/";s:3:"ï¼";s:1:"0";s:3:"1";s:1:"1";s:3:"ï¼’";s:1:"2";s:3:"3";s:1:"3";s:3:"ï¼”";s:1:"4";s:3:"5";s:1:"5";s:3:"ï¼–";s:1:"6";s:3:"ï¼—";s:1:"7";s:3:"8";s:1:"8";s:3:"ï¼™";s:1:"9";s:3:":";s:1:":";s:3:"ï¼›";s:1:";";s:3:"<";s:1:"<";s:3:"ï¼";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"ï¼ ";s:1:"@";s:3:"A";s:1:"A";s:3:"ï¼¢";s:1:"B";s:3:"ï¼£";s:1:"C";s:3:"D";s:1:"D";s:3:"ï¼¥";s:1:"E";s:3:"F";s:1:"F";s:3:"ï¼§";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"ï¼­";s:1:"M";s:3:"ï¼®";s:1:"N";s:3:"O";s:1:"O";s:3:"ï¼°";s:1:"P";s:3:"ï¼±";s:1:"Q";s:3:"ï¼²";s:1:"R";s:3:"ï¼³";s:1:"S";s:3:"ï¼´";s:1:"T";s:3:"ï¼µ";s:1:"U";s:3:"ï¼¶";s:1:"V";s:3:"ï¼·";s:1:"W";s:3:"X";s:1:"X";s:3:"ï¼¹";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"ï¼»";s:1:"[";s:3:"ï¼¼";s:1:"\";s:3:"ï¼½";s:1:"]";s:3:"ï¼¾";s:1:"^";s:3:"_";s:1:"_";s:3:"ï½€";s:1:"`";s:3:"ï½";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"ï½…";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"ï½";s:1:"m";s:3:"n";s:1:"n";s:3:"ï½";s:1:"o";s:3:"ï½";s:1:"p";s:3:"q";s:1:"q";s:3:"ï½’";s:1:"r";s:3:"s";s:1:"s";s:3:"ï½”";s:1:"t";s:3:"u";s:1:"u";s:3:"ï½–";s:1:"v";s:3:"ï½—";s:1:"w";s:3:"x";s:1:"x";s:3:"ï½™";s:1:"y";s:3:"z";s:1:"z";s:3:"ï½›";s:1:"{";s:3:"|";s:1:"|";s:3:"ï½";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"ï½ ";s:3:"⦆";s:3:"。";s:3:"。";s:3:"ï½¢";s:3:"「";s:3:"ï½£";s:3:"ã€";s:3:"、";s:3:"ã€";s:3:"ï½¥";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ï½§";s:3:"ã‚¡";s:3:"ィ";s:3:"ã‚£";s:3:"ゥ";s:3:"ã‚¥";s:3:"ェ";s:3:"ã‚§";s:3:"ォ";s:3:"ã‚©";s:3:"ャ";s:3:"ャ";s:3:"ï½­";s:3:"ュ";s:3:"ï½®";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ï½°";s:3:"ー";s:3:"ï½±";s:3:"ã‚¢";s:3:"ï½²";s:3:"イ";s:3:"ï½³";s:3:"ウ";s:3:"ï½´";s:3:"エ";s:3:"ï½µ";s:3:"オ";s:3:"ï½¶";s:3:"ã‚«";s:3:"ï½·";s:3:"ã‚­";s:3:"ク";s:3:"ク";s:3:"ï½¹";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"ï½»";s:3:"サ";s:3:"ï½¼";s:3:"ã‚·";s:3:"ï½½";s:3:"ス";s:3:"ï½¾";s:3:"ã‚»";s:3:"ソ";s:3:"ソ";s:3:"ï¾€";s:3:"ã‚¿";s:3:"ï¾";s:3:"ãƒ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ï¾…";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ãƒ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ãƒ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ï¾";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"ï¾";s:3:"マ";s:3:"ï¾";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"ï¾’";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ï¾”";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ï¾–";s:3:"ヨ";s:3:"ï¾—";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ï¾™";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ï¾›";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ï¾";s:3:"ン";s:3:"゙";s:3:"ã‚™";s:3:"゚";s:3:"゚";s:3:"ï¾ ";s:3:"á… ";s:3:"ᄀ";s:3:"á„€";s:3:"ï¾¢";s:3:"á„";s:3:"ï¾£";s:3:"ᆪ";s:3:"ᄂ";s:3:"á„‚";s:3:"ï¾¥";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ï¾§";s:3:"ᄃ";s:3:"ᄄ";s:3:"á„„";s:3:"ᄅ";s:3:"á„…";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ï¾­";s:3:"ᆳ";s:3:"ï¾®";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ï¾°";s:3:"ᄚ";s:3:"ï¾±";s:3:"ᄆ";s:3:"ï¾²";s:3:"ᄇ";s:3:"ï¾³";s:3:"ᄈ";s:3:"ï¾´";s:3:"á„¡";s:3:"ï¾µ";s:3:"ᄉ";s:3:"ï¾¶";s:3:"ᄊ";s:3:"ï¾·";s:3:"á„‹";s:3:"ᄌ";s:3:"ᄌ";s:3:"ï¾¹";s:3:"á„";s:3:"ᄎ";s:3:"ᄎ";s:3:"ï¾»";s:3:"á„";s:3:"ï¾¼";s:3:"á„";s:3:"ï¾½";s:3:"á„‘";s:3:"ï¾¾";s:3:"á„’";s:3:"ï¿‚";s:3:"á…¡";s:3:"ᅢ";s:3:"á…¢";s:3:"ï¿„";s:3:"á…£";s:3:"ï¿…";s:3:"á…¤";s:3:"ᅥ";s:3:"á…¥";s:3:"ᅦ";s:3:"á…¦";s:3:"ᅧ";s:3:"á…§";s:3:"ï¿‹";s:3:"á…¨";s:3:"ᅩ";s:3:"á…©";s:3:"ï¿";s:3:"á…ª";s:3:"ᅫ";s:3:"á…«";s:3:"ï¿";s:3:"á…¬";s:3:"ï¿’";s:3:"á…­";s:3:"ï¿“";s:3:"á…®";s:3:"ï¿”";s:3:"á…¯";s:3:"ï¿•";s:3:"á…°";s:3:"ï¿–";s:3:"á…±";s:3:"ï¿—";s:3:"á…²";s:3:"ᅳ";s:3:"á…³";s:3:"ï¿›";s:3:"á…´";s:3:"ᅵ";s:3:"á…µ";s:3:"ï¿ ";s:2:"¢";s:3:"ï¿¡";s:2:"£";s:3:"ï¿¢";s:2:"¬";s:3:"ï¿£";s:3:" Ì„";s:3:"¦";s:2:"¦";s:3:"ï¿¥";s:2:"Â¥";s:3:"₩";s:3:"â‚©";s:3:"│";s:3:"│";s:3:"ï¿©";s:3:"â†";s:3:"↑";s:3:"↑";s:3:"ï¿«";s:3:"→";s:3:"↓";s:3:"↓";s:3:"ï¿­";s:3:"â– ";s:3:"ï¿®";s:3:"â—‹";s:4:"ð€";s:1:"A";s:4:"ð";s:1:"B";s:4:"ð‚";s:1:"C";s:4:"ðƒ";s:1:"D";s:4:"ð„";s:1:"E";s:4:"ð…";s:1:"F";s:4:"ð†";s:1:"G";s:4:"ð‡";s:1:"H";s:4:"ðˆ";s:1:"I";s:4:"ð‰";s:1:"J";s:4:"ðŠ";s:1:"K";s:4:"ð‹";s:1:"L";s:4:"ðŒ";s:1:"M";s:4:"ð";s:1:"N";s:4:"ðŽ";s:1:"O";s:4:"ð";s:1:"P";s:4:"ð";s:1:"Q";s:4:"ð‘";s:1:"R";s:4:"ð’";s:1:"S";s:4:"ð“";s:1:"T";s:4:"ð”";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð–";s:1:"W";s:4:"ð—";s:1:"X";s:4:"ð˜";s:1:"Y";s:4:"ð™";s:1:"Z";s:4:"ðš";s:1:"a";s:4:"ð›";s:1:"b";s:4:"ðœ";s:1:"c";s:4:"ð";s:1:"d";s:4:"ðž";s:1:"e";s:4:"ðŸ";s:1:"f";s:4:"ð ";s:1:"g";s:4:"ð¡";s:1:"h";s:4:"ð¢";s:1:"i";s:4:"ð£";s:1:"j";s:4:"ð¤";s:1:"k";s:4:"ð¥";s:1:"l";s:4:"ð¦";s:1:"m";s:4:"ð§";s:1:"n";s:4:"ð¨";s:1:"o";s:4:"ð©";s:1:"p";s:4:"ðª";s:1:"q";s:4:"ð«";s:1:"r";s:4:"ð¬";s:1:"s";s:4:"ð­";s:1:"t";s:4:"ð®";s:1:"u";s:4:"ð¯";s:1:"v";s:4:"ð°";s:1:"w";s:4:"ð±";s:1:"x";s:4:"ð²";s:1:"y";s:4:"ð³";s:1:"z";s:4:"ð´";s:1:"A";s:4:"ðµ";s:1:"B";s:4:"ð¶";s:1:"C";s:4:"ð·";s:1:"D";s:4:"ð¸";s:1:"E";s:4:"ð¹";s:1:"F";s:4:"ðº";s:1:"G";s:4:"ð»";s:1:"H";s:4:"ð¼";s:1:"I";s:4:"ð½";s:1:"J";s:4:"ð¾";s:1:"K";s:4:"ð¿";s:1:"L";s:4:"ð‘€";s:1:"M";s:4:"ð‘";s:1:"N";s:4:"ð‘‚";s:1:"O";s:4:"ð‘ƒ";s:1:"P";s:4:"ð‘„";s:1:"Q";s:4:"ð‘…";s:1:"R";s:4:"ð‘†";s:1:"S";s:4:"ð‘‡";s:1:"T";s:4:"ð‘ˆ";s:1:"U";s:4:"ð‘‰";s:1:"V";s:4:"ð‘Š";s:1:"W";s:4:"ð‘‹";s:1:"X";s:4:"ð‘Œ";s:1:"Y";s:4:"ð‘";s:1:"Z";s:4:"ð‘Ž";s:1:"a";s:4:"ð‘";s:1:"b";s:4:"ð‘";s:1:"c";s:4:"ð‘‘";s:1:"d";s:4:"ð‘’";s:1:"e";s:4:"ð‘“";s:1:"f";s:4:"ð‘”";s:1:"g";s:4:"ð‘–";s:1:"i";s:4:"ð‘—";s:1:"j";s:4:"ð‘˜";s:1:"k";s:4:"ð‘™";s:1:"l";s:4:"ð‘š";s:1:"m";s:4:"ð‘›";s:1:"n";s:4:"ð‘œ";s:1:"o";s:4:"ð‘";s:1:"p";s:4:"ð‘ž";s:1:"q";s:4:"ð‘Ÿ";s:1:"r";s:4:"ð‘ ";s:1:"s";s:4:"ð‘¡";s:1:"t";s:4:"ð‘¢";s:1:"u";s:4:"ð‘£";s:1:"v";s:4:"ð‘¤";s:1:"w";s:4:"ð‘¥";s:1:"x";s:4:"ð‘¦";s:1:"y";s:4:"ð‘§";s:1:"z";s:4:"ð‘¨";s:1:"A";s:4:"ð‘©";s:1:"B";s:4:"ð‘ª";s:1:"C";s:4:"ð‘«";s:1:"D";s:4:"ð‘¬";s:1:"E";s:4:"ð‘­";s:1:"F";s:4:"ð‘®";s:1:"G";s:4:"ð‘¯";s:1:"H";s:4:"ð‘°";s:1:"I";s:4:"ð‘±";s:1:"J";s:4:"ð‘²";s:1:"K";s:4:"ð‘³";s:1:"L";s:4:"ð‘´";s:1:"M";s:4:"ð‘µ";s:1:"N";s:4:"ð‘¶";s:1:"O";s:4:"ð‘·";s:1:"P";s:4:"ð‘¸";s:1:"Q";s:4:"ð‘¹";s:1:"R";s:4:"ð‘º";s:1:"S";s:4:"ð‘»";s:1:"T";s:4:"ð‘¼";s:1:"U";s:4:"ð‘½";s:1:"V";s:4:"ð‘¾";s:1:"W";s:4:"ð‘¿";s:1:"X";s:4:"ð’€";s:1:"Y";s:4:"ð’";s:1:"Z";s:4:"ð’‚";s:1:"a";s:4:"ð’ƒ";s:1:"b";s:4:"ð’„";s:1:"c";s:4:"ð’…";s:1:"d";s:4:"ð’†";s:1:"e";s:4:"ð’‡";s:1:"f";s:4:"ð’ˆ";s:1:"g";s:4:"ð’‰";s:1:"h";s:4:"ð’Š";s:1:"i";s:4:"ð’‹";s:1:"j";s:4:"ð’Œ";s:1:"k";s:4:"ð’";s:1:"l";s:4:"ð’Ž";s:1:"m";s:4:"ð’";s:1:"n";s:4:"ð’";s:1:"o";s:4:"ð’‘";s:1:"p";s:4:"ð’’";s:1:"q";s:4:"ð’“";s:1:"r";s:4:"ð’”";s:1:"s";s:4:"ð’•";s:1:"t";s:4:"ð’–";s:1:"u";s:4:"ð’—";s:1:"v";s:4:"ð’˜";s:1:"w";s:4:"ð’™";s:1:"x";s:4:"ð’š";s:1:"y";s:4:"ð’›";s:1:"z";s:4:"ð’œ";s:1:"A";s:4:"ð’ž";s:1:"C";s:4:"ð’Ÿ";s:1:"D";s:4:"ð’¢";s:1:"G";s:4:"ð’¥";s:1:"J";s:4:"ð’¦";s:1:"K";s:4:"ð’©";s:1:"N";s:4:"ð’ª";s:1:"O";s:4:"ð’«";s:1:"P";s:4:"ð’¬";s:1:"Q";s:4:"ð’®";s:1:"S";s:4:"ð’¯";s:1:"T";s:4:"ð’°";s:1:"U";s:4:"ð’±";s:1:"V";s:4:"ð’²";s:1:"W";s:4:"ð’³";s:1:"X";s:4:"ð’´";s:1:"Y";s:4:"ð’µ";s:1:"Z";s:4:"ð’¶";s:1:"a";s:4:"ð’·";s:1:"b";s:4:"ð’¸";s:1:"c";s:4:"ð’¹";s:1:"d";s:4:"ð’»";s:1:"f";s:4:"ð’½";s:1:"h";s:4:"ð’¾";s:1:"i";s:4:"ð’¿";s:1:"j";s:4:"ð“€";s:1:"k";s:4:"ð“";s:1:"l";s:4:"ð“‚";s:1:"m";s:4:"ð“ƒ";s:1:"n";s:4:"ð“…";s:1:"p";s:4:"ð“†";s:1:"q";s:4:"ð“‡";s:1:"r";s:4:"ð“ˆ";s:1:"s";s:4:"ð“‰";s:1:"t";s:4:"ð“Š";s:1:"u";s:4:"ð“‹";s:1:"v";s:4:"ð“Œ";s:1:"w";s:4:"ð“";s:1:"x";s:4:"ð“Ž";s:1:"y";s:4:"ð“";s:1:"z";s:4:"ð“";s:1:"A";s:4:"ð“‘";s:1:"B";s:4:"ð“’";s:1:"C";s:4:"ð““";s:1:"D";s:4:"ð“”";s:1:"E";s:4:"ð“•";s:1:"F";s:4:"ð“–";s:1:"G";s:4:"ð“—";s:1:"H";s:4:"ð“˜";s:1:"I";s:4:"ð“™";s:1:"J";s:4:"ð“š";s:1:"K";s:4:"ð“›";s:1:"L";s:4:"ð“œ";s:1:"M";s:4:"ð“";s:1:"N";s:4:"ð“ž";s:1:"O";s:4:"ð“Ÿ";s:1:"P";s:4:"ð“ ";s:1:"Q";s:4:"ð“¡";s:1:"R";s:4:"ð“¢";s:1:"S";s:4:"ð“£";s:1:"T";s:4:"ð“¤";s:1:"U";s:4:"ð“¥";s:1:"V";s:4:"ð“¦";s:1:"W";s:4:"ð“§";s:1:"X";s:4:"ð“¨";s:1:"Y";s:4:"ð“©";s:1:"Z";s:4:"ð“ª";s:1:"a";s:4:"ð“«";s:1:"b";s:4:"ð“¬";s:1:"c";s:4:"ð“­";s:1:"d";s:4:"ð“®";s:1:"e";s:4:"ð“¯";s:1:"f";s:4:"ð“°";s:1:"g";s:4:"ð“±";s:1:"h";s:4:"ð“²";s:1:"i";s:4:"ð“³";s:1:"j";s:4:"ð“´";s:1:"k";s:4:"ð“µ";s:1:"l";s:4:"ð“¶";s:1:"m";s:4:"ð“·";s:1:"n";s:4:"ð“¸";s:1:"o";s:4:"ð“¹";s:1:"p";s:4:"ð“º";s:1:"q";s:4:"ð“»";s:1:"r";s:4:"ð“¼";s:1:"s";s:4:"ð“½";s:1:"t";s:4:"ð“¾";s:1:"u";s:4:"ð“¿";s:1:"v";s:4:"ð”€";s:1:"w";s:4:"ð”";s:1:"x";s:4:"ð”‚";s:1:"y";s:4:"ð”ƒ";s:1:"z";s:4:"ð”„";s:1:"A";s:4:"ð”…";s:1:"B";s:4:"ð”‡";s:1:"D";s:4:"ð”ˆ";s:1:"E";s:4:"ð”‰";s:1:"F";s:4:"ð”Š";s:1:"G";s:4:"ð”";s:1:"J";s:4:"ð”Ž";s:1:"K";s:4:"ð”";s:1:"L";s:4:"ð”";s:1:"M";s:4:"ð”‘";s:1:"N";s:4:"ð”’";s:1:"O";s:4:"ð”“";s:1:"P";s:4:"ð””";s:1:"Q";s:4:"ð”–";s:1:"S";s:4:"ð”—";s:1:"T";s:4:"ð”˜";s:1:"U";s:4:"ð”™";s:1:"V";s:4:"ð”š";s:1:"W";s:4:"ð”›";s:1:"X";s:4:"ð”œ";s:1:"Y";s:4:"ð”ž";s:1:"a";s:4:"ð”Ÿ";s:1:"b";s:4:"ð” ";s:1:"c";s:4:"ð”¡";s:1:"d";s:4:"ð”¢";s:1:"e";s:4:"ð”£";s:1:"f";s:4:"ð”¤";s:1:"g";s:4:"ð”¥";s:1:"h";s:4:"ð”¦";s:1:"i";s:4:"ð”§";s:1:"j";s:4:"ð”¨";s:1:"k";s:4:"ð”©";s:1:"l";s:4:"ð”ª";s:1:"m";s:4:"ð”«";s:1:"n";s:4:"ð”¬";s:1:"o";s:4:"ð”­";s:1:"p";s:4:"ð”®";s:1:"q";s:4:"ð”¯";s:1:"r";s:4:"ð”°";s:1:"s";s:4:"ð”±";s:1:"t";s:4:"ð”²";s:1:"u";s:4:"ð”³";s:1:"v";s:4:"ð”´";s:1:"w";s:4:"ð”µ";s:1:"x";s:4:"ð”¶";s:1:"y";s:4:"ð”·";s:1:"z";s:4:"ð”¸";s:1:"A";s:4:"ð”¹";s:1:"B";s:4:"ð”»";s:1:"D";s:4:"ð”¼";s:1:"E";s:4:"ð”½";s:1:"F";s:4:"ð”¾";s:1:"G";s:4:"ð•€";s:1:"I";s:4:"ð•";s:1:"J";s:4:"ð•‚";s:1:"K";s:4:"ð•ƒ";s:1:"L";s:4:"ð•„";s:1:"M";s:4:"ð•†";s:1:"O";s:4:"ð•Š";s:1:"S";s:4:"ð•‹";s:1:"T";s:4:"ð•Œ";s:1:"U";s:4:"ð•";s:1:"V";s:4:"ð•Ž";s:1:"W";s:4:"ð•";s:1:"X";s:4:"ð•";s:1:"Y";s:4:"ð•’";s:1:"a";s:4:"ð•“";s:1:"b";s:4:"ð•”";s:1:"c";s:4:"ð••";s:1:"d";s:4:"ð•–";s:1:"e";s:4:"ð•—";s:1:"f";s:4:"ð•˜";s:1:"g";s:4:"ð•™";s:1:"h";s:4:"ð•š";s:1:"i";s:4:"ð•›";s:1:"j";s:4:"ð•œ";s:1:"k";s:4:"ð•";s:1:"l";s:4:"ð•ž";s:1:"m";s:4:"ð•Ÿ";s:1:"n";s:4:"ð• ";s:1:"o";s:4:"ð•¡";s:1:"p";s:4:"ð•¢";s:1:"q";s:4:"ð•£";s:1:"r";s:4:"ð•¤";s:1:"s";s:4:"ð•¥";s:1:"t";s:4:"ð•¦";s:1:"u";s:4:"ð•§";s:1:"v";s:4:"ð•¨";s:1:"w";s:4:"ð•©";s:1:"x";s:4:"ð•ª";s:1:"y";s:4:"ð•«";s:1:"z";s:4:"ð•¬";s:1:"A";s:4:"ð•­";s:1:"B";s:4:"ð•®";s:1:"C";s:4:"ð•¯";s:1:"D";s:4:"ð•°";s:1:"E";s:4:"ð•±";s:1:"F";s:4:"ð•²";s:1:"G";s:4:"ð•³";s:1:"H";s:4:"ð•´";s:1:"I";s:4:"ð•µ";s:1:"J";s:4:"ð•¶";s:1:"K";s:4:"ð•·";s:1:"L";s:4:"ð•¸";s:1:"M";s:4:"ð•¹";s:1:"N";s:4:"ð•º";s:1:"O";s:4:"ð•»";s:1:"P";s:4:"ð•¼";s:1:"Q";s:4:"ð•½";s:1:"R";s:4:"ð•¾";s:1:"S";s:4:"ð•¿";s:1:"T";s:4:"ð–€";s:1:"U";s:4:"ð–";s:1:"V";s:4:"ð–‚";s:1:"W";s:4:"ð–ƒ";s:1:"X";s:4:"ð–„";s:1:"Y";s:4:"ð–…";s:1:"Z";s:4:"ð–†";s:1:"a";s:4:"ð–‡";s:1:"b";s:4:"ð–ˆ";s:1:"c";s:4:"ð–‰";s:1:"d";s:4:"ð–Š";s:1:"e";s:4:"ð–‹";s:1:"f";s:4:"ð–Œ";s:1:"g";s:4:"ð–";s:1:"h";s:4:"ð–Ž";s:1:"i";s:4:"ð–";s:1:"j";s:4:"ð–";s:1:"k";s:4:"ð–‘";s:1:"l";s:4:"ð–’";s:1:"m";s:4:"ð–“";s:1:"n";s:4:"ð–”";s:1:"o";s:4:"ð–•";s:1:"p";s:4:"ð––";s:1:"q";s:4:"ð–—";s:1:"r";s:4:"ð–˜";s:1:"s";s:4:"ð–™";s:1:"t";s:4:"ð–š";s:1:"u";s:4:"ð–›";s:1:"v";s:4:"ð–œ";s:1:"w";s:4:"ð–";s:1:"x";s:4:"ð–ž";s:1:"y";s:4:"ð–Ÿ";s:1:"z";s:4:"ð– ";s:1:"A";s:4:"ð–¡";s:1:"B";s:4:"ð–¢";s:1:"C";s:4:"ð–£";s:1:"D";s:4:"ð–¤";s:1:"E";s:4:"ð–¥";s:1:"F";s:4:"ð–¦";s:1:"G";s:4:"ð–§";s:1:"H";s:4:"ð–¨";s:1:"I";s:4:"ð–©";s:1:"J";s:4:"ð–ª";s:1:"K";s:4:"ð–«";s:1:"L";s:4:"ð–¬";s:1:"M";s:4:"ð–­";s:1:"N";s:4:"ð–®";s:1:"O";s:4:"ð–¯";s:1:"P";s:4:"ð–°";s:1:"Q";s:4:"ð–±";s:1:"R";s:4:"ð–²";s:1:"S";s:4:"ð–³";s:1:"T";s:4:"ð–´";s:1:"U";s:4:"ð–µ";s:1:"V";s:4:"ð–¶";s:1:"W";s:4:"ð–·";s:1:"X";s:4:"ð–¸";s:1:"Y";s:4:"ð–¹";s:1:"Z";s:4:"ð–º";s:1:"a";s:4:"ð–»";s:1:"b";s:4:"ð–¼";s:1:"c";s:4:"ð–½";s:1:"d";s:4:"ð–¾";s:1:"e";s:4:"ð–¿";s:1:"f";s:4:"ð—€";s:1:"g";s:4:"ð—";s:1:"h";s:4:"ð—‚";s:1:"i";s:4:"ð—ƒ";s:1:"j";s:4:"ð—„";s:1:"k";s:4:"ð—…";s:1:"l";s:4:"ð—†";s:1:"m";s:4:"ð—‡";s:1:"n";s:4:"ð—ˆ";s:1:"o";s:4:"ð—‰";s:1:"p";s:4:"ð—Š";s:1:"q";s:4:"ð—‹";s:1:"r";s:4:"ð—Œ";s:1:"s";s:4:"ð—";s:1:"t";s:4:"ð—Ž";s:1:"u";s:4:"ð—";s:1:"v";s:4:"ð—";s:1:"w";s:4:"ð—‘";s:1:"x";s:4:"ð—’";s:1:"y";s:4:"ð—“";s:1:"z";s:4:"ð—”";s:1:"A";s:4:"ð—•";s:1:"B";s:4:"ð—–";s:1:"C";s:4:"ð——";s:1:"D";s:4:"ð—˜";s:1:"E";s:4:"ð—™";s:1:"F";s:4:"ð—š";s:1:"G";s:4:"ð—›";s:1:"H";s:4:"ð—œ";s:1:"I";s:4:"ð—";s:1:"J";s:4:"ð—ž";s:1:"K";s:4:"ð—Ÿ";s:1:"L";s:4:"ð— ";s:1:"M";s:4:"ð—¡";s:1:"N";s:4:"ð—¢";s:1:"O";s:4:"ð—£";s:1:"P";s:4:"ð—¤";s:1:"Q";s:4:"ð—¥";s:1:"R";s:4:"ð—¦";s:1:"S";s:4:"ð—§";s:1:"T";s:4:"ð—¨";s:1:"U";s:4:"ð—©";s:1:"V";s:4:"ð—ª";s:1:"W";s:4:"ð—«";s:1:"X";s:4:"ð—¬";s:1:"Y";s:4:"ð—­";s:1:"Z";s:4:"ð—®";s:1:"a";s:4:"ð—¯";s:1:"b";s:4:"ð—°";s:1:"c";s:4:"ð—±";s:1:"d";s:4:"ð—²";s:1:"e";s:4:"ð—³";s:1:"f";s:4:"ð—´";s:1:"g";s:4:"ð—µ";s:1:"h";s:4:"ð—¶";s:1:"i";s:4:"ð—·";s:1:"j";s:4:"ð—¸";s:1:"k";s:4:"ð—¹";s:1:"l";s:4:"ð—º";s:1:"m";s:4:"ð—»";s:1:"n";s:4:"ð—¼";s:1:"o";s:4:"ð—½";s:1:"p";s:4:"ð—¾";s:1:"q";s:4:"ð—¿";s:1:"r";s:4:"ð˜€";s:1:"s";s:4:"ð˜";s:1:"t";s:4:"ð˜‚";s:1:"u";s:4:"ð˜ƒ";s:1:"v";s:4:"ð˜„";s:1:"w";s:4:"ð˜…";s:1:"x";s:4:"ð˜†";s:1:"y";s:4:"ð˜‡";s:1:"z";s:4:"ð˜ˆ";s:1:"A";s:4:"ð˜‰";s:1:"B";s:4:"ð˜Š";s:1:"C";s:4:"ð˜‹";s:1:"D";s:4:"ð˜Œ";s:1:"E";s:4:"ð˜";s:1:"F";s:4:"ð˜Ž";s:1:"G";s:4:"ð˜";s:1:"H";s:4:"ð˜";s:1:"I";s:4:"ð˜‘";s:1:"J";s:4:"ð˜’";s:1:"K";s:4:"ð˜“";s:1:"L";s:4:"ð˜”";s:1:"M";s:4:"ð˜•";s:1:"N";s:4:"ð˜–";s:1:"O";s:4:"ð˜—";s:1:"P";s:4:"ð˜˜";s:1:"Q";s:4:"ð˜™";s:1:"R";s:4:"ð˜š";s:1:"S";s:4:"ð˜›";s:1:"T";s:4:"ð˜œ";s:1:"U";s:4:"ð˜";s:1:"V";s:4:"ð˜ž";s:1:"W";s:4:"ð˜Ÿ";s:1:"X";s:4:"ð˜ ";s:1:"Y";s:4:"ð˜¡";s:1:"Z";s:4:"ð˜¢";s:1:"a";s:4:"ð˜£";s:1:"b";s:4:"ð˜¤";s:1:"c";s:4:"ð˜¥";s:1:"d";s:4:"ð˜¦";s:1:"e";s:4:"ð˜§";s:1:"f";s:4:"ð˜¨";s:1:"g";s:4:"ð˜©";s:1:"h";s:4:"ð˜ª";s:1:"i";s:4:"ð˜«";s:1:"j";s:4:"ð˜¬";s:1:"k";s:4:"ð˜­";s:1:"l";s:4:"ð˜®";s:1:"m";s:4:"ð˜¯";s:1:"n";s:4:"ð˜°";s:1:"o";s:4:"ð˜±";s:1:"p";s:4:"ð˜²";s:1:"q";s:4:"ð˜³";s:1:"r";s:4:"ð˜´";s:1:"s";s:4:"ð˜µ";s:1:"t";s:4:"ð˜¶";s:1:"u";s:4:"ð˜·";s:1:"v";s:4:"ð˜¸";s:1:"w";s:4:"ð˜¹";s:1:"x";s:4:"ð˜º";s:1:"y";s:4:"ð˜»";s:1:"z";s:4:"ð˜¼";s:1:"A";s:4:"ð˜½";s:1:"B";s:4:"ð˜¾";s:1:"C";s:4:"ð˜¿";s:1:"D";s:4:"ð™€";s:1:"E";s:4:"ð™";s:1:"F";s:4:"ð™‚";s:1:"G";s:4:"ð™ƒ";s:1:"H";s:4:"ð™„";s:1:"I";s:4:"ð™…";s:1:"J";s:4:"ð™†";s:1:"K";s:4:"ð™‡";s:1:"L";s:4:"ð™ˆ";s:1:"M";s:4:"ð™‰";s:1:"N";s:4:"ð™Š";s:1:"O";s:4:"ð™‹";s:1:"P";s:4:"ð™Œ";s:1:"Q";s:4:"ð™";s:1:"R";s:4:"ð™Ž";s:1:"S";s:4:"ð™";s:1:"T";s:4:"ð™";s:1:"U";s:4:"ð™‘";s:1:"V";s:4:"ð™’";s:1:"W";s:4:"ð™“";s:1:"X";s:4:"ð™”";s:1:"Y";s:4:"ð™•";s:1:"Z";s:4:"ð™–";s:1:"a";s:4:"ð™—";s:1:"b";s:4:"ð™˜";s:1:"c";s:4:"ð™™";s:1:"d";s:4:"ð™š";s:1:"e";s:4:"ð™›";s:1:"f";s:4:"ð™œ";s:1:"g";s:4:"ð™";s:1:"h";s:4:"ð™ž";s:1:"i";s:4:"ð™Ÿ";s:1:"j";s:4:"ð™ ";s:1:"k";s:4:"ð™¡";s:1:"l";s:4:"ð™¢";s:1:"m";s:4:"ð™£";s:1:"n";s:4:"ð™¤";s:1:"o";s:4:"ð™¥";s:1:"p";s:4:"ð™¦";s:1:"q";s:4:"ð™§";s:1:"r";s:4:"ð™¨";s:1:"s";s:4:"ð™©";s:1:"t";s:4:"ð™ª";s:1:"u";s:4:"ð™«";s:1:"v";s:4:"ð™¬";s:1:"w";s:4:"ð™­";s:1:"x";s:4:"ð™®";s:1:"y";s:4:"ð™¯";s:1:"z";s:4:"ð™°";s:1:"A";s:4:"ð™±";s:1:"B";s:4:"ð™²";s:1:"C";s:4:"ð™³";s:1:"D";s:4:"ð™´";s:1:"E";s:4:"ð™µ";s:1:"F";s:4:"ð™¶";s:1:"G";s:4:"ð™·";s:1:"H";s:4:"ð™¸";s:1:"I";s:4:"ð™¹";s:1:"J";s:4:"ð™º";s:1:"K";s:4:"ð™»";s:1:"L";s:4:"ð™¼";s:1:"M";s:4:"ð™½";s:1:"N";s:4:"ð™¾";s:1:"O";s:4:"ð™¿";s:1:"P";s:4:"ðš€";s:1:"Q";s:4:"ðš";s:1:"R";s:4:"ðš‚";s:1:"S";s:4:"ðšƒ";s:1:"T";s:4:"ðš„";s:1:"U";s:4:"ðš…";s:1:"V";s:4:"ðš†";s:1:"W";s:4:"ðš‡";s:1:"X";s:4:"ðšˆ";s:1:"Y";s:4:"ðš‰";s:1:"Z";s:4:"ðšŠ";s:1:"a";s:4:"ðš‹";s:1:"b";s:4:"ðšŒ";s:1:"c";s:4:"ðš";s:1:"d";s:4:"ðšŽ";s:1:"e";s:4:"ðš";s:1:"f";s:4:"ðš";s:1:"g";s:4:"ðš‘";s:1:"h";s:4:"ðš’";s:1:"i";s:4:"ðš“";s:1:"j";s:4:"ðš”";s:1:"k";s:4:"ðš•";s:1:"l";s:4:"ðš–";s:1:"m";s:4:"ðš—";s:1:"n";s:4:"ðš˜";s:1:"o";s:4:"ðš™";s:1:"p";s:4:"ðšš";s:1:"q";s:4:"ðš›";s:1:"r";s:4:"ðšœ";s:1:"s";s:4:"ðš";s:1:"t";s:4:"ðšž";s:1:"u";s:4:"ðšŸ";s:1:"v";s:4:"ðš ";s:1:"w";s:4:"ðš¡";s:1:"x";s:4:"ðš¢";s:1:"y";s:4:"ðš£";s:1:"z";s:4:"ðš¤";s:2:"ı";s:4:"ðš¥";s:2:"È·";s:4:"ðš¨";s:2:"Α";s:4:"ðš©";s:2:"Î’";s:4:"ðšª";s:2:"Γ";s:4:"ðš«";s:2:"Δ";s:4:"ðš¬";s:2:"Ε";s:4:"ðš­";s:2:"Ζ";s:4:"ðš®";s:2:"Η";s:4:"ðš¯";s:2:"Θ";s:4:"ðš°";s:2:"Ι";s:4:"ðš±";s:2:"Κ";s:4:"ðš²";s:2:"Λ";s:4:"ðš³";s:2:"Μ";s:4:"ðš´";s:2:"Î";s:4:"ðšµ";s:2:"Ξ";s:4:"ðš¶";s:2:"Ο";s:4:"ðš·";s:2:"Π";s:4:"ðš¸";s:2:"Ρ";s:4:"ðš¹";s:2:"Θ";s:4:"ðšº";s:2:"Σ";s:4:"ðš»";s:2:"Τ";s:4:"ðš¼";s:2:"Î¥";s:4:"ðš½";s:2:"Φ";s:4:"ðš¾";s:2:"Χ";s:4:"ðš¿";s:2:"Ψ";s:4:"ð›€";s:2:"Ω";s:4:"ð›";s:3:"∇";s:4:"ð›‚";s:2:"α";s:4:"ð›ƒ";s:2:"β";s:4:"ð›„";s:2:"γ";s:4:"ð›…";s:2:"δ";s:4:"ð›†";s:2:"ε";s:4:"ð›‡";s:2:"ζ";s:4:"ð›ˆ";s:2:"η";s:4:"ð›‰";s:2:"θ";s:4:"ð›Š";s:2:"ι";s:4:"ð›‹";s:2:"κ";s:4:"ð›Œ";s:2:"λ";s:4:"ð›";s:2:"μ";s:4:"ð›Ž";s:2:"ν";s:4:"ð›";s:2:"ξ";s:4:"ð›";s:2:"ο";s:4:"ð›‘";s:2:"Ï€";s:4:"ð›’";s:2:"Ï";s:4:"ð›“";s:2:"Ï‚";s:4:"ð›”";s:2:"σ";s:4:"ð›•";s:2:"Ï„";s:4:"ð›–";s:2:"Ï…";s:4:"ð›—";s:2:"φ";s:4:"ð›˜";s:2:"χ";s:4:"ð›™";s:2:"ψ";s:4:"ð›š";s:2:"ω";s:4:"ð››";s:3:"∂";s:4:"ð›œ";s:2:"ε";s:4:"ð›";s:2:"θ";s:4:"ð›ž";s:2:"κ";s:4:"ð›Ÿ";s:2:"φ";s:4:"ð› ";s:2:"Ï";s:4:"ð›¡";s:2:"Ï€";s:4:"ð›¢";s:2:"Α";s:4:"ð›£";s:2:"Î’";s:4:"ð›¤";s:2:"Γ";s:4:"ð›¥";s:2:"Δ";s:4:"ð›¦";s:2:"Ε";s:4:"ð›§";s:2:"Ζ";s:4:"ð›¨";s:2:"Η";s:4:"ð›©";s:2:"Θ";s:4:"ð›ª";s:2:"Ι";s:4:"ð›«";s:2:"Κ";s:4:"ð›¬";s:2:"Λ";s:4:"ð›­";s:2:"Μ";s:4:"ð›®";s:2:"Î";s:4:"ð›¯";s:2:"Ξ";s:4:"ð›°";s:2:"Ο";s:4:"ð›±";s:2:"Π";s:4:"ð›²";s:2:"Ρ";s:4:"ð›³";s:2:"Θ";s:4:"ð›´";s:2:"Σ";s:4:"ð›µ";s:2:"Τ";s:4:"ð›¶";s:2:"Î¥";s:4:"ð›·";s:2:"Φ";s:4:"ð›¸";s:2:"Χ";s:4:"ð›¹";s:2:"Ψ";s:4:"ð›º";s:2:"Ω";s:4:"ð›»";s:3:"∇";s:4:"ð›¼";s:2:"α";s:4:"ð›½";s:2:"β";s:4:"ð›¾";s:2:"γ";s:4:"ð›¿";s:2:"δ";s:4:"ðœ€";s:2:"ε";s:4:"ðœ";s:2:"ζ";s:4:"ðœ‚";s:2:"η";s:4:"ðœƒ";s:2:"θ";s:4:"ðœ„";s:2:"ι";s:4:"ðœ…";s:2:"κ";s:4:"ðœ†";s:2:"λ";s:4:"ðœ‡";s:2:"μ";s:4:"ðœˆ";s:2:"ν";s:4:"ðœ‰";s:2:"ξ";s:4:"ðœŠ";s:2:"ο";s:4:"ðœ‹";s:2:"Ï€";s:4:"ðœŒ";s:2:"Ï";s:4:"ðœ";s:2:"Ï‚";s:4:"ðœŽ";s:2:"σ";s:4:"ðœ";s:2:"Ï„";s:4:"ðœ";s:2:"Ï…";s:4:"ðœ‘";s:2:"φ";s:4:"ðœ’";s:2:"χ";s:4:"ðœ“";s:2:"ψ";s:4:"ðœ”";s:2:"ω";s:4:"ðœ•";s:3:"∂";s:4:"ðœ–";s:2:"ε";s:4:"ðœ—";s:2:"θ";s:4:"ðœ˜";s:2:"κ";s:4:"ðœ™";s:2:"φ";s:4:"ðœš";s:2:"Ï";s:4:"ðœ›";s:2:"Ï€";s:4:"ðœœ";s:2:"Α";s:4:"ðœ";s:2:"Î’";s:4:"ðœž";s:2:"Γ";s:4:"ðœŸ";s:2:"Δ";s:4:"ðœ ";s:2:"Ε";s:4:"ðœ¡";s:2:"Ζ";s:4:"ðœ¢";s:2:"Η";s:4:"ðœ£";s:2:"Θ";s:4:"ðœ¤";s:2:"Ι";s:4:"ðœ¥";s:2:"Κ";s:4:"ðœ¦";s:2:"Λ";s:4:"ðœ§";s:2:"Μ";s:4:"ðœ¨";s:2:"Î";s:4:"ðœ©";s:2:"Ξ";s:4:"ðœª";s:2:"Ο";s:4:"ðœ«";s:2:"Π";s:4:"ðœ¬";s:2:"Ρ";s:4:"ðœ­";s:2:"Θ";s:4:"ðœ®";s:2:"Σ";s:4:"ðœ¯";s:2:"Τ";s:4:"ðœ°";s:2:"Î¥";s:4:"ðœ±";s:2:"Φ";s:4:"ðœ²";s:2:"Χ";s:4:"ðœ³";s:2:"Ψ";s:4:"ðœ´";s:2:"Ω";s:4:"ðœµ";s:3:"∇";s:4:"ðœ¶";s:2:"α";s:4:"ðœ·";s:2:"β";s:4:"ðœ¸";s:2:"γ";s:4:"ðœ¹";s:2:"δ";s:4:"ðœº";s:2:"ε";s:4:"ðœ»";s:2:"ζ";s:4:"ðœ¼";s:2:"η";s:4:"ðœ½";s:2:"θ";s:4:"ðœ¾";s:2:"ι";s:4:"ðœ¿";s:2:"κ";s:4:"ð€";s:2:"λ";s:4:"ð";s:2:"μ";s:4:"ð‚";s:2:"ν";s:4:"ðƒ";s:2:"ξ";s:4:"ð„";s:2:"ο";s:4:"ð…";s:2:"Ï€";s:4:"ð†";s:2:"Ï";s:4:"ð‡";s:2:"Ï‚";s:4:"ðˆ";s:2:"σ";s:4:"ð‰";s:2:"Ï„";s:4:"ðŠ";s:2:"Ï…";s:4:"ð‹";s:2:"φ";s:4:"ðŒ";s:2:"χ";s:4:"ð";s:2:"ψ";s:4:"ðŽ";s:2:"ω";s:4:"ð";s:3:"∂";s:4:"ð";s:2:"ε";s:4:"ð‘";s:2:"θ";s:4:"ð’";s:2:"κ";s:4:"ð“";s:2:"φ";s:4:"ð”";s:2:"Ï";s:4:"ð•";s:2:"Ï€";s:4:"ð–";s:2:"Α";s:4:"ð—";s:2:"Î’";s:4:"ð˜";s:2:"Γ";s:4:"ð™";s:2:"Δ";s:4:"ðš";s:2:"Ε";s:4:"ð›";s:2:"Ζ";s:4:"ðœ";s:2:"Η";s:4:"ð";s:2:"Θ";s:4:"ðž";s:2:"Ι";s:4:"ðŸ";s:2:"Κ";s:4:"ð ";s:2:"Λ";s:4:"ð¡";s:2:"Μ";s:4:"ð¢";s:2:"Î";s:4:"ð£";s:2:"Ξ";s:4:"ð¤";s:2:"Ο";s:4:"ð¥";s:2:"Π";s:4:"ð¦";s:2:"Ρ";s:4:"ð§";s:2:"Θ";s:4:"ð¨";s:2:"Σ";s:4:"ð©";s:2:"Τ";s:4:"ðª";s:2:"Î¥";s:4:"ð«";s:2:"Φ";s:4:"ð¬";s:2:"Χ";s:4:"ð­";s:2:"Ψ";s:4:"ð®";s:2:"Ω";s:4:"ð¯";s:3:"∇";s:4:"ð°";s:2:"α";s:4:"ð±";s:2:"β";s:4:"ð²";s:2:"γ";s:4:"ð³";s:2:"δ";s:4:"ð´";s:2:"ε";s:4:"ðµ";s:2:"ζ";s:4:"ð¶";s:2:"η";s:4:"ð·";s:2:"θ";s:4:"ð¸";s:2:"ι";s:4:"ð¹";s:2:"κ";s:4:"ðº";s:2:"λ";s:4:"ð»";s:2:"μ";s:4:"ð¼";s:2:"ν";s:4:"ð½";s:2:"ξ";s:4:"ð¾";s:2:"ο";s:4:"ð¿";s:2:"Ï€";s:4:"ðž€";s:2:"Ï";s:4:"ðž";s:2:"Ï‚";s:4:"ðž‚";s:2:"σ";s:4:"ðžƒ";s:2:"Ï„";s:4:"ðž„";s:2:"Ï…";s:4:"ðž…";s:2:"φ";s:4:"ðž†";s:2:"χ";s:4:"ðž‡";s:2:"ψ";s:4:"ðžˆ";s:2:"ω";s:4:"ðž‰";s:3:"∂";s:4:"ðžŠ";s:2:"ε";s:4:"ðž‹";s:2:"θ";s:4:"ðžŒ";s:2:"κ";s:4:"ðž";s:2:"φ";s:4:"ðžŽ";s:2:"Ï";s:4:"ðž";s:2:"Ï€";s:4:"ðž";s:2:"Α";s:4:"ðž‘";s:2:"Î’";s:4:"ðž’";s:2:"Γ";s:4:"ðž“";s:2:"Δ";s:4:"ðž”";s:2:"Ε";s:4:"ðž•";s:2:"Ζ";s:4:"ðž–";s:2:"Η";s:4:"ðž—";s:2:"Θ";s:4:"ðž˜";s:2:"Ι";s:4:"ðž™";s:2:"Κ";s:4:"ðžš";s:2:"Λ";s:4:"ðž›";s:2:"Μ";s:4:"ðžœ";s:2:"Î";s:4:"ðž";s:2:"Ξ";s:4:"ðžž";s:2:"Ο";s:4:"ðžŸ";s:2:"Π";s:4:"ðž ";s:2:"Ρ";s:4:"ðž¡";s:2:"Θ";s:4:"ðž¢";s:2:"Σ";s:4:"ðž£";s:2:"Τ";s:4:"ðž¤";s:2:"Î¥";s:4:"ðž¥";s:2:"Φ";s:4:"ðž¦";s:2:"Χ";s:4:"ðž§";s:2:"Ψ";s:4:"ðž¨";s:2:"Ω";s:4:"ðž©";s:3:"∇";s:4:"ðžª";s:2:"α";s:4:"ðž«";s:2:"β";s:4:"ðž¬";s:2:"γ";s:4:"ðž­";s:2:"δ";s:4:"ðž®";s:2:"ε";s:4:"ðž¯";s:2:"ζ";s:4:"ðž°";s:2:"η";s:4:"ðž±";s:2:"θ";s:4:"ðž²";s:2:"ι";s:4:"ðž³";s:2:"κ";s:4:"ðž´";s:2:"λ";s:4:"ðžµ";s:2:"μ";s:4:"ðž¶";s:2:"ν";s:4:"ðž·";s:2:"ξ";s:4:"ðž¸";s:2:"ο";s:4:"ðž¹";s:2:"Ï€";s:4:"ðžº";s:2:"Ï";s:4:"ðž»";s:2:"Ï‚";s:4:"ðž¼";s:2:"σ";s:4:"ðž½";s:2:"Ï„";s:4:"ðž¾";s:2:"Ï…";s:4:"ðž¿";s:2:"φ";s:4:"ðŸ€";s:2:"χ";s:4:"ðŸ";s:2:"ψ";s:4:"ðŸ‚";s:2:"ω";s:4:"ðŸƒ";s:3:"∂";s:4:"ðŸ„";s:2:"ε";s:4:"ðŸ…";s:2:"θ";s:4:"ðŸ†";s:2:"κ";s:4:"ðŸ‡";s:2:"φ";s:4:"ðŸˆ";s:2:"Ï";s:4:"ðŸ‰";s:2:"Ï€";s:4:"ðŸŠ";s:2:"Ïœ";s:4:"ðŸ‹";s:2:"Ï";s:4:"ðŸŽ";s:1:"0";s:4:"ðŸ";s:1:"1";s:4:"ðŸ";s:1:"2";s:4:"ðŸ‘";s:1:"3";s:4:"ðŸ’";s:1:"4";s:4:"ðŸ“";s:1:"5";s:4:"ðŸ”";s:1:"6";s:4:"ðŸ•";s:1:"7";s:4:"ðŸ–";s:1:"8";s:4:"ðŸ—";s:1:"9";s:4:"ðŸ˜";s:1:"0";s:4:"ðŸ™";s:1:"1";s:4:"ðŸš";s:1:"2";s:4:"ðŸ›";s:1:"3";s:4:"ðŸœ";s:1:"4";s:4:"ðŸ";s:1:"5";s:4:"ðŸž";s:1:"6";s:4:"ðŸŸ";s:1:"7";s:4:"ðŸ ";s:1:"8";s:4:"ðŸ¡";s:1:"9";s:4:"ðŸ¢";s:1:"0";s:4:"ðŸ£";s:1:"1";s:4:"ðŸ¤";s:1:"2";s:4:"ðŸ¥";s:1:"3";s:4:"ðŸ¦";s:1:"4";s:4:"ðŸ§";s:1:"5";s:4:"ðŸ¨";s:1:"6";s:4:"ðŸ©";s:1:"7";s:4:"ðŸª";s:1:"8";s:4:"ðŸ«";s:1:"9";s:4:"ðŸ¬";s:1:"0";s:4:"ðŸ­";s:1:"1";s:4:"ðŸ®";s:1:"2";s:4:"ðŸ¯";s:1:"3";s:4:"ðŸ°";s:1:"4";s:4:"ðŸ±";s:1:"5";s:4:"ðŸ²";s:1:"6";s:4:"ðŸ³";s:1:"7";s:4:"ðŸ´";s:1:"8";s:4:"ðŸµ";s:1:"9";s:4:"ðŸ¶";s:1:"0";s:4:"ðŸ·";s:1:"1";s:4:"ðŸ¸";s:1:"2";s:4:"ðŸ¹";s:1:"3";s:4:"ðŸº";s:1:"4";s:4:"ðŸ»";s:1:"5";s:4:"ðŸ¼";s:1:"6";s:4:"ðŸ½";s:1:"7";s:4:"ðŸ¾";s:1:"8";s:4:"ðŸ¿";s:1:"9";s:4:"𞸀";s:2:"ا";s:4:"ðž¸";s:2:"ب";s:4:"𞸂";s:2:"ج";s:4:"𞸃";s:2:"د";s:4:"𞸅";s:2:"Ùˆ";s:4:"𞸆";s:2:"ز";s:4:"𞸇";s:2:"Ø­";s:4:"𞸈";s:2:"Ø·";s:4:"𞸉";s:2:"ÙŠ";s:4:"𞸊";s:2:"Ùƒ";s:4:"𞸋";s:2:"Ù„";s:4:"𞸌";s:2:"Ù…";s:4:"ðž¸";s:2:"Ù†";s:4:"𞸎";s:2:"س";s:4:"ðž¸";s:2:"ع";s:4:"ðž¸";s:2:"Ù";s:4:"𞸑";s:2:"ص";s:4:"𞸒";s:2:"Ù‚";s:4:"𞸓";s:2:"ر";s:4:"𞸔";s:2:"Ø´";s:4:"𞸕";s:2:"ت";s:4:"𞸖";s:2:"Ø«";s:4:"𞸗";s:2:"Ø®";s:4:"𞸘";s:2:"ذ";s:4:"𞸙";s:2:"ض";s:4:"𞸚";s:2:"ظ";s:4:"𞸛";s:2:"غ";s:4:"𞸜";s:2:"Ù®";s:4:"ðž¸";s:2:"Úº";s:4:"𞸞";s:2:"Ú¡";s:4:"𞸟";s:2:"Ù¯";s:4:"𞸡";s:2:"ب";s:4:"𞸢";s:2:"ج";s:4:"𞸤";s:2:"Ù‡";s:4:"𞸧";s:2:"Ø­";s:4:"𞸩";s:2:"ÙŠ";s:4:"𞸪";s:2:"Ùƒ";s:4:"𞸫";s:2:"Ù„";s:4:"𞸬";s:2:"Ù…";s:4:"𞸭";s:2:"Ù†";s:4:"𞸮";s:2:"س";s:4:"𞸯";s:2:"ع";s:4:"𞸰";s:2:"Ù";s:4:"𞸱";s:2:"ص";s:4:"𞸲";s:2:"Ù‚";s:4:"𞸴";s:2:"Ø´";s:4:"𞸵";s:2:"ت";s:4:"𞸶";s:2:"Ø«";s:4:"𞸷";s:2:"Ø®";s:4:"𞸹";s:2:"ض";s:4:"𞸻";s:2:"غ";s:4:"𞹂";s:2:"ج";s:4:"𞹇";s:2:"Ø­";s:4:"𞹉";s:2:"ÙŠ";s:4:"𞹋";s:2:"Ù„";s:4:"ðž¹";s:2:"Ù†";s:4:"𞹎";s:2:"س";s:4:"ðž¹";s:2:"ع";s:4:"𞹑";s:2:"ص";s:4:"ðž¹’";s:2:"Ù‚";s:4:"ðž¹”";s:2:"Ø´";s:4:"ðž¹—";s:2:"Ø®";s:4:"ðž¹™";s:2:"ض";s:4:"ðž¹›";s:2:"غ";s:4:"ðž¹";s:2:"Úº";s:4:"𞹟";s:2:"Ù¯";s:4:"𞹡";s:2:"ب";s:4:"ðž¹¢";s:2:"ج";s:4:"𞹤";s:2:"Ù‡";s:4:"ðž¹§";s:2:"Ø­";s:4:"𞹨";s:2:"Ø·";s:4:"𞹩";s:2:"ÙŠ";s:4:"𞹪";s:2:"Ùƒ";s:4:"𞹬";s:2:"Ù…";s:4:"ðž¹­";s:2:"Ù†";s:4:"ðž¹®";s:2:"س";s:4:"𞹯";s:2:"ع";s:4:"ðž¹°";s:2:"Ù";s:4:"ðž¹±";s:2:"ص";s:4:"ðž¹²";s:2:"Ù‚";s:4:"ðž¹´";s:2:"Ø´";s:4:"ðž¹µ";s:2:"ت";s:4:"ðž¹¶";s:2:"Ø«";s:4:"ðž¹·";s:2:"Ø®";s:4:"ðž¹¹";s:2:"ض";s:4:"𞹺";s:2:"ظ";s:4:"ðž¹»";s:2:"غ";s:4:"ðž¹¼";s:2:"Ù®";s:4:"ðž¹¾";s:2:"Ú¡";s:4:"𞺀";s:2:"ا";s:4:"ðžº";s:2:"ب";s:4:"𞺂";s:2:"ج";s:4:"𞺃";s:2:"د";s:4:"𞺄";s:2:"Ù‡";s:4:"𞺅";s:2:"Ùˆ";s:4:"𞺆";s:2:"ز";s:4:"𞺇";s:2:"Ø­";s:4:"𞺈";s:2:"Ø·";s:4:"𞺉";s:2:"ÙŠ";s:4:"𞺋";s:2:"Ù„";s:4:"𞺌";s:2:"Ù…";s:4:"ðžº";s:2:"Ù†";s:4:"𞺎";s:2:"س";s:4:"ðžº";s:2:"ع";s:4:"ðžº";s:2:"Ù";s:4:"𞺑";s:2:"ص";s:4:"𞺒";s:2:"Ù‚";s:4:"𞺓";s:2:"ر";s:4:"𞺔";s:2:"Ø´";s:4:"𞺕";s:2:"ت";s:4:"𞺖";s:2:"Ø«";s:4:"𞺗";s:2:"Ø®";s:4:"𞺘";s:2:"ذ";s:4:"𞺙";s:2:"ض";s:4:"𞺚";s:2:"ظ";s:4:"𞺛";s:2:"غ";s:4:"𞺡";s:2:"ب";s:4:"𞺢";s:2:"ج";s:4:"𞺣";s:2:"د";s:4:"𞺥";s:2:"Ùˆ";s:4:"𞺦";s:2:"ز";s:4:"𞺧";s:2:"Ø­";s:4:"𞺨";s:2:"Ø·";s:4:"𞺩";s:2:"ÙŠ";s:4:"𞺫";s:2:"Ù„";s:4:"𞺬";s:2:"Ù…";s:4:"𞺭";s:2:"Ù†";s:4:"𞺮";s:2:"س";s:4:"𞺯";s:2:"ع";s:4:"𞺰";s:2:"Ù";s:4:"𞺱";s:2:"ص";s:4:"𞺲";s:2:"Ù‚";s:4:"𞺳";s:2:"ر";s:4:"𞺴";s:2:"Ø´";s:4:"𞺵";s:2:"ت";s:4:"𞺶";s:2:"Ø«";s:4:"𞺷";s:2:"Ø®";s:4:"𞺸";s:2:"ذ";s:4:"𞺹";s:2:"ض";s:4:"𞺺";s:2:"ظ";s:4:"𞺻";s:2:"غ";s:4:"🄀";s:2:"0.";s:4:"ðŸ„";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"ðŸ„";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"ðŸ„";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"ðŸ…";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"ðŸ…";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"ðŸ…";s:2:"WC";s:4:"🅪";s:2:"MC";s:4:"🅫";s:2:"MD";s:4:"ðŸ†";s:2:"DJ";s:4:"🈀";s:6:"ã»ã‹";s:4:"ðŸˆ";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"ðŸˆ";s:3:"手";s:4:"🈑";s:3:"å­—";s:4:"🈒";s:3:"åŒ";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"è§£";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"ç„¡";s:4:"🈛";s:3:"æ–™";s:4:"🈜";s:3:"å‰";s:4:"ðŸˆ";s:3:"後";s:4:"🈞";s:3:"å†";s:4:"🈟";s:3:"æ–°";s:4:"🈠";s:3:"åˆ";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"å¹";s:4:"🈦";s:3:"æ¼”";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"æ•";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"éŠ";s:4:"🈬";s:3:"å·¦";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"å³";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"èµ°";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"ç¦";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"åˆ";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"å–¶";s:4:"🉀";s:9:"〔本〕";s:4:"ðŸ‰";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔å‹ã€•";s:4:"🉈";s:9:"〔敗〕";s:4:"ðŸ‰";s:3:"å¾—";s:4:"🉑";s:3:"å¯";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/lowerCase.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/lowerCase.ser new file mode 100644 index 0000000000..bfe7c4a7e2 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/lowerCase.ser @@ -0,0 +1 @@ +a:1043:{s:1:"A";s:1:"a";s:1:"B";s:1:"b";s:1:"C";s:1:"c";s:1:"D";s:1:"d";s:1:"E";s:1:"e";s:1:"F";s:1:"f";s:1:"G";s:1:"g";s:1:"H";s:1:"h";s:1:"I";s:1:"i";s:1:"J";s:1:"j";s:1:"K";s:1:"k";s:1:"L";s:1:"l";s:1:"M";s:1:"m";s:1:"N";s:1:"n";s:1:"O";s:1:"o";s:1:"P";s:1:"p";s:1:"Q";s:1:"q";s:1:"R";s:1:"r";s:1:"S";s:1:"s";s:1:"T";s:1:"t";s:1:"U";s:1:"u";s:1:"V";s:1:"v";s:1:"W";s:1:"w";s:1:"X";s:1:"x";s:1:"Y";s:1:"y";s:1:"Z";s:1:"z";s:2:"À";s:2:"à";s:2:"Ã";s:2:"á";s:2:"Â";s:2:"â";s:2:"Ã";s:2:"ã";s:2:"Ä";s:2:"ä";s:2:"Ã…";s:2:"Ã¥";s:2:"Æ";s:2:"æ";s:2:"Ç";s:2:"ç";s:2:"È";s:2:"è";s:2:"É";s:2:"é";s:2:"Ê";s:2:"ê";s:2:"Ë";s:2:"ë";s:2:"ÃŒ";s:2:"ì";s:2:"Ã";s:2:"í";s:2:"ÃŽ";s:2:"î";s:2:"Ã";s:2:"ï";s:2:"Ã";s:2:"ð";s:2:"Ñ";s:2:"ñ";s:2:"Ã’";s:2:"ò";s:2:"Ó";s:2:"ó";s:2:"Ô";s:2:"ô";s:2:"Õ";s:2:"õ";s:2:"Ö";s:2:"ö";s:2:"Ø";s:2:"ø";s:2:"Ù";s:2:"ù";s:2:"Ú";s:2:"ú";s:2:"Û";s:2:"û";s:2:"Ü";s:2:"ü";s:2:"Ã";s:2:"ý";s:2:"Þ";s:2:"þ";s:2:"Ä€";s:2:"Ä";s:2:"Ä‚";s:2:"ă";s:2:"Ä„";s:2:"Ä…";s:2:"Ć";s:2:"ć";s:2:"Ĉ";s:2:"ĉ";s:2:"ÄŠ";s:2:"Ä‹";s:2:"ÄŒ";s:2:"Ä";s:2:"ÄŽ";s:2:"Ä";s:2:"Ä";s:2:"Ä‘";s:2:"Ä’";s:2:"Ä“";s:2:"Ä”";s:2:"Ä•";s:2:"Ä–";s:2:"Ä—";s:2:"Ę";s:2:"Ä™";s:2:"Äš";s:2:"Ä›";s:2:"Äœ";s:2:"Ä";s:2:"Äž";s:2:"ÄŸ";s:2:"Ä ";s:2:"Ä¡";s:2:"Ä¢";s:2:"Ä£";s:2:"Ĥ";s:2:"Ä¥";s:2:"Ħ";s:2:"ħ";s:2:"Ĩ";s:2:"Ä©";s:2:"Ī";s:2:"Ä«";s:2:"Ĭ";s:2:"Ä­";s:2:"Ä®";s:2:"į";s:2:"İ";s:1:"i";s:2:"IJ";s:2:"ij";s:2:"Ä´";s:2:"ĵ";s:2:"Ķ";s:2:"Ä·";s:2:"Ĺ";s:2:"ĺ";s:2:"Ä»";s:2:"ļ";s:2:"Ľ";s:2:"ľ";s:2:"Ä¿";s:2:"Å€";s:2:"Å";s:2:"Å‚";s:2:"Ń";s:2:"Å„";s:2:"Å…";s:2:"ņ";s:2:"Ň";s:2:"ň";s:2:"ÅŠ";s:2:"Å‹";s:2:"ÅŒ";s:2:"Å";s:2:"ÅŽ";s:2:"Å";s:2:"Å";s:2:"Å‘";s:2:"Å’";s:2:"Å“";s:2:"Å”";s:2:"Å•";s:2:"Å–";s:2:"Å—";s:2:"Ř";s:2:"Å™";s:2:"Åš";s:2:"Å›";s:2:"Åœ";s:2:"Å";s:2:"Åž";s:2:"ÅŸ";s:2:"Å ";s:2:"Å¡";s:2:"Å¢";s:2:"Å£";s:2:"Ť";s:2:"Å¥";s:2:"Ŧ";s:2:"ŧ";s:2:"Ũ";s:2:"Å©";s:2:"Ū";s:2:"Å«";s:2:"Ŭ";s:2:"Å­";s:2:"Å®";s:2:"ů";s:2:"Ű";s:2:"ű";s:2:"Ų";s:2:"ų";s:2:"Å´";s:2:"ŵ";s:2:"Ŷ";s:2:"Å·";s:2:"Ÿ";s:2:"ÿ";s:2:"Ź";s:2:"ź";s:2:"Å»";s:2:"ż";s:2:"Ž";s:2:"ž";s:2:"Æ";s:2:"É“";s:2:"Æ‚";s:2:"ƃ";s:2:"Æ„";s:2:"Æ…";s:2:"Ɔ";s:2:"É”";s:2:"Ƈ";s:2:"ƈ";s:2:"Ɖ";s:2:"É–";s:2:"ÆŠ";s:2:"É—";s:2:"Æ‹";s:2:"ÆŒ";s:2:"ÆŽ";s:2:"Ç";s:2:"Æ";s:2:"É™";s:2:"Æ";s:2:"É›";s:2:"Æ‘";s:2:"Æ’";s:2:"Æ“";s:2:"É ";s:2:"Æ”";s:2:"É£";s:2:"Æ–";s:2:"É©";s:2:"Æ—";s:2:"ɨ";s:2:"Ƙ";s:2:"Æ™";s:2:"Æœ";s:2:"ɯ";s:2:"Æ";s:2:"ɲ";s:2:"ÆŸ";s:2:"ɵ";s:2:"Æ ";s:2:"Æ¡";s:2:"Æ¢";s:2:"Æ£";s:2:"Ƥ";s:2:"Æ¥";s:2:"Ʀ";s:2:"Ê€";s:2:"Ƨ";s:2:"ƨ";s:2:"Æ©";s:2:"ʃ";s:2:"Ƭ";s:2:"Æ­";s:2:"Æ®";s:2:"ʈ";s:2:"Ư";s:2:"ư";s:2:"Ʊ";s:2:"ÊŠ";s:2:"Ʋ";s:2:"Ê‹";s:2:"Ƴ";s:2:"Æ´";s:2:"Ƶ";s:2:"ƶ";s:2:"Æ·";s:2:"Ê’";s:2:"Ƹ";s:2:"ƹ";s:2:"Ƽ";s:2:"ƽ";s:2:"Ç„";s:2:"dž";s:2:"Ç…";s:2:"dž";s:2:"LJ";s:2:"lj";s:2:"Lj";s:2:"lj";s:2:"ÇŠ";s:2:"ÇŒ";s:2:"Ç‹";s:2:"ÇŒ";s:2:"Ç";s:2:"ÇŽ";s:2:"Ç";s:2:"Ç";s:2:"Ç‘";s:2:"Ç’";s:2:"Ç“";s:2:"Ç”";s:2:"Ç•";s:2:"Ç–";s:2:"Ç—";s:2:"ǘ";s:2:"Ç™";s:2:"Çš";s:2:"Ç›";s:2:"Çœ";s:2:"Çž";s:2:"ÇŸ";s:2:"Ç ";s:2:"Ç¡";s:2:"Ç¢";s:2:"Ç£";s:2:"Ǥ";s:2:"Ç¥";s:2:"Ǧ";s:2:"ǧ";s:2:"Ǩ";s:2:"Ç©";s:2:"Ǫ";s:2:"Ç«";s:2:"Ǭ";s:2:"Ç­";s:2:"Ç®";s:2:"ǯ";s:2:"DZ";s:2:"dz";s:2:"Dz";s:2:"dz";s:2:"Ç´";s:2:"ǵ";s:2:"Ƕ";s:2:"Æ•";s:2:"Ç·";s:2:"Æ¿";s:2:"Ǹ";s:2:"ǹ";s:2:"Ǻ";s:2:"Ç»";s:2:"Ǽ";s:2:"ǽ";s:2:"Ǿ";s:2:"Ç¿";s:2:"È€";s:2:"È";s:2:"È‚";s:2:"ȃ";s:2:"È„";s:2:"È…";s:2:"Ȇ";s:2:"ȇ";s:2:"Ȉ";s:2:"ȉ";s:2:"ÈŠ";s:2:"È‹";s:2:"ÈŒ";s:2:"È";s:2:"ÈŽ";s:2:"È";s:2:"È";s:2:"È‘";s:2:"È’";s:2:"È“";s:2:"È”";s:2:"È•";s:2:"È–";s:2:"È—";s:2:"Ș";s:2:"È™";s:2:"Èš";s:2:"È›";s:2:"Èœ";s:2:"È";s:2:"Èž";s:2:"ÈŸ";s:2:"È ";s:2:"Æž";s:2:"È¢";s:2:"È£";s:2:"Ȥ";s:2:"È¥";s:2:"Ȧ";s:2:"ȧ";s:2:"Ȩ";s:2:"È©";s:2:"Ȫ";s:2:"È«";s:2:"Ȭ";s:2:"È­";s:2:"È®";s:2:"ȯ";s:2:"Ȱ";s:2:"ȱ";s:2:"Ȳ";s:2:"ȳ";s:2:"Ⱥ";s:3:"â±¥";s:2:"È»";s:2:"ȼ";s:2:"Ƚ";s:2:"Æš";s:2:"Ⱦ";s:3:"ⱦ";s:2:"É";s:2:"É‚";s:2:"Ƀ";s:2:"Æ€";s:2:"É„";s:2:"ʉ";s:2:"É…";s:2:"ÊŒ";s:2:"Ɇ";s:2:"ɇ";s:2:"Ɉ";s:2:"ɉ";s:2:"ÉŠ";s:2:"É‹";s:2:"ÉŒ";s:2:"É";s:2:"ÉŽ";s:2:"É";s:2:"Ͱ";s:2:"ͱ";s:2:"Ͳ";s:2:"ͳ";s:2:"Ͷ";s:2:"Í·";s:2:"Ά";s:2:"ά";s:2:"Έ";s:2:"έ";s:2:"Ή";s:2:"ή";s:2:"Ί";s:2:"ί";s:2:"ÎŒ";s:2:"ÏŒ";s:2:"ÎŽ";s:2:"Ï";s:2:"Î";s:2:"ÏŽ";s:2:"Α";s:2:"α";s:2:"Î’";s:2:"β";s:2:"Γ";s:2:"γ";s:2:"Δ";s:2:"δ";s:2:"Ε";s:2:"ε";s:2:"Ζ";s:2:"ζ";s:2:"Η";s:2:"η";s:2:"Θ";s:2:"θ";s:2:"Ι";s:2:"ι";s:2:"Κ";s:2:"κ";s:2:"Λ";s:2:"λ";s:2:"Μ";s:2:"μ";s:2:"Î";s:2:"ν";s:2:"Ξ";s:2:"ξ";s:2:"Ο";s:2:"ο";s:2:"Π";s:2:"Ï€";s:2:"Ρ";s:2:"Ï";s:2:"Σ";s:2:"σ";s:2:"Τ";s:2:"Ï„";s:2:"Î¥";s:2:"Ï…";s:2:"Φ";s:2:"φ";s:2:"Χ";s:2:"χ";s:2:"Ψ";s:2:"ψ";s:2:"Ω";s:2:"ω";s:2:"Ϊ";s:2:"ÏŠ";s:2:"Ϋ";s:2:"Ï‹";s:2:"Ï";s:2:"Ï—";s:2:"Ϙ";s:2:"Ï™";s:2:"Ïš";s:2:"Ï›";s:2:"Ïœ";s:2:"Ï";s:2:"Ïž";s:2:"ÏŸ";s:2:"Ï ";s:2:"Ï¡";s:2:"Ï¢";s:2:"Ï£";s:2:"Ϥ";s:2:"Ï¥";s:2:"Ϧ";s:2:"ϧ";s:2:"Ϩ";s:2:"Ï©";s:2:"Ϫ";s:2:"Ï«";s:2:"Ϭ";s:2:"Ï­";s:2:"Ï®";s:2:"ϯ";s:2:"Ï´";s:2:"θ";s:2:"Ï·";s:2:"ϸ";s:2:"Ϲ";s:2:"ϲ";s:2:"Ϻ";s:2:"Ï»";s:2:"Ͻ";s:2:"Í»";s:2:"Ͼ";s:2:"ͼ";s:2:"Ï¿";s:2:"ͽ";s:2:"Ѐ";s:2:"Ñ";s:2:"Ð";s:2:"Ñ‘";s:2:"Ђ";s:2:"Ñ’";s:2:"Ѓ";s:2:"Ñ“";s:2:"Є";s:2:"Ñ”";s:2:"Ð…";s:2:"Ñ•";s:2:"І";s:2:"Ñ–";s:2:"Ї";s:2:"Ñ—";s:2:"Ј";s:2:"ј";s:2:"Љ";s:2:"Ñ™";s:2:"Њ";s:2:"Ñš";s:2:"Ћ";s:2:"Ñ›";s:2:"ÐŒ";s:2:"Ñœ";s:2:"Ð";s:2:"Ñ";s:2:"ÐŽ";s:2:"Ñž";s:2:"Ð";s:2:"ÑŸ";s:2:"Ð";s:2:"а";s:2:"Б";s:2:"б";s:2:"Ð’";s:2:"в";s:2:"Г";s:2:"г";s:2:"Д";s:2:"д";s:2:"Е";s:2:"е";s:2:"Ж";s:2:"ж";s:2:"З";s:2:"з";s:2:"И";s:2:"и";s:2:"Й";s:2:"й";s:2:"К";s:2:"к";s:2:"Л";s:2:"л";s:2:"М";s:2:"м";s:2:"Ð";s:2:"н";s:2:"О";s:2:"о";s:2:"П";s:2:"п";s:2:"Р";s:2:"Ñ€";s:2:"С";s:2:"Ñ";s:2:"Т";s:2:"Ñ‚";s:2:"У";s:2:"у";s:2:"Ф";s:2:"Ñ„";s:2:"Ð¥";s:2:"Ñ…";s:2:"Ц";s:2:"ц";s:2:"Ч";s:2:"ч";s:2:"Ш";s:2:"ш";s:2:"Щ";s:2:"щ";s:2:"Ъ";s:2:"ÑŠ";s:2:"Ы";s:2:"Ñ‹";s:2:"Ь";s:2:"ÑŒ";s:2:"Э";s:2:"Ñ";s:2:"Ю";s:2:"ÑŽ";s:2:"Я";s:2:"Ñ";s:2:"Ñ ";s:2:"Ñ¡";s:2:"Ñ¢";s:2:"Ñ£";s:2:"Ѥ";s:2:"Ñ¥";s:2:"Ѧ";s:2:"ѧ";s:2:"Ѩ";s:2:"Ñ©";s:2:"Ѫ";s:2:"Ñ«";s:2:"Ѭ";s:2:"Ñ­";s:2:"Ñ®";s:2:"ѯ";s:2:"Ѱ";s:2:"ѱ";s:2:"Ѳ";s:2:"ѳ";s:2:"Ñ´";s:2:"ѵ";s:2:"Ѷ";s:2:"Ñ·";s:2:"Ѹ";s:2:"ѹ";s:2:"Ѻ";s:2:"Ñ»";s:2:"Ѽ";s:2:"ѽ";s:2:"Ѿ";s:2:"Ñ¿";s:2:"Ò€";s:2:"Ò";s:2:"ÒŠ";s:2:"Ò‹";s:2:"ÒŒ";s:2:"Ò";s:2:"ÒŽ";s:2:"Ò";s:2:"Ò";s:2:"Ò‘";s:2:"Ò’";s:2:"Ò“";s:2:"Ò”";s:2:"Ò•";s:2:"Ò–";s:2:"Ò—";s:2:"Ò˜";s:2:"Ò™";s:2:"Òš";s:2:"Ò›";s:2:"Òœ";s:2:"Ò";s:2:"Òž";s:2:"ÒŸ";s:2:"Ò ";s:2:"Ò¡";s:2:"Ò¢";s:2:"Ò£";s:2:"Ò¤";s:2:"Ò¥";s:2:"Ò¦";s:2:"Ò§";s:2:"Ò¨";s:2:"Ò©";s:2:"Òª";s:2:"Ò«";s:2:"Ò¬";s:2:"Ò­";s:2:"Ò®";s:2:"Ò¯";s:2:"Ò°";s:2:"Ò±";s:2:"Ò²";s:2:"Ò³";s:2:"Ò´";s:2:"Òµ";s:2:"Ò¶";s:2:"Ò·";s:2:"Ò¸";s:2:"Ò¹";s:2:"Òº";s:2:"Ò»";s:2:"Ò¼";s:2:"Ò½";s:2:"Ò¾";s:2:"Ò¿";s:2:"Ó€";s:2:"Ó";s:2:"Ó";s:2:"Ó‚";s:2:"Óƒ";s:2:"Ó„";s:2:"Ó…";s:2:"Ó†";s:2:"Ó‡";s:2:"Óˆ";s:2:"Ó‰";s:2:"ÓŠ";s:2:"Ó‹";s:2:"ÓŒ";s:2:"Ó";s:2:"ÓŽ";s:2:"Ó";s:2:"Ó‘";s:2:"Ó’";s:2:"Ó“";s:2:"Ó”";s:2:"Ó•";s:2:"Ó–";s:2:"Ó—";s:2:"Ó˜";s:2:"Ó™";s:2:"Óš";s:2:"Ó›";s:2:"Óœ";s:2:"Ó";s:2:"Óž";s:2:"ÓŸ";s:2:"Ó ";s:2:"Ó¡";s:2:"Ó¢";s:2:"Ó£";s:2:"Ó¤";s:2:"Ó¥";s:2:"Ó¦";s:2:"Ó§";s:2:"Ó¨";s:2:"Ó©";s:2:"Óª";s:2:"Ó«";s:2:"Ó¬";s:2:"Ó­";s:2:"Ó®";s:2:"Ó¯";s:2:"Ó°";s:2:"Ó±";s:2:"Ó²";s:2:"Ó³";s:2:"Ó´";s:2:"Óµ";s:2:"Ó¶";s:2:"Ó·";s:2:"Ó¸";s:2:"Ó¹";s:2:"Óº";s:2:"Ó»";s:2:"Ó¼";s:2:"Ó½";s:2:"Ó¾";s:2:"Ó¿";s:2:"Ô€";s:2:"Ô";s:2:"Ô‚";s:2:"Ôƒ";s:2:"Ô„";s:2:"Ô…";s:2:"Ô†";s:2:"Ô‡";s:2:"Ôˆ";s:2:"Ô‰";s:2:"ÔŠ";s:2:"Ô‹";s:2:"ÔŒ";s:2:"Ô";s:2:"ÔŽ";s:2:"Ô";s:2:"Ô";s:2:"Ô‘";s:2:"Ô’";s:2:"Ô“";s:2:"Ô”";s:2:"Ô•";s:2:"Ô–";s:2:"Ô—";s:2:"Ô˜";s:2:"Ô™";s:2:"Ôš";s:2:"Ô›";s:2:"Ôœ";s:2:"Ô";s:2:"Ôž";s:2:"ÔŸ";s:2:"Ô ";s:2:"Ô¡";s:2:"Ô¢";s:2:"Ô£";s:2:"Ô¤";s:2:"Ô¥";s:2:"Ô¦";s:2:"Ô§";s:2:"Ô±";s:2:"Õ¡";s:2:"Ô²";s:2:"Õ¢";s:2:"Ô³";s:2:"Õ£";s:2:"Ô´";s:2:"Õ¤";s:2:"Ôµ";s:2:"Õ¥";s:2:"Ô¶";s:2:"Õ¦";s:2:"Ô·";s:2:"Õ§";s:2:"Ô¸";s:2:"Õ¨";s:2:"Ô¹";s:2:"Õ©";s:2:"Ôº";s:2:"Õª";s:2:"Ô»";s:2:"Õ«";s:2:"Ô¼";s:2:"Õ¬";s:2:"Ô½";s:2:"Õ­";s:2:"Ô¾";s:2:"Õ®";s:2:"Ô¿";s:2:"Õ¯";s:2:"Õ€";s:2:"Õ°";s:2:"Õ";s:2:"Õ±";s:2:"Õ‚";s:2:"Õ²";s:2:"Õƒ";s:2:"Õ³";s:2:"Õ„";s:2:"Õ´";s:2:"Õ…";s:2:"Õµ";s:2:"Õ†";s:2:"Õ¶";s:2:"Õ‡";s:2:"Õ·";s:2:"Õˆ";s:2:"Õ¸";s:2:"Õ‰";s:2:"Õ¹";s:2:"ÕŠ";s:2:"Õº";s:2:"Õ‹";s:2:"Õ»";s:2:"ÕŒ";s:2:"Õ¼";s:2:"Õ";s:2:"Õ½";s:2:"ÕŽ";s:2:"Õ¾";s:2:"Õ";s:2:"Õ¿";s:2:"Õ";s:2:"Ö€";s:2:"Õ‘";s:2:"Ö";s:2:"Õ’";s:2:"Ö‚";s:2:"Õ“";s:2:"Öƒ";s:2:"Õ”";s:2:"Ö„";s:2:"Õ•";s:2:"Ö…";s:2:"Õ–";s:2:"Ö†";s:3:"á‚ ";s:3:"â´€";s:3:"á‚¡";s:3:"â´";s:3:"á‚¢";s:3:"â´‚";s:3:"á‚£";s:3:"â´ƒ";s:3:"Ⴄ";s:3:"â´„";s:3:"á‚¥";s:3:"â´…";s:3:"Ⴆ";s:3:"â´†";s:3:"á‚§";s:3:"â´‡";s:3:"Ⴈ";s:3:"â´ˆ";s:3:"á‚©";s:3:"â´‰";s:3:"Ⴊ";s:3:"â´Š";s:3:"á‚«";s:3:"â´‹";s:3:"Ⴌ";s:3:"â´Œ";s:3:"á‚­";s:3:"â´";s:3:"á‚®";s:3:"â´Ž";s:3:"Ⴏ";s:3:"â´";s:3:"á‚°";s:3:"â´";s:3:"Ⴑ";s:3:"â´‘";s:3:"Ⴒ";s:3:"â´’";s:3:"Ⴓ";s:3:"â´“";s:3:"á‚´";s:3:"â´”";s:3:"Ⴕ";s:3:"â´•";s:3:"á‚¶";s:3:"â´–";s:3:"á‚·";s:3:"â´—";s:3:"Ⴘ";s:3:"â´˜";s:3:"Ⴙ";s:3:"â´™";s:3:"Ⴚ";s:3:"â´š";s:3:"á‚»";s:3:"â´›";s:3:"Ⴜ";s:3:"â´œ";s:3:"Ⴝ";s:3:"â´";s:3:"Ⴞ";s:3:"â´ž";s:3:"á‚¿";s:3:"â´Ÿ";s:3:"Ⴠ";s:3:"â´ ";s:3:"áƒ";s:3:"â´¡";s:3:"Ⴢ";s:3:"â´¢";s:3:"Ⴣ";s:3:"â´£";s:3:"Ⴤ";s:3:"â´¤";s:3:"Ⴥ";s:3:"â´¥";s:3:"Ⴧ";s:3:"â´§";s:3:"áƒ";s:3:"â´­";s:3:"Ḁ";s:3:"á¸";s:3:"Ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"ḇ";s:3:"Ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"á¸";s:3:"Ḏ";s:3:"á¸";s:3:"á¸";s:3:"ḑ";s:3:"Ḓ";s:3:"ḓ";s:3:"Ḕ";s:3:"ḕ";s:3:"Ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"ḛ";s:3:"Ḝ";s:3:"á¸";s:3:"Ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"ḭ";s:3:"Ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"ḷ";s:3:"Ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"ḿ";s:3:"á¹€";s:3:"á¹";s:3:"Ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"á¹…";s:3:"Ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"ṋ";s:3:"Ṍ";s:3:"á¹";s:3:"Ṏ";s:3:"á¹";s:3:"á¹";s:3:"ṑ";s:3:"á¹’";s:3:"ṓ";s:3:"á¹”";s:3:"ṕ";s:3:"á¹–";s:3:"á¹—";s:3:"Ṙ";s:3:"á¹™";s:3:"Ṛ";s:3:"á¹›";s:3:"Ṝ";s:3:"á¹";s:3:"Ṟ";s:3:"ṟ";s:3:"á¹ ";s:3:"ṡ";s:3:"á¹¢";s:3:"á¹£";s:3:"Ṥ";s:3:"á¹¥";s:3:"Ṧ";s:3:"á¹§";s:3:"Ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"á¹­";s:3:"á¹®";s:3:"ṯ";s:3:"á¹°";s:3:"á¹±";s:3:"á¹²";s:3:"á¹³";s:3:"á¹´";s:3:"á¹µ";s:3:"á¹¶";s:3:"á¹·";s:3:"Ṹ";s:3:"á¹¹";s:3:"Ṻ";s:3:"á¹»";s:3:"á¹¼";s:3:"á¹½";s:3:"á¹¾";s:3:"ṿ";s:3:"Ẁ";s:3:"áº";s:3:"Ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"áº";s:3:"Ẏ";s:3:"áº";s:3:"áº";s:3:"ẑ";s:3:"Ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẞ";s:2:"ß";s:3:"Ạ";s:3:"ạ";s:3:"Ả";s:3:"ả";s:3:"Ấ";s:3:"ấ";s:3:"Ầ";s:3:"ầ";s:3:"Ẩ";s:3:"ẩ";s:3:"Ẫ";s:3:"ẫ";s:3:"Ậ";s:3:"ậ";s:3:"Ắ";s:3:"ắ";s:3:"Ằ";s:3:"ằ";s:3:"Ẳ";s:3:"ẳ";s:3:"Ẵ";s:3:"ẵ";s:3:"Ặ";s:3:"ặ";s:3:"Ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"ẽ";s:3:"Ế";s:3:"ế";s:3:"Ề";s:3:"á»";s:3:"Ể";s:3:"ể";s:3:"Ễ";s:3:"á»…";s:3:"Ệ";s:3:"ệ";s:3:"Ỉ";s:3:"ỉ";s:3:"Ị";s:3:"ị";s:3:"Ọ";s:3:"á»";s:3:"Ỏ";s:3:"á»";s:3:"á»";s:3:"ố";s:3:"á»’";s:3:"ồ";s:3:"á»”";s:3:"ổ";s:3:"á»–";s:3:"á»—";s:3:"Ộ";s:3:"á»™";s:3:"Ớ";s:3:"á»›";s:3:"Ờ";s:3:"á»";s:3:"Ở";s:3:"ở";s:3:"á» ";s:3:"ỡ";s:3:"Ợ";s:3:"ợ";s:3:"Ụ";s:3:"ụ";s:3:"Ủ";s:3:"á»§";s:3:"Ứ";s:3:"ứ";s:3:"Ừ";s:3:"ừ";s:3:"Ử";s:3:"á»­";s:3:"á»®";s:3:"ữ";s:3:"á»°";s:3:"á»±";s:3:"Ỳ";s:3:"ỳ";s:3:"á»´";s:3:"ỵ";s:3:"á»¶";s:3:"á»·";s:3:"Ỹ";s:3:"ỹ";s:3:"Ỻ";s:3:"á»»";s:3:"Ỽ";s:3:"ỽ";s:3:"Ỿ";s:3:"ỿ";s:3:"Ἀ";s:3:"á¼€";s:3:"Ἁ";s:3:"á¼";s:3:"Ἂ";s:3:"ἂ";s:3:"Ἃ";s:3:"ἃ";s:3:"Ἄ";s:3:"ἄ";s:3:"á¼";s:3:"á¼…";s:3:"Ἆ";s:3:"ἆ";s:3:"á¼";s:3:"ἇ";s:3:"Ἐ";s:3:"á¼";s:3:"á¼™";s:3:"ἑ";s:3:"Ἒ";s:3:"á¼’";s:3:"á¼›";s:3:"ἓ";s:3:"Ἔ";s:3:"á¼”";s:3:"á¼";s:3:"ἕ";s:3:"Ἠ";s:3:"á¼ ";s:3:"Ἡ";s:3:"ἡ";s:3:"Ἢ";s:3:"á¼¢";s:3:"Ἣ";s:3:"á¼£";s:3:"Ἤ";s:3:"ἤ";s:3:"á¼­";s:3:"á¼¥";s:3:"á¼®";s:3:"ἦ";s:3:"Ἧ";s:3:"á¼§";s:3:"Ἰ";s:3:"á¼°";s:3:"á¼¹";s:3:"á¼±";s:3:"Ἲ";s:3:"á¼²";s:3:"á¼»";s:3:"á¼³";s:3:"á¼¼";s:3:"á¼´";s:3:"á¼½";s:3:"á¼µ";s:3:"á¼¾";s:3:"á¼¶";s:3:"Ἷ";s:3:"á¼·";s:3:"Ὀ";s:3:"á½€";s:3:"Ὁ";s:3:"á½";s:3:"Ὂ";s:3:"ὂ";s:3:"Ὃ";s:3:"ὃ";s:3:"Ὄ";s:3:"ὄ";s:3:"á½";s:3:"á½…";s:3:"á½™";s:3:"ὑ";s:3:"á½›";s:3:"ὓ";s:3:"á½";s:3:"ὕ";s:3:"Ὗ";s:3:"á½—";s:3:"Ὠ";s:3:"á½ ";s:3:"Ὡ";s:3:"ὡ";s:3:"Ὢ";s:3:"á½¢";s:3:"Ὣ";s:3:"á½£";s:3:"Ὤ";s:3:"ὤ";s:3:"á½­";s:3:"á½¥";s:3:"á½®";s:3:"ὦ";s:3:"Ὧ";s:3:"á½§";s:3:"ᾈ";s:3:"á¾€";s:3:"ᾉ";s:3:"á¾";s:3:"ᾊ";s:3:"ᾂ";s:3:"ᾋ";s:3:"ᾃ";s:3:"ᾌ";s:3:"ᾄ";s:3:"á¾";s:3:"á¾…";s:3:"ᾎ";s:3:"ᾆ";s:3:"á¾";s:3:"ᾇ";s:3:"ᾘ";s:3:"á¾";s:3:"á¾™";s:3:"ᾑ";s:3:"ᾚ";s:3:"á¾’";s:3:"á¾›";s:3:"ᾓ";s:3:"ᾜ";s:3:"á¾”";s:3:"á¾";s:3:"ᾕ";s:3:"ᾞ";s:3:"á¾–";s:3:"ᾟ";s:3:"á¾—";s:3:"ᾨ";s:3:"á¾ ";s:3:"ᾩ";s:3:"ᾡ";s:3:"ᾪ";s:3:"á¾¢";s:3:"ᾫ";s:3:"á¾£";s:3:"ᾬ";s:3:"ᾤ";s:3:"á¾­";s:3:"á¾¥";s:3:"á¾®";s:3:"ᾦ";s:3:"ᾯ";s:3:"á¾§";s:3:"Ᾰ";s:3:"á¾°";s:3:"á¾¹";s:3:"á¾±";s:3:"Ὰ";s:3:"á½°";s:3:"á¾»";s:3:"á½±";s:3:"á¾¼";s:3:"á¾³";s:3:"Ὲ";s:3:"á½²";s:3:"Έ";s:3:"á½³";s:3:"Ὴ";s:3:"á½´";s:3:"á¿‹";s:3:"á½µ";s:3:"ῌ";s:3:"ῃ";s:3:"Ῐ";s:3:"á¿";s:3:"á¿™";s:3:"á¿‘";s:3:"Ὶ";s:3:"á½¶";s:3:"á¿›";s:3:"á½·";s:3:"Ῠ";s:3:"á¿ ";s:3:"á¿©";s:3:"á¿¡";s:3:"Ὺ";s:3:"ὺ";s:3:"á¿«";s:3:"á½»";s:3:"Ῥ";s:3:"á¿¥";s:3:"Ὸ";s:3:"ὸ";s:3:"Ό";s:3:"á½¹";s:3:"Ὼ";s:3:"á½¼";s:3:"á¿»";s:3:"á½½";s:3:"ῼ";s:3:"ῳ";s:3:"Ω";s:2:"ω";s:3:"K";s:1:"k";s:3:"â„«";s:2:"Ã¥";s:3:"Ⅎ";s:3:"â…Ž";s:3:"â… ";s:3:"â…°";s:3:"â…¡";s:3:"â…±";s:3:"â…¢";s:3:"â…²";s:3:"â…£";s:3:"â…³";s:3:"â…¤";s:3:"â…´";s:3:"â…¥";s:3:"â…µ";s:3:"â…¦";s:3:"â…¶";s:3:"â…§";s:3:"â…·";s:3:"â…¨";s:3:"â…¸";s:3:"â…©";s:3:"â…¹";s:3:"â…ª";s:3:"â…º";s:3:"â…«";s:3:"â…»";s:3:"â…¬";s:3:"â…¼";s:3:"â…­";s:3:"â…½";s:3:"â…®";s:3:"â…¾";s:3:"â…¯";s:3:"â…¿";s:3:"Ↄ";s:3:"ↄ";s:3:"â’¶";s:3:"â“";s:3:"â’·";s:3:"â“‘";s:3:"â’¸";s:3:"â“’";s:3:"â’¹";s:3:"â““";s:3:"â’º";s:3:"â“”";s:3:"â’»";s:3:"â“•";s:3:"â’¼";s:3:"â“–";s:3:"â’½";s:3:"â“—";s:3:"â’¾";s:3:"ⓘ";s:3:"â’¿";s:3:"â“™";s:3:"â“€";s:3:"ⓚ";s:3:"â“";s:3:"â“›";s:3:"â“‚";s:3:"ⓜ";s:3:"Ⓝ";s:3:"â“";s:3:"â“„";s:3:"ⓞ";s:3:"â“…";s:3:"ⓟ";s:3:"Ⓠ";s:3:"â“ ";s:3:"Ⓡ";s:3:"â“¡";s:3:"Ⓢ";s:3:"â“¢";s:3:"Ⓣ";s:3:"â“£";s:3:"Ⓤ";s:3:"ⓤ";s:3:"â“‹";s:3:"â“¥";s:3:"Ⓦ";s:3:"ⓦ";s:3:"â“";s:3:"â“§";s:3:"Ⓨ";s:3:"ⓨ";s:3:"â“";s:3:"â“©";s:3:"â°€";s:3:"â°°";s:3:"â°";s:3:"â°±";s:3:"â°‚";s:3:"â°²";s:3:"â°ƒ";s:3:"â°³";s:3:"â°„";s:3:"â°´";s:3:"â°…";s:3:"â°µ";s:3:"â°†";s:3:"â°¶";s:3:"â°‡";s:3:"â°·";s:3:"â°ˆ";s:3:"â°¸";s:3:"â°‰";s:3:"â°¹";s:3:"â°Š";s:3:"â°º";s:3:"â°‹";s:3:"â°»";s:3:"â°Œ";s:3:"â°¼";s:3:"â°";s:3:"â°½";s:3:"â°Ž";s:3:"â°¾";s:3:"â°";s:3:"â°¿";s:3:"â°";s:3:"â±€";s:3:"â°‘";s:3:"â±";s:3:"â°’";s:3:"ⱂ";s:3:"â°“";s:3:"ⱃ";s:3:"â°”";s:3:"ⱄ";s:3:"â°•";s:3:"â±…";s:3:"â°–";s:3:"ⱆ";s:3:"â°—";s:3:"ⱇ";s:3:"â°˜";s:3:"ⱈ";s:3:"â°™";s:3:"ⱉ";s:3:"â°š";s:3:"ⱊ";s:3:"â°›";s:3:"ⱋ";s:3:"â°œ";s:3:"ⱌ";s:3:"â°";s:3:"â±";s:3:"â°ž";s:3:"ⱎ";s:3:"â°Ÿ";s:3:"â±";s:3:"â° ";s:3:"â±";s:3:"â°¡";s:3:"ⱑ";s:3:"â°¢";s:3:"â±’";s:3:"â°£";s:3:"ⱓ";s:3:"â°¤";s:3:"â±”";s:3:"â°¥";s:3:"ⱕ";s:3:"â°¦";s:3:"â±–";s:3:"â°§";s:3:"â±—";s:3:"â°¨";s:3:"ⱘ";s:3:"â°©";s:3:"â±™";s:3:"â°ª";s:3:"ⱚ";s:3:"â°«";s:3:"â±›";s:3:"â°¬";s:3:"ⱜ";s:3:"â°­";s:3:"â±";s:3:"â°®";s:3:"ⱞ";s:3:"â± ";s:3:"ⱡ";s:3:"â±¢";s:2:"É«";s:3:"â±£";s:3:"áµ½";s:3:"Ɽ";s:2:"ɽ";s:3:"â±§";s:3:"ⱨ";s:3:"Ⱪ";s:3:"ⱪ";s:3:"Ⱬ";s:3:"ⱬ";s:3:"â±­";s:2:"É‘";s:3:"â±®";s:2:"ɱ";s:3:"Ɐ";s:2:"É";s:3:"â±°";s:2:"É’";s:3:"â±²";s:3:"â±³";s:3:"â±µ";s:3:"â±¶";s:3:"â±¾";s:2:"È¿";s:3:"Ɀ";s:2:"É€";s:3:"â²€";s:3:"â²";s:3:"Ⲃ";s:3:"ⲃ";s:3:"Ⲅ";s:3:"â²…";s:3:"Ⲇ";s:3:"ⲇ";s:3:"Ⲉ";s:3:"ⲉ";s:3:"Ⲋ";s:3:"ⲋ";s:3:"Ⲍ";s:3:"â²";s:3:"Ⲏ";s:3:"â²";s:3:"â²";s:3:"ⲑ";s:3:"â²’";s:3:"ⲓ";s:3:"â²”";s:3:"ⲕ";s:3:"â²–";s:3:"â²—";s:3:"Ⲙ";s:3:"â²™";s:3:"Ⲛ";s:3:"â²›";s:3:"Ⲝ";s:3:"â²";s:3:"Ⲟ";s:3:"ⲟ";s:3:"â² ";s:3:"ⲡ";s:3:"â²¢";s:3:"â²£";s:3:"Ⲥ";s:3:"â²¥";s:3:"Ⲧ";s:3:"â²§";s:3:"Ⲩ";s:3:"ⲩ";s:3:"Ⲫ";s:3:"ⲫ";s:3:"Ⲭ";s:3:"â²­";s:3:"â²®";s:3:"ⲯ";s:3:"â²°";s:3:"â²±";s:3:"â²²";s:3:"â²³";s:3:"â²´";s:3:"â²µ";s:3:"â²¶";s:3:"â²·";s:3:"Ⲹ";s:3:"â²¹";s:3:"Ⲻ";s:3:"â²»";s:3:"â²¼";s:3:"â²½";s:3:"â²¾";s:3:"ⲿ";s:3:"â³€";s:3:"â³";s:3:"Ⳃ";s:3:"ⳃ";s:3:"Ⳅ";s:3:"â³…";s:3:"Ⳇ";s:3:"ⳇ";s:3:"Ⳉ";s:3:"ⳉ";s:3:"Ⳋ";s:3:"ⳋ";s:3:"Ⳍ";s:3:"â³";s:3:"Ⳏ";s:3:"â³";s:3:"â³";s:3:"ⳑ";s:3:"â³’";s:3:"ⳓ";s:3:"â³”";s:3:"ⳕ";s:3:"â³–";s:3:"â³—";s:3:"Ⳙ";s:3:"â³™";s:3:"Ⳛ";s:3:"â³›";s:3:"Ⳝ";s:3:"â³";s:3:"Ⳟ";s:3:"ⳟ";s:3:"â³ ";s:3:"ⳡ";s:3:"â³¢";s:3:"â³£";s:3:"Ⳬ";s:3:"ⳬ";s:3:"â³­";s:3:"â³®";s:3:"â³²";s:3:"â³³";s:3:"Ꙁ";s:3:"ê™";s:3:"Ꙃ";s:3:"ꙃ";s:3:"Ꙅ";s:3:"ê™…";s:3:"Ꙇ";s:3:"ꙇ";s:3:"Ꙉ";s:3:"ꙉ";s:3:"Ꙋ";s:3:"ꙋ";s:3:"Ꙍ";s:3:"ê™";s:3:"Ꙏ";s:3:"ê™";s:3:"ê™";s:3:"ꙑ";s:3:"ê™’";s:3:"ꙓ";s:3:"ê™”";s:3:"ꙕ";s:3:"ê™–";s:3:"ê™—";s:3:"Ꙙ";s:3:"ê™™";s:3:"Ꙛ";s:3:"ê™›";s:3:"Ꙝ";s:3:"ê™";s:3:"Ꙟ";s:3:"ꙟ";s:3:"ê™ ";s:3:"ꙡ";s:3:"Ꙣ";s:3:"ꙣ";s:3:"Ꙥ";s:3:"ꙥ";s:3:"Ꙧ";s:3:"ê™§";s:3:"Ꙩ";s:3:"ꙩ";s:3:"Ꙫ";s:3:"ꙫ";s:3:"Ꙭ";s:3:"ê™­";s:3:"Ꚁ";s:3:"êš";s:3:"êš‚";s:3:"ꚃ";s:3:"êš„";s:3:"êš…";s:3:"Ꚇ";s:3:"ꚇ";s:3:"Ꚉ";s:3:"ꚉ";s:3:"Ꚋ";s:3:"êš‹";s:3:"Ꚍ";s:3:"êš";s:3:"Ꚏ";s:3:"êš";s:3:"êš";s:3:"êš‘";s:3:"êš’";s:3:"êš“";s:3:"êš”";s:3:"êš•";s:3:"êš–";s:3:"êš—";s:3:"Ꜣ";s:3:"ꜣ";s:3:"Ꜥ";s:3:"ꜥ";s:3:"Ꜧ";s:3:"ꜧ";s:3:"Ꜩ";s:3:"ꜩ";s:3:"Ꜫ";s:3:"ꜫ";s:3:"Ꜭ";s:3:"ꜭ";s:3:"Ꜯ";s:3:"ꜯ";s:3:"Ꜳ";s:3:"ꜳ";s:3:"Ꜵ";s:3:"ꜵ";s:3:"Ꜷ";s:3:"ꜷ";s:3:"Ꜹ";s:3:"ꜹ";s:3:"Ꜻ";s:3:"ꜻ";s:3:"Ꜽ";s:3:"ꜽ";s:3:"Ꜿ";s:3:"ꜿ";s:3:"ê€";s:3:"ê";s:3:"ê‚";s:3:"êƒ";s:3:"ê„";s:3:"ê…";s:3:"ê†";s:3:"ê‡";s:3:"êˆ";s:3:"ê‰";s:3:"êŠ";s:3:"ê‹";s:3:"êŒ";s:3:"ê";s:3:"êŽ";s:3:"ê";s:3:"ê";s:3:"ê‘";s:3:"ê’";s:3:"ê“";s:3:"ê”";s:3:"ê•";s:3:"ê–";s:3:"ê—";s:3:"ê˜";s:3:"ê™";s:3:"êš";s:3:"ê›";s:3:"êœ";s:3:"ê";s:3:"êž";s:3:"êŸ";s:3:"ê ";s:3:"ê¡";s:3:"ê¢";s:3:"ê£";s:3:"ê¤";s:3:"ê¥";s:3:"ê¦";s:3:"ê§";s:3:"ê¨";s:3:"ê©";s:3:"êª";s:3:"ê«";s:3:"ê¬";s:3:"ê­";s:3:"ê®";s:3:"ê¯";s:3:"ê¹";s:3:"êº";s:3:"ê»";s:3:"ê¼";s:3:"ê½";s:3:"áµ¹";s:3:"ê¾";s:3:"ê¿";s:3:"Ꞁ";s:3:"êž";s:3:"êž‚";s:3:"ꞃ";s:3:"êž„";s:3:"êž…";s:3:"Ꞇ";s:3:"ꞇ";s:3:"êž‹";s:3:"ꞌ";s:3:"êž";s:2:"É¥";s:3:"êž";s:3:"êž‘";s:3:"êž’";s:3:"êž“";s:3:"êž ";s:3:"êž¡";s:3:"Ꞣ";s:3:"ꞣ";s:3:"Ꞥ";s:3:"ꞥ";s:3:"Ꞧ";s:3:"êž§";s:3:"Ꞩ";s:3:"êž©";s:3:"Ɦ";s:2:"ɦ";s:3:"A";s:3:"ï½";s:3:"ï¼¢";s:3:"b";s:3:"ï¼£";s:3:"c";s:3:"D";s:3:"d";s:3:"ï¼¥";s:3:"ï½…";s:3:"F";s:3:"f";s:3:"ï¼§";s:3:"g";s:3:"H";s:3:"h";s:3:"I";s:3:"i";s:3:"J";s:3:"j";s:3:"K";s:3:"k";s:3:"L";s:3:"l";s:3:"ï¼­";s:3:"ï½";s:3:"ï¼®";s:3:"n";s:3:"O";s:3:"ï½";s:3:"ï¼°";s:3:"ï½";s:3:"ï¼±";s:3:"q";s:3:"ï¼²";s:3:"ï½’";s:3:"ï¼³";s:3:"s";s:3:"ï¼´";s:3:"ï½”";s:3:"ï¼µ";s:3:"u";s:3:"ï¼¶";s:3:"ï½–";s:3:"ï¼·";s:3:"ï½—";s:3:"X";s:3:"x";s:3:"ï¼¹";s:3:"ï½™";s:3:"Z";s:3:"z";s:4:"ð€";s:4:"ð¨";s:4:"ð";s:4:"ð©";s:4:"ð‚";s:4:"ðª";s:4:"ðƒ";s:4:"ð«";s:4:"ð„";s:4:"ð¬";s:4:"ð…";s:4:"ð­";s:4:"ð†";s:4:"ð®";s:4:"ð‡";s:4:"ð¯";s:4:"ðˆ";s:4:"ð°";s:4:"ð‰";s:4:"ð±";s:4:"ðŠ";s:4:"ð²";s:4:"ð‹";s:4:"ð³";s:4:"ðŒ";s:4:"ð´";s:4:"ð";s:4:"ðµ";s:4:"ðŽ";s:4:"ð¶";s:4:"ð";s:4:"ð·";s:4:"ð";s:4:"ð¸";s:4:"ð‘";s:4:"ð¹";s:4:"ð’";s:4:"ðº";s:4:"ð“";s:4:"ð»";s:4:"ð”";s:4:"ð¼";s:4:"ð•";s:4:"ð½";s:4:"ð–";s:4:"ð¾";s:4:"ð—";s:4:"ð¿";s:4:"ð˜";s:4:"ð‘€";s:4:"ð™";s:4:"ð‘";s:4:"ðš";s:4:"ð‘‚";s:4:"ð›";s:4:"ð‘ƒ";s:4:"ðœ";s:4:"ð‘„";s:4:"ð";s:4:"ð‘…";s:4:"ðž";s:4:"ð‘†";s:4:"ðŸ";s:4:"ð‘‡";s:4:"ð ";s:4:"ð‘ˆ";s:4:"ð¡";s:4:"ð‘‰";s:4:"ð¢";s:4:"ð‘Š";s:4:"ð£";s:4:"ð‘‹";s:4:"ð¤";s:4:"ð‘Œ";s:4:"ð¥";s:4:"ð‘";s:4:"ð¦";s:4:"ð‘Ž";s:4:"ð§";s:4:"ð‘";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/upperCase.ser b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/upperCase.ser new file mode 100644 index 0000000000..a3182d4f84 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/PHP/Shim/unidata/upperCase.ser @@ -0,0 +1 @@ +a:1051:{s:1:"a";s:1:"A";s:1:"b";s:1:"B";s:1:"c";s:1:"C";s:1:"d";s:1:"D";s:1:"e";s:1:"E";s:1:"f";s:1:"F";s:1:"g";s:1:"G";s:1:"h";s:1:"H";s:1:"i";s:1:"I";s:1:"j";s:1:"J";s:1:"k";s:1:"K";s:1:"l";s:1:"L";s:1:"m";s:1:"M";s:1:"n";s:1:"N";s:1:"o";s:1:"O";s:1:"p";s:1:"P";s:1:"q";s:1:"Q";s:1:"r";s:1:"R";s:1:"s";s:1:"S";s:1:"t";s:1:"T";s:1:"u";s:1:"U";s:1:"v";s:1:"V";s:1:"w";s:1:"W";s:1:"x";s:1:"X";s:1:"y";s:1:"Y";s:1:"z";s:1:"Z";s:2:"µ";s:2:"Μ";s:2:"à";s:2:"À";s:2:"á";s:2:"Ã";s:2:"â";s:2:"Â";s:2:"ã";s:2:"Ã";s:2:"ä";s:2:"Ä";s:2:"Ã¥";s:2:"Ã…";s:2:"æ";s:2:"Æ";s:2:"ç";s:2:"Ç";s:2:"è";s:2:"È";s:2:"é";s:2:"É";s:2:"ê";s:2:"Ê";s:2:"ë";s:2:"Ë";s:2:"ì";s:2:"ÃŒ";s:2:"í";s:2:"Ã";s:2:"î";s:2:"ÃŽ";s:2:"ï";s:2:"Ã";s:2:"ð";s:2:"Ã";s:2:"ñ";s:2:"Ñ";s:2:"ò";s:2:"Ã’";s:2:"ó";s:2:"Ó";s:2:"ô";s:2:"Ô";s:2:"õ";s:2:"Õ";s:2:"ö";s:2:"Ö";s:2:"ø";s:2:"Ø";s:2:"ù";s:2:"Ù";s:2:"ú";s:2:"Ú";s:2:"û";s:2:"Û";s:2:"ü";s:2:"Ü";s:2:"ý";s:2:"Ã";s:2:"þ";s:2:"Þ";s:2:"ÿ";s:2:"Ÿ";s:2:"Ä";s:2:"Ä€";s:2:"ă";s:2:"Ä‚";s:2:"Ä…";s:2:"Ä„";s:2:"ć";s:2:"Ć";s:2:"ĉ";s:2:"Ĉ";s:2:"Ä‹";s:2:"ÄŠ";s:2:"Ä";s:2:"ÄŒ";s:2:"Ä";s:2:"ÄŽ";s:2:"Ä‘";s:2:"Ä";s:2:"Ä“";s:2:"Ä’";s:2:"Ä•";s:2:"Ä”";s:2:"Ä—";s:2:"Ä–";s:2:"Ä™";s:2:"Ę";s:2:"Ä›";s:2:"Äš";s:2:"Ä";s:2:"Äœ";s:2:"ÄŸ";s:2:"Äž";s:2:"Ä¡";s:2:"Ä ";s:2:"Ä£";s:2:"Ä¢";s:2:"Ä¥";s:2:"Ĥ";s:2:"ħ";s:2:"Ħ";s:2:"Ä©";s:2:"Ĩ";s:2:"Ä«";s:2:"Ī";s:2:"Ä­";s:2:"Ĭ";s:2:"į";s:2:"Ä®";s:2:"ı";s:1:"I";s:2:"ij";s:2:"IJ";s:2:"ĵ";s:2:"Ä´";s:2:"Ä·";s:2:"Ķ";s:2:"ĺ";s:2:"Ĺ";s:2:"ļ";s:2:"Ä»";s:2:"ľ";s:2:"Ľ";s:2:"Å€";s:2:"Ä¿";s:2:"Å‚";s:2:"Å";s:2:"Å„";s:2:"Ń";s:2:"ņ";s:2:"Å…";s:2:"ň";s:2:"Ň";s:2:"Å‹";s:2:"ÅŠ";s:2:"Å";s:2:"ÅŒ";s:2:"Å";s:2:"ÅŽ";s:2:"Å‘";s:2:"Å";s:2:"Å“";s:2:"Å’";s:2:"Å•";s:2:"Å”";s:2:"Å—";s:2:"Å–";s:2:"Å™";s:2:"Ř";s:2:"Å›";s:2:"Åš";s:2:"Å";s:2:"Åœ";s:2:"ÅŸ";s:2:"Åž";s:2:"Å¡";s:2:"Å ";s:2:"Å£";s:2:"Å¢";s:2:"Å¥";s:2:"Ť";s:2:"ŧ";s:2:"Ŧ";s:2:"Å©";s:2:"Ũ";s:2:"Å«";s:2:"Ū";s:2:"Å­";s:2:"Ŭ";s:2:"ů";s:2:"Å®";s:2:"ű";s:2:"Ű";s:2:"ų";s:2:"Ų";s:2:"ŵ";s:2:"Å´";s:2:"Å·";s:2:"Ŷ";s:2:"ź";s:2:"Ź";s:2:"ż";s:2:"Å»";s:2:"ž";s:2:"Ž";s:2:"Å¿";s:1:"S";s:2:"Æ€";s:2:"Ƀ";s:2:"ƃ";s:2:"Æ‚";s:2:"Æ…";s:2:"Æ„";s:2:"ƈ";s:2:"Ƈ";s:2:"ÆŒ";s:2:"Æ‹";s:2:"Æ’";s:2:"Æ‘";s:2:"Æ•";s:2:"Ƕ";s:2:"Æ™";s:2:"Ƙ";s:2:"Æš";s:2:"Ƚ";s:2:"Æž";s:2:"È ";s:2:"Æ¡";s:2:"Æ ";s:2:"Æ£";s:2:"Æ¢";s:2:"Æ¥";s:2:"Ƥ";s:2:"ƨ";s:2:"Ƨ";s:2:"Æ­";s:2:"Ƭ";s:2:"ư";s:2:"Ư";s:2:"Æ´";s:2:"Ƴ";s:2:"ƶ";s:2:"Ƶ";s:2:"ƹ";s:2:"Ƹ";s:2:"ƽ";s:2:"Ƽ";s:2:"Æ¿";s:2:"Ç·";s:2:"Ç…";s:2:"Ç„";s:2:"dž";s:2:"Ç„";s:2:"Lj";s:2:"LJ";s:2:"lj";s:2:"LJ";s:2:"Ç‹";s:2:"ÇŠ";s:2:"ÇŒ";s:2:"ÇŠ";s:2:"ÇŽ";s:2:"Ç";s:2:"Ç";s:2:"Ç";s:2:"Ç’";s:2:"Ç‘";s:2:"Ç”";s:2:"Ç“";s:2:"Ç–";s:2:"Ç•";s:2:"ǘ";s:2:"Ç—";s:2:"Çš";s:2:"Ç™";s:2:"Çœ";s:2:"Ç›";s:2:"Ç";s:2:"ÆŽ";s:2:"ÇŸ";s:2:"Çž";s:2:"Ç¡";s:2:"Ç ";s:2:"Ç£";s:2:"Ç¢";s:2:"Ç¥";s:2:"Ǥ";s:2:"ǧ";s:2:"Ǧ";s:2:"Ç©";s:2:"Ǩ";s:2:"Ç«";s:2:"Ǫ";s:2:"Ç­";s:2:"Ǭ";s:2:"ǯ";s:2:"Ç®";s:2:"Dz";s:2:"DZ";s:2:"dz";s:2:"DZ";s:2:"ǵ";s:2:"Ç´";s:2:"ǹ";s:2:"Ǹ";s:2:"Ç»";s:2:"Ǻ";s:2:"ǽ";s:2:"Ǽ";s:2:"Ç¿";s:2:"Ǿ";s:2:"È";s:2:"È€";s:2:"ȃ";s:2:"È‚";s:2:"È…";s:2:"È„";s:2:"ȇ";s:2:"Ȇ";s:2:"ȉ";s:2:"Ȉ";s:2:"È‹";s:2:"ÈŠ";s:2:"È";s:2:"ÈŒ";s:2:"È";s:2:"ÈŽ";s:2:"È‘";s:2:"È";s:2:"È“";s:2:"È’";s:2:"È•";s:2:"È”";s:2:"È—";s:2:"È–";s:2:"È™";s:2:"Ș";s:2:"È›";s:2:"Èš";s:2:"È";s:2:"Èœ";s:2:"ÈŸ";s:2:"Èž";s:2:"È£";s:2:"È¢";s:2:"È¥";s:2:"Ȥ";s:2:"ȧ";s:2:"Ȧ";s:2:"È©";s:2:"Ȩ";s:2:"È«";s:2:"Ȫ";s:2:"È­";s:2:"Ȭ";s:2:"ȯ";s:2:"È®";s:2:"ȱ";s:2:"Ȱ";s:2:"ȳ";s:2:"Ȳ";s:2:"ȼ";s:2:"È»";s:2:"È¿";s:3:"â±¾";s:2:"É€";s:3:"Ɀ";s:2:"É‚";s:2:"É";s:2:"ɇ";s:2:"Ɇ";s:2:"ɉ";s:2:"Ɉ";s:2:"É‹";s:2:"ÉŠ";s:2:"É";s:2:"ÉŒ";s:2:"É";s:2:"ÉŽ";s:2:"É";s:3:"Ɐ";s:2:"É‘";s:3:"â±­";s:2:"É’";s:3:"â±°";s:2:"É“";s:2:"Æ";s:2:"É”";s:2:"Ɔ";s:2:"É–";s:2:"Ɖ";s:2:"É—";s:2:"ÆŠ";s:2:"É™";s:2:"Æ";s:2:"É›";s:2:"Æ";s:2:"É ";s:2:"Æ“";s:2:"É£";s:2:"Æ”";s:2:"É¥";s:3:"êž";s:2:"ɦ";s:3:"Ɦ";s:2:"ɨ";s:2:"Æ—";s:2:"É©";s:2:"Æ–";s:2:"É«";s:3:"â±¢";s:2:"ɯ";s:2:"Æœ";s:2:"ɱ";s:3:"â±®";s:2:"ɲ";s:2:"Æ";s:2:"ɵ";s:2:"ÆŸ";s:2:"ɽ";s:3:"Ɽ";s:2:"Ê€";s:2:"Ʀ";s:2:"ʃ";s:2:"Æ©";s:2:"ʈ";s:2:"Æ®";s:2:"ʉ";s:2:"É„";s:2:"ÊŠ";s:2:"Ʊ";s:2:"Ê‹";s:2:"Ʋ";s:2:"ÊŒ";s:2:"É…";s:2:"Ê’";s:2:"Æ·";s:2:"Í…";s:2:"Ι";s:2:"ͱ";s:2:"Ͱ";s:2:"ͳ";s:2:"Ͳ";s:2:"Í·";s:2:"Ͷ";s:2:"Í»";s:2:"Ͻ";s:2:"ͼ";s:2:"Ͼ";s:2:"ͽ";s:2:"Ï¿";s:2:"ά";s:2:"Ά";s:2:"έ";s:2:"Έ";s:2:"ή";s:2:"Ή";s:2:"ί";s:2:"Ί";s:2:"α";s:2:"Α";s:2:"β";s:2:"Î’";s:2:"γ";s:2:"Γ";s:2:"δ";s:2:"Δ";s:2:"ε";s:2:"Ε";s:2:"ζ";s:2:"Ζ";s:2:"η";s:2:"Η";s:2:"θ";s:2:"Θ";s:2:"ι";s:2:"Ι";s:2:"κ";s:2:"Κ";s:2:"λ";s:2:"Λ";s:2:"μ";s:2:"Μ";s:2:"ν";s:2:"Î";s:2:"ξ";s:2:"Ξ";s:2:"ο";s:2:"Ο";s:2:"Ï€";s:2:"Π";s:2:"Ï";s:2:"Ρ";s:2:"Ï‚";s:2:"Σ";s:2:"σ";s:2:"Σ";s:2:"Ï„";s:2:"Τ";s:2:"Ï…";s:2:"Î¥";s:2:"φ";s:2:"Φ";s:2:"χ";s:2:"Χ";s:2:"ψ";s:2:"Ψ";s:2:"ω";s:2:"Ω";s:2:"ÏŠ";s:2:"Ϊ";s:2:"Ï‹";s:2:"Ϋ";s:2:"ÏŒ";s:2:"ÎŒ";s:2:"Ï";s:2:"ÎŽ";s:2:"ÏŽ";s:2:"Î";s:2:"Ï";s:2:"Î’";s:2:"Ï‘";s:2:"Θ";s:2:"Ï•";s:2:"Φ";s:2:"Ï–";s:2:"Π";s:2:"Ï—";s:2:"Ï";s:2:"Ï™";s:2:"Ϙ";s:2:"Ï›";s:2:"Ïš";s:2:"Ï";s:2:"Ïœ";s:2:"ÏŸ";s:2:"Ïž";s:2:"Ï¡";s:2:"Ï ";s:2:"Ï£";s:2:"Ï¢";s:2:"Ï¥";s:2:"Ϥ";s:2:"ϧ";s:2:"Ϧ";s:2:"Ï©";s:2:"Ϩ";s:2:"Ï«";s:2:"Ϫ";s:2:"Ï­";s:2:"Ϭ";s:2:"ϯ";s:2:"Ï®";s:2:"ϰ";s:2:"Κ";s:2:"ϱ";s:2:"Ρ";s:2:"ϲ";s:2:"Ϲ";s:2:"ϵ";s:2:"Ε";s:2:"ϸ";s:2:"Ï·";s:2:"Ï»";s:2:"Ϻ";s:2:"а";s:2:"Ð";s:2:"б";s:2:"Б";s:2:"в";s:2:"Ð’";s:2:"г";s:2:"Г";s:2:"д";s:2:"Д";s:2:"е";s:2:"Е";s:2:"ж";s:2:"Ж";s:2:"з";s:2:"З";s:2:"и";s:2:"И";s:2:"й";s:2:"Й";s:2:"к";s:2:"К";s:2:"л";s:2:"Л";s:2:"м";s:2:"М";s:2:"н";s:2:"Ð";s:2:"о";s:2:"О";s:2:"п";s:2:"П";s:2:"Ñ€";s:2:"Р";s:2:"Ñ";s:2:"С";s:2:"Ñ‚";s:2:"Т";s:2:"у";s:2:"У";s:2:"Ñ„";s:2:"Ф";s:2:"Ñ…";s:2:"Ð¥";s:2:"ц";s:2:"Ц";s:2:"ч";s:2:"Ч";s:2:"ш";s:2:"Ш";s:2:"щ";s:2:"Щ";s:2:"ÑŠ";s:2:"Ъ";s:2:"Ñ‹";s:2:"Ы";s:2:"ÑŒ";s:2:"Ь";s:2:"Ñ";s:2:"Э";s:2:"ÑŽ";s:2:"Ю";s:2:"Ñ";s:2:"Я";s:2:"Ñ";s:2:"Ѐ";s:2:"Ñ‘";s:2:"Ð";s:2:"Ñ’";s:2:"Ђ";s:2:"Ñ“";s:2:"Ѓ";s:2:"Ñ”";s:2:"Є";s:2:"Ñ•";s:2:"Ð…";s:2:"Ñ–";s:2:"І";s:2:"Ñ—";s:2:"Ї";s:2:"ј";s:2:"Ј";s:2:"Ñ™";s:2:"Љ";s:2:"Ñš";s:2:"Њ";s:2:"Ñ›";s:2:"Ћ";s:2:"Ñœ";s:2:"ÐŒ";s:2:"Ñ";s:2:"Ð";s:2:"Ñž";s:2:"ÐŽ";s:2:"ÑŸ";s:2:"Ð";s:2:"Ñ¡";s:2:"Ñ ";s:2:"Ñ£";s:2:"Ñ¢";s:2:"Ñ¥";s:2:"Ѥ";s:2:"ѧ";s:2:"Ѧ";s:2:"Ñ©";s:2:"Ѩ";s:2:"Ñ«";s:2:"Ѫ";s:2:"Ñ­";s:2:"Ѭ";s:2:"ѯ";s:2:"Ñ®";s:2:"ѱ";s:2:"Ѱ";s:2:"ѳ";s:2:"Ѳ";s:2:"ѵ";s:2:"Ñ´";s:2:"Ñ·";s:2:"Ѷ";s:2:"ѹ";s:2:"Ѹ";s:2:"Ñ»";s:2:"Ѻ";s:2:"ѽ";s:2:"Ѽ";s:2:"Ñ¿";s:2:"Ѿ";s:2:"Ò";s:2:"Ò€";s:2:"Ò‹";s:2:"ÒŠ";s:2:"Ò";s:2:"ÒŒ";s:2:"Ò";s:2:"ÒŽ";s:2:"Ò‘";s:2:"Ò";s:2:"Ò“";s:2:"Ò’";s:2:"Ò•";s:2:"Ò”";s:2:"Ò—";s:2:"Ò–";s:2:"Ò™";s:2:"Ò˜";s:2:"Ò›";s:2:"Òš";s:2:"Ò";s:2:"Òœ";s:2:"ÒŸ";s:2:"Òž";s:2:"Ò¡";s:2:"Ò ";s:2:"Ò£";s:2:"Ò¢";s:2:"Ò¥";s:2:"Ò¤";s:2:"Ò§";s:2:"Ò¦";s:2:"Ò©";s:2:"Ò¨";s:2:"Ò«";s:2:"Òª";s:2:"Ò­";s:2:"Ò¬";s:2:"Ò¯";s:2:"Ò®";s:2:"Ò±";s:2:"Ò°";s:2:"Ò³";s:2:"Ò²";s:2:"Òµ";s:2:"Ò´";s:2:"Ò·";s:2:"Ò¶";s:2:"Ò¹";s:2:"Ò¸";s:2:"Ò»";s:2:"Òº";s:2:"Ò½";s:2:"Ò¼";s:2:"Ò¿";s:2:"Ò¾";s:2:"Ó‚";s:2:"Ó";s:2:"Ó„";s:2:"Óƒ";s:2:"Ó†";s:2:"Ó…";s:2:"Óˆ";s:2:"Ó‡";s:2:"ÓŠ";s:2:"Ó‰";s:2:"ÓŒ";s:2:"Ó‹";s:2:"ÓŽ";s:2:"Ó";s:2:"Ó";s:2:"Ó€";s:2:"Ó‘";s:2:"Ó";s:2:"Ó“";s:2:"Ó’";s:2:"Ó•";s:2:"Ó”";s:2:"Ó—";s:2:"Ó–";s:2:"Ó™";s:2:"Ó˜";s:2:"Ó›";s:2:"Óš";s:2:"Ó";s:2:"Óœ";s:2:"ÓŸ";s:2:"Óž";s:2:"Ó¡";s:2:"Ó ";s:2:"Ó£";s:2:"Ó¢";s:2:"Ó¥";s:2:"Ó¤";s:2:"Ó§";s:2:"Ó¦";s:2:"Ó©";s:2:"Ó¨";s:2:"Ó«";s:2:"Óª";s:2:"Ó­";s:2:"Ó¬";s:2:"Ó¯";s:2:"Ó®";s:2:"Ó±";s:2:"Ó°";s:2:"Ó³";s:2:"Ó²";s:2:"Óµ";s:2:"Ó´";s:2:"Ó·";s:2:"Ó¶";s:2:"Ó¹";s:2:"Ó¸";s:2:"Ó»";s:2:"Óº";s:2:"Ó½";s:2:"Ó¼";s:2:"Ó¿";s:2:"Ó¾";s:2:"Ô";s:2:"Ô€";s:2:"Ôƒ";s:2:"Ô‚";s:2:"Ô…";s:2:"Ô„";s:2:"Ô‡";s:2:"Ô†";s:2:"Ô‰";s:2:"Ôˆ";s:2:"Ô‹";s:2:"ÔŠ";s:2:"Ô";s:2:"ÔŒ";s:2:"Ô";s:2:"ÔŽ";s:2:"Ô‘";s:2:"Ô";s:2:"Ô“";s:2:"Ô’";s:2:"Ô•";s:2:"Ô”";s:2:"Ô—";s:2:"Ô–";s:2:"Ô™";s:2:"Ô˜";s:2:"Ô›";s:2:"Ôš";s:2:"Ô";s:2:"Ôœ";s:2:"ÔŸ";s:2:"Ôž";s:2:"Ô¡";s:2:"Ô ";s:2:"Ô£";s:2:"Ô¢";s:2:"Ô¥";s:2:"Ô¤";s:2:"Ô§";s:2:"Ô¦";s:2:"Õ¡";s:2:"Ô±";s:2:"Õ¢";s:2:"Ô²";s:2:"Õ£";s:2:"Ô³";s:2:"Õ¤";s:2:"Ô´";s:2:"Õ¥";s:2:"Ôµ";s:2:"Õ¦";s:2:"Ô¶";s:2:"Õ§";s:2:"Ô·";s:2:"Õ¨";s:2:"Ô¸";s:2:"Õ©";s:2:"Ô¹";s:2:"Õª";s:2:"Ôº";s:2:"Õ«";s:2:"Ô»";s:2:"Õ¬";s:2:"Ô¼";s:2:"Õ­";s:2:"Ô½";s:2:"Õ®";s:2:"Ô¾";s:2:"Õ¯";s:2:"Ô¿";s:2:"Õ°";s:2:"Õ€";s:2:"Õ±";s:2:"Õ";s:2:"Õ²";s:2:"Õ‚";s:2:"Õ³";s:2:"Õƒ";s:2:"Õ´";s:2:"Õ„";s:2:"Õµ";s:2:"Õ…";s:2:"Õ¶";s:2:"Õ†";s:2:"Õ·";s:2:"Õ‡";s:2:"Õ¸";s:2:"Õˆ";s:2:"Õ¹";s:2:"Õ‰";s:2:"Õº";s:2:"ÕŠ";s:2:"Õ»";s:2:"Õ‹";s:2:"Õ¼";s:2:"ÕŒ";s:2:"Õ½";s:2:"Õ";s:2:"Õ¾";s:2:"ÕŽ";s:2:"Õ¿";s:2:"Õ";s:2:"Ö€";s:2:"Õ";s:2:"Ö";s:2:"Õ‘";s:2:"Ö‚";s:2:"Õ’";s:2:"Öƒ";s:2:"Õ“";s:2:"Ö„";s:2:"Õ”";s:2:"Ö…";s:2:"Õ•";s:2:"Ö†";s:2:"Õ–";s:3:"áµ¹";s:3:"ê½";s:3:"áµ½";s:3:"â±£";s:3:"á¸";s:3:"Ḁ";s:3:"ḃ";s:3:"Ḃ";s:3:"ḅ";s:3:"Ḅ";s:3:"ḇ";s:3:"Ḇ";s:3:"ḉ";s:3:"Ḉ";s:3:"ḋ";s:3:"Ḋ";s:3:"á¸";s:3:"Ḍ";s:3:"á¸";s:3:"Ḏ";s:3:"ḑ";s:3:"á¸";s:3:"ḓ";s:3:"Ḓ";s:3:"ḕ";s:3:"Ḕ";s:3:"ḗ";s:3:"Ḗ";s:3:"ḙ";s:3:"Ḙ";s:3:"ḛ";s:3:"Ḛ";s:3:"á¸";s:3:"Ḝ";s:3:"ḟ";s:3:"Ḟ";s:3:"ḡ";s:3:"Ḡ";s:3:"ḣ";s:3:"Ḣ";s:3:"ḥ";s:3:"Ḥ";s:3:"ḧ";s:3:"Ḧ";s:3:"ḩ";s:3:"Ḩ";s:3:"ḫ";s:3:"Ḫ";s:3:"ḭ";s:3:"Ḭ";s:3:"ḯ";s:3:"Ḯ";s:3:"ḱ";s:3:"Ḱ";s:3:"ḳ";s:3:"Ḳ";s:3:"ḵ";s:3:"Ḵ";s:3:"ḷ";s:3:"Ḷ";s:3:"ḹ";s:3:"Ḹ";s:3:"ḻ";s:3:"Ḻ";s:3:"ḽ";s:3:"Ḽ";s:3:"ḿ";s:3:"Ḿ";s:3:"á¹";s:3:"á¹€";s:3:"ṃ";s:3:"Ṃ";s:3:"á¹…";s:3:"Ṅ";s:3:"ṇ";s:3:"Ṇ";s:3:"ṉ";s:3:"Ṉ";s:3:"ṋ";s:3:"Ṋ";s:3:"á¹";s:3:"Ṍ";s:3:"á¹";s:3:"Ṏ";s:3:"ṑ";s:3:"á¹";s:3:"ṓ";s:3:"á¹’";s:3:"ṕ";s:3:"á¹”";s:3:"á¹—";s:3:"á¹–";s:3:"á¹™";s:3:"Ṙ";s:3:"á¹›";s:3:"Ṛ";s:3:"á¹";s:3:"Ṝ";s:3:"ṟ";s:3:"Ṟ";s:3:"ṡ";s:3:"á¹ ";s:3:"á¹£";s:3:"á¹¢";s:3:"á¹¥";s:3:"Ṥ";s:3:"á¹§";s:3:"Ṧ";s:3:"ṩ";s:3:"Ṩ";s:3:"ṫ";s:3:"Ṫ";s:3:"á¹­";s:3:"Ṭ";s:3:"ṯ";s:3:"á¹®";s:3:"á¹±";s:3:"á¹°";s:3:"á¹³";s:3:"á¹²";s:3:"á¹µ";s:3:"á¹´";s:3:"á¹·";s:3:"á¹¶";s:3:"á¹¹";s:3:"Ṹ";s:3:"á¹»";s:3:"Ṻ";s:3:"á¹½";s:3:"á¹¼";s:3:"ṿ";s:3:"á¹¾";s:3:"áº";s:3:"Ẁ";s:3:"ẃ";s:3:"Ẃ";s:3:"ẅ";s:3:"Ẅ";s:3:"ẇ";s:3:"Ẇ";s:3:"ẉ";s:3:"Ẉ";s:3:"ẋ";s:3:"Ẋ";s:3:"áº";s:3:"Ẍ";s:3:"áº";s:3:"Ẏ";s:3:"ẑ";s:3:"áº";s:3:"ẓ";s:3:"Ẓ";s:3:"ẕ";s:3:"Ẕ";s:3:"ẛ";s:3:"á¹ ";s:3:"ạ";s:3:"Ạ";s:3:"ả";s:3:"Ả";s:3:"ấ";s:3:"Ấ";s:3:"ầ";s:3:"Ầ";s:3:"ẩ";s:3:"Ẩ";s:3:"ẫ";s:3:"Ẫ";s:3:"ậ";s:3:"Ậ";s:3:"ắ";s:3:"Ắ";s:3:"ằ";s:3:"Ằ";s:3:"ẳ";s:3:"Ẳ";s:3:"ẵ";s:3:"Ẵ";s:3:"ặ";s:3:"Ặ";s:3:"ẹ";s:3:"Ẹ";s:3:"ẻ";s:3:"Ẻ";s:3:"ẽ";s:3:"Ẽ";s:3:"ế";s:3:"Ế";s:3:"á»";s:3:"Ề";s:3:"ể";s:3:"Ể";s:3:"á»…";s:3:"Ễ";s:3:"ệ";s:3:"Ệ";s:3:"ỉ";s:3:"Ỉ";s:3:"ị";s:3:"Ị";s:3:"á»";s:3:"Ọ";s:3:"á»";s:3:"Ỏ";s:3:"ố";s:3:"á»";s:3:"ồ";s:3:"á»’";s:3:"ổ";s:3:"á»”";s:3:"á»—";s:3:"á»–";s:3:"á»™";s:3:"Ộ";s:3:"á»›";s:3:"Ớ";s:3:"á»";s:3:"Ờ";s:3:"ở";s:3:"Ở";s:3:"ỡ";s:3:"á» ";s:3:"ợ";s:3:"Ợ";s:3:"ụ";s:3:"Ụ";s:3:"á»§";s:3:"Ủ";s:3:"ứ";s:3:"Ứ";s:3:"ừ";s:3:"Ừ";s:3:"á»­";s:3:"Ử";s:3:"ữ";s:3:"á»®";s:3:"á»±";s:3:"á»°";s:3:"ỳ";s:3:"Ỳ";s:3:"ỵ";s:3:"á»´";s:3:"á»·";s:3:"á»¶";s:3:"ỹ";s:3:"Ỹ";s:3:"á»»";s:3:"Ỻ";s:3:"ỽ";s:3:"Ỽ";s:3:"ỿ";s:3:"Ỿ";s:3:"á¼€";s:3:"Ἀ";s:3:"á¼";s:3:"Ἁ";s:3:"ἂ";s:3:"Ἂ";s:3:"ἃ";s:3:"Ἃ";s:3:"ἄ";s:3:"Ἄ";s:3:"á¼…";s:3:"á¼";s:3:"ἆ";s:3:"Ἆ";s:3:"ἇ";s:3:"á¼";s:3:"á¼";s:3:"Ἐ";s:3:"ἑ";s:3:"á¼™";s:3:"á¼’";s:3:"Ἒ";s:3:"ἓ";s:3:"á¼›";s:3:"á¼”";s:3:"Ἔ";s:3:"ἕ";s:3:"á¼";s:3:"á¼ ";s:3:"Ἠ";s:3:"ἡ";s:3:"Ἡ";s:3:"á¼¢";s:3:"Ἢ";s:3:"á¼£";s:3:"Ἣ";s:3:"ἤ";s:3:"Ἤ";s:3:"á¼¥";s:3:"á¼­";s:3:"ἦ";s:3:"á¼®";s:3:"á¼§";s:3:"Ἧ";s:3:"á¼°";s:3:"Ἰ";s:3:"á¼±";s:3:"á¼¹";s:3:"á¼²";s:3:"Ἲ";s:3:"á¼³";s:3:"á¼»";s:3:"á¼´";s:3:"á¼¼";s:3:"á¼µ";s:3:"á¼½";s:3:"á¼¶";s:3:"á¼¾";s:3:"á¼·";s:3:"Ἷ";s:3:"á½€";s:3:"Ὀ";s:3:"á½";s:3:"Ὁ";s:3:"ὂ";s:3:"Ὂ";s:3:"ὃ";s:3:"Ὃ";s:3:"ὄ";s:3:"Ὄ";s:3:"á½…";s:3:"á½";s:3:"ὑ";s:3:"á½™";s:3:"ὓ";s:3:"á½›";s:3:"ὕ";s:3:"á½";s:3:"á½—";s:3:"Ὗ";s:3:"á½ ";s:3:"Ὠ";s:3:"ὡ";s:3:"Ὡ";s:3:"á½¢";s:3:"Ὢ";s:3:"á½£";s:3:"Ὣ";s:3:"ὤ";s:3:"Ὤ";s:3:"á½¥";s:3:"á½­";s:3:"ὦ";s:3:"á½®";s:3:"á½§";s:3:"Ὧ";s:3:"á½°";s:3:"Ὰ";s:3:"á½±";s:3:"á¾»";s:3:"á½²";s:3:"Ὲ";s:3:"á½³";s:3:"Έ";s:3:"á½´";s:3:"Ὴ";s:3:"á½µ";s:3:"á¿‹";s:3:"á½¶";s:3:"Ὶ";s:3:"á½·";s:3:"á¿›";s:3:"ὸ";s:3:"Ὸ";s:3:"á½¹";s:3:"Ό";s:3:"ὺ";s:3:"Ὺ";s:3:"á½»";s:3:"á¿«";s:3:"á½¼";s:3:"Ὼ";s:3:"á½½";s:3:"á¿»";s:3:"á¾€";s:3:"ᾈ";s:3:"á¾";s:3:"ᾉ";s:3:"ᾂ";s:3:"ᾊ";s:3:"ᾃ";s:3:"ᾋ";s:3:"ᾄ";s:3:"ᾌ";s:3:"á¾…";s:3:"á¾";s:3:"ᾆ";s:3:"ᾎ";s:3:"ᾇ";s:3:"á¾";s:3:"á¾";s:3:"ᾘ";s:3:"ᾑ";s:3:"á¾™";s:3:"á¾’";s:3:"ᾚ";s:3:"ᾓ";s:3:"á¾›";s:3:"á¾”";s:3:"ᾜ";s:3:"ᾕ";s:3:"á¾";s:3:"á¾–";s:3:"ᾞ";s:3:"á¾—";s:3:"ᾟ";s:3:"á¾ ";s:3:"ᾨ";s:3:"ᾡ";s:3:"ᾩ";s:3:"á¾¢";s:3:"ᾪ";s:3:"á¾£";s:3:"ᾫ";s:3:"ᾤ";s:3:"ᾬ";s:3:"á¾¥";s:3:"á¾­";s:3:"ᾦ";s:3:"á¾®";s:3:"á¾§";s:3:"ᾯ";s:3:"á¾°";s:3:"Ᾰ";s:3:"á¾±";s:3:"á¾¹";s:3:"á¾³";s:3:"á¾¼";s:3:"á¾¾";s:2:"Ι";s:3:"ῃ";s:3:"ῌ";s:3:"á¿";s:3:"Ῐ";s:3:"á¿‘";s:3:"á¿™";s:3:"á¿ ";s:3:"Ῠ";s:3:"á¿¡";s:3:"á¿©";s:3:"á¿¥";s:3:"Ῥ";s:3:"ῳ";s:3:"ῼ";s:3:"â…Ž";s:3:"Ⅎ";s:3:"â…°";s:3:"â… ";s:3:"â…±";s:3:"â…¡";s:3:"â…²";s:3:"â…¢";s:3:"â…³";s:3:"â…£";s:3:"â…´";s:3:"â…¤";s:3:"â…µ";s:3:"â…¥";s:3:"â…¶";s:3:"â…¦";s:3:"â…·";s:3:"â…§";s:3:"â…¸";s:3:"â…¨";s:3:"â…¹";s:3:"â…©";s:3:"â…º";s:3:"â…ª";s:3:"â…»";s:3:"â…«";s:3:"â…¼";s:3:"â…¬";s:3:"â…½";s:3:"â…­";s:3:"â…¾";s:3:"â…®";s:3:"â…¿";s:3:"â…¯";s:3:"ↄ";s:3:"Ↄ";s:3:"â“";s:3:"â’¶";s:3:"â“‘";s:3:"â’·";s:3:"â“’";s:3:"â’¸";s:3:"â““";s:3:"â’¹";s:3:"â“”";s:3:"â’º";s:3:"â“•";s:3:"â’»";s:3:"â“–";s:3:"â’¼";s:3:"â“—";s:3:"â’½";s:3:"ⓘ";s:3:"â’¾";s:3:"â“™";s:3:"â’¿";s:3:"ⓚ";s:3:"â“€";s:3:"â“›";s:3:"â“";s:3:"ⓜ";s:3:"â“‚";s:3:"â“";s:3:"Ⓝ";s:3:"ⓞ";s:3:"â“„";s:3:"ⓟ";s:3:"â“…";s:3:"â“ ";s:3:"Ⓠ";s:3:"â“¡";s:3:"Ⓡ";s:3:"â“¢";s:3:"Ⓢ";s:3:"â“£";s:3:"Ⓣ";s:3:"ⓤ";s:3:"Ⓤ";s:3:"â“¥";s:3:"â“‹";s:3:"ⓦ";s:3:"Ⓦ";s:3:"â“§";s:3:"â“";s:3:"ⓨ";s:3:"Ⓨ";s:3:"â“©";s:3:"â“";s:3:"â°°";s:3:"â°€";s:3:"â°±";s:3:"â°";s:3:"â°²";s:3:"â°‚";s:3:"â°³";s:3:"â°ƒ";s:3:"â°´";s:3:"â°„";s:3:"â°µ";s:3:"â°…";s:3:"â°¶";s:3:"â°†";s:3:"â°·";s:3:"â°‡";s:3:"â°¸";s:3:"â°ˆ";s:3:"â°¹";s:3:"â°‰";s:3:"â°º";s:3:"â°Š";s:3:"â°»";s:3:"â°‹";s:3:"â°¼";s:3:"â°Œ";s:3:"â°½";s:3:"â°";s:3:"â°¾";s:3:"â°Ž";s:3:"â°¿";s:3:"â°";s:3:"â±€";s:3:"â°";s:3:"â±";s:3:"â°‘";s:3:"ⱂ";s:3:"â°’";s:3:"ⱃ";s:3:"â°“";s:3:"ⱄ";s:3:"â°”";s:3:"â±…";s:3:"â°•";s:3:"ⱆ";s:3:"â°–";s:3:"ⱇ";s:3:"â°—";s:3:"ⱈ";s:3:"â°˜";s:3:"ⱉ";s:3:"â°™";s:3:"ⱊ";s:3:"â°š";s:3:"ⱋ";s:3:"â°›";s:3:"ⱌ";s:3:"â°œ";s:3:"â±";s:3:"â°";s:3:"ⱎ";s:3:"â°ž";s:3:"â±";s:3:"â°Ÿ";s:3:"â±";s:3:"â° ";s:3:"ⱑ";s:3:"â°¡";s:3:"â±’";s:3:"â°¢";s:3:"ⱓ";s:3:"â°£";s:3:"â±”";s:3:"â°¤";s:3:"ⱕ";s:3:"â°¥";s:3:"â±–";s:3:"â°¦";s:3:"â±—";s:3:"â°§";s:3:"ⱘ";s:3:"â°¨";s:3:"â±™";s:3:"â°©";s:3:"ⱚ";s:3:"â°ª";s:3:"â±›";s:3:"â°«";s:3:"ⱜ";s:3:"â°¬";s:3:"â±";s:3:"â°­";s:3:"ⱞ";s:3:"â°®";s:3:"ⱡ";s:3:"â± ";s:3:"â±¥";s:2:"Ⱥ";s:3:"ⱦ";s:2:"Ⱦ";s:3:"ⱨ";s:3:"â±§";s:3:"ⱪ";s:3:"Ⱪ";s:3:"ⱬ";s:3:"Ⱬ";s:3:"â±³";s:3:"â±²";s:3:"â±¶";s:3:"â±µ";s:3:"â²";s:3:"â²€";s:3:"ⲃ";s:3:"Ⲃ";s:3:"â²…";s:3:"Ⲅ";s:3:"ⲇ";s:3:"Ⲇ";s:3:"ⲉ";s:3:"Ⲉ";s:3:"ⲋ";s:3:"Ⲋ";s:3:"â²";s:3:"Ⲍ";s:3:"â²";s:3:"Ⲏ";s:3:"ⲑ";s:3:"â²";s:3:"ⲓ";s:3:"â²’";s:3:"ⲕ";s:3:"â²”";s:3:"â²—";s:3:"â²–";s:3:"â²™";s:3:"Ⲙ";s:3:"â²›";s:3:"Ⲛ";s:3:"â²";s:3:"Ⲝ";s:3:"ⲟ";s:3:"Ⲟ";s:3:"ⲡ";s:3:"â² ";s:3:"â²£";s:3:"â²¢";s:3:"â²¥";s:3:"Ⲥ";s:3:"â²§";s:3:"Ⲧ";s:3:"ⲩ";s:3:"Ⲩ";s:3:"ⲫ";s:3:"Ⲫ";s:3:"â²­";s:3:"Ⲭ";s:3:"ⲯ";s:3:"â²®";s:3:"â²±";s:3:"â²°";s:3:"â²³";s:3:"â²²";s:3:"â²µ";s:3:"â²´";s:3:"â²·";s:3:"â²¶";s:3:"â²¹";s:3:"Ⲹ";s:3:"â²»";s:3:"Ⲻ";s:3:"â²½";s:3:"â²¼";s:3:"ⲿ";s:3:"â²¾";s:3:"â³";s:3:"â³€";s:3:"ⳃ";s:3:"Ⳃ";s:3:"â³…";s:3:"Ⳅ";s:3:"ⳇ";s:3:"Ⳇ";s:3:"ⳉ";s:3:"Ⳉ";s:3:"ⳋ";s:3:"Ⳋ";s:3:"â³";s:3:"Ⳍ";s:3:"â³";s:3:"Ⳏ";s:3:"ⳑ";s:3:"â³";s:3:"ⳓ";s:3:"â³’";s:3:"ⳕ";s:3:"â³”";s:3:"â³—";s:3:"â³–";s:3:"â³™";s:3:"Ⳙ";s:3:"â³›";s:3:"Ⳛ";s:3:"â³";s:3:"Ⳝ";s:3:"ⳟ";s:3:"Ⳟ";s:3:"ⳡ";s:3:"â³ ";s:3:"â³£";s:3:"â³¢";s:3:"ⳬ";s:3:"Ⳬ";s:3:"â³®";s:3:"â³­";s:3:"â³³";s:3:"â³²";s:3:"â´€";s:3:"á‚ ";s:3:"â´";s:3:"á‚¡";s:3:"â´‚";s:3:"á‚¢";s:3:"â´ƒ";s:3:"á‚£";s:3:"â´„";s:3:"Ⴄ";s:3:"â´…";s:3:"á‚¥";s:3:"â´†";s:3:"Ⴆ";s:3:"â´‡";s:3:"á‚§";s:3:"â´ˆ";s:3:"Ⴈ";s:3:"â´‰";s:3:"á‚©";s:3:"â´Š";s:3:"Ⴊ";s:3:"â´‹";s:3:"á‚«";s:3:"â´Œ";s:3:"Ⴌ";s:3:"â´";s:3:"á‚­";s:3:"â´Ž";s:3:"á‚®";s:3:"â´";s:3:"Ⴏ";s:3:"â´";s:3:"á‚°";s:3:"â´‘";s:3:"Ⴑ";s:3:"â´’";s:3:"Ⴒ";s:3:"â´“";s:3:"Ⴓ";s:3:"â´”";s:3:"á‚´";s:3:"â´•";s:3:"Ⴕ";s:3:"â´–";s:3:"á‚¶";s:3:"â´—";s:3:"á‚·";s:3:"â´˜";s:3:"Ⴘ";s:3:"â´™";s:3:"Ⴙ";s:3:"â´š";s:3:"Ⴚ";s:3:"â´›";s:3:"á‚»";s:3:"â´œ";s:3:"Ⴜ";s:3:"â´";s:3:"Ⴝ";s:3:"â´ž";s:3:"Ⴞ";s:3:"â´Ÿ";s:3:"á‚¿";s:3:"â´ ";s:3:"Ⴠ";s:3:"â´¡";s:3:"áƒ";s:3:"â´¢";s:3:"Ⴢ";s:3:"â´£";s:3:"Ⴣ";s:3:"â´¤";s:3:"Ⴤ";s:3:"â´¥";s:3:"Ⴥ";s:3:"â´§";s:3:"Ⴧ";s:3:"â´­";s:3:"áƒ";s:3:"ê™";s:3:"Ꙁ";s:3:"ꙃ";s:3:"Ꙃ";s:3:"ê™…";s:3:"Ꙅ";s:3:"ꙇ";s:3:"Ꙇ";s:3:"ꙉ";s:3:"Ꙉ";s:3:"ꙋ";s:3:"Ꙋ";s:3:"ê™";s:3:"Ꙍ";s:3:"ê™";s:3:"Ꙏ";s:3:"ꙑ";s:3:"ê™";s:3:"ꙓ";s:3:"ê™’";s:3:"ꙕ";s:3:"ê™”";s:3:"ê™—";s:3:"ê™–";s:3:"ê™™";s:3:"Ꙙ";s:3:"ê™›";s:3:"Ꙛ";s:3:"ê™";s:3:"Ꙝ";s:3:"ꙟ";s:3:"Ꙟ";s:3:"ꙡ";s:3:"ê™ ";s:3:"ꙣ";s:3:"Ꙣ";s:3:"ꙥ";s:3:"Ꙥ";s:3:"ê™§";s:3:"Ꙧ";s:3:"ꙩ";s:3:"Ꙩ";s:3:"ꙫ";s:3:"Ꙫ";s:3:"ê™­";s:3:"Ꙭ";s:3:"êš";s:3:"Ꚁ";s:3:"ꚃ";s:3:"êš‚";s:3:"êš…";s:3:"êš„";s:3:"ꚇ";s:3:"Ꚇ";s:3:"ꚉ";s:3:"Ꚉ";s:3:"êš‹";s:3:"Ꚋ";s:3:"êš";s:3:"Ꚍ";s:3:"êš";s:3:"Ꚏ";s:3:"êš‘";s:3:"êš";s:3:"êš“";s:3:"êš’";s:3:"êš•";s:3:"êš”";s:3:"êš—";s:3:"êš–";s:3:"ꜣ";s:3:"Ꜣ";s:3:"ꜥ";s:3:"Ꜥ";s:3:"ꜧ";s:3:"Ꜧ";s:3:"ꜩ";s:3:"Ꜩ";s:3:"ꜫ";s:3:"Ꜫ";s:3:"ꜭ";s:3:"Ꜭ";s:3:"ꜯ";s:3:"Ꜯ";s:3:"ꜳ";s:3:"Ꜳ";s:3:"ꜵ";s:3:"Ꜵ";s:3:"ꜷ";s:3:"Ꜷ";s:3:"ꜹ";s:3:"Ꜹ";s:3:"ꜻ";s:3:"Ꜻ";s:3:"ꜽ";s:3:"Ꜽ";s:3:"ꜿ";s:3:"Ꜿ";s:3:"ê";s:3:"ê€";s:3:"êƒ";s:3:"ê‚";s:3:"ê…";s:3:"ê„";s:3:"ê‡";s:3:"ê†";s:3:"ê‰";s:3:"êˆ";s:3:"ê‹";s:3:"êŠ";s:3:"ê";s:3:"êŒ";s:3:"ê";s:3:"êŽ";s:3:"ê‘";s:3:"ê";s:3:"ê“";s:3:"ê’";s:3:"ê•";s:3:"ê”";s:3:"ê—";s:3:"ê–";s:3:"ê™";s:3:"ê˜";s:3:"ê›";s:3:"êš";s:3:"ê";s:3:"êœ";s:3:"êŸ";s:3:"êž";s:3:"ê¡";s:3:"ê ";s:3:"ê£";s:3:"ê¢";s:3:"ê¥";s:3:"ê¤";s:3:"ê§";s:3:"ê¦";s:3:"ê©";s:3:"ê¨";s:3:"ê«";s:3:"êª";s:3:"ê­";s:3:"ê¬";s:3:"ê¯";s:3:"ê®";s:3:"êº";s:3:"ê¹";s:3:"ê¼";s:3:"ê»";s:3:"ê¿";s:3:"ê¾";s:3:"êž";s:3:"Ꞁ";s:3:"ꞃ";s:3:"êž‚";s:3:"êž…";s:3:"êž„";s:3:"ꞇ";s:3:"Ꞇ";s:3:"ꞌ";s:3:"êž‹";s:3:"êž‘";s:3:"êž";s:3:"êž“";s:3:"êž’";s:3:"êž¡";s:3:"êž ";s:3:"ꞣ";s:3:"Ꞣ";s:3:"ꞥ";s:3:"Ꞥ";s:3:"êž§";s:3:"Ꞧ";s:3:"êž©";s:3:"Ꞩ";s:3:"ï½";s:3:"A";s:3:"b";s:3:"ï¼¢";s:3:"c";s:3:"ï¼£";s:3:"d";s:3:"D";s:3:"ï½…";s:3:"ï¼¥";s:3:"f";s:3:"F";s:3:"g";s:3:"ï¼§";s:3:"h";s:3:"H";s:3:"i";s:3:"I";s:3:"j";s:3:"J";s:3:"k";s:3:"K";s:3:"l";s:3:"L";s:3:"ï½";s:3:"ï¼­";s:3:"n";s:3:"ï¼®";s:3:"ï½";s:3:"O";s:3:"ï½";s:3:"ï¼°";s:3:"q";s:3:"ï¼±";s:3:"ï½’";s:3:"ï¼²";s:3:"s";s:3:"ï¼³";s:3:"ï½”";s:3:"ï¼´";s:3:"u";s:3:"ï¼µ";s:3:"ï½–";s:3:"ï¼¶";s:3:"ï½—";s:3:"ï¼·";s:3:"x";s:3:"X";s:3:"ï½™";s:3:"ï¼¹";s:3:"z";s:3:"Z";s:4:"ð¨";s:4:"ð€";s:4:"ð©";s:4:"ð";s:4:"ðª";s:4:"ð‚";s:4:"ð«";s:4:"ðƒ";s:4:"ð¬";s:4:"ð„";s:4:"ð­";s:4:"ð…";s:4:"ð®";s:4:"ð†";s:4:"ð¯";s:4:"ð‡";s:4:"ð°";s:4:"ðˆ";s:4:"ð±";s:4:"ð‰";s:4:"ð²";s:4:"ðŠ";s:4:"ð³";s:4:"ð‹";s:4:"ð´";s:4:"ðŒ";s:4:"ðµ";s:4:"ð";s:4:"ð¶";s:4:"ðŽ";s:4:"ð·";s:4:"ð";s:4:"ð¸";s:4:"ð";s:4:"ð¹";s:4:"ð‘";s:4:"ðº";s:4:"ð’";s:4:"ð»";s:4:"ð“";s:4:"ð¼";s:4:"ð”";s:4:"ð½";s:4:"ð•";s:4:"ð¾";s:4:"ð–";s:4:"ð¿";s:4:"ð—";s:4:"ð‘€";s:4:"ð˜";s:4:"ð‘";s:4:"ð™";s:4:"ð‘‚";s:4:"ðš";s:4:"ð‘ƒ";s:4:"ð›";s:4:"ð‘„";s:4:"ðœ";s:4:"ð‘…";s:4:"ð";s:4:"ð‘†";s:4:"ðž";s:4:"ð‘‡";s:4:"ðŸ";s:4:"ð‘ˆ";s:4:"ð ";s:4:"ð‘‰";s:4:"ð¡";s:4:"ð‘Š";s:4:"ð¢";s:4:"ð‘‹";s:4:"ð£";s:4:"ð‘Œ";s:4:"ð¤";s:4:"ð‘";s:4:"ð¥";s:4:"ð‘Ž";s:4:"ð¦";s:4:"ð‘";s:4:"ð§";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/class/Patchwork/TurkishUtf8.php b/vendor/patchwork/utf8/class/Patchwork/TurkishUtf8.php new file mode 100644 index 0000000000..ef61ea9938 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/TurkishUtf8.php @@ -0,0 +1,112 @@ + $s) + { + if ('' === $s .= '') $s = '/^(?<=.)$/'; + else + { + $s = preg_quote($s, '/'); + $s = strtr($s, array( + 'i' => '(?-i:[iİ])', + 'İ' => '(?-i:[iİ])', + 'ı' => '(?-i:[ıI])', + 'I' => '(?-i:[ıI])', + )); + $s = "/{$s}/ui"; + } + + $search[$i] = $s; + } + + $subject = preg_replace($search, $replace, $subject, -1, $replace); + $count = $replace; + + return $subject; + } + + static function ucfirst($s) + { + if ('i' === substr($s, 0, 1)) return 'İ' . substr($s, 1); + else return parent::ucfirst($s); + } + + static function ucwords($s) + { + if (false !== strpos($s, 'i')) $s = preg_replace('/\bi/u', 'İ', $s); + return parent::ucwords($s); + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/Utf8.php b/vendor/patchwork/utf8/class/Patchwork/Utf8.php new file mode 100644 index 0000000000..f260679b3d --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/Utf8.php @@ -0,0 +1,602 @@ + $v) $var[$k] = static::filter($v, $normalization_form, $leading_combining); + break; + + case 'object': + foreach ($var as $k => $v) $var->$k = static::filter($v, $normalization_form, $leading_combining); + break; + + case 'string': + if (false !== strpos($var, "\r")) + { + // Workaround https://bugs.php.net/65732 + $var = str_replace("\r\n", "\n", $var); + $var = strtr($var, "\r", "\n"); + } + + if (preg_match('/[\x80-\xFF]/', $var)) + { + if (n::isNormalized($var, $normalization_form)) $n = ''; + else + { + $n = n::normalize($var, $normalization_form); + if (false === $n) $var = static::utf8_encode($var); + else $var = $n; + } + + if ($var[0] >= "\x80" && false !== $n && isset($leading_combining[0]) && preg_match('/^\p{Mn}/u', $var)) + { + // Prevent leading combining chars + // for NFC-safe concatenations. + $var = $leading_combining . $var; + } + } + break; + } + + return $var; + } + + // Unicode transformation for caseless matching + // see http://unicode.org/reports/tr21/tr21-5.html + + static function strtocasefold($s, $full = true) + { + $s = str_replace(self::$commonCaseFold[0], self::$commonCaseFold[1], $s); + + if ($full) + { + static $fullCaseFold = false; + $fullCaseFold || $fullCaseFold = static::getData('caseFolding_full'); + + $s = str_replace($fullCaseFold[0], $fullCaseFold[1], $s); + } + + return static::strtolower($s); + } + + // Generic case sensitive collation support for self::strnatcmp() + + static function strtonatfold($s) + { + $s = n::normalize($s, n::NFD); + return preg_replace('/\p{Mn}+/u', '', $s); + } + + // PHP string functions that need UTF-8 awareness + + static function filter_input($type, $var, $filter = FILTER_DEFAULT, $option = null) + { + if (4 > func_num_args()) $var = filter_input($type, $var, $filter); + else $var = filter_input($type, $var, $filter, $option); + + return static::filter($var); + } + + static function filter_input_array($type, $def = null, $add_empty = true) + { + if (2 > func_num_args()) $a = filter_input_array($type); + else $a = filter_input_array($type, $def, $add_empty); + + return static::filter($a); + } + + static function json_decode($json, $assoc = false, $depth = 512, $options = 0) + { +/**/ if (PHP_VERSION_ID < 50400) +/**/ { + $json = json_decode($json, $assoc, $depth); +/**/ } +/**/ else +/**/ { + $json = json_decode($json, $assoc, $depth, $options); +/**/ } + + return static::filter($json); + } + + static function substr($s, $start, $len = 2147483647) + { +/**/ static $bug62759; + +/**/ isset($bug62759) or $bug62759 = extension_loaded('intl') && 'à' === grapheme_substr('éà', 1, -2); + +/**/ if ($bug62759) +/**/ { + return PHP\Shim\Intl::grapheme_substr_workaround62759($s, $start, $len); +/**/ } +/**/ else +/**/ { + return grapheme_substr($s, $start, $len); +/**/ } + } + + static function strlen($s) {return grapheme_strlen($s);} + static function strpos ($s, $needle, $offset = 0) {return grapheme_strpos ($s, $needle, $offset);} + static function strrpos($s, $needle, $offset = 0) {return grapheme_strrpos($s, $needle, $offset);} + + static function stripos($s, $needle, $offset = 0) + { +/**/ if (50418 > PHP_VERSION_ID || 50500 == PHP_VERSION_ID) +/**/ { + // Don't use grapheme_stripos because of https://bugs.php.net/61860 + if (! preg_match('//u', $s .= '')) return false; + if ($offset < 0) $offset = 0; + if (! $needle = mb_stripos($s, $needle .= '', $offset, 'UTF-8')) return $needle; + return grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')); +/**/ } +/**/ else +/**/ { + return grapheme_stripos($s, $needle, $offset); +/**/ } + } + + static function strripos($s, $needle, $offset = 0) + { +/**/ if (50418 > PHP_VERSION_ID || 50500 == PHP_VERSION_ID) +/**/ { + // Don't use grapheme_strripos because of https://bugs.php.net/61860 + if (! preg_match('//u', $s .= '')) return false; + if ($offset < 0) $offset = 0; + if (! $needle = mb_strripos($s, $needle .= '', $offset, 'UTF-8')) return $needle; + return grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')); +/**/ } +/**/ else +/**/ { + return grapheme_strripos($s, $needle, $offset); +/**/ } + } + + static function stristr($s, $needle, $before_needle = false) + { + if ('' === $needle .= '') return false; + return mb_stristr($s, $needle, $before_needle, 'UTF-8'); + } + + static function strstr ($s, $needle, $before_needle = false) {return grapheme_strstr($s, $needle, $before_needle);} + static function strrchr ($s, $needle, $before_needle = false) {return mb_strrchr ($s, $needle, $before_needle, 'UTF-8');} + static function strrichr($s, $needle, $before_needle = false) {return mb_strrichr($s, $needle, $before_needle, 'UTF-8');} + + static function strtolower($s) {return mb_strtolower($s, 'UTF-8');} + static function strtoupper($s) {return mb_strtoupper($s, 'UTF-8');} + + static function wordwrap($s, $width = 75, $break = "\n", $cut = false) + { + if (false === wordwrap('-', $width, $break, $cut)) return false; + + is_string($break) or $break = (string) $break; + + $w = ''; + $s = explode($break, $s); + $iLen = count($s); + $chars = array(); + + if (1 === $iLen && '' === $s[0]) + return ''; + + for ($i = 0; $i < $iLen; ++$i) + { + if ($i) + { + $chars[] = $break; + $w .= '#'; + } + + $c = $s[$i]; + unset($s[$i]); + + foreach (self::str_split($c) as $c) + { + $chars[] = $c; + $w .= ' ' === $c ? ' ' : '?'; + } + } + + $s = ''; + $j = 0; + $b = $i = -1; + $w = wordwrap($w, $width, '#', $cut); + + while (false !== $b = strpos($w, '#', $b+1)) + { + for (++$i; $i < $b; ++$i) + { + $s .= $chars[$j]; + unset($chars[$j++]); + } + + if ($break === $chars[$j] || ' ' === $chars[$j]) unset($chars[$j++]); + $s .= $break; + } + + return $s . implode('', $chars); + } + + static function chr($c) + { + if (0x80 > $c %= 0x200000) return chr($c); + if (0x800 > $c) return chr(0xC0 | $c>>6) . chr(0x80 | $c & 0x3F); + if (0x10000 > $c) return chr(0xE0 | $c>>12) . chr(0x80 | $c>>6 & 0x3F) . chr(0x80 | $c & 0x3F); + return chr(0xF0 | $c>>18) . chr(0x80 | $c>>12 & 0x3F) . chr(0x80 | $c>>6 & 0x3F) . chr(0x80 | $c & 0x3F); + } + + static function count_chars($s, $mode = 0) + { + if (1 != $mode) user_error(__METHOD__ . '(): the only allowed $mode is 1', E_USER_WARNING); + $s = self::str_split($s); + return array_count_values($s); + } + + static function ltrim($s, $charlist = INF) + { + $charlist = INF === $charlist ? '\s' : self::rxClass($charlist); + return preg_replace("/^{$charlist}+/u", '', $s); + } + + static function ord($s) + { + $a = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $a) return (($a - 0xF0)<<18) + (($s[2] - 0x80)<<12) + (($s[3] - 0x80)<<6) + $s[4] - 0x80; + if (0xE0 <= $a) return (($a - 0xE0)<<12) + (($s[2] - 0x80)<<6) + $s[3] - 0x80; + if (0xC0 <= $a) return (($a - 0xC0)<<6) + $s[2] - 0x80; + return $a; + } + + static function rtrim($s, $charlist = INF) + { + $charlist = INF === $charlist ? '\s' : self::rxClass($charlist); + return preg_replace("/{$charlist}+$/u", '', $s); + } + + static function trim($s, $charlist = INF) {return self::rtrim(self::ltrim($s, $charlist), $charlist);} + + static function str_ireplace($search, $replace, $subject, &$count = null) + { + $search = (array) $search; + + foreach ($search as $i => $s) + { + if ('' === $s .= '') $s = '/^(?<=.)$/'; + else $s = '/' . preg_quote($s, '/') . '/ui'; + + $search[$i] = $s; + } + + $subject = preg_replace($search, $replace, $subject, -1, $replace); + $count = $replace; + + return $subject; + } + + static function str_pad($s, $len, $pad = ' ', $type = STR_PAD_RIGHT) + { + $slen = grapheme_strlen($s); + if ($len <= $slen) return $s; + + $padlen = grapheme_strlen($pad); + $freelen = $len - $slen; + $len = $freelen % $padlen; + + if (STR_PAD_RIGHT == $type) return $s . str_repeat($pad, $freelen / $padlen) . ($len ? grapheme_substr($pad, 0, $len) : ''); + if (STR_PAD_LEFT == $type) return str_repeat($pad, $freelen / $padlen) . ($len ? grapheme_substr($pad, 0, $len) : '') . $s; + if (STR_PAD_BOTH == $type) + { + $freelen /= 2; + + $type = ceil($freelen); + $len = $type % $padlen; + $s .= str_repeat($pad, $type / $padlen) . ($len ? grapheme_substr($pad, 0, $len) : ''); + + $type = floor($freelen); + $len = $type % $padlen; + return str_repeat($pad, $type / $padlen) . ($len ? grapheme_substr($pad, 0, $len) : '') . $s; + } + + user_error(__METHOD__ . '(): Padding type has to be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH', E_USER_WARNING); + } + + static function str_shuffle($s) + { + $s = self::str_split($s); + shuffle($s); + return implode('', $s); + } + + static function str_split($s, $len = 1) + { + if (1 > $len = (int) $len) + { + $len = func_get_arg(1); + return str_split($s, $len); + } + +/**/ if (extension_loaded('intl')) +/**/ { + $a = array(); + $p = 0; + $l = strlen($s); + + while ($p < $l) $a[] = grapheme_extract($s, 1, GRAPHEME_EXTR_COUNT, $p, $p); +/**/ } +/**/ else +/**/ { + preg_match_all('/' . GRAPHEME_CLUSTER_RX . '/u', $s, $a); + $a = $a[0]; +/**/ } + + if (1 == $len) return $a; + + $s = array(); + $p = -1; + + foreach ($a as $l => $a) + { + if ($l % $len) $s[$p] .= $a; + else $s[++$p] = $a; + } + + return $s; + } + + static function str_word_count($s, $format = 0, $charlist = '') + { + $charlist = self::rxClass($charlist, '\pL'); + $s = preg_split("/({$charlist}+(?:[\p{Pd}’']{$charlist}+)*)/u", $s, -1, PREG_SPLIT_DELIM_CAPTURE); + + $charlist = array(); + $len = count($s); + + if (1 == $format) for ($i = 1; $i < $len; $i+=2) $charlist[] = $s[$i]; + else if (2 == $format) + { + $offset = grapheme_strlen($s[0]); + for ($i = 1; $i < $len; $i+=2) + { + $charlist[$offset] = $s[$i]; + $offset += grapheme_strlen($s[$i]) + grapheme_strlen($s[$i+1]); + } + } + else $charlist = ($len - 1) / 2; + + return $charlist; + } + + static function strcmp ($a, $b) {return $a . '' === $b . '' ? 0 : strcmp(n::normalize($a, n::NFD), n::normalize($b, n::NFD));} + static function strnatcmp ($a, $b) {return $a . '' === $b . '' ? 0 : strnatcmp(self::strtonatfold($a), self::strtonatfold($b));} + static function strcasecmp ($a, $b) {return self::strcmp (static::strtocasefold($a), static::strtocasefold($b));} + static function strnatcasecmp($a, $b) {return self::strnatcmp(static::strtocasefold($a), static::strtocasefold($b));} + static function strncasecmp ($a, $b, $len) {return self::strncmp(static::strtocasefold($a), static::strtocasefold($b), $len);} + static function strncmp ($a, $b, $len) {return self::strcmp(self::substr($a, 0, $len), self::substr($b, 0, $len));} + + static function strcspn($s, $charlist, $start = 0, $len = 2147483647) + { + if ('' === $charlist .= '') return null; + if ($start || 2147483647 != $len) $s = self::substr($s, $start, $len); + + return preg_match('/^(.*?)' . self::rxClass($charlist) . '/us', $s, $len) ? grapheme_strlen($len[1]) : grapheme_strlen($s); + } + + static function strpbrk($s, $charlist) + { + if (preg_match('/' . self::rxClass($charlist) . '/us', $s, $m)) return substr($s, strpos($s, $m[0])); + else return false; + } + + static function strrev($s) + { + $s = self::str_split($s); + return implode('', array_reverse($s)); + } + + static function strspn($s, $mask, $start = 0, $len = 2147483647) + { + if ($start || 2147483647 != $len) $s = self::substr($s, $start, $len); + return preg_match('/^' . self::rxClass($mask) . '+/u', $s, $s) ? grapheme_strlen($s[0]) : 0; + } + + static function strtr($s, $from, $to = INF) + { + if (INF !== $to) + { + $from = self::str_split($from); + $to = self::str_split($to); + + $a = count($from); + $b = count($to); + + if ($a > $b) $from = array_slice($from, 0, $b); + else if ($a < $b) $to = array_slice($to , 0, $a); + + $from = array_combine($from, $to); + } + + return strtr($s, $from); + } + + static function substr_compare($a, $b, $offset, $len = 2147483647, $i = 0) + { + $a = self::substr($a, $offset, $len); + return $i ? static::strcasecmp($a, $b) : self::strcmp($a, $b); + } + + static function substr_count($s, $needle, $offset = 0, $len = 2147483647) + { + return substr_count(self::substr($s, $offset, $len), $needle); + } + + static function substr_replace($s, $replace, $start, $len = 2147483647) + { + $s = self::str_split($s); + $replace = self::str_split($replace); + array_splice($s, $start, $len, $replace); + return implode('', $s); + } + + static function ucfirst($s) + { + $c = iconv_substr($s, 0, 1, 'UTF-8'); + return static::ucwords($c) . substr($s, strlen($c)); + } + + static function lcfirst($s) + { + $c = iconv_substr($s, 0, 1, 'UTF-8'); + return static::strtolower($c) . substr($s, strlen($c)); + } + + static function ucwords($s) + { + return mb_convert_case($s, MB_CASE_TITLE, 'UTF-8'); + } + + static function number_format($number, $decimals = 0, $dec_point = '.', $thousands_sep = ',') + { +/**/ if (PHP_VERSION_ID < 50400) +/**/ { + if (isset($thousands_sep[1]) || isset($dec_point[1])) + { + return str_replace( + array('.', ','), + array($dec_point, $thousands_sep), + number_format($number, $decimals, '.', ',') + ); + } +/**/ } + + return number_format($number, $decimals, $dec_point, $thousands_sep); + } + + static function utf8_encode($s) + { + $s = utf8_encode($s); + if (false === strpos($s, "\xC2")) return $s; + else return str_replace(self::$cp1252, self::$utf8, $s); + } + + static function utf8_decode($s) + { + $s = str_replace(self::$utf8, self::$cp1252, $s); + return utf8_decode($s); + } + + + protected static function rxClass($s, $class = '') + { + $class = array($class); + + foreach (self::str_split($s) as $s) + { + if ('-' === $s) $class[0] = '-' . $class[0]; + else if (!isset($s[2])) $class[0] .= preg_quote($s, '/'); + else if (1 === iconv_strlen($s, 'UTF-8')) $class[0] .= $s; + else $class[] = $s; + } + + $class[0] = '[' . $class[0] . ']'; + + if (1 === count($class)) return $class[0]; + else return '(?:' . implode('|', $class) . ')'; + } + + protected static function getData($file) + { + $file = __DIR__ . '/Utf8/data/' . $file . '.ser'; + if (file_exists($file)) return unserialize(file_get_contents($file)); + else return false; + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/Utf8/Bootup.php b/vendor/patchwork/utf8/class/Patchwork/Utf8/Bootup.php new file mode 100644 index 0000000000..fc75d67550 --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/Utf8/Bootup.php @@ -0,0 +1,260 @@ += "\x80" && false !== $n && isset($leading_combining[0]) && preg_match('/^\p{Mn}/u', $s)) + { + // Prevent leading combining chars + // for NFC-safe concatenations. + $s = $leading_combining . $s; + } + } + + return $s; + } +} diff --git a/vendor/patchwork/utf8/class/Patchwork/Utf8/Bootup/iconv.php b/vendor/patchwork/utf8/class/Patchwork/Utf8/Bootup/iconv.php new file mode 100644 index 0000000000..cd29d86e3f --- /dev/null +++ b/vendor/patchwork/utf8/class/Patchwork/Utf8/Bootup/iconv.php @@ -0,0 +1,48 @@ +";s:3:"《";s:2:"<<";s:3:"》";s:2:">>";s:3:"〔";s:1:"[";s:3:"〕";s:1:"]";s:3:"〘";s:1:"[";s:3:"〙";s:1:"]";s:3:"〚";s:1:"[";s:3:"〛";s:1:"]";s:3:"︑";s:1:",";s:3:"︒";s:1:".";s:3:"︹";s:1:"[";s:3:"︺";s:1:"]";s:3:"︽";s:2:"<<";s:3:"︾";s:2:">>";s:3:"︿";s:1:"<";s:3:"ï¹€";s:1:">";s:2:"÷";s:1:"/";s:3:"∥";s:2:"||";s:3:"⦅";s:2:"((";s:3:"⦆";s:2:"))";} \ No newline at end of file diff --git a/vendor/patchwork/utf8/composer.json b/vendor/patchwork/utf8/composer.json new file mode 100644 index 0000000000..2d8efa33f6 --- /dev/null +++ b/vendor/patchwork/utf8/composer.json @@ -0,0 +1,30 @@ +{ + "name": "patchwork/utf8", + "type": "library", + "description": "Extensive, portable and performant handling of UTF-8 and grapheme clusters for PHP", + "keywords": ["utf8","utf-8","unicode","i18n"], + "homepage": "https://github.com/nicolas-grekas/Patchwork-UTF8", + "license": "(Apache-2.0 or GPL-2.0)", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com", + "role": "Developer" + } + ], + "require": { + "php": ">=5.3.0", + "lib-pcre": ">=7.3" + }, + "suggest": { + "ext-intl": "Use Intl for best performance", + "ext-iconv": "Use iconv for best performance", + "ext-mbstring": "Use Mbstring for best performance" + }, + "autoload": { + "psr-0": { + "Patchwork": "class/", + "Normalizer": "class/" + } + } +} diff --git a/vendor/patchwork/utf8/phpunit.xml.dist b/vendor/patchwork/utf8/phpunit.xml.dist new file mode 100644 index 0000000000..b73ebd81d1 --- /dev/null +++ b/vendor/patchwork/utf8/phpunit.xml.dist @@ -0,0 +1,21 @@ + + + + + + + ./tests/Patchwork/ + ./tests/php-utf8/ + ./tests/unicode/ + + + + + + unicode + + + + diff --git a/vendor/sabre/vobject/.gitignore b/vendor/sabre/vobject/.gitignore new file mode 100644 index 0000000000..d50ac247da --- /dev/null +++ b/vendor/sabre/vobject/.gitignore @@ -0,0 +1,14 @@ +# Composer stuff +vendor/ +composer.lock +tests/cov/ +tests/temp + +#vim +.*.swp + +#binaries +bin/phpunit + +# Development stuff +testdata/ diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml new file mode 100644 index 0000000000..adc3da3091 --- /dev/null +++ b/vendor/sabre/vobject/.travis.yml @@ -0,0 +1,21 @@ +language: php +php: + - 5.3 + - 5.4 + - 5.5 + - 5.5.9 + - 5.5.10 + - 5.6 + - hhvm + - hhvm-nightly + +matrix: + allow_failures: + - php: 5.5.10 + - php: 5.6 + - php: hhvm-nightly + +script: + - phpunit --configuration tests/phpunit.xml + +before_script: composer install diff --git a/vendor/sabre/vobject/ChangeLog.md b/vendor/sabre/vobject/ChangeLog.md new file mode 100644 index 0000000000..7c06ab45b7 --- /dev/null +++ b/vendor/sabre/vobject/ChangeLog.md @@ -0,0 +1,337 @@ +ChangeLog +========= + +3.2.0 (2014-04-02) +------------------ + +* Now hhvm compatible! +* The validator can now detect a _lot_ more problems. Many rules for both + iCalendar and vCard were added. +* Added: bin/generate_vcards, a utility to generate random vcards for testing + purposes. Patches are welcome to add more data. +* Updated: Windows timezone mapping to latest version from unicode.org +* Changed: The timezone maps are now loaded in from external files, in + lib/Sabre/VObject/timezonedata. +* Added: Fixing badly encoded URL's from google contacts vcards. +* Fixed: Issue #68. Couldn't decode properties ending in a colon. +* Fixed: Issue #72. RecurrenceIterator should respect timezone in the UNTIL + clause. +* Fixed: Issue #67. BYMONTH limit on DAILY recurrences. +* Fixed: Issue #26. Return a more descriptive error when coming across broken + BYDAY rules. +* Fixed: Issue #28. Incorrect timezone detection for some timezones. +* Fixed: Issue #70. Casting a parameter with a null value to string would fail. +* Added: Support for rfc6715 and rfc6474. +* Added: Support for DateTime objects in the VCard DATE-AND-OR-TIME property. +* Added: UUIDUtil, for easily creating unique identifiers. +* Fixed: Issue #83. Creating new VALUE=DATE objects using php's DateTime. +* Fixed: Issue #86. Don't go into an infinite loop when php errors are + disabled and an invalid file is read. + +3.1.4 (2014-03-30) +------------------ +* Fixed: Issue #87: Several compatibility fixes related to timezone handling + changes in PHP 5.5.10. + + +3.1.3 (2013-10-02) +------------------ + +* Fixed: Support from properties from draft-daboo-valarm-extensions-04. Issue + #56. +* Fixed: Issue #54. Parsing a stream of multiple vcards separated by more than + one newline. Thanks @Vedmak for the patch. +* Fixed: Serializing vcard 2.1 parameters with no name caused a literal '1' to + be inserted. +* Added: VCardConverter removed properties that are no longer supported in vCard + 4.0. +* Added: vCards with a minimum number of values (such as N), but don't have that + many, are now automatically padded with empty components. +* Added: The vCard validator now also checks for a minimum number of components, + and has the ability to repair these. +* Added: Some support for vCard 2.1 in the VCard converter, to upgrade to vCard + 3.0 or 4.0. +* Fixed: Issue 60 Use Document::$componentMap when instantiating the top-level + VCalendar and VCard components. +* Fixed: Issue 62: Parsing iCalendar parameters with no value. +* Added: --forgiving option to vobject utility. +* Fixed: Compound properties such as ADR were not correctly split up in vCard + 2.1 quoted printable-encoded properties. +* Fixed: Issue 64: Encoding of binary properties of converted vCards. Thanks + @DominikTo for the patch. + + +3.1.2 (2013-08-13) +------------------ + +* Fixed: Setting correct property group on VCard conversion + + +3.1.1 (2013-08-02) +------------------ + +* Fixed: Issue #53. A regression in RecurrenceIterator. + + +3.1.0 (2013-07-27) +------------------ + +* Added: bad-ass new cli debugging utility (in bin/vobject). +* Added: jCal and jCard parser. +* Fixed: URI properties should not escape ; and ,. +* Fixed: VCard 4 documents now correctly use URI as a default value-type for + PHOTO and others. BINARY no longer exists in vCard 4. +* Added: Utility to convert between 2.1, 3.0 and 4.0 vCards. +* Added: You can now add() multiple parameters to a property in one call. +* Added: Parameter::has() for easily checking if a parameter value exists. +* Added: VCard::preferred() to find a preferred email, phone number, etc for a + contact. +* Changed: All $duration properties are now public. +* Added: A few validators for iCalendar documents. +* Fixed: Issue #50. RecurrenceIterator gives incorrect result when exception + events are out of order in the iCalendar file. +* Fixed: Issue #48. Overridden events in the recurrence iterator that were past + the UNTIL date were ignored. +* Added: getDuration for DURATION values such as TRIGGER. Thanks to + @SimonSimCity. +* Fixed: Issue #52. vCard 2.1 parameters with no name may lose values if there's + more than 1. Thanks to @Vedmak. + + +3.0.0 (2013-06-21) +------------------ + +* Fixed: includes.php file was still broken. Our tool to generate it had some + bugs. + + +3.0.0-beta4 (2013-06-21) +------------------------ + +* Fixed: includes.php was no longer up to date. + + +3.0.0-beta3 (2013-06-17) +------------------------ + +* Added: OPTION_FORGIVING now also allows slashes in property names. +* Fixed: DateTimeParser no longer fails on dates with years < 1000 & > 4999 +* Fixed: Issue 36: Workaround for the recurrenceiterator and caldav events with + a missing base event. +* Fixed: jCard encoding of TIME properties. +* Fixed: jCal encoding of REQUEST-STATUS, GEO and PERIOD values. + + +3.0.0-beta2 (2013-06-10) +------------------------ + +* Fixed: Corrected includes.php file. +* Fixed: vCard date-time parser supported extended-format dates as well. +* Changed: Properties have been moved to an ICalendar or VCard directory. +* Fixed: Couldn't parse vCard 3 extended format dates and times. +* Fixed: Couldn't export jCard DATE values correctly. +* Fixed: Recursive loop in ICalendar\DateTime property. + + +3.0.0-beta1 (2013-06-07) +------------------------ + +* Added: jsonSerialize() for creating jCal and jCard documents. +* Added: helper method to parse vCard dates and times. +* Added: Specialized classes for FLOAT, LANGUAGE-TAG, TIME, TIMESTAMP, + DATE-AND-OR-TIME, CAL-ADDRESS, UNKNOWN and UTC-OFFSET properties. +* Removed: CommaSeparatedText property. Now included into Text. +* Fixed: Multiple parameters with the same name are now correctly encoded. +* Fixed: Parameter values containing a comma are now enclosed in double-quotes. +* Fixed: Iterating parameter values should now fully work as expected. +* Fixed: Support for vCard 2.1 nameless parameters. +* Changed: $valueMap, $componentMap and $propertyMap now all use fully-qualified + class names, so they are actually overridable. +* Fixed: Updating DATE-TIME to DATE values now behaves like expected. + + +3.0.0-alpha4 (2013-05-31) +------------------------- + +* Added: It's now possible to send parser options to the splitter classes. +* Added: A few tweaks to improve component and property creation. + + +3.0.0-alpha3 (2013-05-13) +------------------------- + +* Changed: propertyMap, valueMap and componentMap are now static properties. +* Changed: Component::remove() will throw an exception when trying to a node + that's not a child of said component. +* Added: Splitter objects are now faster, line numbers are accurately reported + and use less memory. +* Added: MimeDir parser can now continue parsing with the same stream buffer. +* Fixed: vobjectvalidate.php is operational again. +* Fixed: \r is properly stripped in text values. +* Fixed: QUOTED-PRINTABLE is now correctly encoded as well as encoded, for + vCards 2.1. +* Fixed: Parser assumes vCard 2.1, if no version was supplied. + + +3.0.0-alpha2 (2013-05-22) +------------------------- + +* Fixed: vCard URL properties were referencing a non-existant class. + + +3.0.0-alpha1 (2013-05-21) +------------------------- + +* Fixed: Now correctly dealing with escaping of properties. This solves the + problem with double-backslashes where they don't belong. +* Added: Easy support for properties with more than one value, using setParts + and getParts. +* Added: Support for broken 2.1 vCards produced by microsoft. +* Added: Automatically decoding quoted-printable values. +* Added: Automatically decoding base64 values. +* Added: Decoding RFC6868 parameter values (uses ^ as an escape character). +* Added: Fancy new MimeDir parser that can also parse streams. +* Added: Automatically mapping many, many properties to a property-class with + specialized API's. +* Added: remove() method for easily removing properties and sub-components + components. +* Changed: Components, Properties and Parameters can no longer be created with + Component::create, Property::create and Parameter::create. They must instead + be created through the root component. (A VCalendar or VCard object). +* Changed: API for DateTime properties has slightly changed. +* Changed: the ->value property is now protected everywhere. Use getParts() and + getValue() instead. +* BC Break: No support for mac newlines (\r). Never came across these anyway. +* Added: add() method to the Property class. +* Added: It's now possible to easy set multi-value properties as arrays. +* Added: When setting date-time properties you can just pass PHP's DateTime + object. +* Added: New components automatically get a bunch of default properties, such as + VERSION and CALSCALE. +* Added: You can add new sub-components much quicker with the magic setters, and + add() method. + + +2.1.4 (2014-03-30) +------------------ + +* Fixed: Issue #87: Several compatibility fixes related to timezone handling + changes in PHP 5.5.10. + + +2.1.3 (2013-10-02) +------------------ + +* Fixed: Issue #55. \r must be stripped from property values. +* Fixed: Issue #65. Putting quotes around parameter values that contain a colon. + + +2.1.2 (2013-08-02) +------------------ + +* Fixed: Issue #53. A regression in RecurrenceIterator. + + +2.1.1 (2013-07-27) +------------------ + +* Fixed: Issue #50. RecurrenceIterator gives incorrect result when exception + events are out of order in the iCalendar file. +* Fixed: Issue #48. Overridden events in the recurrence iterator that were past + the UNTIL date were ignored. + + +2.1.0 (2013-06-17) +------------------ + +* This version is fully backwards compatible with 2.0.\*. However, it contains a + few new API's that mimic the VObject 3 API. This allows it to be used a + 'bridge' version. Specifically, this new version exists so SabreDAV 1.7 and + 1.8 can run with both the 2 and 3 versions of this library. +* Added: Property\DateTime::hasTime(). +* Added: Property\MultiDateTime::hasTime(). +* Added: Property::getValue(). +* Added: Document class. +* Added: Document::createComponent and Document::createProperty. +* Added: Parameter::getValue(). + + +2.0.7 (2013-03-05) +------------------ + +* Fixed: Microsoft re-uses their magic numbers for different timezones, + specifically id 2 for both Sarajevo and Lisbon). A workaround was added to + deal with this. + + +2.0.6 (2013-02-17) +------------------ + +* Fixed: The reader now properly parses parameters without a value. + + +2.0.5 (2012-11-05) +------------------ + +* Fixed: The FreeBusyGenerator is now properly using the factory methods for + creation of components and properties. + + +2.0.4 (2012-11-02) +------------------ + +* Added: Known Lotus Notes / Domino timezone id's. + + +2.0.3 (2012-10-29) +------------------ + +* Added: Support for 'GMT+????' format in TZID's. +* Added: Support for formats like SystemV/EST5EDT in TZID's. +* Fixed: RecurrenceIterator now repairs recurrence rules where UNTIL < DTSTART. +* Added: Support for BYHOUR in FREQ=DAILY (@hollodk). +* Added: Support for BYHOUR and BYDAY in FREQ=WEEKLY. + + +2.0.2 (2012-10-06) +------------------ + +* Added: includes.php file, to load the entire library in one go. +* Fixed: A problem with determining alarm triggers for TODO's. + + +2.0.1 (2012-09-22) +------------------ + +* Removed: Element class. It wasn't used. +* Added: Basic validation and repair methods for broken input data. +* Fixed: RecurrenceIterator could infinitely loop when an INTERVAL of 0 was + specified. +* Added: A cli script that can validate and automatically repair vcards and + iCalendar objects. +* Added: A new 'Compound' property, that can automatically split up parts for + properties such as N, ADR, ORG and CATEGORIES. +* Added: Splitter classes, that can split up large objects (such as exports) + into individual objects (thanks @DominikTO and @armin-hackmann). +* Added: VFREEBUSY component, which allows easily checking wether timeslots are + available. +* Added: The Reader class now has a 'FORGIVING' option, which allows it to parse + properties with incorrect characters in the name (at this time, it just allows + underscores). +* Added: Also added the 'IGNORE_INVALID_LINES' option, to completely disregard + any invalid lines. +* Fixed: A bug in Windows timezone-id mappings for times created in Greenlands + timezone (sorry Greenlanders! I do care!). +* Fixed: DTEND was not generated correctly for VFREEBUSY reports. +* Fixed: Parser is at least 25% faster with real-world data. + + +2.0.0 (2012-08-08) +------------------ + +* VObject is now a separate project from SabreDAV. See the SabreDAV changelog + for version information before 2.0. +* New: VObject library now uses PHP 5.3 namespaces. +* New: It's possible to specify lists of parameters when constructing + properties. +* New: made it easier to construct the FreeBusyGenerator. diff --git a/vendor/sabre/vobject/LICENSE b/vendor/sabre/vobject/LICENSE new file mode 100644 index 0000000000..628c60c78f --- /dev/null +++ b/vendor/sabre/vobject/LICENSE @@ -0,0 +1,27 @@ +Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Sabre nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sabre/vobject/README.md b/vendor/sabre/vobject/README.md new file mode 100644 index 0000000000..009b7e4006 --- /dev/null +++ b/vendor/sabre/vobject/README.md @@ -0,0 +1,47 @@ +SabreTooth VObject library +========================== + +The VObject library allows you to easily parse and manipulate [iCalendar](https://tools.ietf.org/html/rfc5545) +and [vCard](https://tools.ietf.org/html/rfc6350) objects using PHP. +The goal of the VObject library is to create a very complete library, with an easy to use API. + +This project is a spin-off from [SabreDAV](http://code.google.com/p/sabredav/), where it has +been used for several years. The VObject library has 100% unittest coverage. + +Build status +------------ + +| branch | status | +| ------ | ------ | +| master | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.png?branch=master)](https://travis-ci.org/fruux/sabre-vobject) | +| 2.1 | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.png?branch=2.1)](https://travis-ci.org/fruux/sabre-vobject) | +| 2.0 | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.png?branch=2.0)](https://travis-ci.org/fruux/sabre-vobject) | + + +Installation +------------ + +VObject requires PHP 5.3, and should be installed using composer. +The general composer instructions can be found on the [composer website](http://getcomposer.org/doc/00-intro.md composer website). + +After that, just declare the vobject dependency as follows: + +``` +"require" : { + "sabre/vobject" : "~3.1" +} +``` + +Then, run `composer.phar update` and you should be good. + +Usage +----- + +* [3.x documentation](doc/usage_3.md) +* [2.x documentation](doc/usage_2.md) +* [Migrating from 2.x to 3.x](doc/MigratingFrom2to3.md) + +Made at fruux +------------- + +This library is being developed by [fruux](https://fruux.com/). Drop us a line for commercial services or enterprise support. diff --git a/vendor/sabre/vobject/bin/bench.php b/vendor/sabre/vobject/bin/bench.php new file mode 100755 index 0000000000..b949c8ea45 --- /dev/null +++ b/vendor/sabre/vobject/bin/bench.php @@ -0,0 +1,12 @@ +#!/usr/bin/env php +xpath('//mapZone') as $mapZone) { + + $from = (string)$mapZone['other']; + $to = (string)$mapZone['type']; + + list($to) = explode(' ', $to, 2); + + if (!isset($map[$from])) { + $map[$from] = $to; + } + +} + +ksort($map); +echo "Writing to: $outputFile\n"; + +$f = fopen($outputFile,'w'); +fwrite($f, " testdata.vcf + +HI; + + fwrite(STDERR, $help); + exit(2); +} + +$count = (int)$argv[1]; +if ($count < 1) { + fwrite(STDERR, "Count must be at least 1\n"); + exit(2); +} + +fwrite(STDERR, "sabre/vobject " . Version::VERSION . "\n"); +fwrite(STDERR, "Generating " . $count . " vcards in vCard 4.0 format\n"); + +/** + * The following list is just some random data we compiled from various + * sources online. + * + * Very little thought went into compiling this list, and certainly nothing + * political or ethical. + * + * We would _love_ more additions to this to add more variation to this list. + * + * Send us PR's and don't be shy adding your own first and last name for fun. + */ + +$sets = [ + "nl" => [ + "country" => "Netherlands", + "boys" => [ + "Anno", + "Bram", + "Daan", + "Evert", + "Finn", + "Jayden", + "Jens", + "Jesse", + "Levi", + "Lucas", + "Luuk", + "Milan", + "René", + "Sem", + "Sibrand", + "Willem", + ], + "girls" => [ + "Celia", + "Emma", + "Fenna", + "Geke", + "Inge", + "Julia", + "Lisa", + "Lotte", + "Mila", + "Sara", + "Sophie", + "Tess", + "Zoë", + ], + "last" => [ + "Bakker", + "Bos", + "De Boer", + "De Groot", + "De Jong", + "De Vries", + "Jansen", + "Janssen", + "Meyer", + "Mulder", + "Peters", + "Smit", + "Van Dijk", + "Van den Berg", + "Visser", + "Vos", + ], + ], + "us" => [ + "country" => "United States", + "boys" => [ + "Aiden", + "Alexander", + "Charles", + "David", + "Ethan", + "Jacob", + "James", + "Jayden", + "John", + "Joseph", + "Liam", + "Mason", + "Michael", + "Noah", + "Richard", + "Robert", + "Thomas", + "William", + ], + "girls" => [ + "Ava", + "Barbara", + "Chloe", + "Dorothy", + "Elizabeth", + "Emily", + "Emma", + "Isabella", + "Jennifer", + "Lily", + "Linda", + "Margaret", + "Maria", + "Mary", + "Mia", + "Olivia", + "Patricia", + "Roxy", + "Sophia", + "Susan", + "Zoe", + ], + "last" => [ + "Smith", + "Johnson", + "Williams", + "Jones", + "Brown", + "Davis", + "Miller", + "Wilson", + "Moore", + "Taylor", + "Anderson", + "Thomas", + "Jackson", + "White", + "Harris", + "Martin", + "Thompson", + "Garcia", + "Martinez", + "Robinson", + ], + ], +]; + +$current = 0; + +$r = function($arr) { + + return $arr[mt_rand(0,count($arr)-1)]; + +}; + +$bdayStart = strtotime('-85 years'); +$bdayEnd = strtotime('-20 years'); + +while($current < $count) { + + $current++; + fwrite(STDERR, "\033[100D$current/$count"); + + $country = array_rand($sets); + $gender = mt_rand(0,1)?'girls':'boys'; + + $vcard = new Component\VCard([ + 'VERSION' => '4.0', + 'FN' => $r($sets[$country][$gender]) . ' ' . $r($sets[$country]['last']), + 'UID' => UUIDUtil::getUUID(), + ]); + + $bdayRatio = mt_rand(0,9); + + if($bdayRatio < 2) { + // 20% has a birthday property with a full date + $dt = new \DateTime('@' . mt_rand($bdayStart, $bdayEnd)); + $vcard->add('BDAY', $dt->format('Ymd')); + + } elseif ($bdayRatio < 3) { + // 10% we only know the month and date of + $dt = new \DateTime('@' . mt_rand($bdayStart, $bdayEnd)); + $vcard->add('BDAY', '--' . $dt->format('md')); + } + if ($result = $vcard->validate()) { + ob_start(); + echo "\nWe produced an invalid vcard somehow!\n"; + foreach($result as $message) { + echo " " . $message['message'] . "\n"; + } + fwrite(STDERR, ob_get_clean()); + } + echo $vcard->serialize(); + +} + +fwrite(STDERR,"\nDone.\n"); diff --git a/vendor/sabre/vobject/bin/generateicalendardata.php b/vendor/sabre/vobject/bin/generateicalendardata.php new file mode 100755 index 0000000000..92c8c106dd --- /dev/null +++ b/vendor/sabre/vobject/bin/generateicalendardata.php @@ -0,0 +1,91 @@ +#!/usr/bin/env php +version = '2.0'; +$calendar->calscale = 'GREGORIAN'; + +$ii=0; + +while($ii < $events) { + + $ii++; + + $event = VObject\Component::create('VEVENT'); + $event->DTSTART = 'bla'; + $event->SUMMARY = 'Event #' . $ii; + $event->UID = md5(microtime(true)); + + $doctorRandom = mt_rand(1,1000); + + switch($doctorRandom) { + // All-day event + case 1 : + $event->DTEND = 'bla'; + $dtStart = clone $currentDate; + $dtEnd = clone $currentDate; + $dtEnd->modify('+' . mt_rand(1,3) . ' days'); + $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::DATE); + $event->DTEND->setDateTime($dtEnd, VObject\Property\DateTime::DATE); + break; + case 2 : + $event->RRULE = 'FREQ=DAILY;COUNT=' . mt_rand(1,10); + // No break intentional + default : + $dtStart = clone $currentDate; + $dtStart->setTime(mt_rand(1,23), mt_rand(0,59), mt_rand(0,59)); + $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::UTC); + $event->DURATION = 'PT'.mt_rand(1,3).'H'; + break; + + } + + $calendar->add($event); + $currentDate->modify('+ ' . mt_rand(0,3) . ' days'); + +} +fwrite(STDERR, "Validating\n"); + +$result = $calendar->validate(); +if ($result) { + fwrite(STDERR, "Errors!\n"); + fwrite(STDERR, print_r($result,true)); + die(-1); +} + +fwrite(STDERR, "Serializing this beast\n"); + +echo $calendar->serialize(); + +fwrite(STDERR, "done.\n"); + diff --git a/vendor/sabre/vobject/bin/vobject b/vendor/sabre/vobject/bin/vobject new file mode 100755 index 0000000000..e52b4fb574 --- /dev/null +++ b/vendor/sabre/vobject/bin/vobject @@ -0,0 +1,27 @@ +#!/usr/bin/env php +main($argv)); + diff --git a/vendor/sabre/vobject/composer.json b/vendor/sabre/vobject/composer.json new file mode 100644 index 0000000000..7bd01909c0 --- /dev/null +++ b/vendor/sabre/vobject/composer.json @@ -0,0 +1,43 @@ +{ + "name": "sabre/vobject", + "description" : "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects", + "keywords" : [ "VObject", "iCalendar", "vCard", "jCard", "jCal" ], + "homepage" : "https://github.com/fruux/sabre-vobject", + "license" : "BSD-3-Clause", + "require" : { + "php" : ">=5.3.1", + "ext-mbstring" : "*" + }, + "require-dev" : { + "phpunit/phpunit" : "*" + }, + "authors" : [ + { + "name" : "Evert Pot", + "email" : "evert@rooftopsolutions.nl", + "homepage" : "http://evertpot.com/", + "role" : "Developer" + } + ], + "support" : { + "forum" : "https://groups.google.com/group/sabredav-discuss", + "source" : "https://github.com/fruux/sabre-vobject" + }, + "autoload" : { + "psr-0" : { + "Sabre\\VObject" : "lib/" + } + }, + "bin" : [ + "bin/vobject", + "bin/generate_vcards" + ], + "extra" : { + "branch-alias" : { + "dev-master" : "3.2.x-dev" + } + }, + "config" : { + "bin-dir" : "bin" + } +} diff --git a/vendor/sabre/vobject/doc/MigratingFrom2to3.md b/vendor/sabre/vobject/doc/MigratingFrom2to3.md new file mode 100644 index 0000000000..9d85f91326 --- /dev/null +++ b/vendor/sabre/vobject/doc/MigratingFrom2to3.md @@ -0,0 +1,277 @@ +Migrating from vObject 2.x to 3.x +================================= + +vObject 3.0 got a major overhaul, and much better built-in support for all +kinds of properties and escaping. + +This version fixes the most important bugs, specifically Issue #19. + +To do this, a few backwards compatibility breaks had to be made. This document +describes each of them, as well as all the new features. + +New features overview +--------------------- + +* Serializer now properly deals with escaped commas and semi-colons. +* Properties and Parameters now have a getParts() method to grab multiple + values. +* You can now simply set PHP DateTime objects on DATE-TIME properties. +* Properties such as `CALSCALE`, `VERSION` and `PRODID` will automatically be + added. +* [RFC6868][1] is used to serialize parameters. +* Methods to generate [jCard][2] and [jCal][3] objects. +* Parsing of vCard 2.1 is much, much better, including support for the broken + vCards Microsoft generates if the `FORGIVING` option is on. +* The `add()` methods now return the objects that have been created. +* A brand new parser that reads from streams, lowering memory usage. +* Components now have an easy to use `remove()` method. +* Every property, parameter and component has a reference to the document. +* Binary properties are automatically decoded. + +And since sabre/vobject 3.1: + +* Added a jCard and jCal parser. +* Using the `convert()` method you can convert between vCard 2.1, 3.0 and 4.0. +* A new cli tool with `validate`, `repair`, `color` and `convert` commands. + +To find how out it all works, check out the [Documentation][4]. + +Backwards compatibility breaks +------------------------------ + +### Creating components + +Before, it was possible to create components such as `VEVENT`, `VTODO`, etc +with this syntax: + +```php +summary = 'Birthday party!'; + +// Or: + +$event = new \Sabre\VObject\Component('VEVENT'); +$event->summary = 'Birthday party!'; + +?> +``` + +Neither of those are legal any longer. Components now _must_ be created through +the Document object. + +Example: + +```php +createComponent('VEVENT'); + $event->summary = 'Birthday party!'; + +?> +``` + +Or: + +```php +$vcalendar = new \Sabre\VObject\Component\VCalendar(); +$vcalendar->add('VEVENT', [ + 'summary' => 'Birthday party!', +]); +``` + +### Creating properties + +Creating properties works the _exact_ same way. + +Old: + +```php + +``` + +Now you must also use the document: + +Example: + +```php +createProperty('LOCATION','Home'); + +?> +``` + +Note that in most cases, this syntax is highly recommended instead: + +```php +add('LOCATION','Home'); + +?> +``` + +In this case it doesn't make much of a difference, but when constructing +highly complex objects with sub-components, this _will_ make a big difference. + +### Component::children() and Property::parameters() return arrays. + +Before vObject 3 they returned an `ElementList`. + +### The signature for DateTime::setDateTime has changed. + +Before, you would use the following 4 syntaxes to set the date and time: + +```php +setDateTime($now, Property\DateTime::DATE); // Date only +$dt->setDateTime($now, Property\DateTime::LOCAL); // Floating time +$dt->setDateTime($now, Property\DateTime::UTC); // Convert to UTC +$dt->setDateTime($now, Property\DateTime::LOCALTZ); // Local to timezone information. + +``` + +This has completely changed: + +```php +create('DTSTART'); +$dt->setValue($now); +$dt['VALUE'] = 'date'; + +// Floating time +$dt = $calendar->create('DTSTART'); +$dt->setValue($now, $floating = true); + +// Convert to UTC +$now->setTimeZone(\DateTimeZone('UTC')); +$dt = $calendar->create('DTSTART'); +$dt->setValue($now); + +// Local time + timezone information +$dt = $calendar->create('DTSTART'); +$dt->setValue($now); + +?> +``` + +Note that the preceeding examples are all a bit convoluted. +In most cases you just want to do something like: + +```php +DTSTART = $now; + +?> +``` + +In addition, the `MultiDateTime` property is no more, and it's methods are +simply merged into `DateTime`. + +### The $value property is now protected everywhere. + +Both the `Property` and the `Parameter` classes had a public `$value` property, +which allowed you to retrieve the string value for either of those. + +This is now protected, so you must access it in this manner: + +```php +setValue('Birthday'); +echo $prop->getValue(); + +?> +``` + +// For properties that have more than 1 value, you can use `setParts` and +`getParts`: + + +```php +setParts(['Company', 'Department']); +print_r($org->getParts()); + +?> +``` + +### Binary properties are automatically de- and encoded. + +The `ATTACH`, `LOGO` and `PHOTO` properties now automatically de- and encode +their binary values. In vObject 2 they were accessed by their raw base64 +values. + +### Components and documents get injected with default properties. + +When creating a new `VCalendar`, it will automatically get the `VERSION`, +`CALSCALE` and `PRODID` properties. + +If you were adding your own with this syntax: + +```php +VERSION = '2.0'; + +?> +``` + +Then nothing will go wrong, and the properties will simply be overwritten. +However, if you used `add()` before in this manner: + +```php +add('version', '2.0'); + +?> +``` + +You will end up with 2 VERSION properties, making the document invalid. + +### componentMap and propertyMap properties have moved. + +When you wanted to automatically map certain components or properties to +certain PHP classes, you could do so with `Component::$componentMap` and +`Property::$propertyMap`. + +These properties have now moved to the document classes: + +* `Component\VCalendar::$propertyMap` +* `Component\VCalendar::$componentMap` +* `Component\VCard::$propertyMap` +* `Component\VCard::$componentMap` + +[1]: http://tools.ietf.org/html/rfc6868 +[2]: http://tools.ietf.org/html/rfc7095 +[3]: http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-08 +[4]: usage_3.md diff --git a/vendor/sabre/vobject/doc/usage_2.md b/vendor/sabre/vobject/doc/usage_2.md new file mode 100644 index 0000000000..f872ffc255 --- /dev/null +++ b/vendor/sabre/vobject/doc/usage_2.md @@ -0,0 +1,378 @@ +VObject 2.x documentation +========================= + +The VObject library allows you to easily parse and manipulate [iCalendar](https://tools.ietf.org/html/rfc5545) +and [vCard](https://tools.ietf.org/html/rfc6350) objects using PHP. +The goal of the VObject library is to create a very complete library, with an easy to use API. + +This project is a spin-off from [SabreDAV](http://code.google.com/p/sabredav/), where it has +been used for several years. The VObject library has 100% unittest coverage. + +Installation +------------ + +VObject requires PHP 5.3, and should be installed using composer. +The general composer instructions can be found on the [composer website](http://getcomposer.org/doc/00-intro.md composer website). + +After that, just declare the vobject dependency as follows: + +``` +"require" : { + "sabre/vobject" : "2.1.*" +} +``` + +Then, run `composer.phar update` and you should be good. + +Usage +----- + +### Parsing + +For our example, we will be using the following vcard: + +``` +BEGIN:VCARD +VERSION:3.0 +PRODID:-//Sabre//Sabre VObject 2.0//EN +N:Planck;Max;;; +FN:Max Planck +EMAIL;TYPE=WORK:mplanck@example.org +item1.TEL;TYPE=CELL:(+49)3144435678 +item1.X-ABLabel:Private cell +item2.TEL;TYPE=WORK:(+49)5554564744 +item2.X-ABLabel:Work +END:VCARD +``` + + +If we want to just print out Max' full name, you can just use property access: + + +```php +use Sabre\VObject; + +$card = VObject\Reader::read($data); +echo $card->FN; +``` + +### Changing properties + +Creating properties is pretty similar. If we like to add his birthday, we just +set the property: + +```php +$card->BDAY = '1858-04-23'; +``` + +Note that in the previous example, we're actually updating any existing BDAY that +may already exist. If we want to add a new property, without overwriting the previous +we can do this with the `add` method. + +```php +$card->add('EMAIL','max@example.org'); +``` + +### Parameters + +If we want to also specify that this is max' home email addresses, we can do this with +a third parameter: + +``` +$card->add('EMAIL', 'max@example'org', array('type' => 'HOME')); +``` + +If we want to read out all the email addresses and their type, this would look something +like this: + +``` +foreach($card->EMAIL as $email) { + + echo $email['TYPE'], ' - ', $email; + +} +``` + +### Groups + +In our example, you can see that the TEL properties are prefixed. These are 'groups' and +allow you to group multiple related properties together. The group can be any user-defined +name. + +This particular example as generated by the OS X addressbook, which uses the `X-ABLabel` +to allow the user to specify custom labels for properties. OS X addressbook uses groups +to tie the label to the property. + +The VObject library simply ignores the group if you don't specify it, so this will work: + +```php +foreach($card->TEL as $tel) { + echo $tel, "\n"; +} +``` + +But if you would like to target a specific group + property, this is possible too: + +```php +echo $card->{'ITEM1.TEL'}; +``` + +So if you would like to show all the phone numbers, along with their custom label, the +following syntax is used: + +```php +foreach($card->TEL as $tel) { + + echo $card->{$tel->group . '.X-ABLABEL'}, ": "; + echo $tel, "\n"; + +} +``` + +### Serializing / Saving + +If you want to generate your updated VObject, you can simply call the serialize() method. + +```php +echo $card->serialize(); +``` + +### Components + +iCalendar, unlike vCards always have sub-components. Where vCards are often just a flat +list, iCalendar objects tend to have a tree-like structure. For the following paragraphs, +we will use the following object as the example: + +``` +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Sabre//Sabre VObject 2.0//EN +BEGIN:VEVENT +SUMMARY:Curiosity landing +DTSTART:20120806T051439Z +LOCATION:Mars +END:VEVENT +END:VCALENDAR +``` + +Since events, tasks and journals are always in a sub component, this is also how we +access them. + +```php +use Sabre\VObject; + +$calendar = VObject\Reader::read($data); +echo $calendar->VEVENT->SUMMARY; +``` + +Adding components to a calendar is done with a factory method: + +```php +$event = VObject\Component::create('VEVENT'); +$calendar->add($event); + +$event->SUMMARY = 'Curiosity launch'; +$event->DTSTART = '20111126T150202Z'; +$event->LOCATION = 'Cape Carnival'; +``` + +By the way.. cloning also works as expected, as the entire structure is cloned along with it: + +```php +$clonedEvent = clone $calendar->VEVENT[0]; +$calendar->add($clonedEvent); +``` + +### Date and time handling + +If you ever had to deal with iCalendar timezones, you know it can be complicated. +The way timezones are specified is flawed, which is something I may write an essay about some +day. VObject does its best to determine the correct timezone. Many standard formats +have been tested and verified, and special code has been implemented for special-casing +microsoft generated timezone information, and others. + +To get a real php `DateTime` object, you can request this as follows: + +```php +$event = $calendar->VEVENT; +$start = $event->DTSTART->getDateTime(); +echo $start->format(\DateTime::W3C); +``` + +To set the property with a DateTime object, you can use the following syntax: + +```php +$dateTime = new \DateTime('2012-08-07 23:53:00', new DateTimeZone('Europe/Amsterdam')); +$event->DTSTART->setDateTime($dateTime, VObject\Property\DateTime::DATE); +``` + +The second argument specifies the type of date you're setting. The following three +options exist: + +1. `LOCAL` This is a floating time, with no timezone information. This basically specifies that the event happens in whatever the timezone's currently in. This would be encoded as `DTSTART;VALUE=DATE-TIME:20120807235300` +2. `UTC` This specifies that the time should be encoded as a UTC time. This is encoded as `DTSTART;VALUE=DATE-TIME:20120807205300Z`. Note the extra Z and the fact that it's two hours 'earlier'. +3. `LOCALTZ` specifies that it's supposed to be encoded in its local timezone. For example `DTSTART;VALUE=DATE-TIME;TZID=Europe/Amsterdam:20120807235300`. +4. `DATE` This is a date-only, and does not contain the time. In this case this would be encoded as `DTSTART;VALUE=DATE:20120807`. + +A few important notes: + +* When a `TZID` is specified, there should also be a matching `VTIMEZONE` object with all the timezone information. VObject cannot currently automatically embed this. However, in reality other clients seem to do fine without this information. Yet, for completeness, this will be added in the future. +* As mentioned, the timezone-determination process may sometimes fail. Report any issues you find, and I'll be quick to add workarounds! + +### Recurrence rules + +Recurrence rules allow events to recur, for example for a weekly meeting, or an anniversary. +This is done with the `RRULE` property. The `RRULE` property allows for a LOT of different +rules. VObject only implements the ones that actually appear in calendar software. + +To read more about `RRULE` and all the options, check out [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.5). +VObject supports the following options: + +1. `UNTIL` for an end date. +2. `INTERVAL` for for example "every 2 days". +3. `COUNT` to stop recurring after x items. +4. `FREQ=DAILY` to recur every day, and `BYDAY` to limit it to certain days. +5. `FREQ=WEEKLY` to recur every week, `BYDAY` to expand this to multiple weekdays in every week and `WKST` to specify on which day the week starts. +6. `FREQ=MONTHLY` to recur every month, `BYMONTHDAY` to expand this to certain days in a month, `BYDAY` to expand it to certain weekdays occuring in a month, and `BYSETPOS` to limit the last two expansions. +7. `FREQ=YEARLY` to recur every year, `BYMONTH` to expand that to certain months in a year, and `BYDAY` and `BYWEEKDAY` to expand the `BYMONTH` rule even further. + +VObject supports the `EXDATE` property for exclusions, but not yet the `RDATE` and `EXRULE` +properties. If you're interested in this, please file a github issue, as this will put it +on my radar. + +This is a bit of a complex subject to go in excruciating detail. The +[RFC](https://tools.ietf.org/html/rfc5545#section-3.8.5) has a lot of examples though. + +The hard part is not to write the RRULE, it is to expand them. The most complex and +hard-to-read code is hidden in this component. Dragons be here. + +So, if we have a meeting every 2nd monday of the month, this would be specified as such: + +``` +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Sabre//Sabre VObject 2.0//EN +BEGIN:VEVENT +UID:1102c450-e0d7-11e1-9b23-0800200c9a66 +DTSTART:20120109T140000Z +RRULE:FREQ=MONTHLY;BYDAY=MO;BYSETPOS=2 +END:VEVENT +END:VCALENDAR +``` + +Note that normally it's not allowed to indent the object like this, but it does make +it easier to read. This is also the first time I added in a UID, which is required +for all VEVENT, VTODO and VJOURNAL objects! + +To figure out all the meetings for this year, we can use the following syntax: + +```php +use Sabre\VObject; + +$calendar = VObject\Reader::read($data); +$calendar->expand(new DateTime('2012-01-01'), new DateTime('2012-12-31')); +``` + +What the expand method does, is look at its inner events, and expand the recurring +rule. Our calendar now contains 12 events. The first will have its RRULE stripped, +and every subsequent VEVENT has the correct meeting date and a `RECURRENCE-ID` set. + +This results in something like this: + +``` +BEGIN:VCALENDAR + VERSION:2.0 + PRODID:-//Sabre//Sabre VObject 2.0//EN + BEGIN:VEVENT + UID:1102c450-e0d7-11e1-9b23-0800200c9a66 + DTSTART:20120109T140000Z + END:VEVENT + BEGIN:VEVENT + UID:1102c450-e0d7-11e1-9b23-0800200c9a66 + RECURRENCE-ID:20120213T140000Z + DTSTART:20120213T140000Z + END:VEVENT + BEGIN:VEVENT + UID:1102c450-e0d7-11e1-9b23-0800200c9a66 + RECURRENCE-ID:20120312T140000Z + DTSTART:20120312T140000Z + END:VEVENT + ..etc.. +END:VCALENDAR +``` + +To show the list of dates, we would do this as such: + +```php +foreach($calendar->VEVENT as $event) { + echo $event->DTSTART->getDateTime()->format(\DateTime::ATOM); +} +``` + +In a recurring event, single instances can also be overriden. VObject also takes these +into consideration. The reason we needed to specify a start and end-date, is because +some recurrence rules can be 'never ending'. + +You should make sure you pick a sane date-range. Because if you pick a 50 year +time-range, for a daily recurring event; this would result in over 18K objects. + +Free-busy report generation +--------------------------- + +Some calendaring software can make use of FREEBUSY reports to show when people are +available. + +You can automatically generate these reports from calendars using the `FreeBusyGenerator`. + +Example based on our last event: + +```php +// We're giving it the calendar object. It's also possible to specify multiple objects, +// by setting them as an array. +// +// We must also specify a start and end date, because recurring events are expanded. +$fbGenerator = new VObject\FreeBusyGenerator( + new DateTime('2012-01-01'), + new DateTime('2012-12-31'), + $calendar +); + +// Grabbing the report +$freebusy = $fbGenerator->result(); + +// The freebusy report is another VCALENDAR object, so we can serialize it as usual: +echo $freebusy->serialize(); +``` + +The output of this script will look like this: + +``` +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Sabre//Sabre VObject 2.0//EN +CALSCALE:GREGORIAN +BEGIN:VFREEBUSY +DTSTART;VALUE=DATE-TIME:20111231T230000Z +DTEND;VALUE=DATE-TIME:20111231T230000Z +DTSTAMP;VALUE=DATE-TIME:20120808T131628Z +FREEBUSY;FBTYPE=BUSY:20120109T140000Z/20120109T140000Z +FREEBUSY;FBTYPE=BUSY:20120213T140000Z/20120213T140000Z +FREEBUSY;FBTYPE=BUSY:20120312T140000Z/20120312T140000Z +FREEBUSY;FBTYPE=BUSY:20120409T140000Z/20120409T140000Z +FREEBUSY;FBTYPE=BUSY:20120514T140000Z/20120514T140000Z +FREEBUSY;FBTYPE=BUSY:20120611T140000Z/20120611T140000Z +FREEBUSY;FBTYPE=BUSY:20120709T140000Z/20120709T140000Z +FREEBUSY;FBTYPE=BUSY:20120813T140000Z/20120813T140000Z +FREEBUSY;FBTYPE=BUSY:20120910T140000Z/20120910T140000Z +FREEBUSY;FBTYPE=BUSY:20121008T140000Z/20121008T140000Z +FREEBUSY;FBTYPE=BUSY:20121112T140000Z/20121112T140000Z +FREEBUSY;FBTYPE=BUSY:20121210T140000Z/20121210T140000Z +END:VFREEBUSY +END:VCALENDAR +``` + +Support +------- + +Head over to the [SabreDAV mailing list](http://groups.google.com/group/sabredav-discuss) for any questions. + diff --git a/vendor/sabre/vobject/doc/usage_3.md b/vendor/sabre/vobject/doc/usage_3.md new file mode 100644 index 0000000000..db30667302 --- /dev/null +++ b/vendor/sabre/vobject/doc/usage_3.md @@ -0,0 +1,658 @@ +VObject 3 documentation +======================= + +The VObject library allows you to easily parse and manipulate [iCalendar](https://tools.ietf.org/html/rfc5545) +and [vCard](https://tools.ietf.org/html/rfc6350) objects using PHP. +The goal of the VObject library is to create a very complete library, with an easy to use API. + +This project is a spin-off from [SabreDAV](http://code.google.com/p/sabredav/), where it has +been used for several years. The VObject library has 100% unittest coverage. + +VObject 3 is the new and improved version of the library. + +Notable new stuff: + +* New and improved parser. +* Better support for vCard 2.1. +* Support for RFC6868. +* Serializing to jCard/jCal. +* Lots of tiny API improvements that combined make everything much easier. + +Installation +------------ + +VObject requires PHP 5.3, and should be installed using composer. +The general composer instructions can be found on the [composer website](http://getcomposer.org/doc/00-intro.md composer website). + +After that, just declare the VObject dependency as follows: + +``` +"require" : { + "sabre/vobject" : "3.0.*" +} +``` + +Then, run `composer.phar update` and you should be good. + +Usage +----- + +A few notes about the examples: + +1. The assumption for every example, is that the VObject source has been + included. +2. It's also assumed that `use Sabre\VObject` has been called to import the + VObject namespace. +3. While sabre/vobject supports PHP 5.3, most of the examples in this document + use syntax that has been introduced in PHP 5.4. PHP 5.4 introduces a new way + to create arrays, which is a lot shorter and looks better. If you are + running PHP 5.3, you may need to replace `[` and `]` with `array(` and `)`. + +### Creating vCards. + +To create a vCard, you can simply instantiate the vCard component, and pass +the properties you need: + +```php + 'Cowboy Henk', + 'TEL' => '+1 555 34567 455', + 'N' => ['Henk', 'Cowboy', '', 'Dr.', 'MD'], +]); + +echo $vcard->serialize(); +``` + + +This will output: + +``` +BEGIN:VCARD +VERSION:3.0 +PRODID:-//Sabre//Sabre VObject 3.0.0-alpha5//EN +FN:Cowboy Henk +TEL:+1 555 34567 455 +N:Henk;Cowboy;;Dr.;MD +END:VCARD +``` + + +### Adding properties + +Certain properties, such as `TEL`, `ADR` or `EMAIL` may appear more than once. +To add any additional properties, use the `add()` method on the vCard. + +```php +add('TEL', '+1 555 34567 456', ['type' => 'fax']); +``` + +The third argument of the add() method allows you to specify a list of +parameters. + +### Manipulating properties + +The vCard also allows object-access to manipulate properties: + +```php +FN = 'Doctor McNinja'; + +// Removes a property +unset($vcard->FN); + +// Checks for existence of a property: + +isset($vcard->FN); +``` + +### Working with parameters + +To get access to a parameter, you can simply use array-access: + +```php +$type = $vcard->TEL['TYPE']: +echo (string)$type; +``` + +Parameters can also appear multiple times. To get to their values, just loop +through them: + +```php +if ($param = $vcard->TEL['TYPE']) { + foreach($param as $value) { + echo $value, "\n"; + } +} +``` + +To change parameters for properties, you can use array-access syntax: + +```php +TEL['TYPE'] = ['WORK','FAX']: +``` + +Or when you're working with singular parameters: + +```php +$vcard->TEL['PREF'] = 1; +``` + +It is also possible add a list of parameters while creating the property. + +```php +$vcard->add( + 'EMAIL', + 'foo@example.org', + [ + 'type' => ['home', 'work'], + 'pref' => 1, + ] +); +``` + +### Parsing vCard or iCalendar + +To parse a vCard or iCalendar object, simply call: + +```php +FN; +``` + +For properties that contain more than 1 part, such as `ADR`, `N` or `ORG` you +can call `getParts()`. + +```php +ORG->getParts(); +); +``` + +### Looping through properties. + +Properties such as `ADR`, `EMAIL` and `TEL` may appear more than once in a +vCard. To loop through them, you can simply throw them in a `foreach()` +statement: + +```php +TEL as $tel) { + echo "Phone number: ", (string)$tel, "\n"; +} + +foreach($vcard->ADR as $adr) { + print_r($adr->getParts()); +} +``` + +### vCard property grouping + +It's allowed in vCards to group multiple properties together with an arbitrary +string. + +Apple clients use this feature to assign custom labels to things like phone +numbers and email addresses. Below is an example: + +``` +BEGIN:VCARD +VERSION:3.0 +groupname.TEL:+1 555 12342567 +groupname.X-ABLABEL:UK number +END:VCARD +``` + + +In our example, you can see that the TEL properties are prefixed. These are 'groups' and +allow you to group multiple related properties together. + +In most situations these group names are ignored, so when you execute the following +example, the `TEL` properties are still traversed. + +```php +TEL as $tel) { + echo (string)$tel, "\n"; +} +``` + +But if you would like to target a specific group + property, this is possible too: + +```php +{'groupname.TEL'}; +``` + +To expand that example a little bit; if you'd like to traverse through all phone +numbers and display their custom labels, you'd do something like this: + + +```php +TEL as $tel) { + + echo (string)$vcard->{$tel->group . '.X-ABLABEL'}, ": "; + echo (string)$tel, "\n"; + +} +``` + +### iCalendar + +iCalendar works much the same way as vCards, but has a couple of features +that vCard does not. + +First, in vCard there's only 1 component (everything between `BEGIN:VCARD` +and `END:VCARD`), but in iCalendar, there are nested components. + +A simple illustration, lets create an iCalendar that contains an event. + +```php +add('VEVENT', [ + 'SUMMARY' => 'Birthday party', + 'DTSTART' => new \DateTime('2013-04-07'), + 'RRULE' => 'FREQ=YEARLY', +]); + +echo $vcalendar->serialize(); +``` + +This will output the following: + +``` +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Sabre//Sabre VObject 3.0.0-alpha5//EN +CALSCALE:GREGORIAN +BEGIN:VEVENT +SUMMARY:Birthday party +DTSTART;TZID=Europe/London;VALUE=DATE-TIME:20130407T000000 +RRULE:FREQ=YEARLY +END:VEVENT +END:VCALENDAR +``` + + +The add() method will always return the instance of the property or +sub-component it's creating. This makes for easy further manipulation. + +Here's another example that adds an attendee and an organizer: + +```php +add('VEVENT', [ + 'SUMMARY' => 'Meeting', + 'DTSTART' => new \DateTime('2013-04-07'), +]); + +$vevent->add('ORGANIZER','mailto:organizer@example.org'); +$vevent->add('ATTENDEE','mailto:attendee1@example.org'); +$vevent->add('ATTENDEE','mailto:attendee2@example.org'); +``` + +### Date and time handling + +Parsing Dates and Times from iCalendar and vCard can be difficult. +Most of this is abstracted by the VObject library. + +Given an event, in a calendar, you can get a real PHP `DateTime` object using +the following syntax: + +```php +VEVENT->DTSTART->getDateTime(); +echo $start->format(\DateTime::W3C); +``` + +To update the property with a new `DateTime` object, just use the following syntax: + +```php +DTSTART = $dateTime; +``` + +### Expanding recurrence rules + +Recurrence rules allow events to recur, for example for a weekly meeting, or an anniversary. +This is done with the `RRULE` property. The `RRULE` property allows for a LOT of different +rules. VObject only implements the ones that actually appear in calendar software. + +To read more about `RRULE` and all the options, check out [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.5). +VObject supports the following options: + +1. `UNTIL` for an end date. +2. `INTERVAL` for for example "every 2 days". +3. `COUNT` to stop recurring after x items. +4. `FREQ=DAILY` to recur every day, and `BYDAY` to limit it to certain days. +5. `FREQ=WEEKLY` to recur every week, `BYDAY` to expand this to multiple weekdays in every week and `WKST` to specify on which day the week starts. +6. `FREQ=MONTHLY` to recur every month, `BYMONTHDAY` to expand this to certain days in a month, `BYDAY` to expand it to certain weekdays occuring in a month, and `BYSETPOS` to limit the last two expansions. +7. `FREQ=YEARLY` to recur every year, `BYMONTH` to expand that to certain months in a year, and `BYDAY` and `BYWEEKDAY` to expand the `BYMONTH` rule even further. + +VObject supports the `EXDATE` property for exclusions, but not yet the `RDATE` and `EXRULE` +properties. If you're interested in this, please file a github issue, as this will put it +on my radar. + +This is a bit of a complex subject to go in excruciating detail. The +[RFC](https://tools.ietf.org/html/rfc5545#section-3.8.5) has a lot of examples though. + +The hard part is not to write the RRULE, it is to expand them. The most complex and +hard-to-read code is hidden in this component. Dragons be here. + +So, if we have a meeting every 2nd monday of the month, this would be specified as such: + +``` +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Sabre//Sabre VObject 2.0//EN +BEGIN:VEVENT +UID:1102c450-e0d7-11e1-9b23-0800200c9a66 +DTSTART:20120109T140000Z +RRULE:FREQ=MONTHLY;BYDAY=MO;BYSETPOS=2 +END:VEVENT +END:VCALENDAR +``` + +Note that I added in `UID` property. For simplicity I've kept it out of +previous examples, but do note that a `UID` property is required for all +`VEVENT`, `VTODO` and `VJOURNAL` objects! + +To figure out all the meetings for this year, we can use the following syntax: + +```php +expand(new DateTime('2012-01-01'), new DateTime('2012-12-31')); +``` + +What the expand method does, is look at its inner events, and expand the recurring +rule. Our calendar now contains 12 events. The first will have its RRULE stripped, +and every subsequent VEVENT has the correct meeting date and a `RECURRENCE-ID` set. + +This results in something like this: + +``` +BEGIN:VCALENDAR + VERSION:2.0 + PRODID:-//Sabre//Sabre VObject 2.0//EN + BEGIN:VEVENT + UID:1102c450-e0d7-11e1-9b23-0800200c9a66 + DTSTART:20120109T140000Z + END:VEVENT + BEGIN:VEVENT + UID:1102c450-e0d7-11e1-9b23-0800200c9a66 + RECURRENCE-ID:20120213T140000Z + DTSTART:20120213T140000Z + END:VEVENT + BEGIN:VEVENT + UID:1102c450-e0d7-11e1-9b23-0800200c9a66 + RECURRENCE-ID:20120312T140000Z + DTSTART:20120312T140000Z + END:VEVENT + ..etc.. +END:VCALENDAR +``` + +Note that I added some extra spaces for convenience.. + +To show the list of dates, we would do this as such: + +```php +VEVENT as $vevent) { + echo $vevent->DTSTART->getDateTime()->format(\DateTime::ATOM); +} +``` + +In a recurring event, single instances can also be overriden. VObject also takes these +into consideration. The reason we needed to specify a start and end-date, is because +some recurrence rules can be 'never ending'. + +You should make sure you pick a sane date-range. Because if you pick a 50 year +time-range, for a daily recurring event; this would result in over 18K objects. + +### Free-busy report generation + +Some calendaring software can make use of FREEBUSY reports to show when people are +available. + +You can automatically generate these reports from calendars using the `FreeBusyGenerator`. + +Example based on our last event: + +```php +getResult(); + +// The freebusy report is another VCALENDAR object, so we can serialize it as usual: +echo $freebusy->serialize(); +``` + +The output of this script will look like this: + +``` +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Sabre//Sabre VObject 2.0//EN +CALSCALE:GREGORIAN +BEGIN:VFREEBUSY +DTSTART;VALUE=DATE-TIME:20111231T230000Z +DTEND;VALUE=DATE-TIME:20111231T230000Z +DTSTAMP;VALUE=DATE-TIME:20120808T131628Z +FREEBUSY;FBTYPE=BUSY:20120109T140000Z/20120109T140000Z +FREEBUSY;FBTYPE=BUSY:20120213T140000Z/20120213T140000Z +FREEBUSY;FBTYPE=BUSY:20120312T140000Z/20120312T140000Z +FREEBUSY;FBTYPE=BUSY:20120409T140000Z/20120409T140000Z +FREEBUSY;FBTYPE=BUSY:20120514T140000Z/20120514T140000Z +FREEBUSY;FBTYPE=BUSY:20120611T140000Z/20120611T140000Z +FREEBUSY;FBTYPE=BUSY:20120709T140000Z/20120709T140000Z +FREEBUSY;FBTYPE=BUSY:20120813T140000Z/20120813T140000Z +FREEBUSY;FBTYPE=BUSY:20120910T140000Z/20120910T140000Z +FREEBUSY;FBTYPE=BUSY:20121008T140000Z/20121008T140000Z +FREEBUSY;FBTYPE=BUSY:20121112T140000Z/20121112T140000Z +FREEBUSY;FBTYPE=BUSY:20121210T140000Z/20121210T140000Z +END:VFREEBUSY +END:VCALENDAR +``` + +### Converting to jCard + +To create a json-version of your iCalendar or vCard, simply call +`jsonSerialize` on your component: + +```php +jsonSerialize()); +``` + +The json formats are based on these RFCs: + +* http://tools.ietf.org/html/rfc7095 +* http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-08 + +Because these are still in draft, so is the jsonSerialize implementation. The +output format may therefore break between versions to comply with the latest +version of the spec. + +### Parsing jCard and jCal. + +To parse a jCard or jCal object, use the following snippet: + +```php + +``` + +You can pass either a json string, a readable stream, or an array if you +already called json_decode on the input. + +This feature was added in sabre/vobject 3.1. + +### Splitting export files + +Generally when software makes backups of calendars or contacts, they will +put all the objects in a single file. In the case of vCards, this is often +a stream of VCARD objects, in the case of iCalendar, this tends to be a +single VCALENDAR objects, with many components. + +Protocols such as Card- and CalDAV expect only 1 object per resource. The +vobject library provides 2 classes to split these backup files up into many. + +To do this, use the splitter objects: + +```php +next()) { + + // $vCard is a single vCard object. You can just call serialize() on it + // if you were looking for the string version. + +} +``` + +Next to the VCard splitter, there's also an ICalendar splitter. The latter +creates a `VCALENDAR` object per `VEVENT`, `VTODO` or `VJOURNAL`, and ensures +that the `VTIMEZONE` information is kept intact, and any `VEVENT` objects that +belong together (because they are expections for an `RRULE` and thus have the +same `UID`) will be kept together, exactly like CalDAV expects. + +### Converting between different vCard versions. + +Since sabre/vobject 3.1, there's also a feature to convert between various +vCard versions. Currently it's possible to convert from vCard 2.1, 3.0 and +4.0 and to 3.0 and 4.0. It's not yet possible to convert to vCard 2.1. + +To do this, simply call the convert() method on the vCard object. + +```php +convert(VObject\Document::VCARD40); + +echo $vcard->serialize(); + +// This will output: +/* +BEGIN:VCARD +VERSION:4.0 +FN:Foo +TEL;PREF=1;TYPE=HOME:+1 555 555 555 +END:VCARD +*/ +?> +``` + +Note that not everything can cleanly convert between versions, and it's +probable that there's a few properties that could be converted between +versions, but isn't yet. If you find something, open a feature request ticket +on Github. + +Full API documentation +---------------------- + +Full API documentation can be found on github: + +https://github.com/fruux/sabre-vobject/wiki/ApiIndex + +Reading the source may also be helpful instead :) + +CLI tool +-------- + +Since vObject 3.1, a new cli tool is shipped in the bin/ directory. + +This tool has the following features: + +* A `validate` command. +* A `repair` command to repair objects that are slightly broken. +* A `color` command, to show an iCalendar object or vCard on the console with + ansi-colors, which may help debugging. +* A `convert` command, allowing you to convert between iCalendar 2.0, vCard 2.1, + vCard 3.0, vCard 4.0, jCard and jCal. + +Just run it using `bin/vobject`. Composer will automatically also put a +symlink in `vendor/bin` as well, or a directory of your choosing if you set +the `bin-dir` setting in your composer.json. + +Support +------- + +Head over to the [SabreDAV mailing list](http://groups.google.com/group/sabredav-discuss) for any questions. + diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Cli.php b/vendor/sabre/vobject/lib/Sabre/VObject/Cli.php new file mode 100644 index 0000000000..f40bcbdead --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Cli.php @@ -0,0 +1,735 @@ +stderr) { + $this->stderr = fopen('php://stderr','w'); + } + if (!$this->stdout) { + $this->stdout = fopen('php://stdout','w'); + } + if (!$this->stdin) { + $this->stdin = fopen('php://stdin','r'); + } + + // @codeCoverageIgnoreEnd + + + try { + + list($options, $positional) = $this->parseArguments($argv); + + if (isset($options['q'])) { + $this->quiet = true; + } + $this->log($this->colorize('green', "sabre/vobject ") . $this->colorize('yellow', Version::VERSION)); + + foreach($options as $name=>$value) { + + switch($name) { + + case 'q' : + // Already handled earlier. + break; + case 'h' : + case 'help' : + $this->showHelp(); + return 0; + break; + case 'format' : + switch($value) { + + // jcard/jcal documents + case 'jcard' : + case 'jcal' : + + // specific document versions + case 'vcard21' : + case 'vcard30' : + case 'vcard40' : + case 'icalendar20' : + + // specific formats + case 'json' : + case 'mimedir' : + + // icalendar/vcad + case 'icalendar' : + case 'vcard' : + $this->format = $value; + break; + + default : + throw new InvalidArgumentException('Unknown format: ' . $value); + + } + break; + case 'pretty' : + if (version_compare(PHP_VERSION, '5.4.0') >= 0) { + $this->pretty = true; + } + break; + case 'forgiving' : + $this->forgiving = true; + break; + case 'inputformat' : + switch($value) { + // json formats + case 'jcard' : + case 'jcal' : + case 'json' : + $this->inputFormat = 'json'; + break; + + // mimedir formats + case 'mimedir' : + case 'icalendar' : + case 'vcard' : + case 'vcard21' : + case 'vcard30' : + case 'vcard40' : + case 'icalendar20' : + + $this->inputFormat = 'mimedir'; + break; + + default : + throw new InvalidArgumentException('Unknown format: ' . $value); + + } + break; + default : + throw new InvalidArgumentException('Unknown option: ' . $name); + + } + + } + + if (count($positional) === 0) { + $this->showHelp(); + return 1; + } + + if (count($positional) === 1) { + throw new InvalidArgumentException('Inputfile is a required argument'); + } + + if (count($positional) > 3) { + throw new InvalidArgumentException('Too many arguments'); + } + + if (!in_array($positional[0], array('validate','repair','convert','color'))) { + throw new InvalidArgumentException('Uknown command: ' . $positional[0]); + } + + } catch (InvalidArgumentException $e) { + $this->showHelp(); + $this->log('Error: ' . $e->getMessage(),'red'); + return 1; + } + + $command = $positional[0]; + + $this->inputPath = $positional[1]; + $this->outputPath = isset($positional[2])?$positional[2]:'-'; + + if ($this->outputPath !== '-') { + $this->stdout = fopen($this->outputPath,'w'); + } + + if (!$this->inputFormat) { + if (substr($this->inputPath,-5)==='.json') { + $this->inputFormat = 'json'; + } else { + $this->inputFormat = 'mimedir'; + } + } + if (!$this->format) { + if (substr($this->outputPath,-5)==='.json') { + $this->format = 'json'; + } else { + $this->format = 'mimedir'; + } + } + + + $realCode = 0; + + try { + + while($input = $this->readInput()) { + + $returnCode = $this->$command($input); + if ($returnCode!==0) $realCode = $returnCode; + + } + + } catch (EofException $e) { + // end of file + } catch (\Exception $e) { + $this->log('Error: ' . $e->getMessage(),'red'); + return 2; + } + + return $realCode; + + } + + /** + * Shows the help message. + * + * @return void + */ + protected function showHelp() { + + $this->log('Usage:', 'yellow'); + $this->log(" vobject [options] command [arguments]"); + $this->log(''); + $this->log('Options:', 'yellow'); + $this->log($this->colorize('green', ' -q ') . "Don't output anything."); + $this->log($this->colorize('green', ' -help -h ') . "Display this help message."); + $this->log($this->colorize('green', ' --format ') . "Convert to a specific format. Must be one of: vcard, vcard21,"); + $this->log($this->colorize('green', ' --forgiving ') . "Makes the parser less strict."); + $this->log(" vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir."); + $this->log($this->colorize('green', ' --inputformat ') . "If the input format cannot be guessed from the extension, it"); + $this->log(" must be specified here."); + // Only PHP 5.4 and up + if (version_compare(PHP_VERSION, '5.4.0') >= 0) { + $this->log($this->colorize('green', ' --pretty ') . "json pretty-print."); + } + $this->log(''); + $this->log('Commands:', 'yellow'); + $this->log($this->colorize('green', ' validate') . ' source_file Validates a file for correctness.'); + $this->log($this->colorize('green', ' repair') . ' source_file [output_file] Repairs a file.'); + $this->log($this->colorize('green', ' convert') . ' source_file [output_file] Converts a file.'); + $this->log($this->colorize('green', ' color') . ' source_file Colorize a file, useful for debbugging.'); + $this->log(<<log('Examples:', 'yellow'); + $this->log(' vobject convert contact.vcf contact.json'); + $this->log(' vobject convert --format=vcard40 old.vcf new.vcf'); + $this->log(' vobject convert --inputformat=json --format=mimedir - -'); + $this->log(' vobject color calendar.ics'); + $this->log(''); + $this->log('https://github.com/fruux/sabre-vobject','purple'); + + } + + /** + * Validates a VObject file + * + * @param Component $vObj + * @return int + */ + protected function validate($vObj) { + + $returnCode = 0; + + switch($vObj->name) { + case 'VCALENDAR' : + $this->log("iCalendar: " . (string)$vObj->VERSION); + break; + case 'VCARD' : + $this->log("vCard: " . (string)$vObj->VERSION); + break; + } + + $warnings = $vObj->validate(); + if (!count($warnings)) { + $this->log(" No warnings!"); + } else { + + $returnCode = 2; + foreach($warnings as $warn) { + + $this->log(" " . $warn['message']); + + } + + } + + return $returnCode; + + } + + /** + * Repairs a VObject file + * + * @param Component $vObj + * @return int + */ + protected function repair($vObj) { + + $returnCode = 0; + + switch($vObj->name) { + case 'VCALENDAR' : + $this->log("iCalendar: " . (string)$vObj->VERSION); + break; + case 'VCARD' : + $this->log("vCard: " . (string)$vObj->VERSION); + break; + } + + $warnings = $vObj->validate(Node::REPAIR); + if (!count($warnings)) { + $this->log(" No warnings!"); + } else { + foreach($warnings as $warn) { + + $returnCode = 2; + $this->log(" " . $warn['message']); + + } + + } + fwrite($this->stdout, $vObj->serialize()); + + return $returnCode; + + } + + /** + * Converts a vObject file to a new format. + * + * @param Component $vObj + * @return int + */ + protected function convert($vObj) { + + $json = false; + $convertVersion = null; + $forceInput = null; + + switch($this->format) { + case 'json' : + $json = true; + if ($vObj->name === 'VCARD') { + $convertVersion = Document::VCARD40; + } + break; + case 'jcard' : + $json = true; + $forceInput = 'VCARD'; + $convertVersion = Document::VCARD40; + break; + case 'jcal' : + $json = true; + $forceInput = 'VCALENDAR'; + break; + case 'mimedir' : + case 'icalendar' : + case 'icalendar20' : + case 'vcard' : + break; + case 'vcard21' : + $convertVersion = Document::VCARD21; + break; + case 'vcard30' : + $convertVersion = Document::VCARD30; + break; + case 'vcard40' : + $convertVersion = Document::VCARD40; + break; + + } + + if ($forceInput && $vObj->name !== $forceInput) { + throw new \Exception('You cannot convert a ' . strtolower($vObj->name) . ' to ' . $this->format); + } + if ($convertVersion) { + $vObj = $vObj->convert($convertVersion); + } + if ($json) { + $jsonOptions = 0; + if ($this->pretty) { + $jsonOptions = JSON_PRETTY_PRINT; + } + fwrite($this->stdout, json_encode($vObj->jsonSerialize(), $jsonOptions)); + } else { + fwrite($this->stdout, $vObj->serialize()); + } + + return 0; + + } + + /** + * Colorizes a file + * + * @param Component $vObj + * @return int + */ + protected function color($vObj) { + + fwrite($this->stdout, $this->serializeComponent($vObj)); + + } + + /** + * Returns an ansi color string for a color name. + * + * @param string $color + * @return string + */ + protected function colorize($color, $str, $resetTo = 'default') { + + $colors = array( + 'cyan' => '1;36', + 'red' => '1;31', + 'yellow' => '1;33', + 'blue' => '0;34', + 'green' => '0;32', + 'default' => '0', + 'purple' => '0;35', + ); + return "\033[" . $colors[$color] . 'm' . $str . "\033[".$colors[$resetTo]."m"; + + } + + /** + * Writes out a string in specific color. + * + * @param string $color + * @param string $str + * @return void + */ + protected function cWrite($color, $str) { + + fwrite($this->stdout, $this->colorize($color, $str)); + + } + + protected function serializeComponent(Component $vObj) { + + $this->cWrite('cyan', 'BEGIN'); + $this->cWrite('red', ':'); + $this->cWrite('yellow', $vObj->name . "\n"); + + /** + * Gives a component a 'score' for sorting purposes. + * + * This is solely used by the childrenSort method. + * + * A higher score means the item will be lower in the list. + * To avoid score collisions, each "score category" has a reasonable + * space to accomodate elements. The $key is added to the $score to + * preserve the original relative order of elements. + * + * @param int $key + * @param array $array + * @return int + */ + $sortScore = function($key, $array) { + + if ($array[$key] instanceof Component) { + + // We want to encode VTIMEZONE first, this is a personal + // preference. + if ($array[$key]->name === 'VTIMEZONE') { + $score=300000000; + return $score+$key; + } else { + $score=400000000; + return $score+$key; + } + } else { + // Properties get encoded first + // VCARD version 4.0 wants the VERSION property to appear first + if ($array[$key] instanceof Property) { + if ($array[$key]->name === 'VERSION') { + $score=100000000; + return $score+$key; + } else { + // All other properties + $score=200000000; + return $score+$key; + } + } + } + + }; + + $tmp = $vObj->children; + uksort($vObj->children, function($a, $b) use ($sortScore, $tmp) { + + $sA = $sortScore($a, $tmp); + $sB = $sortScore($b, $tmp); + + return $sA - $sB; + + }); + + foreach($vObj->children as $child) { + if ($child instanceof Component) { + $this->serializeComponent($child); + } else { + $this->serializeProperty($child); + } + } + + $this->cWrite('cyan', 'END'); + $this->cWrite('red', ':'); + $this->cWrite('yellow', $vObj->name . "\n"); + + } + + /** + * Colorizes a property. + * + * @param Property $property + * @return void + */ + protected function serializeProperty(Property $property) { + + if ($property->group) { + $this->cWrite('default', $property->group); + $this->cWrite('red', '.'); + } + + $str = ''; + $this->cWrite('yellow', $property->name); + + foreach($property->parameters as $param) { + + $this->cWrite('red',';'); + $this->cWrite('blue', $param->serialize()); + + } + $this->cWrite('red',':'); + + if ($property instanceof Property\Binary) { + + $this->cWrite('default', 'embedded binary stripped. (' . strlen($property->getValue()) . ' bytes)'); + + } else { + + $parts = $property->getParts(); + $first1 = true; + // Looping through property values + foreach($parts as $part) { + if ($first1) { + $first1 = false; + } else { + $this->cWrite('red', $property->delimiter); + } + $first2 = true; + // Looping through property sub-values + foreach((array)$part as $subPart) { + if ($first2) { + $first2 = false; + } else { + // The sub-value delimiter is always comma + $this->cWrite('red', ','); + } + + $subPart = strtr($subPart, array( + '\\' => $this->colorize('purple', '\\\\', 'green'), + ';' => $this->colorize('purple', '\;', 'green'), + ',' => $this->colorize('purple', '\,', 'green'), + "\n" => $this->colorize('purple', "\\n\n\t", 'green'), + "\r" => "", + )); + + $this->cWrite('green', $subPart); + } + } + + } + $this->cWrite("default", "\n"); + + } + + /** + * Parses the list of arguments. + * + * @param array $argv + * @return void + */ + protected function parseArguments(array $argv) { + + $positional = array(); + $options = array(); + + for($ii=0; $ii < count($argv); $ii++) { + + // Skipping the first argument. + if ($ii===0) continue; + + $v = $argv[$ii]; + + if (substr($v,0,2)==='--') { + // This is a long-form option. + $optionName = substr($v,2); + $optionValue = true; + if (strpos($optionName,'=')) { + list($optionName, $optionValue) = explode('=', $optionName); + } + $options[$optionName] = $optionValue; + } elseif (substr($v,0,1) === '-' && strlen($v)>1) { + // This is a short-form option. + foreach(str_split(substr($v,1)) as $option) { + $options[$option] = true; + } + + } else { + + $positional[] = $v; + + } + + } + + return array($options, $positional); + + } + + protected $parser; + + /** + * Reads the input file + * + * @return Component + */ + protected function readInput() { + + if (!$this->parser) { + if ($this->inputPath!=='-') { + $this->stdin = fopen($this->inputPath,'r'); + } + + if ($this->inputFormat === 'mimedir') { + $this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); + } else { + $this->parser = new Parser\Json($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); + } + } + + return $this->parser->parse(); + + } + + /** + * Sends a message to STDERR. + * + * @param string $msg + * @return void + */ + protected function log($msg, $color = 'default') { + + if (!$this->quiet) { + if ($color!=='default') { + $msg = $this->colorize($color, $msg); + } + fwrite($this->stderr, $msg . "\n"); + } + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component.php new file mode 100644 index 0000000000..6c01463c53 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component.php @@ -0,0 +1,566 @@ +value syntax, in which case + * properties will automatically be created, or you can just pass a list of + * Component and Property object. + * + * By default, a set of sensible values will be added to the component. For + * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To + * ensure that this does not happen, set $defaults to false. + * + * @param Document $root + * @param string $name such as VCALENDAR, VEVENT. + * @param array $children + * @param bool $defaults + * @return void + */ + public function __construct(Document $root, $name, array $children = array(), $defaults = true) { + + $this->name = strtoupper($name); + $this->root = $root; + + if ($defaults) { + $children = array_merge($this->getDefaults(), $children); + } + + foreach($children as $k=>$child) { + if ($child instanceof Node) { + + // Component or Property + $this->add($child); + } else { + + // Property key=>value + $this->add($k, $child); + } + } + + } + + /** + * Adds a new property or component, and returns the new item. + * + * This method has 3 possible signatures: + * + * add(Component $comp) // Adds a new component + * add(Property $prop) // Adds a new property + * add($name, $value, array $parameters = array()) // Adds a new property + * add($name, array $children = array()) // Adds a new component + * by name. + * + * @return Node + */ + public function add($a1, $a2 = null, $a3 = null) { + + if ($a1 instanceof Node) { + if (!is_null($a2)) { + throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node'); + } + $a1->parent = $this; + $this->children[] = $a1; + + return $a1; + + } elseif(is_string($a1)) { + + $item = $this->root->create($a1, $a2, $a3); + $item->parent = $this; + $this->children[] = $item; + + return $item; + + } else { + + throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string'); + + } + + } + + /** + * This method removes a component or property from this component. + * + * You can either specify the item by name (like DTSTART), in which case + * all properties/components with that name will be removed, or you can + * pass an instance of a property or component, in which case only that + * exact item will be removed. + * + * The removed item will be returned. In case there were more than 1 items + * removed, only the last one will be returned. + * + * @param mixed $item + * @return void + */ + public function remove($item) { + + if (is_string($item)) { + $children = $this->select($item); + foreach($children as $k=>$child) { + unset($this->children[$k]); + } + return $child; + } else { + foreach($this->children as $k => $child) { + if ($child===$item) { + unset($this->children[$k]); + return $child; + } + } + + throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component'); + + } + + } + + /** + * Returns an iterable list of children + * + * @return array + */ + public function children() { + + return $this->children; + + } + + /** + * This method only returns a list of sub-components. Properties are + * ignored. + * + * @return array + */ + public function getComponents() { + + $result = array(); + foreach($this->children as $child) { + if ($child instanceof Component) { + $result[] = $child; + } + } + + return $result; + + } + + /** + * Returns an array with elements that match the specified name. + * + * This function is also aware of MIME-Directory groups (as they appear in + * vcards). This means that if a property is grouped as "HOME.EMAIL", it + * will also be returned when searching for just "EMAIL". If you want to + * search for a property in a specific group, you can select on the entire + * string ("HOME.EMAIL"). If you want to search on a specific property that + * has not been assigned a group, specify ".EMAIL". + * + * Keys are retained from the 'children' array, which may be confusing in + * certain cases. + * + * @param string $name + * @return array + */ + public function select($name) { + + $group = null; + $name = strtoupper($name); + if (strpos($name,'.')!==false) { + list($group,$name) = explode('.', $name, 2); + } + + $result = array(); + foreach($this->children as $key=>$child) { + + if ( + strtoupper($child->name) === $name && + (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group)) + ) { + + $result[$key] = $child; + + } + } + + reset($result); + return $result; + + } + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + $str = "BEGIN:" . $this->name . "\r\n"; + + /** + * Gives a component a 'score' for sorting purposes. + * + * This is solely used by the childrenSort method. + * + * A higher score means the item will be lower in the list. + * To avoid score collisions, each "score category" has a reasonable + * space to accomodate elements. The $key is added to the $score to + * preserve the original relative order of elements. + * + * @param int $key + * @param array $array + * @return int + */ + $sortScore = function($key, $array) { + + if ($array[$key] instanceof Component) { + + // We want to encode VTIMEZONE first, this is a personal + // preference. + if ($array[$key]->name === 'VTIMEZONE') { + $score=300000000; + return $score+$key; + } else { + $score=400000000; + return $score+$key; + } + } else { + // Properties get encoded first + // VCARD version 4.0 wants the VERSION property to appear first + if ($array[$key] instanceof Property) { + if ($array[$key]->name === 'VERSION') { + $score=100000000; + return $score+$key; + } else { + // All other properties + $score=200000000; + return $score+$key; + } + } + } + + }; + + $tmp = $this->children; + uksort($this->children, function($a, $b) use ($sortScore, $tmp) { + + $sA = $sortScore($a, $tmp); + $sB = $sortScore($b, $tmp); + + return $sA - $sB; + + }); + + foreach($this->children as $child) $str.=$child->serialize(); + $str.= "END:" . $this->name . "\r\n"; + + return $str; + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + $components = array(); + $properties = array(); + + foreach($this->children as $child) { + if ($child instanceof Component) { + $components[] = $child->jsonSerialize(); + } else { + $properties[] = $child->jsonSerialize(); + } + } + + return array( + strtolower($this->name), + $properties, + $components + ); + + } + + /** + * This method should return a list of default property values. + * + * @return array + */ + protected function getDefaults() { + + return array(); + + } + + /* Magic property accessors {{{ */ + + /** + * Using 'get' you will either get a property or component. + * + * If there were no child-elements found with the specified name, + * null is returned. + * + * To use this, this may look something like this: + * + * $event = $calendar->VEVENT; + * + * @param string $name + * @return Property + */ + public function __get($name) { + + $matches = $this->select($name); + if (count($matches)===0) { + return null; + } else { + $firstMatch = current($matches); + /** @var $firstMatch Property */ + $firstMatch->setIterator(new ElementList(array_values($matches))); + return $firstMatch; + } + + } + + /** + * This method checks if a sub-element with the specified name exists. + * + * @param string $name + * @return bool + */ + public function __isset($name) { + + $matches = $this->select($name); + return count($matches)>0; + + } + + /** + * Using the setter method you can add properties or subcomponents + * + * You can either pass a Component, Property + * object, or a string to automatically create a Property. + * + * If the item already exists, it will be removed. If you want to add + * a new item with the same name, always use the add() method. + * + * @param string $name + * @param mixed $value + * @return void + */ + public function __set($name, $value) { + + $matches = $this->select($name); + $overWrite = count($matches)?key($matches):null; + + if ($value instanceof Component || $value instanceof Property) { + $value->parent = $this; + if (!is_null($overWrite)) { + $this->children[$overWrite] = $value; + } else { + $this->children[] = $value; + } + } elseif (is_scalar($value) || is_array($value) || is_null($value)) { + $property = $this->root->create($name,$value); + $property->parent = $this; + if (!is_null($overWrite)) { + $this->children[$overWrite] = $property; + } else { + $this->children[] = $property; + } + } else { + throw new \InvalidArgumentException('You must pass a \\Sabre\\VObject\\Component, \\Sabre\\VObject\\Property or scalar type'); + } + + } + + /** + * Removes all properties and components within this component with the + * specified name. + * + * @param string $name + * @return void + */ + public function __unset($name) { + + $matches = $this->select($name); + foreach($matches as $k=>$child) { + + unset($this->children[$k]); + $child->parent = null; + + } + + } + + /* }}} */ + + /** + * This method is automatically called when the object is cloned. + * Specifically, this will ensure all child elements are also cloned. + * + * @return void + */ + public function __clone() { + + foreach($this->children as $key=>$child) { + $this->children[$key] = clone $child; + $this->children[$key]->parent = $this; + } + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * * ? - May appear, but not more than once. + * + * It is also possible to specify defaults and severity levels for + * violating the rule. + * + * See the VEVENT implementation for getValidationRules for a more complex + * example. + * + * @var array + */ + public function getValidationRules() { + + return array(); + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * Node::REPAIR - May attempt to automatically repair the problem. + * + * This method returns an array with detected problems. + * Every element has the following properties: + * + * * level - problem level. + * * message - A human-readable string describing the issue. + * * node - A reference to the problematic node. + * + * The level means: + * 1 - The issue was repaired (only happens if REPAIR was turned on) + * 2 - An inconsequential issue + * 3 - A severe issue. + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $rules = $this->getValidationRules(); + $defaults = $this->getDefaults(); + + $propertyCounters = array(); + + $messages = array(); + + foreach($this->children as $child) { + $name = strtoupper($child->name); + if (!isset($propertyCounters[$name])) { + $propertyCounters[$name] = 1; + } else { + $propertyCounters[$name]++; + } + $messages = array_merge($messages, $child->validate($options)); + } + + foreach($rules as $propName => $rule) { + + switch($rule) { + case '0' : + if (isset($propertyCounters[$propName])) { + $messages[] = array( + 'level' => 3, + 'message' => $propName . ' MUST NOT appear in a ' . $this->name . ' component', + 'node' => $this, + ); + } + break; + case '1' : + if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName]!==1) { + $repaired = false; + if ($options & self::REPAIR && isset($defaults[$propName])) { + $this->add($propName, $defaults[$propName]); + } + $messages[] = array( + 'level' => $repaired?1:3, + 'message' => $propName . ' MUST appear exactly once in a ' . $this->name . ' component', + 'node' => $this, + ); + } + break; + case '+' : + if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] < 1) { + $messages[] = array( + 'level' => 3, + 'message' => $propName . ' MUST appear at least once in a ' . $this->name . ' component', + 'node' => $this, + ); + } + break; + case '*' : + break; + case '?' : + if (isset($propertyCounters[$propName]) && $propertyCounters[$propName] > 1) { + $messages[] = array( + 'level' => 3, + 'message' => $propName . ' MUST NOT appear more than once in a ' . $this->name . ' component', + 'node' => $this, + ); + } + break; + + } + + } + return $messages; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php new file mode 100644 index 0000000000..85ba7d73e0 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php @@ -0,0 +1,136 @@ +TRIGGER; + if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { + $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); + $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; + + $parentComponent = $this->parent; + if ($related === 'START') { + + if ($parentComponent->name === 'VTODO') { + $propName = 'DUE'; + } else { + $propName = 'DTSTART'; + } + + $effectiveTrigger = clone $parentComponent->$propName->getDateTime(); + $effectiveTrigger->add($triggerDuration); + } else { + if ($parentComponent->name === 'VTODO') { + $endProp = 'DUE'; + } elseif ($parentComponent->name === 'VEVENT') { + $endProp = 'DTEND'; + } else { + throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); + } + + if (isset($parentComponent->$endProp)) { + $effectiveTrigger = clone $parentComponent->$endProp->getDateTime(); + $effectiveTrigger->add($triggerDuration); + } elseif (isset($parentComponent->DURATION)) { + $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); + $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION); + $effectiveTrigger->add($duration); + $effectiveTrigger->add($triggerDuration); + } else { + $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); + $effectiveTrigger->add($triggerDuration); + } + } + } else { + $effectiveTrigger = $trigger->getDateTime(); + } + return $effectiveTrigger; + + } + + /** + * Returns true or false depending on if the event falls in the specified + * time-range. This is used for filtering purposes. + * + * The rules used to determine if an event falls within the specified + * time-range is based on the CalDAV specification. + * + * @param \DateTime $start + * @param \DateTime $end + * @return bool + */ + public function isInTimeRange(\DateTime $start, \DateTime $end) { + + $effectiveTrigger = $this->getEffectiveTriggerTime(); + + if (isset($this->DURATION)) { + $duration = VObject\DateTimeParser::parseDuration($this->DURATION); + $repeat = (string)$this->repeat; + if (!$repeat) { + $repeat = 1; + } + + $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); + + foreach($period as $occurrence) { + + if ($start <= $occurrence && $end > $occurrence) { + return true; + } + } + return false; + } else { + return ($start <= $effectiveTrigger && $end > $effectiveTrigger); + } + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + return array( + 'ACTION' => 1, + 'TRIGGER' => 1, + + 'DURATION' => '?', + 'REPEAT' => '?', + + 'ATTACH' => '?', + ); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php new file mode 100644 index 0000000000..016366e464 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php @@ -0,0 +1,391 @@ + 'Sabre\\VObject\\Component\\VAlarm', + 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent', + 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy', + 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal', + 'VTIMEZONE' => 'Sabre\\VObject\\Component\\VTimeZone', + 'VTODO' => 'Sabre\\VObject\\Component\\VTodo', + ); + + /** + * List of value-types, and which classes they map to. + * + * @var array + */ + static public $valueMap = array( + 'BINARY' => 'Sabre\\VObject\\Property\\Binary', + 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean', + 'CAL-ADDRESS' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', + 'DATE' => 'Sabre\\VObject\\Property\\ICalendar\\Date', + 'DATE-TIME' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', + 'FLOAT' => 'Sabre\\VObject\\Property\\Float', + 'INTEGER' => 'Sabre\\VObject\\Property\\Integer', + 'PERIOD' => 'Sabre\\VObject\\Property\\ICalendar\\Period', + 'RECUR' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', + 'TEXT' => 'Sabre\\VObject\\Property\\Text', + 'TIME' => 'Sabre\\VObject\\Property\\Time', + 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only. + 'URI' => 'Sabre\\VObject\\Property\\Uri', + 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset', + ); + + /** + * List of properties, and which classes they map to. + * + * @var array + */ + static public $propertyMap = array( + // Calendar properties + 'CALSCALE' => 'Sabre\\VObject\\Property\\FlatText', + 'METHOD' => 'Sabre\\VObject\\Property\\FlatText', + 'PRODID' => 'Sabre\\VObject\\Property\\FlatText', + 'VERSION' => 'Sabre\\VObject\\Property\\FlatText', + + // Component properties + 'ATTACH' => 'Sabre\\VObject\\Property\\Binary', + 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text', + 'CLASS' => 'Sabre\\VObject\\Property\\FlatText', + 'COMMENT' => 'Sabre\\VObject\\Property\\FlatText', + 'DESCRIPTION' => 'Sabre\\VObject\\Property\\FlatText', + 'GEO' => 'Sabre\\VObject\\Property\\Float', + 'LOCATION' => 'Sabre\\VObject\\Property\\FlatText', + 'PERCENT-COMPLETE' => 'Sabre\\VObject\\Property\\Integer', + 'PRIORITY' => 'Sabre\\VObject\\Property\\Integer', + 'RESOURCES' => 'Sabre\\VObject\\Property\\Text', + 'STATUS' => 'Sabre\\VObject\\Property\\FlatText', + 'SUMMARY' => 'Sabre\\VObject\\Property\\FlatText', + + // Date and Time Component Properties + 'COMPLETED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DTEND' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DUE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DTSTART' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', + 'FREEBUSY' => 'Sabre\\VObject\\Property\\ICalendar\\Period', + 'TRANSP' => 'Sabre\\VObject\\Property\\FlatText', + + // Time Zone Component Properties + 'TZID' => 'Sabre\\VObject\\Property\\FlatText', + 'TZNAME' => 'Sabre\\VObject\\Property\\FlatText', + 'TZOFFSETFROM' => 'Sabre\\VObject\\Property\\UtcOffset', + 'TZOFFSETTO' => 'Sabre\\VObject\\Property\\UtcOffset', + 'TZURL' => 'Sabre\\VObject\\Property\\Uri', + + // Relationship Component Properties + 'ATTENDEE' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', + 'CONTACT' => 'Sabre\\VObject\\Property\\FlatText', + 'ORGANIZER' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', + 'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'RELATED-TO' => 'Sabre\\VObject\\Property\\FlatText', + 'URL' => 'Sabre\\VObject\\Property\\Uri', + 'UID' => 'Sabre\\VObject\\Property\\FlatText', + + // Recurrence Component Properties + 'EXDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'RDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'RRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', + 'EXRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545 + + // Alarm Component Properties + 'ACTION' => 'Sabre\\VObject\\Property\\FlatText', + 'REPEAT' => 'Sabre\\VObject\\Property\\Integer', + 'TRIGGER' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', + + // Change Management Component Properties + 'CREATED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DTSTAMP' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'SEQUENCE' => 'Sabre\\VObject\\Property\\Integer', + + // Request Status + 'REQUEST-STATUS' => 'Sabre\\VObject\\Property\\Text', + + // Additions from draft-daboo-valarm-extensions-04 + 'ALARM-AGENT' => 'Sabre\\VObject\\Property\\Text', + 'ACKNOWLEDGED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'PROXIMITY' => 'Sabre\\VObject\\Property\\Text', + 'DEFAULT-ALARM' => 'Sabre\\VObject\\Property\\Boolean', + + ); + + /** + * Returns the current document type. + * + * @return void + */ + public function getDocumentType() { + + return self::ICALENDAR20; + + } + + /** + * Returns a list of all 'base components'. For instance, if an Event has + * a recurrence rule, and one instance is overridden, the overridden event + * will have the same UID, but will be excluded from this list. + * + * VTIMEZONE components will always be excluded. + * + * @param string $componentName filter by component name + * @return array + */ + public function getBaseComponents($componentName = null) { + + $components = array(); + foreach($this->children as $component) { + + if (!$component instanceof VObject\Component) + continue; + + if (isset($component->{'RECURRENCE-ID'})) + continue; + + if ($componentName && $component->name !== strtoupper($componentName)) + continue; + + if ($component->name === 'VTIMEZONE') + continue; + + $components[] = $component; + + } + + return $components; + + } + + /** + * If this calendar object, has events with recurrence rules, this method + * can be used to expand the event into multiple sub-events. + * + * Each event will be stripped from it's recurrence information, and only + * the instances of the event in the specified timerange will be left + * alone. + * + * In addition, this method will cause timezone information to be stripped, + * and normalized to UTC. + * + * This method will alter the VCalendar. This cannot be reversed. + * + * This functionality is specifically used by the CalDAV standard. It is + * possible for clients to request expand events, if they are rather simple + * clients and do not have the possibility to calculate recurrences. + * + * @param DateTime $start + * @param DateTime $end + * @return void + */ + public function expand(\DateTime $start, \DateTime $end) { + + $newEvents = array(); + + foreach($this->select('VEVENT') as $key=>$vevent) { + + if (isset($vevent->{'RECURRENCE-ID'})) { + unset($this->children[$key]); + continue; + } + + + if (!$vevent->rrule) { + unset($this->children[$key]); + if ($vevent->isInTimeRange($start, $end)) { + $newEvents[] = $vevent; + } + continue; + } + + $uid = (string)$vevent->uid; + if (!$uid) { + throw new \LogicException('Event did not have a UID!'); + } + + $it = new VObject\RecurrenceIterator($this, $vevent->uid); + $it->fastForward($start); + + while($it->valid() && $it->getDTStart() < $end) { + + if ($it->getDTEnd() > $start) { + + $newEvents[] = $it->getEventObject(); + + } + $it->next(); + + } + unset($this->children[$key]); + + } + + // Setting all properties to UTC time. + foreach($newEvents as $newEvent) { + + foreach($newEvent->children as $child) { + if ($child instanceof VObject\Property\ICalendar\DateTime && $child->hasTime()) { + $dt = $child->getDateTimes(); + // We only need to update the first timezone, because + // setDateTimes will match all other timezones to the + // first. + $dt[0]->setTimeZone(new \DateTimeZone('UTC')); + $child->setDateTimes($dt); + } + + } + + $this->add($newEvent); + + } + + // Removing all VTIMEZONE components + unset($this->VTIMEZONE); + + } + + /** + * This method should return a list of default property values. + * + * @return array + */ + protected function getDefaults() { + + return array( + 'VERSION' => '2.0', + 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', + 'CALSCALE' => 'GREGORIAN', + ); + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + return array( + 'PRODID' => 1, + 'VERSION' => 1, + + 'CALSCALE' => '?', + 'METHOD' => '?', + ); + + } + + /** + * Validates the node for correctness. + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @return array + */ + public function validate($options = 0) { + + $warnings = parent::validate(); + + if ($ver = $this->VERSION) { + if ((string)$ver !== '2.0') { + $warnings[] = array( + 'level' => 3, + 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', + 'node' => $this, + ); + } + + } + + $uidList = array(); + + $componentsFound = 0; + foreach($this->children as $child) { + if($child instanceof Component) { + $componentsFound++; + + if (!in_array($child->name, array('VEVENT', 'VTODO', 'VJOURNAL'))) { + continue; + } + + $uid = (string)$child->UID; + $isMaster = isset($child->{'RECURRENCE-ID'})?0:1; + if (isset($uidList[$uid])) { + $uidList[$uid]['count']++; + if ($isMaster && $uidList[$uid]['hasMaster']) { + $warnings[] = array( + 'level' => 3, + 'message' => 'More than one master object was found for the object with UID ' . $uid, + 'node' => $this, + ); + } + $uidList[$uid]['hasMaster']+=$isMaster; + } else { + $uidList[$uid] = array( + 'count' => 1, + 'hasMaster' => $isMaster, + ); + } + + } + } + + if ($componentsFound===0) { + $warnings[] = array( + 'level' => 3, + 'message' => 'An iCalendar object must have at least 1 component.', + 'node' => $this, + ); + } + + return $warnings; + + } + +} + diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php new file mode 100644 index 0000000000..1fecded082 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php @@ -0,0 +1,431 @@ + 'Sabre\\VObject\\Property\\Binary', + 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean', + 'CONTENT-ID' => 'Sabre\\VObject\\Property\\FlatText', // vCard 2.1 only + 'DATE' => 'Sabre\\VObject\\Property\\VCard\\Date', + 'DATE-TIME' => 'Sabre\\VObject\\Property\\VCard\\DateTime', + 'DATE-AND-OR-TIME' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', // vCard only + 'FLOAT' => 'Sabre\\VObject\\Property\\Float', + 'INTEGER' => 'Sabre\\VObject\\Property\\Integer', + 'LANGUAGE-TAG' => 'Sabre\\VObject\\Property\\VCard\\LanguageTag', + 'TIMESTAMP' => 'Sabre\\VObject\\Property\\VCard\\TimeStamp', + 'TEXT' => 'Sabre\\VObject\\Property\\Text', + 'TIME' => 'Sabre\\VObject\\Property\\Time', + 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only. + 'URI' => 'Sabre\\VObject\\Property\\Uri', + 'URL' => 'Sabre\\VObject\\Property\\Uri', // vCard 2.1 only + 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset', + ); + + /** + * List of properties, and which classes they map to. + * + * @var array + */ + static public $propertyMap = array( + + // vCard 2.1 properties and up + 'N' => 'Sabre\\VObject\\Property\\Text', + 'FN' => 'Sabre\\VObject\\Property\\FlatText', + 'PHOTO' => 'Sabre\\VObject\\Property\\Binary', // Todo: we should add a class for Binary values. + 'BDAY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', + 'ADR' => 'Sabre\\VObject\\Property\\Text', + 'LABEL' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + 'TEL' => 'Sabre\\VObject\\Property\\FlatText', + 'EMAIL' => 'Sabre\\VObject\\Property\\FlatText', + 'MAILER' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + 'GEO' => 'Sabre\\VObject\\Property\\FlatText', + 'TITLE' => 'Sabre\\VObject\\Property\\FlatText', + 'ROLE' => 'Sabre\\VObject\\Property\\FlatText', + 'LOGO' => 'Sabre\\VObject\\Property\\Binary', + // 'AGENT' => 'Sabre\\VObject\\Property\\', // Todo: is an embedded vCard. Probably rare, so + // not supported at the moment + 'ORG' => 'Sabre\\VObject\\Property\\Text', + 'NOTE' => 'Sabre\\VObject\\Property\\FlatText', + 'REV' => 'Sabre\\VObject\\Property\\VCard\\TimeStamp', + 'SOUND' => 'Sabre\\VObject\\Property\\FlatText', + 'URL' => 'Sabre\\VObject\\Property\\Uri', + 'UID' => 'Sabre\\VObject\\Property\\FlatText', + 'VERSION' => 'Sabre\\VObject\\Property\\FlatText', + 'KEY' => 'Sabre\\VObject\\Property\\FlatText', + 'TZ' => 'Sabre\\VObject\\Property\\Text', + + // vCard 3.0 properties + 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text', + 'SORT-STRING' => 'Sabre\\VObject\\Property\\FlatText', + 'PRODID' => 'Sabre\\VObject\\Property\\FlatText', + 'NICKNAME' => 'Sabre\\VObject\\Property\\Text', + 'CLASS' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + + // rfc2739 properties + 'FBURL' => 'Sabre\\VObject\\Property\\Uri', + 'CAPURI' => 'Sabre\\VObject\\Property\\Uri', + 'CALURI' => 'Sabre\\VObject\\Property\\Uri', + + // rfc4770 properties + 'IMPP' => 'Sabre\\VObject\\Property\\Uri', + + // vCard 4.0 properties + 'XML' => 'Sabre\\VObject\\Property\\FlatText', + 'ANNIVERSARY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', + 'CLIENTPIDMAP' => 'Sabre\\VObject\\Property\\Text', + 'LANG' => 'Sabre\\VObject\\Property\\VCard\\LanguageTag', + 'GENDER' => 'Sabre\\VObject\\Property\\Text', + 'KIND' => 'Sabre\\VObject\\Property\\FlatText', + + // rfc6474 properties + 'BIRTHPLACE' => 'Sabre\\VObject\\Property\\FlatText', + 'DEATHPLACE' => 'Sabre\\VObject\\Property\\FlatText', + 'DEATHDATE' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', + + // rfc6715 properties + 'EXPERTISE' => 'Sabre\\VObject\\Property\\FlatText', + 'HOBBY' => 'Sabre\\VObject\\Property\\FlatText', + 'INTEREST' => 'Sabre\\VObject\\Property\\FlatText', + 'ORG-DIRECTORY' => 'Sabre\\VObject\\Property\\FlatText', + + ); + + /** + * Returns the current document type. + * + * @return void + */ + public function getDocumentType() { + + if (!$this->version) { + $version = (string)$this->VERSION; + switch($version) { + case '2.1' : + $this->version = self::VCARD21; + break; + case '3.0' : + $this->version = self::VCARD30; + break; + case '4.0' : + $this->version = self::VCARD40; + break; + default : + $this->version = self::UNKNOWN; + break; + + } + } + + return $this->version; + + } + + /** + * Converts the document to a different vcard version. + * + * Use one of the VCARD constants for the target. This method will return + * a copy of the vcard in the new version. + * + * At the moment the only supported conversion is from 3.0 to 4.0. + * + * If input and output version are identical, a clone is returned. + * + * @param int $target + * @return VCard + */ + public function convert($target) { + + $converter = new VObject\VCardConverter(); + return $converter->convert($this, $target); + + } + + /** + * VCards with version 2.1, 3.0 and 4.0 are found. + * + * If the VCARD doesn't know its version, 2.1 is assumed. + */ + const DEFAULT_VERSION = self::VCARD21; + + /** + * Validates the node for correctness. + * + * The following options are supported: + * Node::REPAIR - May attempt to automatically repair the problem. + * + * This method returns an array with detected problems. + * Every element has the following properties: + * + * * level - problem level. + * * message - A human-readable string describing the issue. + * * node - A reference to the problematic node. + * + * The level means: + * 1 - The issue was repaired (only happens if REPAIR was turned on) + * 2 - An inconsequential issue + * 3 - A severe issue. + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = array(); + + $versionMap = array( + self::VCARD21 => '2.1', + self::VCARD30 => '3.0', + self::VCARD40 => '4.0', + ); + + $version = $this->select('VERSION'); + if (count($version)===1) { + $version = (string)$this->VERSION; + if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') { + $warnings[] = array( + 'level' => 3, + 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->VERSION = $versionMap[self::DEFAULT_VERSION]; + } + } + + } + $fn = $this->select('FN'); + if (count($fn)!==1) { + + $repaired = false; + if (($options & self::REPAIR) && count($fn) === 0) { + // We're going to try to see if we can use the contents of the + // N property. + if (isset($this->N)) { + $value = explode(';', (string)$this->N); + if (isset($value[1]) && $value[1]) { + $this->FN = $value[1] . ' ' . $value[0]; + } else { + $this->FN = $value[0]; + } + $repaired = true; + + // Otherwise, the ORG property may work + } elseif (isset($this->ORG)) { + $this->FN = (string)$this->ORG; + $repaired = true; + } + + } + $warnings[] = array( + 'level' => $repaired?1:3, + 'message' => 'The FN property must appear in the VCARD component exactly 1 time', + 'node' => $this, + ); + } + + return array_merge( + parent::validate($options), + $warnings + ); + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + return array( + 'ADR' => '*', + 'ANNIVERSARY' => '?', + 'BDAY' => '?', + 'CALADRURI' => '*', + 'CALURI' => '*', + 'CATEGORIES' => '*', + 'CLIENTPIDMAP' => '*', + 'EMAIL' => '*', + 'FBURL' => '*', + 'IMPP' => '*', + 'GENDER' => '?', + 'GEO' => '*', + 'KEY' => '*', + 'KIND' => '?', + 'LANG' => '*', + 'LOGO' => '*', + 'MEMBER' => '*', + 'N' => '?', + 'NICKNAME' => '*', + 'NOTE' => '*', + 'ORG' => '*', + 'PHOTO' => '*', + 'PRODID' => '?', + 'RELATED' => '*', + 'REV' => '?', + 'ROLE' => '*', + 'SOUND' => '*', + 'SOURCE' => '*', + 'TEL' => '*', + 'TITLE' => '*', + 'TZ' => '*', + 'URL' => '*', + 'VERSION' => '1', + 'XML' => '*', + + // FN is commented out, because it's already handled by the + // validate function, which may also try to repair it. + // 'FN' => '+', + + // vcard actually specifies this as '?', but in most cases not + // having a UID is highly undesirable. So here we're going against + // the spec and make it required. + // + // I would be interested to hear if this is problematic for + // anyone, or at least a usecase where this is undesirable. + // + // If so, I may have to add a facility that allows us to check + // specifically for validity in the context of 'DAV'. + 'UID' => '1', + ); + + } + + /** + * Returns a preferred field. + * + * VCards can indicate wether a field such as ADR, TEL or EMAIL is + * preferred by specifying TYPE=PREF (vcard 2.1, 3) or PREF=x (vcard 4, x + * being a number between 1 and 100). + * + * If neither of those parameters are specified, the first is returned, if + * a field with that name does not exist, null is returned. + * + * @param string $fieldName + * @return VObject\Property|null + */ + public function preferred($propertyName) { + + $preferred = null; + $lastPref = 101; + foreach($this->select($propertyName) as $field) { + + $pref = 101; + if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) { + $pref = 1; + } elseif (isset($field['PREF'])) { + $pref = $field['PREF']->getValue(); + } + + if ($pref < $lastPref || is_null($preferred)) { + $preferred = $field; + $lastPref = $pref; + } + + } + return $preferred; + + } + + /** + * This method should return a list of default property values. + * + * @return array + */ + protected function getDefaults() { + + return array( + 'VERSION' => '3.0', + 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', + ); + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + // A vcard does not have sub-components, so we're overriding this + // method to remove that array element. + $properties = array(); + + foreach($this->children as $child) { + $properties[] = $child->jsonSerialize(); + } + + return array( + strtolower($this->name), + $properties, + ); + + } + + /** + * Returns the default class for a property name. + * + * @param string $propertyName + * @return string + */ + public function getClassNameForPropertyName($propertyName) { + + $className = parent::getClassNameForPropertyName($propertyName); + // In vCard 4, BINARY no longer exists, and we need URI instead. + + if ($className == 'Sabre\\VObject\\Property\\Binary' && $this->getDocumentType()===self::VCARD40) { + return 'Sabre\\VObject\\Property\\Uri'; + } + return $className; + + } + +} + diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php new file mode 100644 index 0000000000..d9b1f06a5e --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php @@ -0,0 +1,123 @@ +RRULE) { + $it = new VObject\RecurrenceIterator($this); + $it->fastForward($start); + + // We fast-forwarded to a spot where the end-time of the + // recurrence instance exceeded the start of the requested + // time-range. + // + // If the starttime of the recurrence did not exceed the + // end of the time range as well, we have a match. + return ($it->getDTStart() < $end && $it->getDTEnd() > $start); + + } + + $effectiveStart = $this->DTSTART->getDateTime(); + if (isset($this->DTEND)) { + + // The DTEND property is considered non inclusive. So for a 3 day + // event in july, dtstart and dtend would have to be July 1st and + // July 4th respectively. + // + // See: + // http://tools.ietf.org/html/rfc5545#page-54 + $effectiveEnd = $this->DTEND->getDateTime(); + + } elseif (isset($this->DURATION)) { + $effectiveEnd = clone $effectiveStart; + $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) ); + } elseif (!$this->DTSTART->hasTime()) { + $effectiveEnd = clone $effectiveStart; + $effectiveEnd->modify('+1 day'); + } else { + $effectiveEnd = clone $effectiveStart; + } + return ( + ($start <= $effectiveEnd) && ($end > $effectiveStart) + ); + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + $hasMethod = isset($this->parent->METHOD); + return array( + 'UID' => 1, + 'DTSTAMP' => 1, + 'DTSTART' => $hasMethod?'?':'1', + 'CLASS' => '?', + 'CREATED' => '?', + 'DESCRIPTION' => '?', + 'GEO' => '?', + 'LAST-MODIFICATION' => '?', + 'LOCATION' => '?', + 'ORGANIZER' => '?', + 'PRIORITY' => '?', + 'SEQUENCE' => '?', + 'STATUS' => '?', + 'SUMMARY' => '?', + 'TRANSP' => '?', + 'URL' => '?', + 'RECURRENCE-ID' => '?', + 'RRULE' => '?', + 'DTEND' => '?', + 'DURATION' => '?', + + 'ATTACH' => '*', + 'ATTENDEE' => '*', + 'CATEGORIES' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', + 'EXDATE' => '*', + 'REQUEST-STATUS' => '*', + 'RELATED' => '*', + 'RESOURCES' => '*', + 'RDATE' => '*', + ); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php new file mode 100644 index 0000000000..9b9fcbe3e5 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php @@ -0,0 +1,102 @@ +select('FREEBUSY') as $freebusy) { + + // We are only interested in FBTYPE=BUSY (the default), + // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. + if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') { + continue; + } + + // The freebusy component can hold more than 1 value, separated by + // commas. + $periods = explode(',', (string)$freebusy); + + foreach($periods as $period) { + // Every period is formatted as [start]/[end]. The start is an + // absolute UTC time, the end may be an absolute UTC time, or + // duration (relative) value. + list($busyStart, $busyEnd) = explode('/', $period); + + $busyStart = VObject\DateTimeParser::parse($busyStart); + $busyEnd = VObject\DateTimeParser::parse($busyEnd); + if ($busyEnd instanceof \DateInterval) { + $tmp = clone $busyStart; + $tmp->add($busyEnd); + $busyEnd = $tmp; + } + + if($start < $busyEnd && $end > $busyStart) { + return false; + } + + } + + } + + return true; + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + return array( + 'UID' => 1, + 'DTSTAMP' => 1, + + 'CONTACT' => '?', + 'DTSTART' => '?', + 'DTEND' => '?', + 'ORGANIZER' => '?', + 'URL' => '?', + + 'ATTENDEE' => '*', + 'COMMENT' => '*', + 'FREEBUSY' => '*', + 'REQUEST-STATUS' => '*', + ); + + } + +} + diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php new file mode 100644 index 0000000000..24ba57d5f5 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php @@ -0,0 +1,90 @@ +DTSTART)?$this->DTSTART->getDateTime():null; + if ($dtstart) { + $effectiveEnd = clone $dtstart; + if (!$this->DTSTART->hasTime()) { + $effectiveEnd->modify('+1 day'); + } + + return ($start <= $effectiveEnd && $end > $dtstart); + + } + return false; + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + return array( + 'UID' => 1, + 'DTSTAMP' => 1, + + 'CLASS' => '?', + 'CREATED' => '?', + 'DTSTART' => '?', + 'LAST-MODIFICATION' => '?', + 'ORGANIZER' => '?', + 'RECURRENCE-ID' => '?', + 'SEQUENCE' => '?', + 'STATUS' => '?', + 'SUMMARY' => '?', + 'URL' => '?', + + 'RRULE' => '?', + + 'ATTACH' => '*', + 'ATTENDEE' => '*', + 'CATEGORIES' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', + 'DESCRIPTION' => '*', + 'EXDATE' => '*', + 'RELATED' => '*', + 'RDATE' => '*', + ); + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTimeZone.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTimeZone.php new file mode 100644 index 0000000000..61b3bdb1e2 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTimeZone.php @@ -0,0 +1,53 @@ + 1, + + 'LAST-MODIFICATION' => '?', + 'TZURL' => '?', + + // At least 1 STANDARD or DAYLIGHT must appear, or more. But both + // cannot appear in the same VTIMEZONE. + // + // The validator is not specific yet to pick this up, so these + // rules are too loose. + 'STANDARD' => '*', + 'DAYLIGHT' => '*', + ); + + } + +} + diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php new file mode 100644 index 0000000000..5b7e0e59ed --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php @@ -0,0 +1,123 @@ +DTSTART)?$this->DTSTART->getDateTime():null; + $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null; + $due = isset($this->DUE)?$this->DUE->getDateTime():null; + $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null; + $created = isset($this->CREATED)?$this->CREATED->getDateTime():null; + + if ($dtstart) { + if ($duration) { + $effectiveEnd = clone $dtstart; + $effectiveEnd->add($duration); + return $start <= $effectiveEnd && $end > $dtstart; + } elseif ($due) { + return + ($start < $due || $start <= $dtstart) && + ($end > $dtstart || $end >= $due); + } else { + return $start <= $dtstart && $end > $dtstart; + } + } + if ($due) { + return ($start < $due && $end >= $due); + } + if ($completed && $created) { + return + ($start <= $created || $start <= $completed) && + ($end >= $created || $end >= $completed); + } + if ($completed) { + return ($start <= $completed && $end >= $completed); + } + if ($created) { + return ($end > $created); + } + return true; + + } + + /** + * A simple list of validation rules. + * + * This is simply a list of properties, and how many times they either + * must or must not appear. + * + * Possible values per property: + * * 0 - Must not appear. + * * 1 - Must appear exactly once. + * * + - Must appear at least once. + * * * - Can appear any number of times. + * + * @var array + */ + public function getValidationRules() { + + return array( + 'UID' => 1, + 'DTSTAMP' => 1, + + 'CLASS' => '?', + 'COMPLETED' => '?', + 'CREATED' => '?', + 'DESCRIPTION' => '?', + 'DTSTART' => '?', + 'GEO' => '?', + 'LAST-MODIFICATION' => '?', + 'LOCATION' => '?', + 'ORGANIZER' => '?', + 'PERCENT' => '?', + 'PRIORITY' => '?', + 'RECURRENCE-ID' => '?', + 'SEQUENCE' => '?', + 'STATUS' => '?', + 'SUMMARY' => '?', + 'URL' => '?', + + 'RRULE' => '?', + 'DUE' => '?', + 'DURATION' => '?', + + 'ATTACH' => '*', + 'ATTENDEE' => '*', + 'CATEGORIES' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', + 'EXDATE' => '*', + 'REQUEST-STATUS' => '*', + 'RELATED' => '*', + 'RESOURCES' => '*', + 'RDATE' => '*', + ); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php b/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php new file mode 100644 index 0000000000..ce6f1b65af --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php @@ -0,0 +1,415 @@ +setTimeZone(new \DateTimeZone('UTC')); + return $date; + + } + + /** + * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object + * + * @param string $date + * @return DateTime + */ + static public function parseDate($date) { + + // Format is YYYYMMDD + $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/',$date,$matches); + + if (!$result) { + throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date); + } + + $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC')); + return $date; + + } + + /** + * Parses an iCalendar (RFC5545) formatted duration value. + * + * This method will either return a DateTimeInterval object, or a string + * suitable for strtotime or DateTime::modify. + * + * @param string $duration + * @param bool $asString + * @return DateInterval|string + */ + static public function parseDuration($duration, $asString = false) { + + $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); + if (!$result) { + throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration); + } + + if (!$asString) { + $invert = false; + if ($matches['plusminus']==='-') { + $invert = true; + } + + + $parts = array( + 'week', + 'day', + 'hour', + 'minute', + 'second', + ); + foreach($parts as $part) { + $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0; + } + + + // We need to re-construct the $duration string, because weeks and + // days are not supported by DateInterval in the same string. + $duration = 'P'; + $days = $matches['day']; + if ($matches['week']) { + $days+=$matches['week']*7; + } + if ($days) + $duration.=$days . 'D'; + + if ($matches['minute'] || $matches['second'] || $matches['hour']) { + $duration.='T'; + + if ($matches['hour']) + $duration.=$matches['hour'].'H'; + + if ($matches['minute']) + $duration.=$matches['minute'].'M'; + + if ($matches['second']) + $duration.=$matches['second'].'S'; + + } + + if ($duration==='P') { + $duration = 'PT0S'; + } + $iv = new \DateInterval($duration); + if ($invert) $iv->invert = true; + + return $iv; + + } + + + + $parts = array( + 'week', + 'day', + 'hour', + 'minute', + 'second', + ); + + $newDur = ''; + foreach($parts as $part) { + if (isset($matches[$part]) && $matches[$part]) { + $newDur.=' '.$matches[$part] . ' ' . $part . 's'; + } + } + + $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); + if ($newDur === '+') { $newDur = '+0 seconds'; }; + return $newDur; + + } + + /** + * Parses either a Date or DateTime, or Duration value. + * + * @param string $date + * @param DateTimeZone|string $referenceTZ + * @return DateTime|DateInterval + */ + static public function parse($date, $referenceTZ = null) { + + if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) { + return self::parseDuration($date); + } elseif (strlen($date)===8) { + return self::parseDate($date); + } else { + return self::parseDateTime($date, $referenceTZ); + } + + } + + /** + * This method parses a vCard date and or time value. + * + * This can be used for the DATE, DATE-TIME, TIMESTAMP and + * DATE-AND-OR-TIME value. + * + * This method returns an array, not a DateTime value. + * + * The elements in the array are in the following order: + * year, month, date, hour, minute, second, timezone + * + * Almost any part of the string may be omitted. It's for example legal to + * just specify seconds, leave out the year, etc. + * + * Timezone is either returned as 'Z' or as '+08:00' + * + * For any non-specified values null is returned. + * + * List of date formats that are supported: + * YYYY + * YYYY-MM + * YYYYMMDD + * --MMDD + * ---DD + * + * YYYY-MM-DD + * --MM-DD + * ---DD + * + * List of supported time formats: + * + * HH + * HHMM + * HHMMSS + * -MMSS + * --SS + * + * HH + * HH:MM + * HH:MM:SS + * -MM:SS + * --SS + * + * A full basic-format date-time string looks like : + * 20130603T133901 + * + * A full extended-format date-time string looks like : + * 2013-06-03T13:39:01 + * + * Times may be postfixed by a timezone offset. This can be either 'Z' for + * UTC, or a string like -0500 or +1100. + * + * @param string $date + * @return array + */ + static public function parseVCardDateTime($date) { + + $regex = '/^ + (?: # date part + (?: + (?: (?P [0-9]{4}) (?: -)?| --) + (?P [0-9]{2})? + |---) + (?P [0-9]{2})? + )? + (?:T # time part + (?P [0-9]{2} | -) + (?P [0-9]{2} | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{4}) + + )? + + )? + $/x'; + + + if (!preg_match($regex, $date, $matches)) { + + // Attempting to parse the extended format. + $regex = '/^ + (?: # date part + (?: (?P [0-9]{4}) - | -- ) + (?P [0-9]{2}) - + (?P [0-9]{2}) + )? + (?:T # time part + + (?: (?P [0-9]{2}) : | -) + (?: (?P [0-9]{2}) : | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) + + )? + + )? + $/x'; + + if (!preg_match($regex, $date, $matches)) { + throw new \InvalidArgumentException('Invalid vCard date-time string: ' . $date); + } + + } + $parts = array( + 'year', + 'month', + 'date', + 'hour', + 'minute', + 'second', + 'timezone' + ); + + $result = array(); + foreach($parts as $part) { + + if (empty($matches[$part])) { + $result[$part] = null; + } elseif ($matches[$part] === '-' || $matches[$part] === '--') { + $result[$part] = null; + } else { + $result[$part] = $matches[$part]; + } + + } + + return $result; + + } + + /** + * This method parses a vCard TIME value. + * + * This method returns an array, not a DateTime value. + * + * The elements in the array are in the following order: + * hour, minute, second, timezone + * + * Almost any part of the string may be omitted. It's for example legal to + * just specify seconds, leave out the hour etc. + * + * Timezone is either returned as 'Z' or as '+08:00' + * + * For any non-specified values null is returned. + * + * List of supported time formats: + * + * HH + * HHMM + * HHMMSS + * -MMSS + * --SS + * + * HH + * HH:MM + * HH:MM:SS + * -MM:SS + * --SS + * + * A full basic-format time string looks like : + * 133901 + * + * A full extended-format time string looks like : + * 13:39:01 + * + * Times may be postfixed by a timezone offset. This can be either 'Z' for + * UTC, or a string like -0500 or +11:00. + * + * @param string $date + * @return array + */ + static public function parseVCardTime($date) { + + $regex = '/^ + (?P [0-9]{2} | -) + (?P [0-9]{2} | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{4}) + + )? + $/x'; + + + if (!preg_match($regex, $date, $matches)) { + + // Attempting to parse the extended format. + $regex = '/^ + (?: (?P [0-9]{2}) : | -) + (?: (?P [0-9]{2}) : | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) + + )? + $/x'; + + if (!preg_match($regex, $date, $matches)) { + throw new \InvalidArgumentException('Invalid vCard time string: ' . $date); + } + + } + $parts = array( + 'hour', + 'minute', + 'second', + 'timezone' + ); + + $result = array(); + foreach($parts as $part) { + + if (empty($matches[$part])) { + $result[$part] = null; + } elseif ($matches[$part] === '-') { + $result[$part] = null; + } else { + $result[$part] = $matches[$part]; + } + + } + + return $result; + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Document.php b/vendor/sabre/vobject/lib/Sabre/VObject/Document.php new file mode 100644 index 0000000000..45fd62c81b --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Document.php @@ -0,0 +1,261 @@ +value syntax, in which case + * properties will automatically be created, or you can just pass a list of + * Component and Property object. + * + * By default, a set of sensible values will be added to the component. For + * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To + * ensure that this does not happen, set $defaults to false. + * + * @param string $name + * @param array $children + * @param bool $defaults + * @return Component + */ + public function createComponent($name, array $children = null, $defaults = true) { + + $name = strtoupper($name); + $class = 'Sabre\\VObject\\Component'; + + if (isset(static::$componentMap[$name])) { + $class=static::$componentMap[$name]; + } + if (is_null($children)) $children = array(); + return new $class($this, $name, $children, $defaults); + + } + + /** + * Factory method for creating new properties + * + * This method automatically searches for the correct property class, based + * on its name. + * + * You can specify the parameters either in key=>value syntax, in which case + * parameters will automatically be created, or you can just pass a list of + * Parameter objects. + * + * @param string $name + * @param mixed $value + * @param array $parameters + * @param string $valueType Force a specific valuetype, such as URI or TEXT + * @return Property + */ + public function createProperty($name, $value = null, array $parameters = null, $valueType = null) { + + // If there's a . in the name, it means it's prefixed by a groupname. + if (($i=strpos($name,'.'))!==false) { + $group = substr($name, 0, $i); + $name = strtoupper(substr($name, $i+1)); + } else { + $name = strtoupper($name); + $group = null; + } + + $class = null; + + if ($valueType) { + // The valueType argument comes first to figure out the correct + // class. + $class = $this->getClassNameForPropertyValue($valueType); + } + + if (is_null($class) && isset($parameters['VALUE'])) { + // If a VALUE parameter is supplied, we should use that. + $class = $this->getClassNameForPropertyValue($parameters['VALUE']); + } + if (is_null($class)) { + $class = $this->getClassNameForPropertyName($name); + } + if (is_null($parameters)) $parameters = array(); + + return new $class($this, $name, $value, $parameters, $group); + + } + + /** + * This method returns a full class-name for a value parameter. + * + * For instance, DTSTART may have VALUE=DATE. In that case we will look in + * our valueMap table and return the appropriate class name. + * + * This method returns null if we don't have a specialized class. + * + * @param string $valueParam + * @return void + */ + public function getClassNameForPropertyValue($valueParam) { + + $valueParam = strtoupper($valueParam); + if (isset(static::$valueMap[$valueParam])) { + return static::$valueMap[$valueParam]; + } + + } + + /** + * Returns the default class for a property name. + * + * @param string $propertyName + * @return string + */ + public function getClassNameForPropertyName($propertyName) { + + if (isset(static::$propertyMap[$propertyName])) { + return static::$propertyMap[$propertyName]; + } else { + return 'Sabre\\VObject\\Property\\Unknown'; + } + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php b/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php new file mode 100644 index 0000000000..9b3c49dd99 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php @@ -0,0 +1,172 @@ +vevent where there's multiple VEVENT objects. + * + * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/). + * @author Evert Pot (http://evertpot.com/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class ElementList implements \Iterator, \Countable, \ArrayAccess { + + /** + * Inner elements + * + * @var array + */ + protected $elements = array(); + + /** + * Creates the element list. + * + * @param array $elements + */ + public function __construct(array $elements) { + + $this->elements = $elements; + + } + + /* {{{ Iterator interface */ + + /** + * Current position + * + * @var int + */ + private $key = 0; + + /** + * Returns current item in iteration + * + * @return Element + */ + public function current() { + + return $this->elements[$this->key]; + + } + + /** + * To the next item in the iterator + * + * @return void + */ + public function next() { + + $this->key++; + + } + + /** + * Returns the current iterator key + * + * @return int + */ + public function key() { + + return $this->key; + + } + + /** + * Returns true if the current position in the iterator is a valid one + * + * @return bool + */ + public function valid() { + + return isset($this->elements[$this->key]); + + } + + /** + * Rewinds the iterator + * + * @return void + */ + public function rewind() { + + $this->key = 0; + + } + + /* }}} */ + + /* {{{ Countable interface */ + + /** + * Returns the number of elements + * + * @return int + */ + public function count() { + + return count($this->elements); + + } + + /* }}} */ + + /* {{{ ArrayAccess Interface */ + + + /** + * Checks if an item exists through ArrayAccess. + * + * @param int $offset + * @return bool + */ + public function offsetExists($offset) { + + return isset($this->elements[$offset]); + + } + + /** + * Gets an item through ArrayAccess. + * + * @param int $offset + * @return mixed + */ + public function offsetGet($offset) { + + return $this->elements[$offset]; + + } + + /** + * Sets an item through ArrayAccess. + * + * @param int $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset,$value) { + + throw new \LogicException('You can not add new objects to an ElementList'); + + } + + /** + * Sets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return void + */ + public function offsetUnset($offset) { + + throw new \LogicException('You can not remove objects from an ElementList'); + + } + + /* }}} */ + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/EofException.php b/vendor/sabre/vobject/lib/Sabre/VObject/EofException.php new file mode 100644 index 0000000000..1bd00155fb --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/EofException.php @@ -0,0 +1,13 @@ +setTimeRange($start, $end); + } + + if ($objects) { + $this->setObjects($objects); + } + + } + + /** + * Sets the VCALENDAR object. + * + * If this is set, it will not be generated for you. You are responsible + * for setting things like the METHOD, CALSCALE, VERSION, etc.. + * + * The VFREEBUSY object will be automatically added though. + * + * @param Component $vcalendar + * @return void + */ + public function setBaseObject(Component $vcalendar) { + + $this->baseObject = $vcalendar; + + } + + /** + * Sets the input objects + * + * You must either specify a valendar object as a strong, or as the parse + * Component. + * It's also possible to specify multiple objects as an array. + * + * @param mixed $objects + * @return void + */ + public function setObjects($objects) { + + if (!is_array($objects)) { + $objects = array($objects); + } + + $this->objects = array(); + foreach($objects as $object) { + + if (is_string($object)) { + $this->objects[] = Reader::read($object); + } elseif ($object instanceof Component) { + $this->objects[] = $object; + } else { + throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects'); + } + + } + + } + + /** + * Sets the time range + * + * Any freebusy object falling outside of this time range will be ignored. + * + * @param DateTime $start + * @param DateTime $end + * @return void + */ + public function setTimeRange(\DateTime $start = null, \DateTime $end = null) { + + $this->start = $start; + $this->end = $end; + + } + + /** + * Parses the input data and returns a correct VFREEBUSY object, wrapped in + * a VCALENDAR. + * + * @return Component + */ + public function getResult() { + + $busyTimes = array(); + + foreach($this->objects as $object) { + + foreach($object->getBaseComponents() as $component) { + + switch($component->name) { + + case 'VEVENT' : + + $FBTYPE = 'BUSY'; + if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) { + break; + } + if (isset($component->STATUS)) { + $status = strtoupper($component->STATUS); + if ($status==='CANCELLED') { + break; + } + if ($status==='TENTATIVE') { + $FBTYPE = 'BUSY-TENTATIVE'; + } + } + + $times = array(); + + if ($component->RRULE) { + + $iterator = new RecurrenceIterator($object, (string)$component->uid); + if ($this->start) { + $iterator->fastForward($this->start); + } + + $maxRecurrences = 200; + + while($iterator->valid() && --$maxRecurrences) { + + $startTime = $iterator->getDTStart(); + if ($this->end && $startTime > $this->end) { + break; + } + $times[] = array( + $iterator->getDTStart(), + $iterator->getDTEnd(), + ); + + $iterator->next(); + + } + + } else { + + $startTime = $component->DTSTART->getDateTime(); + if ($this->end && $startTime > $this->end) { + break; + } + $endTime = null; + if (isset($component->DTEND)) { + $endTime = $component->DTEND->getDateTime(); + } elseif (isset($component->DURATION)) { + $duration = DateTimeParser::parseDuration((string)$component->DURATION); + $endTime = clone $startTime; + $endTime->add($duration); + } elseif (!$component->DTSTART->hasTime()) { + $endTime = clone $startTime; + $endTime->modify('+1 day'); + } else { + // The event had no duration (0 seconds) + break; + } + + $times[] = array($startTime, $endTime); + + } + + foreach($times as $time) { + + if ($this->end && $time[0] > $this->end) break; + if ($this->start && $time[1] < $this->start) break; + + $busyTimes[] = array( + $time[0], + $time[1], + $FBTYPE, + ); + } + break; + + case 'VFREEBUSY' : + foreach($component->FREEBUSY as $freebusy) { + + $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY'; + + // Skipping intervals marked as 'free' + if ($fbType==='FREE') + continue; + + $values = explode(',', $freebusy); + foreach($values as $value) { + list($startTime, $endTime) = explode('/', $value); + $startTime = DateTimeParser::parseDateTime($startTime); + + if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') { + $duration = DateTimeParser::parseDuration($endTime); + $endTime = clone $startTime; + $endTime->add($duration); + } else { + $endTime = DateTimeParser::parseDateTime($endTime); + } + + if($this->start && $this->start > $endTime) continue; + if($this->end && $this->end < $startTime) continue; + $busyTimes[] = array( + $startTime, + $endTime, + $fbType + ); + + } + + + } + break; + + + + } + + + } + + } + + if ($this->baseObject) { + $calendar = $this->baseObject; + } else { + $calendar = new VCalendar(); + } + + $vfreebusy = $calendar->createComponent('VFREEBUSY'); + $calendar->add($vfreebusy); + + if ($this->start) { + $dtstart = $calendar->createProperty('DTSTART'); + $dtstart->setDateTime($this->start); + $vfreebusy->add($dtstart); + } + if ($this->end) { + $dtend = $calendar->createProperty('DTEND'); + $dtend->setDateTime($this->end); + $vfreebusy->add($dtend); + } + $dtstamp = $calendar->createProperty('DTSTAMP'); + $dtstamp->setDateTime(new \DateTime('now', new \DateTimeZone('UTC'))); + $vfreebusy->add($dtstamp); + + foreach($busyTimes as $busyTime) { + + $busyTime[0]->setTimeZone(new \DateTimeZone('UTC')); + $busyTime[1]->setTimeZone(new \DateTimeZone('UTC')); + + $prop = $calendar->createProperty( + 'FREEBUSY', + $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') + ); + $prop['FBTYPE'] = $busyTime[2]; + $vfreebusy->add($prop); + + } + + return $calendar; + + } + +} + diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Node.php b/vendor/sabre/vobject/lib/Sabre/VObject/Node.php new file mode 100644 index 0000000000..6d5e2a4fde --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Node.php @@ -0,0 +1,205 @@ +iterator)) + return $this->iterator; + + return new ElementList(array($this)); + + } + + /** + * Sets the overridden iterator + * + * Note that this is not actually part of the iterator interface + * + * @param ElementList $iterator + * @return void + */ + public function setIterator(ElementList $iterator) { + + $this->iterator = $iterator; + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * Node::REPAIR - May attempt to automatically repair the problem. + * + * This method returns an array with detected problems. + * Every element has the following properties: + * + * * level - problem level. + * * message - A human-readable string describing the issue. + * * node - A reference to the problematic node. + * + * The level means: + * 1 - The issue was repaired (only happens if REPAIR was turned on) + * 2 - An inconsequential issue + * 3 - A severe issue. + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + return array(); + + } + + /* }}} */ + + /* {{{ Countable interface */ + + /** + * Returns the number of elements + * + * @return int + */ + public function count() { + + $it = $this->getIterator(); + return $it->count(); + + } + + /* }}} */ + + /* {{{ ArrayAccess Interface */ + + + /** + * Checks if an item exists through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return bool + */ + public function offsetExists($offset) { + + $iterator = $this->getIterator(); + return $iterator->offsetExists($offset); + + } + + /** + * Gets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return mixed + */ + public function offsetGet($offset) { + + $iterator = $this->getIterator(); + return $iterator->offsetGet($offset); + + } + + /** + * Sets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset,$value) { + + $iterator = $this->getIterator(); + $iterator->offsetSet($offset,$value); + + // @codeCoverageIgnoreStart + // + // This method always throws an exception, so we ignore the closing + // brace + } + // @codeCoverageIgnoreEnd + + /** + * Sets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return void + */ + public function offsetUnset($offset) { + + $iterator = $this->getIterator(); + $iterator->offsetUnset($offset); + + // @codeCoverageIgnoreStart + // + // This method always throws an exception, so we ignore the closing + // brace + } + // @codeCoverageIgnoreEnd + + /* }}} */ +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php b/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php new file mode 100644 index 0000000000..f991de0308 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php @@ -0,0 +1,343 @@ +name = strtoupper($name); + $this->root = $root; + if (is_null($name)) { + $this->noName = true; + $this->name = static::guessParameterNameByValue($value); + } + $this->setValue($value); + } + + /** + * Try to guess property name by value, can be used for vCard 2.1 nameless parameters. + * + * Figuring out what the name should have been. Note that a ton of + * these are rather silly in 2014 and would probably rarely be + * used, but we like to be complete. + * + * @param string $value + * @return string + */ + public static function guessParameterNameByValue($value) { + switch(strtoupper($value)) { + + // Encodings + case '7-BIT' : + case 'QUOTED-PRINTABLE' : + case 'BASE64' : + $name = 'ENCODING'; + break; + + // Common types + case 'WORK' : + case 'HOME' : + case 'PREF' : + + // Delivery Label Type + case 'DOM' : + case 'INTL' : + case 'POSTAL' : + case 'PARCEL' : + + // Telephone types + case 'VOICE' : + case 'FAX' : + case 'MSG' : + case 'CELL' : + case 'PAGER' : + case 'BBS' : + case 'MODEM' : + case 'CAR' : + case 'ISDN' : + case 'VIDEO' : + + // EMAIL types (lol) + case 'AOL' : + case 'APPLELINK' : + case 'ATTMAIL' : + case 'CIS' : + case 'EWORLD' : + case 'INTERNET' : + case 'IBMMAIL' : + case 'MCIMAIL' : + case 'POWERSHARE' : + case 'PRODIGY' : + case 'TLX' : + case 'X400' : + + // Photo / Logo format types + case 'GIF' : + case 'CGM' : + case 'WMF' : + case 'BMP' : + case 'DIB' : + case 'PICT' : + case 'TIFF' : + case 'PDF ': + case 'PS' : + case 'JPEG' : + case 'MPEG' : + case 'MPEG2' : + case 'AVI' : + case 'QTIME' : + + // Sound Digital Audio Type + case 'WAVE' : + case 'PCM' : + case 'AIFF' : + + // Key types + case 'X509' : + case 'PGP' : + $name = 'TYPE'; + break; + + // Value types + case 'INLINE' : + case 'URL' : + case 'CONTENT-ID' : + case 'CID' : + $name = 'VALUE'; + break; + + default: + $name = ''; + } + + return $name; + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * @param string|array $value + * @return void + */ + public function setValue($value) { + + $this->value = $value; + + } + + /** + * Returns the current value + * + * This method will always return a string, or null. If there were multiple + * values, it will automatically concatinate them (separated by comma). + * + * @return string|null + */ + public function getValue() { + + if (is_array($this->value)) { + return implode(',' , $this->value); + } else { + return $this->value; + } + + } + + /** + * Sets multiple values for this parameter. + * + * @param array $value + * @return void + */ + public function setParts(array $value) { + + $this->value = $value; + + } + + /** + * Returns all values for this parameter. + * + * If there were no values, an empty array will be returned. + * + * @return array + */ + public function getParts() { + + if (is_array($this->value)) { + return $this->value; + } elseif (is_null($this->value)) { + return array(); + } else { + return array($this->value); + } + + } + + /** + * Adds a value to this parameter + * + * If the argument is specified as an array, all items will be added to the + * parameter value list. + * + * @param string|array $part + * @return void + */ + public function addValue($part) { + + if (is_null($this->value)) { + $this->value = $part; + } else { + $this->value = array_merge((array)$this->value, (array)$part); + } + + } + + /** + * Checks if this parameter contains the specified value. + * + * This is a case-insensitive match. It makes sense to call this for for + * instance the TYPE parameter, to see if it contains a keyword such as + * 'WORK' or 'FAX'. + * + * @param string $value + * @return bool + */ + public function has($value) { + + return in_array( + strtolower($value), + array_map('strtolower', (array)$this->value) + ); + + } + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + $value = $this->getParts(); + + if (count($value)===0) { + return $this->name; + } + + if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) { + + return implode(';', $value); + + } + + return $this->name . '=' . array_reduce($value, function($out, $item) { + + if (!is_null($out)) $out.=','; + + // If there's no special characters in the string, we'll use the simple + // format + if (!preg_match('#(?: [\n":;\^,] )#x', $item)) { + return $out.$item; + } else { + // Enclosing in double-quotes, and using RFC6868 for encoding any + // special characters + $out.='"' . strtr($item, array( + '^' => '^^', + "\n" => '^n', + '"' => '^\'', + )) . '"'; + return $out; + } + + }); + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + return $this->value; + + } + + /** + * Called when this object is being cast to a string + * + * @return string + */ + public function __toString() { + + return (string)$this->getValue(); + + } + + /** + * Returns the iterator for this object + * + * @return ElementList + */ + public function getIterator() { + + if (!is_null($this->iterator)) + return $this->iterator; + + return $this->iterator = new ArrayObject((array)$this->value); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php b/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php new file mode 100644 index 0000000000..90fd52c94b --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php @@ -0,0 +1,12 @@ +setInput($input); + } + if (is_null($this->input)) { + throw new EofException('End of input stream, or no input supplied'); + } + + if (!is_null($options)) { + $this->options = $options; + } + + switch($this->input[0]) { + case 'vcalendar' : + $this->root = new VCalendar(array(), false); + break; + case 'vcard' : + $this->root = new VCard(array(), false); + break; + default : + throw new ParseException('The root component must either be a vcalendar, or a vcard'); + + } + foreach($this->input[1] as $prop) { + $this->root->add($this->parseProperty($prop)); + } + if (isset($this->input[2])) foreach($this->input[2] as $comp) { + $this->root->add($this->parseComponent($comp)); + } + + // Resetting the input so we can throw an feof exception the next time. + $this->input = null; + + return $this->root; + + } + + /** + * Parses a component + * + * @param array $jComp + * @return \Sabre\VObject\Component + */ + public function parseComponent(array $jComp) { + + // We can remove $self from PHP 5.4 onward. + $self = $this; + + $properties = array_map(function($jProp) use ($self) { + return $self->parseProperty($jProp); + }, $jComp[1]); + + if (isset($jComp[2])) { + + $components = array_map(function($jComp) use ($self) { + return $self->parseComponent($jComp); + }, $jComp[2]); + + } else $components = array(); + + return $this->root->createComponent( + $jComp[0], + array_merge( $properties, $components), + $defaults = false + ); + + } + + /** + * Parses properties. + * + * @param array $jProp + * @return \Sabre\VObject\Property + */ + public function parseProperty(array $jProp) { + + list( + $propertyName, + $parameters, + $valueType + ) = $jProp; + + $propertyName = strtoupper($propertyName); + + // This is the default class we would be using if we didn't know the + // value type. We're using this value later in this function. + $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName); + + $parameters = (array)$parameters; + + $value = array_slice($jProp, 3); + + $valueType = strtoupper($valueType); + + if (isset($parameters['group'])) { + $propertyName = $parameters['group'] . '.' . $propertyName; + unset($parameters['group']); + } + + $prop = $this->root->createProperty($propertyName, null, $parameters, $valueType); + $prop->setJsonValue($value); + + // We have to do something awkward here. FlatText as well as Text + // represents TEXT values. We have to normalize these here. In the + // future we can get rid of FlatText once we're allowed to break BC + // again. + if ($defaultPropertyClass === 'Sabre\VObject\Property\FlatText') { + $defaultPropertyClass = 'Sabre\VObject\Property\Text'; + } + + // If the value type we received (e.g.: TEXT) was not the default value + // type for the given property (e.g.: BDAY), we need to add a VALUE= + // parameter. + if ($defaultPropertyClass !== get_class($prop)) { + $prop["VALUE"] = $valueType; + } + + return $prop; + + } + + /** + * Sets the input data + * + * @param resource|string|array $input + * @return void + */ + public function setInput($input) { + + if (is_resource($input)) { + $input = stream_get_contents($input); + } + if (is_string($input)) { + $input = json_decode($input); + } + $this->input = $input; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Parser/MimeDir.php b/vendor/sabre/vobject/lib/Sabre/VObject/Parser/MimeDir.php new file mode 100644 index 0000000000..61245a5571 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Parser/MimeDir.php @@ -0,0 +1,613 @@ +root = null; + if (!is_null($input)) { + + $this->setInput($input); + + } + + if (!is_null($options)) $this->options = $options; + + $this->parseDocument(); + + return $this->root; + + } + + /** + * Sets the input buffer. Must be a string or stream. + * + * @param resource|string $input + * @return void + */ + public function setInput($input) { + + // Resetting the parser + $this->lineIndex = 0; + $this->startLine = 0; + + if (is_string($input)) { + // Convering to a stream. + $stream = fopen('php://temp', 'r+'); + fwrite($stream, $input); + rewind($stream); + $this->input = $stream; + } elseif (is_resource($input)) { + $this->input = $input; + } else { + throw new \InvalidArgumentException('This parser can only read from strings or streams.'); + } + + } + + /** + * Parses an entire document. + * + * @return void + */ + protected function parseDocument() { + + $line = $this->readLine(); + switch(strtoupper($line)) { + case 'BEGIN:VCALENDAR' : + $class = isset(VCalendar::$componentMap['VCALENDAR']) + ? VCalendar::$componentMap[$name] + : 'Sabre\\VObject\\Component\\VCalendar'; + break; + case 'BEGIN:VCARD' : + $class = isset(VCard::$componentMap['VCARD']) + ? VCard::$componentMap['VCARD'] + : 'Sabre\\VObject\\Component\\VCard'; + break; + default : + throw new ParseException('This parser only supports VCARD and VCALENDAR files'); + } + + $this->root = new $class(array(), false); + + while(true) { + + // Reading until we hit END: + $line = $this->readLine(); + if (strtoupper(substr($line,0,4)) === 'END:') { + break; + } + $result = $this->parseLine($line); + if ($result) { + $this->root->add($result); + } + + } + + $name = strtoupper(substr($line, 4)); + if ($name!==$this->root->name) { + throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"'); + } + + } + + /** + * Parses a line, and if it hits a component, it will also attempt to parse + * the entire component + * + * @param string $line Unfolded line + * @return Node + */ + protected function parseLine($line) { + + // Start of a new component + if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') { + + $component = $this->root->createComponent(substr($line,6), array(), false); + + while(true) { + + // Reading until we hit END: + $line = $this->readLine(); + if (strtoupper(substr($line,0,4)) === 'END:') { + break; + } + $result = $this->parseLine($line); + if ($result) { + $component->add($result); + } + + } + + $name = strtoupper(substr($line, 4)); + if ($name!==$component->name) { + throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"'); + } + + return $component; + + } else { + + // Property reader + $property = $this->readProperty($line); + if (!$property) { + // Ignored line + return false; + } + return $property; + + } + + } + + /** + * We need to look ahead 1 line every time to see if we need to 'unfold' + * the next line. + * + * If that was not the case, we store it here. + * + * @var null|string + */ + protected $lineBuffer; + + /** + * The real current line number. + */ + protected $lineIndex = 0; + + /** + * In the case of unfolded lines, this property holds the line number for + * the start of the line. + * + * @var int + */ + protected $startLine = 0; + + /** + * Contains a 'raw' representation of the current line. + * + * @var string + */ + protected $rawLine; + + /** + * Reads a single line from the buffer. + * + * This method strips any newlines and also takes care of unfolding. + * + * @throws \Sabre\VObject\EofException + * @return string + */ + protected function readLine() { + + if (!is_null($this->lineBuffer)) { + $rawLine = $this->lineBuffer; + $this->lineBuffer = null; + } else { + do { + $eof = feof($this->input); + + $rawLine = fgets($this->input); + + if ($eof || (feof($this->input) && $rawLine===false)) { + throw new EofException('End of document reached prematurely'); + } + if ($rawLine === false) { + throw new ParseException('Error reading from input stream'); + } + $rawLine = rtrim($rawLine, "\r\n"); + } while ($rawLine === ''); // Skipping empty lines + $this->lineIndex++; + } + $line = $rawLine; + + $this->startLine = $this->lineIndex; + + // Looking ahead for folded lines. + while (true) { + + $nextLine = rtrim(fgets($this->input), "\r\n"); + $this->lineIndex++; + if (!$nextLine) { + break; + } + if ($nextLine[0] === "\t" || $nextLine[0] === " ") { + $line .= substr($nextLine, 1); + $rawLine .= "\n " . substr($nextLine, 1); + } else { + $this->lineBuffer = $nextLine; + break; + } + + } + $this->rawLine = $rawLine; + return $line; + + } + + /** + * Reads a property or component from a line. + * + * @return void + */ + protected function readProperty($line) { + + if ($this->options & self::OPTION_FORGIVING) { + $propNameToken = 'A-Z0-9\-\._\\/'; + } else { + $propNameToken = 'A-Z0-9\-\.'; + } + + $paramNameToken = 'A-Z0-9\-'; + $safeChar = '^";:,'; + $qSafeChar = '^"'; + + $regex = "/ + ^(?P [$propNameToken]+ ) (?=[;:]) # property name + | + (?<=:)(?P .+)$ # property value + | + ;(?P [$paramNameToken]+) (?=[=;:]) # parameter name + | + (=|,)(?P # parameter value + (?: [$safeChar]*) | + \"(?: [$qSafeChar]+)\" + ) (?=[;:,]) + /xi"; + + //echo $regex, "\n"; die(); + preg_match_all($regex, $line, $matches, PREG_SET_ORDER ); + + $property = array( + 'name' => null, + 'parameters' => array(), + 'value' => null + ); + + $lastParam = null; + + /** + * Looping through all the tokens. + * + * Note that we are looping through them in reverse order, because if a + * sub-pattern matched, the subsequent named patterns will not show up + * in the result. + */ + foreach($matches as $match) { + + if (isset($match['paramValue'])) { + if ($match['paramValue'] && $match['paramValue'][0] === '"') { + $value = substr($match['paramValue'], 1, -1); + } else { + $value = $match['paramValue']; + } + + $value = $this->unescapeParam($value); + + if (is_null($property['parameters'][$lastParam])) { + $property['parameters'][$lastParam] = $value; + } elseif (is_array($property['parameters'][$lastParam])) { + $property['parameters'][$lastParam][] = $value; + } else { + $property['parameters'][$lastParam] = array( + $property['parameters'][$lastParam], + $value + ); + } + continue; + } + if (isset($match['paramName'])) { + $lastParam = strtoupper($match['paramName']); + if (!isset($property['parameters'][$lastParam])) { + $property['parameters'][$lastParam] = null; + } + continue; + } + if (isset($match['propValue'])) { + $property['value'] = $match['propValue']; + continue; + } + if (isset($match['name']) && $match['name']) { + $property['name'] = strtoupper($match['name']); + continue; + } + + // @codeCoverageIgnoreStart + throw new \LogicException('This code should not be reachable'); + // @codeCoverageIgnoreEnd + + } + + if (is_null($property['value'])) { + $property['value'] = ''; + } + if (!$property['name']) { + if ($this->options & self::OPTION_IGNORE_INVALID_LINES) { + return false; + } + throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); + } + + // vCard 2.1 states that parameters may appear without a name, and only + // a value. We can deduce the value based on it's name. + // + // Our parser will get those as parameters without a value instead, so + // we're filtering these parameters out first. + $namedParameters = array(); + $namelessParameters = array(); + + foreach($property['parameters'] as $name=>$value) { + if (!is_null($value)) { + $namedParameters[$name] = $value; + } else { + $namelessParameters[] = $name; + } + } + + $propObj = $this->root->createProperty($property['name'], null, $namedParameters); + + foreach($namelessParameters as $namelessParameter) { + $propObj->add(null, $namelessParameter); + } + + if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') { + $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue()); + } else { + $propObj->setRawMimeDirValue($property['value']); + } + + return $propObj; + + } + + /** + * Unescapes a property value. + * + * vCard 2.1 says: + * * Semi-colons must be escaped in some property values, specifically + * ADR, ORG and N. + * * Semi-colons must be escaped in parameter values, because semi-colons + * are also use to separate values. + * * No mention of escaping backslashes with another backslash. + * * newlines are not escaped either, instead QUOTED-PRINTABLE is used to + * span values over more than 1 line. + * + * vCard 3.0 says: + * * (rfc2425) Backslashes, newlines (\n or \N) and comma's must be + * escaped, all time time. + * * Comma's are used for delimeters in multiple values + * * (rfc2426) Adds to to this that the semi-colon MUST also be escaped, + * as in some properties semi-colon is used for separators. + * * Properties using semi-colons: N, ADR, GEO, ORG + * * Both ADR and N's individual parts may be broken up further with a + * comma. + * * Properties using commas: NICKNAME, CATEGORIES + * + * vCard 4.0 (rfc6350) says: + * * Commas must be escaped. + * * Semi-colons may be escaped, an unescaped semi-colon _may_ be a + * delimiter, depending on the property. + * * Backslashes must be escaped + * * Newlines must be escaped as either \N or \n. + * * Some compound properties may contain multiple parts themselves, so a + * comma within a semi-colon delimited property may also be unescaped + * to denote multiple parts _within_ the compound property. + * * Text-properties using semi-colons: N, ADR, ORG, CLIENTPIDMAP. + * * Text-properties using commas: NICKNAME, RELATED, CATEGORIES, PID. + * + * Even though the spec says that commas must always be escaped, the + * example for GEO in Section 6.5.2 seems to violate this. + * + * iCalendar 2.0 (rfc5545) says: + * * Commas or semi-colons may be used as delimiters, depending on the + * property. + * * Commas, semi-colons, backslashes, newline (\N or \n) are always + * escaped, unless they are delimiters. + * * Colons shall not be escaped. + * * Commas can be considered the 'default delimiter' and is described as + * the delimiter in cases where the order of the multiple values is + * insignificant. + * * Semi-colons are described as the delimiter for 'structured values'. + * They are specifically used in Semi-colons are used as a delimiter in + * REQUEST-STATUS, RRULE, GEO and EXRULE. EXRULE is deprecated however. + * + * Now for the parameters + * + * If delimiter is not set (null) this method will just return a string. + * If it's a comma or a semi-colon the string will be split on those + * characters, and always return an array. + * + * @param string $input + * @param string $delimiter + * @return string|string[] + */ + static public function unescapeValue($input, $delimiter = ';') { + + $regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )'; + if ($delimiter) { + $regex .= ' | (' . $delimiter . ')'; + } + $regex .= ') #x'; + + $matches = preg_split($regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + + $resultArray = array(); + $result = ''; + + foreach($matches as $match) { + + switch ($match) { + case '\\\\' : + $result .='\\'; + break; + case '\N' : + case '\n' : + $result .="\n"; + break; + case '\;' : + $result .=';'; + break; + case '\,' : + $result .=','; + break; + case $delimiter : + $resultArray[] = $result; + $result = ''; + break; + default : + $result .= $match; + break; + + } + + } + + $resultArray[] = $result; + return $delimiter ? $resultArray : $result; + + } + + /** + * Unescapes a parameter value. + * + * vCard 2.1: + * * Does not mention a mechanism for this. In addition, double quotes + * are never used to wrap values. + * * This means that parameters can simply not contain colons or + * semi-colons. + * + * vCard 3.0 (rfc2425, rfc2426): + * * Parameters _may_ be surrounded by double quotes. + * * If this is not the case, semi-colon, colon and comma may simply not + * occur (the comma used for multiple parameter values though). + * * If it is surrounded by double-quotes, it may simply not contain + * double-quotes. + * * This means that a parameter can in no case encode double-quotes, or + * newlines. + * + * vCard 4.0 (rfc6350) + * * Behavior seems to be identical to vCard 3.0 + * + * iCalendar 2.0 (rfc5545) + * * Behavior seems to be identical to vCard 3.0 + * + * Parameter escaping mechanism (rfc6868) : + * * This rfc describes a new way to escape parameter values. + * * New-line is encoded as ^n + * * ^ is encoded as ^^. + * * " is encoded as ^' + * + * @param string $input + * @return void + */ + private function unescapeParam($input) { + + return + preg_replace_callback('#(\^(\^|n|\'))#',function($matches) { + switch($matches[2]) { + case 'n' : + return "\n"; + case '^' : + return '^'; + case '\'' : + return '"'; + + // @codeCoverageIgnoreStart + } + // @codeCoverageIgnoreEnd + }, $input); + + } + + /** + * Gets the full quoted printable value. + * + * We need a special method for this, because newlines have both a meaning + * in vCards, and in QuotedPrintable. + * + * This method does not do any decoding. + * + * @return string + */ + private function extractQuotedPrintableValue() { + + // We need to parse the raw line again to get the start of the value. + // + // We are basically looking for the first colon (:), but we need to + // skip over the parameters first, as they may contain one. + $regex = '/^ + (?: [^:])+ # Anything but a colon + (?: "[^"]")* # A parameter in double quotes + : # start of the value we really care about + (.*)$ + /xs'; + + preg_match($regex, $this->rawLine, $matches); + + $value = $matches[1]; + // Removing the first whitespace character from every line. Kind of + // like unfolding, but we keep the newline. + $value = str_replace("\n ", "\n", $value); + + // Microsoft products don't always correctly fold lines, they may be + // missing a whitespace. So if 'forgiving' is turned on, we will take + // those as well. + if ($this->options & self::OPTION_FORGIVING) { + while(substr($value,-1) === '=') { + // Reading the line + $this->readLine(); + // Grabbing the raw form + $value.="\n" . $this->rawLine; + } + } + + return $value; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Parser/Parser.php b/vendor/sabre/vobject/lib/Sabre/VObject/Parser/Parser.php new file mode 100644 index 0000000000..87b9143014 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Parser/Parser.php @@ -0,0 +1,77 @@ +setInput($input); + } + $this->options = $options; + } + + /** + * This method starts the parsing process. + * + * If the input was not supplied during construction, it's possible to pass + * it here instead. + * + * If either input or options are not supplied, the defaults will be used. + * + * @param mixed $input + * @param int|null $options + * @return array + */ + abstract public function parse($input = null, $options = null); + + /** + * Sets the input data + * + * @param mixed $input + * @return void + */ + abstract public function setInput($input); + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property.php new file mode 100644 index 0000000000..55017a4bdd --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property.php @@ -0,0 +1,502 @@ +value syntax. + * + * @param Component $root The root document + * @param string $name + * @param string|array|null $value + * @param array $parameters List of parameters + * @param string $group The vcard property group + * @return void + */ + public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { + + $this->name = $name; + $this->group = $group; + + $this->root = $root; + + foreach($parameters as $k=>$v) { + $this->add($k, $v); + } + + if (!is_null($value)) { + $this->setValue($value); + } + + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * @param string|array $value + * @return void + */ + public function setValue($value) { + + $this->value = $value; + + } + + /** + * Returns the current value. + * + * This method will always return a singular value. If this was a + * multi-value object, some decision will be made first on how to represent + * it as a string. + * + * To get the correct multi-value version, use getParts. + * + * @return string + */ + public function getValue() { + + if (is_array($this->value)) { + if (count($this->value)==0) { + return null; + } elseif (count($this->value)===1) { + return $this->value[0]; + } else { + return $this->getRawMimeDirValue($this->value); + } + } else { + return $this->value; + } + + } + + /** + * Sets a multi-valued property. + * + * @param array $parts + * @return void + */ + public function setParts(array $parts) { + + $this->value = $parts; + + } + + /** + * Returns a multi-valued property. + * + * This method always returns an array, if there was only a single value, + * it will still be wrapped in an array. + * + * @return array + */ + public function getParts() { + + if (is_null($this->value)) { + return array(); + } elseif (is_array($this->value)) { + return $this->value; + } else { + return array($this->value); + } + + } + + /** + * Adds a new parameter, and returns the new item. + * + * If a parameter with same name already existed, the values will be + * combined. + * If nameless parameter is added, we try to guess it's name. + * + * @param string $name + * @param string|null|array $value + * @return Node + */ + public function add($name, $value = null) { + $noName = false; + if ($name === null) { + $name = Parameter::guessParameterNameByValue($value); + $noName = true; + } + + if (isset($this->parameters[strtoupper($name)])) { + $this->parameters[strtoupper($name)]->addValue($value); + } + else { + $param = new Parameter($this->root, $name, $value); + $param->noName = $noName; + $this->parameters[$param->name] = $param; + } + } + + /** + * Returns an iterable list of children + * + * @return array + */ + public function parameters() { + + return $this->parameters; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + abstract public function getValueType(); + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + abstract public function setRawMimeDirValue($val); + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + abstract public function getRawMimeDirValue(); + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + $str = $this->name; + if ($this->group) $str = $this->group . '.' . $this->name; + + foreach($this->parameters as $param) { + + $str.=';' . $param->serialize(); + + } + + $str.=':' . $this->getRawMimeDirValue(); + + $out = ''; + while(strlen($str)>0) { + if (strlen($str)>75) { + $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; + $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); + } else { + $out.=$str . "\r\n"; + $str=''; + break; + } + } + + return $out; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + return $this->getParts(); + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + if (count($value)===1) { + $this->setValue(reset($value)); + } else { + $this->setValue($value); + } + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + $parameters = array(); + + foreach($this->parameters as $parameter) { + if ($parameter->name === 'VALUE') { + continue; + } + $parameters[strtolower($parameter->name)] = $parameter->jsonSerialize(); + } + // In jCard, we need to encode the property-group as a separate 'group' + // parameter. + if ($this->group) { + $parameters['group'] = $this->group; + } + + return array_merge( + array( + strtolower($this->name), + (object)$parameters, + strtolower($this->getValueType()), + ), + $this->getJsonValue() + ); + } + + + /** + * Called when this object is being cast to a string. + * + * If the property only had a single value, you will get just that. In the + * case the property had multiple values, the contents will be escaped and + * combined with ,. + * + * @return string + */ + public function __toString() { + + return (string)$this->getValue(); + + } + + /* ArrayAccess interface {{{ */ + + /** + * Checks if an array element exists + * + * @param mixed $name + * @return bool + */ + public function offsetExists($name) { + + if (is_int($name)) return parent::offsetExists($name); + + $name = strtoupper($name); + + foreach($this->parameters as $parameter) { + if ($parameter->name == $name) return true; + } + return false; + + } + + /** + * Returns a parameter. + * + * If the parameter does not exist, null is returned. + * + * @param string $name + * @return Node + */ + public function offsetGet($name) { + + if (is_int($name)) return parent::offsetGet($name); + $name = strtoupper($name); + + if (!isset($this->parameters[$name])) { + return null; + } + + return $this->parameters[$name]; + + } + + /** + * Creates a new parameter + * + * @param string $name + * @param mixed $value + * @return void + */ + public function offsetSet($name, $value) { + + if (is_int($name)) { + parent::offsetSet($name, $value); + // @codeCoverageIgnoreStart + // This will never be reached, because an exception is always + // thrown. + return; + // @codeCoverageIgnoreEnd + } + + $param = new Parameter($this->root, $name, $value); + $this->parameters[$param->name] = $param; + + } + + /** + * Removes one or more parameters with the specified name + * + * @param string $name + * @return void + */ + public function offsetUnset($name) { + + if (is_int($name)) { + parent::offsetUnset($name); + // @codeCoverageIgnoreStart + // This will never be reached, because an exception is always + // thrown. + return; + // @codeCoverageIgnoreEnd + } + + unset($this->parameters[strtoupper($name)]); + + } + /* }}} */ + + /** + * This method is automatically called when the object is cloned. + * Specifically, this will ensure all child elements are also cloned. + * + * @return void + */ + public function __clone() { + + foreach($this->parameters as $key=>$child) { + $this->parameters[$key] = clone $child; + $this->parameters[$key]->parent = $this; + } + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = array(); + + // Checking if our value is UTF-8 + if (!StringUtil::isUTF8($this->getRawMimeDirValue())) { + $warnings[] = array( + 'level' => 1, + 'message' => 'Property is not valid UTF-8!', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->setRawMimeDirValue(StringUtil::convertToUTF8($this->getRawMimeDirValue())); + } + } + + // Checking if the propertyname does not contain any invalid bytes. + if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', + 'node' => $this, + ); + if ($options & self::REPAIR) { + // Uppercasing and converting underscores to dashes. + $this->name = strtoupper( + str_replace('_', '-', $this->name) + ); + // Removing every other invalid character + $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); + + } + + } + + // Validating inner parameters + foreach($this->parameters as $param) { + $warnings = array_merge($warnings, $param->validate($options)); + } + + return $warnings; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Binary.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Binary.php new file mode 100644 index 0000000000..7abbbcb69d --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Binary.php @@ -0,0 +1,127 @@ +value = $value[0]; + } else { + throw new \InvalidArgumentException('The argument must either be a string or an array with only one child'); + } + + } else { + + $this->value = $value; + + } + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->value = base64_decode($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return base64_encode($this->value); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return 'BINARY'; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + return array(base64_encode($this->getValue())); + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + $value = array_map('base64_decode', $value); + parent::setJsonValue($value); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Boolean.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Boolean.php new file mode 100644 index 0000000000..40ac994b0a --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Boolean.php @@ -0,0 +1,63 @@ +setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->value?'TRUE':'FALSE'; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return 'BOOLEAN'; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/FlatText.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/FlatText.php new file mode 100644 index 0000000000..8bffc7ab39 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/FlatText.php @@ -0,0 +1,49 @@ +setValue($val); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Float.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Float.php new file mode 100644 index 0000000000..4f130d7168 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Float.php @@ -0,0 +1,101 @@ +delimiter, $val); + foreach($val as &$item) { + $item = (float)$item; + } + $this->setParts($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode( + $this->delimiter, + $this->getParts() + ); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "FLOAT"; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $val = array_map(function($item) { + + return (float)$item; + + }, $this->getParts()); + + // Special-casing the GEO property. + // + // See: + // http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2 + if ($this->name==='GEO') { + return array($val); + } else { + return $val; + } + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/CalAddress.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/CalAddress.php new file mode 100644 index 0000000000..b393902bf4 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/CalAddress.php @@ -0,0 +1,41 @@ +setDateTimes($parts); + } else { + parent::setParts($parts); + } + + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * Instead of strings, you may also use DateTime here. + * + * @param string|array|\DateTime $value + * @return void + */ + public function setValue($value) { + + if (is_array($value) && isset($value[0]) && $value[0] instanceof \DateTime) { + $this->setDateTimes($value); + } elseif ($value instanceof \DateTime) { + $this->setDateTimes(array($value)); + } else { + parent::setValue($value); + } + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue(explode($this->delimiter, $val)); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Returns true if this is a DATE-TIME value, false if it's a DATE. + * + * @return bool + */ + public function hasTime() { + + return strtoupper((string)$this['VALUE']) !== 'DATE'; + + } + + /** + * Returns a date-time value. + * + * Note that if this property contained more than 1 date-time, only the + * first will be returned. To get an array with multiple values, call + * getDateTimes. + * + * @return \DateTime + */ + public function getDateTime() { + + $dt = $this->getDateTimes(); + if (!$dt) return null; + + return $dt[0]; + + } + + /** + * Returns multiple date-time values. + * + * @return \DateTime[] + */ + public function getDateTimes() { + + // Finding the timezone. + $tz = $this['TZID']; + + if ($tz) { + $tz = TimeZoneUtil::getTimeZone((string)$tz, $this->root); + } + + $dts = array(); + foreach($this->getParts() as $part) { + $dts[] = DateTimeParser::parse($part, $tz); + } + return $dts; + + } + + /** + * Sets the property as a DateTime object. + * + * @param \DateTime $dt + * @param bool isFloating If set to true, timezones will be ignored. + * @return void + */ + public function setDateTime(\DateTime $dt, $isFloating = false) { + + $this->setDateTimes(array($dt), $isFloating); + + } + + /** + * Sets the property as multiple date-time objects. + * + * The first value will be used as a reference for the timezones, and all + * the otehr values will be adjusted for that timezone + * + * @param \DateTime[] $dt + * @param bool isFloating If set to true, timezones will be ignored. + * @return void + */ + public function setDateTimes(array $dt, $isFloating = false) { + + $values = array(); + + if($this->hasTime()) { + + $tz = null; + $isUtc = false; + + foreach($dt as $d) { + + if ($isFloating) { + $values[] = $d->format('Ymd\\THis'); + continue; + } + if (is_null($tz)) { + $tz = $d->getTimeZone(); + $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); + if (!$isUtc) { + $this->offsetSet('TZID', $tz->getName()); + } + } else { + $d->setTimeZone($tz); + } + + if ($isUtc) { + $values[] = $d->format('Ymd\\THis\\Z'); + } else { + $values[] = $d->format('Ymd\\THis'); + } + + } + if ($isUtc || $isFloating) { + $this->offsetUnset('TZID'); + } + + } else { + + foreach($dt as $d) { + + $values[] = $d->format('Ymd'); + + } + $this->offsetUnset('TZID'); + + } + + $this->value = $values; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return $this->hasTime()?'DATE-TIME':'DATE'; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $dts = $this->getDateTimes(); + $hasTime = $this->hasTime(); + + $tz = $dts[0]->getTimeZone(); + $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); + + return array_map(function($dt) use ($hasTime, $isUtc) { + + if ($hasTime) { + return $dt->format('Y-m-d\\TH:i:s') . ($isUtc?'Z':''); + } else { + return $dt->format('Y-m-d'); + } + + }, $dts); + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + // dates and times in jCal have one difference to dates and times in + // iCalendar. In jCal date-parts are separated by dashes, and + // time-parts are separated by colons. It makes sense to just remove + // those. + $this->setValue(array_map(function($item) { + + return strtr($item, array(':'=>'', '-'=>'')); + + }, $value)); + + } + /** + * We need to intercept offsetSet, because it may be used to alter the + * VALUE from DATE-TIME to DATE or vice-versa. + * + * @param string $name + * @param mixed $value + * @return void + */ + public function offsetSet($name, $value) { + + parent::offsetSet($name, $value); + if (strtoupper($name)!=='VALUE') { + return; + } + + // This will ensure that dates are correctly encoded. + $this->setDateTimes($this->getDateTimes()); + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * Node::REPAIR - May attempt to automatically repair the problem. + * + * This method returns an array with detected problems. + * Every element has the following properties: + * + * * level - problem level. + * * message - A human-readable string describing the issue. + * * node - A reference to the problematic node. + * + * The level means: + * 1 - The issue was repaired (only happens if REPAIR was turned on) + * 2 - An inconsequential issue + * 3 - A severe issue. + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $messages = parent::validate($options); + $valueType = $this->getValueType(); + $value = $this->getValue(); + try { + switch($valueType) { + case 'DATE' : + $foo = DateTimeParser::parseDate($value); + break; + case 'DATE-TIME' : + $foo = DateTimeParser::parseDateTime($value); + break; + } + } catch (\LogicException $e) { + $messages[] = array( + 'level' => 3, + 'message' => 'The supplied value (' . $value . ') is not a correct ' . $valueType, + 'node' => $this, + ); + } + return $messages; + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Duration.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Duration.php new file mode 100644 index 0000000000..1a2562b27b --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Duration.php @@ -0,0 +1,86 @@ +setValue(explode($this->delimiter, $val)); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return 'DURATION'; + + } + + /** + * Returns a DateInterval representation of the Duration property. + * + * If the property has more than one value, only the first is returned. + * + * @return \DateInterval + */ + public function getDateInterval() { + + $parts = $this->getParts(); + $value = $parts[0]; + return DateTimeParser::parseDuration($value); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Period.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Period.php new file mode 100644 index 0000000000..0adadbe386 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Period.php @@ -0,0 +1,126 @@ +setValue(explode($this->delimiter, $val)); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "PERIOD"; + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + $value = array_map(function($item) { + + return strtr(implode('/', $item), array(':' => '', '-' => '')); + + }, $value); + parent::setJsonValue($value); + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $return = array(); + foreach($this->getParts() as $item) { + + list($start, $end) = explode('/', $item, 2); + + $start = DateTimeParser::parseDateTime($start); + + // This is a duration value. + if ($end[0]==='P') { + $return[] = array( + $start->format('Y-m-d\\TH:i:s'), + $end + ); + } else { + $end = DateTimeParser::parseDateTime($end); + $return[] = array( + $start->format('Y-m-d\\TH:i:s'), + $end->format('Y-m-d\\TH:i:s'), + ); + } + + } + + return $return; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Recur.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Recur.php new file mode 100644 index 0000000000..dc6aaf36f2 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/ICalendar/Recur.php @@ -0,0 +1,189 @@ +value array that is accessible using + * getParts, and may be set using setParts. + * + * @copyright Copyright (C) 2007-2014 fruux GmbH. All rights reserved. + * @author Evert Pot (http://evertpot.com/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class Recur extends Property { + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * @param string|array $value + * @return void + */ + public function setValue($value) { + + // If we're getting the data from json, we'll be receiving an object + if ($value instanceof \StdClass) { + $value = (array)$value; + } + + if (is_array($value)) { + $newVal = array(); + foreach($value as $k=>$v) { + + if (is_string($v)) { + $v = strtoupper($v); + + // The value had multiple sub-values + if (strpos($v,',')!==false) { + $v = explode(',', $v); + } + } else { + $v = array_map('strtoupper', $v); + } + + $newVal[strtoupper($k)] = $v; + } + $this->value = $newVal; + } elseif (is_string($value)) { + $value = strtoupper($value); + $newValue = array(); + foreach(explode(';', $value) as $part) { + + // Skipping empty parts. + if (empty($part)) { + continue; + } + list($partName, $partValue) = explode('=', $part); + + // The value itself had multiple values.. + if (strpos($partValue,',')!==false) { + $partValue=explode(',', $partValue); + } + $newValue[$partName] = $partValue; + + } + $this->value = $newValue; + } else { + throw new \InvalidArgumentException('You must either pass a string, or a key=>value array'); + } + + } + + /** + * Returns the current value. + * + * This method will always return a singular value. If this was a + * multi-value object, some decision will be made first on how to represent + * it as a string. + * + * To get the correct multi-value version, use getParts. + * + * @return string + */ + public function getValue() { + + $out = array(); + foreach($this->value as $key=>$value) { + $out[] = $key . '=' . (is_array($value)?implode(',', $value):$value); + } + return strtoupper(implode(';',$out)); + + } + + /** + * Sets a multi-valued property. + * + * @param array $parts + * @return void + */ + public function setParts(array $parts) { + + $this->setValue($parts); + + } + + /** + * Returns a multi-valued property. + * + * This method always returns an array, if there was only a single value, + * it will still be wrapped in an array. + * + * @return array + */ + public function getParts() { + + return $this->value; + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->getValue(); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "RECUR"; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $values = array(); + foreach($this->getParts() as $k=>$v) { + $values[strtolower($k)] = $v; + } + return array($values); + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Integer.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Integer.php new file mode 100644 index 0000000000..70095f99db --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Integer.php @@ -0,0 +1,72 @@ +setValue((int)$val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->value; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "INTEGER"; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + return array((int)$this->getValue()); + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Text.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Text.php new file mode 100644 index 0000000000..974c5a4551 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Text.php @@ -0,0 +1,330 @@ + 5, + 'ADR' => 7, + ); + + /** + * Creates the property. + * + * You can specify the parameters either in key=>value syntax, in which case + * parameters will automatically be created, or you can just pass a list of + * Parameter objects. + * + * @param Component $root The root document + * @param string $name + * @param string|array|null $value + * @param array $parameters List of parameters + * @param string $group The vcard property group + * @return void + */ + public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { + + // There's two types of multi-valued text properties: + // 1. multivalue properties. + // 2. structured value properties + // + // The former is always separated by a comma, the latter by semi-colon. + if (in_array($name, $this->structuredValues)) { + $this->delimiter = ';'; + } + + parent::__construct($root, $name, $value, $parameters, $group); + + } + + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue(MimeDir::unescapeValue($val, $this->delimiter)); + + } + + /** + * Sets the value as a quoted-printable encoded string. + * + * @param string $val + * @return void + */ + public function setQuotedPrintableValue($val) { + + $val = quoted_printable_decode($val); + + // Quoted printable only appears in vCard 2.1, and the only character + // that may be escaped there is ;. So we are simply splitting on just + // that. + // + // We also don't have to unescape \\, so all we need to look for is a ; + // that's not preceeded with a \. + $regex = '# (?setValue($matches); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + $val = $this->getParts(); + + if (isset($this->minimumPropertyValues[$this->name])) { + $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); + } + + foreach($val as &$item) { + + if (!is_array($item)) { + $item = array($item); + } + + foreach($item as &$subItem) { + $subItem = strtr($subItem, array( + '\\' => '\\\\', + ';' => '\;', + ',' => '\,', + "\n" => '\n', + "\r" => "", + )); + } + $item = implode(',', $item); + + } + + return implode($this->delimiter, $val); + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + // Structured text values should always be returned as a single + // array-item. Multi-value text should be returned as multiple items in + // the top-array. + if (in_array($this->name, $this->structuredValues)) { + return array($this->getParts()); + } else { + return $this->getParts(); + } + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "TEXT"; + + } + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + // We need to kick in a special type of encoding, if it's a 2.1 vcard. + if ($this->root->getDocumentType() !== Document::VCARD21) { + return parent::serialize(); + } + + $val = $this->getParts(); + + if (isset($this->minimumPropertyValues[$this->name])) { + $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); + } + + // Imploding multiple parts into a single value, and splitting the + // values with ;. + if (count($val)>1) { + foreach($val as $k=>$v) { + $val[$k] = str_replace(';','\;', $v); + } + $val = implode(';', $val); + } else { + $val = $val[0]; + } + + $str = $this->name; + if ($this->group) $str = $this->group . '.' . $this->name; + foreach($this->parameters as $param) { + + if ($param->getValue() === 'QUOTED-PRINTABLE') { + continue; + } + $str.=';' . $param->serialize(); + + } + + + + // If the resulting value contains a \n, we must encode it as + // quoted-printable. + if (strpos($val,"\n") !== false) { + + $str.=';ENCODING=QUOTED-PRINTABLE:'; + $lastLine=$str; + $out = null; + + // The PHP built-in quoted-printable-encode does not correctly + // encode newlines for us. Specifically, the \r\n sequence must in + // vcards be encoded as =0D=OA and we must insert soft-newlines + // every 75 bytes. + for($ii=0;$ii= 32 && $ord <=126) { + $lastLine.=$val[$ii]; + } else { + $lastLine.='=' . strtoupper(bin2hex($val[$ii])); + } + if (strlen($lastLine)>=75) { + // Soft line break + $out.=$lastLine. "=\r\n "; + $lastLine = null; + } + + } + if (!is_null($lastLine)) $out.= $lastLine . "\r\n"; + return $out; + + } else { + $str.=':' . $val; + $out = ''; + while(strlen($str)>0) { + if (strlen($str)>75) { + $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; + $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); + } else { + $out.=$str . "\r\n"; + $str=''; + break; + } + } + + return $out; + + + } + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = parent::validate($options); + + if (isset($this->minimumPropertyValues[$this->name])) { + + $minimum = $this->minimumPropertyValues[$this->name]; + $parts = $this->getParts(); + if (count($parts) < $minimum) { + $warnings[] = array( + 'level' => 1, + 'message' => 'This property must have at least ' . $minimum . ' components. It only has ' . count($parts), + 'node' => $this, + ); + if ($options & self::REPAIR) { + $parts = array_pad($parts, $minimum, ''); + $this->setParts($parts); + } + } + + } + return $warnings; + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Time.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Time.php new file mode 100644 index 0000000000..bcd62d4ad6 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Time.php @@ -0,0 +1,94 @@ +getValue()); + + $timeStr = ''; + + // Hour + if (!is_null($parts['hour'])) { + $timeStr.=$parts['hour']; + + if (!is_null($parts['minute'])) { + $timeStr.=':'; + } + } else { + // We know either minute or second _must_ be set, so we insert a + // dash for an empty value. + $timeStr.='-'; + } + + // Minute + if (!is_null($parts['minute'])) { + $timeStr.=$parts['minute']; + + if (!is_null($parts['second'])) { + $timeStr.=':'; + } + } else { + if (isset($parts['second'])) { + // Dash for empty minute + $timeStr.='-'; + } + } + + // Second + if (!is_null($parts['second'])) { + $timeStr.=$parts['second']; + } + + // Timezone + if (!is_null($parts['timezone'])) { + $timeStr.=$parts['timezone']; + } + + return array($timeStr); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Unknown.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Unknown.php new file mode 100644 index 0000000000..67353fd930 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Unknown.php @@ -0,0 +1,50 @@ +getRawMimeDirValue()); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "UNKNOWN"; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Uri.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Uri.php new file mode 100644 index 0000000000..e235c0769e --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Uri.php @@ -0,0 +1,95 @@ +name === 'URL') { + $regex = '# (?: (\\\\ (?: \\\\ | : ) ) ) #x'; + $matches = preg_split($regex, $val, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + $newVal = ''; + foreach($matches as $match) { + switch($match) { + case '\:' : + $newVal.=':'; + break; + default : + $newVal.=$match; + break; + } + } + $this->value = $newVal; + } else { + $this->value = $val; + } + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + if (is_array($this->value)) { + return $this->value[0]; + } else { + return $this->value; + } + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/UtcOffset.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/UtcOffset.php new file mode 100644 index 0000000000..993b3ceca6 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/UtcOffset.php @@ -0,0 +1,37 @@ +1) { + throw new \InvalidArgumentException('Only one value allowed'); + } + if (isset($parts[0]) && $parts[0] instanceof \DateTime) { + $this->setDateTime($parts[0]); + } else { + parent::setParts($parts); + } + + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * Instead of strings, you may also use DateTime here. + * + * @param string|array|\DateTime $value + * @return void + */ + public function setValue($value) { + + if ($value instanceof \DateTime) { + $this->setDateTime($value); + } else { + parent::setValue($value); + } + + } + + /** + * Sets the property as a DateTime object. + * + * @param \DateTime $dt + * @return void + */ + public function setDateTime(\DateTime $dt) { + + $values = array(); + + $tz = null; + $isUtc = false; + + $tz = $dt->getTimeZone(); + $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); + + if ($isUtc) { + $value = $dt->format('Ymd\\THis\\Z'); + } else { + // Calculating the offset. + $value = $dt->format('Ymd\\THisO'); + } + + $this->value = $value; + + } + + /** + * Returns a date-time value. + * + * Note that if this property contained more than 1 date-time, only the + * first will be returned. To get an array with multiple values, call + * getDateTimes. + * + * If no time was specified, we will always use midnight (in the default + * timezone) as the time. + * + * If parts of the date were omitted, such as the year, we will grab the + * current values for those. So at the time of writing, if the year was + * omitted, we would have filled in 2014. + * + * @return \DateTime + */ + public function getDateTime() { + + $dts = array(); + $now = new DateTime(); + + $tzFormat = $now->getTimezone()->getOffset($now)===0?'\\Z':'O'; + $nowParts = DateTimeParser::parseVCardDateTime($now->format('Ymd\\This' . $tzFormat)); + + $value = $this->getValue(); + + $dateParts = DateTimeParser::parseVCardDateTime($this->getValue()); + + // This sets all the missing parts to the current date/time. + // So if the year was missing for a birthday, we're making it 'this + // year'. + foreach($dateParts as $k=>$v) { + if (is_null($v)) { + $dateParts[$k] = $nowParts[$k]; + } + } + return new DateTime("$dateParts[year]-$dateParts[month]-$dateParts[date] $dateParts[hour]:$dateParts[minute]:$dateParts[second] $dateParts[timezone]"); + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $parts = DateTimeParser::parseVCardDateTime($this->getValue()); + + $dateStr = ''; + + // Year + if (!is_null($parts['year'])) { + $dateStr.=$parts['year']; + + if (!is_null($parts['month'])) { + // If a year and a month is set, we need to insert a separator + // dash. + $dateStr.='-'; + } + + } else { + + if (!is_null($parts['month']) || !is_null($parts['date'])) { + // Inserting two dashes + $dateStr.='--'; + } + + } + + // Month + + if (!is_null($parts['month'])) { + $dateStr.=$parts['month']; + + if (isset($parts['date'])) { + // If month and date are set, we need the separator dash. + $dateStr.='-'; + } + } else { + if (isset($parts['date'])) { + // If the month is empty, and a date is set, we need a 'empty + // dash' + $dateStr.='-'; + } + } + + // Date + if (!is_null($parts['date'])) { + $dateStr.=$parts['date']; + } + + + // Early exit if we don't have a time string. + if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) { + return array($dateStr); + } + + $dateStr.='T'; + + // Hour + if (!is_null($parts['hour'])) { + $dateStr.=$parts['hour']; + + if (!is_null($parts['minute'])) { + $dateStr.=':'; + } + } else { + // We know either minute or second _must_ be set, so we insert a + // dash for an empty value. + $dateStr.='-'; + } + + // Minute + if (!is_null($parts['minute'])) { + $dateStr.=$parts['minute']; + + if (!is_null($parts['second'])) { + $dateStr.=':'; + } + } else { + if (isset($parts['second'])) { + // Dash for empty minute + $dateStr.='-'; + } + } + + // Second + if (!is_null($parts['second'])) { + $dateStr.=$parts['second']; + } + + // Timezone + if (!is_null($parts['timezone'])) { + $dateStr.=$parts['timezone']; + } + + return array($dateStr); + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * Node::REPAIR - May attempt to automatically repair the problem. + * + * This method returns an array with detected problems. + * Every element has the following properties: + * + * * level - problem level. + * * message - A human-readable string describing the issue. + * * node - A reference to the problematic node. + * + * The level means: + * 1 - The issue was repaired (only happens if REPAIR was turned on) + * 2 - An inconsequential issue + * 3 - A severe issue. + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $messages = parent::validate($options); + $value = $this->getValue(); + try { + DateTimeParser::parseVCardDateTime($value); + } catch (\InvalidArgumentException $e) { + $messages[] = array( + 'level' => 3, + 'message' => 'The supplied value (' . $value . ') is not a correct DATE-AND-OR-TIME property', + 'node' => $this, + ); + } + return $messages; + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/VCard/DateTime.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/VCard/DateTime.php new file mode 100644 index 0000000000..cc3484d69a --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/VCard/DateTime.php @@ -0,0 +1,33 @@ +setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->value; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "LANGUAGE-TAG"; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/VCard/TimeStamp.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/VCard/TimeStamp.php new file mode 100644 index 0000000000..ada0de51af --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/VCard/TimeStamp.php @@ -0,0 +1,69 @@ +getValue()); + + $dateStr = + $parts['year'] . '-' . + $parts['month'] . '-' . + $parts['date'] . 'T' . + $parts['hour'] . ':' . + $parts['minute'] . ':' . + $parts['second']; + + // Timezone + if (!is_null($parts['timezone'])) { + $dateStr.=$parts['timezone']; + } + + return array($dateStr); + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php b/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php new file mode 100644 index 0000000000..78746485da --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php @@ -0,0 +1,73 @@ +parse($data, $options); + + return $result; + + } + + /** + * Parses a jCard or jCal object, and returns the top component. + * + * The options argument is a bitfield. Pass any of the OPTIONS constant to + * alter the parsers' behaviour. + * + * You can either a string, a readable stream, or an array for it's input. + * Specifying the array is useful if json_decode was already called on the + * input. + * + * @param string|resource|array $data + * @param int $options + * @return Node + */ + static function readJson($data, $options = 0) { + + $parser = new Parser\Json(); + $result = $parser->parse($data, $options); + + return $result; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php b/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php new file mode 100644 index 0000000000..9b312562ef --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php @@ -0,0 +1,1183 @@ + 0, + 'MO' => 1, + 'TU' => 2, + 'WE' => 3, + 'TH' => 4, + 'FR' => 5, + 'SA' => 6, + ); + + /** + * Mappings between the day number and english day name. + * + * @var array + */ + private $dayNames = array( + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + ); + + /** + * If the current iteration of the event is an overriden event, this + * property will hold the VObject + * + * @var Component + */ + private $currentOverriddenEvent; + + /** + * This property may contain the date of the next not-overridden event. + * This date is calculated sometimes a bit early, before overridden events + * are evaluated. + * + * @var \DateTime + */ + private $nextDate; + + /** + * This counts the number of overridden events we've handled so far + * + * @var int + */ + private $handledOverridden = 0; + + /** + * Creates the iterator + * + * You should pass a VCALENDAR component, as well as the UID of the event + * we're going to traverse. + * + * @param Component $vcal + * @param string|null $uid + */ + public function __construct(Component $vcal, $uid=null) { + + if (is_null($uid)) { + if ($vcal instanceof Component\VCalendar) { + throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); + } + $components = array($vcal); + $uid = (string)$vcal->uid; + } else { + $components = $vcal->select('VEVENT'); + } + foreach($components as $component) { + if ((string)$component->uid == $uid) { + if (isset($component->{'RECURRENCE-ID'})) { + $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component; + $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime(); + } else { + $this->baseEvent = $component; + } + } + } + + ksort($this->overriddenEvents); + + if (!$this->baseEvent) { + // No base event was found. CalDAV does allow cases where only + // overridden instances are stored. + // + // In this barticular case, we're just going to grab the first + // event and use that instead. This may not always give the + // desired result. + if (!count($this->overriddenEvents)) { + throw new \InvalidArgumentException('Could not find an event with uid: ' . $uid); + } + ksort($this->overriddenEvents, SORT_NUMERIC); + $this->baseEvent = array_shift($this->overriddenEvents); + } + + $this->startDate = clone $this->baseEvent->DTSTART->getDateTime(); + + $this->endDate = null; + if (isset($this->baseEvent->DTEND)) { + $this->endDate = clone $this->baseEvent->DTEND->getDateTime(); + } else { + $this->endDate = clone $this->startDate; + if (isset($this->baseEvent->DURATION)) { + $this->endDate->add(DateTimeParser::parse((string)$this->baseEvent->DURATION)); + } elseif (!$this->baseEvent->DTSTART->hasTime()) { + $this->endDate->modify('+1 day'); + } + } + $this->currentDate = clone $this->startDate; + + $rrule = $this->baseEvent->RRULE; + + // If no rrule was specified, we create a default setting + if (!$rrule) { + $this->frequency = 'daily'; + $this->count = 1; + } else foreach($rrule->getParts() as $key=>$value) { + + switch($key) { + + case 'FREQ' : + if (!in_array( + strtolower($value), + array('secondly','minutely','hourly','daily','weekly','monthly','yearly') + )) { + throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); + + } + $this->frequency = strtolower($value); + break; + + case 'UNTIL' : + $this->until = DateTimeParser::parse($value, $this->startDate->getTimezone()); + + // In some cases events are generated with an UNTIL= + // parameter before the actual start of the event. + // + // Not sure why this is happening. We assume that the + // intention was that the event only recurs once. + // + // So we are modifying the parameter so our code doesn't + // break. + if($this->until < $this->baseEvent->DTSTART->getDateTime()) { + $this->until = $this->baseEvent->DTSTART->getDateTime(); + } + break; + + case 'COUNT' : + $this->count = (int)$value; + break; + + case 'INTERVAL' : + $this->interval = (int)$value; + if ($this->interval < 1) { + throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!'); + } + break; + + case 'BYSECOND' : + $this->bySecond = (array)$value; + break; + + case 'BYMINUTE' : + $this->byMinute = (array)$value; + break; + + case 'BYHOUR' : + $this->byHour = (array)$value; + break; + + case 'BYDAY' : + $this->byDay = (array)$value; + break; + + case 'BYMONTHDAY' : + $this->byMonthDay = (array)$value; + break; + + case 'BYYEARDAY' : + $this->byYearDay = (array)$value; + break; + + case 'BYWEEKNO' : + $this->byWeekNo = (array)$value; + break; + + case 'BYMONTH' : + $this->byMonth = (array)$value; + break; + + case 'BYSETPOS' : + $this->bySetPos = (array)$value; + break; + + case 'WKST' : + $this->weekStart = strtoupper($value); + break; + + } + + } + + // Parsing exception dates + if (isset($this->baseEvent->EXDATE)) { + foreach($this->baseEvent->EXDATE as $exDate) { + + foreach(explode(',', (string)$exDate) as $exceptionDate) { + + try { + $this->exceptionDates[] = + DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); + } catch (\LogicException $e) { + } + + } + + } + + } + + } + + /** + * Returns the current item in the list + * + * @return \DateTime + */ + public function current() { + + if (!$this->valid()) return null; + return clone $this->currentDate; + + } + + /** + * This method returns the startdate for the current iteration of the + * event. + * + * @return \DateTime + */ + public function getDtStart() { + + if (!$this->valid()) return null; + return clone $this->currentDate; + + } + + /** + * This method returns the enddate for the current iteration of the + * event. + * + * @return \DateTime + */ + public function getDtEnd() { + + if (!$this->valid()) return null; + $dtEnd = clone $this->currentDate; + $dtEnd->add( $this->startDate->diff( $this->endDate ) ); + return clone $dtEnd; + + } + + /** + * Returns a VEVENT object with the updated start and end date. + * + * Any recurrence information is removed, and this function may return an + * 'overridden' event instead. + * + * This method always returns a cloned instance. + * + * @return Component\VEvent + */ + public function getEventObject() { + + if ($this->currentOverriddenEvent) { + return clone $this->currentOverriddenEvent; + } + $event = clone $this->baseEvent; + unset($event->RRULE); + unset($event->EXDATE); + unset($event->RDATE); + unset($event->EXRULE); + + $event->DTSTART->setDateTime($this->getDTStart()); + if (isset($event->DTEND)) { + $event->DTEND->setDateTime($this->getDtEnd()); + } + if ($this->counter > 0) { + $event->{'RECURRENCE-ID'} = (string)$event->DTSTART; + } + + return $event; + + } + + /** + * Returns the current item number + * + * @return int + */ + public function key() { + + return $this->counter; + + } + + /** + * Whether or not there is a 'next item' + * + * @return bool + */ + public function valid() { + + if (!is_null($this->count)) { + return $this->counter < $this->count; + } + if (!is_null($this->until) && $this->currentDate > $this->until) { + + // Need to make sure there's no overridden events past the + // until date. + foreach($this->overriddenEvents as $overriddenEvent) { + + if ($overriddenEvent->DTSTART->getDateTime() >= $this->currentDate) { + + return true; + } + } + return false; + } + return true; + + } + + /** + * Resets the iterator + * + * @return void + */ + public function rewind() { + + $this->currentDate = clone $this->startDate; + $this->counter = 0; + + } + + /** + * This method allows you to quickly go to the next occurrence after the + * specified date. + * + * Note that this checks the current 'endDate', not the 'stardDate'. This + * means that if you forward to January 1st, the iterator will stop at the + * first event that ends *after* January 1st. + * + * @param \DateTime $dt + * @return void + */ + public function fastForward(\DateTime $dt) { + + while($this->valid() && $this->getDTEnd() <= $dt) { + $this->next(); + } + + } + + /** + * Returns true if this recurring event never ends. + * + * @return bool + */ + public function isInfinite() { + + return !$this->count && !$this->until; + + } + + /** + * Goes on to the next iteration + * + * @return void + */ + public function next() { + + $previousStamp = $this->currentDate->getTimeStamp(); + + // Finding the next overridden event in line, and storing that for + // later use. + $overriddenEvent = null; + $overriddenDate = null; + $this->currentOverriddenEvent = null; + + foreach($this->overriddenEvents as $index=>$event) { + if ($index > $previousStamp) { + $overriddenEvent = $event; + $overriddenDate = clone $event->DTSTART->getDateTime(); + break; + } + } + + // If we have a stored 'next date', we will use that. + if ($this->nextDate) { + if (!$overriddenDate || $this->nextDate < $overriddenDate) { + $this->currentDate = $this->nextDate; + $currentStamp = $this->currentDate->getTimeStamp(); + $this->nextDate = null; + } else { + $this->currentDate = clone $overriddenDate; + $this->currentOverriddenEvent = $overriddenEvent; + } + $this->counter++; + return; + } + + while(true) { + + // Otherwise, we find the next event in the normal RRULE + // sequence. + switch($this->frequency) { + + case 'hourly' : + $this->nextHourly(); + break; + + case 'daily' : + $this->nextDaily(); + break; + + case 'weekly' : + $this->nextWeekly(); + break; + + case 'monthly' : + $this->nextMonthly(); + break; + + case 'yearly' : + $this->nextYearly(); + break; + + } + $currentStamp = $this->currentDate->getTimeStamp(); + + // Checking exception dates + foreach($this->exceptionDates as $exceptionDate) { + if ($this->currentDate == $exceptionDate) { + $this->counter++; + continue 2; + } + } + foreach($this->overriddenDates as $check) { + if ($this->currentDate == $check) { + continue 2; + } + } + break; + + } + + + + // Is the date we have actually higher than the next overiddenEvent? + if ($overriddenDate && $this->currentDate > $overriddenDate) { + $this->nextDate = clone $this->currentDate; + $this->currentDate = clone $overriddenDate; + $this->currentOverriddenEvent = $overriddenEvent; + $this->handledOverridden++; + } + $this->counter++; + + + /* + * If we have overridden events left in the queue, but our counter is + * running out, we should grab one of those. + */ + if (!is_null($overriddenEvent) && !is_null($this->count) && count($this->overriddenEvents) - $this->handledOverridden >= ($this->count - $this->counter)) { + + $this->currentOverriddenEvent = $overriddenEvent; + $this->currentDate = clone $overriddenDate; + $this->handledOverridden++; + + } + + } + + /** + * Does the processing for advancing the iterator for hourly frequency. + * + * @return void + */ + protected function nextHourly() { + + if (!$this->byHour) { + $this->currentDate->modify('+' . $this->interval . ' hours'); + return; + } + // @codeCoverageIgnoreStart + } + // @codeCoverageIgnoreEnd + + /** + * Does the processing for advancing the iterator for daily frequency. + * + * @return void + */ + protected function nextDaily() { + + if (!$this->byHour && !$this->byDay) { + $this->currentDate->modify('+' . $this->interval . ' days'); + return; + } + + if (isset($this->byHour)) { + $recurrenceHours = $this->getHours(); + } + + if (isset($this->byDay)) { + $recurrenceDays = $this->getDays(); + } + + if (isset($this->byMonth)) { + $recurrenceMonths = $this->getMonths(); + } + + do { + if ($this->byHour) { + if ($this->currentDate->format('G') == '23') { + // to obey the interval rule + $this->currentDate->modify('+' . $this->interval-1 . ' days'); + } + + $this->currentDate->modify('+1 hours'); + + } else { + $this->currentDate->modify('+' . $this->interval . ' days'); + + } + + // Current month of the year + $currentMonth = $this->currentDate->format('n'); + + // Current day of the week + $currentDay = $this->currentDate->format('w'); + + // Current hour of the day + $currentHour = $this->currentDate->format('G'); + + } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)) || ($this->byMonth && !in_array($currentMonth, $recurrenceMonths))); + + } + + /** + * Does the processing for advancing the iterator for weekly frequency. + * + * @return void + */ + protected function nextWeekly() { + + if (!$this->byHour && !$this->byDay) { + $this->currentDate->modify('+' . $this->interval . ' weeks'); + return; + } + + if ($this->byHour) { + $recurrenceHours = $this->getHours(); + } + + if ($this->byDay) { + $recurrenceDays = $this->getDays(); + } + + // First day of the week: + $firstDay = $this->dayMap[$this->weekStart]; + + do { + + if ($this->byHour) { + $this->currentDate->modify('+1 hours'); + } else { + $this->currentDate->modify('+1 days'); + } + + // Current day of the week + $currentDay = (int) $this->currentDate->format('w'); + + // Current hour of the day + $currentHour = (int) $this->currentDate->format('G'); + + // We need to roll over to the next week + if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) { + $this->currentDate->modify('+' . $this->interval-1 . ' weeks'); + + // We need to go to the first day of this week, but only if we + // are not already on this first day of this week. + if($this->currentDate->format('w') != $firstDay) { + $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]); + } + } + + // We have a match + } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); + } + + /** + * Does the processing for advancing the iterator for monthly frequency. + * + * @return void + */ + protected function nextMonthly() { + + $currentDayOfMonth = $this->currentDate->format('j'); + if (!$this->byMonthDay && !$this->byDay) { + + // If the current day is higher than the 28th, rollover can + // occur to the next month. We Must skip these invalid + // entries. + if ($currentDayOfMonth < 29) { + $this->currentDate->modify('+' . $this->interval . ' months'); + } else { + $increase = 0; + do { + $increase++; + $tempDate = clone $this->currentDate; + $tempDate->modify('+ ' . ($this->interval*$increase) . ' months'); + } while ($tempDate->format('j') != $currentDayOfMonth); + $this->currentDate = $tempDate; + } + return; + } + + while(true) { + + $occurrences = $this->getMonthlyOccurrences(); + + foreach($occurrences as $occurrence) { + + // The first occurrence thats higher than the current + // day of the month wins. + if ($occurrence > $currentDayOfMonth) { + break 2; + } + + } + + // If we made it all the way here, it means there were no + // valid occurrences, and we need to advance to the next + // month. + // + // This line does not currently work in hhvm. Temporary workaround + // follows: + // $this->currentDate->modify('first day of this month'); + $this->currentDate = new \DateTime($this->currentDate->format('Y-m-1')); + // end of workaround + $this->currentDate->modify('+ ' . $this->interval . ' months'); + + // This goes to 0 because we need to start counting at hte + // beginning. + $currentDayOfMonth = 0; + + } + + $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence); + + } + + /** + * Does the processing for advancing the iterator for yearly frequency. + * + * @return void + */ + protected function nextYearly() { + + $currentMonth = $this->currentDate->format('n'); + $currentYear = $this->currentDate->format('Y'); + $currentDayOfMonth = $this->currentDate->format('j'); + + // No sub-rules, so we just advance by year + if (!$this->byMonth) { + + // Unless it was a leap day! + if ($currentMonth==2 && $currentDayOfMonth==29) { + + $counter = 0; + do { + $counter++; + // Here we increase the year count by the interval, until + // we hit a date that's also in a leap year. + // + // We could just find the next interval that's dividable by + // 4, but that would ignore the rule that there's no leap + // year every year that's dividable by a 100, but not by + // 400. (1800, 1900, 2100). So we just rely on the datetime + // functions instead. + $nextDate = clone $this->currentDate; + $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); + } while ($nextDate->format('n')!=2); + $this->currentDate = $nextDate; + + return; + + } + + // The easiest form + $this->currentDate->modify('+' . $this->interval . ' years'); + return; + + } + + $currentMonth = $this->currentDate->format('n'); + $currentYear = $this->currentDate->format('Y'); + $currentDayOfMonth = $this->currentDate->format('j'); + + $advancedToNewMonth = false; + + // If we got a byDay or getMonthDay filter, we must first expand + // further. + if ($this->byDay || $this->byMonthDay) { + + while(true) { + + $occurrences = $this->getMonthlyOccurrences(); + + foreach($occurrences as $occurrence) { + + // The first occurrence that's higher than the current + // day of the month wins. + // If we advanced to the next month or year, the first + // occurrence is always correct. + if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { + break 2; + } + + } + + // If we made it here, it means we need to advance to + // the next month or year. + $currentDayOfMonth = 1; + $advancedToNewMonth = true; + do { + + $currentMonth++; + if ($currentMonth>12) { + $currentYear+=$this->interval; + $currentMonth = 1; + } + } while (!in_array($currentMonth, $this->byMonth)); + + $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); + + } + + // If we made it here, it means we got a valid occurrence + $this->currentDate->setDate($currentYear, $currentMonth, $occurrence); + return; + + } else { + + // These are the 'byMonth' rules, if there are no byDay or + // byMonthDay sub-rules. + do { + + $currentMonth++; + if ($currentMonth>12) { + $currentYear+=$this->interval; + $currentMonth = 1; + } + } while (!in_array($currentMonth, $this->byMonth)); + $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); + + return; + + } + + } + + /** + * Returns all the occurrences for a monthly frequency with a 'byDay' or + * 'byMonthDay' expansion for the current month. + * + * The returned list is an array of integers with the day of month (1-31). + * + * @return array + */ + protected function getMonthlyOccurrences() { + + $startDate = clone $this->currentDate; + + $byDayResults = array(); + + // Our strategy is to simply go through the byDays, advance the date to + // that point and add it to the results. + if ($this->byDay) foreach($this->byDay as $day) { + + $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]]; + + + // Dayname will be something like 'wednesday'. Now we need to find + // all wednesdays in this month. + $dayHits = array(); + + // workaround for missing 'first day of the month' support in hhvm + $checkDate = new \DateTime($startDate->format('Y-m-1')); + // workaround modify always advancing the date even if the current day is a $dayName in hhvm + if ($checkDate->format('l') !== $dayName) { + $checkDate->modify($dayName); + } + + do { + $dayHits[] = $checkDate->format('j'); + $checkDate->modify('next ' . $dayName); + } while ($checkDate->format('n') === $startDate->format('n')); + + // So now we have 'all wednesdays' for month. It is however + // possible that the user only really wanted the 1st, 2nd or last + // wednesday. + if (strlen($day)>2) { + $offset = (int)substr($day,0,-2); + + if ($offset===0) { + throw new \InvalidArgumentException('The BYDAY clause contained a 0 offset, which is not valid in iCalendar'); + } + if ($offset>0) { + // It is possible that the day does not exist, such as a + // 5th or 6th wednesday of the month. + if (isset($dayHits[$offset-1])) { + $byDayResults[] = $dayHits[$offset-1]; + } + } else { + + // if it was negative we count from the end of the array + $byDayResults[] = $dayHits[count($dayHits) + $offset]; + } + } else { + // There was no counter (first, second, last wednesdays), so we + // just need to add the all to the list). + $byDayResults = array_merge($byDayResults, $dayHits); + + } + + } + + $byMonthDayResults = array(); + if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) { + + // Removing values that are out of range for this month + if ($monthDay > $startDate->format('t') || + $monthDay < 0-$startDate->format('t')) { + continue; + } + if ($monthDay>0) { + $byMonthDayResults[] = $monthDay; + } else { + // Negative values + $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; + } + } + + // If there was just byDay or just byMonthDay, they just specify our + // (almost) final list. If both were provided, then byDay limits the + // list. + if ($this->byMonthDay && $this->byDay) { + $result = array_intersect($byMonthDayResults, $byDayResults); + } elseif ($this->byMonthDay) { + $result = $byMonthDayResults; + } else { + $result = $byDayResults; + } + $result = array_unique($result); + sort($result, SORT_NUMERIC); + + // The last thing that needs checking is the BYSETPOS. If it's set, it + // means only certain items in the set survive the filter. + if (!$this->bySetPos) { + return $result; + } + + $filteredResult = array(); + foreach($this->bySetPos as $setPos) { + + if ($setPos<0) { + $setPos = count($result)-($setPos+1); + } + if (isset($result[$setPos-1])) { + $filteredResult[] = $result[$setPos-1]; + } + } + + sort($filteredResult, SORT_NUMERIC); + return $filteredResult; + + } + + protected function getHours() + { + $recurrenceHours = array(); + foreach($this->byHour as $byHour) { + $recurrenceHours[] = $byHour; + } + + return $recurrenceHours; + } + + protected function getDays() + { + $recurrenceDays = array(); + foreach($this->byDay as $byDay) { + + // The day may be preceeded with a positive (+n) or + // negative (-n) integer. However, this does not make + // sense in 'weekly' so we ignore it here. + $recurrenceDays[] = $this->dayMap[substr($byDay,-2)]; + + } + + return $recurrenceDays; + } + + protected function getMonths() + { + $recurrenceMonths = array(); + foreach($this->byMonth as $byMonth) { + $recurrenceMonths[] = $byMonth; + } + + return $recurrenceMonths; + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php new file mode 100644 index 0000000000..e93ecf4270 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php @@ -0,0 +1,112 @@ +children() as $component) { + if (!$component instanceof VObject\Component) { + continue; + } + + // Get all timezones + if ($component->name === 'VTIMEZONE') { + $this->vtimezones[(string)$component->TZID] = $component; + continue; + } + + // Get component UID for recurring Events search + if(!$component->UID) { + $component->UID = sha1(microtime()) . '-vobjectimport'; + } + $uid = (string)$component->UID; + + // Take care of recurring events + if (!array_key_exists($uid, $this->objects)) { + $this->objects[$uid] = new VCalendar(); + } + + $this->objects[$uid]->add(clone $component); + } + + } + + /** + * Every time getNext() is called, a new object will be parsed, until we + * hit the end of the stream. + * + * When the end is reached, null will be returned. + * + * @return Sabre\VObject\Component|null + */ + public function getNext() { + + if($object=array_shift($this->objects)) { + + // create our baseobject + $object->version = '2.0'; + $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; + $object->calscale = 'GREGORIAN'; + + // add vtimezone information to obj (if we have it) + foreach ($this->vtimezones as $vtimezone) { + $object->add($vtimezone); + } + + return $object; + + } else { + + return null; + + } + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php new file mode 100644 index 0000000000..121fcb1c3f --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php @@ -0,0 +1,39 @@ +input = $input; + $this->parser = new MimeDir($input, $options); + + } + + /** + * Every time getNext() is called, a new object will be parsed, until we + * hit the end of the stream. + * + * When the end is reached, null will be returned. + * + * @return Sabre\VObject\Component|null + */ + public function getNext() { + + try { + $object = $this->parser->parse(); + } catch (VObject\EofException $e) { + return null; + } + + return $object; + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php b/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php new file mode 100644 index 0000000000..3d69a02c06 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php @@ -0,0 +1,61 @@ + 'UTC', + 31 => 'Africa/Casablanca', + + // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. + // I'm not even kidding.. We handle this special case in the + // getTimeZone method. + 2 => 'Europe/Lisbon', + 1 => 'Europe/London', + 4 => 'Europe/Berlin', + 6 => 'Europe/Prague', + 3 => 'Europe/Paris', + 69 => 'Africa/Luanda', // This was a best guess + 7 => 'Europe/Athens', + 5 => 'Europe/Bucharest', + 49 => 'Africa/Cairo', + 50 => 'Africa/Harare', + 59 => 'Europe/Helsinki', + 27 => 'Asia/Jerusalem', + 26 => 'Asia/Baghdad', + 74 => 'Asia/Kuwait', + 51 => 'Europe/Moscow', + 56 => 'Africa/Nairobi', + 25 => 'Asia/Tehran', + 24 => 'Asia/Muscat', // Best guess + 54 => 'Asia/Baku', + 48 => 'Asia/Kabul', + 58 => 'Asia/Yekaterinburg', + 47 => 'Asia/Karachi', + 23 => 'Asia/Calcutta', + 62 => 'Asia/Kathmandu', + 46 => 'Asia/Almaty', + 71 => 'Asia/Dhaka', + 66 => 'Asia/Colombo', + 61 => 'Asia/Rangoon', + 22 => 'Asia/Bangkok', + 64 => 'Asia/Krasnoyarsk', + 45 => 'Asia/Shanghai', + 63 => 'Asia/Irkutsk', + 21 => 'Asia/Singapore', + 73 => 'Australia/Perth', + 75 => 'Asia/Taipei', + 20 => 'Asia/Tokyo', + 72 => 'Asia/Seoul', + 70 => 'Asia/Yakutsk', + 19 => 'Australia/Adelaide', + 44 => 'Australia/Darwin', + 18 => 'Australia/Brisbane', + 76 => 'Australia/Sydney', + 43 => 'Pacific/Guam', + 42 => 'Australia/Hobart', + 68 => 'Asia/Vladivostok', + 41 => 'Asia/Magadan', + 17 => 'Pacific/Auckland', + 40 => 'Pacific/Fiji', + 67 => 'Pacific/Tongatapu', + 29 => 'Atlantic/Azores', + 53 => 'Atlantic/Cape_Verde', + 30 => 'America/Noronha', + 8 => 'America/Sao_Paulo', // Best guess + 32 => 'America/Argentina/Buenos_Aires', + 60 => 'America/Godthab', + 28 => 'America/St_Johns', + 9 => 'America/Halifax', + 33 => 'America/Caracas', + 65 => 'America/Santiago', + 35 => 'America/Bogota', + 10 => 'America/New_York', + 34 => 'America/Indiana/Indianapolis', + 55 => 'America/Guatemala', + 11 => 'America/Chicago', + 37 => 'America/Mexico_City', + 36 => 'America/Edmonton', + 38 => 'America/Phoenix', + 12 => 'America/Denver', // Best guess + 13 => 'America/Los_Angeles', // Best guess + 14 => 'America/Anchorage', + 15 => 'Pacific/Honolulu', + 16 => 'Pacific/Midway', + 39 => 'Pacific/Kwajalein', + ); + + /** + * This method will try to find out the correct timezone for an iCalendar + * date-time value. + * + * You must pass the contents of the TZID parameter, as well as the full + * calendar. + * + * If the lookup fails, this method will return the default PHP timezone + * (as configured using date_default_timezone_set, or the date.timezone ini + * setting). + * + * Alternatively, if $failIfUncertain is set to true, it will throw an + * exception if we cannot accurately determine the timezone. + * + * @param string $tzid + * @param Sabre\VObject\Component $vcalendar + * @return DateTimeZone + */ + static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) { + + // First we will just see if the tzid is a support timezone identifier. + // + // The only exception is if the timezone starts with (. This is to + // handle cases where certain microsoft products generate timezone + // identifiers that for instance look like: + // + // (GMT+01.00) Sarajevo/Warsaw/Zagreb + // + // Since PHP 5.5.10, the first bit will be used as the timezone and + // this method will return just GMT+01:00. This is wrong, because it + // doesn't take DST into account. + if ($tzid[0]!=='(') { + try { + return new \DateTimeZone($tzid); + } catch (\Exception $e) { + } + } + + self::loadTzMaps(); + + // Next, we check if the tzid is somewhere in our tzid map. + if (isset(self::$map[$tzid])) { + return new \DateTimeZone(self::$map[$tzid]); + } + + // Maybe the author was hyper-lazy and just included an offset. We + // support it, but we aren't happy about it. + if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) { + + // Note that the path in the source will never be taken from PHP 5.5.10 + // onwards. PHP 5.5.10 supports the "GMT+0100" style of format, so it + // already gets returned early in this function. Once we drop support + // for versions under PHP 5.5.10, this bit can be taken out of the + // source. + // @codeCoverageIgnoreStart + return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0')); + // @codeCoverageIgnoreEnd + } + + if ($vcalendar) { + + // If that didn't work, we will scan VTIMEZONE objects + foreach($vcalendar->select('VTIMEZONE') as $vtimezone) { + + if ((string)$vtimezone->TZID === $tzid) { + + // Some clients add 'X-LIC-LOCATION' with the olson name. + if (isset($vtimezone->{'X-LIC-LOCATION'})) { + + $lic = (string)$vtimezone->{'X-LIC-LOCATION'}; + + // Libical generators may specify strings like + // "SystemV/EST5EDT". For those we must remove the + // SystemV part. + if (substr($lic,0,8)==='SystemV/') { + $lic = substr($lic,8); + } + + return self::getTimeZone($lic, null, $failIfUncertain); + + } + // Microsoft may add a magic number, which we also have an + // answer for. + if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { + $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue(); + + // 2 can mean both Europe/Lisbon and Europe/Sarajevo. + if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) { + return new \DateTimeZone('Europe/Sarajevo'); + } + + if (isset(self::$microsoftExchangeMap[$cdoId])) { + return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]); + } + } + + } + + } + + } + + if ($failIfUncertain) { + throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid); + } + + // If we got all the way here, we default to UTC. + return new \DateTimeZone(date_default_timezone_get()); + + } + + /** + * This method will load in all the tz mapping information, if it's not yet + * done. + */ + static function loadTzMaps() { + + if (!is_null(self::$map)) return; + + self::$map = array_merge( + include __DIR__ . '/timezonedata/windowszones.php', + include __DIR__ . '/timezonedata/lotuszones.php', + include __DIR__ . '/timezonedata/exchangezones.php', + include __DIR__ . '/timezonedata/php-compat.php' + ); + + } + +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/UUIDUtil.php b/vendor/sabre/vobject/lib/Sabre/VObject/UUIDUtil.php new file mode 100644 index 0000000000..98a6c6fae2 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/UUIDUtil.php @@ -0,0 +1,64 @@ +getDocumentType(); + if ($inputVersion===$targetVersion) { + return clone $input; + } + + if (!in_array($inputVersion, array(Document::VCARD21, Document::VCARD30, Document::VCARD40))) { + throw new \InvalidArgumentException('Only vCard 2.1, 3.0 and 4.0 are supported for the input data'); + } + if (!in_array($targetVersion, array(Document::VCARD30, Document::VCARD40))) { + throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version'); + } + + $newVersion = $targetVersion===Document::VCARD40?'4.0':'3.0'; + + $output = new Component\VCard(array( + 'VERSION' => $newVersion, + )); + + foreach($input->children as $property) { + + $this->convertProperty($input, $output, $property, $targetVersion); + + } + + return $output; + + } + + /** + * Handles conversion of a single property. + * + * @param Component\VCard $input + * @param Component\VCard $output + * @param Property $property + * @param int $targetVersion + * @return void + */ + protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) { + + // Skipping these, those are automatically added. + if (in_array($property->name, array('VERSION', 'PRODID'))) { + return; + } + + $parameters = $property->parameters(); + + $valueType = null; + if (isset($parameters['VALUE'])) { + $valueType = $parameters['VALUE']->getValue(); + unset($parameters['VALUE']); + } + if (!$valueType) { + $valueType = $property->getValueType(); + } + + $newProperty = null; + + if ($targetVersion===Document::VCARD30) { + + if ($property instanceof Property\Uri && in_array($property->name, array('PHOTO','LOGO','SOUND'))) { + + $newProperty = $this->convertUriToBinary($output, $property, $parameters); + + } elseif ($property->name === 'KIND') { + + switch(strtolower($property->getValue())) { + case 'org' : + // OS X addressbook property. + $newProperty = $output->createProperty('X-ABSHOWAS','COMPANY'); + break; + case 'individual' : + // Individual is implied, so we can just skip it. + return; + + case 'group' : + // OS X addressbook property + $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND','GROUP'); + break; + } + + + } + + } elseif ($targetVersion===Document::VCARD40) { + + // These properties were removed in vCard 4.0 + if (in_array($property->name, array('NAME', 'MAILER', 'LABEL', 'CLASS'))) { + return; + } + + if ($property instanceOf Property\Binary) { + + $newProperty = $this->convertBinaryToUri($output, $property, $parameters); + + } else { + switch($property->name) { + case 'X-ABSHOWAS' : + if (strtoupper($property->getValue()) === 'COMPANY') { + $newProperty = $output->createProperty('KIND','org'); + } + break; + case 'X-ADDRESSBOOKSERVER-KIND' : + if (strtoupper($property->getValue()) === 'GROUP') { + $newProperty = $output->createProperty('KIND','group'); + } + break; + } + + } + + } + + + if (is_null($newProperty)) { + + $newProperty = $output->createProperty( + $property->name, + $property->getParts(), + array(), // no parameters yet + $valueType + ); + + } + + // set property group + $newProperty->group = $property->group; + + if ($targetVersion===Document::VCARD40) { + $this->convertParameters40($newProperty, $parameters); + } else { + $this->convertParameters30($newProperty, $parameters); + } + + // Lastly, we need to see if there's a need for a VALUE parameter. + // + // We can do that by instantating a empty property with that name, and + // seeing if the default valueType is identical to the current one. + $tempProperty = $output->createProperty($newProperty->name); + if ($tempProperty->getValueType() !== $newProperty->getValueType()) { + $newProperty['VALUE'] = $newProperty->getValueType(); + } + + $output->add($newProperty); + + + } + + /** + * Converts a BINARY property to a URI property. + * + * vCard 4.0 no longer supports BINARY properties. + * + * @param Component\VCard $output + * @param Property\Uri $property The input property. + * @param $parameters List of parameters that will eventually be added to + * the new property. + * @return Property\Uri + */ + protected function convertBinaryToUri(Component\VCard $output, Property\Binary $property, array &$parameters) { + + $newProperty = $output->createProperty( + $property->name, + null, // no value + array(), // no parameters yet + 'URI' // Forcing the BINARY type + ); + + $mimeType = 'application/octet-stream'; + + // See if we can find a better mimetype. + if (isset($parameters['TYPE'])) { + + $newTypes = array(); + foreach($parameters['TYPE']->getParts() as $typePart) { + if (in_array( + strtoupper($typePart), + array('JPEG','PNG','GIF') + )) { + $mimeType = 'image/' . strtolower($typePart); + } else { + $newTypes[] = $typePart; + } + } + + // If there were any parameters we're not converting to a + // mime-type, we need to keep them. + if ($newTypes) { + $parameters['TYPE']->setParts($newTypes); + } else { + unset($parameters['TYPE']); + } + + } + + $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($property->getValue())); + + return $newProperty; + + } + + /** + * Converts a URI property to a BINARY property. + * + * In vCard 4.0 attachments are encoded as data: uri. Even though these may + * be valid in vCard 3.0 as well, we should convert those to BINARY if + * possible, to improve compatibility. + * + * @param Component\VCard $output + * @param Property\Uri $property The input property. + * @param $parameters List of parameters that will eventually be added to + * the new property. + * @return Property\Binary|null + */ + protected function convertUriToBinary(Component\VCard $output, Property\Uri $property, array &$parameters) { + + $value = $property->getValue(); + + // Only converting data: uris + if (substr($value, 0, 5)!=='data:') { + return; + } + + $newProperty = $output->createProperty( + $property->name, + null, // no value + array(), // no parameters yet + 'BINARY' + ); + + $mimeType = substr($value, 5, strpos($value, ',')-5); + if (strpos($mimeType, ';')) { + $mimeType = substr($mimeType,0,strpos($mimeType, ';')); + $newProperty->setValue(base64_decode(substr($value, strpos($value,',')+1))); + } else { + $newProperty->setValue(substr($value, strpos($value,',')+1)); + } + unset($value); + + $newProperty['ENCODING'] = 'b'; + switch($mimeType) { + + case 'image/jpeg' : + $newProperty['TYPE'] = 'JPEG'; + break; + case 'image/png' : + $newProperty['TYPE'] = 'PNG'; + break; + case 'image/gif' : + $newProperty['TYPE'] = 'GIF'; + break; + + } + + + return $newProperty; + + } + + /** + * Adds parameters to a new property for vCard 4.0 + * + * @param Property $newProperty + * @param array $parameters + * @return void + */ + protected function convertParameters40(Property $newProperty, array $parameters) { + + // Adding all parameters. + foreach($parameters as $param) { + + // vCard 2.1 allowed parameters with no name + if ($param->noName) $param->noName = false; + + switch($param->name) { + + // We need to see if there's any TYPE=PREF, because in vCard 4 + // that's now PREF=1. + case 'TYPE' : + foreach($param->getParts() as $paramPart) { + + if (strtoupper($paramPart)==='PREF') { + $newProperty->add('PREF','1'); + } else { + $newProperty->add($param->name, $paramPart); + } + + } + break; + // These no longer exist in vCard 4 + case 'ENCODING' : + case 'CHARSET' : + break; + + default : + $newProperty->add($param->name, $param->getParts()); + break; + + } + + } + + } + + /** + * Adds parameters to a new property for vCard 3.0 + * + * @param Property $newProperty + * @param array $parameters + * @return void + */ + protected function convertParameters30(Property $newProperty, array $parameters) { + + // Adding all parameters. + foreach($parameters as $param) { + + // vCard 2.1 allowed parameters with no name + if ($param->noName) $param->noName = false; + + switch($param->name) { + + case 'ENCODING' : + // This value only existed in vCard 2.1, and should be + // removed for anything else. + if (strtoupper($param->getValue())!=='QUOTED-PRINTABLE') { + $newProperty->add($param->name, $param->getParts()); + } + break; + + /* + * Converting PREF=1 to TYPE=PREF. + * + * Any other PREF numbers we'll drop. + */ + case 'PREF' : + if ($param->getValue()=='1') { + $newProperty->add('TYPE','PREF'); + } + break; + + default : + $newProperty->add($param->name, $param->getParts()); + break; + + } + + } + + } +} diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Version.php b/vendor/sabre/vobject/lib/Sabre/VObject/Version.php new file mode 100644 index 0000000000..feb9346039 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/Version.php @@ -0,0 +1,19 @@ + 'UTC', + 'Casablanca, Monrovia' => 'Africa/Casablanca', + 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', + 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', + 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', + 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', + 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', + 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', + 'Prague, Central Europe' => 'Europe/Prague', + 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', + 'West Central Africa' => 'Africa/Luanda', // This was a best guess + 'Athens, Istanbul, Minsk' => 'Europe/Athens', + 'Bucharest' => 'Europe/Bucharest', + 'Cairo' => 'Africa/Cairo', + 'Harare, Pretoria' => 'Africa/Harare', + 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', + 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', + 'Baghdad' => 'Asia/Baghdad', + 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', + 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', + 'East Africa, Nairobi' => 'Africa/Nairobi', + 'Tehran' => 'Asia/Tehran', + 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess + 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', + 'Kabul' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', + 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', + 'Kathmandu, Nepal' => 'Asia/Kathmandu', + 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', + 'Astana, Dhaka' => 'Asia/Dhaka', + 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', + 'Rangoon' => 'Asia/Rangoon', + 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', + 'Krasnoyarsk' => 'Asia/Krasnoyarsk', + 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', + 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', + 'Kuala Lumpur, Singapore' => 'Asia/Singapore', + 'Perth, Western Australia' => 'Australia/Perth', + 'Taipei' => 'Asia/Taipei', + 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', + 'Seoul, Korea Standard time' => 'Asia/Seoul', + 'Yakutsk' => 'Asia/Yakutsk', + 'Adelaide, Central Australia' => 'Australia/Adelaide', + 'Darwin' => 'Australia/Darwin', + 'Brisbane, East Australia' => 'Australia/Brisbane', + 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', + 'Guam, Port Moresby' => 'Pacific/Guam', + 'Hobart, Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', + 'Auckland, Wellington' => 'Pacific/Auckland', + 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', + 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', + 'Azores' => 'Atlantic/Azores', + 'Cape Verde Is.' => 'Atlantic/Cape_Verde', + 'Mid-Atlantic' => 'America/Noronha', + 'Brasilia' => 'America/Sao_Paulo', // Best guess + 'Buenos Aires' => 'America/Argentina/Buenos_Aires', + 'Greenland' => 'America/Godthab', + 'Newfoundland' => 'America/St_Johns', + 'Atlantic Time (Canada)' => 'America/Halifax', + 'Caracas, La Paz' => 'America/Caracas', + 'Santiago' => 'America/Santiago', + 'Bogota, Lima, Quito' => 'America/Bogota', + 'Eastern Time (US & Canada)' => 'America/New_York', + 'Indiana (East)' => 'America/Indiana/Indianapolis', + 'Central America' => 'America/Guatemala', + 'Central Time (US & Canada)' => 'America/Chicago', + 'Mexico City, Tegucigalpa' => 'America/Mexico_City', + 'Saskatchewan' => 'America/Edmonton', + 'Arizona' => 'America/Phoenix', + 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess + 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess + 'Alaska' => 'America/Anchorage', + 'Hawaii' => 'Pacific/Honolulu', + 'Midway Island, Samoa' => 'Pacific/Midway', + 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', +); diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/lotuszones.php b/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/lotuszones.php new file mode 100644 index 0000000000..63a2cc82cb --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/lotuszones.php @@ -0,0 +1,101 @@ + 'Etc/GMT-12', + 'Samoa' => 'Pacific/Apia', + 'Hawaiian' => 'Pacific/Honolulu', + 'Alaskan' => 'America/Anchorage', + 'Pacific' => 'America/Los_Angeles', + 'Pacific Standard Time' => 'America/Los_Angeles', + 'Mexico Standard Time 2' => 'America/Chihuahua', + 'Mountain' => 'America/Denver', + // 'Mountain Standard Time' => 'America/Chihuahua', // conflict with windows timezones. + 'US Mountain' => 'America/Phoenix', + 'Canada Central' => 'America/Edmonton', + 'Central America' => 'America/Guatemala', + 'Central' => 'America/Chicago', + // 'Central Standard Time' => 'America/Mexico_City', // conflict with windows timezones. + 'Mexico' => 'America/Mexico_City', + 'Eastern' => 'America/New_York', + 'SA Pacific' => 'America/Bogota', + 'US Eastern' => 'America/Indiana/Indianapolis', + 'Venezuela' => 'America/Caracas', + 'Atlantic' => 'America/Halifax', + 'Central Brazilian' => 'America/Manaus', + 'Pacific SA' => 'America/Santiago', + 'SA Western' => 'America/La_Paz', + 'Newfoundland' => 'America/St_Johns', + 'Argentina' => 'America/Argentina/Buenos_Aires', + 'E. South America' => 'America/Belem', + 'Greenland' => 'America/Godthab', + 'Montevideo' => 'America/Montevideo', + 'SA Eastern' => 'America/Belem', + // 'Mid-Atlantic' => 'Etc/GMT-2', // conflict with windows timezones. + 'Azores' => 'Atlantic/Azores', + 'Cape Verde' => 'Atlantic/Cape_Verde', + 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT. + 'Morocco' => 'Africa/Casablanca', + 'Central Europe' => 'Europe/Prague', + 'Central European' => 'Europe/Sarajevo', + 'Romance' => 'Europe/Paris', + 'W. Central Africa' => 'Africa/Lagos', // Best guess + 'W. Europe' => 'Europe/Amsterdam', + 'E. Europe' => 'Europe/Minsk', + 'Egypt' => 'Africa/Cairo', + 'FLE' => 'Europe/Helsinki', + 'GTB' => 'Europe/Athens', + 'Israel' => 'Asia/Jerusalem', + 'Jordan' => 'Asia/Amman', + 'Middle East' => 'Asia/Beirut', + 'Namibia' => 'Africa/Windhoek', + 'South Africa' => 'Africa/Harare', + 'Arab' => 'Asia/Kuwait', + 'Arabic' => 'Asia/Baghdad', + 'E. Africa' => 'Africa/Nairobi', + 'Georgian' => 'Asia/Tbilisi', + 'Russian' => 'Europe/Moscow', + 'Iran' => 'Asia/Tehran', + 'Arabian' => 'Asia/Muscat', + 'Armenian' => 'Asia/Yerevan', + 'Azerbijan' => 'Asia/Baku', + 'Caucasus' => 'Asia/Yerevan', + 'Mauritius' => 'Indian/Mauritius', + 'Afghanistan' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Pakistan' => 'Asia/Karachi', + 'West Asia' => 'Asia/Tashkent', + 'India' => 'Asia/Calcutta', + 'Sri Lanka' => 'Asia/Colombo', + 'Nepal' => 'Asia/Kathmandu', + 'Central Asia' => 'Asia/Dhaka', + 'N. Central Asia' => 'Asia/Almaty', + 'Myanmar' => 'Asia/Rangoon', + 'North Asia' => 'Asia/Krasnoyarsk', + 'SE Asia' => 'Asia/Bangkok', + 'China' => 'Asia/Shanghai', + 'North Asia East' => 'Asia/Irkutsk', + 'Singapore' => 'Asia/Singapore', + 'Taipei' => 'Asia/Taipei', + 'W. Australia' => 'Australia/Perth', + 'Korea' => 'Asia/Seoul', + 'Tokyo' => 'Asia/Tokyo', + 'Yakutsk' => 'Asia/Yakutsk', + 'AUS Central' => 'Australia/Darwin', + 'Cen. Australia' => 'Australia/Adelaide', + 'AUS Eastern' => 'Australia/Sydney', + 'E. Australia' => 'Australia/Brisbane', + 'Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'West Pacific' => 'Pacific/Guam', + 'Central Pacific' => 'Asia/Magadan', + 'Fiji' => 'Pacific/Fiji', + 'New Zealand' => 'Pacific/Auckland', + 'Tonga' => 'Pacific/Tongatapu', +); diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/php-compat.php b/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/php-compat.php new file mode 100644 index 0000000000..c1c5ee5181 --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/php-compat.php @@ -0,0 +1,40 @@ + 'America/Chicago', + 'Cuba' => 'America/Havana', + 'Egypt' => 'Africa/Cairo', + 'Eire' => 'Europe/Dublin', + 'EST5EDT' => 'America/New_York', + 'Factory' => 'UTC', + 'GB-Eire' => 'Europe/London', + 'GMT0' => 'UTC', + 'Greenwich' => 'UTC', + 'Hongkong' => 'Asia/Hong_Kong', + 'Iceland' => 'Atlantic/Reykjavik', + 'Iran' => 'Asia/Tehran', + 'Israel' => 'Asia/Jerusalem', + 'Jamaica' => 'America/Jamaica', + 'Japan' => 'Asia/Tokyo', + 'Kwajalein' => 'Pacific/Kwajalein', + 'Libya' => 'Africa/Tripoli', + 'MST7MDT' => 'America/Denver', + 'Navajo' => 'America/Denver', + 'NZ-CHAT' => 'Pacific/Chatham', + 'Poland' => 'Europe/Warsaw', + 'Portugal' => 'Europe/Lisbon', + 'PST8PDT' => 'America/Los_Angeles', + 'Singapore' => 'Asia/Singapore', + 'Turkey' => 'Europe/Istanbul', + 'Universal' => 'UTC', + 'W-SU' => 'Europe/Moscow', +); diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/windowszones.php b/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/windowszones.php new file mode 100644 index 0000000000..e6b72b164f --- /dev/null +++ b/vendor/sabre/vobject/lib/Sabre/VObject/timezonedata/windowszones.php @@ -0,0 +1,114 @@ + 'Australia/Darwin', + 'AUS Eastern Standard Time' => 'Australia/Sydney', + 'Afghanistan Standard Time' => 'Asia/Kabul', + 'Alaskan Standard Time' => 'America/Anchorage', + 'Arab Standard Time' => 'Asia/Riyadh', + 'Arabian Standard Time' => 'Asia/Dubai', + 'Arabic Standard Time' => 'Asia/Baghdad', + 'Argentina Standard Time' => 'America/Buenos_Aires', + 'Atlantic Standard Time' => 'America/Halifax', + 'Azerbaijan Standard Time' => 'Asia/Baku', + 'Azores Standard Time' => 'Atlantic/Azores', + 'Bahia Standard Time' => 'America/Bahia', + 'Bangladesh Standard Time' => 'Asia/Dhaka', + 'Canada Central Standard Time' => 'America/Regina', + 'Cape Verde Standard Time' => 'Atlantic/Cape_Verde', + 'Caucasus Standard Time' => 'Asia/Yerevan', + 'Cen. Australia Standard Time' => 'Australia/Adelaide', + 'Central America Standard Time' => 'America/Guatemala', + 'Central Asia Standard Time' => 'Asia/Almaty', + 'Central Brazilian Standard Time' => 'America/Cuiaba', + 'Central Europe Standard Time' => 'Europe/Budapest', + 'Central European Standard Time' => 'Europe/Warsaw', + 'Central Pacific Standard Time' => 'Pacific/Guadalcanal', + 'Central Standard Time' => 'America/Chicago', + 'Central Standard Time (Mexico)' => 'America/Mexico_City', + 'China Standard Time' => 'Asia/Shanghai', + 'Dateline Standard Time' => 'Etc/GMT+12', + 'E. Africa Standard Time' => 'Africa/Nairobi', + 'E. Australia Standard Time' => 'Australia/Brisbane', + 'E. Europe Standard Time' => 'Asia/Nicosia', + 'E. South America Standard Time' => 'America/Sao_Paulo', + 'Eastern Standard Time' => 'America/New_York', + 'Egypt Standard Time' => 'Africa/Cairo', + 'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg', + 'FLE Standard Time' => 'Europe/Kiev', + 'Fiji Standard Time' => 'Pacific/Fiji', + 'GMT Standard Time' => 'Europe/London', + 'GTB Standard Time' => 'Europe/Bucharest', + 'Georgian Standard Time' => 'Asia/Tbilisi', + 'Greenland Standard Time' => 'America/Godthab', + 'Greenwich Standard Time' => 'Atlantic/Reykjavik', + 'Hawaiian Standard Time' => 'Pacific/Honolulu', + 'India Standard Time' => 'Asia/Calcutta', + 'Iran Standard Time' => 'Asia/Tehran', + 'Israel Standard Time' => 'Asia/Jerusalem', + 'Jordan Standard Time' => 'Asia/Amman', + 'Kaliningrad Standard Time' => 'Europe/Kaliningrad', + 'Korea Standard Time' => 'Asia/Seoul', + 'Libya Standard Time' => 'Africa/Tripoli', + 'Magadan Standard Time' => 'Asia/Magadan', + 'Mauritius Standard Time' => 'Indian/Mauritius', + 'Middle East Standard Time' => 'Asia/Beirut', + 'Montevideo Standard Time' => 'America/Montevideo', + 'Morocco Standard Time' => 'Africa/Casablanca', + 'Mountain Standard Time' => 'America/Denver', + 'Mountain Standard Time (Mexico)' => 'America/Chihuahua', + 'Myanmar Standard Time' => 'Asia/Rangoon', + 'N. Central Asia Standard Time' => 'Asia/Novosibirsk', + 'Namibia Standard Time' => 'Africa/Windhoek', + 'Nepal Standard Time' => 'Asia/Katmandu', + 'New Zealand Standard Time' => 'Pacific/Auckland', + 'Newfoundland Standard Time' => 'America/St_Johns', + 'North Asia East Standard Time' => 'Asia/Irkutsk', + 'North Asia Standard Time' => 'Asia/Krasnoyarsk', + 'Pacific SA Standard Time' => 'America/Santiago', + 'Pacific Standard Time' => 'America/Los_Angeles', + 'Pacific Standard Time (Mexico)' => 'America/Santa_Isabel', + 'Pakistan Standard Time' => 'Asia/Karachi', + 'Paraguay Standard Time' => 'America/Asuncion', + 'Romance Standard Time' => 'Europe/Paris', + 'Russian Standard Time' => 'Europe/Moscow', + 'SA Eastern Standard Time' => 'America/Cayenne', + 'SA Pacific Standard Time' => 'America/Bogota', + 'SA Western Standard Time' => 'America/La_Paz', + 'SE Asia Standard Time' => 'Asia/Bangkok', + 'Samoa Standard Time' => 'Pacific/Apia', + 'Singapore Standard Time' => 'Asia/Singapore', + 'South Africa Standard Time' => 'Africa/Johannesburg', + 'Sri Lanka Standard Time' => 'Asia/Colombo', + 'Syria Standard Time' => 'Asia/Damascus', + 'Taipei Standard Time' => 'Asia/Taipei', + 'Tasmania Standard Time' => 'Australia/Hobart', + 'Tokyo Standard Time' => 'Asia/Tokyo', + 'Tonga Standard Time' => 'Pacific/Tongatapu', + 'Turkey Standard Time' => 'Europe/Istanbul', + 'US Eastern Standard Time' => 'America/Indianapolis', + 'US Mountain Standard Time' => 'America/Phoenix', + 'UTC' => 'Etc/GMT', + 'UTC+12' => 'Etc/GMT-12', + 'UTC-02' => 'Etc/GMT+2', + 'UTC-11' => 'Etc/GMT+11', + 'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar', + 'Venezuela Standard Time' => 'America/Caracas', + 'Vladivostok Standard Time' => 'Asia/Vladivostok', + 'W. Australia Standard Time' => 'Australia/Perth', + 'W. Central Africa Standard Time' => 'Africa/Lagos', + 'W. Europe Standard Time' => 'Europe/Berlin', + 'West Asia Standard Time' => 'Asia/Tashkent', + 'West Pacific Standard Time' => 'Pacific/Port_Moresby', + 'Yakutsk Standard Time' => 'Asia/Yakutsk', +); diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/AttachIssueTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/AttachIssueTest.php new file mode 100644 index 0000000000..68c9872bb5 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/AttachIssueTest.php @@ -0,0 +1,22 @@ +assertEquals($event, $obj->serialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/CliTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/CliTest.php new file mode 100644 index 0000000000..e2be4696e7 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/CliTest.php @@ -0,0 +1,672 @@ +cli = new CliMock(); + $this->cli->stderr = fopen('php://memory','r+'); + $this->cli->stdout = fopen('php://memory','r+'); + + } + + public function testInvalidArg() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', '--hi')) + ); + rewind($this->cli->stderr); + $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100); + + } + + public function testQuiet() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', '-q')) + ); + $this->assertTrue($this->cli->quiet); + + rewind($this->cli->stderr); + $this->assertEquals(0, strlen(stream_get_contents($this->cli->stderr))); + + } + + public function testHelp() { + + $this->assertEquals( + 0, + $this->cli->main(array('vobject', '-h')) + ); + rewind($this->cli->stderr); + $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100); + + } + + public function testFormat() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', '--format=jcard')) + ); + + rewind($this->cli->stderr); + $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100); + + $this->assertEquals('jcard', $this->cli->format); + + } + + public function testFormatInvalid() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', '--format=foo')) + ); + + rewind($this->cli->stderr); + $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100); + + $this->assertNull($this->cli->format); + + } + + public function testInputFormatInvalid() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', '--inputformat=foo')) + ); + + rewind($this->cli->stderr); + $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100); + + $this->assertNull($this->cli->format); + + } + + + public function testNoInputFile() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', 'color')) + ); + + rewind($this->cli->stderr); + $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100); + + } + + public function testTooManyArgs() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', 'color', 'a', 'b', 'c')) + ); + + } + + public function testUnknownCommand() { + + $this->assertEquals( + 1, + $this->cli->main(array('vobject', 'foo', '-')) + ); + + } + + public function testConvertJson() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + $this->assertEquals( + 0, + $this->cli->main(array('vobject', 'convert','--format=json', '-')) + ); + + rewind($this->cli->stdout); + $version = Version::VERSION; + $this->assertEquals( + '["vcard",[["version",{},"text","4.0"],["prodid",{},"text","-\/\/Sabre\/\/Sabre VObject '. $version .'\/\/EN"],["fn",{},"text","Cowboy Henk"]]]', + stream_get_contents($this->cli->stdout) + ); + + } + + public function testConvertJCardPretty() { + + if (version_compare(PHP_VERSION, '5.4.0') < 0) { + $this->markTestSkipped('This test required PHP 5.4.0'); + } + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + $this->assertEquals( + 0, + $this->cli->main(array('vobject', 'convert','--format=jcard', '--pretty', '-')) + ); + + rewind($this->cli->stdout); + $version = Version::VERSION; + $expected = <<assertEquals( + $expected, + stream_get_contents($this->cli->stdout) + ); + + } + + public function testConvertJCalFail() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'convert','--format=jcal', '--inputformat=mimedir', '-')) + ); + + } + + public function testConvertMimeDir() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + $this->assertEquals( + 0, + $this->cli->main(array('vobject', 'convert','--format=mimedir', '--inputformat=json', '--pretty', '-')) + ); + + rewind($this->cli->stdout); + $expected = <<assertEquals( + strtr($expected, array("\n"=>"\r\n")), + stream_get_contents($this->cli->stdout) + ); + + } + + public function testConvertDefaultFormats() { + + $inputStream = fopen('php://memory','r+'); + $outputFile = SABRE_TEMPDIR . 'bar.json'; + + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'convert','foo.json',$outputFile)) + ); + + $this->assertEquals('json', $this->cli->inputFormat); + $this->assertEquals('json', $this->cli->format); + + } + + public function testConvertDefaultFormats2() { + + $outputFile = SABRE_TEMPDIR . 'bar.ics'; + + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'convert','foo.ics',$outputFile)) + ); + + $this->assertEquals('mimedir', $this->cli->inputFormat); + $this->assertEquals('mimedir', $this->cli->format); + + } + + public function testVCard3040() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + $this->assertEquals( + 0, + $this->cli->main(array('vobject', 'convert','--format=vcard40', '--pretty', '-')) + ); + + rewind($this->cli->stdout); + + $version = Version::VERSION; + $expected = <<assertEquals( + strtr($expected, array("\n"=>"\r\n")), + stream_get_contents($this->cli->stdout) + ); + + } + + public function testVCard4030() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + $this->assertEquals( + 0, + $this->cli->main(array('vobject', 'convert','--format=vcard30', '--pretty', '-')) + ); + + $version = Version::VERSION; + + rewind($this->cli->stdout); + $expected = <<assertEquals( + strtr($expected, array("\n"=>"\r\n")), + stream_get_contents($this->cli->stdout) + ); + + } + + public function testVCard4021() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + + // vCard 2.1 is not supported yet, so this returns a failure. + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'convert','--format=vcard21', '--pretty', '-')) + ); + + } + + function testValidate() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + $result = $this->cli->main(array('vobject', 'validate', '-')); + + $this->assertEquals( + 0, + $result + ); + + } + + function testValidateFail() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + // vCard 2.1 is not supported yet, so this returns a failure. + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'validate', '-')) + ); + + } + + function testValidateFail2() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + // vCard 2.1 is not supported yet, so this returns a failure. + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'validate', '-')) + ); + + } + + function testRepair() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + // vCard 2.1 is not supported yet, so this returns a failure. + $this->assertEquals( + 2, + $this->cli->main(array('vobject', 'repair', '-')) + ); + + rewind($this->cli->stdout); + $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.1\r\nEND:VCARD\r\n", stream_get_contents($this->cli->stdout)); + + } + + function testRepairNothing() { + + $inputStream = fopen('php://memory','r+'); + + fwrite($inputStream, <<cli->stdin = $inputStream; + // vCard 2.1 is not supported yet, so this returns a failure. + + $result = $this->cli->main(array('vobject', 'repair', '-')); + + rewind($this->cli->stderr); + $error = stream_get_contents($this->cli->stderr); + + $this->assertEquals( + 0, + $result, + "This should have been error free. stderr output:\n" . $error + ); + + } + + /** + * Note: this is a very shallow test, doesn't dig into the actual output, + * but just makes sure there's no errors thrown. + * + * The colorizer is not a critical component, it's mostly a debugging tool. + */ + function testColorCalendar() { + + $inputStream = fopen('php://memory','r+'); + + $version = Version::VERSION; + + /** + * This object is not valid, but it's designed to hit every part of the + * colorizer source. + */ + fwrite($inputStream, <<cli->stdin = $inputStream; + // vCard 2.1 is not supported yet, so this returns a failure. + + $result = $this->cli->main(array('vobject', 'color', '-')); + + rewind($this->cli->stderr); + $error = stream_get_contents($this->cli->stderr); + + $this->assertEquals( + 0, + $result, + "This should have been error free. stderr output:\n" . $error + ); + + } + + /** + * Note: this is a very shallow test, doesn't dig into the actual output, + * but just makes sure there's no errors thrown. + * + * The colorizer is not a critical component, it's mostly a debugging tool. + */ + function testColorVCard() { + + $inputStream = fopen('php://memory','r+'); + + $version = Version::VERSION; + + /** + * This object is not valid, but it's designed to hit every part of the + * colorizer source. + */ + fwrite($inputStream, <<cli->stdin = $inputStream; + // vCard 2.1 is not supported yet, so this returns a failure. + + $result = $this->cli->main(array('vobject', 'color', '-')); + + rewind($this->cli->stderr); + $error = stream_get_contents($this->cli->stderr); + + $this->assertEquals( + 0, + $result, + "This should have been error free. stderr output:\n" . $error + ); + + } +} + +class CliMock extends Cli { + + public $log = array(); + + public $quiet = false; + + public $format; + + public $pretty; + + public $stdin; + + public $stdout; + + public $stderr; + + public $inputFormat; + + public $outputFormat; + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php new file mode 100644 index 0000000000..4343cb9da4 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php @@ -0,0 +1,179 @@ +assertEquals($outcome, $valarm->isInTimeRange($start, $end)); + + } + + public function timeRangeTestData() { + + $tests = array(); + + $calendar = new VCalendar(); + + // Hard date and time + $valarm1 = $calendar->createComponent('VALARM'); + $valarm1->add( + $calendar->createProperty('TRIGGER', '20120312T130000Z', array('VALUE' => 'DATE-TIME')) + ); + + $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true); + $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false); + + // Relation to start time of event + $valarm2 = $calendar->createComponent('VALARM'); + $valarm2->add( + $calendar->createProperty('TRIGGER', '-P1D', array('VALUE' => 'DURATION')) + ); + + $vevent2 = $calendar->createComponent('VEVENT'); + $vevent2->DTSTART = '20120313T130000Z'; + $vevent2->add($valarm2); + + $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true); + $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false); + + // Relation to end time of event + $valarm3 = $calendar->createComponent('VALARM'); + $valarm3->add( $calendar->createProperty('TRIGGER', '-P1D', array('VALUE'=>'DURATION', 'RELATED' => 'END')) ); + + $vevent3 = $calendar->createComponent('VEVENT'); + $vevent3->DTSTART = '20120301T130000Z'; + $vevent3->DTEND = '20120401T130000Z'; + $vevent3->add($valarm3); + + $tests[] = array($valarm3, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false); + $tests[] = array($valarm3, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true); + + // Relation to end time of todo + $valarm4 = $calendar->createComponent('VALARM'); + $valarm4->TRIGGER = '-P1D'; + $valarm4->TRIGGER['VALUE'] = 'DURATION'; + $valarm4->TRIGGER['RELATED']= 'END'; + + $vtodo4 = $calendar->createComponent('VTODO'); + $vtodo4->DTSTART = '20120301T130000Z'; + $vtodo4->DUE = '20120401T130000Z'; + $vtodo4->add($valarm4); + + $tests[] = array($valarm4, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false); + $tests[] = array($valarm4, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true); + + // Relation to start time of event + repeat + $valarm5 = $calendar->createComponent('VALARM'); + $valarm5->TRIGGER = '-P1D'; + $valarm5->TRIGGER['VALUE'] = 'DURATION'; + $valarm5->REPEAT = 10; + $valarm5->DURATION = 'P1D'; + + $vevent5 = $calendar->createComponent('VEVENT'); + $vevent5->DTSTART = '20120301T130000Z'; + $vevent5->add($valarm5); + + $tests[] = array($valarm5, new DateTime('2012-03-09 01:00:00'), new DateTime('2012-03-10 01:00:00'), true); + + // Relation to start time of event + duration, but no repeat + $valarm6 = $calendar->createComponent('VALARM'); + $valarm6->TRIGGER = '-P1D'; + $valarm6->TRIGGER['VALUE'] = 'DURATION'; + $valarm6->DURATION = 'P1D'; + + $vevent6 = $calendar->createComponent('VEVENT'); + $vevent6->DTSTART = '20120313T130000Z'; + $vevent6->add($valarm6); + + $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true); + $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false); + + + // Relation to end time of event (DURATION instead of DTEND) + $valarm7 = $calendar->createComponent('VALARM'); + $valarm7->TRIGGER = '-P1D'; + $valarm7->TRIGGER['VALUE'] = 'DURATION'; + $valarm7->TRIGGER['RELATED']= 'END'; + + $vevent7 = $calendar->createComponent('VEVENT'); + $vevent7->DTSTART = '20120301T130000Z'; + $vevent7->DURATION = 'P30D'; + $vevent7->add($valarm7); + + $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false); + $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true); + + // Relation to end time of event (No DTEND or DURATION) + $valarm7 = $calendar->createComponent('VALARM'); + $valarm7->TRIGGER = '-P1D'; + $valarm7->TRIGGER['VALUE'] = 'DURATION'; + $valarm7->TRIGGER['RELATED']= 'END'; + + $vevent7 = $calendar->createComponent('VEVENT'); + $vevent7->DTSTART = '20120301T130000Z'; + $vevent7->add($valarm7); + + $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), true); + $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), false); + + + return $tests; + } + + /** + * @expectedException LogicException + */ + public function testInTimeRangeInvalidComponent() { + + $calendar = new VCalendar(); + $valarm = $calendar->createComponent('VALARM'); + $valarm->TRIGGER = '-P1D'; + $valarm->TRIGGER['RELATED'] = 'END'; + + $vjournal = $calendar->createComponent('VJOURNAL'); + $vjournal->add($valarm); + + $valarm->isInTimeRange(new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00')); + + } + + /** + * This bug was found and reported on the mailing list. + */ + public function testInTimeRangeBuggy() { + +$input = <<assertTrue($vobj->VTODO->VALARM->isInTimeRange(new \DateTime('2012-10-01 00:00:00'), new \DateTime('2012-11-01 00:00:00'))); + + } + +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php new file mode 100644 index 0000000000..0e123cb120 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php @@ -0,0 +1,417 @@ +expand( + new \DateTime('2011-12-01'), + new \DateTime('2011-12-31') + ); + + // This will normalize the output + $output = VObject\Reader::read($output)->serialize(); + + $this->assertEquals($output, $vcal->serialize()); + + } + + public function expandData() { + + $tests = array(); + + // No data + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +END:VCALENDAR +'; + + $output = $input; + $tests[] = array($input,$output); + + + // Simple events + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla +SUMMARY:InExpand +DTSTART;VALUE=DATE:20111202 +END:VEVENT +BEGIN:VEVENT +UID:bla2 +SUMMARY:NotInExpand +DTSTART;VALUE=DATE:20120101 +END:VEVENT +END:VCALENDAR +'; + + $output = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla +SUMMARY:InExpand +DTSTART;VALUE=DATE:20111202 +END:VEVENT +END:VCALENDAR +'; + + $tests[] = array($input, $output); + + // Removing timezone info + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:Europe/Paris +END:VTIMEZONE +BEGIN:VEVENT +UID:bla4 +SUMMARY:RemoveTZ info +DTSTART;TZID=Europe/Paris:20111203T130102 +END:VEVENT +END:VCALENDAR +'; + + $output = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla4 +SUMMARY:RemoveTZ info +DTSTART:20111203T120102Z +END:VEVENT +END:VCALENDAR +'; + + $tests[] = array($input, $output); + + // Recurrence rule + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule +DTSTART:20111125T120000Z +DTEND:20111125T130000Z +RRULE:FREQ=WEEKLY +END:VEVENT +END:VCALENDAR +'; + + $output = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule +DTSTART:20111202T120000Z +DTEND:20111202T130000Z +RECURRENCE-ID:20111202T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule +DTSTART:20111209T120000Z +DTEND:20111209T130000Z +RECURRENCE-ID:20111209T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule +DTSTART:20111216T120000Z +DTEND:20111216T130000Z +RECURRENCE-ID:20111216T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule +DTSTART:20111223T120000Z +DTEND:20111223T130000Z +RECURRENCE-ID:20111223T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule +DTSTART:20111230T120000Z +DTEND:20111230T130000Z +RECURRENCE-ID:20111230T120000Z +END:VEVENT +END:VCALENDAR +'; + + $tests[] = array($input, $output); + + // Recurrence rule + override + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule2 +DTSTART:20111125T120000Z +DTEND:20111125T130000Z +RRULE:FREQ=WEEKLY +END:VEVENT +BEGIN:VEVENT +UID:bla6 +RECURRENCE-ID:20111209T120000Z +DTSTART:20111209T140000Z +DTEND:20111209T150000Z +SUMMARY:Override! +END:VEVENT +END:VCALENDAR +'; + + $output = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule2 +DTSTART:20111202T120000Z +DTEND:20111202T130000Z +RECURRENCE-ID:20111202T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +RECURRENCE-ID:20111209T120000Z +DTSTART:20111209T140000Z +DTEND:20111209T150000Z +SUMMARY:Override! +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule2 +DTSTART:20111216T120000Z +DTEND:20111216T130000Z +RECURRENCE-ID:20111216T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule2 +DTSTART:20111223T120000Z +DTEND:20111223T130000Z +RECURRENCE-ID:20111223T120000Z +END:VEVENT +BEGIN:VEVENT +UID:bla6 +SUMMARY:Testing RRule2 +DTSTART:20111230T120000Z +DTEND:20111230T130000Z +RECURRENCE-ID:20111230T120000Z +END:VEVENT +END:VCALENDAR +'; + + $tests[] = array($input, $output); + return $tests; + + } + + /** + * @expectedException LogicException + */ + public function testBrokenEventExpand() { + + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +RRULE:FREQ=WEEKLY +DTSTART;VALUE=DATE:20111202 +END:VEVENT +END:VCALENDAR +'; + $vcal = VObject\Reader::read($input); + $vcal->expand( + new \DateTime('2011-12-01'), + new \DateTime('2011-12-31') + ); + + } + + function testGetDocumentType() { + + $vcard = new VCalendar(); + $vcard->VERSION = '2.0'; + $this->assertEquals(VCalendar::ICALENDAR20, $vcard->getDocumentType()); + + } + + function testValidateCorrect() { + + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +PRODID:foo +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +DTSTAMP:20140122T233226Z +UID:foo +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(array(), $vcal->validate(), 'Got an error'); + + } + + function testValidateNoVersion() { + + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:foo +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(1, count($vcal->validate())); + + } + + function testValidateWrongVersion() { + + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:3.0 +PRODID:foo +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(1, count($vcal->validate())); + + } + + function testValidateNoProdId() { + + $input = 'BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(1, count($vcal->validate())); + + } + + function testValidateDoubleCalScale() { + + $input = 'BEGIN:VCALENDAR +VERSION:2.0 +PRODID:foo +CALSCALE:GREGORIAN +CALSCALE:GREGORIAN +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(1, count($vcal->validate())); + + } + + function testValidateDoubleMethod() { + + $input = 'BEGIN:VCALENDAR +VERSION:2.0 +PRODID:foo +METHOD:REQUEST +METHOD:REQUEST +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(1, count($vcal->validate())); + + } + + function testValidateTwoMasterEvents() { + + $input = 'BEGIN:VCALENDAR +VERSION:2.0 +PRODID:foo +METHOD:REQUEST +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(1, count($vcal->validate())); + + } + + function testValidateOneMasterEvent() { + + $input = 'BEGIN:VCALENDAR +VERSION:2.0 +PRODID:foo +METHOD:REQUEST +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +END:VEVENT +BEGIN:VEVENT +DTSTART;VALUE=DATE:20111202 +UID:foo +DTSTAMP:20140122T234434Z +RECURRENCE-ID;VALUE=DATE:20111202 +END:VEVENT +END:VCALENDAR +'; + + $vcal = VObject\Reader::read($input); + $this->assertEquals(0, count($vcal->validate())); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php new file mode 100644 index 0000000000..032f275989 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php @@ -0,0 +1,176 @@ +validate(); + + $warnMsg = array(); + foreach($warnings as $warning) { + $warnMsg[] = $warning['message']; + } + + $this->assertEquals($expectedWarnings, $warnMsg); + + $vcard->validate(VObject\Component::REPAIR); + + $this->assertEquals( + $expectedRepairedOutput, + $vcard->serialize() + ); + + } + + public function validateData() { + + $tests = array(); + + // Correct + $tests[] = array( + "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n", + array(), + "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n", + ); + + // No VERSION + $tests[] = array( + "BEGIN:VCARD\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n", + array( + 'VERSION MUST appear exactly once in a VCARD component', + ), + "BEGIN:VCARD\r\nVERSION:3.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n", + ); + + // Unknown version + $tests[] = array( + "BEGIN:VCARD\r\nVERSION:2.2\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n", + array( + 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', + ), + "BEGIN:VCARD\r\nVERSION:2.1\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n", + ); + + // No FN + $tests[] = array( + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nEND:VCARD\r\n", + array( + 'The FN property must appear in the VCARD component exactly 1 time', + ), + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nEND:VCARD\r\n", + ); + // No FN, N fallback + $tests[] = array( + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;John;;;;;\r\nEND:VCARD\r\n", + array( + 'The FN property must appear in the VCARD component exactly 1 time', + ), + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;John;;;;;\r\nFN:John Doe\r\nEND:VCARD\r\n", + ); + // No FN, N fallback, no first name + $tests[] = array( + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;;;;;;\r\nEND:VCARD\r\n", + array( + 'The FN property must appear in the VCARD component exactly 1 time', + ), + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;;;;;;\r\nFN:Doe\r\nEND:VCARD\r\n", + ); + + // No FN, ORG fallback + $tests[] = array( + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nORG:Acme Co.\r\nEND:VCARD\r\n", + array( + 'The FN property must appear in the VCARD component exactly 1 time', + ), + "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nORG:Acme Co.\r\nFN:Acme Co.\r\nEND:VCARD\r\n", + ); + return $tests; + + } + + function testGetDocumentType() { + + $vcard = new VCard(array(), false); + $vcard->VERSION = '2.1'; + $this->assertEquals(VCard::VCARD21, $vcard->getDocumentType()); + + $vcard = new VCard(array(), false); + $vcard->VERSION = '3.0'; + $this->assertEquals(VCard::VCARD30, $vcard->getDocumentType()); + + $vcard = new VCard(array(), false); + $vcard->VERSION = '4.0'; + $this->assertEquals(VCard::VCARD40, $vcard->getDocumentType()); + + $vcard = new VCard(array(), false); + $this->assertEquals(VCard::UNKNOWN, $vcard->getDocumentType()); + } + + function testPreferredNoPref() { + + $vcard = <<assertEquals('1@example.org', $vcard->preferred('EMAIL')->getValue()); + + } + + function testPreferredWithPref() { + + $vcard = <<assertEquals('2@example.org', $vcard->preferred('EMAIL')->getValue()); + + } + + function testPreferredWith40Pref() { + + $vcard = <<assertEquals('3@example.org', $vcard->preferred('EMAIL')->getValue()); + + } + + function testPreferredNotFound() { + + $vcard = <<assertNull($vcard->preferred('EMAIL')); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php new file mode 100644 index 0000000000..c51410fc01 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php @@ -0,0 +1,76 @@ +assertEquals($outcome, $vevent->isInTimeRange($start, $end)); + + } + + public function timeRangeTestData() { + + $tests = array(); + + $calendar = new VCalendar(); + + $vevent = $calendar->createComponent('VEVENT'); + $vevent->DTSTART = '20111223T120000Z'; + $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vevent2 = clone $vevent; + $vevent2->DTEND = '20111225T120000Z'; + $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vevent3 = clone $vevent; + $vevent3->DURATION = 'P1D'; + $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vevent4 = clone $vevent; + $vevent4->DTSTART = '20111225'; + $vevent4->DTSTART['VALUE'] = 'DATE'; + $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + // Event with no end date should be treated as lasting the entire day. + $tests[] = array($vevent4, new \DateTime('2011-12-25 16:00:00'), new \DateTime('2011-12-25 17:00:00'), true); + + + $vevent5 = clone $vevent; + $vevent5->DURATION = 'P1D'; + $vevent5->RRULE = 'FREQ=YEARLY'; + $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + $tests[] = array($vevent5, new \DateTime('2013-12-01'), new \DateTime('2013-12-31'), true); + + $vevent6 = clone $vevent; + $vevent6->DTSTART = '20111225'; + $vevent6->DTSTART['VALUE'] = 'DATE'; + $vevent6->DTEND = '20111225'; + $vevent6->DTEND['VALUE'] = 'DATE'; + + $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + // Added this test to ensure that recurrence rules with no DTEND also + // get checked for the entire day. + $vevent7 = clone $vevent; + $vevent7->DTSTART = '20120101'; + $vevent7->DTSTART['VALUE'] = 'DATE'; + $vevent7->RRULE = 'FREQ=MONTHLY'; + $tests[] = array($vevent7, new \DateTime('2012-02-01 15:00:00'), new \DateTime('2012-02-02'), true); + return $tests; + + } + +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php new file mode 100644 index 0000000000..46acc69fc8 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php @@ -0,0 +1,66 @@ +VFREEBUSY; + + $tz = new \DateTimeZone('UTC'); + + $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 01:15:00', $tz), new \DateTime('2012-09-12 01:45:00', $tz))); + $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 08:05:00', $tz), new \DateTime('2012-09-12 08:10:00', $tz))); + $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 10:15:00', $tz), new \DateTime('2012-09-12 10:45:00', $tz))); + + // Checking whether the end time is treated as non-inclusive + $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:00:00', $tz), new \DateTime('2012-09-12 09:15:00', $tz))); + $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:45:00', $tz), new \DateTime('2012-09-12 10:00:00', $tz))); + $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 11:00:00', $tz), new \DateTime('2012-09-12 12:00:00', $tz))); + + } + + public function testValidate() { + + $input = <<validate(); + $messages = array(); + foreach($warnings as $warning) { + $messages[] = $warning['message']; + } + + $this->assertEquals(array(), $messages); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php new file mode 100644 index 0000000000..10fc49fd43 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php @@ -0,0 +1,101 @@ +assertEquals($outcome, $vtodo->isInTimeRange($start, $end)); + + } + + public function testValidate() { + + $input = <<validate(); + $messages = array(); + foreach($warnings as $warning) { + $messages[] = $warning['message']; + } + + $this->assertEquals(array(), $messages); + + } + + public function testValidateBroken() { + + $input = <<validate(); + $messages = array(); + foreach($warnings as $warning) { + $messages[] = $warning['message']; + } + + $this->assertEquals( + array("URL MUST NOT appear more than once in a VJOURNAL component"), + $messages + ); + + } + + public function timeRangeTestData() { + + $calendar = new VCalendar(); + + $tests = array(); + + $vjournal = $calendar->createComponent('VJOURNAL'); + $vjournal->DTSTART = '20111223T120000Z'; + $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vjournal2 = $calendar->createComponent('VJOURNAL'); + $vjournal2->DTSTART = '20111223'; + $vjournal2->DTSTART['VALUE'] = 'DATE'; + $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vjournal3 = $calendar->createComponent('VJOURNAL'); + $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), false); + $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + return $tests; + } + + + +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTimeZoneTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTimeZoneTest.php new file mode 100644 index 0000000000..794b221a1d --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTimeZoneTest.php @@ -0,0 +1,34 @@ +validate(); + $messages = array(); + foreach($warnings as $warning) { + $messages[] = $warning['message']; + } + + $this->assertEquals(array(), $messages); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php new file mode 100644 index 0000000000..53bf5f2846 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php @@ -0,0 +1,121 @@ +assertEquals($outcome, $vtodo->isInTimeRange($start, $end)); + + } + + public function timeRangeTestData() { + + $tests = array(); + + $calendar = new VCalendar(); + + $vtodo = $calendar->createComponent('VTODO'); + $vtodo->DTSTART = '20111223T120000Z'; + $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo2 = clone $vtodo; + $vtodo2->DURATION = 'P1D'; + $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo3 = clone $vtodo; + $vtodo3->DUE = '20111225'; + $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo4 = $calendar->createComponent('VTODO'); + $vtodo4->DUE = '20111225'; + $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo5 = $calendar->createComponent('VTODO'); + $vtodo5->COMPLETED = '20111225'; + $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo6 = $calendar->createComponent('VTODO'); + $vtodo6->CREATED = '20111225'; + $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo7 = $calendar->createComponent('VTODO'); + $vtodo7->CREATED = '20111225'; + $vtodo7->COMPLETED = '20111226'; + $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false); + + $vtodo7 = $calendar->createComponent('VTODO'); + $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true); + $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), true); + + return $tests; + + } + + public function testValidate() { + + $input = <<validate(); + $messages = array(); + foreach($warnings as $warning) { + $messages[] = $warning['message']; + } + + $this->assertEquals(array(), $messages); + + } + + public function testValidateInvalid() { + + $input = <<validate(); + $messages = array(); + foreach($warnings as $warning) { + $messages[] = $warning['message']; + } + + $this->assertEquals(array( + "UID MUST appear exactly once in a VTODO component", + "DTSTAMP MUST appear exactly once in a VTODO component", + ), $messages); + + } +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php new file mode 100644 index 0000000000..b0c17a4b8d --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php @@ -0,0 +1,538 @@ +createComponent('VEVENT'); + $comp->add($sub); + + $sub = $comp->createComponent('VTODO'); + $comp->add($sub); + + $count = 0; + foreach($comp->children() as $key=>$subcomponent) { + + $count++; + $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent); + + } + $this->assertEquals(2,$count); + $this->assertEquals(1,$key); + + } + + function testMagicGet() { + + $comp = new VCalendar(array(), false); + + $sub = $comp->createComponent('VEVENT'); + $comp->add($sub); + + $sub = $comp->createComponent('VTODO'); + $comp->add($sub); + + $event = $comp->vevent; + $this->assertInstanceOf('Sabre\\VObject\\Component', $event); + $this->assertEquals('VEVENT', $event->name); + + $this->assertInternalType('null', $comp->vjournal); + + } + + function testMagicGetGroups() { + + $comp = new VCard(); + + $sub = $comp->createProperty('GROUP1.EMAIL','1@1.com'); + $comp->add($sub); + + $sub = $comp->createProperty('GROUP2.EMAIL','2@2.com'); + $comp->add($sub); + + $sub = $comp->createProperty('EMAIL','3@3.com'); + $comp->add($sub); + + $emails = $comp->email; + $this->assertEquals(3, count($emails)); + + $email1 = $comp->{"group1.email"}; + $this->assertEquals('EMAIL', $email1[0]->name); + $this->assertEquals('GROUP1', $email1[0]->group); + + $email3 = $comp->{".email"}; + $this->assertEquals('EMAIL', $email3[0]->name); + $this->assertEquals(null, $email3[0]->group); + + } + + function testMagicIsset() { + + $comp = new VCalendar(); + + $sub = $comp->createComponent('VEVENT'); + $comp->add($sub); + + $sub = $comp->createComponent('VTODO'); + $comp->add($sub); + + $this->assertTrue(isset($comp->vevent)); + $this->assertTrue(isset($comp->vtodo)); + $this->assertFalse(isset($comp->vjournal)); + + } + + function testMagicSetScalar() { + + $comp = new VCalendar(); + $comp->myProp = 'myValue'; + + $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP); + $this->assertEquals('myValue',(string)$comp->MYPROP); + + + } + + function testMagicSetScalarTwice() { + + $comp = new VCalendar(array(), false); + $comp->myProp = 'myValue'; + $comp->myProp = 'myValue'; + + $this->assertEquals(1,count($comp->children())); + $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP); + $this->assertEquals('myValue',(string)$comp->MYPROP); + + } + + function testMagicSetArray() { + + $comp = new VCalendar(); + $comp->ORG = array('Acme Inc', 'Section 9'); + + $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->ORG); + $this->assertEquals(array('Acme Inc', 'Section 9'),$comp->ORG->getParts()); + + } + + function testMagicSetComponent() { + + $comp = new VCalendar(); + + // Note that 'myProp' is ignored here. + $comp->myProp = $comp->createComponent('VEVENT'); + + $this->assertEquals(1, count($comp)); + + $this->assertEquals('VEVENT',$comp->VEVENT->name); + + } + + function testMagicSetTwice() { + + $comp = new VCalendar(array(), false); + + $comp->VEVENT = $comp->createComponent('VEVENT'); + $comp->VEVENT = $comp->createComponent('VEVENT'); + + $this->assertEquals(1, count($comp->children())); + + $this->assertEquals('VEVENT',$comp->VEVENT->name); + + } + + function testArrayAccessGet() { + + $comp = new VCalendar(array(), false); + + $event = $comp->createComponent('VEVENT'); + $event->summary = 'Event 1'; + + $comp->add($event); + + $event2 = clone $event; + $event2->summary = 'Event 2'; + + $comp->add($event2); + + $this->assertEquals(2,count($comp->children())); + $this->assertTrue($comp->vevent[1] instanceof Component); + $this->assertEquals('Event 2', (string)$comp->vevent[1]->summary); + + } + + function testArrayAccessExists() { + + $comp = new VCalendar(); + + $event = $comp->createComponent('VEVENT'); + $event->summary = 'Event 1'; + + $comp->add($event); + + $event2 = clone $event; + $event2->summary = 'Event 2'; + + $comp->add($event2); + + $this->assertTrue(isset($comp->vevent[0])); + $this->assertTrue(isset($comp->vevent[1])); + + } + + /** + * @expectedException LogicException + */ + function testArrayAccessSet() { + + $comp = new VCalendar(); + $comp['hey'] = 'hi there'; + + } + /** + * @expectedException LogicException + */ + function testArrayAccessUnset() { + + $comp = new VCalendar(); + unset($comp[0]); + + } + + function testAddScalar() { + + $comp = new VCalendar(array(), false); + + $comp->add('myprop','value'); + + $this->assertEquals(1, count($comp->children())); + + $bla = $comp->children[0]; + + $this->assertTrue($bla instanceof Property); + $this->assertEquals('MYPROP',$bla->name); + $this->assertEquals('value',(string)$bla); + + } + + function testAddScalarParams() { + + $comp = new VCalendar(array(), false); + + $comp->add('myprop','value',array('param1'=>'value1')); + + $this->assertEquals(1, count($comp->children())); + + $bla = $comp->children[0]; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $bla); + $this->assertEquals('MYPROP',$bla->name); + $this->assertEquals('value', (string)$bla); + + $this->assertEquals(1, count($bla->parameters())); + + $this->assertEquals('PARAM1',$bla->parameters['PARAM1']->name); + $this->assertEquals('value1',$bla->parameters['PARAM1']->getValue()); + + } + + + function testAddComponent() { + + $comp = new VCalendar(array(), false); + + $comp->add($comp->createComponent('VEVENT')); + + $this->assertEquals(1, count($comp->children())); + + $this->assertEquals('VEVENT',$comp->VEVENT->name); + + } + + function testAddComponentTwice() { + + $comp = new VCalendar(array(), false); + + $comp->add($comp->createComponent('VEVENT')); + $comp->add($comp->createComponent('VEVENT')); + + $this->assertEquals(2, count($comp->children())); + + $this->assertEquals('VEVENT',$comp->VEVENT->name); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testAddArgFail() { + + $comp = new VCalendar(); + $comp->add($comp->createComponent('VEVENT'),'hello'); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testAddArgFail2() { + + $comp = new VCalendar(); + $comp->add(array()); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testMagicSetInvalid() { + + $comp = new VCalendar(array(), false); + + // Note that 'myProp' is ignored here. + $comp->myProp = new \StdClass(); + + } + + function testMagicUnset() { + + $comp = new VCalendar(array(), false); + $comp->add($comp->createComponent('VEVENT')); + + unset($comp->vevent); + + $this->assertEquals(0, count($comp->children())); + + } + + + function testCount() { + + $comp = new VCalendar(); + $this->assertEquals(1,$comp->count()); + + } + + function testChildren() { + + $comp = new VCalendar(array(), false); + + // Note that 'myProp' is ignored here. + $comp->add($comp->createComponent('VEVENT')); + $comp->add($comp->createComponent('VTODO')); + + $r = $comp->children(); + $this->assertInternalType('array', $r); + $this->assertEquals(2,count($r)); + } + + function testGetComponents() { + + $comp = new VCalendar(); + + $comp->add($comp->createProperty('FOO','BAR')); + $comp->add($comp->createComponent('VTODO')); + + $r = $comp->getComponents(); + $this->assertInternalType('array', $r); + $this->assertEquals(1, count($r)); + $this->assertEquals('VTODO', $r[0]->name); + } + + function testSerialize() { + + $comp = new VCalendar(array(), false); + $this->assertEquals("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n", $comp->serialize()); + + } + + function testSerializeChildren() { + + $comp = new VCalendar(array(), false); + $comp->add($comp->createComponent('VEVENT')); + $comp->add($comp->createComponent('VTODO')); + + $str = $comp->serialize(); + + $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n", $str); + + } + + function testSerializeOrderCompAndProp() { + + $comp = new VCalendar(array(), false); + $comp->add($comp->createComponent('VEVENT')); + $comp->add('PROP1','BLABLA'); + $comp->add('VERSION','2.0'); + $comp->add($comp->createComponent('VTIMEZONE')); + + $str = $comp->serialize(); + + $this->assertEquals("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPROP1:BLABLA\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $str); + + } + + function testAnotherSerializeOrderProp() { + + $prop4s=array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10'); + + $comp = new VCard(array(), false); + + $comp->__set('SOMEPROP','FOO'); + $comp->__set('ANOTHERPROP','FOO'); + $comp->__set('THIRDPROP','FOO'); + foreach ($prop4s as $prop4) { + $comp->add('PROP4', 'FOO '.$prop4); + } + $comp->__set('PROPNUMBERFIVE', 'FOO'); + $comp->__set('PROPNUMBERSIX', 'FOO'); + $comp->__set('PROPNUMBERSEVEN', 'FOO'); + $comp->__set('PROPNUMBEREIGHT', 'FOO'); + $comp->__set('PROPNUMBERNINE', 'FOO'); + $comp->__set('PROPNUMBERTEN', 'FOO'); + $comp->__set('VERSION','2.0'); + $comp->__set('UID', 'FOO'); + + $str = $comp->serialize(); + + $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.0\r\nSOMEPROP:FOO\r\nANOTHERPROP:FOO\r\nTHIRDPROP:FOO\r\nPROP4:FOO 1\r\nPROP4:FOO 2\r\nPROP4:FOO 3\r\nPROP4:FOO 4\r\nPROP4:FOO 5\r\nPROP4:FOO 6\r\nPROP4:FOO 7\r\nPROP4:FOO 8\r\nPROP4:FOO 9\r\nPROP4:FOO 10\r\nPROPNUMBERFIVE:FOO\r\nPROPNUMBERSIX:FOO\r\nPROPNUMBERSEVEN:FOO\r\nPROPNUMBEREIGHT:FOO\r\nPROPNUMBERNINE:FOO\r\nPROPNUMBERTEN:FOO\r\nUID:FOO\r\nEND:VCARD\r\n", $str); + + } + + function testInstantiateWithChildren() { + + $comp = new VCard(array( + 'ORG' => array('Acme Inc.', 'Section 9'), + 'FN' => 'Finn The Human', + )); + + $this->assertEquals(array('Acme Inc.', 'Section 9'), $comp->ORG->getParts()); + $this->assertEquals('Finn The Human', $comp->FN->getValue()); + + } + + function testInstantiateSubComponent() { + + $comp = new VCalendar(); + $event = $comp->createComponent('VEVENT', array( + $comp->createProperty('UID', '12345'), + )); + $comp->add($event); + + $this->assertEquals('12345', $comp->VEVENT->UID->getValue()); + + } + + function testRemoveByName() { + + $comp = new VCalendar(array(), false); + $comp->add('prop1','val1'); + $comp->add('prop2','val2'); + $comp->add('prop2','val2'); + + $comp->remove('prop2'); + $this->assertFalse(isset($comp->prop2)); + $this->assertTrue(isset($comp->prop1)); + + } + + function testRemoveByObj() { + + $comp = new VCalendar(array(), false); + $comp->add('prop1','val1'); + $prop = $comp->add('prop2','val2'); + + $comp->remove($prop); + $this->assertFalse(isset($comp->prop2)); + $this->assertTrue(isset($comp->prop1)); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testRemoveNotFound() { + + $comp = new VCalendar(array(), false); + $prop = $comp->createProperty('A','B'); + $comp->remove($prop); + + } + + /** + * @dataProvider ruleData + */ + function testValidateRules($componentList, $errorCount) { + + $vcard = new Component\VCard(); + + $component = new FakeComponent($vcard,'Hi', array(), $defaults = false ); + foreach($componentList as $v) { + $component->add($v,'Hello.'); + } + + $this->assertEquals($errorCount, count($component->validate())); + + } + + function testValidateRepair() { + + $vcard = new Component\VCard(); + + $component = new FakeComponent($vcard,'Hi', array(), $defaults = false ); + $component->validate(Component::REPAIR); + $this->assertEquals('yow', $component->BAR->getValue()); + + } + + function ruleData() { + + return array( + + array(array(), 2), + array(array('FOO'), 3), + array(array('BAR'), 1), + array(array('BAZ'), 1), + array(array('BAR','BAZ'), 0), + array(array('BAR','BAZ','ZIM',), 0), + array(array('BAR','BAZ','ZIM','GIR'), 0), + array(array('BAR','BAZ','ZIM','GIR','GIR'), 1), + + ); + + } + +} + +class FakeComponent extends Component { + + public function getValidationRules() { + + return array( + 'FOO' => '0', + 'BAR' => '1', + 'BAZ' => '+', + 'ZIM' => '*', + 'GIR' => '?', + ); + + } + + public function getDefaults() { + + return array( + 'BAR' => 'yow', + ); + + } + +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php new file mode 100644 index 0000000000..8c78d1baae --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php @@ -0,0 +1,388 @@ +assertEquals('+1 weeks', DateTimeParser::parseDuration('P1W',true)); + $this->assertEquals('+5 days', DateTimeParser::parseDuration('P5D',true)); + $this->assertEquals('+5 days 3 hours 50 minutes 12 seconds', DateTimeParser::parseDuration('P5DT3H50M12S',true)); + $this->assertEquals('-1 weeks 50 minutes', DateTimeParser::parseDuration('-P1WT50M',true)); + $this->assertEquals('+50 days 3 hours 2 seconds', DateTimeParser::parseDuration('+P50DT3H2S',true)); + $this->assertEquals(new DateInterval('PT0S'), DateTimeParser::parseDuration('PT0S')); + + } + + function testParseICalendarDurationDateInterval() { + + $expected = new DateInterval('P7D'); + $this->assertEquals($expected, DateTimeParser::parseDuration('P1W')); + $this->assertEquals($expected, DateTimeParser::parse('P1W')); + + $expected = new DateInterval('PT3M'); + $expected->invert = true; + $this->assertEquals($expected, DateTimeParser::parseDuration('-PT3M')); + + } + + /** + * @expectedException LogicException + */ + function testParseICalendarDurationFail() { + + DateTimeParser::parseDuration('P1X',true); + + } + + function testParseICalendarDateTime() { + + $dateTime = DateTimeParser::parseDateTime('20100316T141405'); + + $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC')); + + $this->assertEquals($compare, $dateTime); + + } + + /** + * @depends testParseICalendarDateTime + * @expectedException LogicException + */ + function testParseICalendarDateTimeBadFormat() { + + $dateTime = DateTimeParser::parseDateTime('20100316T141405 '); + + } + + /** + * @depends testParseICalendarDateTime + */ + function testParseICalendarDateTimeUTC() { + + $dateTime = DateTimeParser::parseDateTime('20100316T141405Z'); + + $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC')); + $this->assertEquals($compare, $dateTime); + + } + + /** + * @depends testParseICalendarDateTime + */ + function testParseICalendarDateTimeUTC2() { + + $dateTime = DateTimeParser::parseDateTime('20101211T160000Z'); + + $compare = new DateTime('2010-12-11 16:00:00',new DateTimeZone('UTC')); + $this->assertEquals($compare, $dateTime); + + } + + /** + * @depends testParseICalendarDateTime + */ + function testParseICalendarDateTimeCustomTimeZone() { + + $dateTime = DateTimeParser::parseDateTime('20100316T141405', new DateTimeZone('Europe/Amsterdam')); + + $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('Europe/Amsterdam')); + $this->assertEquals($compare, $dateTime); + + } + + function testParseICalendarDate() { + + $dateTime = DateTimeParser::parseDate('20100316'); + + $expected = new DateTime('2010-03-16 00:00:00',new DateTimeZone('UTC')); + + $this->assertEquals($expected, $dateTime); + + $dateTime = DateTimeParser::parse('20100316'); + $this->assertEquals($expected, $dateTime); + + } + + /** + * TCheck if a date with year > 4000 will not throw an exception. iOS seems to use 45001231 in yearly recurring events + */ + function testParseICalendarDateGreaterThan4000() { + + $dateTime = DateTimeParser::parseDate('45001231'); + + $expected = new DateTime('4500-12-31 00:00:00',new DateTimeZone('UTC')); + + $this->assertEquals($expected, $dateTime); + + $dateTime = DateTimeParser::parse('45001231'); + $this->assertEquals($expected, $dateTime); + + } + + /** + * Check if a datetime with year > 4000 will not throw an exception. iOS seems to use 45001231T235959 in yearly recurring events + */ + function testParseICalendarDateTimeGreaterThan4000() { + + $dateTime = DateTimeParser::parseDateTime('45001231T235959'); + + $expected = new DateTime('4500-12-31 23:59:59',new DateTimeZone('UTC')); + + $this->assertEquals($expected, $dateTime); + + $dateTime = DateTimeParser::parse('45001231T235959'); + $this->assertEquals($expected, $dateTime); + + } + + /** + * @depends testParseICalendarDate + * @expectedException LogicException + */ + function testParseICalendarDateBadFormat() { + + $dateTime = DateTimeParser::parseDate('20100316T141405'); + + } + + /** + * @dataProvider vcardDates + */ + function testVCardDate($input, $output) { + + $this->assertEquals( + $output, + DateTimeParser::parseVCardDateTime($input) + ); + + } + + /** + * @dataProvider vcardDates + * @expectedException \InvalidArgumentException + */ + function testBadVCardDate() { + + DateTimeParser::parseVCardDateTime('1985---01'); + + } + + /** + * @dataProvider vcardDates + * @expectedException \InvalidArgumentException + */ + function testBadVCardTime() { + + DateTimeParser::parseVCardTime('23:12:166'); + + } + + function vcardDates() { + + return array( + array( + "19961022T140000", + array( + "year" => 1996, + "month" => 10, + "date" => 22, + "hour" => 14, + "minute" => 00, + "second" => 00, + "timezone" => null + ), + ), + array( + "--1022T1400", + array( + "year" => null, + "month" => 10, + "date" => 22, + "hour" => 14, + "minute" => 00, + "second" => null, + "timezone" => null + ), + ), + array( + "---22T14", + array( + "year" => null, + "month" => null, + "date" => 22, + "hour" => 14, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "19850412", + array( + "year" => 1985, + "month" => 4, + "date" => 12, + "hour" => null, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "1985-04", + array( + "year" => 1985, + "month" => 04, + "date" => null, + "hour" => null, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "1985", + array( + "year" => 1985, + "month" => null, + "date" => null, + "hour" => null, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "--0412", + array( + "year" => null, + "month" => 4, + "date" => 12, + "hour" => null, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "---12", + array( + "year" => null, + "month" => null, + "date" => 12, + "hour" => null, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "T102200", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => 10, + "minute" => 22, + "second" => 0, + "timezone" => null + ), + ), + array( + "T1022", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => 10, + "minute" => 22, + "second" => null, + "timezone" => null + ), + ), + array( + "T10", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => 10, + "minute" => null, + "second" => null, + "timezone" => null + ), + ), + array( + "T-2200", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => null, + "minute" => 22, + "second" => 00, + "timezone" => null + ), + ), + array( + "T--00", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => null, + "minute" => null, + "second" => 00, + "timezone" => null + ), + ), + array( + "T102200Z", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => 10, + "minute" => 22, + "second" => 00, + "timezone" => 'Z' + ), + ), + array( + "T102200-0800", + array( + "year" => null, + "month" => null, + "date" => null, + "hour" => 10, + "minute" => 22, + "second" => 00, + "timezone" => '-0800' + ), + ), + + // extended format + array( + "2012-11-29T15:10:53Z", + array( + "year" => 2012, + "month" => 11, + "date" => 29, + "hour" => 15, + "minute" => 10, + "second" => 53, + "timezone" => 'Z' + ), + ), + ); + + } + + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php new file mode 100644 index 0000000000..40d6b680d5 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php @@ -0,0 +1,65 @@ +assertEquals(Document::UNKNOWN, $doc->getDocumentType()); + + } + + function testConstruct() { + + $doc = new MockDocument('VLIST'); + $this->assertEquals('VLIST', $doc->name); + + } + + function testCreateComponent() { + + $vcal = new Component\VCalendar(array(), false); + + $event = $vcal->createComponent('VEVENT'); + + $this->assertInstanceOf('Sabre\VObject\Component\VEvent', $event); + $vcal->add($event); + + $prop = $vcal->createProperty('X-PROP','1234256',array('X-PARAM' => '3')); + $this->assertInstanceOf('Sabre\VObject\Property', $prop); + + $event->add($prop); + + $out = $vcal->serialize(); + $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nX-PROP;X-PARAM=3:1234256\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $out); + + } + + function testCreate() { + + $vcal = new Component\VCalendar(array(), false); + + $event = $vcal->create('VEVENT'); + $this->assertInstanceOf('Sabre\VObject\Component\VEvent', $event); + + $event = $vcal->create('CALSCALE'); + $this->assertInstanceOf('Sabre\VObject\Property\Text', $event); + + } + + function testGetClassNameForPropertyValue() { + + $vcal = new Component\VCalendar(array(), false); + $this->assertEquals('Sabre\\VObject\\Property\\Text', $vcal->getClassNameForPropertyValue('TEXT')); + $this->assertNull($vcal->getClassNameForPropertyValue('FOO')); + + } + +} + + +class MockDocument extends Document { + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php new file mode 100644 index 0000000000..48cea36d45 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php @@ -0,0 +1,33 @@ +createComponent('VEVENT'); + + $elems = array( + $sub, + clone $sub, + clone $sub + ); + + $elemList = new ElementList($elems); + + $count = 0; + foreach($elemList as $key=>$subcomponent) { + + $count++; + $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent); + + } + $this->assertEquals(3,$count); + $this->assertEquals(2,$key); + + } + + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php new file mode 100644 index 0000000000..69d410fe7f --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php @@ -0,0 +1,55 @@ +VEVENT->DTSTART->getDateTime(); + $this->assertEquals(new \DateTime('2011-10-08 19:30:00', new \DateTimeZone('America/Chicago')), $dt); + + } + +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/EmptyValueIssueTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/EmptyValueIssueTest.php new file mode 100644 index 0000000000..1f993ea4b8 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/EmptyValueIssueTest.php @@ -0,0 +1,31 @@ +assertEquals("This is a descpription\nwith a linebreak and a ; , and :", $vobj->VEVENT->DESCRIPTION->getValue()); + + } + +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php new file mode 100644 index 0000000000..534cb55f92 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php @@ -0,0 +1,248 @@ +getInput() + ); + + $result = $gen->getResult(); + + $expected = array( + '20110101T120000Z/20110101T130000Z', + '20110101T130000Z/20110101T140000Z', + '20110101T180000Z/20110101T190000Z', + '20110101T190000Z/20110101T200000Z', + '20110102T000000Z/20110103T000000Z', + '20110101T210000Z/20110101T220000Z', + + '20110103T010000Z/20110103T020000Z', + '20110103T030000Z/20110103T040000Z', + '20110103T040000Z/20110103T050000Z', + '20110103T050000Z/20110103T060000Z', + + '20110101T220000Z/20110101T230000Z', + '20110101T230000Z/20110102T000000Z', + ); + + foreach($result->VFREEBUSY->FREEBUSY as $fb) { + + $this->assertContains((string)$fb, $expected); + + $k = array_search((string)$fb, $expected); + unset($expected[$k]); + + } + if (count($expected)>0) { + $this->fail('There were elements in the expected array that were not found in the output: ' . "\n" . print_r($expected,true) . "\n" . $result->serialize()); + + } + + } + + function testGeneratorBaseObject() { + + $obj = new Component\VCalendar(); + $obj->METHOD = 'PUBLISH'; + + $gen = new FreeBusyGenerator(); + $gen->setObjects(array()); + $gen->setBaseObject($obj); + + $result = $gen->getResult(); + + $this->assertEquals('PUBLISH', $result->METHOD->getValue()); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testInvalidArg() { + + $gen = new FreeBusyGenerator( + new \DateTime('2012-01-01'), + new \DateTime('2012-12-31'), + new \StdClass() + ); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/GoogleColonEscapingTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/GoogleColonEscapingTest.php new file mode 100644 index 0000000000..0961ec1bd7 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/GoogleColonEscapingTest.php @@ -0,0 +1,31 @@ +assertEquals('http://www.rooftopsolutions.nl/', $vobj->URL->getValue()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php new file mode 100644 index 0000000000..1cc14c1610 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php @@ -0,0 +1,14 @@ +assertEquals('Test Benutzer', (string)$obj->fn); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php new file mode 100644 index 0000000000..ae3a3e8b84 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php @@ -0,0 +1,29 @@ +VERSION = '3.0'; + $vcard->PHOTO = 'random_stuff'; + $vcard->PHOTO->add('BASE64',null); + $vcard->UID = 'foo-bar'; + + $result = $vcard->serialize(); + $expected = array( + "BEGIN:VCARD", + "VERSION:3.0", + "PHOTO;BASE64:" . base64_encode('random_stuff'), + "UID:foo-bar", + "END:VCARD", + "", + ); + + $this->assertEquals(implode("\r\n", $expected), $result); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue26Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue26Test.php new file mode 100644 index 0000000000..3fe4a13f97 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue26Test.php @@ -0,0 +1,36 @@ +assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal); + + $it = new RecurrenceIterator($vcal, 'bae5d57a98'); + iterator_to_array($it); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue36WorkAroundTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue36WorkAroundTest.php new file mode 100644 index 0000000000..00e67ba947 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue36WorkAroundTest.php @@ -0,0 +1,39 @@ +assertInstanceOf('Sabre\\VObject\\RecurrenceIterator', $it); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue40Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue40Test.php new file mode 100644 index 0000000000..92f04ffa24 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue40Test.php @@ -0,0 +1,30 @@ +add('N', array('van der Harten', array('Rene','J.'), "", 'Sir','R.D.O.N.'), array('SORT-AS' => array('Harten','Rene'))); + + $expected = implode("\r\n", array( + "BEGIN:VCARD", + "VERSION:3.0", + "PRODID:-//Sabre//Sabre VObject " . Version::VERSION . '//EN', + "N;SORT-AS=Harten,Rene:van der Harten;Rene,J.;;Sir;R.D.O.N.", + "END:VCARD", + "" + )); + + $this->assertEquals($expected, $card->serialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php new file mode 100644 index 0000000000..980d432b9f --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php @@ -0,0 +1,47 @@ +assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal); + + $it = new RecurrenceIterator($vcal, 'foo'); + + $result = iterator_to_array($it); + + $tz = new DateTimeZone('Europe/Moscow'); + + $this->assertEquals(array( + new DateTime('2013-07-10 11:00:00', $tz), + new DateTime('2013-07-12 11:00:00', $tz), + new DateTime('2013-07-13 11:00:00', $tz), + ), $result); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php new file mode 100644 index 0000000000..fdb012ba20 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php @@ -0,0 +1,128 @@ +assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal); + + $it = new RecurrenceIterator($vcal, '1aef0b27-3d92-4581-829a-11999dd36724'); + + $result = array(); + foreach($it as $instance) { + + $result[] = $instance; + + } + + $tz = new DateTimeZone('Europe/Brussels'); + + $this->assertEquals(array( + new DateTime('2013-07-15 09:00:00', $tz), + new DateTime('2013-07-16 07:00:00', $tz), + new DateTime('2013-07-17 07:00:00', $tz), + new DateTime('2013-07-18 09:00:00', $tz), + new DateTime('2013-07-19 07:00:00', $tz), + ), $result); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue64Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue64Test.php new file mode 100644 index 0000000000..986a248136 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue64Test.php @@ -0,0 +1,19 @@ +convert(\Sabre\VObject\Document::VCARD30); + $vcard = $vcard->serialize(); + + $converted = Reader::read($vcard); + + $this->assertInstanceOf('Sabre\\VObject\\Component\\VCard', $converted); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/JCalTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/JCalTest.php new file mode 100644 index 0000000000..79731d7396 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/JCalTest.php @@ -0,0 +1,141 @@ +add('VEVENT', array( + "UID" => "foo", + "DTSTART" => new \DateTime("2013-05-26 18:10:00Z"), + "DURATION" => "P1D", + "CATEGORIES" => array('home', 'testing'), + "CREATED" => new \DateTime("2013-05-26 18:10:00Z"), + "ATTACH" => "attachment", + "ATTENDEE" => "mailto:armin@example.org", + "GEO" => array(51.96668, 7.61876), + "SEQUENCE" => 5, + "FREEBUSY" => array("20130526T210213Z/PT1H", "20130626T120000Z/20130626T130000Z"), + "URL" => "http://example.org/", + "TZOFFSETFROM" => "+05:00", + "RRULE" => array('FREQ' => 'WEEKLY', 'BYDAY' => array('MO','TU')), + )); + + // Modifying DTSTART to be a date-only. + $event->dtstart['VALUE'] = 'DATE'; + $event->add("X-BOOL", true, array('VALUE' => 'BOOLEAN')); + $event->add("X-TIME", "08:00:00", array('VALUE' => 'TIME')); + + $event->add("ATTENDEE", "mailto:dominik@example.org", array("CN" => "Dominik", "PARTSTAT" => "DECLINED")); + + $event->add('REQUEST-STATUS', array("2.0", "Success")); + $event->add('REQUEST-STATUS', array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org")); + + $expected = array( + "vcalendar", + array( + array( + "version", + new \StdClass(), + "text", + "2.0" + ), + array( + "prodid", + new \StdClass(), + "text", + "-//Sabre//Sabre VObject " . Version::VERSION . "//EN", + ), + array( + "calscale", + new \StdClass(), + "text", + "GREGORIAN" + ), + ), + array( + array("vevent", + array( + array( + "uid", new \StdClass(), "text", "foo", + ), + array( + "dtstart", new \StdClass(), "date", "2013-05-26", + ), + array( + "duration", new \StdClass(), "duration", "P1D", + ), + array( + "categories", new \StdClass(), "text", "home", "testing", + ), + array( + "created", new \StdClass(), "date-time", "2013-05-26T18:10:00Z", + ), + array( + "attach", new \StdClass(), "binary", base64_encode('attachment') + ), + array( + "attendee", new \StdClass(), "cal-address", "mailto:armin@example.org", + ), + array( + "geo", new \StdClass(), "float", array(51.96668, 7.61876), + ), + array( + "sequence", new \StdClass(), "integer", 5 + ), + array( + "freebusy", new \StdClass(), "period", array("2013-05-26T21:02:13", "PT1H"), array("2013-06-26T12:00:00", "2013-06-26T13:00:00"), + ), + array( + "url", new \StdClass(), "uri", "http://example.org/", + ), + array( + "tzoffsetfrom", new \StdClass(), "utc-offset", "+05:00", + ), + array( + "rrule", new \StdClass(), "recur", array( + 'freq' => 'WEEKLY', + 'byday' => array('MO', 'TU'), + ), + ), + array( + "x-bool", new \StdClass(), "boolean", true + ), + array( + "x-time", new \StdClass(), "time", "08:00:00", + ), + array( + "attendee", + (object)array( + "cn" => "Dominik", + "partstat" => "DECLINED", + ), + "cal-address", + "mailto:dominik@example.org" + ), + array( + "request-status", + new \StdClass(), + "text", + array("2.0", "Success"), + ), + array( + "request-status", + new \StdClass(), + "text", + array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org"), + ), + ), + array(), + ) + ), + ); + + $this->assertEquals($expected, $cal->jsonSerialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/JCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/JCardTest.php new file mode 100644 index 0000000000..9bd0f9ab9f --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/JCardTest.php @@ -0,0 +1,195 @@ + "4.0", + "UID" => "foo", + "BDAY" => "19850407", + "REV" => "19951031T222710Z", + "LANG" => "nl", + "N" => array("Last", "First", "Middle", "", ""), + "item1.TEL" => "+1 555 123456", + "item1.X-AB-LABEL" => "Walkie Talkie", + "ADR" => array( + "", + "", + array("My Street", "Left Side", "Second Shack"), + "Hometown", + "PA", + "18252", + "U.S.A", + ), + )); + + $card->add('BDAY', '1979-12-25', array('VALUE' => 'DATE', 'X-PARAM' => array(1,2))); + $card->add('BDAY', '1979-12-25T02:00:00', array('VALUE' => 'DATE-TIME')); + + + $card->add('X-TRUNCATED', '--1225', array('VALUE' => 'DATE')); + $card->add('X-TIME-LOCAL', '123000', array('VALUE' => 'TIME')); + $card->add('X-TIME-UTC', '12:30:00Z', array('VALUE' => 'TIME')); + $card->add('X-TIME-OFFSET', '12:30:00-08:00', array('VALUE' => 'TIME')); + $card->add('X-TIME-REDUCED', '23', array('VALUE' => 'TIME')); + $card->add('X-TIME-TRUNCATED', '--30', array('VALUE' => 'TIME')); + + $card->add('X-KARMA-POINTS', '42', array('VALUE' => 'INTEGER')); + $card->add('X-GRADE', '1.3', array('VALUE' => 'FLOAT')); + + $card->add('TZ', '-05:00', array('VALUE' => 'UTC-OFFSET')); + + $expected = array( + "vcard", + array( + array( + "version", + new \StdClass(), + "text", + "4.0" + ), + array( + "prodid", + new \StdClass(), + "text", + "-//Sabre//Sabre VObject " . Version::VERSION . "//EN", + ), + array( + "uid", + new \StdClass(), + "text", + "foo", + ), + array( + "bday", + new \StdClass(), + "date-and-or-time", + "1985-04-07", + ), + array( + "rev", + new \StdClass(), + "timestamp", + "1995-10-31T22:27:10Z", + ), + array( + "lang", + new \StdClass(), + "language-tag", + "nl", + ), + array( + "n", + new \StdClass(), + "text", + array("Last", "First", "Middle", "", ""), + ), + array( + "tel", + (object)array( + "group" => "item1", + ), + "text", + "+1 555 123456", + ), + array( + "x-ab-label", + (object)array( + "group" => "item1", + ), + "unknown", + "Walkie Talkie", + ), + array( + "adr", + new \StdClass(), + "text", + array( + "", + "", + array("My Street", "Left Side", "Second Shack"), + "Hometown", + "PA", + "18252", + "U.S.A", + ), + ), + array( + "bday", + (object)array( + 'x-param' => array(1,2), + ), + "date", + "1979-12-25", + ), + array( + "bday", + new \StdClass(), + "date-time", + "1979-12-25T02:00:00", + ), + array( + "x-truncated", + new \StdClass(), + "date", + "--12-25", + ), + array( + "x-time-local", + new \StdClass(), + "time", + "12:30:00" + ), + array( + "x-time-utc", + new \StdClass(), + "time", + "12:30:00Z" + ), + array( + "x-time-offset", + new \StdClass(), + "time", + "12:30:00-08:00" + ), + array( + "x-time-reduced", + new \StdClass(), + "time", + "23" + ), + array( + "x-time-truncated", + new \StdClass(), + "time", + "--30" + ), + array( + "x-karma-points", + new \StdClass(), + "integer", + 42 + ), + array( + "x-grade", + new \StdClass(), + "float", + 1.3 + ), + array( + "tz", + new \StdClass(), + "utc-offset", + "-05:00", + ), + ), + ); + + $this->assertEquals($expected, $card->jsonSerialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/LineFoldingIssueTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/LineFoldingIssueTest.php new file mode 100644 index 0000000000..47fef1c11e --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/LineFoldingIssueTest.php @@ -0,0 +1,23 @@ +assertEquals($event, $obj->serialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php new file mode 100644 index 0000000000..1be5e6cd10 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php @@ -0,0 +1,112 @@ +assertEquals('NAME',$param->name); + $this->assertEquals('value',$param->getValue()); + + } + + function testSetupNameLess() { + + $card = new Component\VCard(); + + $param = new Parameter($card, null,'URL'); + $this->assertEquals('VALUE',$param->name); + $this->assertEquals('URL',$param->getValue()); + $this->assertTrue($param->noName); + + } + + function testModify() { + + $cal = new Component\VCalendar(); + + $param = new Parameter($cal, 'name', null); + $param->addValue(1); + $this->assertEquals(array(1), $param->getParts()); + + $param->setParts(array(1,2)); + $this->assertEquals(array(1,2), $param->getParts()); + + $param->addValue(3); + $this->assertEquals(array(1,2,3), $param->getParts()); + + $param->setValue(4); + $param->addValue(5); + $this->assertEquals(array(4,5), $param->getParts()); + + } + + function testCastToString() { + + $cal = new Component\VCalendar(); + $param = new Parameter($cal, 'name', 'value'); + $this->assertEquals('value',$param->__toString()); + $this->assertEquals('value',(string)$param); + + } + + function testCastNullToString() { + + $cal = new Component\VCalendar(); + $param = new Parameter($cal, 'name', null); + $this->assertEquals('',$param->__toString()); + $this->assertEquals('',(string)$param); + + } + + function testSerialize() { + + $cal = new Component\VCalendar(); + $param = new Parameter($cal, 'name', 'value'); + $this->assertEquals('NAME=value',$param->serialize()); + + } + + function testSerializeEmpty() { + + $cal = new Component\VCalendar(); + $param = new Parameter($cal, 'name', null); + $this->assertEquals('NAME',$param->serialize()); + + } + + function testSerializeComplex() { + + $cal = new Component\VCalendar(); + $param = new Parameter($cal, 'name',array("val1", "val2;", "val3^", "val4\n", "val5\"")); + $this->assertEquals('NAME=val1,"val2;","val3^^","val4^n","val5^\'"',$param->serialize()); + + } + + function testIterate() { + + $cal = new Component\VCalendar(); + + $param = new Parameter($cal, 'name', array(1,2,3,4)); + $result = array(); + + foreach($param as $value) { + $result[] = $value; + } + + $this->assertEquals(array(1,2,3,4), $result); + + } + + function testSerializeColon() { + + $cal = new Component\VCalendar(); + $param = new Parameter($cal, 'name','va:lue'); + $this->assertEquals('NAME="va:lue"',$param->serialize()); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Parser/JsonTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Parser/JsonTest.php new file mode 100644 index 0000000000..bba6434839 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Parser/JsonTest.php @@ -0,0 +1,395 @@ + "item1", + ), + "text", + "+1 555 123456", + ), + array( + "x-ab-label", + (object)array( + "group" => "item1", + ), + "unknown", + "Walkie Talkie", + ), + array( + "adr", + new \StdClass(), + "text", + array( + "", + "", + array("My Street", "Left Side", "Second Shack"), + "Hometown", + "PA", + "18252", + "U.S.A", + ), + ), + array( + "bday", + (object)array( + 'x-param' => array(1,2), + ), + "date", + "1979-12-25", + ), + array( + "bday", + new \StdClass(), + "date-time", + "1979-12-25T02:00:00", + ), + array( + "x-truncated", + new \StdClass(), + "date", + "--12-25", + ), + array( + "x-time-local", + new \StdClass(), + "time", + "12:30:00" + ), + array( + "x-time-utc", + new \StdClass(), + "time", + "12:30:00Z" + ), + array( + "x-time-offset", + new \StdClass(), + "time", + "12:30:00-08:00" + ), + array( + "x-time-reduced", + new \StdClass(), + "time", + "23" + ), + array( + "x-time-truncated", + new \StdClass(), + "time", + "--30" + ), + array( + "x-karma-points", + new \StdClass(), + "integer", + 42 + ), + array( + "x-grade", + new \StdClass(), + "float", + 1.3 + ), + array( + "tz", + new \StdClass(), + "utc-offset", + "-05:00", + ), + ), + ); + + $parser = new Json(json_encode($input)); + $vobj = $parser->parse(); + + $version = VObject\Version::VERSION; + + + $result = $vobj->serialize(); + $expected = <<assertEquals($expected, str_replace("\r", "", $result)); + + $this->assertEquals( + $input, + $vobj->jsonSerialize() + ); + + } + + function testRoundTripJCal() { + + $input = array( + "vcalendar", + array( + array( + "version", + new \StdClass(), + "text", + "2.0" + ), + array( + "prodid", + new \StdClass(), + "text", + "-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN", + ), + array( + "calscale", + new \StdClass(), + "text", + "GREGORIAN" + ), + ), + array( + array("vevent", + array( + array( + "uid", new \StdClass(), "text", "foo", + ), + array( + "dtstart", new \StdClass(), "date", "2013-05-26", + ), + array( + "duration", new \StdClass(), "duration", "P1D", + ), + array( + "categories", new \StdClass(), "text", "home", "testing", + ), + array( + "created", new \StdClass(), "date-time", "2013-05-26T18:10:00Z", + ), + array( + "attach", new \StdClass(), "binary", base64_encode('attachment') + ), + array( + "attendee", new \StdClass(), "cal-address", "mailto:armin@example.org", + ), + array( + "geo", new \StdClass(), "float", array(51.96668, 7.61876), + ), + array( + "sequence", new \StdClass(), "integer", 5 + ), + array( + "freebusy", new \StdClass(), "period", array("2013-05-26T21:02:13", "PT1H"), array("2013-06-26T12:00:00", "2013-06-26T13:00:00"), + ), + array( + "url", new \StdClass(), "uri", "http://example.org/", + ), + array( + "tzoffsetfrom", new \StdClass(), "utc-offset", "+05:00", + ), + array( + "rrule", new \StdClass(), "recur", array( + 'freq' => 'WEEKLY', + 'byday' => array('MO', 'TU'), + ), + ), + array( + "x-bool", new \StdClass(), "boolean", true + ), + array( + "x-time", new \StdClass(), "time", "08:00:00", + ), + array( + "attendee", + (object)array( + "cn" => "Dominik", + "partstat" => "DECLINED", + ), + "cal-address", + "mailto:dominik@example.org" + ), + array( + "request-status", + new \StdClass(), + "text", + array("2.0", "Success"), + ), + array( + "request-status", + new \StdClass(), + "text", + array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org"), + ), + ), + array( + array("valarm", + array( + array( + "action", new \StdClass(), "text", "DISPLAY", + ), + ), + array(), + ), + ), + ) + ), + ); + + $parser = new Json(json_encode($input)); + $vobj = $parser->parse(); + $result = $vobj->serialize(); + + $version = VObject\Version::VERSION; + + $expected = <<assertEquals($expected, str_replace("\r", "", $result)); + + $this->assertEquals( + $input, + $vobj->jsonSerialize() + ); + + } + + function testParseStreamArg() { + + $input = array( + "vcard", + array( + array( + "FN", new \StdClass(), 'text', "foo", + ), + ), + ); + + $stream = fopen('php://memory','r+'); + fwrite($stream, json_encode($input)); + rewind($stream); + + $result = VObject\Reader::readJson($stream,0); + $this->assertEquals('foo', $result->FN->getValue()); + + } + + /** + * @expectedException \Sabre\VObject\ParseException + */ + function testParseInvalidData() { + + $json = new Json(); + $input = array( + "vlist", + array( + array( + "FN", new \StdClass(), 'text', "foo", + ), + ), + ); + + $json->parse(json_encode($input), 0); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Parser/QuotedPrintableTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Parser/QuotedPrintableTest.php new file mode 100644 index 0000000000..a66af698d1 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Parser/QuotedPrintableTest.php @@ -0,0 +1,108 @@ +assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCARD', $result->name); + $this->assertEquals(1, count($result->children())); + $this->assertEquals("Aachen", $this->getPropertyValue($result->label)); + + } + + function testReadQuotedPrintableNewlineSoft() { + + $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aa=\r\n ch=\r\n en\r\nEND:VCARD"; + $result = Reader::read($data); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCARD', $result->name); + $this->assertEquals(1, count($result->children())); + $this->assertEquals("Aachen", $this->getPropertyValue($result->label)); + + } + + function testReadQuotedPrintableNewlineHard() { + + $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aachen=0D=0A=\r\n Germany\r\nEND:VCARD"; + $result = Reader::read($data); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCARD', $result->name); + $this->assertEquals(1, count($result->children())); + $this->assertEquals("Aachen\r\nGermany", $this->getPropertyValue($result->label)); + + + } + + function testReadQuotedPrintableCompatibilityMS() { + + $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aachen=0D=0A=\r\nDeutschland:okay\r\nEND:VCARD"; + $result = Reader::read($data, Reader::OPTION_FORGIVING); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCARD', $result->name); + $this->assertEquals(1, count($result->children())); + $this->assertEquals("Aachen\r\nDeutschland:okay", $this->getPropertyValue($result->label)); + + } + + function testReadQuotesPrintableCompoundValues() { + + $data = <<assertEquals(array( + '','','Münster Str. 1','Münster','','48143','Deutschland' + ), $result->ADR->getParts()); + + + } + + private function getPropertyValue(\Sabre\VObject\Property $property) { + + return (string)$property; + + /* + $param = $property['encoding']; + if ($param !== null) { + $encoding = strtoupper((string)$param); + if ($encoding === 'QUOTED-PRINTABLE') { + $value = quoted_printable_decode($value); + } else { + throw new Exception(); + } + } + + $param = $property['charset']; + if ($param !== null) { + $charset = strtoupper((string)$param); + if ($charset !== 'UTF-8') { + $value = mb_convert_encoding($value, 'UTF-8', $charset); + } + } else { + $value = StringUtil::convertToUTF8($value); + } + + return $value; + */ + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/BinaryTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/BinaryTest.php new file mode 100644 index 0000000000..0a8c79c5fd --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/BinaryTest.php @@ -0,0 +1,19 @@ +add('PHOTO', array('a','b')); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/BooleanTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/BooleanTest.php new file mode 100644 index 0000000000..0c885d37bb --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/BooleanTest.php @@ -0,0 +1,22 @@ +assertTrue($vcard->{'X-AWESOME'}->getValue()); + $this->assertFalse($vcard->{'X-SUCKS'}->getValue()); + + $this->assertEquals('BOOLEAN', $vcard->{'X-AWESOME'}->getValueType()); + $this->assertEquals($input, $vcard->serialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php new file mode 100644 index 0000000000..448a4786ca --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php @@ -0,0 +1,50 @@ +createProperty('ORG'); + $elem->setParts($arr); + + $this->assertEquals('ABC\, Inc.;North American Division;Marketing\;Sales', $elem->getValue()); + $this->assertEquals(3, count($elem->getParts())); + $parts = $elem->getParts(); + $this->assertEquals('Marketing;Sales', $parts[2]); + + } + + function testGetParts() { + + $str = 'ABC\, Inc.;North American Division;Marketing\;Sales'; + + $vcard = new VCard(); + $elem = $vcard->createProperty('ORG'); + $elem->setRawMimeDirValue($str); + + $this->assertEquals(3, count($elem->getParts())); + $parts = $elem->getParts(); + $this->assertEquals('Marketing;Sales', $parts[2]); + } + + function testGetPartsNull() { + + $vcard = new VCard(); + $elem = $vcard->createProperty('ORG', null); + + $this->assertEquals(0, count($elem->getParts())); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/FloatTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/FloatTest.php new file mode 100644 index 0000000000..9321c88db1 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/FloatTest.php @@ -0,0 +1,30 @@ +parse($input); + + $this->assertInstanceOf('Sabre\VObject\Property\Float', $result->{'X-FLOAT'}); + + $this->assertEquals(array( + 0.234, + 1.245, + ), $result->{'X-FLOAT'}->getParts()); + + $this->assertEquals( + $input, + $result->serialize() + ); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/DateTimeTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/DateTimeTest.php new file mode 100644 index 0000000000..3cf2143ce3 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/DateTimeTest.php @@ -0,0 +1,334 @@ +vcal = new VCalendar(); + + } + + function testSetDateTime() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setDateTime($dt); + + $this->assertEquals('19850704T013000', (string)$elem); + $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']); + $this->assertNull($elem['VALUE']); + + $this->assertTrue($elem->hasTime()); + + } + + function testSetDateTimeLOCAL() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setDateTime($dt, $isFloating = true); + + $this->assertEquals('19850704T013000', (string)$elem); + $this->assertNull($elem['TZID']); + + $this->assertTrue($elem->hasTime()); + } + + function testSetDateTimeUTC() { + + $tz = new \DateTimeZone('GMT'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setDateTime($dt); + + $this->assertEquals('19850704T013000Z', (string)$elem); + $this->assertNull($elem['TZID']); + + $this->assertTrue($elem->hasTime()); + } + + function testSetDateTimeLOCALTZ() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setDateTime($dt); + + $this->assertEquals('19850704T013000', (string)$elem); + $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']); + + $this->assertTrue($elem->hasTime()); + } + + function testSetDateTimeDATE() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem['VALUE'] = 'DATE'; + $elem->setDateTime($dt); + + $this->assertEquals('19850704', (string)$elem); + $this->assertNull($elem['TZID']); + $this->assertEquals('DATE', (string)$elem['VALUE']); + + $this->assertFalse($elem->hasTime()); + } + + function testSetValue() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setValue($dt); + + $this->assertEquals('19850704T013000', (string)$elem); + $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']); + $this->assertNull($elem['VALUE']); + + $this->assertTrue($elem->hasTime()); + + } + + function testSetValueArray() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt1 = new \DateTime('1985-07-04 01:30:00', $tz); + $dt2 = new \DateTime('1985-07-04 02:30:00', $tz); + $dt1->setTimeZone($tz); + $dt2->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setValue(array($dt1,$dt2)); + + $this->assertEquals('19850704T013000,19850704T023000', (string)$elem); + $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']); + $this->assertNull($elem['VALUE']); + + $this->assertTrue($elem->hasTime()); + + } + + function testSetParts() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt1 = new \DateTime('1985-07-04 01:30:00', $tz); + $dt2 = new \DateTime('1985-07-04 02:30:00', $tz); + $dt1->setTimeZone($tz); + $dt2->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setParts(array($dt1,$dt2)); + + $this->assertEquals('19850704T013000,19850704T023000', (string)$elem); + $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']); + $this->assertNull($elem['VALUE']); + + $this->assertTrue($elem->hasTime()); + + } + function testSetPartsStrings() { + + $dt1 = '19850704T013000Z'; + $dt2 = '19850704T023000Z'; + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setParts(array($dt1,$dt2)); + + $this->assertEquals('19850704T013000Z,19850704T023000Z', (string)$elem); + $this->assertNull($elem['VALUE']); + + $this->assertTrue($elem->hasTime()); + + } + + + function testGetDateTimeCached() { + + $tz = new \DateTimeZone('Europe/Amsterdam'); + $dt = new \DateTime('1985-07-04 01:30:00', $tz); + $dt->setTimeZone($tz); + + $elem = $this->vcal->createProperty('DTSTART'); + $elem->setDateTime($dt); + + $this->assertEquals($elem->getDateTime(), $dt); + + } + + function testGetDateTimeDateNULL() { + + $elem = $this->vcal->createProperty('DTSTART'); + $dt = $elem->getDateTime(); + + $this->assertNull($dt); + + } + + function testGetDateTimeDateDATE() { + + $elem = $this->vcal->createProperty('DTSTART','19850704'); + $dt = $elem->getDateTime(); + + $this->assertInstanceOf('DateTime', $dt); + $this->assertEquals('1985-07-04 00:00:00', $dt->format('Y-m-d H:i:s')); + + } + + + function testGetDateTimeDateLOCAL() { + + $elem = $this->vcal->createProperty('DTSTART','19850704T013000'); + $dt = $elem->getDateTime(); + + $this->assertInstanceOf('DateTime', $dt); + $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s')); + + } + + function testGetDateTimeDateUTC() { + + $elem = $this->vcal->createProperty('DTSTART','19850704T013000Z'); + $dt = $elem->getDateTime(); + + $this->assertInstanceOf('DateTime', $dt); + $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s')); + $this->assertEquals('UTC', $dt->getTimeZone()->getName()); + + } + + function testGetDateTimeDateLOCALTZ() { + + $elem = $this->vcal->createProperty('DTSTART','19850704T013000'); + $elem['TZID'] = 'Europe/Amsterdam'; + + $dt = $elem->getDateTime(); + + $this->assertInstanceOf('DateTime', $dt); + $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s')); + $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName()); + + } + + /** + * @expectedException LogicException + */ + function testGetDateTimeDateInvalid() { + + $elem = $this->vcal->createProperty('DTSTART','bla'); + $dt = $elem->getDateTime(); + + } + + function testGetDateTimeWeirdTZ() { + + $elem = $this->vcal->createProperty('DTSTART','19850704T013000'); + $elem['TZID'] = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam'; + + + $event = $this->vcal->createComponent('VEVENT'); + $event->add($elem); + + $timezone = $this->vcal->createComponent('VTIMEZONE'); + $timezone->TZID = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam'; + $timezone->{'X-LIC-LOCATION'} = 'Europe/Amsterdam'; + + $this->vcal->add($event); + $this->vcal->add($timezone); + + $dt = $elem->getDateTime(); + + $this->assertInstanceOf('DateTime', $dt); + $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s')); + $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName()); + + } + + function testGetDateTimeBadTimeZone() { + + $default = date_default_timezone_get(); + date_default_timezone_set('Canada/Eastern'); + + $elem = $this->vcal->createProperty('DTSTART','19850704T013000'); + $elem['TZID'] = 'Moon'; + + + $event = $this->vcal->createComponent('VEVENT'); + $event->add($elem); + + $timezone = $this->vcal->createComponent('VTIMEZONE'); + $timezone->TZID = 'Moon'; + $timezone->{'X-LIC-LOCATION'} = 'Moon'; + + + $this->vcal->add($event); + $this->vcal->add($timezone); + + $dt = $elem->getDateTime(); + + $this->assertInstanceOf('DateTime', $dt); + $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s')); + $this->assertEquals('Canada/Eastern', $dt->getTimeZone()->getName()); + date_default_timezone_set($default); + + } + + function testUpdateValueParameter() { + + $dtStart = $this->vcal->createProperty('DTSTART', new \DateTime('2013-06-07 15:05:00')); + $dtStart['VALUE'] = 'DATE'; + + $this->assertEquals("DTSTART;VALUE=DATE:20130607\r\n", $dtStart->serialize()); + + } + + function testValidate() { + + $exDate = $this->vcal->createProperty('EXDATE', '-00011130T143000Z'); + $messages = $exDate->validate(); + $this->assertEquals(1, count($messages)); + $this->assertEquals(3, $messages[0]['level']); + + } + + /** + * This issue was discovered on the sabredav mailing list. + */ + function testCreateDatePropertyThroughAdd() { + + $vcal = new VCalendar(); + $vevent = $vcal->add('VEVENT'); + + $dtstart = $vevent->add( + 'DTSTART', + new \DateTime('2014-03-07'), + array('VALUE' => 'DATE') + ); + + $this->assertEquals("DTSTART;VALUE=DATE:20140307\r\n", $dtstart->serialize()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/DurationTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/DurationTest.php new file mode 100644 index 0000000000..c5c96e4a76 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/DurationTest.php @@ -0,0 +1,20 @@ +add('VEVENT', array('DURATION' => array('PT1H'))); + + $this->assertEquals( + new \DateInterval('PT1H'), + $event->{'DURATION'}->getDateInterval() + ); + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/RecurTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/RecurTest.php new file mode 100644 index 0000000000..3eb04e4ef8 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/ICalendar/RecurTest.php @@ -0,0 +1,46 @@ +add('RRULE', 'FREQ=Daily'); + + $this->assertInstanceOf('Sabre\VObject\Property\ICalendar\Recur', $recur); + + $this->assertEquals(array('FREQ'=>'DAILY'), $recur->getParts()); + $recur->setParts(array('freq'=>'MONTHLY')); + + $this->assertEquals(array('FREQ'=>'MONTHLY'), $recur->getParts()); + + } + + /** + * @expectedException \InvalidArgumentException + */ + function testSetValueBadVal() { + + $vcal = new VCalendar(); + $recur = $vcal->add('RRULE', 'FREQ=Daily'); + $recur->setValue(new \Exception()); + + } + + function testSetSubParts() { + + $vcal = new VCalendar(); + $recur = $vcal->add('RRULE', array('FREQ'=>'DAILY', 'BYDAY'=>'mo,tu', 'BYMONTH' => array(0,1))); + + $this->assertEquals(array( + 'FREQ'=>'DAILY', + 'BYDAY' => array('MO','TU'), + 'BYMONTH' => array(0,1), + ), $recur->getParts()); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/TextTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/TextTest.php new file mode 100644 index 0000000000..8f698f7d85 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/TextTest.php @@ -0,0 +1,96 @@ +'2.1', + 'PROP' => $propValue + ), false); + + // Adding quoted-printable, because we're testing if it gets removed + // automatically. + $doc->PROP['ENCODING'] = 'QUOTED-PRINTABLE'; + $doc->PROP['P1'] = 'V1'; + + + $output = $doc->serialize(); + + + $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.1\r\n$expected\r\nEND:VCARD\r\n", $output); + + } + + function testSerializeVCard21() { + + $this->assertVCard21Serialization( + 'f;oo', + 'PROP;P1=V1:f;oo' + ); + + } + + function testSerializeVCard21Array() { + + $this->assertVCard21Serialization( + array('f;oo','bar'), + 'PROP;P1=V1:f\;oo;bar' + ); + + } + function testSerializeVCard21Fold() { + + $this->assertVCard21Serialization( + str_repeat('x',80), + 'PROP;P1=V1:' . str_repeat('x',64) . "\r\n " . str_repeat('x',16) + ); + + } + + + + function testSerializeQuotedPrintable() { + + $this->assertVCard21Serialization( + "foo\r\nbar", + 'PROP;P1=V1;ENCODING=QUOTED-PRINTABLE:foo=0D=0Abar' + ); + } + + function testSerializeQuotedPrintableFold() { + + $this->assertVCard21Serialization( + "foo\r\nbarxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "PROP;P1=V1;ENCODING=QUOTED-PRINTABLE:foo=0D=0Abarxxxxxxxxxxxxxxxxxxxxxxxxxx=\r\n xxx" + ); + + } + + function testValidateMinimumPropValue() { + + $vcard = <<assertEquals(1, count($vcard->validate())); + + $this->assertEquals(1, count($vcard->N->getParts())); + + $vcard->validate(\Sabre\VObject\Node::REPAIR); + + $this->assertEquals(5, count($vcard->N->getParts())); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/VCard/DateAndOrTimeTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/VCard/DateAndOrTimeTest.php new file mode 100644 index 0000000000..6a901740dc --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/VCard/DateAndOrTimeTest.php @@ -0,0 +1,233 @@ +createProperty('BDAY', $input); + + $this->assertEquals(array($output), $prop->getJsonValue()); + + } + + function dates() { + + return array( + array( + "19961022T140000", + "1996-10-22T14:00:00", + ), + array( + "--1022T1400", + "--10-22T14:00", + ), + array( + "---22T14", + "---22T14", + ), + array( + "19850412", + "1985-04-12", + ), + array( + "1985-04", + "1985-04", + ), + array( + "1985", + "1985", + ), + array( + "--0412", + "--04-12", + ), + array( + "T102200", + "T10:22:00", + ), + array( + "T1022", + "T10:22", + ), + array( + "T10", + "T10", + ), + array( + "T-2200", + "T-22:00", + ), + array( + "T102200Z", + "T10:22:00Z", + ), + array( + "T102200-0800", + "T10:22:00-0800", + ), + array( + "T--00", + "T--00", + ), + ); + + } + + public function testSetParts() { + + $vcard = new VObject\Component\VCard(); + + $prop = $vcard->createProperty('BDAY'); + $prop->setParts(array( + new \DateTime('2014-04-02 18:37:00') + )); + + $this->assertEquals('20140402T183700Z', $prop->getValue()); + + } + + /** + * @expectedException InvalidArgumentException + */ + public function testSetPartsTooMany() { + + $vcard = new VObject\Component\VCard(); + + $prop = $vcard->createProperty('BDAY'); + $prop->setParts(array( + 1, + 2 + )); + + } + + public function testSetPartsString() { + + $vcard = new VObject\Component\VCard(); + + $prop = $vcard->createProperty('BDAY'); + $prop->setParts(array( + "20140402T183700Z" + )); + + $this->assertEquals('20140402T183700Z', $prop->getValue()); + + } + + public function testSetValueDateTime() { + + $vcard = new VObject\Component\VCard(); + + $prop = $vcard->createProperty('BDAY'); + $prop->setValue( + new \DateTime('2014-04-02 18:37:00') + ); + + $this->assertEquals('20140402T183700Z', $prop->getValue()); + + } + + public function testSetDateTimeOffset() { + + $vcard = new VObject\Component\VCard(); + + $prop = $vcard->createProperty('BDAY'); + $prop->setValue( + new \DateTime('2014-04-02 18:37:00', new \DateTimeZone('America/Toronto')) + ); + + $this->assertEquals('20140402T183700-0400', $prop->getValue()); + + } + + public function testGetDateTime() { + + $datetime = new \DateTime('2014-04-02 18:37:00', new \DateTimeZone('America/Toronto')); + + $vcard = new VObject\Component\VCard(); + $prop = $vcard->createProperty('BDAY', $datetime); + + $dt = $prop->getDateTime(); + $this->assertEquals($datetime, $dt); + + } + + public function testGetDateIncomplete() { + + $datetime = '--0407'; + + $vcard = new VObject\Component\VCard(); + $prop = $vcard->add('BDAY', $datetime); + + $dt = $prop->getDateTime(); + // Note: if the year changes between the last line and the next line of + // code, this test may fail. + // + // If that happens, head outside and have a drink. + $current = new \DateTime('now'); + $year = $current->format('Y'); + + $this->assertEquals($year . '0407', $dt->format('Ymd')); + + } + + public function testGetDateIncompleteFromVCard() { + + $vcard = <<BDAY; + + $dt = $prop->getDateTime(); + // Note: if the year changes between the last line and the next line of + // code, this test may fail. + // + // If that happens, head outside and have a drink. + $current = new \DateTime('now'); + $year = $current->format('Y'); + + $this->assertEquals($year . '0407', $dt->format('Ymd')); + + } + + public function testValidate() { + + $datetime = '--0407'; + + $vcard = new VObject\Component\VCard(); + $prop = $vcard->add('BDAY', $datetime); + + $this->assertEquals(array(), $prop->validate()); + + } + + public function testValidateBroken() { + + $datetime = '123'; + + $vcard = new VObject\Component\VCard(); + $prop = $vcard->add('BDAY', $datetime); + + $this->assertEquals(array(array( + 'level' => 3, + 'message' => 'The supplied value (123) is not a correct DATE-AND-OR-TIME property', + 'node' => $prop, + )), $prop->validate()); + + } +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/VCard/LanguageTagTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/VCard/LanguageTagTest.php new file mode 100644 index 0000000000..91178105d0 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/VCard/LanguageTagTest.php @@ -0,0 +1,27 @@ +parse($input); + + $this->assertInstanceOf('Sabre\VObject\Property\VCard\LanguageTag', $result->LANG); + + $this->assertEquals('nl', $result->LANG->getValue()); + + $this->assertEquals( + $input, + $result->serialize() + ); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php new file mode 100644 index 0000000000..d220567180 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php @@ -0,0 +1,337 @@ +createProperty('propname','propvalue'); + $this->assertEquals('PROPNAME', $property->name); + $this->assertEquals('propvalue', $property->__toString()); + $this->assertEquals('propvalue', (string)$property); + $this->assertEquals('propvalue', $property->getValue()); + + } + + public function testCreate() { + + $cal = new VCalendar(); + + $params = array( + 'param1' => 'value1', + 'param2' => 'value2', + ); + + $property = $cal->createProperty('propname','propvalue', $params); + + $this->assertEquals('value1', $property['param1']->getValue()); + $this->assertEquals('value2', $property['param2']->getValue()); + + } + + public function testSetValue() { + + $cal = new VCalendar(); + + $property = $cal->createProperty('propname','propvalue'); + $property->setValue('value2'); + + $this->assertEquals('PROPNAME', $property->name); + $this->assertEquals('value2', $property->__toString()); + + } + + public function testParameterExists() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $property['paramname'] = 'paramvalue'; + + $this->assertTrue(isset($property['PARAMNAME'])); + $this->assertTrue(isset($property['paramname'])); + $this->assertFalse(isset($property['foo'])); + + } + + public function testParameterGet() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $property['paramname'] = 'paramvalue'; + + $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']); + + } + + public function testParameterNotExists() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $property['paramname'] = 'paramvalue'; + + $this->assertInternalType('null',$property['foo']); + + } + + public function testParameterMultiple() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $property['paramname'] = 'paramvalue'; + $property->add('paramname', 'paramvalue'); + + $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']); + $this->assertEquals(2,count($property['paramname']->getParts())); + + } + + public function testSetParameterAsString() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $property['paramname'] = 'paramvalue'; + + $this->assertEquals(1,count($property->parameters())); + $this->assertInstanceOf('Sabre\\VObject\\Parameter', $property->parameters['PARAMNAME']); + $this->assertEquals('PARAMNAME',$property->parameters['PARAMNAME']->name); + $this->assertEquals('paramvalue',$property->parameters['PARAMNAME']->getValue()); + + } + + public function testUnsetParameter() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $property['paramname'] = 'paramvalue'; + + unset($property['PARAMNAME']); + $this->assertEquals(0,count($property->parameters())); + + } + + public function testSerialize() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + + $this->assertEquals("PROPNAME:propvalue\r\n",$property->serialize()); + + } + + public function testSerializeParam() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue', array( + 'paramname' => 'paramvalue', + 'paramname2' => 'paramvalue2', + )); + + $this->assertEquals("PROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propvalue\r\n",$property->serialize()); + + } + + public function testSerializeNewLine() { + + $cal = new VCalendar(); + $property = $cal->createProperty('SUMMARY',"line1\nline2"); + + $this->assertEquals("SUMMARY:line1\\nline2\r\n",$property->serialize()); + + } + + public function testSerializeLongLine() { + + $cal = new VCalendar(); + $value = str_repeat('!',200); + $property = $cal->createProperty('propname',$value); + + $expected = "PROPNAME:" . str_repeat('!',66) . "\r\n " . str_repeat('!',74) . "\r\n " . str_repeat('!',60) . "\r\n"; + + $this->assertEquals($expected,$property->serialize()); + + } + + public function testSerializeUTF8LineFold() { + + $cal = new VCalendar(); + $value = str_repeat('!',65) . "\xc3\xa4bla"; // inserted umlaut-a + $property = $cal->createProperty('propname', $value); + $expected = "PROPNAME:" . str_repeat('!',65) . "\r\n \xc3\xa4bla\r\n"; + $this->assertEquals($expected, $property->serialize()); + + } + + public function testGetIterator() { + + $cal = new VCalendar(); + $it = new ElementList(array()); + $property = $cal->createProperty('propname','propvalue'); + $property->setIterator($it); + $this->assertEquals($it,$property->getIterator()); + + } + + + public function testGetIteratorDefault() { + + $cal = new VCalendar(); + $property = $cal->createProperty('propname','propvalue'); + $it = $property->getIterator(); + $this->assertTrue($it instanceof ElementList); + $this->assertEquals(1,count($it)); + + } + + function testAddScalar() { + + $cal = new VCalendar(); + $property = $cal->createProperty('EMAIL'); + + $property->add('myparam','value'); + + $this->assertEquals(1, count($property->parameters())); + + $this->assertTrue($property->parameters['MYPARAM'] instanceof Parameter); + $this->assertEquals('MYPARAM',$property->parameters['MYPARAM']->name); + $this->assertEquals('value',$property->parameters['MYPARAM']->getValue()); + + } + + function testAddParameter() { + + $cal = new VCalendar(); + $prop = $cal->createProperty('EMAIL'); + + $prop->add('MYPARAM','value'); + + $this->assertEquals(1, count($prop->parameters())); + $this->assertEquals('MYPARAM',$prop['myparam']->name); + + } + + function testAddParameterTwice() { + + $cal = new VCalendar(); + $prop = $cal->createProperty('EMAIL'); + + $prop->add('MYPARAM', 'value1'); + $prop->add('MYPARAM', 'value2'); + + $this->assertEquals(1, count($prop->parameters)); + $this->assertEquals(2, count($prop->parameters['MYPARAM']->getParts())); + + $this->assertEquals('MYPARAM',$prop['MYPARAM']->name); + + } + + + function testClone() { + + $cal = new VCalendar(); + $property = $cal->createProperty('EMAIL','value'); + $property['FOO'] = 'BAR'; + + $property2 = clone $property; + + $property['FOO'] = 'BAZ'; + $this->assertEquals('BAR', (string)$property2['FOO']); + + } + + function testCreateParams() { + + $cal = new VCalendar(); + $property = $cal->createProperty('X-PROP','value', array( + 'param1' => 'value1', + 'param2' => array('value2', 'value3') + )); + + $this->assertEquals(1, count($property['PARAM1']->getParts())); + $this->assertEquals(2, count($property['PARAM2']->getParts())); + + } + + function testValidateNonUTF8() { + + $calendar = new VCalendar(); + $property = $calendar->createProperty('X-PROP', "Bla\x00"); + $result = $property->validate(Property::REPAIR); + + $this->assertEquals('Property is not valid UTF-8!', $result[0]['message']); + $this->assertEquals('Bla', $property->getValue()); + + } + + + function testValidateBadPropertyName() { + + $calendar = new VCalendar(); + $property = $calendar->createProperty("X_*&PROP*", "Bla"); + $result = $property->validate(Property::REPAIR); + + $this->assertEquals($result[0]['message'], 'The propertyname: X_*&PROP* contains invalid characters. Only A-Z, 0-9 and - are allowed'); + $this->assertEquals('X-PROP', $property->name); + + } + + function testGetValue() { + + $calendar = new VCalendar(); + $property = $calendar->createProperty("SUMMARY", null); + $this->assertEquals(array(), $property->getParts()); + $this->assertNull($property->getValue()); + + $property->setValue(array()); + $this->assertEquals(array(), $property->getParts()); + $this->assertNull($property->getValue()); + + $property->setValue(array(1)); + $this->assertEquals(array(1), $property->getParts()); + $this->assertEquals(1, $property->getValue()); + + $property->setValue(array(1,2)); + $this->assertEquals(array(1,2), $property->getParts()); + $this->assertEquals('1,2', $property->getValue()); + + $property->setValue('str'); + $this->assertEquals(array('str'), $property->getParts()); + $this->assertEquals('str', $property->getValue()); + } + + /** + * ElementList should reject this. + * + * @expectedException \LogicException + */ + public function testArrayAccessSetInt() { + + $calendar = new VCalendar(); + $property = $calendar->createProperty("X-PROP", null); + + $calendar->add($property); + $calendar->{'X-PROP'}[0] = 'Something!'; + + } + + /** + * ElementList should reject this. + * + * @expectedException \LogicException + */ + public function testArrayAccessUnsetInt() { + + $calendar = new VCalendar(); + $property = $calendar->createProperty("X-PROP", null); + + $calendar->add($property); + unset($calendar->{'X-PROP'}[0]); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php new file mode 100644 index 0000000000..735b9127f8 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php @@ -0,0 +1,439 @@ +assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCALENDAR', $result->name); + $this->assertEquals(0, count($result->children)); + + } + function testReadStream() { + + $data = "BEGIN:VCALENDAR\r\nEND:VCALENDAR"; + + $stream = fopen('php://memory', 'r+'); + fwrite($stream, $data); + rewind($stream); + + $result = Reader::read($stream); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCALENDAR', $result->name); + $this->assertEquals(0, count($result->children)); + + } + + function testReadComponentUnixNewLine() { + + $data = "BEGIN:VCALENDAR\nEND:VCALENDAR"; + + $result = Reader::read($data); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCALENDAR', $result->name); + $this->assertEquals(0, count($result->children)); + + } + + function testReadComponentLineFold() { + + $data = "BEGIN:\r\n\tVCALENDAR\r\nE\r\n ND:VCALENDAR"; + + $result = Reader::read($data); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCALENDAR', $result->name); + $this->assertEquals(0, count($result->children)); + + } + + /** + * @expectedException Sabre\VObject\ParseException + */ + function testReadCorruptComponent() { + + $data = "BEGIN:VCALENDAR\r\nEND:FOO"; + + $result = Reader::read($data); + + } + + /** + * @expectedException Sabre\VObject\ParseException + */ + function testReadCorruptSubComponent() { + + $data = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:FOO\r\nEND:VCALENDAR"; + + $result = Reader::read($data); + + } + + function testReadProperty() { + + $data = "BEGIN:VCALENDAR\r\nSUMMARY:propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->SUMMARY; + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('SUMMARY', $result->name); + $this->assertEquals('propValue', $result->getValue()); + + } + + function testReadPropertyWithNewLine() { + + $data = "BEGIN:VCALENDAR\r\nSUMMARY:Line1\\nLine2\\NLine3\\\\Not the 4th line!\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->SUMMARY; + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('SUMMARY', $result->name); + $this->assertEquals("Line1\nLine2\nLine3\\Not the 4th line!", $result->getValue()); + + } + + function testReadMappedProperty() { + + $data = "BEGIN:VCALENDAR\r\nDTSTART:20110529\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->DTSTART; + $this->assertInstanceOf('Sabre\\VObject\\Property\\ICalendar\\DateTime', $result); + $this->assertEquals('DTSTART', $result->name); + $this->assertEquals('20110529', $result->getValue()); + + } + + function testReadMappedPropertyGrouped() { + + $data = "BEGIN:VCALENDAR\r\nfoo.DTSTART:20110529\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->DTSTART; + $this->assertInstanceOf('Sabre\\VObject\\Property\\ICalendar\\DateTime', $result); + $this->assertEquals('DTSTART', $result->name); + $this->assertEquals('20110529', $result->getValue()); + + } + + + /** + * @expectedException Sabre\VObject\ParseException + */ + function testReadBrokenLine() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;propValue"; + $result = Reader::read($data); + + } + + function testReadPropertyInComponent() { + + $data = array( + "BEGIN:VCALENDAR", + "PROPNAME:propValue", + "END:VCALENDAR" + ); + + $result = Reader::read(implode("\r\n",$data)); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCALENDAR', $result->name); + $this->assertEquals(1, count($result->children())); + $this->assertInstanceOf('Sabre\\VObject\\Property', $result->children[0]); + $this->assertEquals('PROPNAME', $result->children[0]->name); + $this->assertEquals('propValue', $result->children[0]->getValue()); + + } + function testReadNestedComponent() { + + $data = array( + "BEGIN:VCALENDAR", + "BEGIN:VTIMEZONE", + "BEGIN:DAYLIGHT", + "END:DAYLIGHT", + "END:VTIMEZONE", + "END:VCALENDAR" + ); + + $result = Reader::read(implode("\r\n",$data)); + + $this->assertInstanceOf('Sabre\\VObject\\Component', $result); + $this->assertEquals('VCALENDAR', $result->name); + $this->assertEquals(1, count($result->children())); + $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]); + $this->assertEquals('VTIMEZONE', $result->children[0]->name); + $this->assertEquals(1, count($result->children[0]->children())); + $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]->children[0]); + $this->assertEquals('DAYLIGHT', $result->children[0]->children[0]->name); + + + } + + function testReadPropertyParameter() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue:propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name); + $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue()); + + } + + function testReadPropertyRepeatingParameter() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;N=1;N=2;N=3,4;N=\"5\",6;N=\"7,8\";N=9,10;N=^'11^':propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('N', $result->parameters['N']->name); + $this->assertEquals('1,2,3,4,5,6,7,8,9,10,"11"', $result->parameters['N']->getValue()); + $this->assertEquals(array(1,2,3,4,5,6,"7,8",9,10,'"11"'), $result->parameters['N']->getParts()); + + } + + function testReadPropertyRepeatingNamelessGuessedParameter() { + $data = "BEGIN:VCALENDAR\r\nPROPNAME;WORK;VOICE;PREF:propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('TYPE', $result->parameters['TYPE']->name); + $this->assertEquals('WORK,VOICE,PREF', $result->parameters['TYPE']->getValue()); + $this->assertEquals(array('WORK', 'VOICE', 'PREF'), $result->parameters['TYPE']->getParts()); + + } + + function testReadPropertyNoName() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PRODIGY:propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('TYPE', $result->parameters['TYPE']->name); + $this->assertTrue($result->parameters['TYPE']->noName); + $this->assertEquals('PRODIGY', $result->parameters['TYPE']); + + } + + function testReadPropertyParameterExtraColon() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue:propValue:anotherrandomstring\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue:anotherrandomstring', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name); + $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue()); + + } + + function testReadProperty2Parameters() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(2, count($result->parameters())); + $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name); + $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue()); + $this->assertEquals('PARAMNAME2', $result->parameters['PARAMNAME2']->name); + $this->assertEquals('paramvalue2', $result->parameters['PARAMNAME2']->getValue()); + + } + + function testReadPropertyParameterQuoted() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=\"paramvalue\":propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->PROPNAME; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name); + $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue()); + + } + function testReadPropertyParameterNewLines() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue1^nvalue2^^nvalue3:propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + + $result = $result->propname; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name); + $this->assertEquals("paramvalue1\nvalue2^nvalue3", $result->parameters['PARAMNAME']->getValue()); + + } + + function testReadPropertyParameterQuotedColon() { + + $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=\"param:value\":propValue\r\nEND:VCALENDAR"; + $result = Reader::read($data); + $result = $result->propname; + + $this->assertInstanceOf('Sabre\\VObject\\Property', $result); + $this->assertEquals('PROPNAME', $result->name); + $this->assertEquals('propValue', $result->getValue()); + $this->assertEquals(1, count($result->parameters())); + $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name); + $this->assertEquals('param:value', $result->parameters['PARAMNAME']->getValue()); + + } + + function testReadForgiving() { + + $data = array( + "BEGIN:VCALENDAR", + "X_PROP:propValue", + "END:VCALENDAR" + ); + + $caught = false; + try { + $result = Reader::read(implode("\r\n",$data)); + } catch (ParseException $e) { + $caught = true; + } + + $this->assertEquals(true, $caught); + + $result = Reader::read(implode("\r\n",$data), Reader::OPTION_FORGIVING); + + $expected = implode("\r\n", array( + "BEGIN:VCALENDAR", + "X_PROP:propValue", + "END:VCALENDAR", + "" + )); + + $this->assertEquals($expected, $result->serialize()); + + + } + + function testReadWithInvalidLine() { + + $data = array( + "BEGIN:VCALENDAR", + "DESCRIPTION:propValue", + "Yes, we've actually seen a file with non-idented property values on multiple lines", + "END:VCALENDAR" + ); + + $caught = false; + try { + $result = Reader::read(implode("\r\n",$data)); + } catch (ParseException $e) { + $caught = true; + } + + $this->assertEquals(true, $caught); + + $result = Reader::read(implode("\r\n",$data), Reader::OPTION_IGNORE_INVALID_LINES); + + $expected = implode("\r\n", array( + "BEGIN:VCALENDAR", + "DESCRIPTION:propValue", + "END:VCALENDAR", + "" + )); + + $this->assertEquals($expected, $result->serialize()); + + + } + + /** + * Reported as Issue 32. + * + * @expectedException \Sabre\VObject\ParseException + */ + public function testReadIncompleteFile() { + + $input = <<assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal); + + $vcal->expand(new DateTime('2013-09-28'), new DateTime('2014-09-11')); + + foreach ($vcal->VEVENT as $event) { + $dates[] = $event->DTSTART->getValue(); + } + + $expectedDates = array( + "20130929T160000Z", + "20131006T160000Z", + "20131013T160000Z", + "20131020T160000Z", + "20131027T160000Z", + "20140907T160000Z" + ); + + $this->assertEquals($expectedDates, $dates, 'Recursed dates are restricted by month'); + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php new file mode 100644 index 0000000000..f55814e351 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php @@ -0,0 +1,51 @@ +VEVENT->UID); + + while($it->valid()) { + $it->next(); + } + + // If we got here, it means we were successful. The bug that was in the + // system before would fail on the 5th tuesday of the month, if the 5th + // tuesday did not exist. + $this->assertTrue(true); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php new file mode 100644 index 0000000000..d6c93d0479 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php @@ -0,0 +1,62 @@ +assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal); + + $vcal->expand(new DateTime('2011-01-01'), new DateTime('2014-01-01')); + + $result = $vcal->serialize(); + + $output = <<assertEquals($output, str_replace("\r", "", $result)); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php new file mode 100644 index 0000000000..46b3c1569f --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php @@ -0,0 +1,97 @@ +vcal = new VCalendar(); + + } + + /** + * This bug came from a Fruux customer. This would result in a never-ending + * request. + */ + function testFastForwardTooFar() { + + $ev = $this->vcal->createComponent('VEVENT'); + $ev->DTSTART = '20090420T180000Z'; + $ev->RRULE = 'FREQ=WEEKLY;BYDAY=MO;UNTIL=20090704T205959Z;INTERVAL=1'; + + $this->assertFalse($ev->isInTimeRange(new DateTime('2012-01-01 12:00:00'),new DateTime('3000-01-01 00:00:00'))); + + } + + /** + * Different bug, also likely an infinite loop. + */ + function testYearlyByMonthLoop() { + + $ev = $this->vcal->createComponent('VEVENT'); + $ev->UID = 'uuid'; + $ev->DTSTART = '20120101T154500'; + $ev->DTSTART['TZID'] = 'Europe/Berlin'; + $ev->RRULE = 'FREQ=YEARLY;INTERVAL=1;UNTIL=20120203T225959Z;BYMONTH=2;BYSETPOS=1;BYDAY=SU,MO,TU,WE,TH,FR,SA'; + $ev->DTEND = '20120101T164500'; + $ev->DTEND['TZID'] = 'Europe/Berlin'; + + // This recurrence rule by itself is a yearly rule that should happen + // every february. + // + // The BYDAY part expands this to every day of the month, but the + // BYSETPOS limits this to only the 1st day of the month. Very crazy + // way to specify this, and could have certainly been a lot easier. + $this->vcal->add($ev); + + $it = new RecurrenceIterator($this->vcal,'uuid'); + $it->fastForward(new DateTime('2012-01-29 23:00:00', new DateTimeZone('UTC'))); + + $collect = array(); + + while($it->valid()) { + $collect[] = $it->getDTSTART(); + if ($it->getDTSTART() > new DateTime('2013-02-05 22:59:59', new DateTimeZone('UTC'))) { + break; + } + $it->next(); + + } + + $this->assertEquals( + array(new DateTime('2012-02-01 15:45:00', new DateTimeZone('Europe/Berlin'))), + $collect + ); + + } + + /** + * Something, somewhere produced an ics with an interval set to 0. Because + * this means we increase the current day (or week, month) by 0, this also + * results in an infinite loop. + * + * @expectedException InvalidArgumentException + * @return void + */ + function testZeroInterval() { + + $ev = $this->vcal->createComponent('VEVENT'); + $ev->UID = 'uuid'; + $ev->DTSTART = '20120824T145700Z'; + $ev->RRULE = 'FREQ=YEARLY;INTERVAL=0'; + $this->vcal->add($ev); + + $it = new RecurrenceIterator($this->vcal,'uuid'); + $it->fastForward(new DateTime('2013-01-01 23:00:00', new DateTimeZone('UTC'))); + + // if we got this far.. it means we are no longer infinitely looping + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php new file mode 100644 index 0000000000..2c17f9f6be --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php @@ -0,0 +1,30 @@ +VEVENT->UID); + + $this->assertTrue($it->valid()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php new file mode 100644 index 0000000000..1de517bf22 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php @@ -0,0 +1,63 @@ +assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal); + + $vcal->expand(new DateTime('2011-01-01'), new DateTime('2015-01-01')); + + $result = $vcal->serialize(); + + $output = <<assertEquals($output, str_replace("\r","",$result)); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php new file mode 100644 index 0000000000..7099cb108e --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php @@ -0,0 +1,1452 @@ +createComponent('VEVENT'); + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=DAILY;BYHOUR=10;BYMINUTE=5;BYSECOND=16;BYWEEKNO=32;BYYEARDAY=100,200'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07')); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertTrue($it->isInfinite()); + $this->assertEquals(array(10), $it->byHour); + $this->assertEquals(array(5), $it->byMinute); + $this->assertEquals(array(16), $it->bySecond); + $this->assertEquals(array(32), $it->byWeekNo); + $this->assertEquals(array(100,200), $it->byYearDay); + + } + + /** + * @expectedException InvalidArgumentException + * @depends testValues + */ + function testInvalidFreq() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + $ev->RRULE = 'FREQ=SMONTHLY;INTERVAL=3;UNTIL=20111025T000000Z'; + $ev->UID = 'foo'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testVCalendarNoUID() { + + $vcal = new VCalendar(); + $it = new RecurrenceIterator($vcal); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testVCalendarInvalidUID() { + + $vcal = new VCalendar(); + $it = new RecurrenceIterator($vcal,'foo'); + + } + + /** + * @depends testValues + */ + function testHourly() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=HOURLY;INTERVAL=3;UNTIL=20111025T000000Z'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07 12:00:00', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,$ev->uid); + + $this->assertEquals('hourly', $it->frequency); + $this->assertEquals(3, $it->interval); + $this->assertEquals(new DateTime('2011-10-25', new DateTimeZone('UTC')), $it->until); + + // Max is to prevent overflow + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07 12:00:00', $tz), + new DateTime('2011-10-07 15:00:00', $tz), + new DateTime('2011-10-07 18:00:00', $tz), + new DateTime('2011-10-07 21:00:00', $tz), + new DateTime('2011-10-08 00:00:00', $tz), + new DateTime('2011-10-08 03:00:00', $tz), + new DateTime('2011-10-08 06:00:00', $tz), + new DateTime('2011-10-08 09:00:00', $tz), + new DateTime('2011-10-08 12:00:00', $tz), + new DateTime('2011-10-08 15:00:00', $tz), + new DateTime('2011-10-08 18:00:00', $tz), + new DateTime('2011-10-08 21:00:00', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testDaily() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=DAILY;INTERVAL=3;UNTIL=20111025T000000Z'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,$ev->uid); + + $this->assertEquals('daily', $it->frequency); + $this->assertEquals(3, $it->interval); + $this->assertEquals(new DateTime('2011-10-25', new DateTimeZone('UTC')), $it->until); + + // Max is to prevent overflow + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07', $tz), + new DateTime('2011-10-10', $tz), + new DateTime('2011-10-13', $tz), + new DateTime('2011-10-16', $tz), + new DateTime('2011-10-19', $tz), + new DateTime('2011-10-22', $tz), + new DateTime('2011-10-25', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testNoRRULE() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,$ev->uid); + + $this->assertEquals('daily', $it->frequency); + $this->assertEquals(1, $it->interval); + + // Max is to prevent overflow + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testDailyByDayByHour() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=DAILY;BYDAY=SA,SU;BYHOUR=6,7'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-08 06:00:00', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('daily', $it->frequency); + $this->assertEquals(1, $it->interval); + $this->assertEquals(array('6','7'), $it->byHour); + $this->assertEquals(array('SA','SU'), $it->byDay); + + // Grabbing the next 12 items + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new datetime('2011-10-08 06:00:00', $tz), + new datetime('2011-10-08 07:00:00', $tz), + new datetime('2011-10-09 06:00:00', $tz), + new datetime('2011-10-09 07:00:00', $tz), + new datetime('2011-10-15 06:00:00', $tz), + new datetime('2011-10-15 07:00:00', $tz), + new datetime('2011-10-16 06:00:00', $tz), + new datetime('2011-10-16 07:00:00', $tz), + new datetime('2011-10-22 06:00:00', $tz), + new datetime('2011-10-22 07:00:00', $tz), + new datetime('2011-10-23 06:00:00', $tz), + new datetime('2011-10-23 07:00:00', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testDailyByHour() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYHOUR=10,11,12,13,14,15'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2012-10-11 12:00:00', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('daily', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(array('10','11','12','13','14','15'), $it->byHour); + + // Grabbing the next 12 items + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new datetime('2012-10-11 12:00:00', $tz), + new datetime('2012-10-11 13:00:00', $tz), + new datetime('2012-10-11 14:00:00', $tz), + new datetime('2012-10-11 15:00:00', $tz), + new datetime('2012-10-13 10:00:00', $tz), + new datetime('2012-10-13 11:00:00', $tz), + new datetime('2012-10-13 12:00:00', $tz), + new datetime('2012-10-13 13:00:00', $tz), + new datetime('2012-10-13 14:00:00', $tz), + new datetime('2012-10-13 15:00:00', $tz), + new datetime('2012-10-15 10:00:00', $tz), + new datetime('2012-10-15 11:00:00', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testDailyByDay() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYDAY=TU,WE,FR'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('daily', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(array('TU','WE','FR'), $it->byDay); + + // Grabbing the next 12 items + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07', $tz), + new DateTime('2011-10-11', $tz), + new DateTime('2011-10-19', $tz), + new DateTime('2011-10-21', $tz), + new DateTime('2011-10-25', $tz), + new DateTime('2011-11-02', $tz), + new DateTime('2011-11-04', $tz), + new DateTime('2011-11-08', $tz), + new DateTime('2011-11-16', $tz), + new DateTime('2011-11-18', $tz), + new DateTime('2011-11-22', $tz), + new DateTime('2011-11-30', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testWeekly() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;COUNT=10'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('weekly', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(10, $it->count); + + // Max is to prevent overflow + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07', $tz), + new DateTime('2011-10-21', $tz), + new DateTime('2011-11-04', $tz), + new DateTime('2011-11-18', $tz), + new DateTime('2011-12-02', $tz), + new DateTime('2011-12-16', $tz), + new DateTime('2011-12-30', $tz), + new DateTime('2012-01-13', $tz), + new DateTime('2012-01-27', $tz), + new DateTime('2012-02-10', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testWeeklyByDayByHour() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=MO;BYHOUR=8,9,10'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07 08:00:00', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('weekly', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(array('TU','WE','FR'), $it->byDay); + $this->assertEquals(array('8','9','10'), $it->byHour); + $this->assertEquals('MO', $it->weekStart); + + // Grabbing the next 12 items + $max = 15; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07 08:00:00', $tz), + new DateTime('2011-10-07 09:00:00', $tz), + new DateTime('2011-10-07 10:00:00', $tz), + new DateTime('2011-10-18 08:00:00', $tz), + new DateTime('2011-10-18 09:00:00', $tz), + new DateTime('2011-10-18 10:00:00', $tz), + new DateTime('2011-10-19 08:00:00', $tz), + new DateTime('2011-10-19 09:00:00', $tz), + new DateTime('2011-10-19 10:00:00', $tz), + new DateTime('2011-10-21 08:00:00', $tz), + new DateTime('2011-10-21 09:00:00', $tz), + new DateTime('2011-10-21 10:00:00', $tz), + new DateTime('2011-11-01 08:00:00', $tz), + new DateTime('2011-11-01 09:00:00', $tz), + new DateTime('2011-11-01 10:00:00', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testWeeklyByDaySpecificHour() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07 18:00:00', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('weekly', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(array('TU','WE','FR'), $it->byDay); + $this->assertEquals('SU', $it->weekStart); + + // Grabbing the next 12 items + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07 18:00:00', $tz), + new DateTime('2011-10-18 18:00:00', $tz), + new DateTime('2011-10-19 18:00:00', $tz), + new DateTime('2011-10-21 18:00:00', $tz), + new DateTime('2011-11-01 18:00:00', $tz), + new DateTime('2011-11-02 18:00:00', $tz), + new DateTime('2011-11-04 18:00:00', $tz), + new DateTime('2011-11-15 18:00:00', $tz), + new DateTime('2011-11-16 18:00:00', $tz), + new DateTime('2011-11-18 18:00:00', $tz), + new DateTime('2011-11-29 18:00:00', $tz), + new DateTime('2011-11-30 18:00:00', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testWeeklyByDay() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('weekly', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(array('TU','WE','FR'), $it->byDay); + $this->assertEquals('SU', $it->weekStart); + + // Grabbing the next 12 items + $max = 12; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-10-07', $tz), + new DateTime('2011-10-18', $tz), + new DateTime('2011-10-19', $tz), + new DateTime('2011-10-21', $tz), + new DateTime('2011-11-01', $tz), + new DateTime('2011-11-02', $tz), + new DateTime('2011-11-04', $tz), + new DateTime('2011-11-15', $tz), + new DateTime('2011-11-16', $tz), + new DateTime('2011-11-18', $tz), + new DateTime('2011-11-29', $tz), + new DateTime('2011-11-30', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testMonthly() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=3;COUNT=5'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-12-05', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('monthly', $it->frequency); + $this->assertEquals(3, $it->interval); + $this->assertEquals(5, $it->count); + + $max = 14; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-12-05', $tz), + new DateTime('2012-03-05', $tz), + new DateTime('2012-06-05', $tz), + new DateTime('2012-09-05', $tz), + new DateTime('2012-12-05', $tz), + ), + $result + ); + + + } + + /** + * @depends testValues + */ + function testMonthlyEndOfMonth() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=12'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-12-31', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('monthly', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(12, $it->count); + + $max = 14; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-12-31', $tz), + new DateTime('2012-08-31', $tz), + new DateTime('2012-10-31', $tz), + new DateTime('2012-12-31', $tz), + new DateTime('2013-08-31', $tz), + new DateTime('2013-10-31', $tz), + new DateTime('2013-12-31', $tz), + new DateTime('2014-08-31', $tz), + new DateTime('2014-10-31', $tz), + new DateTime('2014-12-31', $tz), + new DateTime('2015-08-31', $tz), + new DateTime('2015-10-31', $tz), + ), + $result + ); + + + } + + /** + * @depends testValues + */ + function testMonthlyByMonthDay() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=5;COUNT=9;BYMONTHDAY=1,31,-7'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('monthly', $it->frequency); + $this->assertEquals(5, $it->interval); + $this->assertEquals(9, $it->count); + $this->assertEquals(array(1, 31, -7), $it->byMonthDay); + + $max = 14; + $result = array(); + foreach($it as $item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-01-01', $tz), + new DateTime('2011-01-25', $tz), + new DateTime('2011-01-31', $tz), + new DateTime('2011-06-01', $tz), + new DateTime('2011-06-24', $tz), + new DateTime('2011-11-01', $tz), + new DateTime('2011-11-24', $tz), + new DateTime('2012-04-01', $tz), + new DateTime('2012-04-24', $tz), + ), + $result + ); + + } + + /** + * A pretty slow test. Had to be marked as 'medium' for phpunit to not die + * after 1 second. Would be good to optimize later. + * + * @depends testValues + * @medium + */ + function testMonthlyByDay() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=16;BYDAY=MO,-2TU,+1WE,3TH'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('monthly', $it->frequency); + $this->assertEquals(2, $it->interval); + $this->assertEquals(16, $it->count); + $this->assertEquals(array('MO','-2TU','+1WE','3TH'), $it->byDay); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-01-03', $tz), + new DateTime('2011-01-05', $tz), + new DateTime('2011-01-10', $tz), + new DateTime('2011-01-17', $tz), + new DateTime('2011-01-18', $tz), + new DateTime('2011-01-20', $tz), + new DateTime('2011-01-24', $tz), + new DateTime('2011-01-31', $tz), + new DateTime('2011-03-02', $tz), + new DateTime('2011-03-07', $tz), + new DateTime('2011-03-14', $tz), + new DateTime('2011-03-17', $tz), + new DateTime('2011-03-21', $tz), + new DateTime('2011-03-22', $tz), + new DateTime('2011-03-28', $tz), + new DateTime('2011-05-02', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testMonthlyByDayByMonthDay() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO;BYMONTHDAY=1'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-08-01', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('monthly', $it->frequency); + $this->assertEquals(1, $it->interval); + $this->assertEquals(10, $it->count); + $this->assertEquals(array('MO'), $it->byDay); + $this->assertEquals(array(1), $it->byMonthDay); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-08-01', $tz), + new DateTime('2012-10-01', $tz), + new DateTime('2013-04-01', $tz), + new DateTime('2013-07-01', $tz), + new DateTime('2014-09-01', $tz), + new DateTime('2014-12-01', $tz), + new DateTime('2015-06-01', $tz), + new DateTime('2016-02-01', $tz), + new DateTime('2016-08-01', $tz), + new DateTime('2017-05-01', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testMonthlyByDayBySetPos() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1,-1'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('monthly', $it->frequency); + $this->assertEquals(1, $it->interval); + $this->assertEquals(10, $it->count); + $this->assertEquals(array('MO','TU','WE','TH','FR'), $it->byDay); + $this->assertEquals(array(1,-1), $it->bySetPos); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-01-03', $tz), + new DateTime('2011-01-31', $tz), + new DateTime('2011-02-01', $tz), + new DateTime('2011-02-28', $tz), + new DateTime('2011-03-01', $tz), + new DateTime('2011-03-31', $tz), + new DateTime('2011-04-01', $tz), + new DateTime('2011-04-29', $tz), + new DateTime('2011-05-02', $tz), + new DateTime('2011-05-31', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testYearly() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=YEARLY;COUNT=10;INTERVAL=3'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('yearly', $it->frequency); + $this->assertEquals(3, $it->interval); + $this->assertEquals(10, $it->count); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-01-01', $tz), + new DateTime('2014-01-01', $tz), + new DateTime('2017-01-01', $tz), + new DateTime('2020-01-01', $tz), + new DateTime('2023-01-01', $tz), + new DateTime('2026-01-01', $tz), + new DateTime('2029-01-01', $tz), + new DateTime('2032-01-01', $tz), + new DateTime('2035-01-01', $tz), + new DateTime('2038-01-01', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testYearlyLeapYear() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=YEARLY;COUNT=3'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2012-02-29', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('yearly', $it->frequency); + $this->assertEquals(3, $it->count); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2012-02-29', $tz), + new DateTime('2016-02-29', $tz), + new DateTime('2020-02-29', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testYearlyByMonth() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=4;BYMONTH=4,10'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-04-07', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('yearly', $it->frequency); + $this->assertEquals(4, $it->interval); + $this->assertEquals(8, $it->count); + $this->assertEquals(array(4,10), $it->byMonth); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-04-07', $tz), + new DateTime('2011-10-07', $tz), + new DateTime('2015-04-07', $tz), + new DateTime('2015-10-07', $tz), + new DateTime('2019-04-07', $tz), + new DateTime('2019-10-07', $tz), + new DateTime('2023-04-07', $tz), + new DateTime('2023-10-07', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testYearlyByMonthByDay() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('yearly', $it->frequency); + $this->assertEquals(5, $it->interval); + $this->assertEquals(8, $it->count); + $this->assertEquals(array(4,10), $it->byMonth); + $this->assertEquals(array('1MO','-1SU'), $it->byDay); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $tz = new DateTimeZone('UTC'); + + $this->assertEquals( + array( + new DateTime('2011-04-04', $tz), + new DateTime('2011-04-24', $tz), + new DateTime('2011-10-03', $tz), + new DateTime('2011-10-30', $tz), + new DateTime('2016-04-04', $tz), + new DateTime('2016-04-24', $tz), + new DateTime('2016-10-03', $tz), + new DateTime('2016-10-30', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testFastForward() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU'; + $dtStart = $vcal->createProperty('DTSTART'); + $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC'))); + + $ev->add($dtStart); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + // The idea is that we're fast-forwarding too far in the future, so + // there will be no results left. + $it->fastForward(new DateTime('2020-05-05', new DateTimeZone('UTC'))); + + $max = 20; + $result = array(); + while($item = $it->current()) { + + $result[] = $item; + $max--; + + if (!$max) break; + $it->next(); + + } + + $tz = new DateTimeZone('UTC'); + $this->assertEquals(array(), $result); + + } + + /** + * @depends testValues + */ + function testComplexExclusions() { + + $vcal = new VCalendar(); + $ev = $vcal->createComponent('VEVENT'); + + $ev->UID = 'bla'; + $ev->RRULE = 'FREQ=YEARLY;COUNT=10'; + $dtStart = $vcal->createProperty('DTSTART'); + + $tz = new DateTimeZone('Canada/Eastern'); + $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz)); + + $exDate1 = $vcal->createProperty('EXDATE'); + $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz))); + $exDate2 = $vcal->createProperty('EXDATE'); + $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz))); + + $ev->add($dtStart); + $ev->add($exDate1); + $ev->add($exDate2); + + $vcal->add($ev); + + $it = new RecurrenceIterator($vcal,(string)$ev->uid); + + $this->assertEquals('yearly', $it->frequency); + $this->assertEquals(1, $it->interval); + $this->assertEquals(10, $it->count); + + $max = 20; + $result = array(); + foreach($it as $k=>$item) { + + $result[] = $item; + $max--; + + if (!$max) break; + + } + + $this->assertEquals( + array( + new DateTime('2011-01-01 13:50:20', $tz), + new DateTime('2013-01-01 13:50:20', $tz), + new DateTime('2015-01-01 13:50:20', $tz), + new DateTime('2017-01-01 13:50:20', $tz), + new DateTime('2018-01-01 13:50:20', $tz), + new DateTime('2019-01-01 13:50:20', $tz), + new DateTime('2020-01-01 13:50:20', $tz), + ), + $result + ); + + } + + /** + * @depends testValues + */ + function testOverridenEvent() { + + $vcal = new VCalendar(); + + $ev1 = $vcal->createComponent('VEVENT'); + $ev1->UID = 'overridden'; + $ev1->RRULE = 'FREQ=DAILY;COUNT=10'; + $ev1->DTSTART = '20120107T120000Z'; + $ev1->SUMMARY = 'baseEvent'; + + $vcal->add($ev1); + + // ev2 overrides an event, and puts it on 2pm instead. + $ev2 = $vcal->createComponent('VEVENT'); + $ev2->UID = 'overridden'; + $ev2->{'RECURRENCE-ID'} = '20120110T120000Z'; + $ev2->DTSTART = '20120110T140000Z'; + $ev2->SUMMARY = 'Event 2'; + + $vcal->add($ev2); + + // ev3 overrides an event, and puts it 2 days and 2 hours later + $ev3 = $vcal->createComponent('VEVENT'); + $ev3->UID = 'overridden'; + $ev3->{'RECURRENCE-ID'} = '20120113T120000Z'; + $ev3->DTSTART = '20120115T140000Z'; + $ev3->SUMMARY = 'Event 3'; + + $vcal->add($ev3); + + $it = new RecurrenceIterator($vcal,'overridden'); + + $dates = array(); + $summaries = array(); + while($it->valid()) { + + $dates[] = $it->getDTStart(); + $summaries[] = (string)$it->getEventObject()->SUMMARY; + $it->next(); + + } + + $tz = new DateTimeZone('UTC'); + $this->assertEquals(array( + new DateTime('2012-01-07 12:00:00',$tz), + new DateTime('2012-01-08 12:00:00',$tz), + new DateTime('2012-01-09 12:00:00',$tz), + new DateTime('2012-01-10 14:00:00',$tz), + new DateTime('2012-01-11 12:00:00',$tz), + new DateTime('2012-01-12 12:00:00',$tz), + new DateTime('2012-01-14 12:00:00',$tz), + new DateTime('2012-01-15 12:00:00',$tz), + new DateTime('2012-01-15 14:00:00',$tz), + new DateTime('2012-01-16 12:00:00',$tz), + ), $dates); + + $this->assertEquals(array( + 'baseEvent', + 'baseEvent', + 'baseEvent', + 'Event 2', + 'baseEvent', + 'baseEvent', + 'baseEvent', + 'baseEvent', + 'Event 3', + 'baseEvent', + ), $summaries); + + } + + /** + * @depends testValues + */ + function testOverridenEvent2() { + + $vcal = new VCalendar(); + + $ev1 = $vcal->createComponent('VEVENT'); + $ev1->UID = 'overridden'; + $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3'; + $ev1->DTSTART = '20120112T120000Z'; + $ev1->SUMMARY = 'baseEvent'; + + $vcal->add($ev1); + + // ev2 overrides an event, and puts it 6 days earlier instead. + $ev2 = $vcal->createComponent('VEVENT'); + $ev2->UID = 'overridden'; + $ev2->{'RECURRENCE-ID'} = '20120119T120000Z'; + $ev2->DTSTART = '20120113T120000Z'; + $ev2->SUMMARY = 'Override!'; + + $vcal->add($ev2); + + $it = new RecurrenceIterator($vcal,'overridden'); + + $dates = array(); + $summaries = array(); + while($it->valid()) { + + $dates[] = $it->getDTStart(); + $summaries[] = (string)$it->getEventObject()->SUMMARY; + $it->next(); + + } + + $tz = new DateTimeZone('UTC'); + $this->assertEquals(array( + new DateTime('2012-01-12 12:00:00',$tz), + new DateTime('2012-01-13 12:00:00',$tz), + new DateTime('2012-01-26 12:00:00',$tz), + + ), $dates); + + $this->assertEquals(array( + 'baseEvent', + 'Override!', + 'baseEvent', + ), $summaries); + + } + + /** + * @depends testValues + */ + function testOverridenEventNoValuesExpected() { + + $vcal = new VCalendar(); + $ev1 = $vcal->createComponent('VEVENT'); + + $ev1->UID = 'overridden'; + $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3'; + $ev1->DTSTART = '20120124T120000Z'; + $ev1->SUMMARY = 'baseEvent'; + + $vcal->add($ev1); + + // ev2 overrides an event, and puts it 6 days earlier instead. + $ev2 = $vcal->createComponent('VEVENT'); + $ev2->UID = 'overridden'; + $ev2->{'RECURRENCE-ID'} = '20120131T120000Z'; + $ev2->DTSTART = '20120125T120000Z'; + $ev2->SUMMARY = 'Override!'; + + $vcal->add($ev2); + + $it = new RecurrenceIterator($vcal,'overridden'); + + $dates = array(); + $summaries = array(); + + // The reported problem was specifically related to the VCALENDAR + // expansion. In this parcitular case, we had to forward to the 28th of + // january. + $it->fastForward(new DateTime('2012-01-28 23:00:00')); + + // We stop the loop when it hits the 6th of februari. Normally this + // iterator would hit 24, 25 (overriden from 31) and 7 feb but because + // we 'filter' from the 28th till the 6th, we should get 0 results. + while($it->valid() && $it->getDTSTart() < new DateTime('2012-02-06 23:00:00')) { + + $dates[] = $it->getDTStart(); + $summaries[] = (string)$it->getEventObject()->SUMMARY; + $it->next(); + + } + + $this->assertEquals(array(), $dates); + $this->assertEquals(array(), $summaries); + + } +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorUntilRespectsTimezoneTest.ics b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorUntilRespectsTimezoneTest.ics new file mode 100644 index 0000000000..1663c783d8 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorUntilRespectsTimezoneTest.ics @@ -0,0 +1,39 @@ +BEGIN:VCALENDAR +VERSION:2.0 +X-WR-TIMEZONE:America/New_York +PRODID:-//www.churchcommunitybuilder.com//Church Community Builder//EN +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:Test Event +BEGIN:VTIMEZONE +TZID:America/New_York +X-LIC-LOCATION:America/New_York +BEGIN:DAYLIGHT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +TZNAME:EDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +TZNAME:EST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +UID:10621-1440@ccbchurch.com +DTSTART;TZID=America/New_York:20130923T183000 +DTEND;TZID=America/New_York:20130923T203000 +DTSTAMP:20131216T170211 +RRULE:FREQ=WEEKLY;UNTIL=20131118T183000 +CREATED:20130423T161111 +DESCRIPTION:Test Event ending November 11, 2013 +LAST-MODIFIED:20131126T163428 +SEQUENCE:1387231331 +SUMMARY:Test +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorUntilRespectsTimezoneTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorUntilRespectsTimezoneTest.php new file mode 100644 index 0000000000..a8e4671d98 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorUntilRespectsTimezoneTest.php @@ -0,0 +1,55 @@ +assertEquals("America/New_York", $ri->until->getTimezone()->getName()); + } + + public function testUntilEndingInZIsUtc() + { + $ics_data = <<assertEquals("UTC", $ri->until->getTimezone()->getName()); + } +} + diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php new file mode 100644 index 0000000000..fd4dd784ba --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php @@ -0,0 +1,20 @@ +add('test', "abc\r\ndef"); + $this->assertEquals("TEST:abc\\ndef\r\n", $prop->serialize()); + + } + + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php new file mode 100644 index 0000000000..411a40e6df --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php @@ -0,0 +1,306 @@ +version = VObject\Version::VERSION; + } + + function createStream($data) { + + $stream = fopen('php://memory','r+'); + fwrite($stream, $data); + rewind($stream); + return $stream; + + } + + function testICalendarImportValidEvent() { + + $data = <<createStream($data); + + $objects = new ICalendar($tempFile); + + $return = ""; + while($object=$objects->getNext()) { + $return .= $object->serialize(); + } + $this->assertEquals(array(), VObject\Reader::read($return)->validate()); + } + + function testICalendarImportEndOfData() { + $data = <<createStream($data); + + $objects = new ICalendar($tempFile); + + $return = ""; + while($object=$objects->getNext()) { + $return .= $object->serialize(); + } + $this->assertNull($object=$objects->getNext()); + } + + /** + * @expectedException Sabre\VObject\ParseException + */ + function testICalendarImportInvalidEvent() { + $data = <<createStream($data); + $objects = new ICalendar($tempFile); + + } + + function testICalendarImportMultipleValidEvents() { + + $event[] = <<createStream($data); + + $objects = new ICalendar($tempFile); + + $return = ""; + $i = 0; + while($object=$objects->getNext()) { + + $expected = <<version//EN +CALSCALE:GREGORIAN +$event[$i] +END:VCALENDAR + +EOT; + + $return .= $object->serialize(); + $expected = str_replace("\n", "\r\n", $expected); + $this->assertEquals($expected, $object->serialize()); + $i++; + } + $this->assertEquals(array(), VObject\Reader::read($return)->validate()); + } + + function testICalendarImportEventWithoutUID() { + + $data = <<version//EN +CALSCALE:GREGORIAN +BEGIN:VEVENT +DTSTART:20140101T040000Z +DTSTAMP:20140122T233226Z +END:VEVENT +END:VCALENDAR + +EOT; + $tempFile = $this->createStream($data); + + $objects = new ICalendar($tempFile); + + $return = ""; + while($object=$objects->getNext()) { + $return .= $object->serialize(); + } + + $messages = VObject\Reader::read($return)->validate(); + + if ($messages) { + $messages = array_map( + function($item) { return $item['message']; }, + $messages + ); + $this->fail('Validation errors: ' . implode("\n", $messages)); + } else { + $this->assertEquals(array(), $messages); + } + } + + function testICalendarImportMultipleVTIMEZONESAndMultipleValidEvents() { + + $timezones = <<createStream($data); + + $objects = new ICalendar($tempFile); + + $return = ""; + $i = 0; + while($object=$objects->getNext()) { + + $expected = <<version//EN +CALSCALE:GREGORIAN +$timezones +$event[$i] +END:VCALENDAR + +EOT; + $expected = str_replace("\n", "\r\n", $expected); + + $this->assertEquals($expected, $object->serialize()); + $return .= $object->serialize(); + $i++; + + } + + $this->assertEquals(array(), VObject\Reader::read($return)->validate()); + } + + function testICalendarImportWithOutVTIMEZONES() { + + $data = <<createStream($data); + + $objects = new ICalendar($tempFile); + + $return = ""; + while($object=$objects->getNext()) { + $return .= $object->serialize(); + } + + $messages = VObject\Reader::read($return)->validate(); + $this->assertEquals(array(), $messages); + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php new file mode 100644 index 0000000000..093321b8fe --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php @@ -0,0 +1,159 @@ +createStream($data); + + $objects = new VCard($tempFile); + + $count = 0; + while($objects->getNext()) { + $count++; + } + $this->assertEquals(1, $count); + + } + + function testVCardImportValidVCardsWithCategories() { + $data = <<createStream($data); + + $splitter = new VCard($tempFile); + + $count = 0; + while($object=$splitter->getNext()) { + $count++; + } + $this->assertEquals(4, $count); + + } + + function testVCardImportEndOfData() { + $data = <<createStream($data); + + $objects = new VCard($tempFile); + $object=$objects->getNext(); + + $this->assertNull($objects->getNext()); + + + } + + /** + * @expectedException \Sabre\VObject\ParseException + */ + function testVCardImportCheckInvalidArgumentException() { + $data = <<createStream($data); + + $objects = new VCard($tempFile); + while($objects->getNext()) { } + + } + + function testVCardImportMultipleValidVCards() { + $data = <<createStream($data); + + $objects = new VCard($tempFile); + + $count = 0; + while($objects->getNext()) { + $count++; + } + $this->assertEquals(2, $count); + + } + + function testImportMultipleSeparatedWithNewLines() { + $data = <<createStream($data); + $objects = new VCard($tempFile); + + $count = 0; + while ($objects->getNext()) { + $count++; + } + $this->assertEquals(2, $count); + } + + function testVCardImportVCardWithoutUID() { + $data = <<createStream($data); + + $objects = new VCard($tempFile); + + $count = 0; + while($objects->getNext()) { + $count++; + } + + $this->assertEquals(1, $count); + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php new file mode 100644 index 0000000000..8e0bc483d1 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php @@ -0,0 +1,55 @@ +assertEquals(false, $string); + + } + + function testIsUTF8() { + + $string = StringUtil::isUTF8('I 💚 SabreDAV'); + + $this->assertEquals(true, $string); + + } + + function testUTF8ControlChar() { + + $string = StringUtil::isUTF8(chr(0x00)); + + $this->assertEquals(false, $string); + + } + + function testConvertToUTF8nonUTF8() { + + $string = StringUtil::convertToUTF8(chr(0xbf)); + + $this->assertEquals(utf8_encode(chr(0xbf)), $string); + + } + + function testConvertToUTF8IsUTF8() { + + $string = StringUtil::convertToUTF8('I 💚 SabreDAV'); + + $this->assertEquals('I 💚 SabreDAV', $string); + + } + + function testConvertToUTF8ControlChar() { + + $string = StringUtil::convertToUTF8(chr(0x00)); + + $this->assertEquals('', $string); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php new file mode 100644 index 0000000000..6e4204dc53 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php @@ -0,0 +1,316 @@ +assertInstanceOf('DateTimeZone', $tz); + + } + + function getMapping() { + + TimeZoneUtil::loadTzMaps(); + + // PHPUNit requires an array of arrays + return array_map( + function($value) { + return array($value); + }, + TimeZoneUtil::$map + ); + + } + + function testExchangeMap() { + + $vobj = <<assertEquals($ex->getName(), $tz->getName()); + + } + + function testWetherMicrosoftIsStillInsane() { + + $vobj = <<assertEquals($ex->getName(), $tz->getName()); + + } + + function testUnknownExchangeId() { + + $vobj = <<assertEquals($ex->getName(), $tz->getName()); + + } + + function testWindowsTimeZone() { + + $tz = TimeZoneUtil::getTimeZone('Eastern Standard Time'); + $ex = new \DateTimeZone('America/New_York'); + $this->assertEquals($ex->getName(), $tz->getName()); + + } + + function testTimezoneOffset() { + + $tz = TimeZoneUtil::getTimeZone('GMT-0400', null, true); + + if (version_compare(PHP_VERSION, '5.5.10', '>=')) { + $ex = new \DateTimeZone('-04:00'); + } else { + $ex = new \DateTimeZone('Etc/GMT-4'); + } + $this->assertEquals($ex->getName(), $tz->getName()); + + } + + /** + * @expectedException InvalidArgumentException + */ + function testTimezoneFail() { + + $tz = TimeZoneUtil::getTimeZone('FooBar',null,true); + + } + + function testFallBack() { + + $vobj = <<assertEquals($ex->getName(), $tz->getName()); + + } + + function testLjubljanaBug() { + + $vobj = <<assertEquals($ex->getName(), $tz->getName()); + + } + + function testWeirdSystemVLICs() { + +$vobj = <<=')) { + $ex = new \DateTimeZone('America/New_York'); + } else { + $ex = new \DateTimeZone('EST5EDT'); + } + $this->assertEquals($ex->getName(), $tz->getName()); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/UUIDUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/UUIDUtilTest.php new file mode 100644 index 0000000000..d33a879460 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/UUIDUtilTest.php @@ -0,0 +1,37 @@ +assertTrue( + UUIDUtil::validateUUID('11111111-2222-3333-4444-555555555555') + ); + $this->assertFalse( + UUIDUtil::validateUUID(' 11111111-2222-3333-4444-555555555555') + ); + $this->assertTrue( + UUIDUtil::validateUUID('ffffffff-2222-3333-4444-555555555555') + ); + $this->assertFalse( + UUIDUtil::validateUUID('fffffffg-2222-3333-4444-555555555555') + ); + + } + + /** + * @depends testValidateUUID + */ + function testGetUUID() { + + $this->assertTrue( + UUIDUtil::validateUUID( + UUIDUtil::getUUID() + ) + ); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/VCard21Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/VCard21Test.php new file mode 100644 index 0000000000..9c6994da42 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/VCard21Test.php @@ -0,0 +1,52 @@ +serialize($input); + + $this->assertEquals($input, $output); + + } + + function testPropertyPadValueCount() { + + $input = <<serialize($input); + + $expected = <<assertEquals($expected, $output); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/VCardConverterTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/VCardConverterTest.php new file mode 100644 index 0000000000..25b907e842 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/VCardConverterTest.php @@ -0,0 +1,274 @@ +convert(\Sabre\VObject\Document::VCARD40); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + } + + function testConvert40to40() { + + $version = Version::VERSION; + + $input = <<convert(\Sabre\VObject\Document::VCARD40); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + } + + function testConvert21to40() { + + $version = Version::VERSION; + + $input = <<convert(\Sabre\VObject\Document::VCARD40); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + } + + function testConvert30to30() { + + $version = Version::VERSION; + + $input = <<convert(\Sabre\VObject\Document::VCARD30); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + } + + function testConvert40to30() { + + $version = Version::VERSION; + + $input = <<convert(\Sabre\VObject\Document::VCARD30); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + } + + function testConvertGroupCard() { + + $version = Version::VERSION; + + $input = <<convert(\Sabre\VObject\Document::VCARD40); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + $input = $output; + $output = <<convert(\Sabre\VObject\Document::VCARD30); + + $this->assertEquals( + $output, + str_replace("\r", "", $vcard->serialize()) + ); + + } +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php new file mode 100644 index 0000000000..b3d41b2007 --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php @@ -0,0 +1,14 @@ +assertEquals(-1, version_compare('2.0.0',$v)); + + } + +} diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf b/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf new file mode 100644 index 0000000000..180949c5eb --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf @@ -0,0 +1,352 @@ +BEGIN:VCARD +VERSION:3.0 +N:Benutzer;Test;;; +FN:Test Benutzer +PHOTO;BASE64: + /9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQA + AAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABQKADAAQAAAABAAABQAAAAAD/2wBD + AAIBAQIBAQICAQICAgICAwUDAwMDAwYEBAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkN + Dg0MDgsMDAv/2wBDAQICAgMCAwUDAwULCAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL + CwsLCwsLCwsLCwsLCwsLCwsLCwv/wAARCAFAAUADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA + AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB + kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn + aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT + 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI + CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV + YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 + goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk + 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8J7JbO8tYo1tIFCDLOVG5qfdaVZRwmSOFWzyA + F4H1rLt5WViMhdp6HgmtKK8O3B+4Rhx6fSgBI9FtjaNN5aErwRjilSys7lFAt41xyTtqc2yJCVlY + 7eqgGqv2jyLcebjZnGPWncdzT0+w0u5eQXtrGiBcIyoPmNMXwpb/AGMTSRRbH6YAyPwqK21GKdfL + BAVfu+1SQX4jnjKFsp03dPypCKN9oEaKSkC7R0bGKpnSlSPdHErZOORXV3Ouy337sCLB6kpx+FY0 + t+VfyrgcbuCB1oAfoMemrcImq2sZX+I7ATXS618PdK1DRlvvDEaMq5LoV2nisx4LVrUfu5BOePau + m8EQS6PY3HmFXjljKhTzjOf1oA4mz8OxvMrLbW5RD8wbByKg1LRrRriRYY408w/KAMba1pRaWt/H + a6a7CVm2u7N8lUPEujzaRekzSK6tgqVNAGNBZJauY5Yon92GTRJp0ROY0Un0A4q3c2odkaYOMjii + KL7NIDGcj1NDAZBplmmWv1xnoFHStfS/DFpewqYoYm3DutZ8lv8AapdyOqk8EVteEbSe3KBSrDrQ + BT8S+HbawiiWGCAPjsuMnPesqHS4JSFlSMP7DitbXbvfrkkM2eGw3p+FMfTh5X+hr8w7t3oAhOhW + u8MkMZUY3fL0Heo9UsrN5FFrbxKmMBgoG41fWFra0Acjpzg9aoXjtgRoo29vagCoun27kbY059qn + bwykskYjRArdTT7GEl2UqMr2q/JtVU27iR15NADdK8DC/wBPle2iicxNg5ALH6Umm6FZ/a3ttQt4 + g2Cqnb0PbJ+tamn3j6ZCW0nILfeBORWVfO4dhLw7fMW7560AZuqeHf7MuTFcRpv6qVGVx70q2Eci + QwyW0SsPvOqjJrUtb6S9tHQKGeMZYuM8VUs7gRxbrncy9mWgB1x4QtTHvsQWkHJVhhax3tkhugHh + UkfeAXIFdPZ3v2uxkQ9G4jI6/j+tYun3r2Fy6yxeb2Py5IoAqXenJ5xaGNNvXH/1qcLSGeBdkSg9 + CcdaswC3be0pfexOMnpn2qaS1KQkQASKoydvLCgDNi09RKTNCuO2BxVjSobc6gqXMERQHkleDUsc + u9VADbG6qOWAp11bLbptkjlCkZRsde9AFi5sbO3kKfZYTnkHaOlVbuO2F5thtYcADjaKXUpHj8ku + Co2VDFL5wLeg696YFwQ2z7Qtlb8HJO0c1Zsr7T7a9kL6XazZ4CmMFRWfHdkEgjGRjPpU9raP5LSP + j5h2pAWdQ0+z1KdG+y21qvcRqBn8qXSvC+iTu63ssqyE/IAuR+NQwSrGm1g+c8E9qiSQW9wPNYYP + OR2oAW68GNa28k3lwGNHwvzDJGfSqM9nHBgm3j59QMVdmma4zIjsUBHy5OKp6o8s2BJjZjjAoAro + /nysbgYY9zWmLPCR+WQQwyaz4k2F/Pbft/GtKxvUeFN+B2x+NAEptsWpZSdo9etZe8su2X7pPFdU + LeOazKqVwevNYt7pw5EA5HIxQBQA8tAIeGz1NWIJvJlhW5OQBzjrUMR/eN9pwoXjB4qQ3ERJeYcy + 9P8AZoA0jf8AmybVxsHAFS6jp63ixmwjIwOfrWfaou12GcDpmt/w5qJhXc6hh2GM0AZkHiRpblVl + G0RjGMdxXQ+H/E0Rm+bjdw1crqEHm3EksY4Y9PTmq0cskc42qUOfpmgDovHOhLBOZ9O+aEnIUdRW + QZft1sgum/1Ywua3fDfiFDL5WoEPEwxzzirPizwTFPZC60kYUjcAp4NAHPSq91EoRS3061DHD9nb + 94Mkfw020v57GbcCRt4IIqzNcedIH2jc3JyOaAIYrRZmJxtNdB4fkGn2hluBgBR+NZ2n2X9ozAQD + 5qvaxGbKIRXkuFU4C96AMDxBKZdQkuEUkStuUegpNM1eWScAkqpHTHNPlwbjMzExZ4Pal1PS/s6+ + dY/6vuwPSgC9G8c0A+1xEknrnpUVxaeXNm2dVUfjVazvEZAEkMrccZzV1YYyBIhJP8SZ6fhQBSmV + 4JfMVT+96UJdSQdcMO4A6fjVmTUoJiqTOMJ/q+elRyQs0TtaxF0PVhzmgCzpd55r7YI2HHPTmrV0 + sDTF7gnJXGO4OKyNKgn80NbFhjoBzWjqdg6SISPmIBOaAKVnI1leyhsMJOD7CqOqRtZqotjiFulW + rhsSMshKH1ogsZbmF475TKifdf0oApabevHIAhCYOdxp0t59luS0I+995uxqpdRyWsrqmXGeCR/K + rVlZfaogqv8AvD/CaAIY42kV3K5zzn1p9jNLp6u/A80YPNWWsJNPAVpC4JAZT2HfFWJoVmVVjhVk + HTPrQBPoi2wsoo4APtBHL+tP1mS5uVEFxgJGNqH15plp5WmyBriMRsowM8UybXTNdbrpd6A/KKAD + xbJAGs44FIPlnd9c/wD16ynt/LiDW2SR2qa5vP7RnMs6BNuQMd6jhkAUb2K8+tADYp0fhj8w6itC + yQ3CFYeAOoqi8Uew+UMuf4u9T2NwIW+UgMetO4FmS6RJ1ik6HqxHAqC+gimUiA8DvjrU0kcE8ieY + itu+8c0+bShaWxksSZoM4b0SkBTgha0cq33Cuc1SvrrLFV6jpWqbuGe1HnnDdAKy7i3WSY7OT2NN + AMulWSV8ZDNzxV7SlbaFjClx69Kpww7W3ct7jpUtnNJHd5UjZnt1NIDdt7h7NQ7qGfpt7VR1XVEh + dhEpP94/4VpafexTy7ZlbBGDVHxFbQh1j04HaOTkdKAM5ZVlYso3E+tVp4w8gx0Bqd7QxNu+6D6V + DIoVySxAx2NAFyNmli2pjYBz61paW3lWrFS3BwP8/hWJbTBFJy2D6HgfWtiTWPsqxraBHyOeBg0A + RSoLSTdIepzz0606exTWyQGMXljORTNT1B7+ECZR5fHzDqapfbHjbFkTsIwSTQA43ptyyS44Paun + 8N64Z7Bre4YlZBtU5+7XLTQbjwN4Pb+IfWn2lw9uyrIw2Z5HpQBv3GirHc7LxWVZOVI71FNp7WDg + QYlIIGD6VvaPdi+tljb5yeAzcn8DT9YtbPSpVhDM87jJ3Htjnn6UAUIrJreD7Si7MDoKhv8AUxqt + pGt5GqIOr9zRfLM8ZFgZGtex2nGe4zWKN8rsDhYx2JpJ3Atx+HxcRSzWcpcL/CRwaj0zW1sQy3cS + nsFPSoYJpbIl7dm8tT8wzV7+0hqEO1Y4lQ9cqMn9KoCp9kW7kaaxU+Yx+5j5etWrb/RGxfr5bkdu + lW7KFILpfspDbVyc1fjNnrLtHqOYWP8AFjGfxpAc/e6Ql/GzW4AfqBWfpupS6Xer5vPlHmMjg10V + 5pp0u4JhYNGvAYHrUn2WLWrVo41AvSMRZAC/8CPr1oAvafdWOuNG+lqDekY+zg8MPXPX/wDXWZrF + tcWNw0erKElB4Rf4R6c1BpqyaBdbrnEcwyAc4x06H0rQS9a9jUTgOXPzMwycexoAw7u1jYb3zkU3 + Srtgdk54PFamv2C2pDQbWjcfKCeSa56aJld23YA6ZOKFqBrXGjjULuOKxKuZOTn+H/OKwr/ztOvs + uCrg7RgVLYapPbXAEW4EkHJNdBNBH4gtgyhFmXuw60AVpbT7VpiPJ94jLetQWsDRSIYz8mec1c0+ + 1nexdrw7GjJXk/epsFtDPG0bOdw+b5SaAKWsXA+14Y71FQi5S4RvlAC8A0y5hHmHarhvQ9BVGSQx + sUXPHX3oAmDCJ8rzgHg96gQ+ZGWbg9vahNRG7EnalkkF6hEXyD270MCWF3aEhdue1OsmNnMAih/r + VaBgAUY8561PaubdnMxJXseuKANhIY5Assp2v12itZtAgubEi2nb5xuKYHWubstQaO6SVzujTqpP + X8K2rXWLRF8xZJPMfjAzgUAcxcNiaRSpUocc96sW+yNgZCMVF4lvJdRvTOYkj52jbgZ98D6VWmlY + 2qCUnJOKaVwCzviibANwYc8Utkdl7tbKhjxmpUspvm8tgn16ipigSEG4G4pxu9TSA27GeFbRlGGm + P3cdhUN8GEP2hV3JjafrWfpU/wBmuAcZLA4/Sr1trkarJHcRmSEZO3uTQBmrcbZCLoDZ2x1qOHSi + yebJIAPQipp4kmbzI1EQJ6GtCxsoHP8Ap91GB2yDQBlSWO+M/ZsBHHzZ71XkfMIWNgGU9vSt3U9N + t9m21uonz0Iz/hVCfRkjg82FhtHDGgCuZ8EMjDZjBzSZ8pAwU7XbGT0pWtEjjAZgV4PFOml2QKqk + OoOcU1qBNYRSrdkrhw3BIrah8KwXoV/m3PyVzyDWNp999kccgZq/ea7PFAGgZlJ6EUgN23thpdi4 + V1Eucr7ev9K53V/ER1a/MkuWdBtG04zioLrXJ5wDK2XAxmqVqmZ2YPtHJ/GgDsvC3i0ppr2d2ish + yFAHIz706bRLNdOPnErKw4y3NcvZ3pjA8o4kB61o3OpSX9nbx3QIkU/MwoAj/sGaPzFjlWSJjk46 + ioYYwqssjIHHAHpWm4ESN9nYDIFZV+I7uVI1wrY5b1oAtafcvb3W4MM9Nx6U/VZpNRys54ToU4zW + KXaDKrJuC8cVdtpi1gzs43HNAD9N195bdYtRIUR4wD1NX2KuA9uThuSQelcsZwzq9xyzfezV/SdX + e3m8pXJhkPKkUAdYZk8RywjVVJES7U2cE/WtA+HDHohuY3Uxg7RF/GeaPBlxaawMW6rHKnAU9SOO + lX/FFv8A2bpzTQk+cpAAz93nrQBx+r4c5CODEOA3Y+wrKu5V1C1GFKznkk9K6Wzv49fs8Xf7y7DY + MhGNgrmtX0s2t66WknnKvUp0/WgCnbrJFdot0NwJxkDFdDYp86oMjjIArJivxbR7LuMyEjKitS21 + MW8auuW44H93/PFAG15aXdr5Uv7uULkA/wCFc+Yvstw0at8+eoq/p+rm6vRJMNwIx9KranYySXSy + WEZZHOCw7UARXFyj5STAk7ntWVf2gALLyfUVoataLbfLO2SO/Ws2c+VwhLK3QDpQBmz2xAyCG56d + 6uWPlnCkFcjoTzUBkMc/3cZpwn8oZkDFs8HsKALN1apDIHOeaiLkRkMOtSXE6yxAsRUcdxldswIJ + HANMCuJW8xQgOP51oacWPPGAeRUUOIZQzDhecd6mbIcbPusM0gLmq6bHPohlhDeZuH4c1zzF1+Rs + HByDXTae0s0IhjjZg3GPWqOs+HpLCTbNGyb+cHrQBZitjPEzW/LL97vinw2v2m2aORec9AKXQbsw + ygBBiX72TWxfaS8kiGFQAwz8vWkncDlbqNraT5cjb/n+lMGckx8kjOa1tU2TxkPkMpxyKyrhJ4Wa + KIDbTAkgvIp7URzgBwe/BpZYrd4vmZWNZ81x5cgBXDdzVlIvtUOGIBHpQA2aEROpR8DsB2q3bvG9 + iySzEsTkLnrVMqViCZzt7nrT7GBVuQRnODQA6Q+Sx80A4HApEJB3BAR9K19EmhkvCJ0ZsKe3tUc8 + Mc1yy7cpn6YoAzoUiclnYYY8AHpUl8zRxqpPy9qtC2tULgSMAvQ460lzIl9b7YiDt4GaAKMMQlJ5 + z9Kj8gIW5yKnS3Crlzhh6d6k0mbyZT565Q5z60ANtrRpPmhzWhbwy7DJcDhhwMdKlt7aK+gb+z33 + yKdxVuMCqaz5cqGYfWgB6yu8rBB8o6Gs/UpjGQXBGPTvVmSfyImyepqrqjbIw3WgCDz1ib9yOTg4 + NbVlNBJYvlVBHt1rBaPzQWU4IHSn2FwRJslJxQA6e3M0O4oAzdB6VXR2iKGQENGOK0ms1eAkFjF/ + BjrVGaAo371smgC7pety2kwl06Vo5AOWXmuwm+Itv4g8Ota30aWlySAJQfmkP/1zXIeG4Y5SVBB3 + evamXGly2tydwG0nKkHpQBZ86fRbpBLI252y4PGRWhO8Ml1IbJhHn+BTnNU9O1oRwvDqqhB2lHJP + 4U6awb+z4JdKbzdh5ZurDHtQBat5LaRHiaOP7QejEZKD/Oauy+FI7W3Bsroyhxkq3QH8q5a7ujM8 + nWOQnBqTR9burCT98xdR60AbbaHc6ZG3ymJsZC/3hVnw/fNIXt7hygHzZp2oeIBqCxzqfmCgEe3+ + RVdrmLVAEtf3bxfOW/ve36UAV7+7DXMu5Q4/Os2e3eRWkiAGOijtWrPodxfQmeNVAPOPWsppJIpi + JxsKcY9aAMwRyTSbpflx68VOYvOXb97OKtXAiZdzkqT0AGc037BIIRLHjsR60AVprZrZwGj4qTY0 + xyRj3PUVMJDduFfqvFRzxJCzrCzEr60ALEu+YI53c4qeGB7lGCnBU4FUopTBLvfk1at9R2sAMjNA + GtaXsnhy2FzPHvC46jgnNQ33imTXrkz3oVFAwo9Kfrtq03hAzEfJ5gyc81hWM5hhKrhgT0NPcByS + P5g2uVI98Vp6X4uuNGlyzCQIQR0bI7/1rNQxqW+05J7Y4qK5ZYUP2ZCW9TSA7SR9M8V30X9nMFZw + WfcNi5qPWPDtjo0pE7O03U/Mf055rmtFmN9E0DEox+atPWbiW7lSO8Ja4jQbcDC4A9PXFADYtM0+ + 6nc3u7aOm3IP6Vnak9tYt/xL/M445zTIbieOdmWNsE46cip42EkyC4hYx469KAFsrT7XEJgFPOT6 + 1s+H9PD3XlzxnL/MDtqn9pghgb7GjL/eJORWqfEnmrA9oFRoxjJ5BoAp6NqDW2pzRXtuyIAw3FMf + rVS4iF08pydmeCDxWvqeuC+Ro9qglcMw71mwReXD5aAlFJPPU0AZ0cEsbkSZKH15FD2xJJiJVj6c + VfnzLGEXAA71PFpDPaebE6/KOh60AYVws8TBgrFe57CmHUG25RVJA7AVozzSLbNvX5T1AHNY/m/Z + nPlqwDetAEtvqzJNu3FZBwQBjI96vPqkd3mRtokH31UYx+VZqWruxaFl+frkZxT1tvs1ujJgEH5m + PR/pQAXl2S371XAHI+Wkaf7VD8hGR2arKySylRccQ98DmiS0jifdsdgeODQBQd9x3IBx1xTYlBm3 + En86sXUAwPswKg9QeaBErIEj6nrQC0NHRtUjt0K3AHzDABGcVW1fTzJL51jyOpz0NVooispebBI4 + wK2YFEthk8qR07igDAgJil+TKtnnHFaP2h5yI3ZsgdSfaqd2P3im3BGM9aktsjmRgCOaAJZrMwR7 + 3A5PT0pdMvZtOning+byzuVDyh/A8VHczSzDPy7RwOKgiuHEewjKeoFAzp7TUNM8XXEw8RhYNQmP + 7ny18uNeOM7cCtMfDiS8uY0tDEYghyynjPbn864htP8ANhLIehzWzovxDvtFsDB9+PI4I/rQI0r3 + wNc6DO0N2VaQqW2q24YxmqFhYRgE/vkkDfMGBBP4GrSeJ7tZd6SxvIfmK4yQP84p0XiyC71gS65G + 00zAKGX5Qv4UAbFpd28WnIsBLsDzmub1+AXt1LJEoQqfu4xu+lbWsWgs4/NsCXjPIbqK5+5kklmE + rDD54BFAGb5cjybCrAnnB6ipEvXil2sM4GMVpFY7m4UNmNyOWJ4qteaM0BISVZe+RQBFHC2/zISg + B69KlIVhIHA3HuR70lqotlBulY5P4Vcls44k3u6N5oyoHb60wM6O1SRir5LemOKv2vhuW4iLg7VA + 6k4FTR2ax4aaVIwR3HWqGua5PcQm1WRBH6jqaQFzWbE2nhzynuIi+8HaHyKweJSEQEN6jpVcKyOw + cMVznOeKmtZvOPDKuOKAJbi0JYFf4eue9IW8sncfvdqnlvVFyFyu09abI0bysMZx0oArC4eCTcgb + juK2dNvE1N1M0ohljGQzc5A7cfSs6aweWAk7kTuapQysIT9mOSvG49aAOkvzLMxk06QNuG1l7j3r + PlnnJAuGJij+nNQ6XqT7wEYqyn5v9utLULaW7j321uiEjLqMkKKAIotbghb/AI8hKGPIBHNXLG6t + 7uzk3RLbKG/iP+Fc+8f2d1eFztzyD2q5p2oCFWRoxOX52nPFAGgLyC2lyZFKdB70r69buxRJBHjr + nvWVdeXLE7xE8fwnoPpVKZUnQPkBhwRmgDq7a9tLyARWiiWYngL1qG4gurJ28+NowO2a5a3v3smD + aa5WUd1HNbC6zI0KSX13JO7D5lbHFAE4V7pi0b5x1GazdUtXSM7v4iPw5rQ0/XrcXX75FgUdxzuq + /qFrp+sWRe3uDkc4BFAHLRDY42ycd6uPOXiiV+RGPlWnXOg3IQvEmIB/Ft6/jUUEZmMcgydvzECg + C1G2+Ly3YAvyM9qY88kaFcmmp807uwPJ4FS3do+Fzn5ulAFVrjbgS8Z4yah2C03SMffNWZdPknVA + iluQOnHWmX9pILvyY13HHK46UAVre7LSyOCTmtjSiy7VijLeZ0IqO08OzPIUiTI74Ga6bRP7O01F + h1KYJOv3V4BoA4zU1lExMrkbOAvpVcSifhjgrzmtjxPp7pO7SggOcqfUViy25hG5fSgC8rrLAojb + d7d6SexlEgwpRfTNV7e5LFBbKAwPNWHeX7TguxI7GmBPBExhaNVIJ6egqOVknO1fkx1J61aj1gLC + UEKlk4LVWvozC67kCFxkD1pAQ24e3uDLC3z9CR3H/wCqrczJdOGiOxvYc5/CocMYhtUBj3xU8Qjk + XbKPIZOjqclvzoAu2HiO60xPKvd7wY/1fGBWnJo8WuW6y6XIPMYZEAzuH9KxISonAuzuRzgk9qtR + 79KmMuhTt5cRyxznFADLzS2tMw6pAY5OoDEZ/Sm20TQQ74YwVQckGtMatB4kUpqreVIRw5+8aqXF + jc6bAsbD9yThWz94UAOmmjvrRCMJjOQRVS0sD9pLyABM5Of6Vdtrdn+RUGcZqO6uRBG0MuFI79KA + MfV7r7ZqDI7kohAVT6U2eJNimJQOuTnpSXFussrMvBz1pJov3YUsR9O9ABblRncQ3bAqY2EUwIiA + Vqr20ojfYqZx3q9bSKAGcYJPIoAoq7OCEQBffrRDGEcleM8nNPjuGkhHmbB74ApvmxltsuTnuDQA + +SFEjDwu5buD0qpLL5vMg2kEdOlXECMAyZGOMMePyprQRI5N0rt3BXO326UAV4b0Wt0pC5HrXS2W + qq9zE7jcO+OhFc81kbg7iMqeAFHSpLa8eymaNOUIwD6UAavjPQYYybq1bBmXcF9O39Kw4iXdDKcE + DAxW3q7NdWELISdiYIz71kz6ZNZNHI0cjqQfujIFAEtzAtu/7vODzmqlyzNyAo9vWp7uWSWJd+AM + jjGGqOWCSWRVVW2+uKAKskpWU5TP0p8c+ExsPPNTmCVD+5U/QrzRJHJGymeOQc45HFAFczh497KR + jirWlEsAudvII9znitEeBp7yAPZvEVPJUsP5ZqCO3j0yYDUNwliI6dOPpQBt/wDCR3Wj6eHFujvI + do3DIX9KoHXoL6J11CJYZAONlaWueIYtY8Nwx6ZHu2MdxVeTXKG0eaXKRuCeuBQB0mn+HRe2Yeze + MqRkFmwfyra0rwsIrRmvZICcgDLVw7xXFuFd2uEQfeAJAxUkkjSxh4J7gjPAErf40Abvjq1i0y4S + KByCdrfL+FUI7SR4Wc+WzMOCW5qhf3Mt9cCV2ZiihRk5qpdTSBgRI+R2DnFAFw2k6AqJZMjuD1qn + cxzyyAkPuiP3ieT/AJzV+01R7a2RpMZPVmGQ1WVuTqLDCptcfMBwRQBEkst/YMCSTH8vJqtJaoYQ + JPv1o+ZDZKAo+UnBpmrCBpRNp4/0crgZ9f8A9dAzCdGgkOynxSus2xjkj+L1qW5/fxYj+8D+NRWz + R4fzCd2O9Ai0lzI6mPaMOcZqW4uI7rbtJ3IMc1XScKqncQT0olPlKWfBz6UATKjSDcmdoFWtPCyR + kzckHiqUV0623lKVIPzHHWp7Ic/vSRz0zQBcCqdyT4J7YqC3uZdKv1a2UupO7B6H2NMglMUsmcnd + 0Lc4q3BmaMBiDjr60AWJRBfyb9P2RueWJ6KfQVLHqMdtcEysxJXayN0x0yKyWihWQBdwTOSdxHNb + zWEF5ErXhX7QQAMNge2f0oAnhs4rq2kksHwirkg9SfauXnJnmL3AbL9jXSRWh0N28x1cEfMqtnA/ + Cs+70+O9/fWRIb+76fhSTuBimbyyyKDgnipLk7AML1pZbCWO7Hnjn26U6ZykRL+veqAryuvm/Jwf + Sk3mo2AyHyCT6Ux5pLU5Gwg88gGkBPNAILUO3KmooyjL8ueegzTvPMsRjG4qBwKrW1sxJZzsIPGa + AJbmfp5q7MZx71NZawEi8qZSyHg4NRGLzCPtB3eme1R3Nutocodyd8UAaVtqEUDlI8/N3PaqV2Ht + X2x4lIOSwHFSWkEFyo+cD1BpbmNbNdkh20AMh1UiJ1c9RzWj/wAJa1vYiK1RmRvvetY5gDENxgnp + UlhN5TiI4O4845oAmu51lXzFDGQ8jnpTra4uJkBAOQavXvhG8tIhPawvJAfmY9gKE1COwgIiAZiO + 3rQBV866T52Qsw6YrXguZNTs0WSJ8IPnHr9KwZNamNumZSpPU4pbPxBeRy/uJjtXqfWgDodMtnXK + QjYeo3VnalpiXjMzXMKS9O9VV1ydCXkmLY/SorWwTVJTmQEt81AHTeCY49Mik+0SJKmOg71W1bxH + HLdgaXaSRNnjdzWapGlBBG2ec4GKtQ6yZD5hjLMvbIzQBfutWC2ajV4ywwN2OM/Sql/JY2kKGzU/ + McnBBqlf3Lam5e8lKMv3Yz2FU4VjgzsGQ3WgDa0ya0u7kxzgqCCcn1q43hizkEjRkOoXcAOua5Ka + 6Mc3ygEVb0nW57ac/ZC4Xuo5zQBBeZjcwuMxRn5fUUmnySx6kv2cgg98deK1LjT31pTLpymSVuWi + Xqv17U2GzFgFBUCVOo7igCTT7cnTp/ty5ZnyCvGOKz2uwimOY7geQB0FWY7tzu8xiqk8A96qOvmy + MSowOc0AVpkkgk3uAiP39KkjtonYtnO4cKOP1q1Z3K+X5V2N6OeM8gfWiewaxiKhDsAyJB2oAk0u + 1juAwniYshwoB61FLZfaJDv/AHWexpulXRNwpjkP7s8nu1Wd4uC7zfezxQBTjxZTHzlMigbdy8Up + YXEv7nPvk1aNqbhDhgARnFZMCvbzuWZgc/nQBo2l6qs63AJA6VIsiG4DI4jXP8XeqcbrK5JH3xkH + 0pWhWVR52CF6UAa8kUd7H8rD5f1p5txHAfNPasWRCjgh8D0BrV0a+DgCdfM3DaB9RigCml/JFPyB + 159xV+C/wfNHAbtUN9orxO3k5dhycfw1XmT7JarIjb1k6U2BcuNSVGDSAPu6be1QTXcO0CVSwbPA + 7VRtpftEmxW2Mx6HvUv2V1J2jkdaQBFJB5jBVYemetRyW6SqTKCfTFNllCHBX5vWkLBPvk4NADTG + 0ePKB5qdLN5NjycqvNQIpZAFVj71LsaJQBuGaAH3aCVwycKODUMsZgJjxv8AXIzUs0DpHhmBycjm + gOd37wdRjNAFETeTcARAbSeTViApfrhjufHXNJNCsUu18Z61Xit3Q5JxQBdW0MYKyn5hSf2BPIjS + 24I29T6f5xUMMrs5HOF71ooVmtMyu3ynAAzQBqeCfG7aaPsmuYkiYFG3HseKq67YQW2rSNpLCS0l + GQ5GSh74xWZc2SyxK4OZl5x7d/0rV0K+j+xPFOu4Pwpx0oAo3OnFreM7AR9Kp/2eYpxtyCx6VoXd + g2nSlQzMh6UxJdjqSpKgfN6mgCOLSZGkKyYw/wCn+c1YltRodoWA+Y8Z+taPhWz866DQqxLdmq34 + x0ZbS23yY3NgkUAcZcSyrjcc7zw3YU62meOeTazdOhrZ07TYLkYvSFVfmqveQWkDj7CW9zg0AZs9 + 8wbO3L8ZpvmGRsyZQDsO9WLu0EwZojwMc1DJCrsA5we1AFmGVZLc7Y1bA6nvU1gIyNzgxtnoKr7I + NgHO8dx0pJ3AYG3UnHegDRS+NpL5lsxh3dQverj38OtL/pKCKSPhWU/f+tYEt98xMnC9qgludrrJ + GzFl7DvQBq6pYNGdzHGO3aqS33kEBhlSME0+01z7OcXGXRupJ5H0q5fafFqNuJLLnofmGDRsBmJe + DzMEZGevpW7o8sN/bzLqTBML8oB71k/2YYh83FQRqbdtr7sDv60AX7jSo4ZsiVo067hj9anuNHey + jVizMj8gkdaqQyi+UxjO7O0A96tXDz6rEFucp5HygUANGEQKjDJGaqzWbzgyn5QOPY1p2xZtOaGN + VMo5BPoKqxa1NHHtmij+Q4xkUAUraZFiYScMOgNMf76CIZHf2q5KRq8arEjK4OTsGaki0oKwAEhP + uDmgCohEsqq/O6rrMNMj3AEdgfQmn3tqUgEcaYz1JFMtLdn0wpFGxYHhjQBa026M0XM2WQ/NnHzU + 6Yw6tCPt6rbpH0CdvzrPtrZ45ceU4cHk9qtzW6XLOjqwY9+1AEa+HWun8zR28xU5LAZx+VLaGSV9 + jrkr145amvEY4hGkjKMg5XoPY/571vaHFDr95HHqDMkoU4C9G+uKAOevoo5iSBjBxVYwLdRkL1Xt + XSeK/CdzpkjRMqyJ95SjbsD3rmJbUwoeuGOCfSgC9eWc9rcbbdA0KHPmhcq39Ka8e9DkBS5zk1X0 + /wAR3dvEtuTm3AwVzW/D4w0xIEivbOaSTAVWBAH40AYMu6CZDkFcHcTz6UrtkYlwVHIwOtb91olr + qtuRZSL5h5EX8VY97pc1jKAqZ2jB/wA/nQBRJhubjE4YOOnNMC+S+DzmrMkIA819wPTbjmqwfzcM + 4w3vQA9mbYwgIz/ENvSm2t+6jZsYKeTkVYjn/eqwGAOp9aeW+2sdkgVf5UAQLKY5MHGferNv+6IM + XT07CmyaeZIS1vtmkUdQKbZ+akOZoyqMe45oAvRzjUJPLLgSds8/zqyPDzwETagy4U8YwARWMbcw + NuDDePenPrbXEfkTn5hwrdqAO709LPSbbzlZdvqD0Ncnr/iufX793uWQrGdmFGBjpmstdQeFRHKx + 2Nn5f73+f61E7iLCxDnrjvQBaubtNypAxyRzg0q263DMsJIzzyc1mwyDeSD82e9XIGUIrSyBNw+X + 2+tAD3tSpcFvufrVZbdL2XbnDdjnGKnhs2nkYtcIEJ6461HMiJIApBVe5HWgB8mmtpzDzSrrkZYU + 65mRGYoBgirEkCStiJlC7c5IqjLNsYhtu0d6AKkshbAZcAdc81Gdwb5SD6cVZjYy5WXBVu/pWppn + h63urfdLdxR47MDk0AYjnhehxntVq11OVANuTj8q2/8AhBZ7mwkm00CYKQBtHXrWe+kTWS7J4zE+ + OQ1ACQX/ANrkC3DD0wODV280KQwM0jxheueKdZWcCrvkjYYHUHvRe6jFLapHtLKeDjg0AVrDQ5xd + xuhIUEMHx8pH1roZtH+2W+dPIbHDMOcms+81YNoqWltlFKhQD1HNP0e5udHsHFkcyMRkDoaALUPh + aa1n8yUgqRgjPOO/eq+reDkvHzoQYIB85JzzW5HBLqWmCSWQJM3UEdB3/Sk0S3uNPmIkBlgJyXAw + o/Ci4EHh3QYfDsfm3mHklGGLdFqS91HSYpvMw0jjkhTx/KqXjLUg8hihYiMn746H6Vg+QYxuV9vH + 1oA3xrem38TNe28rqp+VUyD+gpbTU7O6ylvEYoEBPzjDAjp2HeuUk1aeyfNqMH+8BTrvVhqEAMuP + O7n1oA3X1Q3U0klp5S7OGHFZt7rj4DwxlTJ6riqMTiDZsHTn6/WpbfU5EP8AxMVMqdFIOMfWgCZb + lpEO/GDgn9K6bwZpktjcC7lUsAMYPvj/AArBi0lrpc2sqbZsHbjkV20SvDp8UUZBcDp60AY+ueIZ + dIu3Frh0lbD+YNxAPXBPSqLrpuunyNPBSSM7mZyQpJ/KtWQ2uqvNDcjypQjAFjnJx0rhNYhntbvy + 7jcucgIe9AEUMOy5ImYgg4xViVVa4UFSoToc9a6DxZoEdqv2rTsHzDlx/dFcujFpG27vlPGe9AEi + anPpV359o7b143jqo/yP0rWs/FSavF9l1JltlB3tOerd+axl3XGfMXC9896iu7UbtyYIxg0AdTc2 + Vrqe3+zZxIF4Uj+I1S1Hwpexu0kts8aL7Vg2t9JZ8REjJ+UD+Guh0TxjeaW3/EwAuFAxh260AY8y + ujfLkBOCOuabHcqgCxYAbrz0rsbSysfHdzks1rO33Y0AwTWd4h+D2r6M5mmt0ER5D85P1oAxLfWZ + LSYrbnAb5eKnudVnyELFkHOcCqUmjzRzBWyD9K6W38JtLo6TtkLzmgDHtryGZiZUDZqDU1Vl3wp8 + g+9jsf8AOKmGnw2cpE8jFR1I7VdGjRXMQa0kdoSPmHrQBn6bYnWz5NydjgZVgORWeztBK8ZBJQld + x6nFdZ4ZtoNI1QPI7O+OB7VX8faO9rdC7ESrC4BJHqaAOcgUTtuORiraW0M9yiXLAIeoPc+1RWar + u6Haxq7e6ekEZkBGzGVz1ptgVprUw3ku3iJDgDPUYFEzAwZRN2CDgUw3JEkezD7+xolvytwn2pVV + RkADv060gLVlMk4aLIDHp7+1Vbu1+yzgThiHOOelElyIZl8v5CDkVtxWkGtaYs0bMblCcr/KgDCe + 3LzsN20L2HepUQJnHI9KsX+gT29pHKCd79qWw0u4aPcwU4796AL+meIr2G1aDSbiWHOMhR1qxZXz + xXBl1n/iYBBlg/FR6VZW1nciS9mdJADgYGO1Q3pIOOu5hz60AO1vxLDqluP7Pt47eJSQ2KzvtiSg + eWuPpU89gsfzH5cc+1ZaSpbXRZT8tAGjjz237gNuPwrc0O48uUPOM4GBXORXC3HmJD1bB/QVZivZ + fLwp+71oA6fVfEiwXC+UBGjfKTj14qZbi7gtJWjkY2zx5C9s4rnbCRdZiaOUkFQTke3P9KbYa1c6 + XcBARLEWxhzwBU2AotqzH5Ls5YdFPOKmiu1KgxfvCOqHrXTL4EXxLbl9MO6bGRkYzXPal4TuNLu2 + ju/3csfUD9KoDO19yChhO3OcqO1VoZEUbHVckZL9x3q09s8a5uDkZxUDWX2i4OzgHvQBLCwkwyEF + c4z6VNDZm7utkROCfwqCzAhuGRhhV/WtR5okjjkQ7ST2oAlSRtMdUjHzR1p2OuOI2Ly4kHQViS3K + iYBMsW5zSNF9klEjPnPSgC1dzm4uVKSMZd4JP41oeJPD8+r6ZHLbwmW5H3yCMqvr/Os6xu/tDfvU + CqSOfWuj0yf7OxLO2CAG9x6UAZs6vcIqSiVw3GQMisR7RVvpFkGFU46e1dN4c1hYmCXm0quDIO9c + 54quVl16drdDHGzZX6UAV5bTzWIi4Ws6/DQEoQSpI5q9BfywxkS7WU9OOlMa3F8hG7bj5sn86AKc + ErggKVA96lFwLcYHX3NQPAHnYD5e26pAnluA/JoAu6JevFqsEqs4YN0HQV39p8aL+CJVnWKWOP5c + OAf6VwCzrbxAIMMefpT48zEFD9RQB6hZ+PNE8YqsfiJFt5GOC0abcH6ioPF+i2/hiGK50xmuLOQ4 + AjO9s/T8a8wlzLIdxKkHIwcc1s6R43vdJi2xurxsdriQbto9RnpQBal1C1urtzcIVjfqu3FRMNM8 + zbpplViehyAKnuU0/X4N+ixtFdR/67e2fN+g4xzWPcWzWFyDL8gP3Qw+9+NAGhqulSWzpJHt/wBn + Bzj2NejeHLG28f8Ahox6/HsmA2DHBGO9eTrrksUTKSOD0Par+n/EnVdMRVsZYgpHIK9u9KwEvjn4 + eTeF9UY2Jie3HI+bJFc6b6eMkt909j2rsrTxpYa7bGHWYpXlc8Ord/yrOu/B8gEjQul3Ao6RjLL9 + cGhaAcu0skr7mK8HtTjEAcMMk881Zm0l7JXxg7uQBywqqzysygDBPr1qgHSWqzANL6UunXjWBOxW + KsaZcggbu4HSlindrf5ANxNIDqblPteiWrESNC2fujJ7Vd0bRY7KLfZswWYZYSdT2/pWJ4Q8ST21 + 1b2krIYj8pBFdd4k024ht0nsdpjA4AHNAHO6npkSs2SwPase6ieJcSYdenB+atGbWykgF9G2cHvi + qGqMxiWW0GFyCSRnFAFeSN4yGiLE9we1QXYEhzMo+bnAqaC9YzbpSGY8CoL/ACwDQ80AV1mxdJwQ + q9h1qd71WHU/QdqgDO0gJAyevFE4WI8dW60AafhzUHt5v3ZAzxVzXNFku/38Odg9KwbK4ELA4z+N + ddourgQKJsMv92gCr4Y8Qy6VGUmkdLcDjn5/8a6vS5tM8SWTG3kkaZeP3xIyfxrmPEuk/ZXF9akG + CY/LHj7tZy38tvcxSwnYw7DpQB0viLwrIigwhcHqAeKxDpbmcgJtKjOfStXRPHgjlEeuAzZ6bf4e + lajX+navE4gZIyQcFmxQBxd5ZPG+9iuDxmqitHGR5oO09M+tdDqmjNsDl90YPBHSsJ4N7uH7dOOt + MByxj+EkE/d5qwYGkUNu+VetUgxVz6gVNAryx7Y84J5PpSAeZWjG8A/Lg1sabqn2hF8wnniqPkK6 + qk/z/TilaEWo/cgqKANPSbRba8zM6MXGDzVPxHYPPOzOOVPy471R03XmSRXlQEHv6VstqaakgJKh + h0X1oA5jBjYrP8uTkA9TQ0qoxLHqPyrQ1+z6TMu104x65/8A1ViSsVc5GdwoAseWbkDyQWC01QVv + S+5WGcbe9OguTFZqIjhxnPHWnWTCO6LyKjPnpQBDfs4n3sMc8Y7VPBKWT922498U7X0RCjRnJmAL + KP4aq2rtA/ycBu5HXFAGkYg0GT8rY5J5qIw5jyMORxU28zwAou5jxj1pnktAzCUlT1xQBHFP/Z8w + dpNsg6ccj8a6jQPFNjqdqbfxJbvPM/yxTE/LF9c1zsNsJ1U3EYIP8VPe1iicCORsnnHTBoAtat4Z + mS92Wn79WBK7aw0ia3uXW4jdChxkjvW/Z+KLjTZFd4hKwyAc44qy+nwazpxEOPNdvMdx1UdTQBzb + AbSNyqGPf+lWvDPiW58IXDtZzOIpRiVVON4qS/0ePcG04/aYV4Z8YwaoPGJrgq2AqnAPY0AdVdww + eJLX7XoxSKfbnyRwzn61zGooyMzsreYpwQTyn+P/ANap9NvX0S4DQtzu7dhW/rel2viWzWfRiPtC + L88a/wAfuaAOQEvyDepIOOamtbFJZWKzrH7Gpk02QRBLgYYHkDtSTaf5LBgM7u1AEVxbS2aiSNfm + xw3St7RfiTLFZi2vUe4VRt44xWJDczTzoLoFgvO096bMomlkaJfI5ztFAG7Jqdlrcm2WNYHA+82C + KidbiCAoVLWzfKoHOawo1dyGO4bQcc9frWppOvSwQLDcDzQSOvbmgCjcWBQsqDYwOTmo44BdAZfG + OeuK1NYdZLjzCdu8dAKzpLYQt+6OKAK88ciXREQ3AY5/Ckmt3dlMoznPSrMU2zJxgD2zSSRmX5kY + gdiO9AFWO3KSDgqMjrXQ6fYuUAjG3HO7rWRawNeSDLYKnHPeunVG0bR4ruTnc20g96AHxn7ZbNA7 + qzgcVzup2s2mzOl0CAT8jYzvrb1TxpZ3tgr6fBFFL/EUqpp+pJqpxeqJAPulucfSgDDfcjgxAqSP + mB60xXXlZFBPXpV2+tms5W2oTnpk1nht0uZCAfTFAG9oOvCJBb6jueJj8qj+Grer6XFCqvHMvHTA + zmuajlMUmWHznoKvQ6tLDEPtKeZnsT0oAkaBVLGX7x54qOG6NvkEEA/rV2dYLi08y3fMhH3e4rMR + mkDLOMkHg9KALcN7vXI4Iq9ZyG5jw7An1rFuWMWMAopxTzqMkIxZAuOpINAD7ZAcg9F6VqaXdRFg + pX5h92sPzRbfKQdvr61c0+4MjDyxsYHkkUAdA2lvdQ+ZcDIPGOuawNY0wWNywjwVbocdK2E1ubTF + +T5gw5yM1Lc2kOqaX5kXMxG4nPT8KAOSUSKu5VGM03aZmRo22k9Tird26Fgp+6hwcVAZfNmCnBVu + mKAJp7N71FDcuOI8d6pJlLlt+d44PoK0dTZLKCI2HmCZQCd33c+1R6iqXKpJBu34+bPQGmBNpzND + bgH7zHjPapLiXMhEvzMRwarQXG+ILcfMP7w7VZjdHj+QgMOmaQCRF7AsVBZO2am2G5t2kIAJ9O1V + 2vzM21l+UU9Cjj5M8eh4NAAIXjUeRl8/pUa6k1hGFtWyG6n+lWYX25Y8dsUs9t5tkVkK7Tz7+tAE + 9l4hAj8q/RUf+Db0P1qZ/DUWrTO0paK9cfLGg+Qn61zc0SeYc53DgVr+HNfk0u623LgwSDaxHLY9 + QaYFa80a60G58vU1VmbqF5AFWdC1k6PqaTW6qyEbSD+FdRJd2s8IikZJbO46MTmRB7nr2/WsrxD4 + QjtohLo+9kHXPb0pAd6uh6Lrekm6hkkQSRgNtQfK/p+dc1f/AAsuGUnSWSVScgynbisHQfGFxpki + RKw8tRyD0z/nNWPFHji/1lFihkCxKMAocUAaNt8NNSt3bzYrYsnT5xTLvwZYQTIuqzlLh/vqigqP + xrk/7QuIwRHcXG4jnMpP9ary3kzhvtUkrSH7p3E0AdXqPgvT1vI47K4kfcCcYAx0/wAar2ngu2uW + ZIJX3pnjHFc3DqUikfPIGHU5PFb2ka3PDe7dPZGGzGW7/wCc0AX7LRLSzcxb3eXrhhxVG78JeVcA + bvvcVfEgudqaoyrOrbiV9Pwpmo311pMnmWmySH3w1AGRrXh6TRfLMq8yfcHGPxqxZ6fpmnmNddml + jlk5+RQRx/8ArqO51ptT3vMwWU9iOF/CsOZHnkIkYu3YnmgDo7qPTtPszcWTu5LcAr1ycVl6p4hk + 1BRbsCEXkCqEGqz20wEWGEZGAeRxVy+vRqV2JpUVJiACQMAUAZ0+mvaNuuz88hwAOmaktbt7C4Ub + c8jvW5rGkp/YUEsRM0nLSf7PFYogSWEF/lJ6CgDWcjXyuMhwOAO9Y09hLbSyKy9+pqzpM9xo90Jr + co2OMMM5ropr2PxBYGK7VVXBbIXG4jnrQByUI8xSADs6HPWpPLIjGxssvr3pxQmcqx+VGwFHenJI + gOF5oAW0jZB5nQnnH6Usnzjrg0rW2/8AeISD1x2pWR5VySNo60AQBX2EzHIXpSQJ5kjOOFpLgrtI + iLFvWi2Y3CFYuoNAEt4myTBBQ46Gq6OyHKjGTzSyyyXUm+/cnHc0+PY42RtuDcDigDS03UzdQlHG + WHFSw3/2CX99lo+hA64NUorOeyG9FJA68VJFaLqNu0hkIlXkgelAF3VtEjvNMF1pKOctyPTFc/bw + tGVeMfMRzW54f119M8yJ2IjlGzk9B/k1p6f4fsmi2xXsUmeP88U7gYV5Et3aQlWCsox+NR2eUnWG + 7bdvrZ1TRY7FXjuQsatzHJ7VkyeXbxnz38xl6NmkBFfiXR3MDKQjHI9xUMV0ijMnNdBZWbeJbUcC + SZU+U454rFu/DF7byNJcW0qxqeeOtAE0EcbI+4nax49qnKNY7CCG46Vjw3DRHO1gtaNrqPnBRKu1 + R0Y80AXYDHPAzlPmzzTWG2Evn8KafMMWIsFfamKxcAyjAHbNAFSeRJpOBg0xrXykVjyp6VLqFv5b + AqwTI6dal02ZZ5VjuMNGentQBJZxXFtFuUZDcitDSPFrwOYrkFkfj6Vl30l7p87RpKRDn92eoIqG + 31gRxk3qMzqRnmgC/wCJtIa2uzLYfMjgEj2rNs70woyIMjPLHtW7Y3y38gkUnGBke1R6p4dS/mNx + obeZgfvIVH3Pf3oAz7W3EmGzgrSSRqszF13+4/hqOOLdGSrk5HO0d6WCUxYaUMYhw4HegCM6TLcy + Ztkd0wckd6jtZZbPiI+aqnlem2tTStXNvcbYZyiSA4QcdMf41Y8Taf8A2dZieGMR7sAkc7s8H+dA + GVJqTT3AKtjIxtrStNVy/kyLuUj1rAlhG4NtKqOc/wB+l+2SpP8AcKMn3s07gdJdeHPtLRS2zpCr + csD171laro72bGSFWZRwzHpQdUe8hTDEMg5xU0N7Pcx7GVpIf4lzSAwlk2yAoevUDpWpa2hvYeTg + 0mo2UM8w8lPs4HUDvRpsFz9oYW6NKB07U0BbjvptGhkgJDRMu01VLRyyIYQSgA3HstVdVMiSlZyx + bPKiksbyS1hdWUmKQ5K0gJpt8UgAw69iKn0/UyJdrdOmKIPIvW/cyLEqj7p4zUEUIEr+blHXJBx1 + oAk1O28q6VoSFVhk1GbZQ25TzUlvcfakIucKAcAnqaWK1cyFkQlB70AJvJdNq5I4+tBcbCnCjv71 + LIVcAowVhxj0qO2t9zkXHKt0bsKAIpbPIHlKWUjk06wgaNiqIBzViF/kKKwBHA9aguI5oX3REk9j + TQErWypGPOGc/pTLTy47gMFyob5fetB7EmcG3G6N8hSTjNWRpgsws/y7ouWB70gKd5dGSRcfKnIP + HFXrHSYL61e4kfyVVcYA61lC7OrxurAKxbIHtUtxfC2sTDA/A49KAEazRmkEw+TqG9as+H7YSTeX + bvu7ccYrIt7qRdobPLc59K6jw9pf2KUXcJBVjuI/z9aALF88MsJh1AiRoPl54Iqt5GmXUG3ABx1x + 0/WneMbGfTryO8VB5d2N6qfTJHP5VBoNtFqUb/b28uU/d2d6AJLPV4dGtP8AQyokHGKgu/Fwu9wl + PXgj0pmpaSmnOxmYEdu5rOht2knZ4FX3oAimiju3AtlAznrVWSAW7OC2HQ/d7VdNjLaMjurbSeMC + s+4WS41BjyEB5zQBcgnk2ARnJbqKZcydmZt3fFVxB+9DRkjHfNWLh/KKGTp/6FQBGLg3C5PzFeBT + LeT5yEzlB0p1zb7wGtzt9RTNhWVQOHPWgDc0iUajbPbTgM5GE9aydTtPKk8sKcDrk9adZX5+0FLc + FZM/K1dPpmgReJLR2nOyZDhQT1z60AYWgXYtrvy5cFXBXA9+OtGpLceH9YIsZ3BwGI4+YHsaNR09 + 9C1ERTFTMjBgE6YyO9S+IoDqHlag5++RGPfGKALelpb+IbtA+Ldk+ZkXofxqHxFpn2Vpv7OXdGOW + 56Vk3GpCBQB8pB429a0bHXN8kX2gKY1ILju1AGakfmFfJXLN0/z+VdZYQG503yda5xyPp/8AqqXw + 2LKJJvsqbjIdwDL936Viarq8u9nhA8sNg88/TFAGrdeFbeWBHscSL/AM9DWRqnhObyS7KUYdfetH + wkx1Gdnm3rECAB6Vu674psYbIRxeZuHBJHWgDzZw2nybQMluDVnT9T2PsJK56Ve1OS1vJ/OhOfXj + pWVdWctu/mJhgTxQBeYrOS0xAxTojJHKHspCQ3GPSqaXCTuqpnf+lTQIJ5XRXwy0AaN7YxzWzT3I + /fSHp6VnS2LI8Yt13kj5ucAU17me4hYbvkHXJ5qvJfDMYDNlevqeaAJTAVJGBuHPFSWuoMN32iNW + UgjOelVo5vNUvg8HGKVollOIG4HNAGhb6dHewhrVy8gPK4qaFTZZRssT1GKzLWd7C5zDlS1a9rq5 + vU2uFAIznuaAK93po2GSIEjqefu1C8QZApc+uBxWnbQpeyCG1OB1cnjmi5sUuTlxgpTQFBAYCWEQ + bjrmmsHvDypH0qYqYGPlk56DPSnWFuz3BN2MCkB0niGK10bw/ExCyMxwhVskH8K5O98SPfWixqPm + AxkjBNEkkz2iQSzgqn3U54rPm4RkY4YEfhQBd0gPBMGnwc8fSpvElpFBIGU5Y4Ix0qjcanIkKBG5 + 7VGzPdIHvF3P9aAHpGtymc4Ira0fU5YYUG7KA5P0rAEgjOFjfHtVqzndD8ilFkGKAPTri4h1fRrW + DVAojmjwjdwPY/XNcJK6aTfubdjhDgc9a19PnbUYLW2upsRJ8o61S8WeH1sryKJ2AeRSUb1oApTX + TXpaQMWJGcdal8PSf6UTcj5WOKz5YW0zgTKZG44Bq4THLpSqj7LhWJdsdfSgDo9e16OGFba0ji3p + wZCBzXOoYZp2N2u0Mecd6Zp12cIbkfIBzTbwRG53W4wp5oAbeWVmgY2ZYeuTVC4SWFAzjdGO5qws + HmK28jaTVi1vhaR+XfRGeJhtVR69jz6dfwpgZEcrPcAp92pl2IzMxLuRwamfSJZCXtnRhnLgcFR6 + VWc7J9mNpbtikAW9w0MheQj5ea3NG1Y2sPmWhCvjuf5Vk7UadY48RseW960rDS11C3b7EMzL3oAt + 6hpn9pZu4GzGq7djH5g2PzpPDsMV/Y3Fveg/uVZl+vNJYRy2KhXfcB972q5aRw310/2eZLbcuCWH + X8qaA4yTeT845B4qaEqjZlVtzflV+80qY31z/Z8T3ENqMs8ZAAGcd6zoZMncEwH6H0pAdDpusLZQ + 7Rjc3ApkFoZJHmY4iAPXpms8R7oh/Gc5HtXQaALbUtGMN6ApPHrzQA/TvEdsdOWD92rRk8gcmud8 + QXkl1cZzlfapr3QP7NujGjfKTlSKzr2Jmdgx/wBX096AIkn8ucBQQjdat/bWMLZKOOnOOKzdjL0P + BoiXe2Cu7vQBpxC0KAyK2488Hiql3LskbaDtbpjrV+3tlubYC2TExGBVe+tJNOAF4PmHNAFO0meG + R1bI9jU0iK23zcbsdagWYO+xOH7mrkMWYcNgkUAQwKGA4JC5pzyFmPlEADt61asYIgSJWA3dOKv6 + zosFpdxPaBGVlG445BwKAMwuWADAbqs6eI/3hl++Pu1cj8NFyrRncAdxb0psElpY37NMhljD4YKe + poAsWmm/aIjKknlsvUnoalhtHLcbiueucA1Uu9UMs8wt4SsOfkUnkCrOmXcotj9rkV0HSLnmgDoD + 4JSXSzPNNFJhdwCkZX9a5+K9gD+XPgDdjNTpez6ZZywwPskcZbk/KK5qZ2llPmvvYnrQATr8zE5D + N1zxRbou7951anhZNYuUVFw7dvSp59IltXdZ1IZKAGvpLNGfLAfufaqDCSKUEkgdMkVd07VWs7oG + XLL0x60+7ePUjyCpByMUAV3bBGxsk1ZikV4gAMkHOKpzW5SUmN849qjjnlil3KODxj0oA6KykW7t + yJW8pk4BFdxrGhwax4TS5JWWaEBEY9QDn/CvNrPUfJmBcZDHLV0s2vsfDMwt2ZYy4z7cGgDHv9NK + yjfD+8bgYFUNRtTps4S6HlkjIBPU/wCcVeN86xKZmJlyMc5p/ifU5L/RYVmto9wJUyZ5oAy01Dfb + qZV2xnoKbfX6NEv2ZcHHWmPLFJYQx2ZLTL1U1EIJA+2bAJ6Y5oAIboyDb0PU1c8xLkBJLna4Hy44 + 5x06VAbZbdcyZ3elNBXeCRjnOaAG2808N5syYmJ7fx+5q7tW5QCZQso/iqsULT7rXLr6k4xVi0dX + +9kmgBlxpbI7SxqZAoGWz0p+i3txZ3AezJAHXjrWlZ26mFyzEnPC+vStzTLO3vZ1M8Yjwp6Hr0oA + 5/xFqyrIggQKrLlsdc96xpQZ5wySbu2DVnVYQ9/MJCSitxVOQFW4G1aAOm+H3iGPSbie1upBDBqC + CKRugwOfwrI8VWsenazNHZtvs0fEb/3h6j171Elg02N65x6Gt200i18VwwwXcjQ3Fou2NQMiTvye + 3WgDn4riKEhkfKf3h6+9aFlGLeyS8eT5DIMoDnv3FXZ9I0iwhJFxJLMpwY2ACg1TvvISzMs77S5w + EUcUAW9dH9qW6y6ZKBgcgdawoNOu7iWMmNiWOMDtT4Jxb5e1bKuMEHsfWpNM1ZrG4WWFmct0BHSg + CprWivp0u193mMeR6VHa2jmQbVH0zV3WNRkv5mkn5YnjFRJGBMjRMScdKANvR7OO1u4pS+SGGV68 + d61/GnhSHUYReQyqsZXiPI64rK0S5hRNzfePXvWr5w1KIwwucAccUAefW1q8kqiT+WK0RpdzFFuE + bFT0bHBqxrFj/Z87LjDZ/Km2ctw7Kgk3KO3SgDPQPuHmqNynv2rRs7hrhjDIcDqD6VPeafDfWbbC + UnUjav8AeHfn8qsaL4bl2pLcYWJT85PYdzQBq6dfjRtKX7QnmC4JQH07f1rIl0SztbsSrcoQnJQH + qaseJ7mBVT7PIXtDwrYwQ3esOO4RrxvLZmjI+90P5UAXrm881T9lHOeAOareXPH+8BKOB19Kb9rF + pcq0ILDPc8mp7m+S6k3fdKj7vWgB8Gtj7Oq3AZ3fCs7DmorqxQTbl+oAqJJlu4gJMKwIxT3kNq+H + G5/7o7D1zTA7Pwpd6NBrk5vQwMv3Pl+7UnjAwwXX7tFe3l5UjBbHvXP3GnCOxhuo2IL1G+qPcFYX + cknoT/n2pbgVZtGFxZvNbH5VOBk+vt+FZ8lrPakrcqyHGcEYzWidWS3lCxAlVPUdDWxf6pa6nLH/ + AGlH99QoI4wTwKbA45pHEirjk1asbxYZCsoDYH1rV17wyumSKVbeGG4Y6gVk/wBn7UdgCpPc0gLw + aEwtLKMDtWhoNykVwHdd8JGCjDIrDkSW1g2zOhVhkVLo+puSVlKlccYoA6Dxf4PbSLRb21wto7DG + W7ntj61mpKdXtxaOQvlfMCSBuJrqLfWIfEvhg2muKzQoN4CnBJHT9cVyU5hEjNbB0CHABPNAGTPa + fZriQONjqcZ6flUtqqB1SRmMr/dJzWlDaLrEUh1Qbnx+628ZNZE1s9nfctxEccjpQBO9tLcy7Zjw + vfNQ31q9oee3A75qe2Yyzby5OKiutRMsjKQDg4FG4EVvEyfM5xnsD1q5bbzKHBAB9KrCJN4YMd3p + V+wt8szRZUCnYDXsWSGPz7jGI+SMVVuvErXKEWuRk9QMYqXVyLXTUyRmRcmsSC4EAO8D2pAXxbma + IMR8w7+tVdRtkUAT9ew71as7wsF2nFGsKodDOMzHo/YU0rgULe7j098qW545Gaki1FIbwzeYyzfw + EdvyqkyGSfaw+bvRcQLayqyEnAyaQHR6gi6/pXnBER0IGFHzN15rnmlXyTGRuQHByeQau2GrS20G + 9OhO3H1//VWhf6RprXbXmnrMtuYsOjNk78DkfiDQBi2rpHIVQjb1otHPnBZAMAdRVUQiW6Bgyis2 + Buq29q2nXJjn/eDsycUAOLCG8yg9zkcVCzeVIZY+cenekN0LqYRSHAHA9aLMCOTy5BlTyPegCxa6 + ltkL2+ORzxjFWbTXpLSV3Y84+XFVJvLilKjgVFMpAyBxQBq6prEF7bQSzA+ZJ97jpVRGjDbUJAB+ + U+tUywlJUdE6VteHLK3kuoDqQZ0zyAcYFAG3feVo+io90u2d13R/LyR35rm77VZNSmzC5SEj5hnH + 14/Otu+hv/FN3gTWywW4KRqQM4/OsUeFZp5miaVAc9R0oAaXWa0EUWCIjuA9PeqEMbCYM3G77oAr + bi8Gz2YDmeLc3ygev61X1CxnnuTE8TvPb9fKXigDMuIJFlBdtzHnAPSrEF0IwDCm5hw2VNRzxTWt + 0BeKVMnTIxj8KZ/ahtgY49uT7UAX7VH1K63oERVOTxiuu0ex0nS7L7chJkm+R1kwwyPQZrh4JJDw + zbVbk4/OrNpefLsnyyg5UUAf/9k= +END:VCARD diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/issue64.vcf b/vendor/sabre/vobject/tests/Sabre/VObject/issue64.vcf new file mode 100644 index 0000000000..611052907a --- /dev/null +++ b/vendor/sabre/vobject/tests/Sabre/VObject/issue64.vcf @@ -0,0 +1,351 @@ +BEGIN:VCARD +VERSION:2.1 +PHOTO;ENCODING=BASE64;JPEG: + /9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQA + AAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABQKADAAQAAAABAAABQAAAAAD/2wBD + AAIBAQIBAQICAQICAgICAwUDAwMDAwYEBAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkN + Dg0MDgsMDAv/2wBDAQICAgMCAwUDAwULCAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL + CwsLCwsLCwsLCwsLCwsLCwsLCwv/wAARCAFAAUADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA + AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB + kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn + aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT + 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI + CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV + YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 + goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk + 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8J7JbO8tYo1tIFCDLOVG5qfdaVZRwmSOFWzyA + F4H1rLt5WViMhdp6HgmtKK8O3B+4Rhx6fSgBI9FtjaNN5aErwRjilSys7lFAt41xyTtqc2yJCVlY + 7eqgGqv2jyLcebjZnGPWncdzT0+w0u5eQXtrGiBcIyoPmNMXwpb/AGMTSRRbH6YAyPwqK21GKdfL + BAVfu+1SQX4jnjKFsp03dPypCKN9oEaKSkC7R0bGKpnSlSPdHErZOORXV3Ouy337sCLB6kpx+FY0 + t+VfyrgcbuCB1oAfoMemrcImq2sZX+I7ATXS618PdK1DRlvvDEaMq5LoV2nisx4LVrUfu5BOePau + m8EQS6PY3HmFXjljKhTzjOf1oA4mz8OxvMrLbW5RD8wbByKg1LRrRriRYY408w/KAMba1pRaWt/H + a6a7CVm2u7N8lUPEujzaRekzSK6tgqVNAGNBZJauY5Yon92GTRJp0ROY0Un0A4q3c2odkaYOMjii + KL7NIDGcj1NDAZBplmmWv1xnoFHStfS/DFpewqYoYm3DutZ8lv8AapdyOqk8EVteEbSe3KBSrDrQ + BT8S+HbawiiWGCAPjsuMnPesqHS4JSFlSMP7DitbXbvfrkkM2eGw3p+FMfTh5X+hr8w7t3oAhOhW + u8MkMZUY3fL0Heo9UsrN5FFrbxKmMBgoG41fWFra0Acjpzg9aoXjtgRoo29vagCoun27kbY059qn + bwykskYjRArdTT7GEl2UqMr2q/JtVU27iR15NADdK8DC/wBPle2iicxNg5ALH6Umm6FZ/a3ttQt4 + g2Cqnb0PbJ+tamn3j6ZCW0nILfeBORWVfO4dhLw7fMW7560AZuqeHf7MuTFcRpv6qVGVx70q2Eci + QwyW0SsPvOqjJrUtb6S9tHQKGeMZYuM8VUs7gRxbrncy9mWgB1x4QtTHvsQWkHJVhhax3tkhugHh + UkfeAXIFdPZ3v2uxkQ9G4jI6/j+tYun3r2Fy6yxeb2Py5IoAqXenJ5xaGNNvXH/1qcLSGeBdkSg9 + CcdaswC3be0pfexOMnpn2qaS1KQkQASKoydvLCgDNi09RKTNCuO2BxVjSobc6gqXMERQHkleDUsc + u9VADbG6qOWAp11bLbptkjlCkZRsde9AFi5sbO3kKfZYTnkHaOlVbuO2F5thtYcADjaKXUpHj8ku + Co2VDFL5wLeg696YFwQ2z7Qtlb8HJO0c1Zsr7T7a9kL6XazZ4CmMFRWfHdkEgjGRjPpU9raP5LSP + j5h2pAWdQ0+z1KdG+y21qvcRqBn8qXSvC+iTu63ssqyE/IAuR+NQwSrGm1g+c8E9qiSQW9wPNYYP + OR2oAW68GNa28k3lwGNHwvzDJGfSqM9nHBgm3j59QMVdmma4zIjsUBHy5OKp6o8s2BJjZjjAoAro + /nysbgYY9zWmLPCR+WQQwyaz4k2F/Pbft/GtKxvUeFN+B2x+NAEptsWpZSdo9etZe8su2X7pPFdU + LeOazKqVwevNYt7pw5EA5HIxQBQA8tAIeGz1NWIJvJlhW5OQBzjrUMR/eN9pwoXjB4qQ3ERJeYcy + 9P8AZoA0jf8AmybVxsHAFS6jp63ixmwjIwOfrWfaou12GcDpmt/w5qJhXc6hh2GM0AZkHiRpblVl + G0RjGMdxXQ+H/E0Rm+bjdw1crqEHm3EksY4Y9PTmq0cskc42qUOfpmgDovHOhLBOZ9O+aEnIUdRW + QZft1sgum/1Ywua3fDfiFDL5WoEPEwxzzirPizwTFPZC60kYUjcAp4NAHPSq91EoRS3061DHD9nb + 94Mkfw020v57GbcCRt4IIqzNcedIH2jc3JyOaAIYrRZmJxtNdB4fkGn2hluBgBR+NZ2n2X9ozAQD + 5qvaxGbKIRXkuFU4C96AMDxBKZdQkuEUkStuUegpNM1eWScAkqpHTHNPlwbjMzExZ4Pal1PS/s6+ + dY/6vuwPSgC9G8c0A+1xEknrnpUVxaeXNm2dVUfjVazvEZAEkMrccZzV1YYyBIhJP8SZ6fhQBSmV + 4JfMVT+96UJdSQdcMO4A6fjVmTUoJiqTOMJ/q+elRyQs0TtaxF0PVhzmgCzpd55r7YI2HHPTmrV0 + sDTF7gnJXGO4OKyNKgn80NbFhjoBzWjqdg6SISPmIBOaAKVnI1leyhsMJOD7CqOqRtZqotjiFulW + rhsSMshKH1ogsZbmF475TKifdf0oApabevHIAhCYOdxp0t59luS0I+995uxqpdRyWsrqmXGeCR/K + rVlZfaogqv8AvD/CaAIY42kV3K5zzn1p9jNLp6u/A80YPNWWsJNPAVpC4JAZT2HfFWJoVmVVjhVk + HTPrQBPoi2wsoo4APtBHL+tP1mS5uVEFxgJGNqH15plp5WmyBriMRsowM8UybXTNdbrpd6A/KKAD + xbJAGs44FIPlnd9c/wD16ynt/LiDW2SR2qa5vP7RnMs6BNuQMd6jhkAUb2K8+tADYp0fhj8w6itC + yQ3CFYeAOoqi8Uew+UMuf4u9T2NwIW+UgMetO4FmS6RJ1ik6HqxHAqC+gimUiA8DvjrU0kcE8ieY + itu+8c0+bShaWxksSZoM4b0SkBTgha0cq33Cuc1SvrrLFV6jpWqbuGe1HnnDdAKy7i3WSY7OT2NN + AMulWSV8ZDNzxV7SlbaFjClx69Kpww7W3ct7jpUtnNJHd5UjZnt1NIDdt7h7NQ7qGfpt7VR1XVEh + dhEpP94/4VpafexTy7ZlbBGDVHxFbQh1j04HaOTkdKAM5ZVlYso3E+tVp4w8gx0Bqd7QxNu+6D6V + DIoVySxAx2NAFyNmli2pjYBz61paW3lWrFS3BwP8/hWJbTBFJy2D6HgfWtiTWPsqxraBHyOeBg0A + RSoLSTdIepzz0606exTWyQGMXljORTNT1B7+ECZR5fHzDqapfbHjbFkTsIwSTQA43ptyyS44Paun + 8N64Z7Bre4YlZBtU5+7XLTQbjwN4Pb+IfWn2lw9uyrIw2Z5HpQBv3GirHc7LxWVZOVI71FNp7WDg + QYlIIGD6VvaPdi+tljb5yeAzcn8DT9YtbPSpVhDM87jJ3Htjnn6UAUIrJreD7Si7MDoKhv8AUxqt + pGt5GqIOr9zRfLM8ZFgZGtex2nGe4zWKN8rsDhYx2JpJ3Atx+HxcRSzWcpcL/CRwaj0zW1sQy3cS + nsFPSoYJpbIl7dm8tT8wzV7+0hqEO1Y4lQ9cqMn9KoCp9kW7kaaxU+Yx+5j5etWrb/RGxfr5bkdu + lW7KFILpfspDbVyc1fjNnrLtHqOYWP8AFjGfxpAc/e6Ql/GzW4AfqBWfpupS6Xer5vPlHmMjg10V + 5pp0u4JhYNGvAYHrUn2WLWrVo41AvSMRZAC/8CPr1oAvafdWOuNG+lqDekY+zg8MPXPX/wDXWZrF + tcWNw0erKElB4Rf4R6c1BpqyaBdbrnEcwyAc4x06H0rQS9a9jUTgOXPzMwycexoAw7u1jYb3zkU3 + Srtgdk54PFamv2C2pDQbWjcfKCeSa56aJld23YA6ZOKFqBrXGjjULuOKxKuZOTn+H/OKwr/ztOvs + uCrg7RgVLYapPbXAEW4EkHJNdBNBH4gtgyhFmXuw60AVpbT7VpiPJ94jLetQWsDRSIYz8mec1c0+ + 1nexdrw7GjJXk/epsFtDPG0bOdw+b5SaAKWsXA+14Y71FQi5S4RvlAC8A0y5hHmHarhvQ9BVGSQx + sUXPHX3oAmDCJ8rzgHg96gQ+ZGWbg9vahNRG7EnalkkF6hEXyD270MCWF3aEhdue1OsmNnMAih/r + VaBgAUY8561PaubdnMxJXseuKANhIY5Assp2v12itZtAgubEi2nb5xuKYHWubstQaO6SVzujTqpP + X8K2rXWLRF8xZJPMfjAzgUAcxcNiaRSpUocc96sW+yNgZCMVF4lvJdRvTOYkj52jbgZ98D6VWmlY + 2qCUnJOKaVwCzviibANwYc8Utkdl7tbKhjxmpUspvm8tgn16ipigSEG4G4pxu9TSA27GeFbRlGGm + P3cdhUN8GEP2hV3JjafrWfpU/wBmuAcZLA4/Sr1trkarJHcRmSEZO3uTQBmrcbZCLoDZ2x1qOHSi + yebJIAPQipp4kmbzI1EQJ6GtCxsoHP8Ap91GB2yDQBlSWO+M/ZsBHHzZ71XkfMIWNgGU9vSt3U9N + t9m21uonz0Iz/hVCfRkjg82FhtHDGgCuZ8EMjDZjBzSZ8pAwU7XbGT0pWtEjjAZgV4PFOml2QKqk + OoOcU1qBNYRSrdkrhw3BIrah8KwXoV/m3PyVzyDWNp999kccgZq/ea7PFAGgZlJ6EUgN23thpdi4 + V1Eucr7ev9K53V/ER1a/MkuWdBtG04zioLrXJ5wDK2XAxmqVqmZ2YPtHJ/GgDsvC3i0ppr2d2ish + yFAHIz706bRLNdOPnErKw4y3NcvZ3pjA8o4kB61o3OpSX9nbx3QIkU/MwoAj/sGaPzFjlWSJjk46 + ioYYwqssjIHHAHpWm4ESN9nYDIFZV+I7uVI1wrY5b1oAtafcvb3W4MM9Nx6U/VZpNRys54ToU4zW + KXaDKrJuC8cVdtpi1gzs43HNAD9N195bdYtRIUR4wD1NX2KuA9uThuSQelcsZwzq9xyzfezV/SdX + e3m8pXJhkPKkUAdYZk8RywjVVJES7U2cE/WtA+HDHohuY3Uxg7RF/GeaPBlxaawMW6rHKnAU9SOO + lX/FFv8A2bpzTQk+cpAAz93nrQBx+r4c5CODEOA3Y+wrKu5V1C1GFKznkk9K6Wzv49fs8Xf7y7DY + MhGNgrmtX0s2t66WknnKvUp0/WgCnbrJFdot0NwJxkDFdDYp86oMjjIArJivxbR7LuMyEjKitS21 + MW8auuW44H93/PFAG15aXdr5Uv7uULkA/wCFc+Yvstw0at8+eoq/p+rm6vRJMNwIx9KranYySXSy + WEZZHOCw7UARXFyj5STAk7ntWVf2gALLyfUVoataLbfLO2SO/Ws2c+VwhLK3QDpQBmz2xAyCG56d + 6uWPlnCkFcjoTzUBkMc/3cZpwn8oZkDFs8HsKALN1apDIHOeaiLkRkMOtSXE6yxAsRUcdxldswIJ + HANMCuJW8xQgOP51oacWPPGAeRUUOIZQzDhecd6mbIcbPusM0gLmq6bHPohlhDeZuH4c1zzF1+Rs + HByDXTae0s0IhjjZg3GPWqOs+HpLCTbNGyb+cHrQBZitjPEzW/LL97vinw2v2m2aORec9AKXQbsw + ygBBiX72TWxfaS8kiGFQAwz8vWkncDlbqNraT5cjb/n+lMGckx8kjOa1tU2TxkPkMpxyKyrhJ4Wa + KIDbTAkgvIp7URzgBwe/BpZYrd4vmZWNZ81x5cgBXDdzVlIvtUOGIBHpQA2aEROpR8DsB2q3bvG9 + iySzEsTkLnrVMqViCZzt7nrT7GBVuQRnODQA6Q+Sx80A4HApEJB3BAR9K19EmhkvCJ0ZsKe3tUc8 + Mc1yy7cpn6YoAzoUiclnYYY8AHpUl8zRxqpPy9qtC2tULgSMAvQ460lzIl9b7YiDt4GaAKMMQlJ5 + z9Kj8gIW5yKnS3Crlzhh6d6k0mbyZT565Q5z60ANtrRpPmhzWhbwy7DJcDhhwMdKlt7aK+gb+z33 + yKdxVuMCqaz5cqGYfWgB6yu8rBB8o6Gs/UpjGQXBGPTvVmSfyImyepqrqjbIw3WgCDz1ib9yOTg4 + NbVlNBJYvlVBHt1rBaPzQWU4IHSn2FwRJslJxQA6e3M0O4oAzdB6VXR2iKGQENGOK0ms1eAkFjF/ + BjrVGaAo371smgC7pety2kwl06Vo5AOWXmuwm+Itv4g8Ota30aWlySAJQfmkP/1zXIeG4Y5SVBB3 + evamXGly2tydwG0nKkHpQBZ86fRbpBLI252y4PGRWhO8Ml1IbJhHn+BTnNU9O1oRwvDqqhB2lHJP + 4U6awb+z4JdKbzdh5ZurDHtQBat5LaRHiaOP7QejEZKD/Oauy+FI7W3Bsroyhxkq3QH8q5a7ujM8 + nWOQnBqTR9burCT98xdR60AbbaHc6ZG3ymJsZC/3hVnw/fNIXt7hygHzZp2oeIBqCxzqfmCgEe3+ + RVdrmLVAEtf3bxfOW/ve36UAV7+7DXMu5Q4/Os2e3eRWkiAGOijtWrPodxfQmeNVAPOPWsppJIpi + JxsKcY9aAMwRyTSbpflx68VOYvOXb97OKtXAiZdzkqT0AGc037BIIRLHjsR60AVprZrZwGj4qTY0 + xyRj3PUVMJDduFfqvFRzxJCzrCzEr60ALEu+YI53c4qeGB7lGCnBU4FUopTBLvfk1at9R2sAMjNA + GtaXsnhy2FzPHvC46jgnNQ33imTXrkz3oVFAwo9Kfrtq03hAzEfJ5gyc81hWM5hhKrhgT0NPcByS + P5g2uVI98Vp6X4uuNGlyzCQIQR0bI7/1rNQxqW+05J7Y4qK5ZYUP2ZCW9TSA7SR9M8V30X9nMFZw + WfcNi5qPWPDtjo0pE7O03U/Mf055rmtFmN9E0DEox+atPWbiW7lSO8Ja4jQbcDC4A9PXFADYtM0+ + 6nc3u7aOm3IP6Vnak9tYt/xL/M445zTIbieOdmWNsE46cip42EkyC4hYx469KAFsrT7XEJgFPOT6 + 1s+H9PD3XlzxnL/MDtqn9pghgb7GjL/eJORWqfEnmrA9oFRoxjJ5BoAp6NqDW2pzRXtuyIAw3FMf + rVS4iF08pydmeCDxWvqeuC+Ro9qglcMw71mwReXD5aAlFJPPU0AZ0cEsbkSZKH15FD2xJJiJVj6c + VfnzLGEXAA71PFpDPaebE6/KOh60AYVws8TBgrFe57CmHUG25RVJA7AVozzSLbNvX5T1AHNY/m/Z + nPlqwDetAEtvqzJNu3FZBwQBjI96vPqkd3mRtokH31UYx+VZqWruxaFl+frkZxT1tvs1ujJgEH5m + PR/pQAXl2S371XAHI+Wkaf7VD8hGR2arKySylRccQ98DmiS0jifdsdgeODQBQd9x3IBx1xTYlBm3 + En86sXUAwPswKg9QeaBErIEj6nrQC0NHRtUjt0K3AHzDABGcVW1fTzJL51jyOpz0NVooispebBI4 + wK2YFEthk8qR07igDAgJil+TKtnnHFaP2h5yI3ZsgdSfaqd2P3im3BGM9aktsjmRgCOaAJZrMwR7 + 3A5PT0pdMvZtOning+byzuVDyh/A8VHczSzDPy7RwOKgiuHEewjKeoFAzp7TUNM8XXEw8RhYNQmP + 7ny18uNeOM7cCtMfDiS8uY0tDEYghyynjPbn864htP8ANhLIehzWzovxDvtFsDB9+PI4I/rQI0r3 + wNc6DO0N2VaQqW2q24YxmqFhYRgE/vkkDfMGBBP4GrSeJ7tZd6SxvIfmK4yQP84p0XiyC71gS65G + 00zAKGX5Qv4UAbFpd28WnIsBLsDzmub1+AXt1LJEoQqfu4xu+lbWsWgs4/NsCXjPIbqK5+5kklmE + rDD54BFAGb5cjybCrAnnB6ipEvXil2sM4GMVpFY7m4UNmNyOWJ4qteaM0BISVZe+RQBFHC2/zISg + B69KlIVhIHA3HuR70lqotlBulY5P4Vcls44k3u6N5oyoHb60wM6O1SRir5LemOKv2vhuW4iLg7VA + 6k4FTR2ax4aaVIwR3HWqGua5PcQm1WRBH6jqaQFzWbE2nhzynuIi+8HaHyKweJSEQEN6jpVcKyOw + cMVznOeKmtZvOPDKuOKAJbi0JYFf4eue9IW8sncfvdqnlvVFyFyu09abI0bysMZx0oArC4eCTcgb + juK2dNvE1N1M0ohljGQzc5A7cfSs6aweWAk7kTuapQysIT9mOSvG49aAOkvzLMxk06QNuG1l7j3r + PlnnJAuGJij+nNQ6XqT7wEYqyn5v9utLULaW7j321uiEjLqMkKKAIotbghb/AI8hKGPIBHNXLG6t + 7uzk3RLbKG/iP+Fc+8f2d1eFztzyD2q5p2oCFWRoxOX52nPFAGgLyC2lyZFKdB70r69buxRJBHjr + nvWVdeXLE7xE8fwnoPpVKZUnQPkBhwRmgDq7a9tLyARWiiWYngL1qG4gurJ28+NowO2a5a3v3smD + aa5WUd1HNbC6zI0KSX13JO7D5lbHFAE4V7pi0b5x1GazdUtXSM7v4iPw5rQ0/XrcXX75FgUdxzuq + /qFrp+sWRe3uDkc4BFAHLRDY42ycd6uPOXiiV+RGPlWnXOg3IQvEmIB/Ft6/jUUEZmMcgydvzECg + C1G2+Ly3YAvyM9qY88kaFcmmp807uwPJ4FS3do+Fzn5ulAFVrjbgS8Z4yah2C03SMffNWZdPknVA + iluQOnHWmX9pILvyY13HHK46UAVre7LSyOCTmtjSiy7VijLeZ0IqO08OzPIUiTI74Ga6bRP7O01F + h1KYJOv3V4BoA4zU1lExMrkbOAvpVcSifhjgrzmtjxPp7pO7SggOcqfUViy25hG5fSgC8rrLAojb + d7d6SexlEgwpRfTNV7e5LFBbKAwPNWHeX7TguxI7GmBPBExhaNVIJ6egqOVknO1fkx1J61aj1gLC + UEKlk4LVWvozC67kCFxkD1pAQ24e3uDLC3z9CR3H/wCqrczJdOGiOxvYc5/CocMYhtUBj3xU8Qjk + XbKPIZOjqclvzoAu2HiO60xPKvd7wY/1fGBWnJo8WuW6y6XIPMYZEAzuH9KxISonAuzuRzgk9qtR + 79KmMuhTt5cRyxznFADLzS2tMw6pAY5OoDEZ/Sm20TQQ74YwVQckGtMatB4kUpqreVIRw5+8aqXF + jc6bAsbD9yThWz94UAOmmjvrRCMJjOQRVS0sD9pLyABM5Of6Vdtrdn+RUGcZqO6uRBG0MuFI79KA + MfV7r7ZqDI7kohAVT6U2eJNimJQOuTnpSXFussrMvBz1pJov3YUsR9O9ABblRncQ3bAqY2EUwIiA + Vqr20ojfYqZx3q9bSKAGcYJPIoAoq7OCEQBffrRDGEcleM8nNPjuGkhHmbB74ApvmxltsuTnuDQA + +SFEjDwu5buD0qpLL5vMg2kEdOlXECMAyZGOMMePyprQRI5N0rt3BXO326UAV4b0Wt0pC5HrXS2W + qq9zE7jcO+OhFc81kbg7iMqeAFHSpLa8eymaNOUIwD6UAavjPQYYybq1bBmXcF9O39Kw4iXdDKcE + DAxW3q7NdWELISdiYIz71kz6ZNZNHI0cjqQfujIFAEtzAtu/7vODzmqlyzNyAo9vWp7uWSWJd+AM + jjGGqOWCSWRVVW2+uKAKskpWU5TP0p8c+ExsPPNTmCVD+5U/QrzRJHJGymeOQc45HFAFczh497KR + jirWlEsAudvII9znitEeBp7yAPZvEVPJUsP5ZqCO3j0yYDUNwliI6dOPpQBt/wDCR3Wj6eHFujvI + do3DIX9KoHXoL6J11CJYZAONlaWueIYtY8Nwx6ZHu2MdxVeTXKG0eaXKRuCeuBQB0mn+HRe2Yeze + MqRkFmwfyra0rwsIrRmvZICcgDLVw7xXFuFd2uEQfeAJAxUkkjSxh4J7gjPAErf40Abvjq1i0y4S + KByCdrfL+FUI7SR4Wc+WzMOCW5qhf3Mt9cCV2ZiihRk5qpdTSBgRI+R2DnFAFw2k6AqJZMjuD1qn + cxzyyAkPuiP3ieT/AJzV+01R7a2RpMZPVmGQ1WVuTqLDCptcfMBwRQBEkst/YMCSTH8vJqtJaoYQ + JPv1o+ZDZKAo+UnBpmrCBpRNp4/0crgZ9f8A9dAzCdGgkOynxSus2xjkj+L1qW5/fxYj+8D+NRWz + R4fzCd2O9Ai0lzI6mPaMOcZqW4uI7rbtJ3IMc1XScKqncQT0olPlKWfBz6UATKjSDcmdoFWtPCyR + kzckHiqUV0623lKVIPzHHWp7Ic/vSRz0zQBcCqdyT4J7YqC3uZdKv1a2UupO7B6H2NMglMUsmcnd + 0Lc4q3BmaMBiDjr60AWJRBfyb9P2RueWJ6KfQVLHqMdtcEysxJXayN0x0yKyWihWQBdwTOSdxHNb + zWEF5ErXhX7QQAMNge2f0oAnhs4rq2kksHwirkg9SfauXnJnmL3AbL9jXSRWh0N28x1cEfMqtnA/ + Cs+70+O9/fWRIb+76fhSTuBimbyyyKDgnipLk7AML1pZbCWO7Hnjn26U6ZykRL+veqAryuvm/Jwf + Sk3mo2AyHyCT6Ux5pLU5Gwg88gGkBPNAILUO3KmooyjL8ueegzTvPMsRjG4qBwKrW1sxJZzsIPGa + AJbmfp5q7MZx71NZawEi8qZSyHg4NRGLzCPtB3eme1R3Nutocodyd8UAaVtqEUDlI8/N3PaqV2Ht + X2x4lIOSwHFSWkEFyo+cD1BpbmNbNdkh20AMh1UiJ1c9RzWj/wAJa1vYiK1RmRvvetY5gDENxgnp + UlhN5TiI4O4845oAmu51lXzFDGQ8jnpTra4uJkBAOQavXvhG8tIhPawvJAfmY9gKE1COwgIiAZiO + 3rQBV866T52Qsw6YrXguZNTs0WSJ8IPnHr9KwZNamNumZSpPU4pbPxBeRy/uJjtXqfWgDodMtnXK + QjYeo3VnalpiXjMzXMKS9O9VV1ydCXkmLY/SorWwTVJTmQEt81AHTeCY49Mik+0SJKmOg71W1bxH + HLdgaXaSRNnjdzWapGlBBG2ec4GKtQ6yZD5hjLMvbIzQBfutWC2ajV4ywwN2OM/Sql/JY2kKGzU/ + McnBBqlf3Lam5e8lKMv3Yz2FU4VjgzsGQ3WgDa0ya0u7kxzgqCCcn1q43hizkEjRkOoXcAOua5Ka + 6Mc3ygEVb0nW57ac/ZC4Xuo5zQBBeZjcwuMxRn5fUUmnySx6kv2cgg98deK1LjT31pTLpymSVuWi + Xqv17U2GzFgFBUCVOo7igCTT7cnTp/ty5ZnyCvGOKz2uwimOY7geQB0FWY7tzu8xiqk8A96qOvmy + MSowOc0AVpkkgk3uAiP39KkjtonYtnO4cKOP1q1Z3K+X5V2N6OeM8gfWiewaxiKhDsAyJB2oAk0u + 1juAwniYshwoB61FLZfaJDv/AHWexpulXRNwpjkP7s8nu1Wd4uC7zfezxQBTjxZTHzlMigbdy8Up + YXEv7nPvk1aNqbhDhgARnFZMCvbzuWZgc/nQBo2l6qs63AJA6VIsiG4DI4jXP8XeqcbrK5JH3xkH + 0pWhWVR52CF6UAa8kUd7H8rD5f1p5txHAfNPasWRCjgh8D0BrV0a+DgCdfM3DaB9RigCml/JFPyB + 159xV+C/wfNHAbtUN9orxO3k5dhycfw1XmT7JarIjb1k6U2BcuNSVGDSAPu6be1QTXcO0CVSwbPA + 7VRtpftEmxW2Mx6HvUv2V1J2jkdaQBFJB5jBVYemetRyW6SqTKCfTFNllCHBX5vWkLBPvk4NADTG + 0ePKB5qdLN5NjycqvNQIpZAFVj71LsaJQBuGaAH3aCVwycKODUMsZgJjxv8AXIzUs0DpHhmBycjm + gOd37wdRjNAFETeTcARAbSeTViApfrhjufHXNJNCsUu18Z61Xit3Q5JxQBdW0MYKyn5hSf2BPIjS + 24I29T6f5xUMMrs5HOF71ooVmtMyu3ynAAzQBqeCfG7aaPsmuYkiYFG3HseKq67YQW2rSNpLCS0l + GQ5GSh74xWZc2SyxK4OZl5x7d/0rV0K+j+xPFOu4Pwpx0oAo3OnFreM7AR9Kp/2eYpxtyCx6VoXd + g2nSlQzMh6UxJdjqSpKgfN6mgCOLSZGkKyYw/wCn+c1YltRodoWA+Y8Z+taPhWz866DQqxLdmq34 + x0ZbS23yY3NgkUAcZcSyrjcc7zw3YU62meOeTazdOhrZ07TYLkYvSFVfmqveQWkDj7CW9zg0AZs9 + 8wbO3L8ZpvmGRsyZQDsO9WLu0EwZojwMc1DJCrsA5we1AFmGVZLc7Y1bA6nvU1gIyNzgxtnoKr7I + NgHO8dx0pJ3AYG3UnHegDRS+NpL5lsxh3dQverj38OtL/pKCKSPhWU/f+tYEt98xMnC9qgludrrJ + GzFl7DvQBq6pYNGdzHGO3aqS33kEBhlSME0+01z7OcXGXRupJ5H0q5fafFqNuJLLnofmGDRsBmJe + DzMEZGevpW7o8sN/bzLqTBML8oB71k/2YYh83FQRqbdtr7sDv60AX7jSo4ZsiVo067hj9anuNHey + jVizMj8gkdaqQyi+UxjO7O0A96tXDz6rEFucp5HygUANGEQKjDJGaqzWbzgyn5QOPY1p2xZtOaGN + VMo5BPoKqxa1NHHtmij+Q4xkUAUraZFiYScMOgNMf76CIZHf2q5KRq8arEjK4OTsGaki0oKwAEhP + uDmgCohEsqq/O6rrMNMj3AEdgfQmn3tqUgEcaYz1JFMtLdn0wpFGxYHhjQBa026M0XM2WQ/NnHzU + 6Yw6tCPt6rbpH0CdvzrPtrZ45ceU4cHk9qtzW6XLOjqwY9+1AEa+HWun8zR28xU5LAZx+VLaGSV9 + jrkr145amvEY4hGkjKMg5XoPY/571vaHFDr95HHqDMkoU4C9G+uKAOevoo5iSBjBxVYwLdRkL1Xt + XSeK/CdzpkjRMqyJ95SjbsD3rmJbUwoeuGOCfSgC9eWc9rcbbdA0KHPmhcq39Ka8e9DkBS5zk1X0 + /wAR3dvEtuTm3AwVzW/D4w0xIEivbOaSTAVWBAH40AYMu6CZDkFcHcTz6UrtkYlwVHIwOtb91olr + qtuRZSL5h5EX8VY97pc1jKAqZ2jB/wA/nQBRJhubjE4YOOnNMC+S+DzmrMkIA819wPTbjmqwfzcM + 4w3vQA9mbYwgIz/ENvSm2t+6jZsYKeTkVYjn/eqwGAOp9aeW+2sdkgVf5UAQLKY5MHGferNv+6IM + XT07CmyaeZIS1vtmkUdQKbZ+akOZoyqMe45oAvRzjUJPLLgSds8/zqyPDzwETagy4U8YwARWMbcw + NuDDePenPrbXEfkTn5hwrdqAO709LPSbbzlZdvqD0Ncnr/iufX793uWQrGdmFGBjpmstdQeFRHKx + 2Nn5f73+f61E7iLCxDnrjvQBaubtNypAxyRzg0q263DMsJIzzyc1mwyDeSD82e9XIGUIrSyBNw+X + 2+tAD3tSpcFvufrVZbdL2XbnDdjnGKnhs2nkYtcIEJ6461HMiJIApBVe5HWgB8mmtpzDzSrrkZYU + 65mRGYoBgirEkCStiJlC7c5IqjLNsYhtu0d6AKkshbAZcAdc81Gdwb5SD6cVZjYy5WXBVu/pWppn + h63urfdLdxR47MDk0AYjnhehxntVq11OVANuTj8q2/8AhBZ7mwkm00CYKQBtHXrWe+kTWS7J4zE+ + OQ1ACQX/ANrkC3DD0wODV280KQwM0jxheueKdZWcCrvkjYYHUHvRe6jFLapHtLKeDjg0AVrDQ5xd + xuhIUEMHx8pH1roZtH+2W+dPIbHDMOcms+81YNoqWltlFKhQD1HNP0e5udHsHFkcyMRkDoaALUPh + aa1n8yUgqRgjPOO/eq+reDkvHzoQYIB85JzzW5HBLqWmCSWQJM3UEdB3/Sk0S3uNPmIkBlgJyXAw + o/Ci4EHh3QYfDsfm3mHklGGLdFqS91HSYpvMw0jjkhTx/KqXjLUg8hihYiMn746H6Vg+QYxuV9vH + 1oA3xrem38TNe28rqp+VUyD+gpbTU7O6ylvEYoEBPzjDAjp2HeuUk1aeyfNqMH+8BTrvVhqEAMuP + O7n1oA3X1Q3U0klp5S7OGHFZt7rj4DwxlTJ6riqMTiDZsHTn6/WpbfU5EP8AxMVMqdFIOMfWgCZb + lpEO/GDgn9K6bwZpktjcC7lUsAMYPvj/AArBi0lrpc2sqbZsHbjkV20SvDp8UUZBcDp60AY+ueIZ + dIu3Frh0lbD+YNxAPXBPSqLrpuunyNPBSSM7mZyQpJ/KtWQ2uqvNDcjypQjAFjnJx0rhNYhntbvy + 7jcucgIe9AEUMOy5ImYgg4xViVVa4UFSoToc9a6DxZoEdqv2rTsHzDlx/dFcujFpG27vlPGe9AEi + anPpV359o7b143jqo/yP0rWs/FSavF9l1JltlB3tOerd+axl3XGfMXC9896iu7UbtyYIxg0AdTc2 + Vrqe3+zZxIF4Uj+I1S1Hwpexu0kts8aL7Vg2t9JZ8REjJ+UD+Guh0TxjeaW3/EwAuFAxh260AY8y + ujfLkBOCOuabHcqgCxYAbrz0rsbSysfHdzks1rO33Y0AwTWd4h+D2r6M5mmt0ER5D85P1oAxLfWZ + LSYrbnAb5eKnudVnyELFkHOcCqUmjzRzBWyD9K6W38JtLo6TtkLzmgDHtryGZiZUDZqDU1Vl3wp8 + g+9jsf8AOKmGnw2cpE8jFR1I7VdGjRXMQa0kdoSPmHrQBn6bYnWz5NydjgZVgORWeztBK8ZBJQld + x6nFdZ4ZtoNI1QPI7O+OB7VX8faO9rdC7ESrC4BJHqaAOcgUTtuORiraW0M9yiXLAIeoPc+1RWar + u6Haxq7e6ekEZkBGzGVz1ptgVprUw3ku3iJDgDPUYFEzAwZRN2CDgUw3JEkezD7+xolvytwn2pVV + RkADv060gLVlMk4aLIDHp7+1Vbu1+yzgThiHOOelElyIZl8v5CDkVtxWkGtaYs0bMblCcr/KgDCe + 3LzsN20L2HepUQJnHI9KsX+gT29pHKCd79qWw0u4aPcwU4796AL+meIr2G1aDSbiWHOMhR1qxZXz + xXBl1n/iYBBlg/FR6VZW1nciS9mdJADgYGO1Q3pIOOu5hz60AO1vxLDqluP7Pt47eJSQ2KzvtiSg + eWuPpU89gsfzH5cc+1ZaSpbXRZT8tAGjjz237gNuPwrc0O48uUPOM4GBXORXC3HmJD1bB/QVZivZ + fLwp+71oA6fVfEiwXC+UBGjfKTj14qZbi7gtJWjkY2zx5C9s4rnbCRdZiaOUkFQTke3P9KbYa1c6 + XcBARLEWxhzwBU2AotqzH5Ls5YdFPOKmiu1KgxfvCOqHrXTL4EXxLbl9MO6bGRkYzXPal4TuNLu2 + ju/3csfUD9KoDO19yChhO3OcqO1VoZEUbHVckZL9x3q09s8a5uDkZxUDWX2i4OzgHvQBLCwkwyEF + c4z6VNDZm7utkROCfwqCzAhuGRhhV/WtR5okjjkQ7ST2oAlSRtMdUjHzR1p2OuOI2Ly4kHQViS3K + iYBMsW5zSNF9klEjPnPSgC1dzm4uVKSMZd4JP41oeJPD8+r6ZHLbwmW5H3yCMqvr/Os6xu/tDfvU + CqSOfWuj0yf7OxLO2CAG9x6UAZs6vcIqSiVw3GQMisR7RVvpFkGFU46e1dN4c1hYmCXm0quDIO9c + 54quVl16drdDHGzZX6UAV5bTzWIi4Ws6/DQEoQSpI5q9BfywxkS7WU9OOlMa3F8hG7bj5sn86AKc + ErggKVA96lFwLcYHX3NQPAHnYD5e26pAnluA/JoAu6JevFqsEqs4YN0HQV39p8aL+CJVnWKWOP5c + OAf6VwCzrbxAIMMefpT48zEFD9RQB6hZ+PNE8YqsfiJFt5GOC0abcH6ioPF+i2/hiGK50xmuLOQ4 + AjO9s/T8a8wlzLIdxKkHIwcc1s6R43vdJi2xurxsdriQbto9RnpQBal1C1urtzcIVjfqu3FRMNM8 + zbpplViehyAKnuU0/X4N+ixtFdR/67e2fN+g4xzWPcWzWFyDL8gP3Qw+9+NAGhqulSWzpJHt/wBn + Bzj2NejeHLG28f8Ahox6/HsmA2DHBGO9eTrrksUTKSOD0Par+n/EnVdMRVsZYgpHIK9u9KwEvjn4 + eTeF9UY2Jie3HI+bJFc6b6eMkt909j2rsrTxpYa7bGHWYpXlc8Ord/yrOu/B8gEjQul3Ao6RjLL9 + cGhaAcu0skr7mK8HtTjEAcMMk881Zm0l7JXxg7uQBywqqzysygDBPr1qgHSWqzANL6UunXjWBOxW + KsaZcggbu4HSlindrf5ANxNIDqblPteiWrESNC2fujJ7Vd0bRY7KLfZswWYZYSdT2/pWJ4Q8ST21 + 1b2krIYj8pBFdd4k024ht0nsdpjA4AHNAHO6npkSs2SwPase6ieJcSYdenB+atGbWykgF9G2cHvi + qGqMxiWW0GFyCSRnFAFeSN4yGiLE9we1QXYEhzMo+bnAqaC9YzbpSGY8CoL/ACwDQ80AV1mxdJwQ + q9h1qd71WHU/QdqgDO0gJAyevFE4WI8dW60AafhzUHt5v3ZAzxVzXNFku/38Odg9KwbK4ELA4z+N + ddourgQKJsMv92gCr4Y8Qy6VGUmkdLcDjn5/8a6vS5tM8SWTG3kkaZeP3xIyfxrmPEuk/ZXF9akG + CY/LHj7tZy38tvcxSwnYw7DpQB0viLwrIigwhcHqAeKxDpbmcgJtKjOfStXRPHgjlEeuAzZ6bf4e + lajX+navE4gZIyQcFmxQBxd5ZPG+9iuDxmqitHGR5oO09M+tdDqmjNsDl90YPBHSsJ4N7uH7dOOt + MByxj+EkE/d5qwYGkUNu+VetUgxVz6gVNAryx7Y84J5PpSAeZWjG8A/Lg1sabqn2hF8wnniqPkK6 + qk/z/TilaEWo/cgqKANPSbRba8zM6MXGDzVPxHYPPOzOOVPy471R03XmSRXlQEHv6VstqaakgJKh + h0X1oA5jBjYrP8uTkA9TQ0qoxLHqPyrQ1+z6TMu104x65/8A1ViSsVc5GdwoAseWbkDyQWC01QVv + S+5WGcbe9OguTFZqIjhxnPHWnWTCO6LyKjPnpQBDfs4n3sMc8Y7VPBKWT922498U7X0RCjRnJmAL + KP4aq2rtA/ycBu5HXFAGkYg0GT8rY5J5qIw5jyMORxU28zwAou5jxj1pnktAzCUlT1xQBHFP/Z8w + dpNsg6ccj8a6jQPFNjqdqbfxJbvPM/yxTE/LF9c1zsNsJ1U3EYIP8VPe1iicCORsnnHTBoAtat4Z + mS92Wn79WBK7aw0ia3uXW4jdChxkjvW/Z+KLjTZFd4hKwyAc44qy+nwazpxEOPNdvMdx1UdTQBzb + AbSNyqGPf+lWvDPiW58IXDtZzOIpRiVVON4qS/0ePcG04/aYV4Z8YwaoPGJrgq2AqnAPY0AdVdww + eJLX7XoxSKfbnyRwzn61zGooyMzsreYpwQTyn+P/ANap9NvX0S4DQtzu7dhW/rel2viWzWfRiPtC + L88a/wAfuaAOQEvyDepIOOamtbFJZWKzrH7Gpk02QRBLgYYHkDtSTaf5LBgM7u1AEVxbS2aiSNfm + xw3St7RfiTLFZi2vUe4VRt44xWJDczTzoLoFgvO096bMomlkaJfI5ztFAG7Jqdlrcm2WNYHA+82C + KidbiCAoVLWzfKoHOawo1dyGO4bQcc9frWppOvSwQLDcDzQSOvbmgCjcWBQsqDYwOTmo44BdAZfG + OeuK1NYdZLjzCdu8dAKzpLYQt+6OKAK88ciXREQ3AY5/Ckmt3dlMoznPSrMU2zJxgD2zSSRmX5kY + gdiO9AFWO3KSDgqMjrXQ6fYuUAjG3HO7rWRawNeSDLYKnHPeunVG0bR4ruTnc20g96AHxn7ZbNA7 + qzgcVzup2s2mzOl0CAT8jYzvrb1TxpZ3tgr6fBFFL/EUqpp+pJqpxeqJAPulucfSgDDfcjgxAqSP + mB60xXXlZFBPXpV2+tms5W2oTnpk1nht0uZCAfTFAG9oOvCJBb6jueJj8qj+Grer6XFCqvHMvHTA + zmuajlMUmWHznoKvQ6tLDEPtKeZnsT0oAkaBVLGX7x54qOG6NvkEEA/rV2dYLi08y3fMhH3e4rMR + mkDLOMkHg9KALcN7vXI4Iq9ZyG5jw7An1rFuWMWMAopxTzqMkIxZAuOpINAD7ZAcg9F6VqaXdRFg + pX5h92sPzRbfKQdvr61c0+4MjDyxsYHkkUAdA2lvdQ+ZcDIPGOuawNY0wWNywjwVbocdK2E1ubTF + +T5gw5yM1Lc2kOqaX5kXMxG4nPT8KAOSUSKu5VGM03aZmRo22k9Tird26Fgp+6hwcVAZfNmCnBVu + mKAJp7N71FDcuOI8d6pJlLlt+d44PoK0dTZLKCI2HmCZQCd33c+1R6iqXKpJBu34+bPQGmBNpzND + bgH7zHjPapLiXMhEvzMRwarQXG+ILcfMP7w7VZjdHj+QgMOmaQCRF7AsVBZO2am2G5t2kIAJ9O1V + 2vzM21l+UU9Cjj5M8eh4NAAIXjUeRl8/pUa6k1hGFtWyG6n+lWYX25Y8dsUs9t5tkVkK7Tz7+tAE + 9l4hAj8q/RUf+Db0P1qZ/DUWrTO0paK9cfLGg+Qn61zc0SeYc53DgVr+HNfk0u623LgwSDaxHLY9 + QaYFa80a60G58vU1VmbqF5AFWdC1k6PqaTW6qyEbSD+FdRJd2s8IikZJbO46MTmRB7nr2/WsrxD4 + QjtohLo+9kHXPb0pAd6uh6Lrekm6hkkQSRgNtQfK/p+dc1f/AAsuGUnSWSVScgynbisHQfGFxpki + RKw8tRyD0z/nNWPFHji/1lFihkCxKMAocUAaNt8NNSt3bzYrYsnT5xTLvwZYQTIuqzlLh/vqigqP + xrk/7QuIwRHcXG4jnMpP9ary3kzhvtUkrSH7p3E0AdXqPgvT1vI47K4kfcCcYAx0/wAar2ngu2uW + ZIJX3pnjHFc3DqUikfPIGHU5PFb2ka3PDe7dPZGGzGW7/wCc0AX7LRLSzcxb3eXrhhxVG78JeVcA + bvvcVfEgudqaoyrOrbiV9Pwpmo311pMnmWmySH3w1AGRrXh6TRfLMq8yfcHGPxqxZ6fpmnmNddml + jlk5+RQRx/8ArqO51ptT3vMwWU9iOF/CsOZHnkIkYu3YnmgDo7qPTtPszcWTu5LcAr1ycVl6p4hk + 1BRbsCEXkCqEGqz20wEWGEZGAeRxVy+vRqV2JpUVJiACQMAUAZ0+mvaNuuz88hwAOmaktbt7C4Ub + c8jvW5rGkp/YUEsRM0nLSf7PFYogSWEF/lJ6CgDWcjXyuMhwOAO9Y09hLbSyKy9+pqzpM9xo90Jr + co2OMMM5ropr2PxBYGK7VVXBbIXG4jnrQByUI8xSADs6HPWpPLIjGxssvr3pxQmcqx+VGwFHenJI + gOF5oAW0jZB5nQnnH6Usnzjrg0rW2/8AeISD1x2pWR5VySNo60AQBX2EzHIXpSQJ5kjOOFpLgrtI + iLFvWi2Y3CFYuoNAEt4myTBBQ46Gq6OyHKjGTzSyyyXUm+/cnHc0+PY42RtuDcDigDS03UzdQlHG + WHFSw3/2CX99lo+hA64NUorOeyG9FJA68VJFaLqNu0hkIlXkgelAF3VtEjvNMF1pKOctyPTFc/bw + tGVeMfMRzW54f119M8yJ2IjlGzk9B/k1p6f4fsmi2xXsUmeP88U7gYV5Et3aQlWCsox+NR2eUnWG + 7bdvrZ1TRY7FXjuQsatzHJ7VkyeXbxnz38xl6NmkBFfiXR3MDKQjHI9xUMV0ijMnNdBZWbeJbUcC + SZU+U454rFu/DF7byNJcW0qxqeeOtAE0EcbI+4nax49qnKNY7CCG46Vjw3DRHO1gtaNrqPnBRKu1 + R0Y80AXYDHPAzlPmzzTWG2Evn8KafMMWIsFfamKxcAyjAHbNAFSeRJpOBg0xrXykVjyp6VLqFv5b + AqwTI6dal02ZZ5VjuMNGentQBJZxXFtFuUZDcitDSPFrwOYrkFkfj6Vl30l7p87RpKRDn92eoIqG + 31gRxk3qMzqRnmgC/wCJtIa2uzLYfMjgEj2rNs70woyIMjPLHtW7Y3y38gkUnGBke1R6p4dS/mNx + obeZgfvIVH3Pf3oAz7W3EmGzgrSSRqszF13+4/hqOOLdGSrk5HO0d6WCUxYaUMYhw4HegCM6TLcy + Ztkd0wckd6jtZZbPiI+aqnlem2tTStXNvcbYZyiSA4QcdMf41Y8Taf8A2dZieGMR7sAkc7s8H+dA + GVJqTT3AKtjIxtrStNVy/kyLuUj1rAlhG4NtKqOc/wB+l+2SpP8AcKMn3s07gdJdeHPtLRS2zpCr + csD171laro72bGSFWZRwzHpQdUe8hTDEMg5xU0N7Pcx7GVpIf4lzSAwlk2yAoevUDpWpa2hvYeTg + 0mo2UM8w8lPs4HUDvRpsFz9oYW6NKB07U0BbjvptGhkgJDRMu01VLRyyIYQSgA3HstVdVMiSlZyx + bPKiksbyS1hdWUmKQ5K0gJpt8UgAw69iKn0/UyJdrdOmKIPIvW/cyLEqj7p4zUEUIEr+blHXJBx1 + oAk1O28q6VoSFVhk1GbZQ25TzUlvcfakIucKAcAnqaWK1cyFkQlB70AJvJdNq5I4+tBcbCnCjv71 + LIVcAowVhxj0qO2t9zkXHKt0bsKAIpbPIHlKWUjk06wgaNiqIBzViF/kKKwBHA9aguI5oX3REk9j + TQErWypGPOGc/pTLTy47gMFyob5fetB7EmcG3G6N8hSTjNWRpgsws/y7ouWB70gKd5dGSRcfKnIP + HFXrHSYL61e4kfyVVcYA61lC7OrxurAKxbIHtUtxfC2sTDA/A49KAEazRmkEw+TqG9as+H7YSTeX + bvu7ccYrIt7qRdobPLc59K6jw9pf2KUXcJBVjuI/z9aALF88MsJh1AiRoPl54Iqt5GmXUG3ABx1x + 0/WneMbGfTryO8VB5d2N6qfTJHP5VBoNtFqUb/b28uU/d2d6AJLPV4dGtP8AQyokHGKgu/Fwu9wl + PXgj0pmpaSmnOxmYEdu5rOht2knZ4FX3oAimiju3AtlAznrVWSAW7OC2HQ/d7VdNjLaMjurbSeMC + s+4WS41BjyEB5zQBcgnk2ARnJbqKZcydmZt3fFVxB+9DRkjHfNWLh/KKGTp/6FQBGLg3C5PzFeBT + LeT5yEzlB0p1zb7wGtzt9RTNhWVQOHPWgDc0iUajbPbTgM5GE9aydTtPKk8sKcDrk9adZX5+0FLc + FZM/K1dPpmgReJLR2nOyZDhQT1z60AYWgXYtrvy5cFXBXA9+OtGpLceH9YIsZ3BwGI4+YHsaNR09 + 9C1ERTFTMjBgE6YyO9S+IoDqHlag5++RGPfGKALelpb+IbtA+Ldk+ZkXofxqHxFpn2Vpv7OXdGOW + 56Vk3GpCBQB8pB429a0bHXN8kX2gKY1ILju1AGakfmFfJXLN0/z+VdZYQG503yda5xyPp/8AqqXw + 2LKJJvsqbjIdwDL936Viarq8u9nhA8sNg88/TFAGrdeFbeWBHscSL/AM9DWRqnhObyS7KUYdfetH + wkx1Gdnm3rECAB6Vu674psYbIRxeZuHBJHWgDzZw2nybQMluDVnT9T2PsJK56Ve1OS1vJ/OhOfXj + pWVdWctu/mJhgTxQBeYrOS0xAxTojJHKHspCQ3GPSqaXCTuqpnf+lTQIJ5XRXwy0AaN7YxzWzT3I + /fSHp6VnS2LI8Yt13kj5ucAU17me4hYbvkHXJ5qvJfDMYDNlevqeaAJTAVJGBuHPFSWuoMN32iNW + UgjOelVo5vNUvg8HGKVollOIG4HNAGhb6dHewhrVy8gPK4qaFTZZRssT1GKzLWd7C5zDlS1a9rq5 + vU2uFAIznuaAK93po2GSIEjqefu1C8QZApc+uBxWnbQpeyCG1OB1cnjmi5sUuTlxgpTQFBAYCWEQ + bjrmmsHvDypH0qYqYGPlk56DPSnWFuz3BN2MCkB0niGK10bw/ExCyMxwhVskH8K5O98SPfWixqPm + AxkjBNEkkz2iQSzgqn3U54rPm4RkY4YEfhQBd0gPBMGnwc8fSpvElpFBIGU5Y4Ix0qjcanIkKBG5 + 7VGzPdIHvF3P9aAHpGtymc4Ira0fU5YYUG7KA5P0rAEgjOFjfHtVqzndD8ilFkGKAPTri4h1fRrW + DVAojmjwjdwPY/XNcJK6aTfubdjhDgc9a19PnbUYLW2upsRJ8o61S8WeH1sryKJ2AeRSUb1oApTX + TXpaQMWJGcdal8PSf6UTcj5WOKz5YW0zgTKZG44Bq4THLpSqj7LhWJdsdfSgDo9e16OGFba0ji3p + wZCBzXOoYZp2N2u0Mecd6Zp12cIbkfIBzTbwRG53W4wp5oAbeWVmgY2ZYeuTVC4SWFAzjdGO5qws + HmK28jaTVi1vhaR+XfRGeJhtVR69jz6dfwpgZEcrPcAp92pl2IzMxLuRwamfSJZCXtnRhnLgcFR6 + VWc7J9mNpbtikAW9w0MheQj5ea3NG1Y2sPmWhCvjuf5Vk7UadY48RseW960rDS11C3b7EMzL3oAt + 6hpn9pZu4GzGq7djH5g2PzpPDsMV/Y3Fveg/uVZl+vNJYRy2KhXfcB972q5aRw310/2eZLbcuCWH + X8qaA4yTeT845B4qaEqjZlVtzflV+80qY31z/Z8T3ENqMs8ZAAGcd6zoZMncEwH6H0pAdDpusLZQ + 7Rjc3ApkFoZJHmY4iAPXpms8R7oh/Gc5HtXQaALbUtGMN6ApPHrzQA/TvEdsdOWD92rRk8gcmud8 + QXkl1cZzlfapr3QP7NujGjfKTlSKzr2Jmdgx/wBX096AIkn8ucBQQjdat/bWMLZKOOnOOKzdjL0P + BoiXe2Cu7vQBpxC0KAyK2488Hiql3LskbaDtbpjrV+3tlubYC2TExGBVe+tJNOAF4PmHNAFO0meG + R1bI9jU0iK23zcbsdagWYO+xOH7mrkMWYcNgkUAQwKGA4JC5pzyFmPlEADt61asYIgSJWA3dOKv6 + zosFpdxPaBGVlG445BwKAMwuWADAbqs6eI/3hl++Pu1cj8NFyrRncAdxb0psElpY37NMhljD4YKe + poAsWmm/aIjKknlsvUnoalhtHLcbiueucA1Uu9UMs8wt4SsOfkUnkCrOmXcotj9rkV0HSLnmgDoD + 4JSXSzPNNFJhdwCkZX9a5+K9gD+XPgDdjNTpez6ZZywwPskcZbk/KK5qZ2llPmvvYnrQATr8zE5D + N1zxRbou7951anhZNYuUVFw7dvSp59IltXdZ1IZKAGvpLNGfLAfufaqDCSKUEkgdMkVd07VWs7oG + XLL0x60+7ePUjyCpByMUAV3bBGxsk1ZikV4gAMkHOKpzW5SUmN849qjjnlil3KODxj0oA6KykW7t + yJW8pk4BFdxrGhwax4TS5JWWaEBEY9QDn/CvNrPUfJmBcZDHLV0s2vsfDMwt2ZYy4z7cGgDHv9NK + yjfD+8bgYFUNRtTps4S6HlkjIBPU/wCcVeN86xKZmJlyMc5p/ifU5L/RYVmto9wJUyZ5oAy01Dfb + qZV2xnoKbfX6NEv2ZcHHWmPLFJYQx2ZLTL1U1EIJA+2bAJ6Y5oAIboyDb0PU1c8xLkBJLna4Hy44 + 5x06VAbZbdcyZ3elNBXeCRjnOaAG2808N5syYmJ7fx+5q7tW5QCZQso/iqsULT7rXLr6k4xVi0dX + +9kmgBlxpbI7SxqZAoGWz0p+i3txZ3AezJAHXjrWlZ26mFyzEnPC+vStzTLO3vZ1M8Yjwp6Hr0oA + 5/xFqyrIggQKrLlsdc96xpQZ5wySbu2DVnVYQ9/MJCSitxVOQFW4G1aAOm+H3iGPSbie1upBDBqC + CKRugwOfwrI8VWsenazNHZtvs0fEb/3h6j171Elg02N65x6Gt200i18VwwwXcjQ3Fou2NQMiTvye + 3WgDn4riKEhkfKf3h6+9aFlGLeyS8eT5DIMoDnv3FXZ9I0iwhJFxJLMpwY2ACg1TvvISzMs77S5w + EUcUAW9dH9qW6y6ZKBgcgdawoNOu7iWMmNiWOMDtT4Jxb5e1bKuMEHsfWpNM1ZrG4WWFmct0BHSg + CprWivp0u193mMeR6VHa2jmQbVH0zV3WNRkv5mkn5YnjFRJGBMjRMScdKANvR7OO1u4pS+SGGV68 + d61/GnhSHUYReQyqsZXiPI64rK0S5hRNzfePXvWr5w1KIwwucAccUAefW1q8kqiT+WK0RpdzFFuE + bFT0bHBqxrFj/Z87LjDZ/Km2ctw7Kgk3KO3SgDPQPuHmqNynv2rRs7hrhjDIcDqD6VPeafDfWbbC + UnUjav8AeHfn8qsaL4bl2pLcYWJT85PYdzQBq6dfjRtKX7QnmC4JQH07f1rIl0SztbsSrcoQnJQH + qaseJ7mBVT7PIXtDwrYwQ3esOO4RrxvLZmjI+90P5UAXrm881T9lHOeAOareXPH+8BKOB19Kb9rF + pcq0ILDPc8mp7m+S6k3fdKj7vWgB8Gtj7Oq3AZ3fCs7DmorqxQTbl+oAqJJlu4gJMKwIxT3kNq+H + G5/7o7D1zTA7Pwpd6NBrk5vQwMv3Pl+7UnjAwwXX7tFe3l5UjBbHvXP3GnCOxhuo2IL1G+qPcFYX + cknoT/n2pbgVZtGFxZvNbH5VOBk+vt+FZ8lrPakrcqyHGcEYzWidWS3lCxAlVPUdDWxf6pa6nLH/ + AGlH99QoI4wTwKbA45pHEirjk1asbxYZCsoDYH1rV17wyumSKVbeGG4Y6gVk/wBn7UdgCpPc0gLw + aEwtLKMDtWhoNykVwHdd8JGCjDIrDkSW1g2zOhVhkVLo+puSVlKlccYoA6Dxf4PbSLRb21wto7DG + W7ntj61mpKdXtxaOQvlfMCSBuJrqLfWIfEvhg2muKzQoN4CnBJHT9cVyU5hEjNbB0CHABPNAGTPa + fZriQONjqcZ6flUtqqB1SRmMr/dJzWlDaLrEUh1Qbnx+628ZNZE1s9nfctxEccjpQBO9tLcy7Zjw + vfNQ31q9oee3A75qe2Yyzby5OKiutRMsjKQDg4FG4EVvEyfM5xnsD1q5bbzKHBAB9KrCJN4YMd3p + V+wt8szRZUCnYDXsWSGPz7jGI+SMVVuvErXKEWuRk9QMYqXVyLXTUyRmRcmsSC4EAO8D2pAXxbma + IMR8w7+tVdRtkUAT9ew71as7wsF2nFGsKodDOMzHo/YU0rgULe7j098qW545Gaki1FIbwzeYyzfw + EdvyqkyGSfaw+bvRcQLayqyEnAyaQHR6gi6/pXnBER0IGFHzN15rnmlXyTGRuQHByeQau2GrS20G + 9OhO3H1//VWhf6RprXbXmnrMtuYsOjNk78DkfiDQBi2rpHIVQjb1otHPnBZAMAdRVUQiW6Bgyis2 + Buq29q2nXJjn/eDsycUAOLCG8yg9zkcVCzeVIZY+cenekN0LqYRSHAHA9aLMCOTy5BlTyPegCxa6 + ltkL2+ORzxjFWbTXpLSV3Y84+XFVJvLilKjgVFMpAyBxQBq6prEF7bQSzA+ZJ97jpVRGjDbUJAB+ + U+tUywlJUdE6VteHLK3kuoDqQZ0zyAcYFAG3feVo+io90u2d13R/LyR35rm77VZNSmzC5SEj5hnH + 14/Otu+hv/FN3gTWywW4KRqQM4/OsUeFZp5miaVAc9R0oAaXWa0EUWCIjuA9PeqEMbCYM3G77oAr + bi8Gz2YDmeLc3ygev61X1CxnnuTE8TvPb9fKXigDMuIJFlBdtzHnAPSrEF0IwDCm5hw2VNRzxTWt + 0BeKVMnTIxj8KZ/ahtgY49uT7UAX7VH1K63oERVOTxiuu0ex0nS7L7chJkm+R1kwwyPQZrh4JJDw + zbVbk4/OrNpefLsnyyg5UUAf/9k= + +END:VCARD diff --git a/vendor/sabre/vobject/tests/bootstrap.php b/vendor/sabre/vobject/tests/bootstrap.php new file mode 100644 index 0000000000..e89e9a2b32 --- /dev/null +++ b/vendor/sabre/vobject/tests/bootstrap.php @@ -0,0 +1,23 @@ + + + Sabre/ + + + + + ../lib/ + + ../lib/Sabre/VObject/includes.php + + + + diff --git a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php index a2085fe0bb..a7a840112e 100644 --- a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php +++ b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php @@ -65,19 +65,19 @@ abstract class Client /** * Sets whether to automatically follow redirects or not. * - * @param Boolean $followRedirect Whether to follow redirects + * @param bool $followRedirect Whether to follow redirects * * @api */ public function followRedirects($followRedirect = true) { - $this->followRedirects = (Boolean) $followRedirect; + $this->followRedirects = (bool) $followRedirect; } /** * Sets the maximum number of requests that crawler can follow. * - * @param integer $maxRedirects + * @param int $maxRedirects */ public function setMaxRedirects($maxRedirects) { @@ -88,7 +88,7 @@ abstract class Client /** * Sets the insulated flag. * - * @param Boolean $insulated Whether to insulate the requests or not + * @param bool $insulated Whether to insulate the requests or not * * @throws \RuntimeException When Symfony Process Component is not installed * @@ -102,7 +102,7 @@ abstract class Client // @codeCoverageIgnoreEnd } - $this->insulated = (Boolean) $insulated; + $this->insulated = (bool) $insulated; } /** @@ -282,7 +282,7 @@ abstract class Client * @param array $files The files * @param array $server The server parameters (HTTP headers are referenced with a HTTP_ prefix as PHP does) * @param string $content The raw body data - * @param Boolean $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload()) + * @param bool $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload()) * * @return Crawler * @@ -299,7 +299,7 @@ abstract class Client $uri = $this->getAbsoluteUri($uri); if (isset($server['HTTP_HOST'])) { - $uri = preg_replace('{^(https?\://)'.parse_url($uri, PHP_URL_HOST).'}', '\\1'.$server['HTTP_HOST'], $uri); + $uri = preg_replace('{^(https?\://)'.parse_url($uri, PHP_URL_HOST).'}', '${1}'.$server['HTTP_HOST'], $uri); } if (isset($server['HTTPS'])) { @@ -436,7 +436,7 @@ abstract class Client protected function createCrawlerFromContent($uri, $content, $type) { if (!class_exists('Symfony\Component\DomCrawler\Crawler')) { - return null; + return; } $crawler = new Crawler(null, $uri); @@ -596,7 +596,7 @@ abstract class Client * Makes a request from a Request object directly. * * @param Request $request A Request instance - * @param Boolean $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload()) + * @param bool $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload()) * * @return Crawler */ diff --git a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Cookie.php b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Cookie.php index 0b769c520d..8b1f18ae3e 100644 --- a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Cookie.php +++ b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Cookie.php @@ -53,9 +53,9 @@ class Cookie * @param string $expires The time the cookie expires * @param string $path The path on the server in which the cookie will be available on * @param string $domain The domain that the cookie is available - * @param Boolean $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client - * @param Boolean $httponly The cookie httponly flag - * @param Boolean $encodedValue Whether the value is encoded or not + * @param bool $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client + * @param bool $httponly The cookie httponly flag + * @param bool $encodedValue Whether the value is encoded or not * * @api */ @@ -69,11 +69,11 @@ class Cookie $this->rawValue = urlencode($value); } $this->name = $name; - $this->expires = null === $expires ? null : (integer) $expires; + $this->expires = null === $expires ? null : (int) $expires; $this->path = empty($path) ? '/' : $path; $this->domain = $domain; - $this->secure = (Boolean) $secure; - $this->httponly = (Boolean) $httponly; + $this->secure = (bool) $secure; + $this->httponly = (bool) $httponly; } /** @@ -297,7 +297,7 @@ class Cookie /** * Returns the secure flag of the cookie. * - * @return Boolean The cookie secure flag + * @return bool The cookie secure flag * * @api */ @@ -309,7 +309,7 @@ class Cookie /** * Returns the httponly flag of the cookie. * - * @return Boolean The cookie httponly flag + * @return bool The cookie httponly flag * * @api */ @@ -321,7 +321,7 @@ class Cookie /** * Returns true if the cookie has expired. * - * @return Boolean true if the cookie has expired, false otherwise + * @return bool true if the cookie has expired, false otherwise * * @api */ diff --git a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/CookieJar.php b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/CookieJar.php index 4ecfddbf4a..a3b0e24b25 100644 --- a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/CookieJar.php +++ b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/CookieJar.php @@ -73,7 +73,7 @@ class CookieJar } } - return null; + return; } // avoid relying on this behavior that is mainly here for BC reasons @@ -82,8 +82,6 @@ class CookieJar return $cookies[$path][$name]; } } - - return null; } /** @@ -201,7 +199,7 @@ class CookieJar * Returns not yet expired cookie values for the given URI. * * @param string $uri A URI - * @param Boolean $returnsRawValue Returns raw value or urldecoded value + * @param bool $returnsRawValue Returns raw value or urldecoded value * * @return array An array of cookie values */ diff --git a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/History.php b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/History.php index 0c79d5b525..d76d79bbf8 100644 --- a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/History.php +++ b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/History.php @@ -45,7 +45,7 @@ class History /** * Returns true if the history is empty. * - * @return Boolean true if the history is empty, false otherwise + * @return bool true if the history is empty, false otherwise */ public function isEmpty() { diff --git a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Response.php b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Response.php index 182fdda48d..77aad8376c 100644 --- a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Response.php +++ b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Response.php @@ -31,7 +31,7 @@ class Response * then the value is an array of all the values. * * @param string $content The content of the response - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of headers * * @api @@ -92,7 +92,7 @@ class Response /** * Gets the response status code. * - * @return integer The response status code + * @return int The response status code * * @api */ @@ -117,7 +117,7 @@ class Response * Gets a response header. * * @param string $header The header name - * @param Boolean $first Whether to return the first value or all header values + * @param bool $first Whether to return the first value or all header values * * @return string|array The first header value if $first is true, an array of values otherwise */ diff --git a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Tests/ClientTest.php b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Tests/ClientTest.php index 4919ae1014..ca6898abb2 100644 --- a/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Tests/ClientTest.php +++ b/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Tests/ClientTest.php @@ -103,6 +103,14 @@ class ClientTest extends \PHPUnit_Framework_TestCase $this->assertEquals('http://example.com/', $client->getRequest()->getUri(), '->getCrawler() returns the Request of the last request'); } + public function testGetRequestWithIpAsHost() + { + $client = new TestClient(); + $client->request('GET', 'https://example.com/foo', array(), array(), array('HTTP_HOST' => '127.0.0.1')); + + $this->assertEquals('https://127.0.0.1/foo', $client->getRequest()->getUri()); + } + public function testGetResponse() { $client = new TestClient(); diff --git a/vendor/symfony/config/Symfony/Component/Config/ConfigCache.php b/vendor/symfony/config/Symfony/Component/Config/ConfigCache.php index 73de9c2e5f..e05aee89a6 100644 --- a/vendor/symfony/config/Symfony/Component/Config/ConfigCache.php +++ b/vendor/symfony/config/Symfony/Component/Config/ConfigCache.php @@ -31,12 +31,12 @@ class ConfigCache * Constructor. * * @param string $file The absolute cache path - * @param Boolean $debug Whether debugging is enabled or not + * @param bool $debug Whether debugging is enabled or not */ public function __construct($file, $debug) { $this->file = $file; - $this->debug = (Boolean) $debug; + $this->debug = (bool) $debug; } /** @@ -55,7 +55,7 @@ class ConfigCache * This method always returns true when debug is off and the * cache file exists. * - * @return Boolean true if the cache is fresh, false otherwise + * @return bool true if the cache is fresh, false otherwise */ public function isFresh() { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php index 6017194421..b83b1048a9 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php @@ -33,7 +33,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface public function setNormalizeKeys($normalizeKeys) { - $this->normalizeKeys = (Boolean) $normalizeKeys; + $this->normalizeKeys = (bool) $normalizeKeys; } /** @@ -99,51 +99,51 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface * Sets whether to add default values for this array if it has not been * defined in any of the configuration files. * - * @param Boolean $boolean + * @param bool $boolean */ public function setAddIfNotSet($boolean) { - $this->addIfNotSet = (Boolean) $boolean; + $this->addIfNotSet = (bool) $boolean; } /** * Sets whether false is allowed as value indicating that the array should be unset. * - * @param Boolean $allow + * @param bool $allow */ public function setAllowFalse($allow) { - $this->allowFalse = (Boolean) $allow; + $this->allowFalse = (bool) $allow; } /** * Sets whether new keys can be defined in subsequent configurations. * - * @param Boolean $allow + * @param bool $allow */ public function setAllowNewKeys($allow) { - $this->allowNewKeys = (Boolean) $allow; + $this->allowNewKeys = (bool) $allow; } /** * Sets if deep merging should occur. * - * @param Boolean $boolean + * @param bool $boolean */ public function setPerformDeepMerging($boolean) { - $this->performDeepMerging = (Boolean) $boolean; + $this->performDeepMerging = (bool) $boolean; } /** * Whether extra keys should just be ignore without an exception. * - * @param Boolean $boolean To allow extra keys + * @param bool $boolean To allow extra keys */ public function setIgnoreExtraKeys($boolean) { - $this->ignoreExtraKeys = (Boolean) $boolean; + $this->ignoreExtraKeys = (bool) $boolean; } /** @@ -159,7 +159,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface /** * Checks if the node has a default value. * - * @return Boolean + * @return bool */ public function hasDefaultValue() { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/BaseNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/BaseNode.php index 3e4412713f..b9e48ce2a1 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/BaseNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/BaseNode.php @@ -133,21 +133,21 @@ abstract class BaseNode implements NodeInterface /** * Set this node as required. * - * @param Boolean $boolean Required node + * @param bool $boolean Required node */ public function setRequired($boolean) { - $this->required = (Boolean) $boolean; + $this->required = (bool) $boolean; } /** * Sets if this node can be overridden. * - * @param Boolean $allow + * @param bool $allow */ public function setAllowOverwrite($allow) { - $this->allowOverwrite = (Boolean) $allow; + $this->allowOverwrite = (bool) $allow; } /** @@ -173,7 +173,7 @@ abstract class BaseNode implements NodeInterface /** * Checks if this node is required. * - * @return Boolean + * @return bool */ public function isRequired() { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php index fb37d62a1e..939e86fa73 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php @@ -21,7 +21,7 @@ use Symfony\Component\Config\Definition\Exception\InvalidTypeException; class BooleanNode extends ScalarNode { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function validateType($value) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php index a97fa27239..8c1a157469 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php @@ -36,7 +36,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition protected $normalizeKeys = true; /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct($name, NodeParentInterface $parent = null) { @@ -97,7 +97,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition /** * Adds children with a default value when none are defined. * - * @param integer|string|array|null $children The number of children|The child name|The children names to be added + * @param int|string|array|null $children The number of children|The child name|The children names to be added * * This method is applicable to prototype nodes only. * @@ -177,7 +177,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition * This method is applicable to prototype nodes only. * * @param string $name The name of the key - * @param Boolean $removeKeyItem Whether or not the key item should be removed. + * @param bool $removeKeyItem Whether or not the key item should be removed. * * @return ArrayNodeDefinition */ @@ -192,7 +192,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition /** * Sets whether the node can be unset. * - * @param Boolean $allow + * @param bool $allow * * @return ArrayNodeDefinition */ @@ -295,13 +295,13 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition /** * Sets key normalization. * - * @param Boolean $bool Whether to enable key normalization + * @param bool $bool Whether to enable key normalization * * @return ArrayNodeDefinition */ public function normalizeKeys($bool) { - $this->normalizeKeys = (Boolean) $bool; + $this->normalizeKeys = (bool) $bool; return $this; } @@ -343,7 +343,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function createNode() { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php index 7ee4d4d8a6..3f8713bedb 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php @@ -21,7 +21,7 @@ use Symfony\Component\Config\Definition\BooleanNode; class BooleanNodeDefinition extends ScalarNodeDefinition { /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct($name, NodeParentInterface $parent = null) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php index 8831143339..c1e285e5c4 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php @@ -35,7 +35,7 @@ class MergeBuilder /** * Sets whether the node can be unset. * - * @param Boolean $allow + * @param bool $allow * * @return MergeBuilder */ @@ -49,7 +49,7 @@ class MergeBuilder /** * Sets whether the node can be overwritten. * - * @param Boolean $deny Whether the overwriting is forbidden or not + * @param bool $deny Whether the overwriting is forbidden or not * * @return MergeBuilder */ diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php index a9dcb09fec..0722629556 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php @@ -117,7 +117,7 @@ abstract class NodeDefinition implements NodeParentInterface /** * Creates the node. * - * @param Boolean $forceRootNode Whether to force this node as the root node + * @param bool $forceRootNode Whether to force this node as the root node * * @return NodeInterface */ @@ -279,7 +279,7 @@ abstract class NodeDefinition implements NodeParentInterface /** * Sets whether the node can be overwritten. * - * @param Boolean $deny Whether the overwriting is forbidden or not + * @param bool $deny Whether the overwriting is forbidden or not * * @return NodeDefinition */ diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php index 9c6e249c95..fd08991e28 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php @@ -31,7 +31,7 @@ class VariableNodeDefinition extends NodeDefinition } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function createNode() { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php index d9c8423235..e26a79a582 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php @@ -43,8 +43,8 @@ class XmlReferenceDumper /** * @param NodeInterface $node - * @param integer $depth - * @param Boolean $root If the node is the root node + * @param int $depth + * @param bool $root If the node is the root node * @param string $namespace The namespace of the node */ private function writeNode(NodeInterface $node, $depth = 0, $root = false, $namespace = null) diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php b/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php index 7b0d161c44..a22fba67d6 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php @@ -45,7 +45,7 @@ class YamlReferenceDumper /** * @param NodeInterface $node - * @param integer $depth + * @param int $depth */ private function writeNode(NodeInterface $node, $depth = 0) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/FloatNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/FloatNode.php index 17c570acaa..0fe0e34581 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/FloatNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/FloatNode.php @@ -21,7 +21,7 @@ use Symfony\Component\Config\Definition\Exception\InvalidTypeException; class FloatNode extends NumericNode { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function validateType($value) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/IntegerNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/IntegerNode.php index dbc04122fa..f76efe60c7 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/IntegerNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/IntegerNode.php @@ -21,7 +21,7 @@ use Symfony\Component\Config\Definition\Exception\InvalidTypeException; class IntegerNode extends NumericNode { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function validateType($value) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php b/vendor/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php index cdbc0ef096..67353e8d57 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php @@ -38,14 +38,14 @@ interface NodeInterface /** * Returns true when the node is required. * - * @return Boolean If the node is required + * @return bool If the node is required */ public function isRequired(); /** * Returns true when the node has a default value. * - * @return Boolean If the node has a default value + * @return bool If the node has a default value */ public function hasDefaultValue(); diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/NumericNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/NumericNode.php index f062ae07cc..39b96d610d 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/NumericNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/NumericNode.php @@ -31,7 +31,7 @@ class NumericNode extends ScalarNode } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function finalizeValue($value) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php index 7074cb362e..51b9256543 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php @@ -34,7 +34,7 @@ class PrototypedArrayNode extends ArrayNode * Sets the minimum number of elements that a prototype based node must * contain. By default this is zero, meaning no elements. * - * @param integer $number + * @param int $number */ public function setMinNumberOfElements($number) { @@ -63,7 +63,7 @@ class PrototypedArrayNode extends ArrayNode * array, then you can set the second argument of this method to false. * * @param string $attribute The name of the attribute which value is to be used as a key - * @param Boolean $remove Whether or not to remove the key + * @param bool $remove Whether or not to remove the key */ public function setKeyAttribute($attribute, $remove = true) { @@ -100,7 +100,7 @@ class PrototypedArrayNode extends ArrayNode /** * Checks if the node has a default value. * - * @return Boolean + * @return bool */ public function hasDefaultValue() { @@ -110,7 +110,7 @@ class PrototypedArrayNode extends ArrayNode /** * Adds default children when none are set. * - * @param integer|string|array|null $children The number of children|The child name|The children names to be added + * @param int|string|array|null $children The number of children|The child name|The children names to be added */ public function setAddChildrenIfNoneSet($children = array('defaults')) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php index 88f59ecac6..44ccfc56b2 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php @@ -28,7 +28,7 @@ use Symfony\Component\Config\Definition\Exception\InvalidTypeException; class ScalarNode extends VariableNode { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function validateType($value) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Definition/VariableNode.php b/vendor/symfony/config/Symfony/Component/Config/Definition/VariableNode.php index 69dfea6d87..6d89e49df5 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Definition/VariableNode.php +++ b/vendor/symfony/config/Symfony/Component/Config/Definition/VariableNode.php @@ -28,7 +28,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface protected $allowEmptyValue = true; /** - * {@inheritDoc} + * {@inheritdoc} */ public function setDefaultValue($value) { @@ -37,7 +37,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function hasDefaultValue() { @@ -45,7 +45,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getDefaultValue() { @@ -55,15 +55,15 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface /** * Sets if this node is allowed to have an empty value. * - * @param Boolean $boolean True if this entity will accept empty values. + * @param bool $boolean True if this entity will accept empty values. */ public function setAllowEmptyValue($boolean) { - $this->allowEmptyValue = (Boolean) $boolean; + $this->allowEmptyValue = (bool) $boolean; } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setName($name) { @@ -71,14 +71,14 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function validateType($value) { } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function finalizeValue($value) { @@ -97,7 +97,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function normalizeValue($value) { @@ -105,7 +105,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function mergeValues($leftSide, $rightSide) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php b/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php index 71fe8d07f7..d05cf8f89f 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php +++ b/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php @@ -21,7 +21,7 @@ class FileLoaderLoadException extends \Exception /** * @param string $resource The resource that could not be imported * @param string $sourceResource The original resource importing the new resource - * @param integer $code The error code + * @param int $code The error code * @param \Exception $previous A previous exception */ public function __construct($resource, $sourceResource = null, $code = null, $previous = null) diff --git a/vendor/symfony/config/Symfony/Component/Config/FileLocator.php b/vendor/symfony/config/Symfony/Component/Config/FileLocator.php index 7f9dadcc6d..0da2ad6366 100644 --- a/vendor/symfony/config/Symfony/Component/Config/FileLocator.php +++ b/vendor/symfony/config/Symfony/Component/Config/FileLocator.php @@ -35,7 +35,7 @@ class FileLocator implements FileLocatorInterface * * @param mixed $name The file name to locate * @param string $currentPath The current path - * @param Boolean $first Whether to return the first occurrence or an array of filenames + * @param bool $first Whether to return the first occurrence or an array of filenames * * @return string|array The full path to the file|An array of file paths * @@ -80,7 +80,7 @@ class FileLocator implements FileLocatorInterface * * @param string $file A file path * - * @return Boolean + * @return bool */ private function isAbsolutePath($file) { diff --git a/vendor/symfony/config/Symfony/Component/Config/FileLocatorInterface.php b/vendor/symfony/config/Symfony/Component/Config/FileLocatorInterface.php index 4ff19b4de9..4287e3d1d0 100644 --- a/vendor/symfony/config/Symfony/Component/Config/FileLocatorInterface.php +++ b/vendor/symfony/config/Symfony/Component/Config/FileLocatorInterface.php @@ -21,7 +21,7 @@ interface FileLocatorInterface * * @param mixed $name The file name to locate * @param string $currentPath The current path - * @param Boolean $first Whether to return the first occurrence or an array of filenames + * @param bool $first Whether to return the first occurrence or an array of filenames * * @return string|array The full path to the file|An array of file paths * diff --git a/vendor/symfony/config/Symfony/Component/Config/Loader/FileLoader.php b/vendor/symfony/config/Symfony/Component/Config/Loader/FileLoader.php index 8bd587957e..981d16f92b 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Loader/FileLoader.php +++ b/vendor/symfony/config/Symfony/Component/Config/Loader/FileLoader.php @@ -53,7 +53,7 @@ abstract class FileLoader extends Loader * * @param mixed $resource A Resource * @param string $type The resource type - * @param Boolean $ignoreErrors Whether to ignore import errors or not + * @param bool $ignoreErrors Whether to ignore import errors or not * @param string $sourceResource The original resource importing the new resource * * @return mixed diff --git a/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php b/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php index d0ac5b8bef..f01f7709d2 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php +++ b/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php @@ -32,7 +32,7 @@ interface LoaderInterface * @param mixed $resource A resource * @param string $type The resource type * - * @return Boolean true if this class supports the given resource, false otherwise + * @return bool true if this class supports the given resource, false otherwise */ public function supports($resource, $type = null); diff --git a/vendor/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php b/vendor/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php index 5ccd204ef9..a9e4d76143 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/vendor/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php @@ -61,9 +61,9 @@ class DirectoryResource implements ResourceInterface, \Serializable /** * Returns true if the resource has not been updated since the given timestamp. * - * @param integer $timestamp The last time the resource was loaded + * @param int $timestamp The last time the resource was loaded * - * @return Boolean true if the resource has not been updated, false otherwise + * @return bool true if the resource has not been updated, false otherwise */ public function isFresh($timestamp) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Resource/FileResource.php b/vendor/symfony/config/Symfony/Component/Config/Resource/FileResource.php index 619f84bcef..5cb4bc7078 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Resource/FileResource.php +++ b/vendor/symfony/config/Symfony/Component/Config/Resource/FileResource.php @@ -55,9 +55,9 @@ class FileResource implements ResourceInterface, \Serializable /** * Returns true if the resource has not been updated since the given timestamp. * - * @param integer $timestamp The last time the resource was loaded + * @param int $timestamp The last time the resource was loaded * - * @return Boolean true if the resource has not been updated, false otherwise + * @return bool true if the resource has not been updated, false otherwise */ public function isFresh($timestamp) { diff --git a/vendor/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php b/vendor/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php index d624a573b0..c0ea9ed7b4 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php +++ b/vendor/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php @@ -28,9 +28,9 @@ interface ResourceInterface /** * Returns true if the resource has not been updated since the given timestamp. * - * @param integer $timestamp The last time the resource was loaded + * @param int $timestamp The last time the resource was loaded * - * @return Boolean true if the resource has not been updated, false otherwise + * @return bool true if the resource has not been updated, false otherwise */ public function isFresh($timestamp); diff --git a/vendor/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php b/vendor/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php index 6d71a2ad40..22c399ca9d 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php +++ b/vendor/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php @@ -79,7 +79,7 @@ class NodeBuilderTest extends \PHPUnit_Framework_TestCase public function testNumericNodeCreation() { - $builder = new NodeBuilder(); + $builder = new BaseNodeBuilder(); $node = $builder->integerNode('foo')->min(3)->max(5); $this->assertInstanceOf('Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition', $node); diff --git a/vendor/symfony/config/Symfony/Component/Config/Util/XmlUtils.php b/vendor/symfony/config/Symfony/Component/Config/Util/XmlUtils.php index 9288e1edc3..6b3e5f7370 100644 --- a/vendor/symfony/config/Symfony/Component/Config/Util/XmlUtils.php +++ b/vendor/symfony/config/Symfony/Component/Config/Util/XmlUtils.php @@ -117,7 +117,7 @@ class XmlUtils * * The nested-tags are converted to keys (bar) * * @param \DomElement $element A \DomElement instance - * @param Boolean $checkPrefix Check prefix in an element or an attribute name + * @param bool $checkPrefix Check prefix in an element or an attribute name * * @return array A PHP array */ @@ -186,7 +186,7 @@ class XmlUtils switch (true) { case 'null' === $lowercaseValue: - return null; + return; case ctype_digit($value): $raw = $value; $cast = intval($value); diff --git a/vendor/symfony/console/Symfony/Component/Console/Application.php b/vendor/symfony/console/Symfony/Component/Console/Application.php index b7d423d73b..3f08f7f4b0 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Application.php +++ b/vendor/symfony/console/Symfony/Component/Console/Application.php @@ -99,7 +99,7 @@ class Application * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * - * @return integer 0 if everything went fine, or an error code + * @return int 0 if everything went fine, or an error code * * @throws \Exception When doRun returns Exception * @@ -159,7 +159,7 @@ class Application * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * - * @return integer 0 if everything went fine, or an error code + * @return int 0 if everything went fine, or an error code */ public function doRun(InputInterface $input, OutputInterface $output) { @@ -270,25 +270,25 @@ class Application /** * Sets whether to catch exceptions or not during commands execution. * - * @param Boolean $boolean Whether to catch exceptions or not during commands execution + * @param bool $boolean Whether to catch exceptions or not during commands execution * * @api */ public function setCatchExceptions($boolean) { - $this->catchExceptions = (Boolean) $boolean; + $this->catchExceptions = (bool) $boolean; } /** * Sets whether to automatically exit after a command execution or not. * - * @param Boolean $boolean Whether to automatically exit after a command execution or not + * @param bool $boolean Whether to automatically exit after a command execution or not * * @api */ public function setAutoExit($boolean) { - $this->autoExit = (Boolean) $boolean; + $this->autoExit = (bool) $boolean; } /** @@ -453,7 +453,7 @@ class Application * * @param string $name The command name or alias * - * @return Boolean true if the command exists, false otherwise + * @return bool true if the command exists, false otherwise * * @api */ @@ -633,7 +633,7 @@ class Application * Returns a text representation of the Application. * * @param string $namespace An optional namespace name - * @param boolean $raw Whether to return raw command list + * @param bool $raw Whether to return raw command list * * @return string A string representing the Application * @@ -652,7 +652,7 @@ class Application * Returns an XML representation of the Application. * * @param string $namespace An optional namespace name - * @param Boolean $asDom Whether to return a DOM or an XML string + * @param bool $asDom Whether to return a DOM or an XML string * * @return string|\DOMDocument An XML string representing the Application * @@ -695,8 +695,11 @@ class Application do { $title = sprintf(' [%s] ', get_class($e)); $len = $strlen($title); + $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX; // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327 - $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : (defined('HHVM_VERSION') ? 1 << 31 : PHP_INT_MAX); + if (defined('HHVM_VERSION') && $width > 1 << 31) { + $width = 1 << 31; + } $formatter = $output->getFormatter(); $lines = array(); foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) { @@ -820,8 +823,8 @@ class Application * * Can be useful to force terminal dimensions for functional tests. * - * @param integer $width The width - * @param integer $height The height + * @param int $width The width + * @param int $height The height * * @return Application The current application */ @@ -878,7 +881,7 @@ class Application * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * - * @return integer 0 if everything went fine, or an error code + * @return int 0 if everything went fine, or an error code */ protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Command/Command.php b/vendor/symfony/console/Symfony/Component/Console/Command/Command.php index 614a034c8c..ebab4ad669 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Command/Command.php +++ b/vendor/symfony/console/Symfony/Component/Console/Command/Command.php @@ -133,7 +133,7 @@ class Command * Override this to check for x or y and return false if the command can not * run properly under the current conditions. * - * @return Boolean + * @return bool */ public function isEnabled() { @@ -158,7 +158,7 @@ class Command * @param InputInterface $input An InputInterface instance * @param OutputInterface $output An OutputInterface instance * - * @return null|integer null or 0 if everything went fine, or an error code + * @return null|int null or 0 if everything went fine, or an error code * * @throws \LogicException When this abstract method is not implemented * @see setCode() @@ -201,7 +201,7 @@ class Command * @param InputInterface $input An InputInterface instance * @param OutputInterface $output An OutputInterface instance * - * @return integer The command exit code + * @return int The command exit code * * @throws \Exception * @@ -276,7 +276,7 @@ class Command * * This method is not part of public API and should not be used directly. * - * @param Boolean $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments + * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments */ public function mergeApplicationDefinition($mergeArgs = true) { @@ -351,7 +351,7 @@ class Command * Adds an argument. * * @param string $name The argument name - * @param integer $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL + * @param int $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL * @param string $description A description text * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) * @@ -371,7 +371,7 @@ class Command * * @param string $name The option name * @param string $shortcut The shortcut (can be null) - * @param integer $mode The option mode: One of the InputOption::VALUE_* constants + * @param int $mode The option mode: One of the InputOption::VALUE_* constants * @param string $description A description text * @param mixed $default The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE) * @@ -584,7 +584,7 @@ class Command /** * Returns an XML representation of the command. * - * @param Boolean $asDom Whether to return a DOM or an XML string + * @param bool $asDom Whether to return a DOM or an XML string * * @return string|\DOMDocument An XML string representing the command * diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php index 23a7dca86f..ab7acc63d7 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php +++ b/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php @@ -60,7 +60,7 @@ abstract class Descriptor implements DescriptorInterface * Writes content to output. * * @param string $content - * @param boolean $decorated + * @param bool $decorated */ protected function write($content, $decorated = false) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php index a8619b713f..7075903cc9 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php +++ b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php @@ -58,7 +58,7 @@ class ConsoleExceptionEvent extends ConsoleEvent /** * Gets the exit code. * - * @return integer The command exit code + * @return int The command exit code */ public function getExitCode() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php index 7eeea60da4..ea3318d067 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php +++ b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php @@ -25,7 +25,7 @@ class ConsoleTerminateEvent extends ConsoleEvent /** * The exit code of the command. * - * @var integer + * @var int */ private $exitCode; @@ -39,7 +39,7 @@ class ConsoleTerminateEvent extends ConsoleEvent /** * Sets the exit code. * - * @param integer $exitCode The command exit code + * @param int $exitCode The command exit code */ public function setExitCode($exitCode) { @@ -49,7 +49,7 @@ class ConsoleTerminateEvent extends ConsoleEvent /** * Gets the exit code. * - * @return integer The command exit code + * @return int The command exit code */ public function getExitCode() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php index 7b78882e34..ca5f28731e 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php +++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php @@ -39,14 +39,14 @@ class OutputFormatter implements OutputFormatterInterface /** * Initializes console output formatter. * - * @param Boolean $decorated Whether this formatter should actually decorate strings + * @param bool $decorated Whether this formatter should actually decorate strings * @param OutputFormatterStyleInterface[] $styles Array of "name => FormatterStyle" instances * * @api */ public function __construct($decorated = false, array $styles = array()) { - $this->decorated = (Boolean) $decorated; + $this->decorated = (bool) $decorated; $this->setStyle('error', new OutputFormatterStyle('white', 'red')); $this->setStyle('info', new OutputFormatterStyle('green')); @@ -63,19 +63,19 @@ class OutputFormatter implements OutputFormatterInterface /** * Sets the decorated flag. * - * @param Boolean $decorated Whether to decorate the messages or not + * @param bool $decorated Whether to decorate the messages or not * * @api */ public function setDecorated($decorated) { - $this->decorated = (Boolean) $decorated; + $this->decorated = (bool) $decorated; } /** * Gets the decorated flag. * - * @return Boolean true if the output will decorate messages, false otherwise + * @return bool true if the output will decorate messages, false otherwise * * @api */ @@ -102,7 +102,7 @@ class OutputFormatter implements OutputFormatterInterface * * @param string $name * - * @return Boolean + * @return bool * * @api */ @@ -194,7 +194,7 @@ class OutputFormatter implements OutputFormatterInterface * * @param string $string * - * @return OutputFormatterStyle|Boolean false if string is not format string + * @return OutputFormatterStyle|bool false if string is not format string */ private function createStyleFromString($string) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php index 0836084236..151adcd574 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php +++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php @@ -23,7 +23,7 @@ interface OutputFormatterInterface /** * Sets the decorated flag. * - * @param Boolean $decorated Whether to decorate the messages or not + * @param bool $decorated Whether to decorate the messages or not * * @api */ @@ -32,7 +32,7 @@ interface OutputFormatterInterface /** * Gets the decorated flag. * - * @return Boolean true if the output will decorate messages, false otherwise + * @return bool true if the output will decorate messages, false otherwise * * @api */ @@ -53,7 +53,7 @@ interface OutputFormatterInterface * * @param string $name * - * @return Boolean + * @return bool * * @api */ diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php index 7a4686fa11..84fe0ad055 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php @@ -31,12 +31,12 @@ class DialogHelper extends InputAwareHelper * @param OutputInterface $output An Output instance * @param string|array $question The question to ask * @param array $choices List of choices to pick from - * @param Boolean|string $default The default answer if the user enters nothing - * @param Boolean|integer $attempts Max number of times to ask before giving up (false by default, which means infinite) + * @param bool|string $default The default answer if the user enters nothing + * @param bool|int $attempts Max number of times to ask before giving up (false by default, which means infinite) * @param string $errorMessage Message which will be shown if invalid value from choice list would be picked - * @param Boolean $multiselect Select more than one value separated by comma + * @param bool $multiselect Select more than one value separated by comma * - * @return integer|string|array The selected value or values (the key of the choices array) + * @return int|string|array The selected value or values (the key of the choices array) * * @throws \InvalidArgumentException */ @@ -227,9 +227,9 @@ class DialogHelper extends InputAwareHelper * * @param OutputInterface $output An Output instance * @param string|array $question The question to ask - * @param Boolean $default The default answer if the user enters nothing + * @param bool $default The default answer if the user enters nothing * - * @return Boolean true if the user has confirmed, false otherwise + * @return bool true if the user has confirmed, false otherwise */ public function askConfirmation(OutputInterface $output, $question, $default = true) { @@ -250,7 +250,7 @@ class DialogHelper extends InputAwareHelper * * @param OutputInterface $output An Output instance * @param string|array $question The question - * @param Boolean $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not + * @param bool $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not * * @return string The answer * @@ -325,7 +325,7 @@ class DialogHelper extends InputAwareHelper * @param OutputInterface $output An Output instance * @param string|array $question The question to ask * @param callable $validator A PHP callback - * @param integer $attempts Max number of times to ask before giving up (false by default, which means infinite) + * @param int $attempts Max number of times to ask before giving up (false by default, which means infinite) * @param string $default The default answer if none is given by the user * @param array $autocomplete List of values to autocomplete * @@ -354,8 +354,8 @@ class DialogHelper extends InputAwareHelper * @param OutputInterface $output An Output instance * @param string|array $question The question to ask * @param callable $validator A PHP callback - * @param integer $attempts Max number of times to ask before giving up (false by default, which means infinite) - * @param Boolean $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not + * @param int $attempts Max number of times to ask before giving up (false by default, which means infinite) + * @param bool $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not * * @return string The response * @@ -397,7 +397,7 @@ class DialogHelper extends InputAwareHelper } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getName() { @@ -407,7 +407,7 @@ class DialogHelper extends InputAwareHelper /** * Return a valid Unix shell * - * @return string|Boolean The valid shell name, false in case no valid shell is found + * @return string|bool The valid shell name, false in case no valid shell is found */ private function getShell() { @@ -448,7 +448,7 @@ class DialogHelper extends InputAwareHelper * @param callable $interviewer A callable that will ask for a question and return the result * @param OutputInterface $output An Output instance * @param callable $validator A PHP callback - * @param integer $attempts Max number of times to ask before giving up ; false will ask infinitely + * @param int $attempts Max number of times to ask before giving up ; false will ask infinitely * * @return string The validated response * diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php index a5f1d1ccad..b94294345e 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php @@ -39,7 +39,7 @@ class FormatterHelper extends Helper * * @param string|array $messages The message to write in the block * @param string $style The style to apply to the whole block - * @param Boolean $large Whether to return a large block + * @param bool $large Whether to return a large block * * @return string The formatter message */ @@ -71,7 +71,7 @@ class FormatterHelper extends Helper } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getName() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php index 534b9f4319..0d3ff3af0a 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php @@ -45,7 +45,7 @@ abstract class Helper implements HelperInterface * * @param string $string The string to check its length * - * @return integer The length of the string + * @return int The length of the string */ protected function strlen($string) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php b/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php index e080678bce..76fa2e4cba 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php @@ -56,7 +56,7 @@ class HelperSet implements \IteratorAggregate * * @param string $name The helper name * - * @return Boolean true if the helper is defined, false otherwise + * @return bool true if the helper is defined, false otherwise */ public function has($name) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php index 0d91202029..4261767423 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php @@ -24,7 +24,7 @@ abstract class InputAwareHelper extends Helper implements InputAwareInterface protected $input; /** - * {@inheritDoc} + * {@inheritdoc} */ public function setInput(InputInterface $input) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php index 20345e515d..647d61690b 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php @@ -47,21 +47,21 @@ class ProgressHelper extends Helper /** * Current step * - * @var integer + * @var int */ private $current; /** * Maximum number of steps * - * @var integer + * @var int */ private $max; /** * Start time of the progress bar * - * @var integer + * @var int */ private $startTime; @@ -178,7 +178,7 @@ class ProgressHelper extends Helper * Starts the progress output. * * @param OutputInterface $output An Output instance - * @param integer|null $max Maximum steps + * @param int|null $max Maximum steps */ public function start(OutputInterface $output, $max = null) { @@ -220,8 +220,8 @@ class ProgressHelper extends Helper /** * Advances the progress output X steps. * - * @param integer $step Number of steps to advance - * @param Boolean $redraw Whether to redraw or not + * @param int $step Number of steps to advance + * @param bool $redraw Whether to redraw or not * * @throws \LogicException */ @@ -233,8 +233,8 @@ class ProgressHelper extends Helper /** * Sets the current progress. * - * @param integer $current The current progress - * @param Boolean $redraw Whether to redraw or not + * @param int $current The current progress + * @param bool $redraw Whether to redraw or not * * @throws \LogicException */ @@ -267,7 +267,7 @@ class ProgressHelper extends Helper /** * Outputs the current progress string. * - * @param Boolean $finish Forces the end result + * @param bool $finish Forces the end result * * @throws \LogicException */ @@ -340,7 +340,7 @@ class ProgressHelper extends Helper /** * Generates the array map of format variables to values. * - * @param Boolean $finish Forces the end result + * @param bool $finish Forces the end result * * @return array Array of format vars and values */ @@ -398,7 +398,7 @@ class ProgressHelper extends Helper /** * Converts seconds into human-readable format. * - * @param integer $secs Number of seconds + * @param int $secs Number of seconds * * @return string Time in readable format */ @@ -443,7 +443,7 @@ class ProgressHelper extends Helper } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getName() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php index d6ad0e9e01..3281fc8cea 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php +++ b/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php @@ -313,7 +313,7 @@ class TableHelper extends Helper /** * Sets cell padding type. * - * @param integer $padType STR_PAD_* + * @param int $padType STR_PAD_* * * @return TableHelper */ @@ -414,7 +414,7 @@ class TableHelper extends Helper * Renders table cell with padding. * * @param array $row - * @param integer $column + * @param int $column * @param string $cellFormat */ private function renderCell(array $row, $column, $cellFormat) @@ -457,7 +457,7 @@ class TableHelper extends Helper /** * Gets column width. * - * @param integer $column + * @param int $column * * @return int */ @@ -480,7 +480,7 @@ class TableHelper extends Helper * Gets cell width. * * @param array $row - * @param integer $column + * @param int $column * * @return int */ @@ -511,7 +511,7 @@ class TableHelper extends Helper } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getName() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php b/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php index 0d6b327629..3a0f0a7193 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php @@ -278,7 +278,7 @@ class ArgvInput extends Input * * @param string|array $values The value(s) to look for in the raw parameters (can be an array) * - * @return Boolean true if the value is contained in the raw parameters + * @return bool true if the value is contained in the raw parameters */ public function hasParameterOption($values) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php b/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php index ad9f2caa70..27d91323f3 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php @@ -65,7 +65,7 @@ class ArrayInput extends Input * * @param string|array $values The values to look for in the raw parameters (can be an array) * - * @return Boolean true if the value is contained in the raw parameters + * @return bool true if the value is contained in the raw parameters */ public function hasParameterOption($values) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/Input.php b/vendor/symfony/console/Symfony/Component/Console/Input/Input.php index 6366286c7e..494dd4220f 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/Input.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/Input.php @@ -81,7 +81,7 @@ abstract class Input implements InputInterface /** * Checks if the input is interactive. * - * @return Boolean Returns true if the input is interactive + * @return bool Returns true if the input is interactive */ public function isInteractive() { @@ -91,11 +91,11 @@ abstract class Input implements InputInterface /** * Sets the input interactivity. * - * @param Boolean $interactive If the input should be interactive + * @param bool $interactive If the input should be interactive */ public function setInteractive($interactive) { - $this->interactive = (Boolean) $interactive; + $this->interactive = (bool) $interactive; } /** @@ -146,9 +146,9 @@ abstract class Input implements InputInterface /** * Returns true if an InputArgument object exists by name or position. * - * @param string|integer $name The InputArgument name or position + * @param string|int $name The InputArgument name or position * - * @return Boolean true if the InputArgument object exists, false otherwise + * @return bool true if the InputArgument object exists, false otherwise */ public function hasArgument($name) { @@ -187,7 +187,7 @@ abstract class Input implements InputInterface * Sets an option value by name. * * @param string $name The option name - * @param string|boolean $value The option value + * @param string|bool $value The option value * * @throws \InvalidArgumentException When option given doesn't exist */ @@ -205,7 +205,7 @@ abstract class Input implements InputInterface * * @param string $name The InputOption name * - * @return Boolean true if the InputOption object exists, false otherwise + * @return bool true if the InputOption object exists, false otherwise */ public function hasOption($name) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php index ffe977271b..bf9c99e142 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php @@ -33,7 +33,7 @@ class InputArgument * Constructor. * * @param string $name The argument name - * @param integer $mode The argument mode: self::REQUIRED or self::OPTIONAL + * @param int $mode The argument mode: self::REQUIRED or self::OPTIONAL * @param string $description A description text * @param mixed $default The default value (for self::OPTIONAL mode only) * @@ -69,7 +69,7 @@ class InputArgument /** * Returns true if the argument is required. * - * @return Boolean true if parameter mode is self::REQUIRED, false otherwise + * @return bool true if parameter mode is self::REQUIRED, false otherwise */ public function isRequired() { @@ -79,7 +79,7 @@ class InputArgument /** * Returns true if the argument can take multiple values. * - * @return Boolean true if mode is self::IS_ARRAY, false otherwise + * @return bool true if mode is self::IS_ARRAY, false otherwise */ public function isArray() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php index c1cab5be34..46579a27fe 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php @@ -149,7 +149,7 @@ class InputDefinition /** * Returns an InputArgument by name or by position. * - * @param string|integer $name The InputArgument name or position + * @param string|int $name The InputArgument name or position * * @return InputArgument An InputArgument object * @@ -171,9 +171,9 @@ class InputDefinition /** * Returns true if an InputArgument object exists by name or position. * - * @param string|integer $name The InputArgument name or position + * @param string|int $name The InputArgument name or position * - * @return Boolean true if the InputArgument object exists, false otherwise + * @return bool true if the InputArgument object exists, false otherwise * * @api */ @@ -199,7 +199,7 @@ class InputDefinition /** * Returns the number of InputArguments. * - * @return integer The number of InputArguments + * @return int The number of InputArguments */ public function getArgumentCount() { @@ -209,7 +209,7 @@ class InputDefinition /** * Returns the number of required InputArguments. * - * @return integer The number of required InputArguments + * @return int The number of required InputArguments */ public function getArgumentRequiredCount() { @@ -315,7 +315,7 @@ class InputDefinition * * @param string $name The InputOption name * - * @return Boolean true if the InputOption object exists, false otherwise + * @return bool true if the InputOption object exists, false otherwise * * @api */ @@ -341,7 +341,7 @@ class InputDefinition * * @param string $name The InputOption shortcut * - * @return Boolean true if the InputOption object exists, false otherwise + * @return bool true if the InputOption object exists, false otherwise */ public function hasShortcut($name) { @@ -436,7 +436,7 @@ class InputDefinition /** * Returns an XML representation of the InputDefinition. * - * @param Boolean $asDom Whether to return a DOM or an XML string + * @param bool $asDom Whether to return a DOM or an XML string * * @return string|\DOMDocument An XML string representing the InputDefinition * diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php index cf0270caa2..befa272c4b 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php @@ -33,7 +33,7 @@ interface InputInterface * * @param string|array $values The values to look for in the raw parameters (can be an array) * - * @return Boolean true if the value is contained in the raw parameters + * @return bool true if the value is contained in the raw parameters */ public function hasParameterOption($values); @@ -95,9 +95,9 @@ interface InputInterface /** * Returns true if an InputArgument object exists by name or position. * - * @param string|integer $name The InputArgument name or position + * @param string|int $name The InputArgument name or position * - * @return Boolean true if the InputArgument object exists, false otherwise + * @return bool true if the InputArgument object exists, false otherwise */ public function hasArgument($name); @@ -121,7 +121,7 @@ interface InputInterface * Sets an option value by name. * * @param string $name The option name - * @param string|boolean $value The option value + * @param string|bool $value The option value * * @throws \InvalidArgumentException When option given doesn't exist */ @@ -132,21 +132,21 @@ interface InputInterface * * @param string $name The InputOption name * - * @return Boolean true if the InputOption object exists, false otherwise + * @return bool true if the InputOption object exists, false otherwise */ public function hasOption($name); /** * Is this input means interactive? * - * @return Boolean + * @return bool */ public function isInteractive(); /** * Sets the input interactivity. * - * @param Boolean $interactive If the input should be interactive + * @param bool $interactive If the input should be interactive */ public function setInteractive($interactive); } diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php index e1fdea04f2..18d05e9064 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php +++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php @@ -36,7 +36,7 @@ class InputOption * * @param string $name The option name * @param string|array $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts - * @param integer $mode The option mode: One of the VALUE_* constants + * @param int $mode The option mode: One of the VALUE_* constants * @param string $description A description text * @param mixed $default The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE) * @@ -112,7 +112,7 @@ class InputOption /** * Returns true if the option accepts a value. * - * @return Boolean true if value mode is not self::VALUE_NONE, false otherwise + * @return bool true if value mode is not self::VALUE_NONE, false otherwise */ public function acceptValue() { @@ -122,7 +122,7 @@ class InputOption /** * Returns true if the option requires a value. * - * @return Boolean true if value mode is self::VALUE_REQUIRED, false otherwise + * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise */ public function isValueRequired() { @@ -132,7 +132,7 @@ class InputOption /** * Returns true if the option takes an optional value. * - * @return Boolean true if value mode is self::VALUE_OPTIONAL, false otherwise + * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise */ public function isValueOptional() { @@ -142,7 +142,7 @@ class InputOption /** * Returns true if the option can take multiple values. * - * @return Boolean true if mode is self::VALUE_IS_ARRAY, false otherwise + * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise */ public function isArray() { @@ -197,7 +197,7 @@ class InputOption * Checks whether the given option equals this one * * @param InputOption $option option to compare - * @return Boolean + * @return bool */ public function equals(InputOption $option) { diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php b/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php index b305ab0005..b5eaf154fa 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php +++ b/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php @@ -35,8 +35,8 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface /** * Constructor. * - * @param integer $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param Boolean|null $decorated Whether to decorate messages (null for auto-guessing) + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) * * @api @@ -104,7 +104,7 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface * STDOUT and doesn't properly convert ASCII to EBCDIC, resulting in garbage * output. * - * @return boolean + * @return bool */ protected function hasStdoutSupport() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/Output.php b/vendor/symfony/console/Symfony/Component/Console/Output/Output.php index 94b9c88d76..22c81cdc36 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Output/Output.php +++ b/vendor/symfony/console/Symfony/Component/Console/Output/Output.php @@ -37,8 +37,8 @@ abstract class Output implements OutputInterface /** * Constructor. * - * @param integer $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param Boolean $decorated Whether to decorate messages + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool $decorated Whether to decorate messages * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) * * @api @@ -159,7 +159,7 @@ abstract class Output implements OutputInterface * Writes a message to the output. * * @param string $message A message to write to the output - * @param Boolean $newline Whether to add a newline or not + * @param bool $newline Whether to add a newline or not */ abstract protected function doWrite($message, $newline); } diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php b/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php index 83d5013fdd..ad128c68c7 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php +++ b/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php @@ -36,8 +36,8 @@ interface OutputInterface * Writes a message to the output. * * @param string|array $messages The message as an array of lines or a single string - * @param Boolean $newline Whether to add a newline - * @param integer $type The type of output (one of the OUTPUT constants) + * @param bool $newline Whether to add a newline + * @param int $type The type of output (one of the OUTPUT constants) * * @throws \InvalidArgumentException When unknown output type is given * @@ -49,7 +49,7 @@ interface OutputInterface * Writes a message to the output and adds a newline at the end. * * @param string|array $messages The message as an array of lines of a single string - * @param integer $type The type of output (one of the OUTPUT constants) + * @param int $type The type of output (one of the OUTPUT constants) * * @throws \InvalidArgumentException When unknown output type is given * @@ -60,7 +60,7 @@ interface OutputInterface /** * Sets the verbosity of the output. * - * @param integer $level The level of verbosity (one of the VERBOSITY constants) + * @param int $level The level of verbosity (one of the VERBOSITY constants) * * @api */ @@ -69,7 +69,7 @@ interface OutputInterface /** * Gets the current verbosity of the output. * - * @return integer The current level of verbosity (one of the VERBOSITY constants) + * @return int The current level of verbosity (one of the VERBOSITY constants) * * @api */ @@ -78,7 +78,7 @@ interface OutputInterface /** * Sets the decorated flag. * - * @param Boolean $decorated Whether to decorate the messages + * @param bool $decorated Whether to decorate the messages * * @api */ @@ -87,7 +87,7 @@ interface OutputInterface /** * Gets the decorated flag. * - * @return Boolean true if the output will decorate messages, false otherwise + * @return bool true if the output will decorate messages, false otherwise * * @api */ diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php b/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php index 4194ed3d1e..6415fa2a94 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php +++ b/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php @@ -36,8 +36,8 @@ class StreamOutput extends Output * Constructor. * * @param mixed $stream A stream resource - * @param integer $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param Boolean|null $decorated Whether to decorate messages (null for auto-guessing) + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) * * @throws \InvalidArgumentException When first argument is not a real stream @@ -92,7 +92,7 @@ class StreamOutput extends Output * - Windows without Ansicon and ConEmu * - non tty consoles * - * @return Boolean true if the stream supports colorization, false otherwise + * @return bool true if the stream supports colorization, false otherwise */ protected function hasColorSupport() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Shell.php b/vendor/symfony/console/Symfony/Component/Console/Shell.php index 3ea11dc371..75a11743a5 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Shell.php +++ b/vendor/symfony/console/Symfony/Component/Console/Shell.php @@ -163,7 +163,7 @@ EOF; * * @param string $text The last segment of the entered text * - * @return Boolean|array A list of guessed strings or true + * @return bool|array A list of guessed strings or true */ private function autocompleter($text) { @@ -219,7 +219,7 @@ EOF; public function setProcessIsolation($processIsolation) { - $this->processIsolation = (Boolean) $processIsolation; + $this->processIsolation = (bool) $processIsolation; if ($this->processIsolation && !class_exists('Symfony\\Component\\Process\\Process')) { throw new \RuntimeException('Unable to isolate processes as the Symfony Process Component is not installed.'); diff --git a/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php b/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php index dd7c2a5dc0..1630a97406 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php +++ b/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php @@ -56,7 +56,7 @@ class ApplicationTester * @param array $input An array of arguments and options * @param array $options An array of options * - * @return integer The command exit code + * @return int The command exit code */ public function run(array $input, $options = array()) { @@ -79,7 +79,7 @@ class ApplicationTester /** * Gets the display returned by the last execution of the application. * - * @param Boolean $normalize Whether to normalize end of lines to \n or not + * @param bool $normalize Whether to normalize end of lines to \n or not * * @return string The display */ @@ -119,7 +119,7 @@ class ApplicationTester /** * Gets the status code returned by the last execution of the application. * - * @return integer The status code + * @return int The status code */ public function getStatusCode() { diff --git a/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php b/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php index 6866bc6420..fe94d1ebb9 100644 --- a/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php +++ b/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php @@ -51,7 +51,7 @@ class CommandTester * @param array $input An array of arguments and options * @param array $options An array of options * - * @return integer The command exit code + * @return int The command exit code */ public function execute(array $input, array $options = array()) { @@ -83,7 +83,7 @@ class CommandTester /** * Gets the display returned by the last execution of the command. * - * @param Boolean $normalize Whether to normalize end of lines to \n or not + * @param bool $normalize Whether to normalize end of lines to \n or not * * @return string The display */ @@ -123,7 +123,7 @@ class CommandTester /** * Gets the status code returned by the last execution of the application. * - * @return integer The status code + * @return int The status code */ public function getStatusCode() { diff --git a/vendor/symfony/debug/Symfony/Component/Debug/Debug.php b/vendor/symfony/debug/Symfony/Component/Debug/Debug.php index c3fa48b50d..e0710c59e6 100644 --- a/vendor/symfony/debug/Symfony/Component/Debug/Debug.php +++ b/vendor/symfony/debug/Symfony/Component/Debug/Debug.php @@ -28,8 +28,8 @@ class Debug * If the Symfony ClassLoader component is available, a special * class loader is also registered. * - * @param integer $errorReportingLevel The level of error reporting you want - * @param Boolean $displayErrors Whether to display errors (for development) or just log them (for production) + * @param int $errorReportingLevel The level of error reporting you want + * @param bool $displayErrors Whether to display errors (for development) or just log them (for production) */ public static function enable($errorReportingLevel = null, $displayErrors = true) { diff --git a/vendor/symfony/debug/Symfony/Component/Debug/DebugClassLoader.php b/vendor/symfony/debug/Symfony/Component/Debug/DebugClassLoader.php index a0c6c5a4f9..67db200288 100644 --- a/vendor/symfony/debug/Symfony/Component/Debug/DebugClassLoader.php +++ b/vendor/symfony/debug/Symfony/Component/Debug/DebugClassLoader.php @@ -110,7 +110,7 @@ class DebugClassLoader * * @param string $class The name of the class * - * @return Boolean|null True, if loaded + * @return bool|null True, if loaded * * @throws \RuntimeException */ diff --git a/vendor/symfony/debug/Symfony/Component/Debug/ErrorHandler.php b/vendor/symfony/debug/Symfony/Component/Debug/ErrorHandler.php index 18bdea9e79..4974dc5881 100644 --- a/vendor/symfony/debug/Symfony/Component/Debug/ErrorHandler.php +++ b/vendor/symfony/debug/Symfony/Component/Debug/ErrorHandler.php @@ -59,8 +59,8 @@ class ErrorHandler /** * Registers the error handler. * - * @param integer $level The level at which the conversion to Exception is done (null to use the error_reporting() value and 0 to disable) - * @param Boolean $displayErrors Display errors (for dev environment) or just log them (production usage) + * @param int $level The level at which the conversion to Exception is done (null to use the error_reporting() value and 0 to disable) + * @param bool $displayErrors Display errors (for dev environment) or just log them (production usage) * * @return ErrorHandler The registered error handler */ @@ -81,7 +81,7 @@ class ErrorHandler /** * Sets the level at which the conversion to Exception is done. * - * @param integer|null $level The level (null to use the error_reporting() value and 0 to disable) + * @param int|null $level The level (null to use the error_reporting() value and 0 to disable) */ public function setLevel($level) { @@ -91,7 +91,7 @@ class ErrorHandler /** * Sets the display_errors flag value. * - * @param integer $displayErrors The display_errors flag value + * @param int $displayErrors The display_errors flag value */ public function setDisplayErrors($displayErrors) { diff --git a/vendor/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php b/vendor/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php index 458d647f0b..9688c711b6 100644 --- a/vendor/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php +++ b/vendor/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php @@ -43,7 +43,7 @@ class ExceptionHandler /** * Registers the exception handler. * - * @param Boolean $debug + * @param bool $debug * * @return ExceptionHandler The registered exception handler */ diff --git a/vendor/symfony/debug/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php b/vendor/symfony/debug/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php index 98418b0497..1554a810a2 100644 --- a/vendor/symfony/debug/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php +++ b/vendor/symfony/debug/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php @@ -150,7 +150,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface */ private function convertFileToClass($path, $file) { - $namespacedClass = str_replace(array($path.'/', '.php', '/'), array('', '', '\\'), $file); + $namespacedClass = str_replace(array($path.DIRECTORY_SEPARATOR, '.php', '/'), array('', '', '\\'), $file); $pearClass = str_replace('\\', '_', $namespacedClass); // We cannot use the autoloader here as most of them use require; but if the class @@ -172,7 +172,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface /** * @param string $class * - * @return Boolean + * @return bool */ private function classExists($class) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php index fd75578cdb..021b0c650e 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php @@ -23,7 +23,7 @@ class Alias * Constructor. * * @param string $id Alias identifier - * @param Boolean $public If this alias is public + * @param bool $public If this alias is public * * @api */ @@ -36,7 +36,7 @@ class Alias /** * Checks if this DI Alias should be public or not. * - * @return Boolean + * @return bool * * @api */ @@ -48,13 +48,13 @@ class Alias /** * Sets if this Alias is public. * - * @param Boolean $boolean If this Alias should be public + * @param bool $boolean If this Alias should be public * * @api */ public function setPublic($boolean) { - $this->public = (Boolean) $boolean; + $this->public = (bool) $boolean; } /** diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php index f7aa471dd8..4a907ece29 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php @@ -36,15 +36,15 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface /** * Constructor. * - * @param Boolean $onlyConstructorArguments Sets this Service Reference pass to ignore method calls + * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls */ public function __construct($onlyConstructorArguments = false) { - $this->onlyConstructorArguments = (Boolean) $onlyConstructorArguments; + $this->onlyConstructorArguments = (bool) $onlyConstructorArguments; } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setRepeatedPass(RepeatedPass $repeatedPass) { @@ -132,7 +132,7 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface } if (!$this->container->hasDefinition($id)) { - return null; + return; } return $id; diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php index 9351b11b39..aa11d38da1 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php @@ -159,7 +159,7 @@ class CheckReferenceValidityPass implements CompilerPassInterface private function getDefinition($id) { if (!$this->container->hasDefinition($id)) { - return null; + return; } return $this->container->getDefinition($id); diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php index ba1688f5e8..5d4f2bf58b 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php @@ -30,7 +30,7 @@ class InlineServiceDefinitionsPass implements RepeatablePassInterface private $currentId; /** - * {@inheritDoc} + * {@inheritdoc} */ public function setRepeatedPass(RepeatedPass $repeatedPass) { @@ -109,7 +109,7 @@ class InlineServiceDefinitionsPass implements RepeatablePassInterface * @param string $id * @param Definition $definition * - * @return Boolean If the definition is inlineable + * @return bool If the definition is inlineable */ private function isInlineableDefinition(ContainerBuilder $container, $id, Definition $definition) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php index 7573084c36..92a9887040 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php @@ -22,7 +22,7 @@ use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; class MergeExtensionConfigurationPass implements CompilerPassInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php index 0c7be667a1..9e18a9ebde 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php @@ -23,7 +23,7 @@ class RemoveUnusedDefinitionsPass implements RepeatablePassInterface private $repeatedPass; /** - * {@inheritDoc} + * {@inheritdoc} */ public function setRepeatedPass(RepeatedPass $repeatedPass) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php index 6073abe69d..9b7db40324 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php @@ -22,7 +22,7 @@ use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; class RepeatedPass implements CompilerPassInterface { /** - * @var Boolean + * @var bool */ private $repeat = false; diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php index 4699ac3414..4527840e73 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php @@ -127,7 +127,7 @@ class ResolveDefinitionTemplatesPass implements CompilerPassInterface throw new RuntimeException(sprintf('Invalid argument key "%s" found.', $k)); } - $index = (integer) substr($k, strlen('index_')); + $index = (int) substr($k, strlen('index_')); $def->replaceArgument($index, $v); } diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php index 93d5806036..83aef9b2c6 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php @@ -70,7 +70,7 @@ class ResolveInvalidReferencesPass implements CompilerPassInterface * Processes arguments to determine invalid references. * * @param array $arguments An array of Reference objects - * @param Boolean $inMethodCall + * @param bool $inMethodCall * * @return array * diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php index 1de14fa62f..dc9a1a00ea 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php @@ -33,7 +33,7 @@ class ServiceReferenceGraph * * @param string $id Id to check * - * @return Boolean + * @return bool */ public function hasNode($id) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php index 283f6de5ba..cc7288e8ed 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php @@ -63,7 +63,7 @@ class ServiceReferenceGraphNode /** * Checks if the value of this node is an Alias. * - * @return Boolean True if the value is an Alias instance + * @return bool True if the value is an Alias instance */ public function isAlias() { @@ -73,7 +73,7 @@ class ServiceReferenceGraphNode /** * Checks if the value of this node is a Definition. * - * @return Boolean True if the value is a Definition instance + * @return bool True if the value is a Definition instance */ public function isDefinition() { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php index c4d8f16f32..b27df26442 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php @@ -110,7 +110,7 @@ class Container implements IntrospectableContainerInterface /** * Returns true if the container parameter bag are frozen. * - * @return Boolean true if the container parameter bag are frozen, false otherwise + * @return bool true if the container parameter bag are frozen, false otherwise * * @api */ @@ -152,7 +152,7 @@ class Container implements IntrospectableContainerInterface * * @param string $name The parameter name * - * @return Boolean The presence of parameter in container + * @return bool The presence of parameter in container * * @api */ @@ -225,7 +225,7 @@ class Container implements IntrospectableContainerInterface * * @param string $id The service identifier * - * @return Boolean true if the service is defined, false otherwise + * @return bool true if the service is defined, false otherwise * * @api */ @@ -247,7 +247,7 @@ class Container implements IntrospectableContainerInterface * with a get{$id}Service() method, the former has always precedence. * * @param string $id The service identifier - * @param integer $invalidBehavior The behavior when the service does not exist + * @param int $invalidBehavior The behavior when the service does not exist * * @return object The associated service * @@ -303,7 +303,7 @@ class Container implements IntrospectableContainerInterface throw new ServiceNotFoundException($id, null, null, $alternatives); } - return null; + return; } $this->loading[$id] = true; @@ -318,7 +318,7 @@ class Container implements IntrospectableContainerInterface } if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) { - return null; + return; } throw $e; @@ -334,7 +334,7 @@ class Container implements IntrospectableContainerInterface * * @param string $id The service identifier * - * @return Boolean true if service has already been initialized, false otherwise + * @return bool true if service has already been initialized, false otherwise */ public function initialized($id) { @@ -491,7 +491,7 @@ class Container implements IntrospectableContainerInterface * * @param string $name The name of the scope * - * @return Boolean + * @return bool * * @api */ @@ -507,7 +507,7 @@ class Container implements IntrospectableContainerInterface * * @param string $name * - * @return Boolean + * @return bool * * @api */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php index 0e07ec6b15..9a42ce878b 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -90,17 +90,17 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * If you are not using the loaders and therefore don't want * to depend on the Config component, set this flag to false. * - * @param Boolean $track true if you want to track resources, false otherwise + * @param bool $track true if you want to track resources, false otherwise */ public function setResourceTracking($track) { - $this->trackResources = (Boolean) $track; + $this->trackResources = (bool) $track; } /** * Checks if resources are tracked. * - * @return Boolean true if resources are tracked, false otherwise + * @return bool true if resources are tracked, false otherwise */ public function isTrackingResources() { @@ -174,7 +174,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * * @param string $name The name of the extension * - * @return Boolean If the extension exists + * @return bool If the extension exists * * @api */ @@ -428,7 +428,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * * @param string $id The service identifier * - * @return Boolean true if the service is defined, false otherwise + * @return bool true if the service is defined, false otherwise * * @api */ @@ -443,7 +443,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * Gets a service. * * @param string $id The service identifier - * @param integer $invalidBehavior The behavior when the service does not exist + * @param int $invalidBehavior The behavior when the service does not exist * * @return object The associated service * @@ -464,7 +464,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface return parent::get($id, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE); } catch (InactiveScopeException $e) { if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) { - return null; + return; } throw $e; @@ -481,7 +481,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface $definition = $this->getDefinition($id); } catch (InvalidArgumentException $e) { if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) { - return null; + return; } throw $e; @@ -495,7 +495,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface unset($this->loading[$id]); if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) { - return null; + return; } throw $e; @@ -715,7 +715,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * * @param string $id The service identifier * - * @return Boolean true if the alias exists, false otherwise + * @return bool true if the alias exists, false otherwise * * @api */ @@ -845,7 +845,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * * @param string $id The service identifier * - * @return Boolean true if the service definition exists, false otherwise + * @return bool true if the service definition exists, false otherwise * * @api */ @@ -903,7 +903,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * * @param Definition $definition A service definition instance * @param string $id The service identifier - * @param Boolean $tryProxy Whether to try proxying the service with a lazy proxy + * @param bool $tryProxy Whether to try proxying the service with a lazy proxy * * @return object The service described by the service definition * diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php index 1951ae7b93..77ee42b57c 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php @@ -65,7 +65,7 @@ interface ContainerInterface * * @param string $id The service identifier * - * @return Boolean true if the service is defined, false otherwise + * @return bool true if the service is defined, false otherwise * * @api */ @@ -89,7 +89,7 @@ interface ContainerInterface * * @param string $name The parameter name * - * @return Boolean The presence of parameter in container + * @return bool The presence of parameter in container * * @api */ @@ -137,7 +137,7 @@ interface ContainerInterface * * @param string $name * - * @return Boolean + * @return bool * * @api */ @@ -150,7 +150,7 @@ interface ContainerInterface * * @param string $name * - * @return Boolean + * @return bool * * @api */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php index 428fee27c3..989651c56e 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php @@ -231,7 +231,7 @@ class Definition /** * Sets a specific argument * - * @param integer $index + * @param int $index * @param mixed $argument * * @return Definition The current instance @@ -266,7 +266,7 @@ class Definition /** * Gets an argument to pass to the service constructor/factory method. * - * @param integer $index + * @param int $index * * @return mixed The argument value * @@ -350,7 +350,7 @@ class Definition * * @param string $method The method name to search for * - * @return Boolean + * @return bool * * @api */ @@ -441,7 +441,7 @@ class Definition * * @param string $name * - * @return Boolean + * @return bool * * @api */ @@ -539,7 +539,7 @@ class Definition /** * Sets the visibility of this service. * - * @param Boolean $boolean + * @param bool $boolean * * @return Definition The current instance * @@ -547,7 +547,7 @@ class Definition */ public function setPublic($boolean) { - $this->public = (Boolean) $boolean; + $this->public = (bool) $boolean; return $this; } @@ -555,7 +555,7 @@ class Definition /** * Whether this service is public facing * - * @return Boolean + * @return bool * * @api */ @@ -567,7 +567,7 @@ class Definition /** * Sets the synchronized flag of this service. * - * @param Boolean $boolean + * @param bool $boolean * * @return Definition The current instance * @@ -575,7 +575,7 @@ class Definition */ public function setSynchronized($boolean) { - $this->synchronized = (Boolean) $boolean; + $this->synchronized = (bool) $boolean; return $this; } @@ -583,7 +583,7 @@ class Definition /** * Whether this service is synchronized. * - * @return Boolean + * @return bool * * @api */ @@ -595,13 +595,13 @@ class Definition /** * Sets the lazy flag of this service. * - * @param Boolean $lazy + * @param bool $lazy * * @return Definition The current instance */ public function setLazy($lazy) { - $this->lazy = (Boolean) $lazy; + $this->lazy = (bool) $lazy; return $this; } @@ -609,7 +609,7 @@ class Definition /** * Whether this service is lazy. * - * @return Boolean + * @return bool */ public function isLazy() { @@ -620,7 +620,7 @@ class Definition * Sets whether this definition is synthetic, that is not constructed by the * container, but dynamically injected. * - * @param Boolean $boolean + * @param bool $boolean * * @return Definition the current instance * @@ -628,7 +628,7 @@ class Definition */ public function setSynthetic($boolean) { - $this->synthetic = (Boolean) $boolean; + $this->synthetic = (bool) $boolean; return $this; } @@ -637,7 +637,7 @@ class Definition * Whether this definition is synthetic, that is not constructed by the * container, but dynamically injected. * - * @return Boolean + * @return bool * * @api */ @@ -650,7 +650,7 @@ class Definition * Whether this definition is abstract, that means it merely serves as a * template for other definitions. * - * @param Boolean $boolean + * @param bool $boolean * * @return Definition the current instance * @@ -658,7 +658,7 @@ class Definition */ public function setAbstract($boolean) { - $this->abstract = (Boolean) $boolean; + $this->abstract = (bool) $boolean; return $this; } @@ -667,7 +667,7 @@ class Definition * Whether this definition is abstract, that means it merely serves as a * template for other definitions. * - * @return Boolean + * @return bool * * @api */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php index b7eed8c564..497c394dff 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php @@ -65,7 +65,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -77,7 +77,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -89,7 +89,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -101,7 +101,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -113,7 +113,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -125,7 +125,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -137,7 +137,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -149,7 +149,7 @@ class DefinitionDecorator extends Definition } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -166,7 +166,7 @@ class DefinitionDecorator extends Definition * If replaceArgument() has been used to replace an argument, this method * will return the replacement value. * - * @param integer $index + * @param int $index * * @return mixed The argument value * @@ -197,7 +197,7 @@ class DefinitionDecorator extends Definition * certain conventions when you want to overwrite the arguments of the * parent definition, otherwise your arguments will only be appended. * - * @param integer $index + * @param int $index * @param mixed $value * * @return DefinitionDecorator the current instance diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php index 4499e52310..5ee1b7eea0 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php @@ -123,7 +123,7 @@ class GraphvizDumper extends Dumper * * @param string $id The service id used to find edges * @param array $arguments An array of arguments - * @param Boolean $required + * @param bool $required * @param string $name * * @return array An array of edges diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index 9b66cb5770..38ced88408 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -61,7 +61,7 @@ class PhpDumper extends Dumper private $proxyDumper; /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -372,7 +372,7 @@ class PhpDumper extends Dumper * @param string $id * @param Definition $definition * - * @return Boolean + * @return bool */ private function isSimpleInstance($id, $definition) { @@ -549,7 +549,7 @@ EOF; if ($definition->isLazy()) { $lazyInitialization = '$lazyLoad = true'; - $lazyInitializationDoc = "\n * @param boolean \$lazyLoad whether to try lazy-loading the service with a proxy\n *"; + $lazyInitializationDoc = "\n * @param bool \$lazyLoad whether to try lazy-loading the service with a proxy\n *"; } else { $lazyInitialization = ''; $lazyInitializationDoc = ''; @@ -927,7 +927,7 @@ EOF; } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getParameterBag() { @@ -962,7 +962,7 @@ EOF; * * @param array $parameters * @param string $path - * @param integer $indent + * @param int $indent * * @return string * @@ -1113,10 +1113,10 @@ EOF; * * @param string $id * @param array $arguments - * @param Boolean $deep + * @param bool $deep * @param array $visited * - * @return Boolean + * @return bool */ private function hasReference($id, array $arguments, $deep = false, array $visited = array()) { @@ -1151,7 +1151,7 @@ EOF; * Dumps values. * * @param array $value - * @param Boolean $interpolate + * @param bool $interpolate * * @return string * diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php index b4748545dc..3bdf654ee1 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php @@ -283,7 +283,7 @@ class YamlDumper extends Dumper * Prepares parameters. * * @param array $parameters - * @param Boolean $escape + * @param bool $escape * * @return array */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php index a39fe37ed4..0ebe4e484a 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php @@ -78,7 +78,7 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getConfiguration(array $config, ContainerBuilder $container) { @@ -96,8 +96,6 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn return $configuration; } } - - return null; } final protected function processConfiguration(ConfigurationInterface $configuration, array $configs) @@ -111,7 +109,7 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn * @param ContainerBuilder $container * @param array $config * - * @return Boolean Whether the configuration is enabled + * @return bool Whether the configuration is enabled * * @throws InvalidArgumentException When the config is not enableable */ @@ -121,6 +119,6 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn throw new InvalidArgumentException("The config array has no 'enabled' key."); } - return (Boolean) $container->getParameterBag()->resolveValue($config['enabled']); + return (bool) $container->getParameterBag()->resolveValue($config['enabled']); } } diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php index 34d6cada9a..c2fe7745d2 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php @@ -25,7 +25,7 @@ interface IntrospectableContainerInterface extends ContainerInterface * * @param string $id * - * @return Boolean true if the service has been initialized, false otherwise + * @return bool true if the service has been initialized, false otherwise * */ public function initialized($id); diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php index 6495df2813..cad9320039 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php @@ -15,7 +15,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Definition; /** - * {@inheritDoc} + * {@inheritdoc} * * Noop proxy instantiator - simply produces the real service instead of a proxy instance. * @@ -24,7 +24,7 @@ use Symfony\Component\DependencyInjection\Definition; class RealServiceInstantiator implements InstantiatorInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php index 83a2909fc2..30911d3a5e 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\DependencyInjection\Definition; class NullDumper implements DumperInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function isProxyCandidate(Definition $definition) { @@ -29,7 +29,7 @@ class NullDumper implements DumperInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getProxyFactoryCode(Definition $definition, $id) { @@ -37,7 +37,7 @@ class NullDumper implements DumperInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getProxyCode(Definition $definition) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php index 775a3525d8..30cbe0ebaf 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php @@ -52,7 +52,7 @@ class ClosureLoader extends Loader * @param mixed $resource A resource * @param string $type The resource type * - * @return Boolean true if this class supports the given resource, false otherwise + * @return bool true if this class supports the given resource, false otherwise */ public function supports($resource, $type = null) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php index e4b99f60d9..189eaa5fde 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php @@ -53,7 +53,7 @@ class IniFileLoader extends FileLoader * @param mixed $resource A resource * @param string $type The resource type * - * @return Boolean true if this class supports the given resource, false otherwise + * @return bool true if this class supports the given resource, false otherwise */ public function supports($resource, $type = null) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php index e866a29f70..f3139ad70a 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php @@ -48,7 +48,7 @@ class PhpFileLoader extends FileLoader * @param mixed $resource A resource * @param string $type The resource type * - * @return Boolean true if this class supports the given resource, false otherwise + * @return bool true if this class supports the given resource, false otherwise */ public function supports($resource, $type = null) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index 9b2d46d28e..a44a96d85a 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -66,7 +66,7 @@ class XmlFileLoader extends FileLoader * @param mixed $resource A resource * @param string $type The resource type * - * @return Boolean true if this class supports the given resource, false otherwise + * @return bool true if this class supports the given resource, false otherwise */ public function supports($resource, $type = null) { @@ -102,7 +102,7 @@ class XmlFileLoader extends FileLoader foreach ($imports as $import) { $this->setCurrentDir(dirname($file)); - $this->import((string) $import['resource'], null, (Boolean) $import->getAttributeAsPhp('ignore-errors'), $file); + $this->import((string) $import['resource'], null, (bool) $import->getAttributeAsPhp('ignore-errors'), $file); } } @@ -281,7 +281,7 @@ class XmlFileLoader extends FileLoader * * @param \DOMDocument $dom * - * @return Boolean + * @return bool * * @throws RuntimeException When extension references a non-existent XSD file */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php index 5a1f946277..7281a76254 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php @@ -74,7 +74,7 @@ class YamlFileLoader extends FileLoader * @param mixed $resource A resource * @param string $type The resource type * - * @return Boolean true if this class supports the given resource, false otherwise + * @return bool true if this class supports the given resource, false otherwise */ public function supports($resource, $type = null) { @@ -95,7 +95,7 @@ class YamlFileLoader extends FileLoader foreach ($content['imports'] as $import) { $this->setCurrentDir(dirname($file)); - $this->import($import['resource'], null, isset($import['ignore_errors']) ? (Boolean) $import['ignore_errors'] : false, $file); + $this->import($import['resource'], null, isset($import['ignore_errors']) ? (bool) $import['ignore_errors'] : false, $file); } } @@ -132,7 +132,7 @@ class YamlFileLoader extends FileLoader return; } elseif (isset($service['alias'])) { - $public = !array_key_exists('public', $service) || (Boolean) $service['public']; + $public = !array_key_exists('public', $service) || (bool) $service['public']; $this->container->setAlias($id, new Alias($service['alias'], $public)); return; diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php index 9664b134ef..dc936a0bd6 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php @@ -41,7 +41,7 @@ class FrozenParameterBag extends ParameterBag } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -51,7 +51,7 @@ class FrozenParameterBag extends ParameterBag } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ @@ -61,7 +61,7 @@ class FrozenParameterBag extends ParameterBag } /** - * {@inheritDoc} + * {@inheritdoc} * * @api */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php index dabd1c6215..1a339e56c0 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php @@ -127,7 +127,7 @@ class ParameterBag implements ParameterBagInterface * * @param string $name The parameter name * - * @return Boolean true if the parameter name is defined, false otherwise + * @return bool true if the parameter name is defined, false otherwise * * @api */ @@ -264,7 +264,7 @@ class ParameterBag implements ParameterBagInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function escapeValue($value) { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php index a26d6aee17..990f33a18f 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php @@ -75,7 +75,7 @@ interface ParameterBagInterface * * @param string $name The parameter name * - * @return Boolean true if the parameter name is defined, false otherwise + * @return bool true if the parameter name is defined, false otherwise * * @api */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php index 725747055c..d9de9f3904 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php @@ -29,7 +29,7 @@ class Reference * * @param string $id The service identifier * @param int $invalidBehavior The behavior when the service does not exist - * @param Boolean $strict Sets how this reference is validated + * @param bool $strict Sets how this reference is validated * * @see Container */ @@ -63,7 +63,7 @@ class Reference /** * Returns true when this Reference is strict * - * @return Boolean + * @return bool */ public function isStrict() { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php index db855f66d1..2ab15d517c 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php @@ -37,7 +37,7 @@ class SimpleXMLElement extends \SimpleXMLElement * Returns arguments as valid PHP types. * * @param string $name - * @param Boolean $lowercase + * @param bool $lowercase * * @return mixed */ diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php index 81ff7aa6fe..c9f8010268 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php @@ -36,6 +36,5 @@ class ProjectExtension implements ExtensionInterface public function getConfiguration(array $config, ContainerBuilder $container) { - return null; } } diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php index d1f9c0d166..ca9695adca 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php @@ -84,7 +84,7 @@ class ProjectServiceContainer extends Container } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getParameterBag() { diff --git a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php index c4b8e47586..9ea738db71 100644 --- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php +++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php @@ -263,7 +263,7 @@ class ProjectServiceContainer extends Container } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getParameterBag() { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php index 3b07bf49da..ac21ece6e0 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php @@ -44,7 +44,7 @@ class ContainerAwareEventManager extends EventManager * the name of the method that is invoked on listeners. * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. * If not supplied, the single empty EventArgs instance is used. - * @return boolean + * @return bool */ public function dispatchEvent($eventName, EventArgs $eventArgs = null) { @@ -81,7 +81,7 @@ class ContainerAwareEventManager extends EventManager * * @param string $event * - * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + * @return bool TRUE if the specified event has any listeners, FALSE otherwise. */ public function hasListeners($event) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php index 5fd3090a79..bcc4a2b5a4 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php @@ -291,8 +291,6 @@ abstract class AbstractDoctrineExtension extends Extension if (is_dir($dir.'/'.$this->getMappingObjectDefaultName())) { return 'annotation'; } - - return null; } /** diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php index 30479c8c01..2812b92ea9 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php @@ -33,7 +33,7 @@ class DoctrineValidationPass implements CompilerPassInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php index 24688d1c1a..62e71015bc 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php @@ -45,7 +45,7 @@ class RegisterEventListenersAndSubscribersPass implements CompilerPassInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php index 64c187469e..ac3ce490aa 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php @@ -156,7 +156,7 @@ abstract class RegisterMappingsPass implements CompilerPassInterface * * @param ContainerBuilder $container * - * @return boolean whether this compiler pass really should register the mappings + * @return bool whether this compiler pass really should register the mappings */ protected function enabled(ContainerBuilder $container) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php index 0ff25ee3e5..1c0e8cdfee 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php @@ -36,7 +36,7 @@ class DoctrineParserCache implements ParserCacheInterface public function fetch($key) { if (false === $value = $this->cache->fetch($key)) { - return null; + return; } return $value; diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php index 9719462f19..e29cba9e38 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php @@ -59,21 +59,21 @@ class EntityChoiceList extends ObjectChoiceList /** * Whether to use the identifier for index generation * - * @var Boolean + * @var bool */ private $idAsIndex = false; /** * Whether to use the identifier for value generation * - * @var Boolean + * @var bool */ private $idAsValue = false; /** * Whether the entities have already been loaded. * - * @var Boolean + * @var bool */ private $loaded = false; @@ -91,7 +91,7 @@ class EntityChoiceList extends ObjectChoiceList * @param string $class The class name * @param string $labelPath The property path used for the label * @param EntityLoaderInterface $entityLoader An optional query builder - * @param array $entities An array of choices + * @param array|\Traversable|null $entities An array of choices or null to lazy load * @param array $preferredEntities An array of preferred choices * @param string $groupPath A property path pointing to the property used * to group the choices. Only allowed if @@ -369,7 +369,7 @@ class EntityChoiceList extends ObjectChoiceList * * @param mixed $entity The choice to create an index for * - * @return integer|string A unique index containing only ASCII letters, + * @return int|string A unique index containing only ASCII letters, * digits and underscores. */ protected function createIndex($entity) @@ -390,7 +390,7 @@ class EntityChoiceList extends ObjectChoiceList * * @param mixed $entity The choice to create a value for * - * @return integer|string A unique value without character limitations. + * @return int|string A unique value without character limitations. */ protected function createValue($entity) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php index e47192d954..bb92bb794f 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php @@ -64,7 +64,7 @@ class ORMQueryBuilderLoader implements EntityLoaderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getEntities() { @@ -72,7 +72,7 @@ class ORMQueryBuilderLoader implements EntityLoaderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getEntitiesByIds($identifier, array $values) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php index 9a7a1f8774..b18cc02776 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php @@ -33,7 +33,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessType($class, $property) { @@ -80,14 +80,14 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessRequired($class, $property) { $classMetadatas = $this->getMetadata($class); if (!$classMetadatas) { - return null; + return; } /** @var ClassMetadataInfo $classMetadata */ @@ -115,12 +115,10 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface return new ValueGuess(!$mapping['joinColumns'][0]['nullable'], Guess::HIGH_CONFIDENCE); } - - return null; } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessMaxLength($class, $property) { @@ -139,7 +137,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessPattern($class, $property) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php index af127d42fa..799e8de923 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php @@ -69,8 +69,6 @@ abstract class DoctrineType extends AbstractType if (null !== $options['query_builder']) { return $type->getLoader($options['em'], $options['query_builder'], $options['class']); } - - return null; }; $choiceList = function (Options $options) use (&$choiceListCache, $propertyAccessor) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php index 9d822e531a..3248313717 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php @@ -11,14 +11,17 @@ namespace Symfony\Bridge\Doctrine\HttpFoundation; -use Doctrine\DBAL\Platforms\MySqlPlatform; -use Doctrine\DBAL\Driver\Connection; +use Doctrine\DBAL\Connection; /** * DBAL based session storage. * + * This implementation is very similar to Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler + * but uses a Doctrine connection and thus also works with non-PDO-based drivers like mysqli and OCI8. + * * @author Fabien Potencier * @author Johannes M. Schmitt + * @author Tobias Schultze */ class DbalSessionHandler implements \SessionHandlerInterface { @@ -30,24 +33,39 @@ class DbalSessionHandler implements \SessionHandlerInterface /** * @var string */ - private $tableName; + private $table; + + /** + * @var string Column for session id + */ + private $idCol = 'sess_id'; + + /** + * @var string Column for session data + */ + private $dataCol = 'sess_data'; + + /** + * @var string Column for timestamp + */ + private $timeCol = 'sess_time'; /** * Constructor. * - * @param Connection $con An instance of Connection. - * @param string $tableName Table name. + * @param Connection $con A connection + * @param string $tableName Table name */ public function __construct(Connection $con, $tableName = 'sessions') { $this->con = $con; - $this->tableName = $tableName; + $this->table = $tableName; } /** * {@inheritdoc} */ - public function open($path = null, $name = null) + public function open($savePath, $sessionName) { return true; } @@ -57,21 +75,23 @@ class DbalSessionHandler implements \SessionHandlerInterface */ public function close() { - // do nothing return true; } /** * {@inheritdoc} */ - public function destroy($id) + public function destroy($sessionId) { + // delete the record associated with this id + $sql = "DELETE FROM $this->table WHERE $this->idCol = :id"; + try { - $this->con->executeQuery("DELETE FROM {$this->tableName} WHERE sess_id = :id", array( - 'id' => $id, - )); - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); + $stmt = $this->con->prepare($sql); + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $stmt->execute(); + } catch (\Exception $e) { + throw new \RuntimeException(sprintf('Exception was thrown when trying to delete a session: %s', $e->getMessage()), 0, $e); } return true; @@ -80,14 +100,17 @@ class DbalSessionHandler implements \SessionHandlerInterface /** * {@inheritdoc} */ - public function gc($lifetime) + public function gc($maxlifetime) { + // delete the session records that have expired + $sql = "DELETE FROM $this->table WHERE $this->timeCol < :time"; + try { - $this->con->executeQuery("DELETE FROM {$this->tableName} WHERE sess_time < :time", array( - 'time' => time() - $lifetime, - )); - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); + $stmt = $this->con->prepare($sql); + $stmt->bindValue(':time', time() - $maxlifetime, \PDO::PARAM_INT); + $stmt->execute(); + } catch (\Exception $e) { + throw new \RuntimeException(sprintf('Exception was thrown when trying to delete expired sessions: %s', $e->getMessage()), 0, $e); } return true; @@ -96,79 +119,107 @@ class DbalSessionHandler implements \SessionHandlerInterface /** * {@inheritdoc} */ - public function read($id) + public function read($sessionId) { + $sql = "SELECT $this->dataCol FROM $this->table WHERE $this->idCol = :id"; + try { - $data = $this->con->executeQuery("SELECT sess_data FROM {$this->tableName} WHERE sess_id = :id", array( - 'id' => $id, - ))->fetchColumn(); + $stmt = $this->con->prepare($sql); + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $stmt->execute(); - if (false !== $data) { - return base64_decode($data); - } + // We use fetchAll instead of fetchColumn to make sure the DB cursor gets closed + $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM); - // session does not exist, create it - $this->createNewSession($id); + if ($sessionRows) { + return base64_decode($sessionRows[0][0]); + } return ''; - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e); + } catch (\Exception $e) { + throw new \RuntimeException(sprintf('Exception was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e); } } /** * {@inheritdoc} */ - public function write($id, $data) + public function write($sessionId, $data) { - $platform = $this->con->getDatabasePlatform(); - - // this should maybe be abstracted in Doctrine DBAL - if ($platform instanceof MySqlPlatform) { - $sql = "INSERT INTO {$this->tableName} (sess_id, sess_data, sess_time) VALUES (%1\$s, %2\$s, %3\$d) " - ."ON DUPLICATE KEY UPDATE sess_data = VALUES(sess_data), sess_time = CASE WHEN sess_time = %3\$d THEN (VALUES(sess_time) + 1) ELSE VALUES(sess_time) END"; - } else { - $sql = "UPDATE {$this->tableName} SET sess_data = %2\$s, sess_time = %3\$d WHERE sess_id = %1\$s"; - } + // Session data can contain non binary safe characters so we need to encode it. + $encoded = base64_encode($data); + + // We use a MERGE SQL query when supported by the database. + // Otherwise we have to use a transactional DELETE followed by INSERT to prevent duplicate entries under high concurrency. try { - $rowCount = $this->con->exec(sprintf( - $sql, - $this->con->quote($id), - //session data can contain non binary safe characters so we need to encode it - $this->con->quote(base64_encode($data)), - time() - )); - - if (!$rowCount) { - // No session exists in the database to update. This happens when we have called - // session_regenerate_id() - $this->createNewSession($id, $data); + $mergeSql = $this->getMergeSql(); + + if (null !== $mergeSql) { + $mergeStmt = $this->con->prepare($mergeSql); + $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $mergeStmt->bindParam(':data', $encoded, \PDO::PARAM_STR); + $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT); + $mergeStmt->execute(); + + return true; } - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e); + + $this->con->beginTransaction(); + + try { + $deleteStmt = $this->con->prepare( + "DELETE FROM $this->table WHERE $this->idCol = :id" + ); + $deleteStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $deleteStmt->execute(); + + $insertStmt = $this->con->prepare( + "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time)" + ); + $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $insertStmt->bindParam(':data', $encoded, \PDO::PARAM_STR); + $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT); + $insertStmt->execute(); + + $this->con->commit(); + } catch (\Exception $e) { + $this->con->rollback(); + + throw $e; + } + } catch (\Exception $e) { + throw new \RuntimeException(sprintf('Exception was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e); } return true; } - /** - * Creates a new session with the given $id and $data - * - * @param string $id - * @param string $data - * - * @return Boolean - */ - private function createNewSession($id, $data = '') + /** + * Returns a merge/upsert (i.e. insert or update) SQL query when supported by the database. + * + * @return string|null The SQL string or null when not supported + */ + private function getMergeSql() { - $this->con->exec(sprintf("INSERT INTO {$this->tableName} (sess_id, sess_data, sess_time) VALUES (%s, %s, %d)", - $this->con->quote($id), - //session data can contain non binary safe characters so we need to encode it - $this->con->quote(base64_encode($data)), - time() - )); - - return true; + $platform = $this->con->getDatabasePlatform()->getName(); + + switch ($platform) { + case 'mysql': + return "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) " . + "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->timeCol = VALUES($this->timeCol)"; + case 'oracle': + // DUAL is Oracle specific dummy table + return "MERGE INTO $this->table USING DUAL ON ($this->idCol = :id) " . + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) " . + "WHEN MATCHED THEN UPDATE SET $this->dataCol = :data"; + case 'mssql': + // MS SQL Server requires MERGE be terminated by semicolon + return "MERGE INTO $this->table USING (SELECT 'x' AS dummy) AS src ON ($this->idCol = :id) " . + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) " . + "WHEN MATCHED THEN UPDATE SET $this->dataCol = :data;"; + case 'sqlite': + return "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time)"; + } } } diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ManagerRegistry.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ManagerRegistry.php index 80eeb37054..6efcefb637 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ManagerRegistry.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/ManagerRegistry.php @@ -28,7 +28,7 @@ abstract class ManagerRegistry extends AbstractManagerRegistry implements Contai protected $container; /** - * @inheritdoc + * {@inheritdoc} */ protected function getService($name) { @@ -36,7 +36,7 @@ abstract class ManagerRegistry extends AbstractManagerRegistry implements Contai } /** - * @inheritdoc + * {@inheritdoc} */ protected function resetService($name) { @@ -44,7 +44,7 @@ abstract class ManagerRegistry extends AbstractManagerRegistry implements Contai } /** - * @inheritdoc + * {@inheritdoc} */ public function setContainer(ContainerInterface $container = null) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php index e786a8aeb5..4044f7b932 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php @@ -17,7 +17,6 @@ use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken; use Symfony\Component\Security\Core\Exception\TokenNotFoundException; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Types\Type as DoctrineType; -use PDO, DateTime; /** * This class provides storage for the tokens that is set in "remember me" @@ -64,15 +63,15 @@ class DoctrineTokenProvider implements TokenProviderInterface $sql = 'SELECT class, username, value, lastUsed' . ' FROM rememberme_token WHERE series=:series'; $paramValues = array('series' => $series); - $paramTypes = array('series' => PDO::PARAM_STR); + $paramTypes = array('series' => \PDO::PARAM_STR); $stmt = $this->conn->executeQuery($sql, $paramValues, $paramTypes); - $row = $stmt->fetch(PDO::FETCH_ASSOC); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); if ($row) { return new PersistentToken($row['class'], $row['username'], $series, $row['value'], - new DateTime($row['lastUsed']) + new \DateTime($row['lastUsed']) ); } @@ -86,23 +85,23 @@ class DoctrineTokenProvider implements TokenProviderInterface { $sql = 'DELETE FROM rememberme_token WHERE series=:series'; $paramValues = array('series' => $series); - $paramTypes = array('series' => PDO::PARAM_STR); + $paramTypes = array('series' => \PDO::PARAM_STR); $this->conn->executeUpdate($sql, $paramValues, $paramTypes); } /** * {@inheritdoc} */ - public function updateToken($series, $tokenValue, DateTime $lastUsed) + public function updateToken($series, $tokenValue, \DateTime $lastUsed) { $sql = 'UPDATE rememberme_token SET value=:value, lastUsed=:lastUsed' . ' WHERE series=:series'; $paramValues = array('value' => $tokenValue, 'lastUsed' => $lastUsed, 'series' => $series); - $paramTypes = array('value' => PDO::PARAM_STR, + $paramTypes = array('value' => \PDO::PARAM_STR, 'lastUsed' => DoctrineType::DATETIME, - 'series' => PDO::PARAM_STR); + 'series' => \PDO::PARAM_STR); $updated = $this->conn->executeUpdate($sql, $paramValues, $paramTypes); if ($updated < 1) { throw new TokenNotFoundException('No token found.'); @@ -122,10 +121,10 @@ class DoctrineTokenProvider implements TokenProviderInterface 'series' => $token->getSeries(), 'value' => $token->getTokenValue(), 'lastUsed' => $token->getLastUsed()); - $paramTypes = array('class' => PDO::PARAM_STR, - 'username' => PDO::PARAM_STR, - 'series' => PDO::PARAM_STR, - 'value' => PDO::PARAM_STR, + $paramTypes = array('class' => \PDO::PARAM_STR, + 'username' => \PDO::PARAM_STR, + 'series' => \PDO::PARAM_STR, + 'value' => \PDO::PARAM_STR, 'lastUsed' => DoctrineType::DATETIME); $this->conn->executeUpdate($sql, $paramValues, $paramTypes); } diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php index e957731a3e..53b1a01675 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php @@ -69,7 +69,7 @@ class EntityUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function refreshUser(UserInterface $user) { @@ -102,7 +102,7 @@ class EntityUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function supportsClass($class) { diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php index cb41a770da..4f82bc37bb 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php @@ -22,9 +22,7 @@ class DbalSessionHandlerTest extends \PHPUnit_Framework_TestCase { public function testConstruct() { - $this->connection = $this->getMock('Doctrine\DBAL\Driver\Connection'); - $mock = $this->getMockBuilder('Symfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandler'); - $mock->setConstructorArgs(array($this->connection)); - $this->driver = $mock->getMock(); + $connection = $this->getMockBuilder('Doctrine\DBAL\Connection')->disableOriginalConstructor()->getMock(); + $handler = new DbalSessionHandler($connection); } } diff --git a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php index f211f61585..067e9a8b06 100644 --- a/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php +++ b/vendor/symfony/doctrine-bridge/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php @@ -17,6 +17,8 @@ use Symfony\Component\Validator\Constraint; * Constraint for the Unique Entity validator * * @Annotation + * @Target({"CLASS", "ANNOTATION"}) + * * @author Benjamin Eberlei */ class UniqueEntity extends Constraint @@ -45,7 +47,7 @@ class UniqueEntity extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getTargets() { diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Crawler.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Crawler.php index 6e351f4706..7d536ca52e 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Crawler.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Crawler.php @@ -107,7 +107,7 @@ class Crawler extends \SplObjectStorage // DOM only for HTML/XML content if (!preg_match('/(x|ht)ml/i', $type, $xmlMatches)) { - return null; + return; } $charset = null; @@ -294,7 +294,7 @@ class Crawler extends \SplObjectStorage /** * Returns a node given its position in the node list. * - * @param integer $position The position + * @param int $position The position * * @return Crawler A new instance of the Crawler with the selected node, or an empty Crawler if it does not exist. * @@ -808,7 +808,7 @@ class Crawler extends \SplObjectStorage } /** - * @param integer $position + * @param int $position * * @return \DOMElement|null */ @@ -820,8 +820,6 @@ class Crawler extends \SplObjectStorage } // @codeCoverageIgnoreStart } - - return null; // @codeCoverageIgnoreEnd } diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/ChoiceFormField.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/ChoiceFormField.php index de49220299..b0f6b2ad1c 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/ChoiceFormField.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/ChoiceFormField.php @@ -27,7 +27,7 @@ class ChoiceFormField extends FormField */ private $type; /** - * @var Boolean + * @var bool */ private $multiple; /** @@ -35,14 +35,14 @@ class ChoiceFormField extends FormField */ private $options; /** - * @var boolean + * @var bool */ private $validationDisabled = false; /** * Returns true if the field should be included in the submitted values. * - * @return Boolean true if the field should be included in the submitted values, false otherwise + * @return bool true if the field should be included in the submitted values, false otherwise */ public function hasValue() { @@ -57,7 +57,7 @@ class ChoiceFormField extends FormField /** * Check if the current selected option is disabled * - * @return Boolean + * @return bool */ public function isDisabled() { @@ -192,7 +192,7 @@ class ChoiceFormField extends FormField /** * Returns true if the field accepts multiple values. * - * @return Boolean true if the field accepts multiple values, false otherwise + * @return bool true if the field accepts multiple values, false otherwise */ public function isMultiple() { diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FileFormField.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FileFormField.php index 4f822206ad..c65b5c9c4f 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FileFormField.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FileFormField.php @@ -23,7 +23,7 @@ class FileFormField extends FormField /** * Sets the PHP error code associated with the field. * - * @param integer $error The error code (one of UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE, or UPLOAD_ERR_EXTENSION) + * @param int $error The error code (one of UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE, or UPLOAD_ERR_EXTENSION) * * @throws \InvalidArgumentException When error code doesn't exist */ diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FormField.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FormField.php index 6412272c2e..2114b4ed5d 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FormField.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/FormField.php @@ -39,7 +39,7 @@ abstract class FormField */ protected $xpath; /** - * @var Boolean + * @var bool */ protected $disabled; @@ -98,7 +98,7 @@ abstract class FormField /** * Returns true if the field should be included in the submitted values. * - * @return Boolean true if the field should be included in the submitted values, false otherwise + * @return bool true if the field should be included in the submitted values, false otherwise */ public function hasValue() { @@ -108,7 +108,7 @@ abstract class FormField /** * Check if the current field is disabled * - * @return Boolean + * @return bool */ public function isDisabled() { diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/TextareaFormField.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/TextareaFormField.php index 987b78b5c7..242a9d3724 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/TextareaFormField.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Field/TextareaFormField.php @@ -31,7 +31,7 @@ class TextareaFormField extends FormField throw new \LogicException(sprintf('A TextareaFormField can only be created from a textarea tag (%s given).', $this->node->nodeName)); } - $this->value = null; + $this->value = ''; foreach ($this->node->childNodes as $node) { $this->value .= $node->wholeText; } diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Form.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Form.php index ca2ca57d2c..144498f32d 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Form.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Form.php @@ -228,7 +228,7 @@ class Form extends Link implements \ArrayAccess * * @param string $name The field name * - * @return Boolean true if the field exists, false otherwise + * @return bool true if the field exists, false otherwise * * @api */ @@ -296,7 +296,7 @@ class Form extends Link implements \ArrayAccess * * @param string $name The field name * - * @return Boolean true if the field exists, false otherwise + * @return bool true if the field exists, false otherwise */ public function offsetExists($name) { diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/FormFieldRegistry.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/FormFieldRegistry.php index 677a9aad31..f37e05025c 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/FormFieldRegistry.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/FormFieldRegistry.php @@ -99,7 +99,7 @@ class FormFieldRegistry * * @param string $name The fully qualified name of the field * - * @return Boolean Whether the form has the given field + * @return bool Whether the form has the given field */ public function has($name) { diff --git a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Tests/FormTest.php b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Tests/FormTest.php index 765d85d132..fca7f6b751 100644 --- a/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Tests/FormTest.php +++ b/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Tests/FormTest.php @@ -853,4 +853,21 @@ class FormTest extends \PHPUnit_Framework_TestCase return $dom; } + + public function testgetPhpValuesWithEmptyTextarea() + { + $dom = new \DOMDocument(); + $dom->loadHTML(' + +
    + +
    + + '); + + $nodes = $dom->getElementsByTagName('form'); + $form = new Form($nodes->item(0), 'http://example.com'); + $this->assertEquals($form->getPhpValues(), array('example' => '')); + } + } diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php index 9448ed43e9..e97d427ea1 100644 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php @@ -57,7 +57,7 @@ class ContainerAwareEventDispatcher extends EventDispatcher * @param string $eventName Event for which the listener is added * @param array $callback The service ID of the listener service & the method * name that has to be called - * @param integer $priority The higher this value, the earlier an event listener + * @param int $priority The higher this value, the earlier an event listener * will be triggered in the chain. * Defaults to 0. * @@ -105,7 +105,7 @@ class ContainerAwareEventDispatcher extends EventDispatcher public function hasListeners($eventName = null) { if (null === $eventName) { - return (Boolean) count($this->listenerIds) || (Boolean) count($this->listeners); + return (bool) count($this->listenerIds) || (bool) count($this->listeners); } if (isset($this->listenerIds[$eventName])) { @@ -153,7 +153,7 @@ class ContainerAwareEventDispatcher extends EventDispatcher } /** - * {@inheritDoc} + * {@inheritdoc} * * Lazily loads listeners for this event from the dependency injection * container. diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php index e25e7f1eba..bf792a2579 100644 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php @@ -30,7 +30,7 @@ namespace Symfony\Component\EventDispatcher; class Event { /** - * @var Boolean Whether no further event listeners should be triggered + * @var bool Whether no further event listeners should be triggered */ private $propagationStopped = false; @@ -48,7 +48,7 @@ class Event * Returns whether further event listeners should be triggered. * * @see Event::stopPropagation - * @return Boolean Whether propagation was already stopped for this event. + * @return bool Whether propagation was already stopped for this event. * * @api */ diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php index ad48d4311d..ab140a669c 100644 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php @@ -82,7 +82,7 @@ class EventDispatcher implements EventDispatcherInterface */ public function hasListeners($eventName = null) { - return (Boolean) count($this->getListeners($eventName)); + return (bool) count($this->getListeners($eventName)); } /** diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php index 7aead23b0d..3fdbfd8822 100644 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php @@ -42,7 +42,7 @@ interface EventDispatcherInterface * * @param string $eventName The event to listen on * @param callable $listener The listener - * @param integer $priority The higher this value, the earlier an event + * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) * * @api @@ -90,7 +90,7 @@ interface EventDispatcherInterface * * @param string $eventName The name of the event * - * @return Boolean true if the specified event has any listeners, false otherwise + * @return bool true if the specified event has any listeners, false otherwise */ public function hasListeners($eventName = null); } diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php index c226fdf2e5..1e8c44a678 100644 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php @@ -118,7 +118,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * * @param string $key Key of arguments array. * - * @return boolean + * @return bool */ public function hasArgument($key) { @@ -167,7 +167,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate * * @param string $key Array key. * - * @return boolean + * @return bool */ public function offsetExists($key) { diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php index c1e22f4451..5dfda92f2a 100644 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php @@ -34,7 +34,7 @@ class GenericEventTest extends \PHPUnit_Framework_TestCase parent::setUp(); $this->subject = new \stdClass(); - $this->event = new GenericEvent($this->subject, array('name' => 'Event'), 'foo'); + $this->event = new GenericEvent($this->subject, array('name' => 'Event')); } /** diff --git a/vendor/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php b/vendor/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php index 704dd444b4..ca146aa816 100644 --- a/vendor/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php +++ b/vendor/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php @@ -30,7 +30,7 @@ class Filesystem * * @param string $originFile The original filename * @param string $targetFile The target filename - * @param boolean $override Whether to override an existing file or not + * @param bool $override Whether to override an existing file or not * * @throws FileNotFoundException When originFile doesn't exist * @throws IOException When copy fails @@ -68,7 +68,7 @@ class Filesystem * Creates a directory recursively. * * @param string|array|\Traversable $dirs The directory path - * @param integer $mode The directory mode + * @param int $mode The directory mode * * @throws IOException On any directory creation failure */ @@ -90,7 +90,7 @@ class Filesystem * * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to check * - * @return Boolean true if the file exists, false otherwise + * @return bool true if the file exists, false otherwise */ public function exists($files) { @@ -107,8 +107,8 @@ class Filesystem * Sets access and modification time of file. * * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to create - * @param integer $time The touch time as a Unix timestamp - * @param integer $atime The access time as a Unix timestamp + * @param int $time The touch time as a Unix timestamp + * @param int $atime The access time as a Unix timestamp * * @throws IOException When touch fails */ @@ -163,9 +163,9 @@ class Filesystem * Change mode for an array of files or directories. * * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to change mode - * @param integer $mode The new mode (octal) - * @param integer $umask The mode mask (octal) - * @param Boolean $recursive Whether change the mod recursively or not + * @param int $mode The new mode (octal) + * @param int $umask The mode mask (octal) + * @param bool $recursive Whether change the mod recursively or not * * @throws IOException When the change fail */ @@ -186,7 +186,7 @@ class Filesystem * * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to change owner * @param string $user The new owner user name - * @param Boolean $recursive Whether change the owner recursively or not + * @param bool $recursive Whether change the owner recursively or not * * @throws IOException When the change fail */ @@ -213,7 +213,7 @@ class Filesystem * * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to change group * @param string $group The group name - * @param Boolean $recursive Whether change the group recursively or not + * @param bool $recursive Whether change the group recursively or not * * @throws IOException When the change fail */ @@ -240,7 +240,7 @@ class Filesystem * * @param string $origin The origin filename or directory * @param string $target The new filename or directory - * @param Boolean $overwrite Whether to overwrite the target if it already exists + * @param bool $overwrite Whether to overwrite the target if it already exists * * @throws IOException When target file or directory already exists * @throws IOException When origin cannot be renamed @@ -262,7 +262,7 @@ class Filesystem * * @param string $originDir The origin directory path * @param string $targetDir The symbolic link name - * @param Boolean $copyOnWindows Whether to copy files if on Windows + * @param bool $copyOnWindows Whether to copy files if on Windows * * @throws IOException When symlink fails */ @@ -413,7 +413,7 @@ class Filesystem * * @param string $file A file path * - * @return Boolean + * @return bool */ public function isAbsolutePath($file) { @@ -435,7 +435,7 @@ class Filesystem * * @param string $filename The file to be written to. * @param string $content The data to write into the file. - * @param null|integer $mode The file mode (octal). If null, file permissions are not modified + * @param null|int $mode The file mode (octal). If null, file permissions are not modified * Deprecated since version 2.3.12, to be removed in 3.0. * @throws IOException If the file cannot be written to. */ diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractAdapter.php b/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractAdapter.php index 46473b3d5a..bdb04f5352 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractAdapter.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractAdapter.php @@ -38,7 +38,7 @@ abstract class AbstractAdapter implements AdapterInterface private static $areSupported = array(); /** - * {@inheritDoc} + * {@inheritdoc} */ public function isSupported() { @@ -216,7 +216,7 @@ abstract class AbstractAdapter implements AdapterInterface */ public function ignoreUnreadableDirs($ignore = true) { - $this->ignoreUnreadableDirs = (Boolean) $ignore; + $this->ignoreUnreadableDirs = (bool) $ignore; return $this; } @@ -230,7 +230,7 @@ abstract class AbstractAdapter implements AdapterInterface * * @see isSupported * - * @return Boolean Whether the adapter is supported + * @return bool Whether the adapter is supported */ abstract protected function canBeUsed(); } diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php b/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php index 028a5e5a71..01940385de 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php @@ -148,7 +148,7 @@ abstract class AbstractFindAdapter extends AbstractAdapter /** * @param Command $command * @param string[] $names - * @param Boolean $not + * @param bool $not */ private function buildNamesFiltering(Command $command, array $names, $not = false) { @@ -196,7 +196,7 @@ abstract class AbstractFindAdapter extends AbstractAdapter * @param Command $command * @param string $dir * @param string[] $paths - * @param Boolean $not + * @param bool $not */ private function buildPathsFiltering(Command $command, $dir, array $paths, $not = false) { @@ -321,7 +321,7 @@ abstract class AbstractFindAdapter extends AbstractAdapter /** * @param Command $command * @param array $contains - * @param Boolean $not + * @param bool $not */ abstract protected function buildContentFiltering(Command $command, array $contains, $not = false); } diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AdapterInterface.php b/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AdapterInterface.php index 50c018bc50..e25fc3e1fd 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AdapterInterface.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Adapter/AdapterInterface.php @@ -17,14 +17,14 @@ namespace Symfony\Component\Finder\Adapter; interface AdapterInterface { /** - * @param Boolean $followLinks + * @param bool $followLinks * * @return AdapterInterface Current instance */ public function setFollowLinks($followLinks); /** - * @param integer $mode + * @param int $mode * * @return AdapterInterface Current instance */ @@ -94,7 +94,7 @@ interface AdapterInterface public function setFilters(array $filters); /** - * @param \Closure|integer $sort + * @param \Closure|int $sort * * @return AdapterInterface Current instance */ @@ -115,7 +115,7 @@ interface AdapterInterface public function setNotPath(array $notPaths); /** - * @param boolean $ignore + * @param bool $ignore * * @return AdapterInterface Current instance */ @@ -131,7 +131,7 @@ interface AdapterInterface /** * Tests adapter support for current platform. * - * @return Boolean + * @return bool */ public function isSupported(); diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Comparator/Comparator.php b/vendor/symfony/finder/Symfony/Component/Finder/Comparator/Comparator.php index 83c511a73b..4f5e1ffe12 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Comparator/Comparator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Comparator/Comparator.php @@ -76,7 +76,7 @@ class Comparator * * @param mixed $test A test value * - * @return Boolean + * @return bool */ public function test($test) { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Finder.php b/vendor/symfony/finder/Symfony/Component/Finder/Finder.php index c075e0ff85..e945fab13e 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Finder.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Finder.php @@ -90,7 +90,7 @@ class Finder implements \IteratorAggregate, \Countable * Registers a finder engine implementation. * * @param AdapterInterface $adapter An adapter instance - * @param integer $priority Highest is selected first + * @param int $priority Highest is selected first * * @return Finder The current Finder instance */ @@ -415,7 +415,7 @@ class Finder implements \IteratorAggregate, \Countable /** * Excludes "hidden" directories and files (starting with a dot). * - * @param Boolean $ignoreDotFiles Whether to exclude "hidden" files or not + * @param bool $ignoreDotFiles Whether to exclude "hidden" files or not * * @return Finder The current Finder instance * @@ -437,7 +437,7 @@ class Finder implements \IteratorAggregate, \Countable /** * Forces the finder to ignore version control directories. * - * @param Boolean $ignoreVCS Whether to exclude VCS files or not + * @param bool $ignoreVCS Whether to exclude VCS files or not * * @return Finder The current Finder instance * @@ -632,13 +632,13 @@ class Finder implements \IteratorAggregate, \Countable * * By default, scanning unreadable directories content throws an AccessDeniedException. * - * @param boolean $ignore + * @param bool $ignore * * @return Finder The current Finder instance */ public function ignoreUnreadableDirs($ignore = true) { - $this->ignoreUnreadableDirs = (Boolean) $ignore; + $this->ignoreUnreadableDirs = (bool) $ignore; return $this; } diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Glob.php b/vendor/symfony/finder/Symfony/Component/Finder/Glob.php index dd26384ed7..df65ac7547 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Glob.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Glob.php @@ -39,8 +39,8 @@ class Glob * Returns a regexp which is the equivalent of the glob pattern. * * @param string $glob The glob pattern - * @param Boolean $strictLeadingDot - * @param Boolean $strictWildcardSlash + * @param bool $strictLeadingDot + * @param bool $strictWildcardSlash * * @return string regex The regexp */ diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/CustomFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/CustomFilterIterator.php index 58976c07c7..36d79dbc97 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/CustomFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/CustomFilterIterator.php @@ -46,7 +46,7 @@ class CustomFilterIterator extends FilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php index 3e5713b8e6..bad682ee54 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php @@ -38,7 +38,7 @@ class DateRangeFilterIterator extends FilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php index 67cf5ded0e..c1c5ce899a 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php @@ -38,7 +38,7 @@ class DepthRangeFilterIterator extends FilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php index e4eabbf804..b2be58ea78 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php @@ -38,7 +38,7 @@ class ExcludeDirectoryFilterIterator extends FilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php index 5b7bbb10b9..985475e59d 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php @@ -27,7 +27,7 @@ class FileTypeFilterIterator extends FilterIterator * Constructor. * * @param \Iterator $iterator The Iterator to filter - * @param integer $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) + * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) */ public function __construct(\Iterator $iterator, $mode) { @@ -39,7 +39,7 @@ class FileTypeFilterIterator extends FilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php index 953f9c3733..9ea3330134 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php @@ -22,7 +22,7 @@ class FilecontentFilterIterator extends MultiplePcreFilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php index 3c0f3aa70e..c4e0ccd8e4 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php @@ -24,7 +24,7 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php index df6d6dc6a7..d7efc9090a 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php @@ -48,7 +48,7 @@ abstract class MultiplePcreFilterIterator extends FilterIterator * * @param string $str * - * @return Boolean Whether the given string is a regex + * @return bool Whether the given string is a regex */ protected function isRegex($str) { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/PathFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/PathFilterIterator.php index c736f0b310..828fa41876 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/PathFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/PathFilterIterator.php @@ -23,7 +23,7 @@ class PathFilterIterator extends MultiplePcreFilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php index f189712dfd..9543a3f764 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php @@ -22,12 +22,12 @@ use Symfony\Component\Finder\SplFileInfo; class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator { /** - * @var boolean + * @var bool */ private $ignoreUnreadableDirs; /** - * @var Boolean + * @var bool */ private $rewindable; @@ -36,7 +36,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator * * @param string $path * @param int $flags - * @param boolean $ignoreUnreadableDirs + * @param bool $ignoreUnreadableDirs * * @throws \RuntimeException */ @@ -68,7 +68,14 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator public function getChildren() { try { - return parent::getChildren(); + $children = parent::getChildren(); + + if ($children instanceof self) { + // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore + $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs; + } + + return $children; } catch (\UnexpectedValueException $e) { if ($this->ignoreUnreadableDirs) { // If directory is unreadable and finder is set to ignore it, a fake empty content is returned. @@ -97,7 +104,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator /** * Checks if the stream is rewindable. * - * @return Boolean true when the stream is rewindable, false otherwise + * @return bool true when the stream is rewindable, false otherwise */ public function isRewindable() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php index 77f9cc4434..b345a1692c 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php @@ -38,7 +38,7 @@ class SizeRangeFilterIterator extends FilterIterator /** * Filters the iterator values. * - * @return Boolean true if the value should be kept, false otherwise + * @return bool true if the value should be kept, false otherwise */ public function accept() { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SortableIterator.php b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SortableIterator.php index cdc734f474..3bf5034d14 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SortableIterator.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Iterator/SortableIterator.php @@ -31,7 +31,7 @@ class SortableIterator implements \IteratorAggregate * Constructor. * * @param \Traversable $iterator The Iterator to filter - * @param integer|callback $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) + * @param int|callback $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) * * @throws \InvalidArgumentException */ diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Shell/Command.php b/vendor/symfony/finder/Symfony/Component/Finder/Shell/Command.php index a891016b81..78824d0df4 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Shell/Command.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Shell/Command.php @@ -281,7 +281,7 @@ class Command * Insert a string or a Command instance before the bit at given position $index (index starts from 0). * * @param string|Command $bit - * @param integer $index + * @param int $index * * @return Command The current Command instance */ diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Tests/FinderTest.php b/vendor/symfony/finder/Symfony/Component/Finder/Tests/FinderTest.php index 1598a46db2..a42b0d7c65 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Tests/FinderTest.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Tests/FinderTest.php @@ -824,6 +824,10 @@ class FinderTest extends Iterator\RealIteratorTestCase public function testNonSeekableStream() { + if (!in_array('ftp', stream_get_wrappers())) { + $this->markTestSkipped(sprintf('Unavailable stream "%s".', 'ftp')); + } + try { $i = Finder::create()->in('ftp://ftp.mozilla.org/')->depth(0)->getIterator(); } catch (\UnexpectedValueException $e) { diff --git a/vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php b/vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php index 4a54d1d33f..b9ba38b3df 100644 --- a/vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php +++ b/vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php @@ -19,7 +19,7 @@ class RecursiveDirectoryIteratorTest extends IteratorTestCase * @dataProvider getPaths * * @param string $path - * @param Boolean $seekable + * @param bool $seekable * @param array $contains * @param string $message */ @@ -40,7 +40,7 @@ class RecursiveDirectoryIteratorTest extends IteratorTestCase * @dataProvider getPaths * * @param string $path - * @param Boolean $seekable + * @param bool $seekable * @param array $contains * @param string $message */ diff --git a/vendor/symfony/form/Symfony/Component/Form/AbstractExtension.php b/vendor/symfony/form/Symfony/Component/Form/AbstractExtension.php index 4db77b9bb5..d057f92e87 100644 --- a/vendor/symfony/form/Symfony/Component/Form/AbstractExtension.php +++ b/vendor/symfony/form/Symfony/Component/Form/AbstractExtension.php @@ -39,7 +39,7 @@ abstract class AbstractExtension implements FormExtensionInterface /** * Whether the type guesser has been loaded - * @var Boolean + * @var bool */ private $typeGuesserLoaded = false; @@ -136,7 +136,6 @@ abstract class AbstractExtension implements FormExtensionInterface */ protected function loadTypeGuesser() { - return null; } /** diff --git a/vendor/symfony/form/Symfony/Component/Form/AbstractRendererEngine.php b/vendor/symfony/form/Symfony/Component/Form/AbstractRendererEngine.php index 347be10d29..764fe1de70 100644 --- a/vendor/symfony/form/Symfony/Component/Form/AbstractRendererEngine.php +++ b/vendor/symfony/form/Symfony/Component/Form/AbstractRendererEngine.php @@ -131,7 +131,7 @@ abstract class AbstractRendererEngine implements FormRendererEngineInterface * @param FormView $view The form view for finding the applying themes. * @param string $blockName The name of the block to load. * - * @return Boolean True if the resource could be loaded, false otherwise. + * @return bool True if the resource could be loaded, false otherwise. */ abstract protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName); @@ -146,10 +146,10 @@ abstract class AbstractRendererEngine implements FormRendererEngineInterface * themes. * @param array $blockNameHierarchy The block hierarchy, with the most * specific block name at the end. - * @param integer $hierarchyLevel The level in the block hierarchy that + * @param int $hierarchyLevel The level in the block hierarchy that * should be loaded. * - * @return Boolean True if the resource could be loaded, false otherwise. + * @return bool True if the resource could be loaded, false otherwise. */ private function loadResourceForBlockNameHierarchy($cacheKey, FormView $view, array $blockNameHierarchy, $hierarchyLevel) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Button.php b/vendor/symfony/form/Symfony/Component/Form/Button.php index 25ec861735..5fa24377b5 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Button.php +++ b/vendor/symfony/form/Symfony/Component/Form/Button.php @@ -32,7 +32,7 @@ class Button implements \IteratorAggregate, FormInterface private $config; /** - * @var Boolean + * @var bool */ private $submitted = false; @@ -51,7 +51,7 @@ class Button implements \IteratorAggregate, FormInterface * * @param mixed $offset * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function offsetExists($offset) { @@ -152,7 +152,7 @@ class Button implements \IteratorAggregate, FormInterface * * @param string $name * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function has($name) { @@ -211,7 +211,6 @@ class Button implements \IteratorAggregate, FormInterface */ public function getData() { - return null; } /** @@ -221,7 +220,6 @@ class Button implements \IteratorAggregate, FormInterface */ public function getNormData() { - return null; } /** @@ -231,7 +229,6 @@ class Button implements \IteratorAggregate, FormInterface */ public function getViewData() { - return null; } /** @@ -257,7 +254,7 @@ class Button implements \IteratorAggregate, FormInterface /** * Returns whether the button is submitted. * - * @return Boolean true if the button was submitted. + * @return bool true if the button was submitted. */ public function isSubmitted() { @@ -281,7 +278,6 @@ class Button implements \IteratorAggregate, FormInterface */ public function getPropertyPath() { - return null; } /** @@ -299,7 +295,7 @@ class Button implements \IteratorAggregate, FormInterface /** * Unsupported method. * - * @return Boolean Always returns true. + * @return bool Always returns true. */ public function isValid() { @@ -309,7 +305,7 @@ class Button implements \IteratorAggregate, FormInterface /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function isRequired() { @@ -327,7 +323,7 @@ class Button implements \IteratorAggregate, FormInterface /** * Unsupported method. * - * @return Boolean Always returns true. + * @return bool Always returns true. */ public function isEmpty() { @@ -337,7 +333,7 @@ class Button implements \IteratorAggregate, FormInterface /** * Unsupported method. * - * @return Boolean Always returns true. + * @return bool Always returns true. */ public function isSynchronized() { @@ -370,7 +366,7 @@ class Button implements \IteratorAggregate, FormInterface * Submits data to the button. * * @param null|string $submittedData The data. - * @param Boolean $clearMissing Not used. + * @param bool $clearMissing Not used. * * @return Button The button instance * @@ -426,7 +422,7 @@ class Button implements \IteratorAggregate, FormInterface /** * Unsupported method. * - * @return integer Always returns 0. + * @return int Always returns 0. */ public function count() { diff --git a/vendor/symfony/form/Symfony/Component/Form/ButtonBuilder.php b/vendor/symfony/form/Symfony/Component/Form/ButtonBuilder.php index 9146c69352..afb865b508 100644 --- a/vendor/symfony/form/Symfony/Component/Form/ButtonBuilder.php +++ b/vendor/symfony/form/Symfony/Component/Form/ButtonBuilder.php @@ -23,12 +23,12 @@ use Symfony\Component\Form\Exception\BadMethodCallException; class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface { /** - * @var Boolean + * @var bool */ protected $locked = false; /** - * @var Boolean + * @var bool */ private $disabled; @@ -75,7 +75,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param string|integer|FormBuilderInterface $child + * @param string|int|FormBuilderInterface $child * @param string|FormTypeInterface $type * @param array $options * @@ -135,7 +135,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * @param string $name * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function has($name) { @@ -169,7 +169,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * @param string $eventName * @param callable $listener - * @param integer $priority + * @param int $priority * * @throws BadMethodCallException */ @@ -198,7 +198,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * This method should not be invoked. * * @param DataTransformerInterface $viewTransformer - * @param Boolean $forcePrepend + * @param bool $forcePrepend * * @throws BadMethodCallException */ @@ -225,7 +225,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * This method should not be invoked. * * @param DataTransformerInterface $modelTransformer - * @param Boolean $forceAppend + * @param bool $forceAppend * * @throws BadMethodCallException */ @@ -279,7 +279,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Set whether the button is disabled. * - * @param Boolean $disabled Whether the button is disabled + * @param bool $disabled Whether the button is disabled * * @return ButtonBuilder The button builder. */ @@ -307,7 +307,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $errorBubbling + * @param bool $errorBubbling * * @throws BadMethodCallException */ @@ -321,7 +321,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $required + * @param bool $required * * @throws BadMethodCallException */ @@ -349,7 +349,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $mapped + * @param bool $mapped * * @throws BadMethodCallException */ @@ -363,7 +363,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $byReference + * @param bool $byReference * * @throws BadMethodCallException */ @@ -377,7 +377,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $virtual + * @param bool $virtual * * @throws BadMethodCallException */ @@ -391,7 +391,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $compound + * @param bool $compound * * @throws BadMethodCallException */ @@ -431,7 +431,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * This method should not be invoked. * - * @param Boolean $locked + * @param bool $locked * * @throws BadMethodCallException */ @@ -495,7 +495,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @param Boolean $initialize + * @param bool $initialize * * @throws BadMethodCallException */ @@ -511,7 +511,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @param Boolean $inheritData + * @param bool $inheritData * * @throws BadMethodCallException */ @@ -541,7 +541,6 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getEventDispatcher() { - return null; } /** @@ -559,13 +558,12 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getPropertyPath() { - return null; } /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getMapped() { @@ -575,7 +573,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getByReference() { @@ -585,7 +583,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getVirtual() { @@ -595,7 +593,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getCompound() { @@ -639,13 +637,12 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getDataMapper() { - return null; } /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getRequired() { @@ -655,7 +652,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Returns whether the button is disabled. * - * @return Boolean Whether the button is disabled. + * @return bool Whether the button is disabled. */ public function getDisabled() { @@ -665,7 +662,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getErrorBubbling() { @@ -679,7 +676,6 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getEmptyData() { - return null; } /** @@ -697,7 +693,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * @param string $name The attribute name. * - * @return Boolean Whether the attribute exists. + * @return bool Whether the attribute exists. */ public function hasAttribute($name) { @@ -724,7 +720,6 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getData() { - return null; } /** @@ -734,13 +729,12 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getDataClass() { - return null; } /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getDataLocked() { @@ -754,7 +748,6 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getFormFactory() { - return null; } /** @@ -764,7 +757,6 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getAction() { - return null; } /** @@ -774,7 +766,6 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getMethod() { - return null; } /** @@ -784,13 +775,12 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface */ public function getRequestHandler() { - return null; } /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getAutoInitialize() { @@ -800,7 +790,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @return Boolean Always returns false. + * @return bool Always returns false. */ public function getInheritData() { @@ -822,7 +812,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * * @param string $name The option name, * - * @return Boolean Whether the option exists. + * @return bool Whether the option exists. */ public function hasOption($name) { @@ -845,7 +835,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface /** * Unsupported method. * - * @return integer Always returns 0. + * @return int Always returns 0. */ public function count() { diff --git a/vendor/symfony/form/Symfony/Component/Form/ClickableInterface.php b/vendor/symfony/form/Symfony/Component/Form/ClickableInterface.php index 893f02df0a..9df55449fb 100644 --- a/vendor/symfony/form/Symfony/Component/Form/ClickableInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/ClickableInterface.php @@ -21,7 +21,7 @@ interface ClickableInterface /** * Returns whether this element was clicked. * - * @return Boolean Whether this element was clicked. + * @return bool Whether this element was clicked. */ public function isClicked(); } diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php index 413f7c4f74..0003e02660 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php @@ -381,7 +381,7 @@ class ChoiceList implements ChoiceListInterface * @param mixed $choice The choice to test. * @param array $preferredChoices An array of preferred choices. * - * @return Boolean Whether the choice is preferred. + * @return bool Whether the choice is preferred. */ protected function isPreferred($choice, array $preferredChoices) { @@ -395,7 +395,7 @@ class ChoiceList implements ChoiceListInterface * * @param mixed $choice The choice to create an index for * - * @return integer|string A unique index containing only ASCII letters, + * @return int|string A unique index containing only ASCII letters, * digits and underscores. */ protected function createIndex($choice) @@ -455,7 +455,7 @@ class ChoiceList implements ChoiceListInterface * * @param mixed $index The choice index. * - * @return integer|string The index as PHP array key. + * @return int|string The index as PHP array key. */ protected function fixIndex($index) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php index 0f1437db21..22035b8f75 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php @@ -157,7 +157,7 @@ class ObjectChoiceList extends ChoiceList * * @param mixed $choice The choice to create a value for * - * @return integer|string A unique value without character limitations. + * @return int|string A unique value without character limitations. */ protected function createValue($choice) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php index e173e742c7..abc1bc43fe 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php @@ -124,7 +124,7 @@ class SimpleChoiceList extends ChoiceList * @param mixed $choice The choice to test. * @param array $preferredChoices An array of preferred choices. * - * @return Boolean Whether the choice is preferred. + * @return bool Whether the choice is preferred. */ protected function isPreferred($choice, array $preferredChoices) { @@ -137,7 +137,7 @@ class SimpleChoiceList extends ChoiceList * * @param mixed $choice The choice * - * @return string|integer A valid PHP array key + * @return string|int A valid PHP array key */ protected function fixChoice($choice) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php index fc080f25c1..6cc3a836e5 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php @@ -73,7 +73,7 @@ class ArrayToPartsTransformer implements DataTransformerInterface if (count($emptyKeys) > 0) { if (count($emptyKeys) === count($this->partMapping)) { // All parts empty - return null; + return; } throw new TransformationFailedException( diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php index 4f6b12275b..c6b47803af 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php @@ -41,7 +41,7 @@ class BooleanToStringTransformer implements DataTransformerInterface /** * Transforms a Boolean into a string. * - * @param Boolean $value Boolean value. + * @param bool $value Boolean value. * * @return string String value. * @@ -50,7 +50,7 @@ class BooleanToStringTransformer implements DataTransformerInterface public function transform($value) { if (null === $value) { - return null; + return; } if (!is_bool($value)) { @@ -65,7 +65,7 @@ class BooleanToStringTransformer implements DataTransformerInterface * * @param string $value String value. * - * @return Boolean Boolean value. + * @return bool Boolean value. * * @throws TransformationFailedException If the given value is not a string. */ diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php index b521c95572..a91ed55c31 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php @@ -28,7 +28,7 @@ class ChoiceToBooleanArrayTransformer implements DataTransformerInterface * Constructor. * * @param ChoiceListInterface $choiceList - * @param Boolean $placeholderPresent + * @param bool $placeholderPresent */ public function __construct(ChoiceListInterface $choiceList, $placeholderPresent) { @@ -106,13 +106,11 @@ class ChoiceToBooleanArrayTransformer implements DataTransformerInterface if (isset($choices[$i])) { return $choices[$i] === '' ? null : $choices[$i]; } elseif ($this->placeholderPresent && 'placeholder' === $i) { - return null; + return; } else { throw new TransformationFailedException(sprintf('The choice "%s" does not exist', $i)); } } } - - return null; } } diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php index 5a818558d3..087faf4d3b 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php @@ -46,7 +46,7 @@ class ChoiceToValueTransformer implements DataTransformerInterface // These are now valid ChoiceList values, so we can return null // right away if ('' === $value || null === $value) { - return null; + return; } $choices = $this->choiceList->getChoicesForValues(array($value)); diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php index e746d00ed5..ea2ab40e6f 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php @@ -32,7 +32,7 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer * @param string $inputTimezone The input timezone * @param string $outputTimezone The output timezone * @param array $fields The date fields - * @param Boolean $pad Whether to use padding + * @param bool $pad Whether to use padding * * @throws UnexpectedTypeException if a timezone is not a string */ @@ -45,7 +45,7 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer } $this->fields = $fields; - $this->pad = (Boolean) $pad; + $this->pad = (bool) $pad; } /** @@ -119,7 +119,7 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer public function reverseTransform($value) { if (null === $value) { - return null; + return; } if (!is_array($value)) { @@ -127,7 +127,7 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer } if ('' === implode('', $value)) { - return null; + return; } $emptyFields = array(); diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php index d755e48547..56a3ca928b 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php @@ -34,9 +34,9 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer * * @param string $inputTimezone The name of the input timezone * @param string $outputTimezone The name of the output timezone - * @param integer $dateFormat The date format - * @param integer $timeFormat The time format - * @param integer $calendar One of the \IntlDateFormatter calendar constants + * @param int $dateFormat The date format + * @param int $timeFormat The time format + * @param int $calendar One of the \IntlDateFormatter calendar constants * @param string $pattern A pattern to pass to \IntlDateFormatter * * @throws UnexpectedTypeException If a format is not supported or if a timezone is not a string @@ -121,7 +121,7 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer } if ('' === $value) { - return null; + return; } $timestamp = $this->getIntlDateFormatter()->parse($value); diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php index 0723704ae1..e3297ffef3 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php @@ -19,7 +19,7 @@ use Symfony\Component\Form\Exception\TransformationFailedException; class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function transform($dateTime) { @@ -40,7 +40,7 @@ class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function reverseTransform($rfc3339) { @@ -49,7 +49,7 @@ class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer } if ('' === $rfc3339) { - return null; + return; } try { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php index 131f45cb2f..a9ea5e761f 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php @@ -44,7 +44,7 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer * * This only works as of PHP 5.3.7. * - * @var Boolean + * @var bool */ private $parseUsingPipe; @@ -56,7 +56,7 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer * @param string $inputTimezone The name of the input timezone * @param string $outputTimezone The name of the output timezone * @param string $format The date format - * @param Boolean $parseUsingPipe Whether to parse by appending a pipe "|" to the parse format + * @param bool $parseUsingPipe Whether to parse by appending a pipe "|" to the parse format * * @throws UnexpectedTypeException if a timezone is not a string */ @@ -131,7 +131,7 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer public function reverseTransform($value) { if (empty($value)) { - return null; + return; } if (!is_string($value)) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php index d2ca6604db..7c40b4f6ca 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php @@ -26,7 +26,7 @@ class DateTimeToTimestampTransformer extends BaseDateTimeTransformer * * @param \DateTime $value A \DateTime object * - * @return integer A timestamp + * @return int A timestamp * * @throws TransformationFailedException If the given value is not an instance * of \DateTime or if the output @@ -35,7 +35,7 @@ class DateTimeToTimestampTransformer extends BaseDateTimeTransformer public function transform($value) { if (null === $value) { - return null; + return; } if (!$value instanceof \DateTime) { @@ -65,7 +65,7 @@ class DateTimeToTimestampTransformer extends BaseDateTimeTransformer public function reverseTransform($value) { if (null === $value) { - return null; + return; } if (!is_numeric($value)) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php index 3f6463eb5a..a14074ce9f 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php @@ -22,9 +22,9 @@ class IntegerToLocalizedStringTransformer extends NumberToLocalizedStringTransfo /** * Constructs a transformer. * - * @param integer $precision Unused. - * @param Boolean $grouping Whether thousands should be grouped. - * @param integer $roundingMode One of the ROUND_ constants in this class. + * @param int $precision Unused. + * @param bool $grouping Whether thousands should be grouped. + * @param int $roundingMode One of the ROUND_ constants in this class. */ public function __construct($precision = 0, $grouping = false, $roundingMode = self::ROUND_DOWN) { @@ -36,7 +36,7 @@ class IntegerToLocalizedStringTransformer extends NumberToLocalizedStringTransfo } /** - * {@inheritDoc} + * {@inheritdoc} */ public function reverseTransform($value) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php index 57416710d8..0fb2f72c29 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php @@ -117,7 +117,7 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface /** * Transforms a number type into localized number. * - * @param integer|float $value Number value. + * @param int|float $value Number value. * * @return string Localized value. * @@ -152,7 +152,7 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface * * @param string $value The localized value * - * @return integer|float The numeric value + * @return int|float The numeric value * * @throws TransformationFailedException If the given value is not a string * or if the value can not be transformed. @@ -164,7 +164,7 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface } if ('' === $value) { - return null; + return; } if ('NaN' === $value) { @@ -248,9 +248,9 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface /** * Rounds a number according to the configured precision and rounding mode. * - * @param integer|float $number A number. + * @param int|float $number A number. * - * @return integer|float The rounded number. + * @return int|float The rounded number. */ private function round($number) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php index e099d436bf..bbf4761fa0 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php @@ -40,7 +40,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface * * @see self::$types for a list of supported types * - * @param integer $precision The precision + * @param int $precision The precision * @param string $type One of the supported types * * @throws UnexpectedTypeException if the given value of type is unknown @@ -115,7 +115,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface } if ('' === $value) { - return null; + return; } $formatter = $this->getNumberFormatter(); diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php index c34a0139fa..618fc6b4a4 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php @@ -78,7 +78,7 @@ class ValueToDuplicatesTransformer implements DataTransformerInterface if (count($emptyKeys) > 0) { if (count($emptyKeys) == count($this->keys)) { // All keys empty - return null; + return; } throw new TransformationFailedException( diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php index 925585db40..a3e27d57e3 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php @@ -32,7 +32,7 @@ class FixRadioInputListener implements EventSubscriberInterface * Constructor. * * @param ChoiceListInterface $choiceList - * @param Boolean $placeholderPresent + * @param bool $placeholderPresent */ public function __construct(ChoiceListInterface $choiceList, $placeholderPresent) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php index 4d0bdfaae0..b0fbdb54c3 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php @@ -23,22 +23,22 @@ class MergeCollectionListener implements EventSubscriberInterface { /** * Whether elements may be added to the collection - * @var Boolean + * @var bool */ private $allowAdd; /** * Whether elements may be removed from the collection - * @var Boolean + * @var bool */ private $allowDelete; /** * Creates a new listener. * - * @param Boolean $allowAdd Whether values might be added to the + * @param bool $allowAdd Whether values might be added to the * collection. - * @param Boolean $allowDelete Whether values might be removed from the + * @param bool $allowDelete Whether values might be removed from the * collection. */ public function __construct($allowAdd = false, $allowDelete = false) diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php index 207cbd3d38..022ddc5df3 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php @@ -35,13 +35,13 @@ class ResizeFormListener implements EventSubscriberInterface /** * Whether children could be added to the group - * @var Boolean + * @var bool */ protected $allowAdd; /** * Whether children could be removed from the group - * @var Boolean + * @var bool */ protected $allowDelete; diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ButtonType.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ButtonType.php index 75e95ab41e..c4b97652cd 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ButtonType.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ButtonType.php @@ -26,7 +26,6 @@ class ButtonType extends BaseType implements ButtonTypeInterface */ public function getParent() { - return null; } /** diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php index cdaee86b25..44200ce054 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php @@ -190,10 +190,10 @@ class ChoiceType extends AbstractType $emptyValueNormalizer = function (Options $options, $emptyValue) { if ($options['multiple']) { // never use an empty value for this case - return null; + return; } elseif (false === $emptyValue) { // an empty value should be added but the user decided otherwise - return null; + return; } elseif ($options['expanded'] && '' === $emptyValue) { // never use an empty label for radio buttons return 'None'; diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/FormType.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/FormType.php index 7c6e602783..f154096bb5 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -202,7 +202,6 @@ class FormType extends BaseType */ public function getParent() { - return null; } /** diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfExtension.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfExtension.php index 765a012e8d..0bc8ca7db1 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfExtension.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfExtension.php @@ -61,7 +61,7 @@ class CsrfExtension extends AbstractExtension } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function loadTypeExtensions() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php index abd681626c..3dac776208 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php @@ -49,7 +49,7 @@ interface CsrfProviderInterface * @param string $intention The intention used when generating the CSRF token * @param string $token The token supplied by the browser * - * @return Boolean Whether the token supplied by the browser is correct + * @return bool Whether the token supplied by the browser is correct */ public function isCsrfTokenValid($intention, $token); } diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php index db6cde97fc..9d2f774c04 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php @@ -46,7 +46,7 @@ class DefaultCsrfProvider implements CsrfProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function generateCsrfToken($intention) { @@ -54,7 +54,7 @@ class DefaultCsrfProvider implements CsrfProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isCsrfTokenValid($intention, $token) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php index d5a111ca0a..3febe0ed57 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php @@ -36,7 +36,7 @@ class FormTypeCsrfExtension extends AbstractTypeExtension private $defaultTokenManager; /** - * @var Boolean + * @var bool */ private $defaultEnabled; @@ -117,7 +117,7 @@ class FormTypeCsrfExtension extends AbstractTypeExtension } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setDefaultOptions(OptionsResolverInterface $resolver) { @@ -145,7 +145,7 @@ class FormTypeCsrfExtension extends AbstractTypeExtension } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getExtendedType() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php index 941bd2102e..3c15012109 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php @@ -34,7 +34,7 @@ class DataCollectorExtension extends AbstractExtension } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function loadTypeExtensions() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php index 4822989b58..2baceb989a 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php @@ -36,7 +36,7 @@ class DataCollectorListener implements EventSubscriberInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public static function getSubscribedEvents() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php index 2119248132..be2f07a586 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php @@ -198,7 +198,7 @@ class FormDataCollector extends DataCollector implements FormDataCollectorInterf } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getName() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php index 1b5cfb695d..2c6ddfe3e5 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php @@ -36,7 +36,7 @@ class DataCollectorTypeExtension extends AbstractTypeExtension } /** - * {@inheritDoc} + * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { @@ -44,7 +44,7 @@ class DataCollectorTypeExtension extends AbstractTypeExtension } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getExtendedType() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php index c1dda60b7a..74790ba330 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php @@ -52,7 +52,7 @@ class TemplatingRendererEngine extends AbstractRendererEngine * @param FormView $view The form view for finding the applying themes. * @param string $blockName The name of the block to load. * - * @return Boolean True if the resource could be loaded, false otherwise. + * @return bool True if the resource could be loaded, false otherwise. */ protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName) { @@ -110,7 +110,7 @@ class TemplatingRendererEngine extends AbstractRendererEngine * @param string $blockName The name of the block to load a resource for. * @param mixed $theme The theme to load the block from. * - * @return Boolean True if the resource could be loaded, false otherwise. + * @return bool True if the resource could be loaded, false otherwise. */ protected function loadResourceFromTheme($cacheKey, $blockName, $theme) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php index 0df176f7d7..154e865923 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php @@ -135,7 +135,7 @@ class FormValidator extends ConstraintValidator * * @param FormInterface $form The form to test. * - * @return Boolean Whether the graph walker may walk the data. + * @return bool Whether the graph walker may walk the data. */ private static function allowDataWalking(FormInterface $form) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php index 7c5e6784ae..f5bc00daa6 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php @@ -35,7 +35,7 @@ abstract class BaseValidatorExtension extends AbstractTypeExtension } if (empty($groups)) { - return null; + return; } if (is_callable($groups)) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Util/ServerParams.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Util/ServerParams.php index a20bf5ad64..93a1dd7d6f 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Util/ServerParams.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/Util/ServerParams.php @@ -19,14 +19,14 @@ class ServerParams /** * Returns maximum post size in bytes. * - * @return null|integer The maximum post size in bytes + * @return null|int The maximum post size in bytes */ public function getPostMaxSize() { $iniMax = strtolower($this->getNormalizedIniPostMaxSize()); if ('' === $iniMax) { - return null; + return; } $max = ltrim($iniMax, '+'); diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php index 5cd02daa91..63d06dca71 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php @@ -28,7 +28,7 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessType($class, $property) { @@ -40,7 +40,7 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessRequired($class, $property) { @@ -54,7 +54,7 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessMaxLength($class, $property) { @@ -66,7 +66,7 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessPattern($class, $property) { @@ -159,8 +159,6 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\False': return new TypeGuess('checkbox', array(), Guess::MEDIUM_CONFIDENCE); } - - return null; } /** @@ -178,8 +176,6 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\True': return new ValueGuess(true, Guess::HIGH_CONFIDENCE); } - - return null; } /** @@ -210,8 +206,6 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface } break; } - - return null; } /** @@ -250,8 +244,6 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface } break; } - - return null; } /** diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php index 7b96efb4d6..ce48e77c24 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php @@ -64,8 +64,6 @@ class MappingRule if ($propertyPath === (string) $this->propertyPath) { return $this->getTarget(); } - - return null; } /** @@ -73,7 +71,7 @@ class MappingRule * * @param string $propertyPath The property path to match against the rule. * - * @return Boolean Whether the property path is a prefix of the rule or not. + * @return bool Whether the property path is a prefix of the rule or not. */ public function isPrefix($propertyPath) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php index 6ea56eb03b..220b3aadfc 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php @@ -25,7 +25,7 @@ use Symfony\Component\Validator\ConstraintViolation; class ViolationMapper implements ViolationMapperInterface { /** - * @var Boolean + * @var bool */ private $allowNonSynchronized; @@ -172,7 +172,7 @@ class ViolationMapper implements ViolationMapperInterface // Make the path longer until we find a matching child while (true) { if (!$it->valid()) { - return null; + return; } if ($it->isIndex()) { @@ -223,8 +223,6 @@ class ViolationMapper implements ViolationMapperInterface return $foundChild; } } - - return null; } /** @@ -289,7 +287,7 @@ class ViolationMapper implements ViolationMapperInterface /** * @param FormInterface $form * - * @return Boolean + * @return bool */ private function acceptsErrors(FormInterface $form) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php index eb8907f1af..e53046caf5 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php @@ -26,7 +26,7 @@ interface ViolationMapperInterface * @param ConstraintViolation $violation The violation to map. * @param FormInterface $form The root form of the tree * to map it to. - * @param Boolean $allowNonSynchronized Whether to allow + * @param bool $allowNonSynchronized Whether to allow * mapping to non-synchronized forms. */ public function mapViolation(ConstraintViolation $violation, FormInterface $form, $allowNonSynchronized = false); diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php index 06d091954e..662443ed72 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php @@ -41,7 +41,7 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface private $pathAsString = ''; /** - * @var integer + * @var int */ private $length = 0; @@ -127,7 +127,7 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface public function getParent() { if ($this->length <= 1) { - return null; + return; } $parent = clone $this; @@ -198,9 +198,9 @@ class ViolationPath implements \IteratorAggregate, PropertyPathInterface * In this example, "address" and "office" map to forms, while * "street does not. * - * @param integer $index The element index. + * @param int $index The element index. * - * @return Boolean Whether the element maps to a form. + * @return bool Whether the element maps to a form. * * @throws OutOfBoundsException If the offset is invalid. */ diff --git a/vendor/symfony/form/Symfony/Component/Form/Form.php b/vendor/symfony/form/Symfony/Component/Form/Form.php index 22207c2c48..4ee2363ecd 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Form.php +++ b/vendor/symfony/form/Symfony/Component/Form/Form.php @@ -86,7 +86,7 @@ class Form implements \IteratorAggregate, FormInterface /** * Whether this form was submitted - * @var Boolean + * @var bool */ private $submitted = false; @@ -124,7 +124,7 @@ class Form implements \IteratorAggregate, FormInterface * Whether the data in model, normalized and view format is * synchronized. Data may not be synchronized if transformation errors * occur. - * @var Boolean + * @var bool */ private $synchronized = true; @@ -138,13 +138,13 @@ class Form implements \IteratorAggregate, FormInterface * manually, making the initialization with the configured default value * superfluous. * - * @var Boolean + * @var bool */ private $defaultDataSet = false; /** * Whether setData() is currently being called. - * @var Boolean + * @var bool */ private $lockSetData = false; @@ -209,7 +209,7 @@ class Form implements \IteratorAggregate, FormInterface } if (null === $this->getName() || '' === $this->getName()) { - return null; + return; } $parent = $this->parent; @@ -238,7 +238,7 @@ class Form implements \IteratorAggregate, FormInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isDisabled() { @@ -767,8 +767,6 @@ class Form implements \IteratorAggregate, FormInterface if ($this->parent && method_exists($this->parent, 'getClickedButton')) { return $this->parent->getClickedButton(); } - - return null; } /** @@ -784,7 +782,7 @@ class Form implements \IteratorAggregate, FormInterface * * This method should only be used to help debug a form. * - * @param integer $level The indentation level (used internally) + * @param int $level The indentation level (used internally) * * @return string A string representation of all errors */ @@ -932,7 +930,7 @@ class Form implements \IteratorAggregate, FormInterface * * @param string $name The name of the child * - * @return Boolean + * @return bool */ public function offsetExists($name) { @@ -994,7 +992,7 @@ class Form implements \IteratorAggregate, FormInterface /** * Returns the number of form children (implements the \Countable interface). * - * @return integer The number of embedded form children + * @return int The number of embedded form children */ public function count() { diff --git a/vendor/symfony/form/Symfony/Component/Form/FormBuilderInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormBuilderInterface.php index 1dc4a64e7b..3294a3d3bd 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormBuilderInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormBuilderInterface.php @@ -23,7 +23,7 @@ interface FormBuilderInterface extends \Traversable, \Countable, FormConfigBuild * If you add a nested group, this group should also be represented in the * object hierarchy. * - * @param string|integer|FormBuilderInterface $child + * @param string|int|FormBuilderInterface $child * @param string|FormTypeInterface $type * @param array $options * @@ -67,7 +67,7 @@ interface FormBuilderInterface extends \Traversable, \Countable, FormConfigBuild * * @param string $name * - * @return Boolean + * @return bool */ public function has($name); diff --git a/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilder.php b/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilder.php index 1015da4f51..730c63527a 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilder.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilder.php @@ -48,7 +48,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface ); /** - * @var Boolean + * @var bool */ protected $locked = false; @@ -68,22 +68,22 @@ class FormConfigBuilder implements FormConfigBuilderInterface private $propertyPath; /** - * @var Boolean + * @var bool */ private $mapped = true; /** - * @var Boolean + * @var bool */ private $byReference = true; /** - * @var Boolean + * @var bool */ private $inheritData = false; /** - * @var Boolean + * @var bool */ private $compound = false; @@ -108,17 +108,17 @@ class FormConfigBuilder implements FormConfigBuilderInterface private $dataMapper; /** - * @var Boolean + * @var bool */ private $required = true; /** - * @var Boolean + * @var bool */ private $disabled = false; /** - * @var Boolean + * @var bool */ private $errorBubbling = false; @@ -143,7 +143,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface private $dataClass; /** - * @var Boolean + * @var bool */ private $dataLocked; @@ -168,7 +168,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface private $requestHandler; /** - * @var Boolean + * @var bool */ private $autoInitialize = false; @@ -180,7 +180,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface /** * Creates an empty form configuration. * - * @param string|integer $name The form name + * @param string|int $name The form name * @param string $dataClass The class of the form's data * @param EventDispatcherInterface $dispatcher The event dispatcher * @param array $options The form options @@ -603,7 +603,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.'); } - $this->disabled = (Boolean) $disabled; + $this->disabled = (bool) $disabled; return $this; } @@ -631,7 +631,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.'); } - $this->errorBubbling = null === $errorBubbling ? null : (Boolean) $errorBubbling; + $this->errorBubbling = null === $errorBubbling ? null : (bool) $errorBubbling; return $this; } @@ -645,7 +645,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.'); } - $this->required = (Boolean) $required; + $this->required = (bool) $required; return $this; } @@ -713,7 +713,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface /** * Alias of {@link setInheritData()}. * - * @param Boolean $inheritData Whether the form should inherit its parent's data. + * @param bool $inheritData Whether the form should inherit its parent's data. * * @return FormConfigBuilder The configuration object. * @@ -855,7 +855,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface */ public function setAutoInitialize($initialize) { - $this->autoInitialize = (Boolean) $initialize; + $this->autoInitialize = (bool) $initialize; return $this; } @@ -879,7 +879,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface /** * Validates whether the given variable is a valid form name. * - * @param string|integer $name The tested form name. + * @param string|int $name The tested form name. * * @throws UnexpectedTypeException If the name is not a string or an integer. * @throws InvalidArgumentException If the name contains invalid characters. @@ -910,7 +910,7 @@ class FormConfigBuilder implements FormConfigBuilderInterface * * @param string $name The tested form name. * - * @return Boolean Whether the name is valid. + * @return bool Whether the name is valid. */ public static function isValidName($name) { diff --git a/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilderInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilderInterface.php index 62d12c09cb..276a2fa446 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilderInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormConfigBuilderInterface.php @@ -23,7 +23,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface * * @param string $eventName The name of the event to listen to. * @param callable $listener The listener to execute. - * @param integer $priority The priority of the listener. Listeners + * @param int $priority The priority of the listener. Listeners * with a higher priority are called before * listeners with a lower priority. * @@ -49,7 +49,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface * view to the normalized format. * * @param DataTransformerInterface $viewTransformer - * @param Boolean $forcePrepend if set to true, prepend instead of appending + * @param bool $forcePrepend if set to true, prepend instead of appending * * @return self The configuration object. */ @@ -71,7 +71,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface * normalized to the model format. * * @param DataTransformerInterface $modelTransformer - * @param Boolean $forceAppend if set to true, append instead of prepending + * @param bool $forceAppend if set to true, append instead of prepending * * @return self The configuration object. */ @@ -115,7 +115,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface /** * Set whether the form is disabled. * - * @param Boolean $disabled Whether the form is disabled + * @param bool $disabled Whether the form is disabled * * @return self The configuration object. */ @@ -133,7 +133,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface /** * Sets whether errors bubble up to the parent. * - * @param Boolean $errorBubbling + * @param bool $errorBubbling * * @return self The configuration object. */ @@ -142,7 +142,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface /** * Sets whether this field is required to be filled out when submitted. * - * @param Boolean $required + * @param bool $required * * @return self The configuration object. */ @@ -163,7 +163,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface * Sets whether the form should be mapped to an element of its * parent's data. * - * @param Boolean $mapped Whether the form should be mapped. + * @param bool $mapped Whether the form should be mapped. * * @return self The configuration object. */ @@ -172,7 +172,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface /** * Sets whether the form's data should be modified by reference. * - * @param Boolean $byReference Whether the data should be + * @param bool $byReference Whether the data should be * modified by reference. * * @return self The configuration object. @@ -182,7 +182,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface /** * Sets whether the form should read and write the data of its parent. * - * @param Boolean $inheritData Whether the form should inherit its parent's data. + * @param bool $inheritData Whether the form should inherit its parent's data. * * @return self The configuration object. */ @@ -191,7 +191,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface /** * Sets whether the form should be compound. * - * @param Boolean $compound Whether the form should be compound. + * @param bool $compound Whether the form should be compound. * * @return self The configuration object. * @@ -224,7 +224,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface * this configuration. The data can only be modified then by * submitting the form. * - * @param Boolean $locked Whether to lock the default data. + * @param bool $locked Whether to lock the default data. * * @return self The configuration object. */ @@ -269,7 +269,7 @@ interface FormConfigBuilderInterface extends FormConfigInterface * * Should be set to true only for root forms. * - * @param Boolean $initialize True to initialize the form automatically, + * @param bool $initialize True to initialize the form automatically, * false to suppress automatic initialization. * In the second case, you need to call * {@link FormInterface::initialize()} manually. diff --git a/vendor/symfony/form/Symfony/Component/Form/FormConfigInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormConfigInterface.php index 576fcd8142..ea19165407 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormConfigInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormConfigInterface.php @@ -43,21 +43,21 @@ interface FormConfigInterface * Returns whether the form should be mapped to an element of its * parent's data. * - * @return Boolean Whether the form is mapped. + * @return bool Whether the form is mapped. */ public function getMapped(); /** * Returns whether the form's data should be modified by reference. * - * @return Boolean Whether to modify the form's data by reference. + * @return bool Whether to modify the form's data by reference. */ public function getByReference(); /** * Returns whether the form should read and write the data of its parent. * - * @return Boolean Whether the form should inherit its parent's data. + * @return bool Whether the form should inherit its parent's data. */ public function getInheritData(); @@ -68,7 +68,7 @@ interface FormConfigInterface * children. A form can be compound and have no children at all, like * for example an empty collection form. * - * @return Boolean Whether the form is compound. + * @return bool Whether the form is compound. */ public function getCompound(); @@ -103,21 +103,21 @@ interface FormConfigInterface /** * Returns whether the form is required. * - * @return Boolean Whether the form is required. + * @return bool Whether the form is required. */ public function getRequired(); /** * Returns whether the form is disabled. * - * @return Boolean Whether the form is disabled. + * @return bool Whether the form is disabled. */ public function getDisabled(); /** * Returns whether errors attached to the form will bubble to its parent. * - * @return Boolean Whether errors will bubble up. + * @return bool Whether errors will bubble up. */ public function getErrorBubbling(); @@ -140,7 +140,7 @@ interface FormConfigInterface * * @param string $name The attribute name. * - * @return Boolean Whether the attribute exists. + * @return bool Whether the attribute exists. */ public function hasAttribute($name); @@ -175,7 +175,7 @@ interface FormConfigInterface * this configuration. The data can only be modified then by * submitting the form. * - * @return Boolean Whether the data is locked. + * @return bool Whether the data is locked. */ public function getDataLocked(); @@ -210,7 +210,7 @@ interface FormConfigInterface /** * Returns whether the form should be initialized upon creation. * - * @return Boolean Returns true if the form should be initialized + * @return bool Returns true if the form should be initialized * when created, false otherwise. */ public function getAutoInitialize(); @@ -227,7 +227,7 @@ interface FormConfigInterface * * @param string $name The option name, * - * @return Boolean Whether the option exists. + * @return bool Whether the option exists. */ public function hasOption($name); diff --git a/vendor/symfony/form/Symfony/Component/Form/FormError.php b/vendor/symfony/form/Symfony/Component/Form/FormError.php index 343165ca46..8927a76065 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormError.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormError.php @@ -37,7 +37,7 @@ class FormError /** * The value for error message pluralization - * @var integer|null + * @var int|null */ protected $messagePluralization; @@ -51,7 +51,7 @@ class FormError * @param string|null $messageTemplate The template for the error message * @param array $messageParameters The parameters that should be * substituted in the message template. - * @param integer|null $messagePluralization The value for error message pluralization + * @param int|null $messagePluralization The value for error message pluralization * * @see \Symfony\Component\Translation\Translator */ @@ -96,7 +96,7 @@ class FormError /** * Returns the value for error message pluralization. * - * @return integer|null + * @return int|null */ public function getMessagePluralization() { diff --git a/vendor/symfony/form/Symfony/Component/Form/FormExtensionInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormExtensionInterface.php index a67055b797..4fcf0b8f73 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormExtensionInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormExtensionInterface.php @@ -32,7 +32,7 @@ interface FormExtensionInterface * * @param string $name The name of the type * - * @return Boolean Whether the type is supported by this extension + * @return bool Whether the type is supported by this extension */ public function hasType($name); @@ -50,7 +50,7 @@ interface FormExtensionInterface * * @param string $name The name of the type * - * @return Boolean Whether the given type has extensions + * @return bool Whether the given type has extensions */ public function hasTypeExtensions($name); diff --git a/vendor/symfony/form/Symfony/Component/Form/FormFactoryInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormFactoryInterface.php index 31c46b55d7..220b470496 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormFactoryInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormFactoryInterface.php @@ -36,7 +36,7 @@ interface FormFactoryInterface * * @see createNamedBuilder() * - * @param string|integer $name The name of the form + * @param string|int $name The name of the form * @param string|FormTypeInterface $type The type of the form * @param mixed $data The initial data * @param array $options The options @@ -79,7 +79,7 @@ interface FormFactoryInterface /** * Returns a form builder. * - * @param string|integer $name The name of the form + * @param string|int $name The name of the form * @param string|FormTypeInterface $type The type of the form * @param mixed $data The initial data * @param array $options The options diff --git a/vendor/symfony/form/Symfony/Component/Form/FormInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormInterface.php index 7a77e0f3f4..67dbb2319b 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormInterface.php @@ -41,7 +41,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable /** * Adds or replaces a child to the form. * - * @param FormInterface|string|integer $child The FormInterface instance or the name of the child. + * @param FormInterface|string|int $child The FormInterface instance or the name of the child. * @param string|null $type The child's type, if a name was passed. * @param array $options The child's options, if a name was passed. * @@ -69,7 +69,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable * * @param string $name The name of the child * - * @return Boolean + * @return bool */ public function has($name); @@ -152,7 +152,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable /** * Returns whether the form is submitted. * - * @return Boolean true if the form is submitted, false otherwise + * @return bool true if the form is submitted, false otherwise */ public function isSubmitted(); @@ -184,7 +184,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable * * If the form is not submitted, this method always returns false. * - * @return Boolean + * @return bool */ public function isValid(); @@ -195,7 +195,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable * will always return false. Otherwise the value set with setRequired() * is returned. * - * @return Boolean + * @return bool */ public function isRequired(); @@ -208,21 +208,21 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable * Forms whose parents are disabled are considered disabled regardless of * their own state. * - * @return Boolean + * @return bool */ public function isDisabled(); /** * Returns whether the form is empty. * - * @return Boolean + * @return bool */ public function isEmpty(); /** * Returns whether the data in the different formats is synchronized. * - * @return Boolean + * @return bool */ public function isSynchronized(); @@ -253,7 +253,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable * Submits data to the form, transforms and validates it. * * @param null|string|array $submittedData The submitted data. - * @param Boolean $clearMissing Whether to set fields to NULL + * @param bool $clearMissing Whether to set fields to NULL * when they are missing in the * submitted data. * @@ -273,7 +273,7 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable /** * Returns whether the field is the root of the form tree. * - * @return Boolean + * @return bool */ public function isRoot(); diff --git a/vendor/symfony/form/Symfony/Component/Form/FormRegistryInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormRegistryInterface.php index 141c4721c5..b15131c39b 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormRegistryInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormRegistryInterface.php @@ -37,7 +37,7 @@ interface FormRegistryInterface * * @param string $name The name of the type * - * @return Boolean Whether the type is supported + * @return bool Whether the type is supported */ public function hasType($name); diff --git a/vendor/symfony/form/Symfony/Component/Form/FormRendererEngineInterface.php b/vendor/symfony/form/Symfony/Component/Form/FormRendererEngineInterface.php index e06824ec95..9f04e1999a 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormRendererEngineInterface.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormRendererEngineInterface.php @@ -78,7 +78,7 @@ interface FormRendererEngineInterface * its parent etc. * @param array $blockNameHierarchy The block name hierarchy, with * the root block at the beginning. - * @param integer $hierarchyLevel The level in the hierarchy at + * @param int $hierarchyLevel The level in the hierarchy at * which to start looking. Level 0 * indicates the root block, i.e. * the first element of @@ -122,13 +122,13 @@ interface FormRendererEngineInterface * its parent etc. * @param array $blockNameHierarchy The block name hierarchy, with * the root block at the beginning. - * @param integer $hierarchyLevel The level in the hierarchy at + * @param int $hierarchyLevel The level in the hierarchy at * which to start looking. Level 0 * indicates the root block, i.e. * the first element of * $blockNameHierarchy. * - * @return integer|Boolean The hierarchy level or false, if no resource was found. + * @return int|bool The hierarchy level or false, if no resource was found. */ public function getResourceHierarchyLevel(FormView $view, array $blockNameHierarchy, $hierarchyLevel); diff --git a/vendor/symfony/form/Symfony/Component/Form/FormTypeGuesserChain.php b/vendor/symfony/form/Symfony/Component/Form/FormTypeGuesserChain.php index 6e858ddffe..27db889026 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormTypeGuesserChain.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormTypeGuesserChain.php @@ -41,7 +41,7 @@ class FormTypeGuesserChain implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessType($class, $property) { @@ -51,7 +51,7 @@ class FormTypeGuesserChain implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessRequired($class, $property) { @@ -61,7 +61,7 @@ class FormTypeGuesserChain implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessMaxLength($class, $property) { @@ -71,7 +71,7 @@ class FormTypeGuesserChain implements FormTypeGuesserInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function guessPattern($class, $property) { diff --git a/vendor/symfony/form/Symfony/Component/Form/FormView.php b/vendor/symfony/form/Symfony/Component/Form/FormView.php index 1f53ec6a40..a807551854 100644 --- a/vendor/symfony/form/Symfony/Component/Form/FormView.php +++ b/vendor/symfony/form/Symfony/Component/Form/FormView.php @@ -46,7 +46,7 @@ class FormView implements \ArrayAccess, \IteratorAggregate, \Countable * Row implicitly includes widget, however certain rendering mechanisms * have to skip widget rendering when a row is rendered. * - * @var Boolean + * @var bool */ private $rendered = false; @@ -58,7 +58,7 @@ class FormView implements \ArrayAccess, \IteratorAggregate, \Countable /** * Returns whether the view was already rendered. * - * @return Boolean Whether this view's widget is rendered. + * @return bool Whether this view's widget is rendered. */ public function isRendered() { @@ -110,7 +110,7 @@ class FormView implements \ArrayAccess, \IteratorAggregate, \Countable * * @param string $name The child name * - * @return Boolean Whether the child view exists + * @return bool Whether the child view exists */ public function offsetExists($name) { @@ -150,7 +150,7 @@ class FormView implements \ArrayAccess, \IteratorAggregate, \Countable /** * Implements \Countable. * - * @return integer The number of children views + * @return int The number of children views */ public function count() { diff --git a/vendor/symfony/form/Symfony/Component/Form/Guess/Guess.php b/vendor/symfony/form/Symfony/Component/Form/Guess/Guess.php index 6616ff5092..93568c3c52 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Guess/Guess.php +++ b/vendor/symfony/form/Symfony/Component/Form/Guess/Guess.php @@ -26,25 +26,25 @@ abstract class Guess { /** * Marks an instance with a value that is extremely likely to be correct - * @var integer + * @var int */ const VERY_HIGH_CONFIDENCE = 3; /** * Marks an instance with a value that is very likely to be correct - * @var integer + * @var int */ const HIGH_CONFIDENCE = 2; /** * Marks an instance with a value that is likely to be correct - * @var integer + * @var int */ const MEDIUM_CONFIDENCE = 1; /** * Marks an instance with a value that may be correct - * @var integer + * @var int */ const LOW_CONFIDENCE = 0; @@ -54,7 +54,7 @@ abstract class Guess * One of VERY_HIGH_CONFIDENCE, HIGH_CONFIDENCE, MEDIUM_CONFIDENCE * and LOW_CONFIDENCE. * - * @var integer + * @var int */ private $confidence; @@ -86,7 +86,7 @@ abstract class Guess /** * Constructor. * - * @param integer $confidence The confidence + * @param int $confidence The confidence * * @throws InvalidArgumentException if the given value of confidence is unknown */ @@ -103,7 +103,7 @@ abstract class Guess /** * Returns the confidence that the guessed value is correct. * - * @return integer One of the constants VERY_HIGH_CONFIDENCE, + * @return int One of the constants VERY_HIGH_CONFIDENCE, * HIGH_CONFIDENCE, MEDIUM_CONFIDENCE and LOW_CONFIDENCE */ public function getConfidence() diff --git a/vendor/symfony/form/Symfony/Component/Form/Guess/TypeGuess.php b/vendor/symfony/form/Symfony/Component/Form/Guess/TypeGuess.php index 3241e603df..7136b7874b 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Guess/TypeGuess.php +++ b/vendor/symfony/form/Symfony/Component/Form/Guess/TypeGuess.php @@ -37,7 +37,7 @@ class TypeGuess extends Guess * @param string $type The guessed field type * @param array $options The options for creating instances of the * guessed class - * @param integer $confidence The confidence that the guessed class name + * @param int $confidence The confidence that the guessed class name * is correct */ public function __construct($type, array $options, $confidence) diff --git a/vendor/symfony/form/Symfony/Component/Form/Guess/ValueGuess.php b/vendor/symfony/form/Symfony/Component/Form/Guess/ValueGuess.php index 2e3333ba5b..bf450d6002 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Guess/ValueGuess.php +++ b/vendor/symfony/form/Symfony/Component/Form/Guess/ValueGuess.php @@ -28,7 +28,7 @@ class ValueGuess extends Guess * Constructor * * @param string $value The guessed value - * @param integer $confidence The confidence that the guessed class name + * @param int $confidence The confidence that the guessed class name * is correct */ public function __construct($value, $confidence) diff --git a/vendor/symfony/form/Symfony/Component/Form/NativeRequestHandler.php b/vendor/symfony/form/Symfony/Component/Form/NativeRequestHandler.php index c79159b3d3..c76534473c 100644 --- a/vendor/symfony/form/Symfony/Component/Form/NativeRequestHandler.php +++ b/vendor/symfony/form/Symfony/Component/Form/NativeRequestHandler.php @@ -180,7 +180,7 @@ class NativeRequestHandler implements RequestHandlerInterface if (self::$fileKeys === $keys) { if (UPLOAD_ERR_NO_FILE === $data['error']) { - return null; + return; } return $data; diff --git a/vendor/symfony/form/Symfony/Component/Form/ReversedTransformer.php b/vendor/symfony/form/Symfony/Component/Form/ReversedTransformer.php index 7069705feb..4fd2456462 100644 --- a/vendor/symfony/form/Symfony/Component/Form/ReversedTransformer.php +++ b/vendor/symfony/form/Symfony/Component/Form/ReversedTransformer.php @@ -38,7 +38,7 @@ class ReversedTransformer implements DataTransformerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function transform($value) { @@ -46,7 +46,7 @@ class ReversedTransformer implements DataTransformerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function reverseTransform($value) { diff --git a/vendor/symfony/form/Symfony/Component/Form/SubmitButton.php b/vendor/symfony/form/Symfony/Component/Form/SubmitButton.php index 47d4be0e28..e95cdeeff7 100644 --- a/vendor/symfony/form/Symfony/Component/Form/SubmitButton.php +++ b/vendor/symfony/form/Symfony/Component/Form/SubmitButton.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Form; class SubmitButton extends Button implements ClickableInterface { /** - * @var Boolean + * @var bool */ private $clicked = false; @@ -35,7 +35,7 @@ class SubmitButton extends Button implements ClickableInterface * Submits data to the button. * * @param null|string $submittedData The data. - * @param Boolean $clearMissing Not used. + * @param bool $clearMissing Not used. * * @return SubmitButton The button instance * diff --git a/vendor/symfony/form/Symfony/Component/Form/Test/FormPerformanceTestCase.php b/vendor/symfony/form/Symfony/Component/Form/Test/FormPerformanceTestCase.php index b57aa9da8d..b0d07555d9 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Test/FormPerformanceTestCase.php +++ b/vendor/symfony/form/Symfony/Component/Form/Test/FormPerformanceTestCase.php @@ -22,7 +22,7 @@ namespace Symfony\Component\Form\Test; abstract class FormPerformanceTestCase extends FormIntegrationTestCase { /** - * @var integer + * @var int */ protected $maxRunningTime = 0; @@ -47,7 +47,7 @@ abstract class FormPerformanceTestCase extends FormIntegrationTestCase } /** - * @param integer $maxRunningTime + * @param int $maxRunningTime * @throws \InvalidArgumentException */ public function setMaxRunningTime($maxRunningTime) @@ -60,7 +60,7 @@ abstract class FormPerformanceTestCase extends FormIntegrationTestCase } /** - * @return integer + * @return int * @since Method available since Release 2.3.0 */ public function getMaxRunningTime() diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php index a15d7e0d54..56f28ddd72 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php @@ -53,8 +53,9 @@ class PropertyPathMapperTest extends \PHPUnit_Framework_TestCase /** * @param FormConfigInterface $config - * @param Boolean $synchronized - * @param Boolean $submitted + * @param bool $synchronized + * @param bool $submitted + * * @return \PHPUnit_Framework_MockObject_MockObject */ private function getForm(FormConfigInterface $config, $synchronized = true, $submitted = true) diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php index a1217783d1..4149160c9c 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php @@ -18,7 +18,7 @@ class BooleanToStringTransformerTest extends \PHPUnit_Framework_TestCase const TRUE_VALUE = '1'; /** - * @var BooleanToStringTransformer + * @var boolToStringTransformer */ protected $transformer; diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php index 97fc37fa3d..e42c89c5a8 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php @@ -40,7 +40,7 @@ class MoneyTypeTest extends TypeTestCase $form = $this->factory->create('money', null, array('currency' => 'JPY')); $view = $form->createView(); - $this->assertTrue((Boolean) strstr($view->vars['money_pattern'], 'Â¥')); + $this->assertTrue((bool) strstr($view->vars['money_pattern'], 'Â¥')); } // https://github.com/symfony/symfony/issues/5458 diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php index 254b2a8e4e..718d4cd650 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php @@ -47,6 +47,18 @@ class UrlTypeTest extends TypeTestCase $this->assertSame('', $form->getViewData()); } + public function testSubmitAddsNoDefaultProtocolIfNull() + { + $form = $this->factory->create('url', null, array( + 'default_protocol' => 'http', + )); + + $form->submit(null); + + $this->assertNull($form->getData()); + $this->assertSame('', $form->getViewData()); + } + public function testSubmitAddsNoDefaultProtocolIfSetToNull() { $form = $this->factory->create('url', null, array( diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php index 527de1616b..e26bf7f1b6 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php @@ -64,7 +64,7 @@ abstract class BaseValidatorExtensionTest extends TypeTestCase public function testValidationGroupsCanBeSetToClosure() { $form = $this->createForm(array( - 'validation_groups' => function (FormInterface $form) { return null; }, + 'validation_groups' => function (FormInterface $form) { return; }, )); $this->assertTrue(is_callable($form->getConfig()->getOption('validation_groups'))); diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Fixtures/FooType.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Fixtures/FooType.php index d26d3f7683..626ccf08ed 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Tests/Fixtures/FooType.php +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Fixtures/FooType.php @@ -27,6 +27,5 @@ class FooType extends AbstractType public function getParent() { - return null; } } diff --git a/vendor/symfony/form/Symfony/Component/Form/Util/FormUtil.php b/vendor/symfony/form/Symfony/Component/Form/Util/FormUtil.php index 7647691e0a..b3beb458be 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Util/FormUtil.php +++ b/vendor/symfony/form/Symfony/Component/Form/Util/FormUtil.php @@ -30,7 +30,7 @@ class FormUtil * * @param mixed $data * - * @return Boolean + * @return bool */ public static function isEmpty($data) { diff --git a/vendor/symfony/form/Symfony/Component/Form/Util/OrderedHashMapIterator.php b/vendor/symfony/form/Symfony/Component/Form/Util/OrderedHashMapIterator.php index 87cf6a9d39..f606626814 100644 --- a/vendor/symfony/form/Symfony/Component/Form/Util/OrderedHashMapIterator.php +++ b/vendor/symfony/form/Symfony/Component/Form/Util/OrderedHashMapIterator.php @@ -33,12 +33,12 @@ class OrderedHashMapIterator implements \Iterator private $orderedKeys; /** - * @var integer + * @var int */ private $cursor; /** - * @var integer + * @var int */ private $cursorId; @@ -48,7 +48,7 @@ class OrderedHashMapIterator implements \Iterator private $managedCursors; /** - * @var string|integer|null + * @var string|int|null */ private $key; diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/RouterCacheWarmer.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/RouterCacheWarmer.php index 9fa48da42c..c3826aa822 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/RouterCacheWarmer.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/RouterCacheWarmer.php @@ -49,7 +49,7 @@ class RouterCacheWarmer implements CacheWarmerInterface /** * Checks whether this warmer is optional or not. * - * @return Boolean always true + * @return bool always true */ public function isOptional() { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/TemplatePathsCacheWarmer.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/TemplatePathsCacheWarmer.php index 0936290107..a23d1bb508 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/TemplatePathsCacheWarmer.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/CacheWarmer/TemplatePathsCacheWarmer.php @@ -55,7 +55,7 @@ class TemplatePathsCacheWarmer extends CacheWarmer /** * Checks whether this warmer is optional or not. * - * @return Boolean always true + * @return bool always true */ public function isOptional() { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Client.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Client.php index 5435d778c9..a3e5d5184e 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Client.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Client.php @@ -31,7 +31,7 @@ class Client extends BaseClient private $profiler = false; /** - * @inheritdoc + * {@inheritdoc} */ public function __construct(KernelInterface $kernel, array $server = array(), History $history = null, CookieJar $cookieJar = null) { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php index 405996902b..79bb035474 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php @@ -89,7 +89,7 @@ EOF } if (!$matches) { - $output->writeln('None of the routes matches'); + $output->writeln('None of the routes match'); return 1; } diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Application.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Application.php index 224dbea2e0..55cbd4fc08 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Application.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Application.php @@ -63,7 +63,7 @@ class Application extends BaseApplication * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * - * @return integer 0 if everything went fine, or an error code + * @return int 0 if everything went fine, or an error code */ public function doRun(InputInterface $input, OutputInterface $output) { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php index e85317113a..3b3b28f570 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php @@ -75,7 +75,7 @@ abstract class Descriptor implements DescriptorInterface * Writes content to output. * * @param string $content - * @param boolean $decorated + * @param bool $decorated */ protected function write($content, $decorated = false) { @@ -86,7 +86,7 @@ abstract class Descriptor implements DescriptorInterface * Writes content to output. * * @param TableHelper $table - * @param boolean $decorated + * @param bool $decorated */ protected function renderTable(TableHelper $table, $decorated = false) { @@ -248,7 +248,7 @@ abstract class Descriptor implements DescriptorInterface /** * @param ContainerBuilder $builder - * @param boolean $showPrivate + * @param bool $showPrivate * * @return array */ diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php index b5c4908c66..7318a7b60a 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php @@ -172,7 +172,7 @@ class JsonDescriptor extends Descriptor /** * @param Definition $definition - * @param boolean $omitTags + * @param bool $omitTags * * @return array */ diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php index b10f2816a0..300abf7c9e 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php @@ -212,7 +212,7 @@ class XmlDescriptor extends Descriptor /** * @param ContainerBuilder $builder - * @param boolean $showPrivate + * @param bool $showPrivate * * @return \DOMDocument */ @@ -260,7 +260,7 @@ class XmlDescriptor extends Descriptor /** * @param ContainerBuilder $builder * @param string|null $tag - * @param boolean $showPrivate + * @param bool $showPrivate * * @return \DOMDocument */ @@ -288,7 +288,7 @@ class XmlDescriptor extends Descriptor /** * @param Definition $definition * @param string|null $id - * @param boolean $omitTags + * @param bool $omitTags * * @return \DOMDocument */ diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/Controller.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/Controller.php index 42a43fcd2c..ecef9bc082 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/Controller.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/Controller.php @@ -38,7 +38,7 @@ class Controller extends ContainerAware * * @param string $route The name of the route * @param mixed $parameters An array of parameters - * @param Boolean|string $referenceType The type of reference (one of the constants in UrlGeneratorInterface) + * @param bool|string $referenceType The type of reference (one of the constants in UrlGeneratorInterface) * * @return string The generated URL * @@ -70,7 +70,7 @@ class Controller extends ContainerAware * Returns a RedirectResponse to the given URL. * * @param string $url The URL to redirect to - * @param integer $status The status code to use for the Response + * @param int $status The status code to use for the Response * * @return RedirectResponse */ @@ -222,11 +222,11 @@ class Controller extends ContainerAware } if (null === $token = $this->container->get('security.context')->getToken()) { - return null; + return; } if (!is_object($user = $token->getUser())) { - return null; + return; } return $user; @@ -237,7 +237,7 @@ class Controller extends ContainerAware * * @param string $id The service id * - * @return Boolean true if the service id is defined, false otherwise + * @return bool true if the service id is defined, false otherwise */ public function has($id) { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php index f9c3b49256..0e79d79152 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php @@ -36,8 +36,8 @@ class RedirectController extends ContainerAware * * @param Request $request The request instance * @param string $route The route name to redirect to - * @param Boolean $permanent Whether the redirection is permanent - * @param Boolean|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore + * @param bool $permanent Whether the redirection is permanent + * @param bool|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore * * @return Response A Response instance * @@ -72,10 +72,10 @@ class RedirectController extends ContainerAware * * @param Request $request The request instance * @param string $path The absolute path or URL to redirect to - * @param Boolean $permanent Whether the redirect is permanent or not + * @param bool $permanent Whether the redirect is permanent or not * @param string|null $scheme The URL scheme (null to keep the current one) - * @param integer|null $httpPort The HTTP port (null to keep the current one for the same scheme or the configured port in the container) - * @param integer|null $httpsPort The HTTPS port (null to keep the current one for the same scheme or the configured port in the container) + * @param int|null $httpPort The HTTP port (null to keep the current one for the same scheme or the configured port in the container) + * @param int|null $httpsPort The HTTPS port (null to keep the current one for the same scheme or the configured port in the container) * * @return Response A Response instance * diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/TemplateController.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/TemplateController.php index 105d14a8fe..db8acbe48b 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/TemplateController.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Controller/TemplateController.php @@ -27,7 +27,7 @@ class TemplateController extends ContainerAware * @param string $template The template name * @param int|null $maxAge Max age for client caching * @param int|null $sharedAge Max age for shared (proxy) caching - * @param Boolean|null $private Whether or not caching should apply for client caches only + * @param bool|null $private Whether or not caching should apply for client caches only * * @return Response A Response instance */ diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheClearerPass.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheClearerPass.php index c98e4e6a32..27b9b465c9 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheClearerPass.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheClearerPass.php @@ -23,7 +23,7 @@ use Symfony\Component\DependencyInjection\Reference; class AddCacheClearerPass implements CompilerPassInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheWarmerPass.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheWarmerPass.php index cf77dd5944..5fe2f62020 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheWarmerPass.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddCacheWarmerPass.php @@ -23,7 +23,7 @@ use Symfony\Component\DependencyInjection\Reference; class AddCacheWarmerPass implements CompilerPassInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php index 2fa5846c30..6c248d8a42 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php @@ -34,7 +34,7 @@ class SessionListener extends BaseSessionListener protected function getSession() { if (!$this->container->has('session')) { - return null; + return; } return $this->container->get('session'); diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/TestSessionListener.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/TestSessionListener.php index 80d940a0e1..b32faa2f05 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/TestSessionListener.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/EventListener/TestSessionListener.php @@ -31,7 +31,7 @@ class TestSessionListener extends BaseTestSessionListener protected function getSession() { if (!$this->container->has('session')) { - return null; + return; } return $this->container->get('session'); diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/HttpCache/HttpCache.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/HttpCache/HttpCache.php index f07c994a5d..2e5a2312dd 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/HttpCache/HttpCache.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/HttpCache/HttpCache.php @@ -46,7 +46,7 @@ abstract class HttpCache extends BaseHttpCache * Forwards the Request to the backend and returns the Response. * * @param Request $request A Request instance - * @param Boolean $raw Whether to catch exceptions or not + * @param bool $raw Whether to catch exceptions or not * @param Response $entry A Response instance (the stale entry if present, null otherwise) * * @return Response A Response instance diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml index 054a27b8cd..49e79416e1 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml @@ -15,6 +15,7 @@ + %kernel.charset% diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php index 5d86efb0d8..4c19f7a42d 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php @@ -108,10 +108,10 @@ class GlobalVariables /** * Returns the current app debug mode. * - * @return Boolean The current debug mode + * @return bool The current debug mode */ public function getDebug() { - return (Boolean) $this->container->getParameter('kernel.debug'); + return (bool) $this->container->getParameter('kernel.debug'); } } diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php index a8075f18e1..eb4a834fe9 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/CodeHelper.php @@ -151,7 +151,7 @@ class CodeHelper extends Helper * Formats a file path. * * @param string $file An absolute file path - * @param integer $line The line number + * @param int $line The line number * @param string $text Use this text for the link rather than the file path * * @return string @@ -180,7 +180,7 @@ class CodeHelper extends Helper * Returns the link for a given file/line pair. * * @param string $file An absolute file path - * @param integer $line The line number + * @param int $line The line number * * @return string A link of false */ diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/RouterHelper.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/RouterHelper.php index 845b75d59a..76f7003635 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/RouterHelper.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Helper/RouterHelper.php @@ -38,7 +38,7 @@ class RouterHelper extends Helper * * @param string $name The name of the route * @param mixed $parameters An array of parameters - * @param Boolean|string $referenceType The type of reference (one of the constants in UrlGeneratorInterface) + * @param bool|string $referenceType The type of reference (one of the constants in UrlGeneratorInterface) * * @return string The generated URL * diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Loader/TemplateLocator.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Loader/TemplateLocator.php index e9500de27e..286b7c62e4 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Loader/TemplateLocator.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Templating/Loader/TemplateLocator.php @@ -56,7 +56,7 @@ class TemplateLocator implements FileLocatorInterface * * @param TemplateReferenceInterface $template A template * @param string $currentPath Unused - * @param Boolean $first Unused + * @param bool $first Unused * * @return string The full path for the file * diff --git a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Translation/PhpExtractor.php b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Translation/PhpExtractor.php index 1e80c02810..1b12c8ca9e 100644 --- a/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Translation/PhpExtractor.php +++ b/vendor/symfony/framework-bundle/Symfony/Bundle/FrameworkBundle/Translation/PhpExtractor.php @@ -52,7 +52,7 @@ class PhpExtractor implements ExtractorInterface ); /** - * {@inheritDoc} + * {@inheritdoc} */ public function extract($directory, MessageCatalogue $catalog) { @@ -65,7 +65,7 @@ class PhpExtractor implements ExtractorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setPrefix($prefix) { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php index 48c10c153f..2a89a86f24 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php @@ -77,7 +77,7 @@ class AcceptHeader * * @param string $value * - * @return Boolean + * @return bool */ public function has($value) { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeaderItem.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeaderItem.php index 0cec4eda13..21a5d155f5 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeaderItem.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeaderItem.php @@ -175,7 +175,7 @@ class AcceptHeaderItem * * @param string $name * - * @return Boolean + * @return bool */ public function hasAttribute($name) { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php index 4d27435807..cc5cf23fa4 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php @@ -35,12 +35,12 @@ class BinaryFileResponse extends Response * Constructor. * * @param \SplFileInfo|string $file The file to stream - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers - * @param boolean $public Files are public by default + * @param bool $public Files are public by default * @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename - * @param boolean $autoEtag Whether the ETag header should be automatically set - * @param boolean $autoLastModified Whether the Last-Modified header should be automatically set + * @param bool $autoEtag Whether the ETag header should be automatically set + * @param bool $autoLastModified Whether the Last-Modified header should be automatically set */ public function __construct($file, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true) { @@ -55,12 +55,12 @@ class BinaryFileResponse extends Response /** * @param \SplFileInfo|string $file The file to stream - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers - * @param boolean $public Files are public by default + * @param bool $public Files are public by default * @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename - * @param boolean $autoEtag Whether the ETag header should be automatically set - * @param boolean $autoLastModified Whether the Last-Modified header should be automatically set + * @param bool $autoEtag Whether the ETag header should be automatically set + * @param bool $autoLastModified Whether the Last-Modified header should be automatically set */ public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true) { @@ -72,8 +72,8 @@ class BinaryFileResponse extends Response * * @param \SplFileInfo|string $file The file to stream * @param string $contentDisposition - * @param Boolean $autoEtag - * @param Boolean $autoLastModified + * @param bool $autoEtag + * @param bool $autoLastModified * * @return BinaryFileResponse * diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php index 68fe853b2f..d112123bde 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php @@ -33,11 +33,11 @@ class Cookie * * @param string $name The name of the cookie * @param string $value The value of the cookie - * @param integer|string|\DateTime $expire The time the cookie expires + * @param int|string|\DateTime $expire The time the cookie expires * @param string $path The path on the server in which the cookie will be available on * @param string $domain The domain that the cookie is available to - * @param Boolean $secure Whether the cookie should only be transmitted over a secure HTTPS connection from the client - * @param Boolean $httpOnly Whether the cookie will be made accessible only through the HTTP protocol + * @param bool $secure Whether the cookie should only be transmitted over a secure HTTPS connection from the client + * @param bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol * * @throws \InvalidArgumentException * @@ -70,8 +70,8 @@ class Cookie $this->domain = $domain; $this->expire = $expire; $this->path = empty($path) ? '/' : $path; - $this->secure = (Boolean) $secure; - $this->httpOnly = (Boolean) $httpOnly; + $this->secure = (bool) $secure; + $this->httpOnly = (bool) $httpOnly; } /** @@ -151,7 +151,7 @@ class Cookie /** * Gets the time the cookie expires. * - * @return integer + * @return int * * @api */ @@ -175,7 +175,7 @@ class Cookie /** * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client. * - * @return Boolean + * @return bool * * @api */ @@ -187,7 +187,7 @@ class Cookie /** * Checks whether the cookie will be made accessible only through the HTTP protocol. * - * @return Boolean + * @return bool * * @api */ @@ -199,7 +199,7 @@ class Cookie /** * Whether this cookie is about to be cleared * - * @return Boolean + * @return bool * * @api */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php index 4fabfb9106..0fdf7b0428 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php @@ -29,7 +29,7 @@ class File extends \SplFileInfo * Constructs a new file from the given path. * * @param string $path The path to the file - * @param Boolean $checkPath Whether to check the path or not + * @param bool $checkPath Whether to check the path or not * * @throws FileNotFoundException If the given path is not a file * diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php index f23ddd2f48..f3c208d04b 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php @@ -41,7 +41,7 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface /** * Returns whether this guesser is supported on the current OS * - * @return Boolean + * @return bool */ public static function isSupported() { @@ -62,7 +62,7 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface } if (!self::isSupported()) { - return null; + return; } ob_start(); @@ -72,14 +72,14 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface if ($return > 0) { ob_end_clean(); - return null; + return; } $type = trim(ob_get_clean()); if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) { // it's not a type, but an error message - return null; + return; } return $match[1]; diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php index a6950df2cd..3b348bdd2d 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php @@ -38,7 +38,7 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface /** * Returns whether this guesser is supported on the current OS/PHP setup * - * @return Boolean + * @return bool */ public static function isSupported() { @@ -59,11 +59,11 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface } if (!self::isSupported()) { - return null; + return; } if (!$finfo = new \finfo(FILEINFO_MIME_TYPE, $this->magicFile)) { - return null; + return; } return $finfo->file($path); diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php index 42e7b77af0..422556195c 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php @@ -655,6 +655,7 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface 'chemical/x-csml' => 'csml', 'chemical/x-xyz' => 'xyz', 'image/bmp' => 'bmp', + 'image/x-ms-bmp' => 'bmp', 'image/cgm' => 'cgm', 'image/g3fax' => 'g3', 'image/gif' => 'gif', diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php index 6028259127..0bba18fb09 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php @@ -31,7 +31,7 @@ class UploadedFile extends File * * Local files are used in test mode hence the code should not enforce HTTP uploads. * - * @var Boolean + * @var bool */ private $test = false; @@ -59,7 +59,7 @@ class UploadedFile extends File /** * The UPLOAD_ERR_XXX constant provided by the uploader. * - * @var integer + * @var int */ private $error; @@ -80,9 +80,9 @@ class UploadedFile extends File * @param string $path The full temporary path to the file * @param string $originalName The original file name * @param string $mimeType The type of the file as provided by PHP - * @param integer $size The file size - * @param integer $error The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants) - * @param Boolean $test Whether the test mode is active + * @param int $size The file size + * @param int $error The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants) + * @param bool $test Whether the test mode is active * * @throws FileException If file_uploads is disabled * @throws FileNotFoundException If the file does not exist @@ -95,7 +95,7 @@ class UploadedFile extends File $this->mimeType = $mimeType ?: 'application/octet-stream'; $this->size = $size; $this->error = $error ?: UPLOAD_ERR_OK; - $this->test = (Boolean) $test; + $this->test = (bool) $test; parent::__construct($path, UPLOAD_ERR_OK === $this->error); } @@ -179,7 +179,7 @@ class UploadedFile extends File * It is extracted from the request from which the file has been uploaded. * Then it should not be considered as a safe value. * - * @return integer|null The file size + * @return int|null The file size * * @api */ @@ -194,7 +194,7 @@ class UploadedFile extends File * If the upload was successful, the constant UPLOAD_ERR_OK is returned. * Otherwise one of the other UPLOAD_ERR_XXX constants is returned. * - * @return integer The upload error + * @return int The upload error * * @api */ @@ -206,7 +206,7 @@ class UploadedFile extends File /** * Returns whether the file was uploaded successfully. * - * @return Boolean True if the file has been uploaded with HTTP and no error occurred. + * @return bool True if the file has been uploaded with HTTP and no error occurred. * * @api */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php index 2b9ef0e443..0624f88c56 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php @@ -117,7 +117,7 @@ class HeaderBag implements \IteratorAggregate, \Countable * * @param string $key The header name * @param mixed $default The default value - * @param Boolean $first Whether to return the first value or all header values + * @param bool $first Whether to return the first value or all header values * * @return string|array The first header value if $first is true, an array of values otherwise * @@ -147,7 +147,7 @@ class HeaderBag implements \IteratorAggregate, \Countable * * @param string $key The key * @param string|array $values The value or an array of values - * @param Boolean $replace Whether to replace the actual value or not (true by default) + * @param bool $replace Whether to replace the actual value or not (true by default) * * @api */ @@ -173,7 +173,7 @@ class HeaderBag implements \IteratorAggregate, \Countable * * @param string $key The HTTP header * - * @return Boolean true if the parameter exists, false otherwise + * @return bool true if the parameter exists, false otherwise * * @api */ @@ -188,7 +188,7 @@ class HeaderBag implements \IteratorAggregate, \Countable * @param string $key The HTTP header name * @param string $value The HTTP value * - * @return Boolean true if the value is contained in the header, false otherwise + * @return bool true if the value is contained in the header, false otherwise * * @api */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php index 98b848108c..815c266400 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php @@ -29,7 +29,7 @@ class IpUtils * @param string $requestIp IP to check * @param string|array $ips List of IPs or subnets (can be a string if only a single one) * - * @return boolean Whether the IP is valid + * @return bool Whether the IP is valid */ public static function checkIp($requestIp, $ips) { @@ -55,7 +55,7 @@ class IpUtils * @param string $requestIp IPv4 address to check * @param string $ip IPv4 address or subnet in CIDR notation * - * @return boolean Whether the IP is valid + * @return bool Whether the IP is valid */ public static function checkIp4($requestIp, $ip) { @@ -83,7 +83,7 @@ class IpUtils * @param string $requestIp IPv6 address to check * @param string $ip IPv6 address or subnet in CIDR notation * - * @return boolean Whether the IP is valid + * @return bool Whether the IP is valid * * @throws \RuntimeException When IPV6 support is not enabled */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php index 6dfa75cd2d..22e6d2a509 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php @@ -31,7 +31,7 @@ class JsonResponse extends Response * Constructor. * * @param mixed $data The response data - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers */ public function __construct($data = null, $status = 200, $headers = array()) @@ -45,7 +45,7 @@ class JsonResponse extends Response } /** - * {@inheritDoc} + * {@inheritdoc} */ public static function create($data = null, $status = 200, $headers = array()) { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php index a4ac98cffe..8791275baf 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php @@ -92,7 +92,7 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $path The key * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items + * @param bool $deep If true, a path like foo[bar] will find deeper items * * @return mixed * @@ -167,7 +167,7 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $key The key * - * @return Boolean true if the parameter exists, false otherwise + * @return bool true if the parameter exists, false otherwise * * @api */ @@ -193,7 +193,7 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $key The parameter key * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items + * @param bool $deep If true, a path like foo[bar] will find deeper items * * @return string The filtered value * @@ -209,7 +209,7 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $key The parameter key * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items + * @param bool $deep If true, a path like foo[bar] will find deeper items * * @return string The filtered value * @@ -225,7 +225,7 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $key The parameter key * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items + * @param bool $deep If true, a path like foo[bar] will find deeper items * * @return string The filtered value * @@ -242,9 +242,9 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $key The parameter key * @param mixed $default The default value if the parameter key does not exist - * @param boolean $deep If true, a path like foo[bar] will find deeper items + * @param bool $deep If true, a path like foo[bar] will find deeper items * - * @return integer The filtered value + * @return int The filtered value * * @api */ @@ -258,8 +258,8 @@ class ParameterBag implements \IteratorAggregate, \Countable * * @param string $key Key. * @param mixed $default Default = null. - * @param boolean $deep Default = false. - * @param integer $filter FILTER_* constant. + * @param bool $deep Default = false. + * @param int $filter FILTER_* constant. * @param mixed $options Filter options. * * @see http://php.net/manual/en/function.filter-var.php diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php index fbf377bae0..641bd93f63 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php @@ -26,7 +26,7 @@ class RedirectResponse extends Response * Creates a redirect response so that it conforms to the rules defined for a redirect status code. * * @param string $url The URL to redirect to - * @param integer $status The status code (302 by default) + * @param int $status The status code (302 by default) * @param array $headers The headers (Location is always set to the given URL) * * @throws \InvalidArgumentException @@ -51,7 +51,7 @@ class RedirectResponse extends Response } /** - * {@inheritDoc} + * {@inheritdoc} */ public static function create($url = '', $status = 302, $headers = array()) { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php index 88a61b642d..a6b01c214d 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php @@ -679,7 +679,7 @@ class Request /** * Checks whether support for the _method request parameter is enabled. * - * @return Boolean True when the _method request parameter is enabled, false otherwise + * @return bool True when the _method request parameter is enabled, false otherwise */ public static function getHttpMethodParameterOverride() { @@ -703,7 +703,7 @@ class Request * * @param string $key the key * @param mixed $default the default value - * @param Boolean $deep is parameter deep in multidimensional array + * @param bool $deep is parameter deep in multidimensional array * * @return mixed */ @@ -728,7 +728,7 @@ class Request * Whether the request contains a Session which was started in one of the * previous requests. * - * @return Boolean + * @return bool * * @api */ @@ -745,7 +745,7 @@ class Request * like whether the session is started or not. It is just a way to check if this Request * is associated with a Session instance. * - * @return Boolean true when the Request contains a Session object, false otherwise + * @return bool true when the Request contains a Session object, false otherwise * * @api */ @@ -1113,7 +1113,7 @@ class Request * ("SSL_HTTPS" for instance), configure it via "setTrustedHeaderName()" with * the "client-proto" key. * - * @return Boolean + * @return bool * * @api */ @@ -1287,8 +1287,6 @@ class Request return $format; } } - - return null; } /** @@ -1399,7 +1397,7 @@ class Request * * @param string $method Uppercase request method (GET, POST etc). * - * @return Boolean + * @return bool */ public function isMethod($method) { @@ -1409,7 +1407,7 @@ class Request /** * Checks whether the method is safe or not. * - * @return Boolean + * @return bool * * @api */ @@ -1421,7 +1419,7 @@ class Request /** * Returns the request body content. * - * @param Boolean $asResource If true, a resource will be returned + * @param bool $asResource If true, a resource will be returned * * @return string|resource The request body content or a resource to read the body stream. * @@ -1457,7 +1455,7 @@ class Request } /** - * @return Boolean + * @return bool */ public function isNoCache() { @@ -1596,7 +1594,7 @@ class Request * It is known to work with common JavaScript frameworks: * @link http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript * - * @return Boolean true if the request is an XMLHttpRequest, false otherwise + * @return bool true if the request is an XMLHttpRequest, false otherwise * * @api */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php index 695fd21788..20e14e3ab2 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php @@ -25,7 +25,7 @@ interface RequestMatcherInterface * * @param Request $request The request to check for a match * - * @return Boolean true if the request matches, false otherwise + * @return bool true if the request matches, false otherwise * * @api */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php index 4b0ef28dee..3d9cfd0c64 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php @@ -47,7 +47,7 @@ class RequestStack public function pop() { if (!$this->requests) { - return null; + return; } return array_pop($this->requests); @@ -73,7 +73,7 @@ class RequestStack public function getMasterRequest() { if (!$this->requests) { - return null; + return; } return $this->requests[0]; @@ -95,7 +95,7 @@ class RequestStack $pos = count($this->requests) - 2; if (!isset($this->requests[$pos])) { - return null; + return; } return $this->requests[$pos]; diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php index b6bbfc2d93..24280e38fc 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php @@ -10,9 +10,7 @@ */ /** - * SessionHandlerInterface - * - * Provides forward compatibility with PHP 5.4 + * SessionHandlerInterface for PHP < 5.4 * * Extensive documentation can be found at php.net, see links: * @@ -25,76 +23,68 @@ interface SessionHandlerInterface { /** - * Open session. + * Re-initializes existing session, or creates a new one. * * @see http://php.net/sessionhandlerinterface.open * - * @param string $savePath Save path. - * @param string $sessionName Session Name. - * - * @throws \RuntimeException If something goes wrong starting the session. + * @param string $savePath Save path + * @param string $sessionName Session name, see http://php.net/function.session-name.php * - * @return boolean + * @return bool true on success, false on failure */ public function open($savePath, $sessionName); /** - * Close session. + * Closes the current session. * * @see http://php.net/sessionhandlerinterface.close * - * @return boolean + * @return bool true on success, false on failure */ public function close(); /** - * Read session. - * - * @param string $sessionId + * Reads the session data. * * @see http://php.net/sessionhandlerinterface.read * - * @throws \RuntimeException On fatal error but not "record not found". + * @param string $sessionId Session ID, see http://php.net/function.session-id * - * @return string String as stored in persistent storage or empty string in all other cases. + * @return string Same session data as passed in write() or empty string when non-existent or on failure */ public function read($sessionId); /** - * Commit session to storage. + * Writes the session data to the storage. * * @see http://php.net/sessionhandlerinterface.write * - * @param string $sessionId Session ID. - * @param string $data Session serialized data to save. + * @param string $sessionId Session ID , see http://php.net/function.session-id + * @param string $data Serialized session data to save * - * @return boolean + * @return bool true on success, false on failure */ public function write($sessionId, $data); /** - * Destroys this session. + * Destroys a session. * * @see http://php.net/sessionhandlerinterface.destroy * - * @param string $sessionId Session ID. + * @param string $sessionId Session ID, see http://php.net/function.session-id * - * @throws \RuntimeException On fatal error. - * - * @return boolean + * @return bool true on success, false on failure */ public function destroy($sessionId); /** - * Garbage collection for storage. + * Cleans up expired sessions (garbage collection). * * @see http://php.net/sessionhandlerinterface.gc * - * @param integer $lifetime Max lifetime in seconds to keep sessions stored. - * - * @throws \RuntimeException On fatal error. + * @param string|int $maxlifetime Sessions that have not updated for the last maxlifetime seconds will be removed * - * @return boolean + * @return bool true on success, false on failure */ - public function gc($lifetime); + public function gc($maxlifetime); } diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php index 73b8e901ce..eeec855b82 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php @@ -97,7 +97,7 @@ class Response protected $version; /** - * @var integer + * @var int */ protected $statusCode; @@ -189,7 +189,7 @@ class Response * Constructor. * * @param mixed $content The response content, see setContent() - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers * * @throws \InvalidArgumentException When the HTTP status code is not valid @@ -216,7 +216,7 @@ class Response * ->setSharedMaxAge(300); * * @param mixed $content The response content, see setContent() - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers * * @return Response @@ -467,7 +467,7 @@ class Response /** * Sets the response status code. * - * @param integer $code HTTP status code + * @param int $code HTTP status code * @param mixed $text HTTP status text * * If the status text is null it will be automatically populated for the known @@ -506,7 +506,7 @@ class Response /** * Retrieves the status code for the current web response. * - * @return integer Status code + * @return int Status code * * @api */ @@ -552,7 +552,7 @@ class Response * Responses with neither a freshness lifetime (Expires, max-age) nor cache * validator (Last-Modified, ETag) are considered uncacheable. * - * @return Boolean true if the response is worth caching, false otherwise + * @return bool true if the response is worth caching, false otherwise * * @api */ @@ -576,7 +576,7 @@ class Response * origin. A response is considered fresh when it includes a Cache-Control/max-age * indicator or Expires header and the calculated age is less than the freshness lifetime. * - * @return Boolean true if the response is fresh, false otherwise + * @return bool true if the response is fresh, false otherwise * * @api */ @@ -589,7 +589,7 @@ class Response * Returns true if the response includes headers that can be used to validate * the response with the origin server using a conditional GET request. * - * @return Boolean true if the response is validateable, false otherwise + * @return bool true if the response is validateable, false otherwise * * @api */ @@ -640,7 +640,7 @@ class Response * When present, the TTL of the response should not be overridden to be * greater than the value provided by the origin. * - * @return Boolean true if the response must be revalidated by a cache, false otherwise + * @return bool true if the response must be revalidated by a cache, false otherwise * * @api */ @@ -683,7 +683,7 @@ class Response /** * Returns the age of the response. * - * @return integer The age of the response in seconds + * @return int The age of the response in seconds */ public function getAge() { @@ -758,7 +758,7 @@ class Response * First, it checks for a s-maxage directive, then a max-age directive, and then it falls * back on an expires header. It returns null when no maximum age can be established. * - * @return integer|null Number of seconds + * @return int|null Number of seconds * * @api */ @@ -775,8 +775,6 @@ class Response if (null !== $this->getExpires()) { return $this->getExpires()->format('U') - $this->getDate()->format('U'); } - - return null; } /** @@ -784,7 +782,7 @@ class Response * * This methods sets the Cache-Control max-age directive. * - * @param integer $value Number of seconds + * @param int $value Number of seconds * * @return Response * @@ -802,7 +800,7 @@ class Response * * This methods sets the Cache-Control s-maxage directive. * - * @param integer $value Number of seconds + * @param int $value Number of seconds * * @return Response * @@ -824,7 +822,7 @@ class Response * When the responses TTL is <= 0, the response may not be served from cache without first * revalidating with the origin. * - * @return integer|null The TTL in seconds + * @return int|null The TTL in seconds * * @api */ @@ -833,8 +831,6 @@ class Response if (null !== $maxAge = $this->getMaxAge()) { return $maxAge - $this->getAge(); } - - return null; } /** @@ -842,7 +838,7 @@ class Response * * This method adjusts the Cache-Control/s-maxage directive. * - * @param integer $seconds Number of seconds + * @param int $seconds Number of seconds * * @return Response * @@ -860,7 +856,7 @@ class Response * * This method adjusts the Cache-Control/max-age directive. * - * @param integer $seconds Number of seconds + * @param int $seconds Number of seconds * * @return Response * @@ -927,7 +923,7 @@ class Response * Sets the ETag value. * * @param string|null $etag The ETag unique identifier or null to remove the header - * @param Boolean $weak Whether you want a weak ETag or not + * @param bool $weak Whether you want a weak ETag or not * * @return Response * @@ -1030,7 +1026,7 @@ class Response /** * Returns true if the response includes a Vary header. * - * @return Boolean true if the response includes a Vary header, false otherwise + * @return bool true if the response includes a Vary header, false otherwise * * @api */ @@ -1064,7 +1060,7 @@ class Response * Sets the Vary header. * * @param string|array $headers - * @param Boolean $replace Whether to replace the actual value of not (true by default) + * @param bool $replace Whether to replace the actual value of not (true by default) * * @return Response * @@ -1086,7 +1082,7 @@ class Response * * @param Request $request A Request instance * - * @return Boolean true if the Response validators match the Request, false otherwise + * @return bool true if the Response validators match the Request, false otherwise * * @api */ @@ -1115,7 +1111,7 @@ class Response /** * Is response invalid? * - * @return Boolean + * @return bool * * @api */ @@ -1127,7 +1123,7 @@ class Response /** * Is response informative? * - * @return Boolean + * @return bool * * @api */ @@ -1139,7 +1135,7 @@ class Response /** * Is response successful? * - * @return Boolean + * @return bool * * @api */ @@ -1151,7 +1147,7 @@ class Response /** * Is the response a redirect? * - * @return Boolean + * @return bool * * @api */ @@ -1163,7 +1159,7 @@ class Response /** * Is there a client error? * - * @return Boolean + * @return bool * * @api */ @@ -1175,7 +1171,7 @@ class Response /** * Was there a server side error? * - * @return Boolean + * @return bool * * @api */ @@ -1187,7 +1183,7 @@ class Response /** * Is the response OK? * - * @return Boolean + * @return bool * * @api */ @@ -1199,7 +1195,7 @@ class Response /** * Is the response forbidden? * - * @return Boolean + * @return bool * * @api */ @@ -1211,7 +1207,7 @@ class Response /** * Is the response a not found error? * - * @return Boolean + * @return bool * * @api */ @@ -1225,7 +1221,7 @@ class Response * * @param string $location * - * @return Boolean + * @return bool * * @api */ @@ -1237,13 +1233,13 @@ class Response /** * Is the response empty? * - * @return Boolean + * @return bool * * @api */ public function isEmpty() { - return in_array($this->statusCode, array(201, 204, 304)); + return in_array($this->statusCode, array(204, 304)); } /** diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php index af416d6d3a..ffe1770da3 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php @@ -148,7 +148,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta /** * Returns the number of attributes. * - * @return integer The number of attributes + * @return int The number of attributes */ public function count() { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php index 6356056edd..4bf3c656ca 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php @@ -25,7 +25,7 @@ interface AttributeBagInterface extends SessionBagInterface * * @param string $name The attribute name * - * @return Boolean true if the attribute is defined, false otherwise + * @return bool true if the attribute is defined, false otherwise */ public function has($name); diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php index 7cafb2241c..10bceede43 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php @@ -100,7 +100,7 @@ class NamespacedAttributeBag extends AttributeBag * This method allows structured namespacing of session attributes. * * @param string $name Key name - * @param boolean $writeContext Write context, default false + * @param bool $writeContext Write context, default false * * @return array */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php index a68dcfddda..be79d9d752 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php @@ -80,7 +80,7 @@ interface FlashBagInterface extends SessionBagInterface * * @param string $type * - * @return boolean + * @return bool */ public function has($type); diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php index dc2f7bc4f3..f98c0a4a1c 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php @@ -23,7 +23,7 @@ interface SessionInterface /** * Starts the session storage. * - * @return Boolean True if session started. + * @return bool True if session started. * * @throws \RuntimeException If session fails to start. * @@ -73,12 +73,12 @@ interface SessionInterface * Clears all session attributes and flashes and regenerates the * session and deletes the old session from persistence. * - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. * - * @return Boolean True if session invalidated, false if error. + * @return bool True if session invalidated, false if error. * * @api */ @@ -88,13 +88,13 @@ interface SessionInterface * Migrates the current session to a new session id while maintaining all * session attributes. * - * @param Boolean $destroy Whether to delete the old session or leave it to garbage collection. - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value + * @param bool $destroy Whether to delete the old session or leave it to garbage collection. + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. * - * @return Boolean True if session migrated, false if error. + * @return bool True if session migrated, false if error. * * @api */ @@ -114,7 +114,7 @@ interface SessionInterface * * @param string $name The attribute name * - * @return Boolean true if the attribute is defined, false otherwise + * @return bool true if the attribute is defined, false otherwise * * @api */ @@ -179,7 +179,7 @@ interface SessionInterface /** * Checks if the session was started. * - * @return Boolean + * @return bool */ public function isStarted(); diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php index b2384505ae..caff49ac7b 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php @@ -24,7 +24,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface private $memcache; /** - * @var integer Time to live in seconds + * @var int Time to live in seconds */ private $ttl; @@ -59,7 +59,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function open($savePath, $sessionName) { @@ -67,7 +67,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function close() { @@ -75,7 +75,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function read($sessionId) { @@ -83,7 +83,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function write($sessionId, $data) { @@ -91,7 +91,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function destroy($sessionId) { @@ -99,9 +99,9 @@ class MemcacheSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function gc($lifetime) + public function gc($maxlifetime) { // not required here because memcache will auto expire the records anyhow. return true; diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php index ed7d6edf4b..d623ba98b1 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php @@ -29,7 +29,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface private $memcached; /** - * @var integer Time to live in seconds + * @var int Time to live in seconds */ private $ttl; @@ -65,7 +65,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function open($savePath, $sessionName) { @@ -73,7 +73,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function close() { @@ -81,7 +81,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function read($sessionId) { @@ -89,7 +89,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function write($sessionId, $data) { @@ -97,7 +97,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function destroy($sessionId) { @@ -105,9 +105,9 @@ class MemcachedSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function gc($lifetime) + public function gc($maxlifetime) { // not required here because memcached will auto expire the records anyhow. return true; diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php index 4d819fe3f8..3938a701b1 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php @@ -69,7 +69,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function open($savePath, $sessionName) { @@ -77,7 +77,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function close() { @@ -85,7 +85,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function destroy($sessionId) { @@ -97,9 +97,9 @@ class MongoDbSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function gc($lifetime) + public function gc($maxlifetime) { /* Note: MongoDB 2.2+ supports TTL collections, which may be used in * place of this method by indexing the "time_field" field with an @@ -109,7 +109,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface * * See: http://docs.mongodb.org/manual/tutorial/expire-data/ */ - $time = new \MongoDate(time() - $lifetime); + $time = new \MongoDate(time() - $maxlifetime); $this->getCollection()->remove(array( $this->options['time_field'] => array('$lt' => $time), @@ -119,7 +119,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc] + * {@inheritdoc} */ public function write($sessionId, $data) { @@ -136,7 +136,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function read($sessionId) { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php index 62068aff1b..d88ce895b7 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php @@ -65,7 +65,7 @@ class NullSessionHandler implements \SessionHandlerInterface /** * {@inheritdoc} */ - public function gc($lifetime) + public function gc($maxlifetime) { return true; } diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php index baf8eea8f6..b831383a24 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php @@ -16,18 +16,34 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; * * @author Fabien Potencier * @author Michael Williams + * @author Tobias Schultze */ class PdoSessionHandler implements \SessionHandlerInterface { /** - * @var \PDO PDO instance. + * @var \PDO PDO instance */ private $pdo; /** - * @var array Database options. + * @var string Table name */ - private $dbOptions; + private $table; + + /** + * @var string Column for session id + */ + private $idCol; + + /** + * @var string Column for session data + */ + private $dataCol; + + /** + * @var string Column for timestamp + */ + private $timeCol; /** * Constructor. @@ -52,23 +68,28 @@ class PdoSessionHandler implements \SessionHandlerInterface throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__)); } $this->pdo = $pdo; - $this->dbOptions = array_merge(array( + $dbOptions = array_merge(array( 'db_id_col' => 'sess_id', 'db_data_col' => 'sess_data', 'db_time_col' => 'sess_time', ), $dbOptions); + + $this->table = $dbOptions['db_table']; + $this->idCol = $dbOptions['db_id_col']; + $this->dataCol = $dbOptions['db_data_col']; + $this->timeCol = $dbOptions['db_time_col']; } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function open($path, $name) + public function open($savePath, $sessionName) { return true; } /** - * {@inheritDoc} + * {@inheritdoc} */ public function close() { @@ -76,79 +97,62 @@ class PdoSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function destroy($id) + public function destroy($sessionId) { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbIdCol = $this->dbOptions['db_id_col']; - // delete the record associated with this id - $sql = "DELETE FROM $dbTable WHERE $dbIdCol = :id"; + $sql = "DELETE FROM $this->table WHERE $this->idCol = :id"; try { $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $stmt->execute(); } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); + throw new \RuntimeException(sprintf('PDOException was thrown when trying to delete a session: %s', $e->getMessage()), 0, $e); } return true; } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function gc($lifetime) + public function gc($maxlifetime) { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbTimeCol = $this->dbOptions['db_time_col']; - // delete the session records that have expired - $sql = "DELETE FROM $dbTable WHERE $dbTimeCol < :time"; + $sql = "DELETE FROM $this->table WHERE $this->timeCol < :time"; try { $stmt = $this->pdo->prepare($sql); - $stmt->bindValue(':time', time() - $lifetime, \PDO::PARAM_INT); + $stmt->bindValue(':time', time() - $maxlifetime, \PDO::PARAM_INT); $stmt->execute(); } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); + throw new \RuntimeException(sprintf('PDOException was thrown when trying to delete expired sessions: %s', $e->getMessage()), 0, $e); } return true; } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function read($id) + public function read($sessionId) { - // get table/columns - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; + $sql = "SELECT $this->dataCol FROM $this->table WHERE $this->idCol = :id"; try { - $sql = "SELECT $dbDataCol FROM $dbTable WHERE $dbIdCol = :id"; - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $stmt->execute(); - // it is recommended to use fetchAll so that PDO can close the DB cursor - // we anyway expect either no rows, or one row with one column. fetchColumn, seems to be buggy #4777 + + // We use fetchAll instead of fetchColumn to make sure the DB cursor gets closed $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM); - if (count($sessionRows) == 1) { + if ($sessionRows) { return base64_decode($sessionRows[0][0]); } - // session does not exist, create it - $this->createNewSession($id); - return ''; } catch (\PDOException $e) { throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e); @@ -156,89 +160,85 @@ class PdoSessionHandler implements \SessionHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ - public function write($id, $data) + public function write($sessionId, $data) { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - //session data can contain non binary safe characters so we need to encode it + // Session data can contain non binary safe characters so we need to encode it. $encoded = base64_encode($data); + // We use a MERGE SQL query when supported by the database. + // Otherwise we have to use a transactional DELETE followed by INSERT to prevent duplicate entries under high concurrency. + try { - $driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); - - if ('mysql' === $driver) { - // MySQL would report $stmt->rowCount() = 0 on UPDATE when the data is left unchanged - // it could result in calling createNewSession() whereas the session already exists in - // the DB which would fail as the id is unique - $stmt = $this->pdo->prepare( - "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time) " . - "ON DUPLICATE KEY UPDATE $dbDataCol = VALUES($dbDataCol), $dbTimeCol = VALUES($dbTimeCol)" + $mergeSql = $this->getMergeSql(); + + if (null !== $mergeSql) { + $mergeStmt = $this->pdo->prepare($mergeSql); + $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $mergeStmt->bindParam(':data', $encoded, \PDO::PARAM_STR); + $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT); + $mergeStmt->execute(); + + return true; + } + + $this->pdo->beginTransaction(); + + try { + $deleteStmt = $this->pdo->prepare( + "DELETE FROM $this->table WHERE $this->idCol = :id" + ); + $deleteStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $deleteStmt->execute(); + + $insertStmt = $this->pdo->prepare( + "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time)" ); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - } elseif ('oci' === $driver) { - $stmt = $this->pdo->prepare("MERGE INTO $dbTable USING DUAL ON($dbIdCol = :id) ". - "WHEN NOT MATCHED THEN INSERT ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, sysdate) " . - "WHEN MATCHED THEN UPDATE SET $dbDataCol = :data WHERE $dbIdCol = :id"); - - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->execute(); - } else { - $stmt = $this->pdo->prepare("UPDATE $dbTable SET $dbDataCol = :data, $dbTimeCol = :time WHERE $dbIdCol = :id"); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - - if (!$stmt->rowCount()) { - // No session exists in the database to update. This happens when we have called - // session_regenerate_id() - $this->createNewSession($id, $data); - } + $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $insertStmt->bindParam(':data', $encoded, \PDO::PARAM_STR); + $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT); + $insertStmt->execute(); + + $this->pdo->commit(); + } catch (\PDOException $e) { + $this->pdo->rollback(); + + throw $e; } } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e); + throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e); } return true; } /** - * Creates a new session with the given $id and $data - * - * @param string $id - * @param string $data + * Returns a merge/upsert (i.e. insert or update) SQL query when supported by the database. * - * @return boolean True. + * @return string|null The SQL string or null when not supported */ - private function createNewSession($id, $data = '') + private function getMergeSql() { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - $sql = "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time)"; - - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - - return true; + $driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); + + switch ($driver) { + case 'mysql': + return "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) " . + "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->timeCol = VALUES($this->timeCol)"; + case 'oci': + // DUAL is Oracle specific dummy table + return "MERGE INTO $this->table USING DUAL ON ($this->idCol = :id) " . + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) " . + "WHEN MATCHED THEN UPDATE SET $this->dataCol = :data"; + case 'sqlsrv': + // MS SQL Server requires MERGE be terminated by semicolon + return "MERGE INTO $this->table USING (SELECT 'x' AS dummy) AS src ON ($this->idCol = :id) " . + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) " . + "WHEN MATCHED THEN UPDATE SET $this->dataCol = :data;"; + case 'sqlite': + return "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time)"; + } } /** diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php index 44212979c3..f996900d44 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php @@ -44,12 +44,12 @@ class MetadataBag implements SessionBagInterface /** * Unix timestamp. * - * @var integer + * @var int */ private $lastUsed; /** - * @var integer + * @var int */ private $updateThreshold; @@ -57,7 +57,7 @@ class MetadataBag implements SessionBagInterface * Constructor. * * @param string $storageKey The key used to store bag in the session. - * @param integer $updateThreshold The time to wait between two UPDATED updates + * @param int $updateThreshold The time to wait between two UPDATED updates */ public function __construct($storageKey = '_sf2_meta', $updateThreshold = 0) { @@ -87,7 +87,7 @@ class MetadataBag implements SessionBagInterface /** * Gets the lifetime that the session cookie was set with. * - * @return integer + * @return int */ public function getLifetime() { @@ -97,7 +97,7 @@ class MetadataBag implements SessionBagInterface /** * Stamps a new session's metadata. * - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. @@ -118,7 +118,7 @@ class MetadataBag implements SessionBagInterface /** * Gets the created timestamp metadata. * - * @return integer Unix timestamp + * @return int Unix timestamp */ public function getCreated() { @@ -128,7 +128,7 @@ class MetadataBag implements SessionBagInterface /** * Gets the last used metadata. * - * @return integer Unix timestamp + * @return int Unix timestamp */ public function getLastUsed() { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php index 8b1c2137f6..0b4ee3079e 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php @@ -38,12 +38,12 @@ class MockArraySessionStorage implements SessionStorageInterface protected $name; /** - * @var boolean + * @var bool */ protected $started = false; /** - * @var boolean + * @var bool */ protected $closed = false; diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php index 083df9de40..31bf55c72d 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php @@ -32,12 +32,12 @@ class NativeSessionStorage implements SessionStorageInterface protected $bags; /** - * @var Boolean + * @var bool */ protected $started = false; /** - * @var Boolean + * @var bool */ protected $closed = false; diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php index ee6eb89728..0b7e5648c0 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php @@ -21,12 +21,12 @@ abstract class AbstractProxy /** * Flag if handler wraps an internal PHP session handler (using \SessionHandler). * - * @var boolean + * @var bool */ protected $wrapper = false; /** - * @var boolean + * @var bool */ protected $active = false; @@ -48,7 +48,7 @@ abstract class AbstractProxy /** * Is this proxy handler and instance of \SessionHandlerInterface. * - * @return boolean + * @return bool */ public function isSessionHandlerInterface() { @@ -58,7 +58,7 @@ abstract class AbstractProxy /** * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. * - * @return Boolean + * @return bool */ public function isWrapper() { @@ -68,7 +68,7 @@ abstract class AbstractProxy /** * Has a session started? * - * @return Boolean + * @return bool */ public function isActive() { @@ -87,7 +87,7 @@ abstract class AbstractProxy * * @internal * - * @param Boolean $flag + * @param bool $flag * * @throws \LogicException */ diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php index 23eebb3281..d2362b22a8 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php @@ -32,7 +32,7 @@ class NativeProxy extends AbstractProxy /** * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. * - * @return Boolean False. + * @return bool False. */ public function isWrapper() { diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php index e1f4fff1fa..81643c74b4 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php @@ -64,25 +64,25 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf /** * {@inheritdoc} */ - public function read($id) + public function read($sessionId) { - return (string) $this->handler->read($id); + return (string) $this->handler->read($sessionId); } /** * {@inheritdoc} */ - public function write($id, $data) + public function write($sessionId, $data) { - return (bool) $this->handler->write($id, $data); + return (bool) $this->handler->write($sessionId, $data); } /** * {@inheritdoc} */ - public function destroy($id) + public function destroy($sessionId) { - return (bool) $this->handler->destroy($id); + return (bool) $this->handler->destroy($sessionId); } /** diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php index 74f19c5216..0fb2e2abc8 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php @@ -28,7 +28,7 @@ interface SessionStorageInterface * * @throws \RuntimeException If something goes wrong starting the session. * - * @return boolean True if started. + * @return bool True if started. * * @api */ @@ -37,7 +37,7 @@ interface SessionStorageInterface /** * Checks if the session is started. * - * @return boolean True if started, false otherwise. + * @return bool True if started, false otherwise. */ public function isStarted(); @@ -88,13 +88,13 @@ interface SessionStorageInterface * Note regenerate+destroy should not clear the session data in memory * only delete the session data from persistent storage. * - * @param Boolean $destroy Destroy session when regenerating? - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value + * @param bool $destroy Destroy session when regenerating? + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. * - * @return Boolean True if session regenerated, false if error + * @return bool True if session regenerated, false if error * * @throws \RuntimeException If an error occurs while regenerating this storage * diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php index d9fece658f..4be9f48c9c 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php @@ -35,7 +35,7 @@ class StreamedResponse extends Response * Constructor. * * @param callable|null $callback A valid PHP callback or null to set it later - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers * * @api @@ -54,7 +54,7 @@ class StreamedResponse extends Response * Factory method for chainability * * @param callable|null $callback A valid PHP callback or null to set it later - * @param integer $status The response status code + * @param int $status The response status code * @param array $headers An array of response headers * * @return StreamedResponse diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php index c7284ea429..a84809ad7a 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php @@ -668,7 +668,7 @@ class ResponseTest extends ResponseTestCase public function testIsEmpty() { - foreach (array(201, 204, 304) as $code) { + foreach (array(204, 304) as $code) { $response = new Response('', $code); $this->assertTrue($response->isEmpty()); } diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php index a13fad2063..e465f39898 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php @@ -32,7 +32,7 @@ class PdoSessionHandlerTest extends \PHPUnit_Framework_TestCase public function testIncompleteOptions() { $this->setExpectedException('InvalidArgumentException'); - $storage = new PdoSessionHandler($this->pdo, array(), array()); + $storage = new PdoSessionHandler($this->pdo, array()); } public function testWrongPdoErrMode() @@ -42,42 +42,42 @@ class PdoSessionHandlerTest extends \PHPUnit_Framework_TestCase $pdo->exec("CREATE TABLE sessions (sess_id VARCHAR(255) PRIMARY KEY, sess_data TEXT, sess_time INTEGER)"); $this->setExpectedException('InvalidArgumentException'); - $storage = new PdoSessionHandler($pdo, array('db_table' => 'sessions'), array()); + $storage = new PdoSessionHandler($pdo, array('db_table' => 'sessions')); } public function testWrongTableOptionsWrite() { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'bad_name'), array()); + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'bad_name')); $this->setExpectedException('RuntimeException'); $storage->write('foo', 'bar'); } public function testWrongTableOptionsRead() { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'bad_name'), array()); + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'bad_name')); $this->setExpectedException('RuntimeException'); $storage->read('foo', 'bar'); } public function testWriteRead() { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions')); $storage->write('foo', 'bar'); $this->assertEquals('bar', $storage->read('foo'), 'written value can be read back correctly'); } public function testMultipleInstances() { - $storage1 = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); + $storage1 = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions')); $storage1->write('foo', 'bar'); - $storage2 = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); + $storage2 = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions')); $this->assertEquals('bar', $storage2->read('foo'), 'values persist between instances'); } public function testSessionDestroy() { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions')); $storage->write('foo', 'bar'); $this->assertCount(1, $this->pdo->query('SELECT * FROM sessions')->fetchAll()); @@ -88,7 +88,7 @@ class PdoSessionHandlerTest extends \PHPUnit_Framework_TestCase public function testSessionGC() { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); + $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions')); $storage->write('foo', 'bar'); $storage->write('baz', 'bar'); diff --git a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php index b91ddee4c4..4870115caa 100644 --- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php +++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php @@ -11,10 +11,11 @@ namespace Symfony\Component\HttpFoundation\Tests\Session\Storage; +use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; +use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler; +use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler; use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; @@ -175,9 +176,9 @@ class NativeSessionStorageTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); $storage->setSaveHandler(new NativeSessionHandler()); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandlerProxy(new SessionHandler())); + $storage->setSaveHandler(new SessionHandlerProxy(new NullSessionHandler())); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandler()); + $storage->setSaveHandler(new NullSessionHandler()); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); $storage->setSaveHandler(new NativeProxy()); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); @@ -199,9 +200,9 @@ class NativeSessionStorageTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); $storage->setSaveHandler(new NativeSessionHandler()); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandlerProxy(new SessionHandler())); + $storage->setSaveHandler(new SessionHandlerProxy(new NullSessionHandler())); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandler()); + $storage->setSaveHandler(new NullSessionHandler()); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); } @@ -254,30 +255,3 @@ class NativeSessionStorageTest extends \PHPUnit_Framework_TestCase $storage->start(); } } - -class SessionHandler implements \SessionHandlerInterface -{ - public function open($savePath, $sessionName) - { - } - - public function close() - { - } - - public function read($id) - { - } - - public function write($id, $data) - { - } - - public function destroy($id) - { - } - - public function gc($maxlifetime) - { - } -} diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php index 2fdbe1ccd0..f80fd4a91c 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php @@ -140,7 +140,6 @@ abstract class Bundle extends ContainerAware implements BundleInterface */ public function getParent() { - return null; } /** diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php index 7b492d0bbd..199a4be974 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php @@ -34,7 +34,7 @@ class ChainCacheClearer implements CacheClearerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function clear($cacheDir) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php index bd96057ded..5ebd9d513e 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php @@ -52,7 +52,7 @@ class CacheWarmerAggregate implements CacheWarmerInterface /** * Checks whether this warmer is optional or not. * - * @return Boolean always true + * @return bool always true */ public function isOptional() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php index ed76ce3586..902d8d651b 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php @@ -26,7 +26,7 @@ interface CacheWarmerInterface extends WarmableInterface * A warmer should return true if the cache can be * generated incrementally and on-demand. * - * @return Boolean true if the warmer is optional, false otherwise + * @return bool true if the warmer is optional, false otherwise */ public function isOptional(); } diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php index 51b6d7ae01..de9c6f0153 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php @@ -143,7 +143,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if the debug is enabled. * - * @return Boolean true if debug is enabled, false otherwise + * @return bool true if debug is enabled, false otherwise */ public function isDebug() { @@ -153,7 +153,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if the XDebug is enabled. * - * @return Boolean true if XDebug is enabled, false otherwise + * @return bool true if XDebug is enabled, false otherwise */ public function hasXDebug() { @@ -163,7 +163,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if EAccelerator is enabled. * - * @return Boolean true if EAccelerator is enabled, false otherwise + * @return bool true if EAccelerator is enabled, false otherwise */ public function hasEAccelerator() { @@ -173,7 +173,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if APC is enabled. * - * @return Boolean true if APC is enabled, false otherwise + * @return bool true if APC is enabled, false otherwise */ public function hasApc() { @@ -183,7 +183,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if Zend OPcache is enabled * - * @return Boolean true if Zend OPcache is enabled, false otherwise + * @return bool true if Zend OPcache is enabled, false otherwise */ public function hasZendOpcache() { @@ -193,7 +193,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if XCache is enabled. * - * @return Boolean true if XCache is enabled, false otherwise + * @return bool true if XCache is enabled, false otherwise */ public function hasXCache() { @@ -203,7 +203,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if WinCache is enabled. * - * @return Boolean true if WinCache is enabled, false otherwise + * @return bool true if WinCache is enabled, false otherwise */ public function hasWinCache() { @@ -213,7 +213,7 @@ class ConfigDataCollector extends DataCollector /** * Returns true if any accelerator is enabled. * - * @return Boolean true if any accelerator is enabled, false otherwise + * @return bool true if any accelerator is enabled, false otherwise */ public function hasAccelerator() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php index 10a010bc62..476bfff6fb 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php @@ -37,7 +37,7 @@ class ExceptionDataCollector extends DataCollector /** * Checks if the exception is not null. * - * @return Boolean true if the exception is not null, false otherwise + * @return bool true if the exception is not null, false otherwise */ public function hasException() { @@ -67,7 +67,7 @@ class ExceptionDataCollector extends DataCollector /** * Gets the exception code. * - * @return integer The exception code + * @return int The exception code */ public function getCode() { @@ -77,7 +77,7 @@ class ExceptionDataCollector extends DataCollector /** * Gets the status code. * - * @return integer The status code + * @return int The status code */ public function getStatusCode() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php index e36f1f457e..70f0c24b2a 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php @@ -48,7 +48,7 @@ class MemoryDataCollector extends DataCollector implements LateDataCollectorInte /** * Gets the memory. * - * @return integer The memory + * @return int The memory */ public function getMemory() { @@ -58,7 +58,7 @@ class MemoryDataCollector extends DataCollector implements LateDataCollectorInte /** * Gets the PHP memory limit. * - * @return integer The memory limit + * @return int The memory limit */ public function getMemoryLimit() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php index be08e305a2..9371748e3c 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php @@ -298,10 +298,11 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter } elseif ($expires instanceof \DateTime) { $expires = $expires->getTimestamp(); } else { - $expires = strtotime($expires); - if (false === $expires || -1 == $expires) { - throw new \InvalidArgumentException(sprintf('The "expires" cookie parameter is not valid.', $expires)); + $tmp = strtotime($expires); + if (false === $tmp || -1 == $tmp) { + throw new \InvalidArgumentException(sprintf('The "expires" cookie parameter is not valid (%s).', $expires)); } + $expires = $tmp; } $cookie .= '; expires='.str_replace('+0000', '', \DateTime::createFromFormat('U', $expires, new \DateTimeZone('GMT'))->format('D, d-M-Y H:i:s T')); diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php index 8757412c63..a0fbac9472 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php @@ -69,7 +69,7 @@ class RouterDataCollector extends DataCollector } /** - * @return Boolean Whether this request will result in a redirect + * @return bool Whether this request will result in a redirect */ public function getRedirect() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php index 4b5b00f0bf..b076daf581 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php @@ -119,7 +119,7 @@ class TimeDataCollector extends DataCollector implements LateDataCollectorInterf /** * Gets the request time. * - * @return integer The time + * @return int The time */ public function getStartTime() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php index f3aeb80cb2..ceafa6817f 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php @@ -39,7 +39,7 @@ class ValueExporter } if (is_resource($value)) { - return sprintf('Resource(%s)', get_resource_type($value)); + return sprintf('Resource(%s#%d)', get_resource_type($value), $value); } if (null === $value) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php index dee0a42f49..4e5a0c18d5 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php @@ -67,7 +67,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve } /** - * {@inheritDoc} + * {@inheritdoc} */ public function addListener($eventName, $listener, $priority = 0) { @@ -149,7 +149,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getCalledListeners() { @@ -157,7 +157,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getNotCalledListeners() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php index b1f3415810..09af6bd25d 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php @@ -30,7 +30,7 @@ class AddClassesToCachePass implements CompilerPassInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php index 1a24da0270..3ec454bbcd 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php @@ -28,7 +28,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; abstract class ConfigurableExtension extends Extension { /** - * {@inheritDoc} + * {@inheritdoc} */ final public function load(array $configs, ContainerBuilder $container) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php index f71ccae232..5565f82835 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php @@ -61,7 +61,7 @@ class GetResponseEvent extends KernelEvent /** * Returns whether a response was set * - * @return Boolean Whether a response was set + * @return bool Whether a response was set * * @api */ diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php index 98763253da..93e0237c83 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php @@ -39,7 +39,7 @@ class KernelEvent extends Event /** * The request type the kernel is currently processing. One of * HttpKernelInterface::MASTER_REQUEST and HttpKernelInterface::SUB_REQUEST - * @var integer + * @var int */ private $requestType; @@ -77,7 +77,7 @@ class KernelEvent extends Event /** * Returns the request type the kernel is currently processing * - * @return integer One of HttpKernelInterface::MASTER_REQUEST and + * @return int One of HttpKernelInterface::MASTER_REQUEST and * HttpKernelInterface::SUB_REQUEST * * @api @@ -90,7 +90,7 @@ class KernelEvent extends Event /** * Checks if this is a master request. * - * @return Boolean True if the request is a master request + * @return bool True if the request is a master request * * @api */ diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php index 33ce993b07..3450b6210c 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php @@ -83,7 +83,7 @@ class ExceptionListener implements EventSubscriberInterface * * @param \Exception $exception The original \Exception instance * @param string $message The error message to log - * @param Boolean $original False when the handling of the exception thrown another exception + * @param bool $original False when the handling of the exception thrown another exception */ protected function logException(\Exception $exception, $message, $original = true) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php index d64dcaab07..43d8d03a7f 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php @@ -41,17 +41,18 @@ class ProfilerListener implements EventSubscriberInterface /** * Constructor. * - * @param Profiler $profiler A Profiler instance - * @param RequestMatcherInterface $matcher A RequestMatcher instance - * @param Boolean $onlyException true if the profiler only collects data when an exception occurs, false otherwise - * @param Boolean $onlyMasterRequests true if the profiler only collects data when the request is a master request, false otherwise + * @param Profiler $profiler A Profiler instance + * @param RequestMatcherInterface|null $matcher A RequestMatcher instance + * @param bool $onlyException true if the profiler only collects data when an exception occurs, false otherwise + * @param bool $onlyMasterRequests true if the profiler only collects data when the request is a master request, false otherwise + * @param RequestStack|null $requestStack A RequestStack instance */ public function __construct(Profiler $profiler, RequestMatcherInterface $matcher = null, $onlyException = false, $onlyMasterRequests = false, RequestStack $requestStack = null) { $this->profiler = $profiler; $this->matcher = $matcher; - $this->onlyException = (Boolean) $onlyException; - $this->onlyMasterRequests = (Boolean) $onlyMasterRequests; + $this->onlyException = (bool) $onlyException; + $this->onlyMasterRequests = (bool) $onlyMasterRequests; $this->profiles = new \SplObjectStorage(); $this->parents = new \SplObjectStorage(); $this->requestStack = $requestStack; diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php index 27ac632b6f..06279c7a45 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php @@ -50,9 +50,10 @@ class RouterListener implements EventSubscriberInterface * * RequestStack will become required in 3.0. * - * @param UrlMatcherInterface|RequestMatcherInterface $matcher The Url or Request matcher - * @param RequestContext|null $context The RequestContext (can be null when $matcher implements RequestContextAwareInterface) - * @param LoggerInterface|null $logger The logger + * @param UrlMatcherInterface|RequestMatcherInterface $matcher The Url or Request matcher + * @param RequestContext|null $context The RequestContext (can be null when $matcher implements RequestContextAwareInterface) + * @param LoggerInterface|null $logger The logger + * @param RequestStack|null $requestStack A RequestStack instance * * @throws \InvalidArgumentException */ diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php index 714102bed8..79d8639a5f 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php @@ -24,7 +24,7 @@ class AccessDeniedHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php index 33463452b0..3f30a437b7 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php @@ -23,7 +23,7 @@ class BadRequestHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php index e416b345a4..35f077670e 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php @@ -23,7 +23,7 @@ class ConflictHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php index 9fea1643bd..219da32635 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php @@ -23,7 +23,7 @@ class GoneHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php index dd4a9dc5a3..67f0baeab4 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php @@ -21,7 +21,7 @@ interface HttpExceptionInterface /** * Returns the status code. * - * @return integer An HTTP response status code + * @return int An HTTP response status code */ public function getStatusCode(); diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php index 7aca014d71..878388a9cc 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php @@ -23,7 +23,7 @@ class LengthRequiredHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php index 3a81586a62..78dd26bf0f 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php @@ -24,7 +24,7 @@ class MethodNotAllowedHttpException extends HttpException * @param array $allow An array of allowed methods * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct(array $allow, $message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php index 6ac448aa73..0985d4ab64 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php @@ -23,7 +23,7 @@ class NotAcceptableHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php index 547976c3f1..4639e379b9 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php @@ -23,7 +23,7 @@ class NotFoundHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php index 4126c881a3..0dc2174bf4 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php @@ -23,7 +23,7 @@ class PreconditionFailedHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php index 75ba17702a..fb1494dda7 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php @@ -24,7 +24,7 @@ class PreconditionRequiredHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php index 09bbb6ed31..dcf4d745f8 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php @@ -24,7 +24,7 @@ class ServiceUnavailableHttpException extends HttpException * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php index b1232ef6cb..22f6dd587a 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php @@ -22,10 +22,10 @@ class TooManyRequestsHttpException extends HttpException /** * Constructor. * - * @param integer|string $retryAfter The number of seconds or HTTP-date after which the request may be retried + * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php index 2527d62f89..0dfe42db97 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php @@ -24,7 +24,7 @@ class UnauthorizedHttpException extends HttpException * @param string $challenge WWW-Authenticate challenge string * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($challenge, $message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php index 88bceecfee..b2634702b9 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php @@ -23,7 +23,7 @@ class UnsupportedMediaTypeHttpException extends HttpException * * @param string $message The internal exception message * @param \Exception $previous The previous exception - * @param integer $code The internal exception code + * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php index a491a85ade..620c71a878 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php @@ -32,8 +32,8 @@ class EsiFragmentRenderer extends RoutableFragmentRenderer * The "fallback" strategy when ESI is not available should always be an * instance of InlineFragmentRenderer. * - * @param Esi $esi An Esi instance - * @param InlineFragmentRenderer $inlineStrategy The inline strategy to use when ESI is not supported + * @param Esi $esi An Esi instance + * @param FragmentRendererInterface $inlineStrategy The inline strategy to use when ESI is not supported */ public function __construct(Esi $esi = null, InlineFragmentRenderer $inlineStrategy) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php index 0297304844..5ed7ec5dba 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php @@ -45,7 +45,7 @@ class FragmentHandler * RequestStack will become required in 3.0. * * @param FragmentRendererInterface[] $renderers An array of FragmentRendererInterface instances - * @param Boolean $debug Whether the debug mode is enabled or not + * @param bool $debug Whether the debug mode is enabled or not * @param RequestStack|null $requestStack The Request stack that controls the lifecycle of requests */ public function __construct(array $renderers = array(), $debug = false, RequestStack $requestStack = null) diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php index 8fc45724e7..e9bece0225 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php @@ -68,7 +68,7 @@ class HIncludeFragmentRenderer extends RoutableFragmentRenderer /** * Checks if a templating engine has been set. * - * @return Boolean true if the templating engine has been set, false otherwise + * @return bool true if the templating engine has been set, false otherwise */ public function hasTemplating() { @@ -126,7 +126,7 @@ class HIncludeFragmentRenderer extends RoutableFragmentRenderer /** * @param string $template * - * @return boolean + * @return bool */ private function templateExists($template) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php index 047c66087e..cfbf535697 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php @@ -41,8 +41,8 @@ abstract class RoutableFragmentRenderer implements FragmentRendererInterface * * @param ControllerReference $reference A ControllerReference instance * @param Request $request A Request instance - * @param Boolean $absolute Whether to generate an absolute URL or not - * @param Boolean $strict Whether to allow non-scalar attributes or not + * @param bool $absolute Whether to generate an absolute URL or not + * @param bool $strict Whether to allow non-scalar attributes or not * * @return string A fragment URI */ diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php index 455b3dcce9..3ba9ecd818 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php @@ -56,7 +56,7 @@ class Esi * * @param Request $request A Request instance * - * @return Boolean true if one surrogate has ESI/1.0 capability, false otherwise + * @return bool true if one surrogate has ESI/1.0 capability, false otherwise */ public function hasSurrogateEsiCapability(Request $request) { @@ -99,7 +99,7 @@ class Esi * * @param Response $response A Response instance * - * @return Boolean true if the Response needs to be parsed, false otherwise + * @return bool true if the Response needs to be parsed, false otherwise */ public function needsEsiParsing(Response $response) { @@ -107,7 +107,7 @@ class Esi return false; } - return (Boolean) preg_match('#content="[^"]*ESI/1.0[^"]*"#', $control); + return (bool) preg_match('#content="[^"]*ESI/1.0[^"]*"#', $control); } /** @@ -115,7 +115,7 @@ class Esi * * @param string $uri A URI * @param string $alt An alternate URI - * @param Boolean $ignoreErrors Whether to ignore errors or not + * @param bool $ignoreErrors Whether to ignore errors or not * @param string $comment A comment to add as an esi:include tag * * @return string @@ -185,7 +185,7 @@ class Esi * @param HttpCache $cache An HttpCache instance * @param string $uri The main URI * @param string $alt An alternative URI - * @param Boolean $ignoreErrors Whether to ignore errors or not + * @param bool $ignoreErrors Whether to ignore errors or not * * @return string * diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php index 3ab1b0d92a..4a454d81d1 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php @@ -232,7 +232,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * Forwards the Request to the backend without storing the Response in the cache. * * @param Request $request A Request instance - * @param Boolean $catch Whether to process exceptions + * @param bool $catch Whether to process exceptions * * @return Response A Response instance */ @@ -247,7 +247,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * Invalidates non-safe methods (like POST, PUT, and DELETE). * * @param Request $request A Request instance - * @param Boolean $catch Whether to process exceptions + * @param bool $catch Whether to process exceptions * * @return Response A Response instance * @@ -296,7 +296,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * it triggers "miss" processing. * * @param Request $request A Request instance - * @param Boolean $catch whether to process exceptions + * @param bool $catch whether to process exceptions * * @return Response A Response instance * @@ -350,7 +350,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * * @param Request $request A Request instance * @param Response $entry A Response instance to validate - * @param Boolean $catch Whether to process exceptions + * @param bool $catch Whether to process exceptions * * @return Response A Response instance */ @@ -411,7 +411,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * This methods is triggered when the cache missed or a reload is required. * * @param Request $request A Request instance - * @param Boolean $catch whether to process exceptions + * @param bool $catch whether to process exceptions * * @return Response A Response instance */ @@ -445,7 +445,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * Forwards the Request to the backend and returns the Response. * * @param Request $request A Request instance - * @param Boolean $catch Whether to catch exceptions or not + * @param bool $catch Whether to catch exceptions or not * @param Response $entry A Response instance (the stale entry if present, null otherwise) * * @return Response A Response instance @@ -496,7 +496,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @param Request $request A Request instance * @param Response $entry A Response instance * - * @return Boolean true if the cache entry if fresh enough, false otherwise + * @return bool true if the cache entry if fresh enough, false otherwise */ protected function isFreshEnough(Request $request, Response $entry) { @@ -517,7 +517,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @param Request $request A Request instance * @param Response $entry A Response instance * - * @return Boolean true if the cache entry can be returned even if it is staled, false otherwise + * @return bool true if the cache entry can be returned even if it is staled, false otherwise */ protected function lock(Request $request, Response $entry) { @@ -651,7 +651,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * * @param Request $request A Request instance * - * @return Boolean true if the Request is private, false otherwise + * @return bool true if the Request is private, false otherwise */ private function isPrivateRequest(Request $request) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php index 1d55ab4118..8e86a86e28 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php @@ -69,7 +69,7 @@ class Store implements StoreInterface * * @param Request $request A Request instance * - * @return Boolean|string true if the lock is acquired, the path to the current lock otherwise + * @return bool|string true if the lock is acquired, the path to the current lock otherwise */ public function lock(Request $request) { @@ -95,7 +95,7 @@ class Store implements StoreInterface * * @param Request $request A Request instance * - * @return Boolean False if the lock file does not exist or cannot be unlocked, true otherwise + * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise */ public function unlock(Request $request) { @@ -121,7 +121,7 @@ class Store implements StoreInterface $key = $this->getCacheKey($request); if (!$entries = $this->getMetadata($key)) { - return null; + return; } // find a cached entry that matches the request. @@ -135,7 +135,7 @@ class Store implements StoreInterface } if (null === $match) { - return null; + return; } list($req, $headers) = $match; @@ -146,7 +146,6 @@ class Store implements StoreInterface // TODO the metaStore referenced an entity that doesn't exist in // the entityStore. We definitely want to return nil but we should // also purge the entry from the meta-store when this is detected. - return null; } /** @@ -258,7 +257,7 @@ class Store implements StoreInterface * @param array $env1 A Request HTTP header array * @param array $env2 A Request HTTP header array * - * @return Boolean true if the two environments match, false otherwise + * @return bool true if the two environments match, false otherwise */ private function requestsMatch($vary, $env1, $env2) { @@ -301,7 +300,7 @@ class Store implements StoreInterface * * @param string $url A URL * - * @return Boolean true if the URL exists and has been purged, false otherwise + * @return bool true if the URL exists and has been purged, false otherwise */ public function purge($url) { @@ -334,7 +333,7 @@ class Store implements StoreInterface * @param string $key The store key * @param string $data The data to store * - * @return Boolean + * @return bool */ private function save($key, $data) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php index 29a54d8725..2f1587791d 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php @@ -58,7 +58,7 @@ interface StoreInterface * * @param Request $request A Request instance * - * @return Boolean|string true if the lock is acquired, the path to the current lock otherwise + * @return bool|string true if the lock is acquired, the path to the current lock otherwise */ public function lock(Request $request); @@ -67,7 +67,7 @@ interface StoreInterface * * @param Request $request A Request instance * - * @return Boolean False if the lock file does not exist or cannot be unlocked, true otherwise + * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise */ public function unlock(Request $request); @@ -76,7 +76,7 @@ interface StoreInterface * * @param Request $request A Request instance * - * @return Boolean true if lock exists, false otherwise + * @return bool true if lock exists, false otherwise */ public function isLocked(Request $request); @@ -85,7 +85,7 @@ interface StoreInterface * * @param string $url A URL * - * @return Boolean true if the URL exists and has been purged, false otherwise + * @return bool true if the URL exists and has been purged, false otherwise */ public function purge($url); diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php index 0be8e1b4db..fda4075a7e 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php @@ -91,7 +91,7 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface * Exceptions are not caught. * * @param Request $request A Request instance - * @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST) + * @param int $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST) * * @return Response A Response instance * @@ -153,7 +153,7 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface * * @param Response $response A Response instance * @param Request $request An error message in case the response is not a Response object - * @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST) + * @param int $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST) * * @return Response The filtered Response instance * @@ -191,7 +191,7 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface * * @param \Exception $e An \Exception instance * @param Request $request A Request instance - * @param integer $type The type of the request + * @param int $type The type of the request * * @return Response A Response instance * diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php index f49d37ccb1..79d44f179e 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php @@ -33,9 +33,9 @@ interface HttpKernelInterface * and do its best to convert them to a Response instance. * * @param Request $request A Request instance - * @param integer $type The type of the request + * @param int $type The type of the request * (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST) - * @param Boolean $catch Whether to catch exceptions or not + * @param bool $catch Whether to catch exceptions or not * * @return Response A Response instance * diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php index 347228254f..879597c384 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php @@ -59,25 +59,25 @@ abstract class Kernel implements KernelInterface, TerminableInterface protected $startTime; protected $loadClassCache; - const VERSION = '2.4.3'; - const VERSION_ID = '20403'; + const VERSION = '2.4.4'; + const VERSION_ID = '20404'; const MAJOR_VERSION = '2'; const MINOR_VERSION = '4'; - const RELEASE_VERSION = '3'; + const RELEASE_VERSION = '4'; const EXTRA_VERSION = ''; /** * Constructor. * * @param string $environment The environment - * @param Boolean $debug Whether to enable debugging or not + * @param bool $debug Whether to enable debugging or not * * @api */ public function __construct($environment, $debug) { $this->environment = $environment; - $this->debug = (Boolean) $debug; + $this->debug = (bool) $debug; $this->rootDir = $this->getRootDir(); $this->name = $this->getName(); @@ -260,7 +260,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface * * @param string $name A resource name to locate * @param string $dir A directory where to look for the resource first - * @param Boolean $first Whether to return the first path or paths for all matching bundles + * @param bool $first Whether to return the first path or paths for all matching bundles * * @return string|array The absolute path of the resource or an array if $first is false * diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php index 5e6ebcb8d9..ebeca3bf83 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php @@ -104,7 +104,7 @@ final class KernelEvents const TERMINATE = 'kernel.terminate'; /** - * The REQUEST_FINISHED event occurs when a response was generated for a request. + * The FINISH_REQUEST event occurs when a response was generated for a request. * * This event allows you to reset the global and environmental state of * the application, when it was changed during the request. diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php index 8ba01b9dd0..922f63180f 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php @@ -74,7 +74,7 @@ interface KernelInterface extends HttpKernelInterface, \Serializable * * @param string $class A class name * - * @return Boolean true if the class belongs to an active bundle, false otherwise + * @return bool true if the class belongs to an active bundle, false otherwise * * @api */ @@ -84,7 +84,7 @@ interface KernelInterface extends HttpKernelInterface, \Serializable * Returns a bundle and optionally its descendants by its name. * * @param string $name Bundle name - * @param Boolean $first Whether to return the first bundle only or together with its descendants + * @param bool $first Whether to return the first bundle only or together with its descendants * * @return BundleInterface|BundleInterface[] A BundleInterface instance or an array of BundleInterface instances if $first is false * @@ -113,7 +113,7 @@ interface KernelInterface extends HttpKernelInterface, \Serializable * * @param string $name A resource name to locate * @param string $dir A directory where to look for the resource first - * @param Boolean $first Whether to return the first path or paths for all matching bundles + * @param bool $first Whether to return the first path or paths for all matching bundles * * @return string|array The absolute path of the resource or an array if $first is false * @@ -145,7 +145,7 @@ interface KernelInterface extends HttpKernelInterface, \Serializable /** * Checks if debug mode is enabled. * - * @return Boolean true if debug mode is enabled, false otherwise + * @return bool true if debug mode is enabled, false otherwise * * @api */ @@ -172,7 +172,7 @@ interface KernelInterface extends HttpKernelInterface, \Serializable /** * Gets the request start time (not available if debug is disabled). * - * @return integer The request start timestamp + * @return int The request start timestamp * * @api */ diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php index 4442c6398e..c015b0d702 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php @@ -32,7 +32,7 @@ interface DebugLoggerInterface /** * Returns the number of errors. * - * @return integer The number of errors + * @return int The number of errors */ public function countErrors(); } diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php index fd6bd96e2d..39b517fac2 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php @@ -205,7 +205,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface * @param mixed $value * @param int $expiration * - * @return boolean + * @return bool */ abstract protected function setValue($key, $value, $expiration = 0); @@ -214,7 +214,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface * * @param string $key * - * @return boolean + * @return bool */ abstract protected function delete($key); @@ -224,7 +224,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface * @param string $value * @param int $expiration * - * @return boolean + * @return bool */ abstract protected function appendValue($key, $value, $expiration = 0); diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php index e225b0dd2e..b7abad735c 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php @@ -116,7 +116,7 @@ class FileProfilerStorage implements ProfilerStorageInterface public function read($token) { if (!$token || !file_exists($file = $this->getFilename($token))) { - return null; + return; } return $this->createProfileFromData($token, unserialize(file_get_contents($file))); @@ -215,7 +215,7 @@ class FileProfilerStorage implements ProfilerStorageInterface $position = ftell($file); if (0 === $position) { - return null; + return; } while (true) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php index 5489d6db88..9be3410dba 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php @@ -23,7 +23,7 @@ class MongoDbProfilerStorage implements ProfilerStorageInterface * @param string $dsn A data source name * @param string $username Not used * @param string $password Not used - * @param integer $lifetime The lifetime to use for the purge + * @param int $lifetime The lifetime to use for the purge */ public function __construct($dsn, $username = '', $password = '', $lifetime = 86400) { @@ -87,7 +87,7 @@ class MongoDbProfilerStorage implements ProfilerStorageInterface $result = $this->getMongo()->update(array('_id' => $profile->getToken()), array_filter($record, function ($v) { return !empty($v); }), array('upsert' => true)); - return (boolean) (isset($result['ok']) ? $result['ok'] : $result); + return (bool) (isset($result['ok']) ? $result['ok'] : $result); } /** diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php index 3f9e03da80..453a9a80c3 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php @@ -31,7 +31,7 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface * @param string $dsn A data source name * @param string $username The username for the database * @param string $password The password for the database - * @param integer $lifetime The lifetime to use for the purge + * @param int $lifetime The lifetime to use for the purge */ public function __construct($dsn, $username = '', $password = '', $lifetime = 86400) { @@ -59,7 +59,7 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface $criteria = $criteria ? 'WHERE '.implode(' AND ', $criteria) : ''; $db = $this->initDb(); - $tokens = $this->fetch($db, 'SELECT token, ip, method, url, time, parent FROM sf_profiler_data '.$criteria.' ORDER BY time DESC LIMIT '.((integer) $limit), $args); + $tokens = $this->fetch($db, 'SELECT token, ip, method, url, time, parent FROM sf_profiler_data '.$criteria.' ORDER BY time DESC LIMIT '.((int) $limit), $args); $this->close($db); return $tokens; @@ -77,8 +77,6 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface if (isset($data[0]['data'])) { return $this->createProfileFromData($token, $data[0]); } - - return null; } /** diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php index b3fa5514d3..a2c57f3b0e 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php @@ -261,7 +261,7 @@ class Profile * * @param string $name A collector name * - * @return Boolean + * @return bool */ public function hasCollector($name) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profiler.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profiler.php index b545b4acd5..62f5cd78ba 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profiler.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profiler.php @@ -40,7 +40,7 @@ class Profiler private $logger; /** - * @var Boolean + * @var bool */ private $enabled = true; @@ -105,7 +105,7 @@ class Profiler * * @param Profile $profile A Profile instance * - * @return Boolean + * @return bool */ public function saveProfile(Profile $profile) { @@ -175,25 +175,11 @@ class Profiler * * @return array An array of tokens * - * @see http://fr2.php.net/manual/en/datetime.formats.php for the supported date/time formats + * @see http://php.net/manual/en/datetime.formats.php for the supported date/time formats */ public function find($ip, $url, $limit, $method, $start, $end) { - if ('' != $start && null !== $start) { - $start = new \DateTime($start); - $start = $start->getTimestamp(); - } else { - $start = null; - } - - if ('' != $end && null !== $end) { - $end = new \DateTime($end); - $end = $end->getTimestamp(); - } else { - $end = null; - } - - return $this->storage->find($ip, $url, $limit, $method, $start, $end); + return $this->storage->find($ip, $url, $limit, $method, $this->getTimestamp($start), $this->getTimestamp($end)); } /** @@ -267,7 +253,7 @@ class Profiler * * @param string $name A collector name * - * @return Boolean + * @return bool */ public function has($name) { @@ -291,4 +277,19 @@ class Profiler return $this->collectors[$name]; } + + private function getTimestamp($value) + { + if (null === $value || '' == $value) { + return; + } + + try { + $value = new \DateTime(is_numeric($value) ? '@'.$value : $value); + } catch (\Exception $e) { + return; + } + + return $value->getTimestamp(); + } } diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php index f4b9e5e212..2e169155b5 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php @@ -48,7 +48,7 @@ interface ProfilerStorageInterface * * @param Profile $profile A Profile instance * - * @return Boolean Write operation successful + * @return bool Write operation successful */ public function write(Profile $profile); diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php index 67678d6f15..7ea4244500 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php @@ -344,7 +344,7 @@ class RedisProfilerStorage implements ProfilerStorageInterface * @param int $expiration * @param int $serializer * - * @return Boolean + * @return bool */ private function setValue($key, $value, $expiration = 0, $serializer = self::REDIS_SERIALIZER_NONE) { @@ -361,7 +361,7 @@ class RedisProfilerStorage implements ProfilerStorageInterface * @param string $value * @param int $expiration * - * @return Boolean + * @return bool */ private function appendValue($key, $value, $expiration = 0) { @@ -382,7 +382,7 @@ class RedisProfilerStorage implements ProfilerStorageInterface * * @param array $keys * - * @return Boolean + * @return bool */ private function delete(array $keys) { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php index 9ff962c5b7..71f74b9c65 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php @@ -25,10 +25,10 @@ class MemcacheMock * Open memcached server connection * * @param string $host - * @param integer $port - * @param integer $timeout + * @param int $port + * @param int $timeout * - * @return boolean + * @return bool */ public function connect($host, $port = null, $timeout = null) { @@ -45,10 +45,10 @@ class MemcacheMock * Open memcached server persistent connection * * @param string $host - * @param integer $port - * @param integer $timeout + * @param int $port + * @param int $timeout * - * @return boolean + * @return bool */ public function pconnect($host, $port = null, $timeout = null) { @@ -65,16 +65,16 @@ class MemcacheMock * Add a memcached server to connection pool * * @param string $host - * @param integer $port - * @param boolean $persistent - * @param integer $weight - * @param integer $timeout - * @param integer $retry_interval - * @param boolean $status + * @param int $port + * @param bool $persistent + * @param int $weight + * @param int $timeout + * @param int $retry_interval + * @param bool $status * @param callable $failure_callback - * @param integer $timeoutms + * @param int $timeoutms * - * @return boolean + * @return bool */ public function addServer($host, $port = 11211, $persistent = null, $weight = null, $timeout = null, $retry_interval = null, $status = null, $failure_callback = null, $timeoutms = null) { @@ -92,10 +92,10 @@ class MemcacheMock * * @param string $key * @param mixed $var - * @param integer $flag - * @param integer $expire + * @param int $flag + * @param int $expire * - * @return boolean + * @return bool */ public function add($key, $var, $flag = null, $expire = null) { @@ -117,10 +117,10 @@ class MemcacheMock * * @param string $key * @param string $var - * @param integer $flag - * @param integer $expire + * @param int $flag + * @param int $expire * - * @return boolean + * @return bool */ public function set($key, $var, $flag = null, $expire = null) { @@ -138,10 +138,10 @@ class MemcacheMock * * @param string $key * @param mixed $var - * @param integer $flag - * @param integer $expire + * @param int $flag + * @param int $expire * - * @return boolean + * @return bool */ public function replace($key, $var, $flag = null, $expire = null) { @@ -162,7 +162,7 @@ class MemcacheMock * Retrieve item from the server. * * @param string|array $key - * @param integer|array $flags + * @param int|array $flags * * @return mixed */ @@ -191,7 +191,7 @@ class MemcacheMock * * @param string $key * - * @return boolean + * @return bool */ public function delete($key) { @@ -211,7 +211,7 @@ class MemcacheMock /** * Flush all existing items at the server * - * @return boolean + * @return bool */ public function flush() { @@ -227,7 +227,7 @@ class MemcacheMock /** * Close memcached server connection * - * @return boolean + * @return bool */ public function close() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php index d28d54211d..09f52dd116 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php @@ -24,10 +24,10 @@ class MemcachedMock /** * Set a Memcached option * - * @param integer $option + * @param int $option * @param mixed $value * - * @return boolean + * @return bool */ public function setOption($option, $value) { @@ -38,10 +38,10 @@ class MemcachedMock * Add a memcached server to connection pool * * @param string $host - * @param integer $port - * @param integer $weight + * @param int $port + * @param int $weight * - * @return boolean + * @return bool */ public function addServer($host, $port = 11211, $weight = 0) { @@ -59,9 +59,9 @@ class MemcachedMock * * @param string $key * @param mixed $value - * @param integer $expiration + * @param int $expiration * - * @return boolean + * @return bool */ public function add($key, $value, $expiration = 0) { @@ -83,9 +83,9 @@ class MemcachedMock * * @param string $key * @param mixed $value - * @param integer $expiration + * @param int $expiration * - * @return boolean + * @return bool */ public function set($key, $value, $expiration = null) { @@ -103,9 +103,9 @@ class MemcachedMock * * @param string $key * @param mixed $value - * @param integer $expiration + * @param int $expiration * - * @return boolean + * @return bool */ public function replace($key, $value, $expiration = null) { @@ -129,7 +129,7 @@ class MemcachedMock * @param callable $cache_cb * @param float $cas_token * - * @return boolean + * @return bool */ public function get($key, $cache_cb = null, &$cas_token = null) { @@ -146,7 +146,7 @@ class MemcachedMock * @param string $key * @param string $value * - * @return boolean + * @return bool */ public function append($key, $value) { @@ -168,7 +168,7 @@ class MemcachedMock * * @param string $key * - * @return boolean + * @return bool */ public function delete($key) { @@ -188,7 +188,7 @@ class MemcachedMock /** * Flush all existing items at the server * - * @return boolean + * @return bool */ public function flush() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php index 4a89e2db88..5fd3a576e3 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php @@ -25,10 +25,10 @@ class RedisMock * Add a server to connection pool * * @param string $host - * @param integer $port + * @param int $port * @param float $timeout * - * @return boolean + * @return bool */ public function connect($host, $port = 6379, $timeout = 0) { @@ -44,10 +44,10 @@ class RedisMock /** * Set client option. * - * @param integer $name - * @param integer $value + * @param int $name + * @param int $value * - * @return boolean + * @return bool */ public function setOption($name, $value) { @@ -63,7 +63,7 @@ class RedisMock * * @param string $key * - * @return boolean + * @return bool */ public function exists($key) { @@ -78,10 +78,10 @@ class RedisMock * Store data at the server with expiration time. * * @param string $key - * @param integer $ttl + * @param int $ttl * @param mixed $value * - * @return boolean + * @return bool */ public function setex($key, $ttl, $value) { @@ -98,9 +98,9 @@ class RedisMock * Sets an expiration time on an item. * * @param string $key - * @param integer $ttl + * @param int $ttl * - * @return boolean + * @return bool */ public function setTimeout($key, $ttl) { @@ -120,7 +120,7 @@ class RedisMock * * @param string $key * - * @return boolean + * @return bool */ public function get($key) { @@ -137,7 +137,7 @@ class RedisMock * @param string $key * @param string $value * - * @return integer Size of the value after the append. + * @return int Size of the value after the append. */ public function append($key, $value) { @@ -159,7 +159,7 @@ class RedisMock * * @param string|array $key * - * @return integer + * @return int */ public function delete($key) { @@ -191,7 +191,7 @@ class RedisMock /** * Flush all existing items from all databases at the server. * - * @return boolean + * @return bool */ public function flushAll() { @@ -207,7 +207,7 @@ class RedisMock /** * Close Redis server connection * - * @return boolean + * @return bool */ public function close() { diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php index ede7c3f14b..bf9724aa2a 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php @@ -19,31 +19,69 @@ use Symfony\Component\HttpFoundation\Response; class ProfilerTest extends \PHPUnit_Framework_TestCase { + private $tmp; + private $storage; + public function testCollect() { - if (!class_exists('SQLite3') && (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers()))) { - $this->markTestSkipped('This test requires SQLite support in your environment'); - } - $request = new Request(); $request->query->set('foo', 'bar'); $response = new Response(); $collector = new RequestDataCollector(); - $tmp = tempnam(sys_get_temp_dir(), 'sf2_profiler'); - if (file_exists($tmp)) { - @unlink($tmp); - } - $storage = new SqliteProfilerStorage('sqlite:'.$tmp); - $storage->purge(); - - $profiler = new Profiler($storage); + $profiler = new Profiler($this->storage); $profiler->add($collector); $profile = $profiler->collect($request, $response); $profile = $profiler->loadProfile($profile->getToken()); $this->assertEquals(array('foo' => 'bar'), $profiler->get('request')->getRequestQuery()->all()); + } + + public function testFindWorksWithDates() + { + $profiler = new Profiler($this->storage); + + $this->assertCount(0, $profiler->find(null, null, null, null, '7th April 2014', '9th April 2014')); + } + + public function testFindWorksWithTimestamps() + { + $profiler = new Profiler($this->storage); + + $this->assertCount(0, $profiler->find(null, null, null, null, '1396828800', '1397001600')); + } + + public function testFindWorksWithInvalidDates() + { + $profiler = new Profiler($this->storage); + + $this->assertCount(0, $profiler->find(null, null, null, null, 'some string', '')); + } + + protected function setUp() + { + if (!class_exists('Symfony\Component\HttpFoundation\Request')) { + $this->markTestSkipped('The "HttpFoundation" component is not available'); + } + + if (!class_exists('SQLite3') && (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers()))) { + $this->markTestSkipped('This test requires SQLite support in your environment'); + } + + $this->tmp = tempnam(sys_get_temp_dir(), 'sf2_profiler'); + if (file_exists($this->tmp)) { + @unlink($this->tmp); + } + + $this->storage = new SqliteProfilerStorage('sqlite:'.$this->tmp); + $this->storage->purge(); + } + + protected function tearDown() + { + $this->storage->purge(); + $this->storage = null; - @unlink($tmp); + @unlink($this->tmp); } } diff --git a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php index 7ede0c32f7..c3c3555df9 100644 --- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php +++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php @@ -54,7 +54,7 @@ class UriSigner * * @param string $uri A signed URI * - * @return Boolean True if the URI is signed correctly, false otherwise + * @return bool True if the URI is signed correctly, false otherwise */ public function check($uri) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Collator/Collator.php b/vendor/symfony/intl/Symfony/Component/Intl/Collator/Collator.php index 8c0ffc337d..a0fefd3e40 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Collator/Collator.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Collator/Collator.php @@ -99,12 +99,12 @@ class Collator * Sort array maintaining index association * * @param array &$array Input array - * @param integer $sortFlag Flags for sorting, can be one of the following: + * @param int $sortFlag Flags for sorting, can be one of the following: * Collator::SORT_REGULAR - compare items normally (don't change types) * Collator::SORT_NUMERIC - compare items numerically * Collator::SORT_STRING - compare items as strings * - * @return Boolean True on success or false on failure + * @return bool True on success or false on failure */ public function asort(&$array, $sortFlag = self::SORT_REGULAR) { @@ -125,7 +125,7 @@ class Collator * @param string $str1 The first string to compare * @param string $str2 The second string to compare * - * @return Boolean|int Return the comparison result or false on failure: + * @return bool|int Return the comparison result or false on failure: * 1 if $str1 is greater than $str2 * 0 if $str1 is equal than $str2 * -1 if $str1 is less than $str2 @@ -144,7 +144,7 @@ class Collator * * @param int $attr An attribute specifier, one of the attribute constants * - * @return Boolean|int The attribute value on success or false on error + * @return bool|int The attribute value on success or false on error * * @see http://www.php.net/manual/en/collator.getattribute.php * @@ -207,7 +207,7 @@ class Collator /** * Not supported. Get current collator's strength * - * @return Boolean|int The current collator's strength or false on failure + * @return bool|int The current collator's strength or false on failure * * @see http://www.php.net/manual/en/collator.getstrength.php * @@ -224,7 +224,7 @@ class Collator * @param int $attr An attribute specifier, one of the attribute constants * @param int $val The attribute value, one of the attribute value constants * - * @return Boolean True on success or false on failure + * @return bool True on success or false on failure * * @see http://www.php.net/manual/en/collator.setattribute.php * @@ -246,7 +246,7 @@ class Collator * Collator::IDENTICAL * Collator::DEFAULT * - * @return Boolean True on success or false on failure + * @return bool True on success or false on failure * * @see http://www.php.net/manual/en/collator.setstrength.php * @@ -262,7 +262,7 @@ class Collator * * @param array &$arr Array of strings to sort * - * @return Boolean True on success or false on failure + * @return bool True on success or false on failure * * @see http://www.php.net/manual/en/collator.sortwithsortkeys.php * @@ -282,7 +282,7 @@ class Collator * Collator::SORT_NUMERIC * Collator::SORT_STRING * - * @return Boolean True on success or false on failure + * @return bool True on success or false on failure * * @see http://www.php.net/manual/en/collator.sort.php * diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/AmPmTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/AmPmTransformer.php index 1a9601d8e9..eb61e2e7cc 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/AmPmTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/AmPmTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class AmPmTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -27,7 +27,7 @@ class AmPmTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -35,7 +35,7 @@ class AmPmTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfWeekTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfWeekTransformer.php index 06eb72eab8..dd28b0762f 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfWeekTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfWeekTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class DayOfWeekTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -37,7 +37,7 @@ class DayOfWeekTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -54,7 +54,7 @@ class DayOfWeekTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfYearTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfYearTransformer.php index 2c33888c5f..30837483de 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfYearTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayOfYearTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class DayOfYearTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -29,7 +29,7 @@ class DayOfYearTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -37,7 +37,7 @@ class DayOfYearTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayTransformer.php index 19d30e746c..e5146aaa95 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/DayTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class DayTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -27,7 +27,7 @@ class DayTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -35,7 +35,7 @@ class DayTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/FullTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/FullTransformer.php index 767da7e7c6..d812cc4435 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/FullTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/FullTransformer.php @@ -210,7 +210,7 @@ class FullTransformer * * @param string $quoteMatch The string to check * - * @return Boolean true if matches, false otherwise + * @return bool true if matches, false otherwise */ public function isQuoteMatch($quoteMatch) { @@ -284,7 +284,7 @@ class FullTransformer * @param \DateTime $dateTime The DateTime object to be used to calculate the timestamp * @param array $options An array with the matched values to be used to calculate the timestamp * - * @return Boolean|int The calculated timestamp or false if matched date is invalid + * @return bool|int The calculated timestamp or false if matched date is invalid */ protected function calculateUnixTimestamp(\DateTime $dateTime, array $options) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1200Transformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1200Transformer.php index 8c8f5ef497..a7a1794ae3 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1200Transformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1200Transformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class Hour1200Transformer extends HourTransformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -30,7 +30,7 @@ class Hour1200Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function normalizeHour($hour, $marker = null) { @@ -42,7 +42,7 @@ class Hour1200Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -50,7 +50,7 @@ class Hour1200Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1201Transformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1201Transformer.php index a8c43702f0..8a6595718d 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1201Transformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour1201Transformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class Hour1201Transformer extends HourTransformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -27,7 +27,7 @@ class Hour1201Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function normalizeHour($hour, $marker = null) { @@ -42,7 +42,7 @@ class Hour1201Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -50,7 +50,7 @@ class Hour1201Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2400Transformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2400Transformer.php index 8f22da1336..64702685fb 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2400Transformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2400Transformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class Hour2400Transformer extends HourTransformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -27,7 +27,7 @@ class Hour2400Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function normalizeHour($hour, $marker = null) { @@ -41,7 +41,7 @@ class Hour2400Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -49,7 +49,7 @@ class Hour2400Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2401Transformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2401Transformer.php index b0f486b9da..18a2b0bd03 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2401Transformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/Hour2401Transformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class Hour2401Transformer extends HourTransformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -30,7 +30,7 @@ class Hour2401Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function normalizeHour($hour, $marker = null) { @@ -44,7 +44,7 @@ class Hour2401Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -52,7 +52,7 @@ class Hour2401Transformer extends HourTransformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MinuteTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MinuteTransformer.php index b48de29203..f44cd203e5 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MinuteTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MinuteTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class MinuteTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -29,7 +29,7 @@ class MinuteTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -37,7 +37,7 @@ class MinuteTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MonthTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MonthTransformer.php index c36fa7e600..874ace829b 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MonthTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/MonthTransformer.php @@ -70,7 +70,7 @@ class MonthTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -93,7 +93,7 @@ class MonthTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -119,7 +119,7 @@ class MonthTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/QuarterTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/QuarterTransformer.php index 8e83dc757f..eed7016cd8 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/QuarterTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/QuarterTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class QuarterTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -39,7 +39,7 @@ class QuarterTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -55,7 +55,7 @@ class QuarterTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/SecondTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/SecondTransformer.php index ccbcdb4164..639672e485 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/SecondTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/SecondTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class SecondTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -29,7 +29,7 @@ class SecondTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -37,7 +37,7 @@ class SecondTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/TimeZoneTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/TimeZoneTransformer.php index 7d74bd3696..b94fccd36a 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/TimeZoneTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/TimeZoneTransformer.php @@ -21,7 +21,7 @@ use Symfony\Component\Intl\Exception\NotImplementedException; class TimeZoneTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} * * @throws NotImplementedException When time zone is different than UTC or GMT (Etc/GMT) */ @@ -40,7 +40,7 @@ class TimeZoneTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -48,7 +48,7 @@ class TimeZoneTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/YearTransformer.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/YearTransformer.php index c3bd699dce..0073272db4 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/YearTransformer.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/DateFormat/YearTransformer.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Intl\DateFormatter\DateFormat; class YearTransformer extends Transformer { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(\DateTime $dateTime, $length) { @@ -31,7 +31,7 @@ class YearTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getReverseMatchingRegExp($length) { @@ -39,7 +39,7 @@ class YearTransformer extends Transformer } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extractDateOptions($matched, $length) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php index 507b9a654e..a1b0563940 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php @@ -49,7 +49,7 @@ class IntlDateFormatter /** * The error code from the last operation * - * @var integer + * @var int */ protected $errorCode = IntlGlobals::U_ZERO_ERROR; @@ -117,7 +117,7 @@ class IntlDateFormatter private $dateTimeZone; /** - * @var Boolean + * @var bool */ private $unitializedTimeZoneId = false; @@ -187,10 +187,10 @@ class IntlDateFormatter /** * Format the date/time value (timestamp) as a string * - * @param integer|\DateTime $timestamp The timestamp to format. \DateTime objects + * @param int|\DateTime $timestamp The timestamp to format. \DateTime objects * are supported as of PHP 5.3.4. * - * @return string|Boolean The formatted value or false if formatting failed. + * @return string|bool The formatted value or false if formatting failed. * * @see http://www.php.net/manual/en/intldateformatter.format.php * @@ -379,8 +379,6 @@ class IntlDateFormatter if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) { return date_default_timezone_get(); } - - return null; } /** @@ -400,7 +398,7 @@ class IntlDateFormatter /** * Returns whether the formatter is lenient * - * @return Boolean Currently always returns false. + * @return bool Currently always returns false. * * @see http://www.php.net/manual/en/intldateformatter.islenient.php * @@ -470,7 +468,7 @@ class IntlDateFormatter * * @param string $calendar The calendar to use. Default is IntlDateFormatter::GREGORIAN. * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/intldateformatter.setcalendar.php * @@ -489,10 +487,10 @@ class IntlDateFormatter * patterns, parsing as much as possible to obtain a value. Extra space, unrecognized tokens, or * invalid values ("February 30th") are not accepted. * - * @param Boolean $lenient Sets whether the parser is lenient or not. Currently + * @param bool $lenient Sets whether the parser is lenient or not. Currently * only false (strict) is supported. * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/intldateformatter.setlenient.php * @@ -512,7 +510,7 @@ class IntlDateFormatter * * @param string $pattern A pattern string in conformance with the ICU IntlDateFormatter documentation * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/intldateformatter.setpattern.php * @see http://userguide.icu-project.org/formatparse/datetime @@ -535,7 +533,7 @@ class IntlDateFormatter * If NULL or the empty string, the default time zone for the * runtime is used. * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/intldateformatter.settimezoneid.php */ @@ -584,7 +582,7 @@ class IntlDateFormatter * * @param mixed $timeZone * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/intldateformatter.settimezone.php */ diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Globals/IntlGlobals.php b/vendor/symfony/intl/Symfony/Component/Intl/Globals/IntlGlobals.php index 6da000111f..f37c860f02 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Globals/IntlGlobals.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Globals/IntlGlobals.php @@ -21,21 +21,21 @@ abstract class IntlGlobals /** * Indicates that no error occurred * - * @var integer + * @var int */ const U_ZERO_ERROR = 0; /** * Indicates that an invalid argument was passed * - * @var integer + * @var int */ const U_ILLEGAL_ARGUMENT_ERROR = 1; /** * Indicates that the parse() operation failed * - * @var integer + * @var int */ const U_PARSE_ERROR = 9; @@ -53,23 +53,23 @@ abstract class IntlGlobals /** * The error code of the last operation * - * @var integer + * @var int */ private static $errorCode = self::U_ZERO_ERROR; /** * The error code of the last operation * - * @var integer + * @var int */ private static $errorMessage = 'U_ZERO_ERROR'; /** * Returns whether the error code indicates a failure * - * @param integer $errorCode The error code returned by IntlGlobals::getErrorCode() + * @param int $errorCode The error code returned by IntlGlobals::getErrorCode() * - * @return Boolean + * @return bool */ public static function isFailure($errorCode) { @@ -82,7 +82,7 @@ abstract class IntlGlobals * * Returns IntlGlobals::U_ZERO_ERROR if no error occurred. * - * @return integer + * @return int */ public static function getErrorCode() { @@ -104,7 +104,7 @@ abstract class IntlGlobals /** * Returns the symbolic name for a given error code * - * @param integer $code The error code returned by IntlGlobals::getErrorCode() + * @param int $code The error code returned by IntlGlobals::getErrorCode() * * @return string */ @@ -120,7 +120,7 @@ abstract class IntlGlobals /** * Sets the current error * - * @param integer $code One of the error constants in this class + * @param int $code One of the error constants in this class * @param string $message The ICU class error message * * @throws \InvalidArgumentException If the code is not one of the error constants in this class diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Intl.php b/vendor/symfony/intl/Symfony/Component/Intl/Intl.php index d0373988d2..df42a8c11c 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Intl.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Intl.php @@ -53,7 +53,7 @@ class Intl private static $regionBundle; /** - * @var string|Boolean|null + * @var string|bool|null */ private static $icuVersion = false; @@ -70,7 +70,7 @@ class Intl /** * Returns whether the intl extension is installed. * - * @return Boolean Returns true if the intl extension is installed, false otherwise. + * @return bool Returns true if the intl extension is installed, false otherwise. */ public static function isExtensionLoaded() { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Locale/Locale.php b/vendor/symfony/intl/Symfony/Component/Intl/Locale/Locale.php index f16d937b02..69459d5317 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Locale/Locale.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Locale/Locale.php @@ -76,7 +76,7 @@ class Locale * * @param string $langtag The language tag to check * @param string $locale The language range to check against - * @param Boolean $canonicalize + * @param bool $canonicalize * * @return string The corresponding locale code * @@ -271,7 +271,7 @@ class Locale * * @param array $langtag A list of the language tags to compare to locale * @param string $locale The locale to use as the language range when matching - * @param Boolean $canonicalize If true, the arguments will be converted to canonical form before matching + * @param bool $canonicalize If true, the arguments will be converted to canonical form before matching * @param string $default The locale to use if no match is found * * @see http://www.php.net/manual/en/locale.lookup.php @@ -304,7 +304,7 @@ class Locale * * @param string $locale The locale code * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/locale.parselocale.php * diff --git a/vendor/symfony/intl/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php b/vendor/symfony/intl/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php index 429dae990a..da59706e36 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php @@ -130,7 +130,7 @@ class NumberFormatter /** * The error code from the last operation * - * @var integer + * @var int */ protected $errorCode = IntlGlobals::U_ZERO_ERROR; @@ -365,7 +365,7 @@ class NumberFormatter * @param int $type Type of the formatting, one of the format type constants. * Only type NumberFormatter::TYPE_DEFAULT is currently supported. * - * @return Boolean|string The formatted value or false on error + * @return bool|string The formatted value or false on error * * @see http://www.php.net/manual/en/numberformatter.format.php * @@ -409,7 +409,7 @@ class NumberFormatter * * @param int $attr An attribute specifier, one of the numeric attribute constants * - * @return Boolean|int The attribute value on success or false on error + * @return bool|int The attribute value on success or false on error * * @see http://www.php.net/manual/en/numberformatter.getattribute.php */ @@ -462,7 +462,7 @@ class NumberFormatter /** * Not supported. Returns the formatter's pattern * - * @return Boolean|string The pattern string used by the formatter or false on error + * @return bool|string The pattern string used by the formatter or false on error * * @see http://www.php.net/manual/en/numberformatter.getpattern.php * @@ -478,7 +478,7 @@ class NumberFormatter * * @param int $attr A symbol specifier, one of the format symbol constants * - * @return Boolean|string The symbol value or false on error + * @return bool|string The symbol value or false on error * * @see http://www.php.net/manual/en/numberformatter.getsymbol.php */ @@ -492,7 +492,7 @@ class NumberFormatter * * @param int $attr An attribute specifier, one of the text attribute constants * - * @return Boolean|string The attribute value or false on error + * @return bool|string The attribute value or false on error * * @see http://www.php.net/manual/en/numberformatter.gettextattribute.php */ @@ -508,7 +508,7 @@ class NumberFormatter * @param string $currency Parameter to receive the currency name (reference) * @param int $position Offset to begin the parsing on return this value will hold the offset at which the parsing ended * - * @return Boolean|string The parsed numeric value of false on error + * @return bool|string The parsed numeric value of false on error * * @see http://www.php.net/manual/en/numberformatter.parsecurrency.php * @@ -526,7 +526,7 @@ class NumberFormatter * @param int $type Type of the formatting, one of the format type constants. NumberFormatter::TYPE_DOUBLE by default * @param int $position Offset to begin the parsing on return this value will hold the offset at which the parsing ended * - * @return Boolean|string The parsed value of false on error + * @return bool|string The parsed value of false on error * * @see http://www.php.net/manual/en/numberformatter.parse.php */ @@ -569,7 +569,7 @@ class NumberFormatter * NumberFormatter::GROUPING_USED and NumberFormatter::ROUNDING_MODE. * @param int $value The attribute value. * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/numberformatter.setattribute.php * @@ -615,7 +615,7 @@ class NumberFormatter * * @param string $pattern A pattern string in conformance with the ICU DecimalFormat documentation * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/numberformatter.setpattern.php * @see http://www.icu-project.org/apiref/icu4c/classDecimalFormat.html#_details @@ -633,7 +633,7 @@ class NumberFormatter * @param int $attr A symbol specifier, one of the format symbol constants * @param string $value The value for the symbol * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/numberformatter.setsymbol.php * @@ -650,7 +650,7 @@ class NumberFormatter * @param int $attr An attribute specifier, one of the text attribute constants * @param int $value The attribute value * - * @return Boolean true on success or false on failure + * @return bool true on success or false on failure * * @see http://www.php.net/manual/en/numberformatter.settextattribute.php * @@ -709,10 +709,10 @@ class NumberFormatter /** * Rounds a value. * - * @param integer|float $value The value to round + * @param int|float $value The value to round * @param int $precision The number of decimal digits to round to * - * @return integer|float The rounded value + * @return int|float The rounded value */ private function round($value, $precision) { @@ -749,7 +749,7 @@ class NumberFormatter /** * Formats a number. * - * @param integer|float $value The numeric value to format + * @param int|float $value The numeric value to format * @param int $precision The number of decimal digits to use * * @return string The formatted number @@ -764,8 +764,8 @@ class NumberFormatter /** * Returns the precision value if the DECIMAL style is being used and the FRACTION_DIGITS attribute is uninitialized. * - * @param integer|float $value The value to get the precision from if the FRACTION_DIGITS attribute is uninitialized - * @param int $precision The precision value to returns if the FRACTION_DIGITS attribute is initialized + * @param int|float $value The value to get the precision from if the FRACTION_DIGITS attribute is uninitialized + * @param int $precision The precision value to returns if the FRACTION_DIGITS attribute is initialized * * @return int The precision value */ @@ -790,7 +790,7 @@ class NumberFormatter * * @param string $attr The attribute name * - * @return Boolean true if the value was set by client, false otherwise + * @return bool true if the value was set by client, false otherwise */ private function isInitializedAttribute($attr) { @@ -803,7 +803,7 @@ class NumberFormatter * @param mixed $value The value to be converted * @param int $type The type to convert. Can be TYPE_DOUBLE (float) or TYPE_INT32 (int) * - * @return integer|float The converted value + * @return int|float The converted value */ private function convertValueDataType($value, $type) { @@ -887,7 +887,7 @@ class NumberFormatter * * @param int $value The rounding mode value to check * - * @return Boolean true if the rounding mode is invalid, false otherwise + * @return bool true if the rounding mode is invalid, false otherwise */ private function isInvalidRoundingMode($value) { @@ -908,7 +908,7 @@ class NumberFormatter */ private function normalizeGroupingUsedValue($value) { - return (int) (Boolean) (int) $value; + return (int) (bool) (int) $value; } /** diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/CurrencyBundleInterface.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/CurrencyBundleInterface.php index 1a88e93722..f34232e349 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/CurrencyBundleInterface.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/CurrencyBundleInterface.php @@ -55,7 +55,7 @@ interface CurrencyBundleInterface extends ResourceBundleInterface * * @param string $currency A currency code (e.g. "EUR"). * - * @return integer|null The number of digits after the comma or NULL if not found. + * @return int|null The number of digits after the comma or NULL if not found. */ public function getFractionDigits($currency); @@ -68,7 +68,7 @@ interface CurrencyBundleInterface extends ResourceBundleInterface * * @param string $currency A currency code (e.g. "EUR"). * - * @return float|integer|null The rounding increment or NULL if not found. + * @return float|int|null The rounding increment or NULL if not found. */ public function getRoundingIncrement($currency); } diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/LanguageBundle.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/LanguageBundle.php index 6b98a29e39..b09381fa34 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/LanguageBundle.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/LanguageBundle.php @@ -28,7 +28,7 @@ class LanguageBundle extends AbstractBundle implements LanguageBundleInterface } if (null === ($languages = $this->readEntry($locale, array('Languages'), true))) { - return null; + return; } // Some languages are translated together with their region, @@ -87,7 +87,7 @@ class LanguageBundle extends AbstractBundle implements LanguageBundleInterface // "af" (Afrikaans) has no "Scripts" block if (!isset($data['Scripts'][$script])) { - return null; + return; } return $data['Scripts'][$script]; diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BinaryBundleReader.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BinaryBundleReader.php index 56cef806da..16ea1dd3aa 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BinaryBundleReader.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BinaryBundleReader.php @@ -28,7 +28,12 @@ class BinaryBundleReader extends AbstractBundleReader implements BundleReaderInt { // Point for future extension: Modify this class so that it works also // if the \ResourceBundle class is not available. - $bundle = new \ResourceBundle($locale, $path); + try { + $bundle = new \ResourceBundle($locale, $path); + } catch (\Exception $e) { + // HHVM compatibility: constructor throws on invalid resource + $bundle = null; + } if (null === $bundle) { throw new RuntimeException(sprintf( diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BufferedBundleReader.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BufferedBundleReader.php index e44074b168..f005eeb4ac 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BufferedBundleReader.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/BufferedBundleReader.php @@ -29,7 +29,7 @@ class BufferedBundleReader implements BundleReaderInterface * Buffers a given reader. * * @param BundleReaderInterface $reader The reader to buffer. - * @param integer $bufferSize The number of entries to store + * @param int $bufferSize The number of entries to store * in the buffer. */ public function __construct(BundleReaderInterface $reader, $bufferSize) diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReader.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReader.php index e3656fe2eb..4b71c9bcb2 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReader.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReader.php @@ -105,7 +105,7 @@ class StructuredBundleReader implements StructuredBundleReaderInterface private function getFallbackLocale($locale) { if (false === $pos = strrpos($locale, '_')) { - return null; + return; } return substr($locale, 0, $pos); diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReaderInterface.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReaderInterface.php index c22ad93b97..5d435c485c 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReaderInterface.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Reader/StructuredBundleReaderInterface.php @@ -36,7 +36,7 @@ interface StructuredBundleReaderInterface extends BundleReaderInterface * @param string $path The path to the resource bundle. * @param string $locale The locale to read. * @param string[] $indices The indices to read from the bundle. - * @param Boolean $fallback Whether to merge the value with the value from + * @param bool $fallback Whether to merge the value with the value from * the fallback locale (e.g. "en" for "en_GB"). * Only applicable if the result is multivalued * (i.e. array or \ArrayAccess) or cannot be found diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Transformer/Rule/LocaleBundleTransformationRule.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Transformer/Rule/LocaleBundleTransformationRule.php index b2576d6eec..af4dfea557 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Transformer/Rule/LocaleBundleTransformationRule.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Transformer/Rule/LocaleBundleTransformationRule.php @@ -119,7 +119,12 @@ class LocaleBundleTransformationRule implements TransformationRuleInterface } // Delete locales that have no content (i.e. only "Version" key) - $bundle = new \ResourceBundle($locale, $tempDir); + try { + $bundle = new \ResourceBundle($locale, $tempDir); + } catch (\Exception $e) { + // HHVM compatibility: constructor throws on invalid resource + $bundle = null; + } if (null === $bundle) { throw new RuntimeException('The resource bundle for locale ' . $locale . ' could not be loaded from directory ' . $tempDir); @@ -190,7 +195,7 @@ class LocaleBundleTransformationRule implements TransformationRuleInterface // Currently the only available variant is POSIX, which we don't want // to include in the list if (count($variants) > 0) { - return null; + return; } // Some languages are translated together with their region, @@ -202,7 +207,7 @@ class LocaleBundleTransformationRule implements TransformationRuleInterface // Some languages are simply not translated // Example: "az" (Azerbaijani) has no translation in "af" (Afrikaans) if (null === ($name = $this->languageBundle->getLanguageName($lang, null, $displayLocale))) { - return null; + return; } // "as" (Assamese) has no "Variants" block @@ -217,7 +222,7 @@ class LocaleBundleTransformationRule implements TransformationRuleInterface if ($script) { // Some scripts are not translated into every language if (null === ($scriptName = $this->languageBundle->getScriptName($script, $lang, $displayLocale))) { - return null; + return; } $extras[] = $scriptName; @@ -228,7 +233,7 @@ class LocaleBundleTransformationRule implements TransformationRuleInterface if ($region) { // Some regions are not translated into every language if (null === ($regionName = $this->regionBundle->getCountryName($region, $displayLocale))) { - return null; + return; } $extras[] = $regionName; diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Util/RecursiveArrayAccess.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Util/RecursiveArrayAccess.php index e1feaa2ce0..5257e9c1ca 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Util/RecursiveArrayAccess.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Util/RecursiveArrayAccess.php @@ -20,7 +20,7 @@ class RecursiveArrayAccess { foreach ($indices as $index) { if (!$array instanceof \ArrayAccess && !is_array($array)) { - return null; + return; } $array = $array[$index]; diff --git a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Writer/TextBundleWriter.php b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Writer/TextBundleWriter.php index 342ee2dc5c..c2fff38c7b 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Writer/TextBundleWriter.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/ResourceBundle/Writer/TextBundleWriter.php @@ -58,8 +58,8 @@ class TextBundleWriter implements BundleWriterInterface * * @param resource $file The file handle to write to. * @param mixed $value The value of the node. - * @param integer $indentation The number of levels to indent. - * @param Boolean $requireBraces Whether to require braces to be printed + * @param int $indentation The number of levels to indent. + * @param bool $requireBraces Whether to require braces to be printed * around the value. * * @see http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt @@ -103,7 +103,7 @@ class TextBundleWriter implements BundleWriterInterface * Writes an "integer" node. * * @param resource $file The file handle to write to. - * @param integer $value The value of the node. + * @param int $value The value of the node. * * @see http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt */ @@ -117,7 +117,7 @@ class TextBundleWriter implements BundleWriterInterface * * @param resource $file The file handle to write to. * @param array $value The value of the node. - * @param integer $indentation The number of levels to indent. + * @param int $indentation The number of levels to indent. * * @see http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt */ @@ -137,7 +137,7 @@ class TextBundleWriter implements BundleWriterInterface * * @param resource $file The file handle to write to. * @param string $value The value of the node. - * @param Boolean $requireBraces Whether to require braces to be printed + * @param bool $requireBraces Whether to require braces to be printed * around the value. * * @see http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt @@ -158,7 +158,7 @@ class TextBundleWriter implements BundleWriterInterface * * @param resource $file The file handle to write to. * @param array $value The value of the node. - * @param integer $indentation The number of levels to indent. + * @param int $indentation The number of levels to indent. * * @see http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt */ @@ -182,7 +182,7 @@ class TextBundleWriter implements BundleWriterInterface * * @param resource $file The file handle to write to. * @param array $value The value of the node. - * @param integer $indentation The number of levels to indent. + * @param int $indentation The number of levels to indent. */ private function writeTable($file, array $value, $indentation) { diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Resources/bin/common.php b/vendor/symfony/intl/Symfony/Component/Intl/Resources/bin/common.php index 4fadbe8233..eb7643dfbd 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Resources/bin/common.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Resources/bin/common.php @@ -62,7 +62,7 @@ function get_icu_version_from_genrb($genrb) } if (!preg_match('/ICU version ([\d\.]+)/', implode('', $output), $matches)) { - return null; + return; } return $matches[1]; diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Resources/stubs/functions.php b/vendor/symfony/intl/Symfony/Component/Intl/Resources/stubs/functions.php index 7a2d4b6729..b552d0e859 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Resources/stubs/functions.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Resources/stubs/functions.php @@ -19,9 +19,9 @@ if (!function_exists('intl_is_failure')) { * * @author Bernhard Schussek * - * @param integer $errorCode The error code returned by intl_get_error_code(). + * @param int $errorCode The error code returned by intl_get_error_code(). * - * @return Boolean Whether the error code indicates an error. + * @return bool Whether the error code indicates an error. * * @see \Symfony\Component\Intl\Globals\StubIntlGlobals::isFailure */ @@ -36,7 +36,7 @@ if (!function_exists('intl_is_failure')) { * * @author Bernhard Schussek * - * @return Boolean The error code of the last intl function call or + * @return bool The error code of the last intl function call or * IntlGlobals::U_ZERO_ERROR if no error occurred. * * @see \Symfony\Component\Intl\Globals\StubIntlGlobals::getErrorCode @@ -52,7 +52,7 @@ if (!function_exists('intl_is_failure')) { * * @author Bernhard Schussek * - * @return Boolean The error message of the last intl function call or + * @return bool The error message of the last intl function call or * "U_ZERO_ERROR" if no error occurred. * * @see \Symfony\Component\Intl\Globals\StubIntlGlobals::getErrorMessage @@ -66,7 +66,7 @@ if (!function_exists('intl_is_failure')) { * Stub implementation for the {@link intl_error_name()} function of the intl * extension. * - * @param integer $errorCode The error code. + * @param int $errorCode The error code. * * @return string The name of the error code constant. * diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Tests/DateFormatter/AbstractIntlDateFormatterTest.php b/vendor/symfony/intl/Symfony/Component/Intl/Tests/DateFormatter/AbstractIntlDateFormatterTest.php index d5927fee83..1a68d90f42 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Tests/DateFormatter/AbstractIntlDateFormatterTest.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Tests/DateFormatter/AbstractIntlDateFormatterTest.php @@ -919,14 +919,14 @@ abstract class AbstractIntlDateFormatterTest extends \PHPUnit_Framework_TestCase abstract protected function getIntlErrorMessage(); /** - * @return integer + * @return int */ abstract protected function getIntlErrorCode(); /** - * @param integer $errorCode + * @param int $errorCode * - * @return Boolean + * @return bool */ abstract protected function isIntlFailure($errorCode); } diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php b/vendor/symfony/intl/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php index ae59864087..d40173965d 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php @@ -825,14 +825,14 @@ abstract class AbstractNumberFormatterTest extends \PHPUnit_Framework_TestCase abstract protected function getIntlErrorMessage(); /** - * @return integer + * @return int */ abstract protected function getIntlErrorCode(); /** - * @param integer $errorCode + * @param int $errorCode * - * @return Boolean + * @return bool */ abstract protected function isIntlFailure($errorCode); } diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Util/IcuVersion.php b/vendor/symfony/intl/Symfony/Component/Intl/Util/IcuVersion.php index e305a07528..0eface090e 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Util/IcuVersion.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Util/IcuVersion.php @@ -46,10 +46,10 @@ class IcuVersion * @param string $version1 A version string. * @param string $version2 A version string to compare. * @param string $operator The comparison operator. - * @param integer|null $precision The number of components to compare. Pass + * @param int|null $precision The number of components to compare. Pass * NULL to compare the versions unchanged. * - * @return Boolean Whether the comparison succeeded. + * @return bool Whether the comparison succeeded. * * @see normalize() */ @@ -81,7 +81,7 @@ class IcuVersion * // => '12.3' * * @param string $version An ICU version string. - * @param integer|null $precision The number of components to include. Pass + * @param int|null $precision The number of components to include. Pass * NULL to return the version unchanged. * * @return string|null The normalized ICU version or NULL if it couldn't be diff --git a/vendor/symfony/intl/Symfony/Component/Intl/Util/Version.php b/vendor/symfony/intl/Symfony/Component/Intl/Util/Version.php index 5f6a43374b..d767b17c99 100644 --- a/vendor/symfony/intl/Symfony/Component/Intl/Util/Version.php +++ b/vendor/symfony/intl/Symfony/Component/Intl/Util/Version.php @@ -36,10 +36,10 @@ class Version * @param string $version1 A version string. * @param string $version2 A version string to compare. * @param string $operator The comparison operator. - * @param integer|null $precision The number of components to compare. Pass + * @param int|null $precision The number of components to compare. Pass * NULL to compare the versions unchanged. * - * @return Boolean Whether the comparison succeeded. + * @return bool Whether the comparison succeeded. * * @see normalize() */ @@ -64,7 +64,7 @@ class Version * // => '1.2' * * @param string $version A version string. - * @param integer|null $precision The number of components to include. Pass + * @param int|null $precision The number of components to include. Pass * NULL to return the version unchanged. * * @return string|null The normalized version or NULL if it couldn't be @@ -83,7 +83,7 @@ class Version } if (!preg_match('/^' . $pattern . '/', $version, $matches)) { - return null; + return; } return $matches[0]; diff --git a/vendor/symfony/locale/Symfony/Component/Locale/Locale.php b/vendor/symfony/locale/Symfony/Component/Locale/Locale.php index 109ae204fc..cfed239662 100644 --- a/vendor/symfony/locale/Symfony/Component/Locale/Locale.php +++ b/vendor/symfony/locale/Symfony/Component/Locale/Locale.php @@ -183,7 +183,7 @@ class Locale extends \Locale protected static function getFallbackLocale($locale) { if (false === $pos = strrpos($locale, '_')) { - return null; + return; } return substr($locale, 0, $pos); diff --git a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php index 25a207f0e5..c3db7e9be9 100644 --- a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php +++ b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php @@ -57,7 +57,7 @@ class ChromePhpHandler extends BaseChromePhpHandler } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function sendHeader($header, $content) { diff --git a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ConsoleHandler.php b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ConsoleHandler.php index 8a30a9c06a..58c249c97c 100644 --- a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ConsoleHandler.php +++ b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ConsoleHandler.php @@ -60,7 +60,7 @@ class ConsoleHandler extends AbstractProcessingHandler implements EventSubscribe * * @param OutputInterface|null $output The console output to use (the handler remains disabled when passing null * until the output is set, e.g. by using console events) - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack + * @param bool $bubble Whether the messages that are handled can bubble up the stack * @param array $verbosityLevelMap Array that maps the OutputInterface verbosity to a minimum logging * level (leave empty to use the default mapping) */ @@ -167,7 +167,7 @@ class ConsoleHandler extends AbstractProcessingHandler implements EventSubscribe /** * Updates the logging level based on the verbosity setting of the console output. * - * @return Boolean Whether the handler is enabled and verbosity is not set to quiet. + * @return bool Whether the handler is enabled and verbosity is not set to quiet. */ private function updateLevel() { diff --git a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php index 45344c12a6..e026d443de 100644 --- a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php +++ b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php @@ -58,7 +58,7 @@ class FirePHPHandler extends BaseFirePHPHandler } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function sendHeader($header, $content) { diff --git a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php index 3076050319..cbd940e1b9 100644 --- a/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php +++ b/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php @@ -52,7 +52,7 @@ class WebProcessorTest extends \PHPUnit_Framework_TestCase } /** - * @param integer $level + * @param int $level * @param string $message * * @return array Record diff --git a/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/Options.php b/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/Options.php index 5b958af4c4..43c81f0c33 100644 --- a/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/Options.php +++ b/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/Options.php @@ -52,7 +52,7 @@ class Options implements \ArrayAccess, \Iterator, \Countable * process. If any option is changed after being read, all evaluated * lazy options that depend on this option would become invalid. * - * @var Boolean + * @var bool */ private $reading = false; @@ -244,7 +244,7 @@ class Options implements \ArrayAccess, \Iterator, \Countable * * @param string $option The option name. * - * @return Boolean Whether the option exists. + * @return bool Whether the option exists. */ public function has($option) { @@ -324,7 +324,7 @@ class Options implements \ArrayAccess, \Iterator, \Countable * * @param string $option The option name. * - * @return Boolean Whether the option exists. + * @return bool Whether the option exists. * * @see \ArrayAccess::offsetExists() */ diff --git a/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/OptionsResolverInterface.php b/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/OptionsResolverInterface.php index 8474c4bcd7..fa57fef0fd 100644 --- a/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/OptionsResolverInterface.php +++ b/vendor/symfony/options-resolver/Symfony/Component/OptionsResolver/OptionsResolverInterface.php @@ -175,7 +175,7 @@ interface OptionsResolverInterface * * @param string $option The name of the option. * - * @return Boolean Whether the option is known. + * @return bool Whether the option is known. */ public function isKnown($option); @@ -188,7 +188,7 @@ interface OptionsResolverInterface * * @param string $option The name of the option. * - * @return Boolean Whether the option is required. + * @return bool Whether the option is required. */ public function isRequired($option); diff --git a/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php b/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php index d146057e08..93948e1db0 100644 --- a/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php +++ b/vendor/symfony/process/Symfony/Component/Process/PhpProcess.php @@ -34,7 +34,7 @@ class PhpProcess extends Process * @param string $script The PHP script to run (as a string) * @param string $cwd The working directory * @param array $env The environment variables - * @param integer $timeout The timeout in seconds + * @param int $timeout The timeout in seconds * @param array $options An array of options for proc_open * * @api diff --git a/vendor/symfony/process/Symfony/Component/Process/Process.php b/vendor/symfony/process/Symfony/Component/Process/Process.php index a4bdfca90c..c49d7a56a9 100644 --- a/vendor/symfony/process/Symfony/Component/Process/Process.php +++ b/vendor/symfony/process/Symfony/Component/Process/Process.php @@ -55,7 +55,7 @@ class Process private $processInformation; private $stdout; private $stderr; - private $enhanceWindowsCompatibility; + private $enhanceWindowsCompatibility = true; private $enhanceSigchildCompatibility; private $process; private $status = self::STATUS_READY; @@ -126,7 +126,7 @@ class Process * @param string|null $cwd The working directory or null to use the working dir of the current PHP process * @param array|null $env The environment variables or null to inherit * @param string|null $stdin The STDIN content - * @param integer|float|null $timeout The timeout in seconds or null to disable + * @param int|float|null $timeout The timeout in seconds or null to disable * @param array $options An array of options for proc_open * * @throws RuntimeException When proc_open is not installed @@ -146,19 +146,16 @@ class Process // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected // @see : https://bugs.php.net/bug.php?id=51800 // @see : https://bugs.php.net/bug.php?id=50524 - if (null === $this->cwd && (defined('ZEND_THREAD_SAFE') || defined('PHP_WINDOWS_VERSION_BUILD'))) { $this->cwd = getcwd(); } if (null !== $env) { $this->setEnv($env); - } else { - $this->env = null; } + $this->stdin = $stdin; $this->setTimeout($timeout); $this->useFileHandles = defined('PHP_WINDOWS_VERSION_BUILD'); - $this->enhanceWindowsCompatibility = true; $this->enhanceSigchildCompatibility = !defined('PHP_WINDOWS_VERSION_BUILD') && $this->isSigchildEnabled(); $this->options = array_replace(array('suppress_errors' => true, 'binary_pipes' => true), $options); } @@ -187,7 +184,7 @@ class Process * @param callable|null $callback A PHP callback to run whenever there is some * output available on STDOUT or STDERR * - * @return integer The exit status code + * @return int The exit status code * * @throws RuntimeException When process can't be launched * @throws RuntimeException When process stopped after receiving signal @@ -238,10 +235,11 @@ class Process $commandline = $this->commandline; if (defined('PHP_WINDOWS_VERSION_BUILD') && $this->enhanceWindowsCompatibility) { - $commandline = 'cmd /V:ON /E:ON /C "('.$commandline.')"'; + $commandline = 'cmd /V:ON /E:ON /C "('.$commandline.')'; foreach ($this->processPipes->getFiles() as $offset => $filename) { - $commandline .= ' '.$offset.'>'.$filename; + $commandline .= ' '.$offset.'>'.ProcessUtils::escapeArgument($filename); } + $commandline .= '"'; if (!isset($this->options['bypass_shell'])) { $this->options['bypass_shell'] = true; @@ -302,7 +300,7 @@ class Process * * @param callable|null $callback A valid PHP callback * - * @return integer The exitcode of the process + * @return int The exitcode of the process * * @throws RuntimeException When process timed out * @throws RuntimeException When process stopped after receiving signal @@ -338,7 +336,7 @@ class Process /** * Returns the Pid (process identifier), if applicable. * - * @return integer|null The process id if running, null otherwise + * @return int|null The process id if running, null otherwise * * @throws RuntimeException In case --enable-sigchild is activated */ @@ -356,7 +354,7 @@ class Process /** * Sends a POSIX signal to the process. * - * @param integer $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php) + * @param int $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php) * * @return Process * @@ -481,7 +479,7 @@ class Process /** * Returns the exit code returned by the process. * - * @return null|integer The exit status code, null if the Process is not terminated + * @return null|int The exit status code, null if the Process is not terminated * * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled * @@ -523,7 +521,7 @@ class Process /** * Checks if the process ended successfully. * - * @return Boolean true if the process ended successfully, false otherwise + * @return bool true if the process ended successfully, false otherwise * * @api */ @@ -537,7 +535,7 @@ class Process * * It always returns false on Windows. * - * @return Boolean + * @return bool * * @throws RuntimeException In case --enable-sigchild is activated * @throws LogicException In case the process is not terminated @@ -562,7 +560,7 @@ class Process * * It is only meaningful if hasBeenSignaled() returns true. * - * @return integer + * @return int * * @throws RuntimeException In case --enable-sigchild is activated * @throws LogicException In case the process is not terminated @@ -587,7 +585,7 @@ class Process * * It always returns false on Windows. * - * @return Boolean + * @return bool * * @throws LogicException In case the process is not terminated * @@ -607,7 +605,7 @@ class Process * * It is only meaningful if hasBeenStopped() returns true. * - * @return integer + * @return int * * @throws LogicException In case the process is not terminated * @@ -625,7 +623,7 @@ class Process /** * Checks if the process is currently running. * - * @return Boolean true if the process is currently running, false otherwise + * @return bool true if the process is currently running, false otherwise */ public function isRunning() { @@ -641,7 +639,7 @@ class Process /** * Checks if the process has been started with no regard to the current state. * - * @return Boolean true if status is ready, false otherwise + * @return bool true if status is ready, false otherwise */ public function isStarted() { @@ -651,7 +649,7 @@ class Process /** * Checks if the process is terminated. * - * @return Boolean true if process is terminated, false otherwise + * @return bool true if process is terminated, false otherwise */ public function isTerminated() { @@ -677,10 +675,10 @@ class Process /** * Stops the process. * - * @param integer|float $timeout The timeout in seconds - * @param integer $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL + * @param int|float $timeout The timeout in seconds + * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL * - * @return integer The exit-code of the process + * @return int The exit-code of the process * * @throws RuntimeException if the process got signaled */ @@ -789,7 +787,7 @@ class Process * * To disable the timeout, set this value to null. * - * @param integer|float|null $timeout The timeout in seconds + * @param int|float|null $timeout The timeout in seconds * * @return self The current Process instance * @@ -807,7 +805,7 @@ class Process * * To disable the timeout, set this value to null. * - * @param integer|float|null $timeout The timeout in seconds + * @param int|float|null $timeout The timeout in seconds * * @return self The current Process instance. * @@ -823,13 +821,19 @@ class Process /** * Enables or disables the TTY mode. * - * @param boolean $tty True to enabled and false to disable + * @param bool $tty True to enabled and false to disable * * @return self The current Process instance + * + * @throws RuntimeException In case the TTY mode is not supported */ public function setTty($tty) { - $this->tty = (Boolean) $tty; + if (defined('PHP_WINDOWS_VERSION_BUILD') && $tty) { + throw new RuntimeException('TTY mode is not supported on Windows platform.'); + } + + $this->tty = (bool) $tty; return $this; } @@ -837,7 +841,7 @@ class Process /** * Checks if the TTY mode is enabled. * - * @return Boolean true if the TTY mode is enabled, false otherwise + * @return bool true if the TTY mode is enabled, false otherwise */ public function isTty() { @@ -928,9 +932,15 @@ class Process * @param string|null $stdin The new contents * * @return self The current Process instance + * + * @throws LogicException In case the process is running */ public function setStdin($stdin) { + if ($this->isRunning()) { + throw new LogicException('STDIN can not be set while the process is running.'); + } + $this->stdin = $stdin; return $this; @@ -965,7 +975,7 @@ class Process * * This is true by default. * - * @return Boolean + * @return bool */ public function getEnhanceWindowsCompatibility() { @@ -975,13 +985,13 @@ class Process /** * Sets whether or not Windows compatibility is enabled. * - * @param Boolean $enhance + * @param bool $enhance * * @return self The current Process instance */ public function setEnhanceWindowsCompatibility($enhance) { - $this->enhanceWindowsCompatibility = (Boolean) $enhance; + $this->enhanceWindowsCompatibility = (bool) $enhance; return $this; } @@ -989,7 +999,7 @@ class Process /** * Returns whether sigchild compatibility mode is activated or not. * - * @return Boolean + * @return bool */ public function getEnhanceSigchildCompatibility() { @@ -1003,13 +1013,13 @@ class Process * determine the success of a process when PHP has been compiled with * the --enable-sigchild option * - * @param Boolean $enhance + * @param bool $enhance * * @return self The current Process instance */ public function setEnhanceSigchildCompatibility($enhance) { - $this->enhanceSigchildCompatibility = (Boolean) $enhance; + $this->enhanceSigchildCompatibility = (bool) $enhance; return $this; } @@ -1094,7 +1104,7 @@ class Process /** * Updates the status of the process, reads pipes. * - * @param Boolean $blocking Whether to use a blocking read call. + * @param bool $blocking Whether to use a blocking read call. */ protected function updateStatus($blocking) { @@ -1115,7 +1125,7 @@ class Process /** * Returns whether PHP has been compiled with the '--enable-sigchild' option or not. * - * @return Boolean + * @return bool */ protected function isSigchildEnabled() { @@ -1136,7 +1146,7 @@ class Process /** * Validates and returns the filtered timeout. * - * @param integer|float|null $timeout + * @param int|float|null $timeout * * @return float|null */ @@ -1156,8 +1166,8 @@ class Process /** * Reads pipes, executes callback. * - * @param Boolean $blocking Whether to use blocking calls or not. - * @param Boolean $close Whether to close file handles or not. + * @param bool $blocking Whether to use blocking calls or not. + * @param bool $close Whether to close file handles or not. */ private function readPipes($blocking, $close) { @@ -1189,7 +1199,7 @@ class Process /** * Closes process resource, closes file handles, sets the exitcode. * - * @return Integer The exitcode + * @return int The exitcode */ private function close() { @@ -1234,10 +1244,10 @@ class Process /** * Sends a POSIX signal to the process. * - * @param integer $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php) - * @param Boolean $throwException Whether to throw exception in case signal failed + * @param int $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php) + * @param bool $throwException Whether to throw exception in case signal failed * - * @return Boolean True if the signal was sent successfully, false otherwise + * @return bool True if the signal was sent successfully, false otherwise * * @throws LogicException In case the process is not running * @throws RuntimeException In case --enable-sigchild is activated @@ -1275,7 +1285,7 @@ class Process /** * Ensures the process is running or terminated, throws a LogicException if the process has a not started. * - * @param $functionName The function name that was called. + * @param string $functionName The function name that was called. * * @throws LogicException If the process has not run. */ @@ -1289,7 +1299,7 @@ class Process /** * Ensures the process is terminated, throws a LogicException if the process has a status different than `terminated`. * - * @param $functionName The function name that was called. + * @param string $functionName The function name that was called. * * @throws LogicException If the process is not yet terminated. */ diff --git a/vendor/symfony/process/Symfony/Component/Process/ProcessBuilder.php b/vendor/symfony/process/Symfony/Component/Process/ProcessBuilder.php index b6168feb62..c9a77d4482 100644 --- a/vendor/symfony/process/Symfony/Component/Process/ProcessBuilder.php +++ b/vendor/symfony/process/Symfony/Component/Process/ProcessBuilder.php @@ -30,11 +30,23 @@ class ProcessBuilder private $inheritEnv = true; private $prefix = array(); + /** + * Constructor + * + * @param string[] $arguments An array of arguments + */ public function __construct(array $arguments = array()) { $this->arguments = $arguments; } + /** + * Creates a process builder instance. + * + * @param string[] $arguments An array of arguments + * + * @return ProcessBuilder + */ public static function create(array $arguments = array()) { return new static($arguments); @@ -71,7 +83,12 @@ class ProcessBuilder } /** - * @param array $arguments + * Sets the arguments of the process. + * + * Arguments must not be escaped. + * Previous arguments are removed. + * + * @param string[] $arguments * * @return ProcessBuilder */ @@ -82,6 +99,13 @@ class ProcessBuilder return $this; } + /** + * Sets the working directory. + * + * @param null|string $cwd The working directory + * + * @return ProcessBuilder + */ public function setWorkingDirectory($cwd) { $this->cwd = $cwd; @@ -89,6 +113,13 @@ class ProcessBuilder return $this; } + /** + * Sets whether environment variables will be inherited or not. + * + * @param bool $inheritEnv + * + * @return ProcessBuilder + */ public function inheritEnvironmentVariables($inheritEnv = true) { $this->inheritEnv = $inheritEnv; @@ -96,6 +127,17 @@ class ProcessBuilder return $this; } + /** + * Sets an environment variable + * + * Setting a variable overrides its previous value. Use `null` to unset a + * defined environment variable. + * + * @param string $name The variable name + * @param null|string $value The variable value + * + * @return ProcessBuilder + */ public function setEnv($name, $value) { $this->env[$name] = $value; @@ -110,6 +152,13 @@ class ProcessBuilder return $this; } + /** + * Sets the input of the process. + * + * @param string $stdin The input as a string + * + * @return ProcessBuilder + */ public function setInput($stdin) { $this->stdin = $stdin; @@ -147,6 +196,14 @@ class ProcessBuilder return $this; } + /** + * Adds a proc_open option. + * + * @param string $name The option name + * @param string $value The option value + * + * @return ProcessBuilder + */ public function setOption($name, $value) { $this->options[$name] = $value; @@ -154,6 +211,13 @@ class ProcessBuilder return $this; } + /** + * Creates a Process instance and returns it. + * + * @return Process + * + * @throws LogicException In case no arguments have been provided + */ public function getProcess() { if (0 === count($this->prefix) && 0 === count($this->arguments)) { diff --git a/vendor/symfony/process/Symfony/Component/Process/ProcessPipes.php b/vendor/symfony/process/Symfony/Component/Process/ProcessPipes.php index e6aabc5f99..f35d1c1287 100644 --- a/vendor/symfony/process/Symfony/Component/Process/ProcessPipes.php +++ b/vendor/symfony/process/Symfony/Component/Process/ProcessPipes.php @@ -26,17 +26,17 @@ class ProcessPipes private $fileHandles = array(); /** @var array */ private $readBytes = array(); - /** @var Boolean */ + /** @var bool */ private $useFiles; - /** @var Boolean */ + /** @var bool */ private $ttyMode; const CHUNK_SIZE = 16384; public function __construct($useFiles, $ttyMode) { - $this->useFiles = (Boolean) $useFiles; - $this->ttyMode = (Boolean) $ttyMode; + $this->useFiles = (bool) $useFiles; + $this->ttyMode = (bool) $ttyMode; // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big. // Workaround for this problem is to use temporary files instead of pipes on Windows platform. @@ -151,7 +151,7 @@ class ProcessPipes /** * Reads data in file handles and pipes. * - * @param Boolean $blocking Whether to use blocking calls or not. + * @param bool $blocking Whether to use blocking calls or not. * * @return array An array of read data indexed by their fd. */ @@ -163,7 +163,7 @@ class ProcessPipes /** * Reads data in file handles and pipes, closes them if EOF is reached. * - * @param Boolean $blocking Whether to use blocking calls or not. + * @param bool $blocking Whether to use blocking calls or not. * * @return array An array of read data indexed by their fd. */ @@ -175,21 +175,21 @@ class ProcessPipes /** * Returns if the current state has open file handles or pipes. * - * @return Boolean + * @return bool */ public function hasOpenHandles() { if (!$this->useFiles) { - return (Boolean) $this->pipes; + return (bool) $this->pipes; } - return (Boolean) $this->pipes && (Boolean) $this->fileHandles; + return (bool) $this->pipes && (bool) $this->fileHandles; } /** * Writes stdin data. * - * @param Boolean $blocking Whether to use blocking calls or not. + * @param bool $blocking Whether to use blocking calls or not. * @param string|null $stdin The data to write. */ public function write($blocking, $stdin) @@ -240,7 +240,7 @@ class ProcessPipes /** * Reads data in file handles. * - * @param Boolean $close Whether to close file handles or not. + * @param bool $close Whether to close file handles or not. * * @return array An array of read data indexed by their fd. */ @@ -276,8 +276,8 @@ class ProcessPipes /** * Reads data in file pipes streams. * - * @param Boolean $blocking Whether to use blocking calls or not. - * @param Boolean $close Whether to close file handles or not. + * @param bool $blocking Whether to use blocking calls or not. + * @param bool $close Whether to close file handles or not. * * @return array An array of read data indexed by their fd. */ @@ -333,7 +333,7 @@ class ProcessPipes /** * Returns true if a system call has been interrupted. * - * @return Boolean + * @return bool */ private function hasSystemCallBeenInterrupted() { diff --git a/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php b/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php index 2f41d7627d..9522bd402b 100644 --- a/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php +++ b/vendor/symfony/process/Symfony/Component/Process/Tests/AbstractProcessTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Process\Tests; use Symfony\Component\Process\Exception\ProcessTimedOutException; +use Symfony\Component\Process\Exception\LogicException; use Symfony\Component\Process\Process; use Symfony\Component\Process\Exception\RuntimeException; use Symfony\Component\Process\ProcessPipes; @@ -157,6 +158,20 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedLength, strlen($p->getErrorOutput())); } + public function testSetStdinWhileRunningThrowsAnException() + { + $process = $this->getProcess('php -r "usleep(500000);"'); + $process->start(); + try { + $process->setStdin('foobar'); + $process->stop(); + $this->fail('A LogicException should have been raised.'); + } catch (LogicException $e) { + $this->assertEquals('STDIN can not be set while the process is running.', $e->getMessage()); + } + $process->stop(); + } + public function chainedCommandsOutputProvider() { if (defined('PHP_WINDOWS_VERSION_BUILD')) { @@ -270,7 +285,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase } $process = $this->getProcess('echo "foo" >> /dev/null && php -r "usleep(100000);"'); - $process->setTTY(true); + $process->setTty(true); $process->start(); $this->assertTrue($process->isRunning()); $process->wait(); @@ -285,12 +300,24 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase } $process = $this->getProcess('echo "foo" >> /dev/null'); - $process->setTTY(true); + $process->setTty(true); $process->run(); $this->assertTrue($process->isSuccessful()); } + public function testTTYInWindowsEnvironment() + { + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->markTestSkipped('This test is for Windows platform only'); + } + + $process = $this->getProcess('echo "foo" >> /dev/null'); + $process->setTty(false); + $this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'TTY mode is not supported on Windows platform.'); + $process->setTty(true); + } + public function testExitCodeTextIsNullWhenExitCodeIsNull() { $process = $this->getProcess(''); @@ -837,7 +864,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase * @param null $cwd * @param array $env * @param null $stdin - * @param integer $timeout + * @param int $timeout * @param array $options * * @return Process diff --git a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessor.php b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessor.php index d48891ef27..0e400f4380 100644 --- a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessor.php +++ b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessor.php @@ -26,12 +26,12 @@ class PropertyAccessor implements PropertyAccessorInterface const IS_REF = 1; /** - * @var Boolean + * @var bool */ private $magicCall; /** - * @var Boolean + * @var bool */ private $throwExceptionOnInvalidIndex; @@ -110,7 +110,7 @@ class PropertyAccessor implements PropertyAccessorInterface * * @param object|array $objectOrArray The object or array to read from * @param PropertyPathInterface $propertyPath The property path to read - * @param integer $lastIndex The index up to which should be read + * @param int $lastIndex The index up to which should be read * * @return array The values read in the path. * @@ -155,7 +155,7 @@ class PropertyAccessor implements PropertyAccessorInterface * Reads a key from an array-like structure. * * @param \ArrayAccess|array $array The array or \ArrayAccess object to read from - * @param string|integer $index The key to read + * @param string|int $index The key to read * * @return mixed The value of the key * @@ -267,7 +267,7 @@ class PropertyAccessor implements PropertyAccessorInterface * Sets the value of the property at the given index in the path * * @param \ArrayAccess|array $array An array or \ArrayAccess object to write to - * @param string|integer $index The index to write at + * @param string|int $index The index to write at * @param mixed $value The value to write * * @throws NoSuchPropertyException If the array does not implement \ArrayAccess or it is not an array @@ -428,8 +428,6 @@ class PropertyAccessor implements PropertyAccessorInterface )); } } - - return null; } /** @@ -437,9 +435,9 @@ class PropertyAccessor implements PropertyAccessorInterface * * @param \ReflectionClass $class The class of the method * @param string $methodName The method name - * @param integer $parameters The number of parameters + * @param int $parameters The number of parameters * - * @return Boolean Whether the method is public and has $parameters + * @return bool Whether the method is public and has $parameters * required parameters */ private function isAccessible(\ReflectionClass $class, $methodName, $parameters) diff --git a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessorBuilder.php b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessorBuilder.php index 50b872f3a3..253c064dc0 100644 --- a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessorBuilder.php +++ b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyAccessorBuilder.php @@ -19,12 +19,12 @@ namespace Symfony\Component\PropertyAccess; class PropertyAccessorBuilder { /** - * @var Boolean + * @var bool */ private $magicCall = false; /** - * @var Boolean + * @var bool */ private $throwExceptionOnInvalidIndex = false; @@ -53,7 +53,7 @@ class PropertyAccessorBuilder } /** - * @return Boolean true if the use of "__call" by the PropertyAccessor is enabled + * @return bool true if the use of "__call" by the PropertyAccessor is enabled */ public function isMagicCallEnabled() { @@ -85,7 +85,7 @@ class PropertyAccessorBuilder } /** - * @return Boolean true is exceptions in read context for array is enabled + * @return bool true is exceptions in read context for array is enabled */ public function isExceptionOnInvalidIndexEnabled() { diff --git a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPath.php b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPath.php index a458de2c89..63a9d25638 100644 --- a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPath.php +++ b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPath.php @@ -42,7 +42,7 @@ class PropertyPath implements \IteratorAggregate, PropertyPathInterface /** * The number of elements in the property path - * @var integer + * @var int */ private $length; @@ -155,7 +155,7 @@ class PropertyPath implements \IteratorAggregate, PropertyPathInterface public function getParent() { if ($this->length <= 1) { - return null; + return; } $parent = clone $this; diff --git a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathBuilder.php b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathBuilder.php index f4eb0fb93f..af2c46f904 100644 --- a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathBuilder.php +++ b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathBuilder.php @@ -45,9 +45,9 @@ class PropertyPathBuilder * Appends a (sub-) path to the current path. * * @param PropertyPathInterface|string $path The path to append. - * @param integer $offset The offset where the appended + * @param int $offset The offset where the appended * piece starts in $path. - * @param integer $length The length of the appended piece. + * @param int $length The length of the appended piece. * If 0, the full path is appended. */ public function append($path, $offset = 0, $length = 0) @@ -93,8 +93,8 @@ class PropertyPathBuilder /** * Removes elements from the current path. * - * @param integer $offset The offset at which to remove - * @param integer $length The length of the removed piece + * @param int $offset The offset at which to remove + * @param int $length The length of the removed piece * * @throws OutOfBoundsException if offset is invalid */ @@ -110,12 +110,12 @@ class PropertyPathBuilder /** * Replaces a sub-path by a different (sub-) path. * - * @param integer $offset The offset at which to replace. - * @param integer $length The length of the piece to replace. + * @param int $offset The offset at which to replace. + * @param int $length The length of the piece to replace. * @param PropertyPathInterface|string $path The path to insert. - * @param integer $pathOffset The offset where the inserted piece + * @param int $pathOffset The offset where the inserted piece * starts in $path. - * @param integer $pathLength The length of the inserted piece. + * @param int $pathLength The length of the inserted piece. * If 0, the full path is inserted. * * @throws OutOfBoundsException If the offset is invalid @@ -147,7 +147,7 @@ class PropertyPathBuilder /** * Replaces a property element by an index element. * - * @param integer $offset The offset at which to replace + * @param int $offset The offset at which to replace * @param string $name The new name of the element. Optional. * * @throws OutOfBoundsException If the offset is invalid @@ -168,7 +168,7 @@ class PropertyPathBuilder /** * Replaces an index element by a property element. * - * @param integer $offset The offset at which to replace + * @param int $offset The offset at which to replace * @param string $name The new name of the element. Optional. * * @throws OutOfBoundsException If the offset is invalid @@ -189,7 +189,7 @@ class PropertyPathBuilder /** * Returns the length of the current path. * - * @return integer The path length + * @return int The path length */ public function getLength() { @@ -235,9 +235,9 @@ class PropertyPathBuilder * removed at $offset and another chunk of length $insertionLength * can be inserted. * - * @param integer $offset The offset where the removed chunk starts - * @param integer $cutLength The length of the removed chunk - * @param integer $insertionLength The length of the inserted chunk + * @param int $offset The offset where the removed chunk starts + * @param int $cutLength The length of the removed chunk + * @param int $insertionLength The length of the inserted chunk */ private function resize($offset, $cutLength, $insertionLength) { diff --git a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathInterface.php b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathInterface.php index 95f34ffae6..4708a2decc 100644 --- a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathInterface.php +++ b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathInterface.php @@ -28,7 +28,7 @@ interface PropertyPathInterface extends \Traversable /** * Returns the length of the property path, i.e. the number of elements. * - * @return integer The path length + * @return int The path length */ public function getLength(); @@ -54,7 +54,7 @@ interface PropertyPathInterface extends \Traversable /** * Returns the element at the given index in the property path * - * @param integer $index The index key + * @param int $index The index key * * @return string A property or index name * @@ -65,9 +65,9 @@ interface PropertyPathInterface extends \Traversable /** * Returns whether the element at the given index is a property * - * @param integer $index The index in the property path + * @param int $index The index in the property path * - * @return Boolean Whether the element at this index is a property + * @return bool Whether the element at this index is a property * * @throws Exception\OutOfBoundsException If the offset is invalid */ @@ -76,9 +76,9 @@ interface PropertyPathInterface extends \Traversable /** * Returns whether the element at the given index is an array index * - * @param integer $index The index in the property path + * @param int $index The index in the property path * - * @return Boolean Whether the element at this index is an array index + * @return bool Whether the element at this index is an array index * * @throws Exception\OutOfBoundsException If the offset is invalid */ diff --git a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathIteratorInterface.php b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathIteratorInterface.php index cb43f8d7ea..79b1bbfe82 100644 --- a/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathIteratorInterface.php +++ b/vendor/symfony/property-access/Symfony/Component/PropertyAccess/PropertyPathIteratorInterface.php @@ -20,7 +20,7 @@ interface PropertyPathIteratorInterface extends \Iterator, \SeekableIterator * Returns whether the current element in the property path is an array * index. * - * @return Boolean + * @return bool */ public function isIndex(); @@ -28,7 +28,7 @@ interface PropertyPathIteratorInterface extends \Iterator, \SeekableIterator * Returns whether the current element in the property path is a property * name. * - * @return Boolean + * @return bool */ public function isProperty(); } diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php b/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php index ebda0971c5..90521c0be8 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php @@ -15,6 +15,7 @@ namespace Symfony\Component\Routing\Annotation; * Annotation class for @Route(). * * @Annotation + * @Target({"CLASS", "METHOD"}) * * @author Fabien Potencier */ diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php b/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php index 8c25f34b12..3cf7edfa7b 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php @@ -41,7 +41,7 @@ interface ConfigurableRequirementsInterface * Enables or disables the exception on incorrect parameters. * Passing null will deactivate the requirements check completely. * - * @param Boolean|null $enabled + * @param bool|null $enabled */ public function setStrictRequirements($enabled); @@ -49,7 +49,7 @@ interface ConfigurableRequirementsInterface * Returns whether to throw an exception on incorrect parameters. * Null means the requirements check is deactivated completely. * - * @return Boolean|null + * @return bool|null */ public function isStrictRequirements(); } diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php b/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php index ac64abc6aa..c827ca7d66 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php @@ -40,7 +40,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt protected $context; /** - * @var Boolean|null + * @var bool|null */ protected $strictRequirements = true; @@ -114,7 +114,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt */ public function setStrictRequirements($enabled) { - $this->strictRequirements = null === $enabled ? null : (Boolean) $enabled; + $this->strictRequirements = null === $enabled ? null : (bool) $enabled; } /** @@ -126,7 +126,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt } /** - * {@inheritDoc} + * {@inheritdoc} */ public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH) { @@ -171,7 +171,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt $this->logger->error($message); } - return null; + return; } $url = $token[1].$mergedParams[$token[3]].$url; @@ -224,7 +224,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt $this->logger->error($message); } - return null; + return; } $routeHost = $token[1].$mergedParams[$token[3]].$routeHost; diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php b/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php index 8e3b2778b9..b89966d08c 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php @@ -72,7 +72,7 @@ interface UrlGeneratorInterface extends RequestContextAwareInterface * * @param string $name The name of the route * @param mixed $parameters An array of parameters - * @param Boolean|string $referenceType The type of reference to be generated (one of the constants) + * @param bool|string $referenceType The type of reference to be generated (one of the constants) * * @return string The generated URL * diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php b/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php index af70a888b8..eb79a6424c 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php @@ -68,7 +68,7 @@ abstract class AnnotationClassLoader implements LoaderInterface protected $routeAnnotationClass = 'Symfony\\Component\\Routing\\Annotation\\Route'; /** - * @var integer + * @var int */ protected $defaultRouteIndex = 0; diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php index 612ac0d25a..25e8e24534 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php @@ -116,7 +116,7 @@ class DumperCollection implements \IteratorAggregate * * @param string $name The attribute name * - * @return Boolean true if the attribute is defined, false otherwise + * @return bool true if the attribute is defined, false otherwise */ public function hasAttribute($name) { diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php index 84cc353515..19e74b0713 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php @@ -81,7 +81,7 @@ EOF; /** * Generates the code for the match method implementing UrlMatcherInterface. * - * @param Boolean $supportsRedirections Whether redirections are supported by the base class + * @param bool $supportsRedirections Whether redirections are supported by the base class * * @return string Match method as PHP code */ @@ -108,7 +108,7 @@ EOF; * Generates PHP code to match a RouteCollection with all its routes. * * @param RouteCollection $routes A RouteCollection instance - * @param Boolean $supportsRedirections Whether redirections are supported by the base class + * @param bool $supportsRedirections Whether redirections are supported by the base class * * @return string PHP code */ @@ -149,7 +149,7 @@ EOF; * Generates PHP code recursively to match a tree of routes * * @param DumperPrefixCollection $collection A DumperPrefixCollection instance - * @param Boolean $supportsRedirections Whether redirections are supported by the base class + * @param bool $supportsRedirections Whether redirections are supported by the base class * @param string $parentPrefix Prefix of the parent collection * * @return string PHP code @@ -189,7 +189,7 @@ EOF; * * @param Route $route A Route instance * @param string $name The name of the Route - * @param Boolean $supportsRedirections Whether redirections are supported by the base class + * @param bool $supportsRedirections Whether redirections are supported by the base class * @param string|null $parentPrefix The prefix of the parent collection used to optimize the code * * @return string PHP code diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php index 56fcb604cc..3435a572a1 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php @@ -46,7 +46,7 @@ abstract class RedirectableUrlMatcher extends UrlMatcher implements Redirectable } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function handleRouteRequirements($pathinfo, $name, Route $route) { diff --git a/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php b/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php index cb53696896..93fd09ad5b 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php @@ -43,8 +43,8 @@ class RequestContext * @param string $method The HTTP method * @param string $host The HTTP host name * @param string $scheme The HTTP scheme - * @param integer $httpPort The HTTP port - * @param integer $httpsPort The HTTPS port + * @param int $httpPort The HTTP port + * @param int $httpsPort The HTTPS port * @param string $path The path * @param string $queryString The query string * @@ -293,7 +293,7 @@ class RequestContext * * @param string $name A parameter name * - * @return Boolean true if the parameter value is set, false otherwise + * @return bool true if the parameter value is set, false otherwise */ public function hasParameter($name) { diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Route.php b/vendor/symfony/routing/Symfony/Component/Routing/Route.php index aac654b01e..65c00d8f9e 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Route.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Route.php @@ -368,7 +368,7 @@ class Route implements \Serializable * * @param string $name An option name * - * @return Boolean true if the option is set, false otherwise + * @return bool true if the option is set, false otherwise */ public function hasOption($name) { @@ -437,7 +437,7 @@ class Route implements \Serializable * * @param string $name A variable name * - * @return Boolean true if the default value is set, false otherwise + * @return bool true if the default value is set, false otherwise */ public function hasDefault($name) { @@ -524,7 +524,7 @@ class Route implements \Serializable * * @param string $key A variable name * - * @return Boolean true if a requirement is specified, false otherwise + * @return bool true if a requirement is specified, false otherwise */ public function hasRequirement($key) { diff --git a/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php b/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php index 7ced4b3af8..9234b42b34 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php @@ -29,7 +29,7 @@ class RouteCompiler implements RouteCompilerInterface const SEPARATORS = '/,;.:-_~+*=@|'; /** - * {@inheritDoc} + * {@inheritdoc} * * @throws \LogicException If a variable is referenced more than once * @throws \DomainException If a variable name is numeric because PHP raises an error for such @@ -196,8 +196,8 @@ class RouteCompiler implements RouteCompilerInterface * Computes the regexp used to match a specific token. It can be static text or a subpattern. * * @param array $tokens The route tokens - * @param integer $index The index of the current token - * @param integer $firstOptional The index of the first optional token + * @param int $index The index of the current token + * @param int $firstOptional The index of the first optional token * * @return string The regexp pattern for a single token */ diff --git a/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php b/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php index 2810cbad51..38127a09f6 100644 --- a/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php +++ b/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php @@ -40,7 +40,7 @@ class ApacheUrlMatcherTest extends \PHPUnit_Framework_TestCase $_SERVER = $server; - $result = $matcher->match($pathinfo, $server); + $result = $matcher->match($pathinfo); $this->assertSame(var_export($expect, true), var_export($result, true)); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/AclProvider.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/AclProvider.php index 5d45655c21..c422c2d0a9 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/AclProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/AclProvider.php @@ -11,7 +11,7 @@ namespace Symfony\Component\Security\Acl\Dbal; -use Doctrine\DBAL\Driver\Connection; +use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver\Statement; use Symfony\Component\Security\Acl\Model\AclInterface; use Symfony\Component\Security\Acl\Domain\Acl; @@ -38,11 +38,22 @@ class AclProvider implements AclProviderInterface { const MAX_BATCH_SIZE = 30; + /** + * @var AclCacheInterface|null + */ protected $cache; + + /** + * @var Connection + */ protected $connection; protected $loadedAces = array(); protected $loadedAcls = array(); protected $options; + + /** + * @var PermissionGrantingStrategyInterface + */ private $permissionGrantingStrategy; /** @@ -62,7 +73,7 @@ class AclProvider implements AclProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function findChildren(ObjectIdentityInterface $parentOid, $directChildrenOnly = false) { @@ -77,7 +88,7 @@ class AclProvider implements AclProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function findAcl(ObjectIdentityInterface $oid, array $sids = array()) { @@ -85,7 +96,7 @@ class AclProvider implements AclProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function findAcls(array $oids, array $sids = array()) { @@ -316,7 +327,7 @@ SELECTCLAUSE; * object identities. * * @param ObjectIdentityInterface $oid - * @param Boolean $directChildrenOnly + * @param bool $directChildrenOnly * @return string */ protected function getFindChildrenSql(ObjectIdentityInterface $oid, $directChildrenOnly) @@ -372,7 +383,7 @@ QUERY; * Returns the primary key of the passed object identity. * * @param ObjectIdentityInterface $oid - * @return integer + * @return int */ final protected function retrieveObjectIdentityPrimaryKey(ObjectIdentityInterface $oid) { @@ -552,7 +563,7 @@ QUERY; $oidCache[$oidLookupKey] = new ObjectIdentity($objectIdentifier, $classType); } - $acl = new Acl((integer) $aclId, $oidCache[$oidLookupKey], $permissionGrantingStrategy, $emptyArray, !!$entriesInheriting); + $acl = new Acl((int) $aclId, $oidCache[$oidLookupKey], $permissionGrantingStrategy, $emptyArray, !!$entriesInheriting); // keep a local, and global reference to this ACL $loadedAcls[$classType][$objectIdentifier] = $acl; @@ -594,9 +605,9 @@ QUERY; } if (null === $fieldName) { - $loadedAces[$aceId] = new Entry((integer) $aceId, $acl, $sids[$key], $grantingStrategy, (integer) $mask, !!$granting, !!$auditFailure, !!$auditSuccess); + $loadedAces[$aceId] = new Entry((int) $aceId, $acl, $sids[$key], $grantingStrategy, (int) $mask, !!$granting, !!$auditFailure, !!$auditSuccess); } else { - $loadedAces[$aceId] = new FieldEntry((integer) $aceId, $acl, $fieldName, $sids[$key], $grantingStrategy, (integer) $mask, !!$granting, !!$auditFailure, !!$auditSuccess); + $loadedAces[$aceId] = new FieldEntry((int) $aceId, $acl, $fieldName, $sids[$key], $grantingStrategy, (int) $mask, !!$granting, !!$auditFailure, !!$auditSuccess); } } $ace = $loadedAces[$aceId]; diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php index 29d3cfd640..42803acc07 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Security\Acl\Dbal; use Doctrine\Common\PropertyChangedListener; -use Doctrine\DBAL\Driver\Connection; +use Doctrine\DBAL\Connection; use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity; use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity; use Symfony\Component\Security\Acl\Exception\AclAlreadyExistsException; @@ -36,7 +36,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf private $propertyChanges; /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct(Connection $connection, PermissionGrantingStrategyInterface $permissionGrantingStrategy, array $options, AclCacheInterface $cache = null) { @@ -46,7 +46,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf } /** - * {@inheritDoc} + * {@inheritdoc} */ public function createAcl(ObjectIdentityInterface $oid) { @@ -73,7 +73,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf } /** - * {@inheritDoc} + * {@inheritdoc} */ public function deleteAcl(ObjectIdentityInterface $oid) { @@ -109,7 +109,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf } /** - * {@inheritDoc} + * {@inheritdoc} */ public function findAcls(array $oids, array $sids = array()) { @@ -216,7 +216,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateAcl(MutableAclInterface $acl) { @@ -354,7 +354,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf /** * Constructs the SQL for deleting access control entries. * - * @param integer $oidPK + * @param int $oidPK * @return string */ protected function getDeleteAccessControlEntriesSql($oidPK) @@ -369,7 +369,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf /** * Constructs the SQL for deleting a specific ACE. * - * @param integer $acePK + * @param int $acePK * @return string */ protected function getDeleteAccessControlEntrySql($acePK) @@ -384,7 +384,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf /** * Constructs the SQL for deleting an object identity. * - * @param integer $pk + * @param int $pk * @return string */ protected function getDeleteObjectIdentitySql($pk) @@ -399,7 +399,7 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf /** * Constructs the SQL for deleting relation entries. * - * @param integer $pk + * @param int $pk * @return string */ protected function getDeleteObjectIdentityRelationsSql($pk) @@ -414,16 +414,16 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf /** * Constructs the SQL for inserting an ACE. * - * @param integer $classId - * @param integer|null $objectIdentityId + * @param int $classId + * @param int|null $objectIdentityId * @param string|null $field - * @param integer $aceOrder - * @param integer $securityIdentityId + * @param int $aceOrder + * @param int $securityIdentityId * @param string $strategy - * @param integer $mask - * @param Boolean $granting - * @param Boolean $auditSuccess - * @param Boolean $auditFailure + * @param int $mask + * @param bool $granting + * @param bool $auditSuccess + * @param bool $auditFailure * @return string */ protected function getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $aceOrder, $securityIdentityId, $strategy, $mask, $granting, $auditSuccess, $auditFailure) @@ -478,8 +478,8 @@ QUERY; /** * Constructs the SQL for inserting a relation entry. * - * @param integer $objectIdentityId - * @param integer $ancestorId + * @param int $objectIdentityId + * @param int $ancestorId * @return string */ protected function getInsertObjectIdentityRelationSql($objectIdentityId, $ancestorId) @@ -496,8 +496,8 @@ QUERY; * Constructs the SQL for inserting an object identity. * * @param string $identifier - * @param integer $classId - * @param Boolean $entriesInheriting + * @param int $classId + * @param bool $entriesInheriting * @return string */ protected function getInsertObjectIdentitySql($identifier, $classId, $entriesInheriting) @@ -546,10 +546,10 @@ QUERY; /** * Constructs the SQL for selecting an ACE. * - * @param integer $classId - * @param integer $oid + * @param int $classId + * @param int $oid * @param string $field - * @param integer $order + * @param int $order * @return string */ protected function getSelectAccessControlEntryIdSql($classId, $oid, $field, $order) @@ -614,7 +614,7 @@ QUERY; /** * Constructs the SQL for updating an object identity. * - * @param integer $pk + * @param int $pk * @param array $changes * @throws \InvalidArgumentException * @return string @@ -636,7 +636,7 @@ QUERY; /** * Constructs the SQL for updating an ACE. * - * @param integer $pk + * @param int $pk * @param array $sets * @throws \InvalidArgumentException * @return string @@ -673,7 +673,7 @@ QUERY; * If the type does not yet exist in the database, it will be created. * * @param string $classType - * @return integer + * @return int */ private function createOrRetrieveClassId($classType) { @@ -693,7 +693,7 @@ QUERY; * created. * * @param SecurityIdentityInterface $sid - * @return integer + * @return int */ private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) { @@ -709,7 +709,7 @@ QUERY; /** * Deletes all ACEs for the given object identity primary key. * - * @param integer $oidPK + * @param int $oidPK */ private function deleteAccessControlEntries($oidPK) { @@ -719,7 +719,7 @@ QUERY; /** * Deletes the object identity from the database. * - * @param integer $pk + * @param int $pk */ private function deleteObjectIdentity($pk) { @@ -729,7 +729,7 @@ QUERY; /** * Deletes all entries from the relations table from the database. * - * @param integer $pk + * @param int $pk */ private function deleteObjectIdentityRelations($pk) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Acl.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Acl.php index dd3e8d4f51..5be58318f1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Acl.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Acl.php @@ -49,11 +49,11 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged /** * Constructor * - * @param integer $id + * @param int $id * @param ObjectIdentityInterface $objectIdentity * @param PermissionGrantingStrategyInterface $permissionGrantingStrategy * @param array $loadedSids - * @param Boolean $entriesInheriting + * @param bool $entriesInheriting */ public function __construct($id, ObjectIdentityInterface $objectIdentity, PermissionGrantingStrategyInterface $permissionGrantingStrategy, array $loadedSids = array(), $entriesInheriting) { @@ -75,7 +75,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function deleteClassAce($index) { @@ -83,7 +83,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function deleteClassFieldAce($index, $field) { @@ -91,7 +91,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function deleteObjectAce($index) { @@ -99,7 +99,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function deleteObjectFieldAce($index, $field) { @@ -107,7 +107,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getClassAces() { @@ -115,7 +115,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getClassFieldAces($field) { @@ -123,7 +123,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getObjectAces() { @@ -131,7 +131,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getObjectFieldAces($field) { @@ -139,7 +139,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getId() { @@ -147,7 +147,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getObjectIdentity() { @@ -155,7 +155,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getParentAcl() { @@ -163,7 +163,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function insertClassAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null) { @@ -171,7 +171,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function insertClassFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null) { @@ -179,7 +179,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function insertObjectAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null) { @@ -187,7 +187,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function insertObjectFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null) { @@ -195,7 +195,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isEntriesInheriting() { @@ -203,7 +203,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isFieldGranted($field, array $masks, array $securityIdentities, $administrativeMode = false) { @@ -211,7 +211,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isGranted(array $masks, array $securityIdentities, $administrativeMode = false) { @@ -219,7 +219,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isSidLoaded($sids) { @@ -291,7 +291,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setEntriesInheriting($boolean) { @@ -302,7 +302,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setParentAcl(AclInterface $acl = null) { @@ -317,7 +317,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateClassAce($index, $mask, $strategy = null) { @@ -325,7 +325,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateClassFieldAce($index, $field, $mask, $strategy = null) { @@ -333,7 +333,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateObjectAce($index, $mask, $strategy = null) { @@ -341,7 +341,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateObjectFieldAce($index, $field, $mask, $strategy = null) { @@ -349,7 +349,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateClassAuditing($index, $auditSuccess, $auditFailure) { @@ -357,7 +357,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateClassFieldAuditing($index, $field, $auditSuccess, $auditFailure) { @@ -369,7 +369,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateObjectAuditing($index, $auditSuccess, $auditFailure) { @@ -377,7 +377,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged } /** - * {@inheritDoc} + * {@inheritdoc} */ public function updateObjectFieldAuditing($index, $field, $auditSuccess, $auditFailure) { @@ -392,7 +392,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Deletes an ACE * * @param string $property - * @param integer $index + * @param int $index * @throws \OutOfBoundsException */ private function deleteAce($property, $index) @@ -416,7 +416,7 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Deletes a field-based ACE * * @param string $property - * @param integer $index + * @param int $index * @param string $field * @throws \OutOfBoundsException */ @@ -441,10 +441,10 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Inserts an ACE * * @param string $property - * @param integer $index - * @param integer $mask + * @param int $index + * @param int $mask * @param SecurityIdentityInterface $sid - * @param Boolean $granting + * @param bool $granting * @param string $strategy * @throws \OutOfBoundsException * @throws \InvalidArgumentException @@ -489,11 +489,11 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Inserts a field-based ACE * * @param string $property - * @param integer $index + * @param int $index * @param string $field - * @param integer $mask + * @param int $mask * @param SecurityIdentityInterface $sid - * @param Boolean $granting + * @param bool $granting * @param string $strategy * @throws \InvalidArgumentException * @throws \OutOfBoundsException @@ -546,8 +546,8 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Updates an ACE * * @param string $property - * @param integer $index - * @param integer $mask + * @param int $index + * @param int $mask * @param string $strategy * @throws \OutOfBoundsException */ @@ -573,9 +573,9 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Updates auditing for an ACE * * @param array &$aces - * @param integer $index - * @param Boolean $auditSuccess - * @param Boolean $auditFailure + * @param int $index + * @param bool $auditSuccess + * @param bool $auditFailure * @throws \OutOfBoundsException */ private function updateAuditing(array &$aces, $index, $auditSuccess, $auditFailure) @@ -599,9 +599,9 @@ class Acl implements AuditableAclInterface, NotifyPropertyChanged * Updates a field-based ACE * * @param string $property - * @param integer $index + * @param int $index * @param string $field - * @param integer $mask + * @param int $mask * @param string $strategy * @throws \InvalidArgumentException * @throws \OutOfBoundsException diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/AuditLogger.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/AuditLogger.php index 8174873531..feb2c42725 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/AuditLogger.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/AuditLogger.php @@ -25,7 +25,7 @@ abstract class AuditLogger implements AuditLoggerInterface /** * Performs some checks if logging was requested * - * @param Boolean $granted + * @param bool $granted * @param EntryInterface $ace */ public function logIfNeeded($granted, EntryInterface $ace) @@ -44,7 +44,7 @@ abstract class AuditLogger implements AuditLoggerInterface /** * This method is only called when logging is needed * - * @param Boolean $granted + * @param bool $granted * @param EntryInterface $ace */ abstract protected function doLog($granted, EntryInterface $ace); diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php index bfc5452a4c..9e14af5652 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php @@ -51,7 +51,7 @@ class DoctrineAclCache implements AclCacheInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function clearCache() { @@ -59,7 +59,7 @@ class DoctrineAclCache implements AclCacheInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function evictFromCacheById($aclId) { @@ -77,7 +77,7 @@ class DoctrineAclCache implements AclCacheInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function evictFromCacheByIdentity(ObjectIdentityInterface $oid) { @@ -90,40 +90,40 @@ class DoctrineAclCache implements AclCacheInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getFromCacheById($aclId) { $lookupKey = $this->getAliasKeyForIdentity($aclId); if (!$this->cache->contains($lookupKey)) { - return null; + return; } $key = $this->cache->fetch($lookupKey); if (!$this->cache->contains($key)) { $this->cache->delete($lookupKey); - return null; + return; } return $this->unserializeAcl($this->cache->fetch($key)); } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getFromCacheByIdentity(ObjectIdentityInterface $oid) { $key = $this->getDataKeyByIdentity($oid); if (!$this->cache->contains($key)) { - return null; + return; } return $this->unserializeAcl($this->cache->fetch($key)); } /** - * {@inheritDoc} + * {@inheritdoc} */ public function putInCache(AclInterface $acl) { @@ -154,7 +154,7 @@ class DoctrineAclCache implements AclCacheInterface $parentAcl = $this->getFromCacheById($parentId); if (null === $parentAcl) { - return null; + return; } $acl->setParentAcl($parentAcl); diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Entry.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Entry.php index 42449c4462..b5eb28b179 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Entry.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/Entry.php @@ -34,14 +34,14 @@ class Entry implements AuditableEntryInterface /** * Constructor * - * @param integer $id + * @param int $id * @param AclInterface $acl * @param SecurityIdentityInterface $sid * @param string $strategy - * @param integer $mask - * @param Boolean $granting - * @param Boolean $auditFailure - * @param Boolean $auditSuccess + * @param int $mask + * @param bool $granting + * @param bool $auditFailure + * @param bool $auditSuccess */ public function __construct($id, AclInterface $acl, SecurityIdentityInterface $sid, $strategy, $mask, $granting, $auditFailure, $auditSuccess) { @@ -56,7 +56,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getAcl() { @@ -64,7 +64,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMask() { @@ -72,7 +72,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getId() { @@ -80,7 +80,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getSecurityIdentity() { @@ -88,7 +88,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getStrategy() { @@ -96,7 +96,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isAuditFailure() { @@ -104,7 +104,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isAuditSuccess() { @@ -112,7 +112,7 @@ class Entry implements AuditableEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isGranting() { @@ -125,7 +125,7 @@ class Entry implements AuditableEntryInterface * Do never call this method directly. Use the respective methods on the * AclInterface instead. * - * @param Boolean $boolean + * @param bool $boolean */ public function setAuditFailure($boolean) { @@ -138,7 +138,7 @@ class Entry implements AuditableEntryInterface * Do never call this method directly. Use the respective methods on the * AclInterface instead. * - * @param Boolean $boolean + * @param bool $boolean */ public function setAuditSuccess($boolean) { @@ -151,7 +151,7 @@ class Entry implements AuditableEntryInterface * Do never call this method directly. Use the respective methods on the * AclInterface instead. * - * @param integer $mask + * @param int $mask */ public function setMask($mask) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/FieldEntry.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/FieldEntry.php index f05736754e..2edc33ddf6 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/FieldEntry.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/FieldEntry.php @@ -27,15 +27,15 @@ class FieldEntry extends Entry implements FieldEntryInterface /** * Constructor * - * @param integer $id + * @param int $id * @param AclInterface $acl * @param string $field * @param SecurityIdentityInterface $sid * @param string $strategy - * @param integer $mask - * @param Boolean $granting - * @param Boolean $auditFailure - * @param Boolean $auditSuccess + * @param int $mask + * @param bool $granting + * @param bool $auditFailure + * @param bool $auditSuccess */ public function __construct($id, AclInterface $acl, $field, SecurityIdentityInterface $sid, $strategy, $mask, $granting, $auditFailure, $auditSuccess) { @@ -45,7 +45,7 @@ class FieldEntry extends Entry implements FieldEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getField() { @@ -53,7 +53,7 @@ class FieldEntry extends Entry implements FieldEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function serialize() { @@ -64,7 +64,7 @@ class FieldEntry extends Entry implements FieldEntryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function unserialize($serialized) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentity.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentity.php index d7d5f842c1..cf10330649 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentity.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentity.php @@ -74,7 +74,7 @@ final class ObjectIdentity implements ObjectIdentityInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getIdentifier() { @@ -82,7 +82,7 @@ final class ObjectIdentity implements ObjectIdentityInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getType() { @@ -90,7 +90,7 @@ final class ObjectIdentity implements ObjectIdentityInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function equals(ObjectIdentityInterface $identity) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php index acd3b2c770..fc66856e3b 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php @@ -22,14 +22,14 @@ use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterfac class ObjectIdentityRetrievalStrategy implements ObjectIdentityRetrievalStrategyInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getObjectIdentity($domainObject) { try { return ObjectIdentity::fromDomainObject($domainObject); } catch (InvalidDomainObjectException $failed) { - return null; + return; } } } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php index d50584308c..0ca078534c 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php @@ -42,7 +42,7 @@ class PermissionGrantingStrategy implements PermissionGrantingStrategyInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isGranted(AclInterface $acl, array $masks, array $sids, $administrativeMode = false) { @@ -74,7 +74,7 @@ class PermissionGrantingStrategy implements PermissionGrantingStrategyInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isFieldGranted(AclInterface $acl, $field, array $masks, array $sids, $administrativeMode = false) { @@ -128,9 +128,9 @@ class PermissionGrantingStrategy implements PermissionGrantingStrategyInterface * @param EntryInterface[] $aces An array of ACE to check against * @param array $masks An array of permission masks * @param SecurityIdentityInterface[] $sids An array of SecurityIdentityInterface implementations - * @param Boolean $administrativeMode True turns off audit logging + * @param bool $administrativeMode True turns off audit logging * - * @return Boolean true, or false; either granting, or denying access respectively. + * @return bool true, or false; either granting, or denying access respectively. * * @throws NoAceFoundException */ @@ -188,10 +188,10 @@ class PermissionGrantingStrategy implements PermissionGrantingStrategyInterface * Strategy EQUAL: * The ACE will be considered applicable when the bitmasks are equal. * - * @param integer $requiredMask + * @param int $requiredMask * @param EntryInterface $ace * - * @return Boolean + * @return bool * * @throws \RuntimeException if the ACE strategy is not supported */ diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php index 0d3d0d2ca2..64f864d074 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php @@ -48,7 +48,7 @@ final class RoleSecurityIdentity implements SecurityIdentityInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function equals(SecurityIdentityInterface $sid) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php index dbc053096a..b95fddc718 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php @@ -42,7 +42,7 @@ class SecurityIdentityRetrievalStrategy implements SecurityIdentityRetrievalStra } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getSecurityIdentities(TokenInterface $token) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php index 3166a1a7ac..9418c81bf3 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php @@ -96,7 +96,7 @@ final class UserSecurityIdentity implements SecurityIdentityInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function equals(SecurityIdentityInterface $sid) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclCacheInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclCacheInterface.php index ea9604e43b..4673e012db 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclCacheInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclCacheInterface.php @@ -37,7 +37,7 @@ interface AclCacheInterface /** * Retrieves an ACL for the given object identity primary key from the cache * - * @param integer $primaryKey + * @param int $primaryKey * @return AclInterface */ public function getFromCacheById($primaryKey); diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclInterface.php index 02bbd008e5..85a4e833bd 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclInterface.php @@ -72,7 +72,7 @@ interface AclInterface extends \Serializable /** * Whether this ACL is inheriting ACEs from a parent ACL. * - * @return Boolean + * @return bool */ public function isEntriesInheriting(); @@ -82,8 +82,8 @@ interface AclInterface extends \Serializable * @param string $field * @param array $masks * @param array $securityIdentities - * @param Boolean $administrativeMode - * @return Boolean + * @param bool $administrativeMode + * @return bool */ public function isFieldGranted($field, array $masks, array $securityIdentities, $administrativeMode = false); @@ -93,8 +93,8 @@ interface AclInterface extends \Serializable * @throws NoAceFoundException when no ACE was applicable for this request * @param array $masks * @param array $securityIdentities - * @param Boolean $administrativeMode - * @return Boolean + * @param bool $administrativeMode + * @return bool */ public function isGranted(array $masks, array $securityIdentities, $administrativeMode = false); @@ -102,7 +102,7 @@ interface AclInterface extends \Serializable * Whether the ACL has loaded ACEs for all of the passed security identities * * @param mixed $securityIdentities an implementation of SecurityIdentityInterface, or an array thereof - * @return Boolean + * @return bool */ public function isSidLoaded($securityIdentities); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclProviderInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclProviderInterface.php index 615cf145ac..dd8fb1967b 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclProviderInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AclProviderInterface.php @@ -24,7 +24,7 @@ interface AclProviderInterface * Retrieves all child object identities from the database * * @param ObjectIdentityInterface $parentOid - * @param Boolean $directChildrenOnly + * @param bool $directChildrenOnly * * @return array returns an array of child 'ObjectIdentity's */ diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php index 09bcbb8664..11fe7f5aa6 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php @@ -22,7 +22,7 @@ interface AuditLoggerInterface * This method is called whenever access is granted, or denied, and * administrative mode is turned off. * - * @param Boolean $granted + * @param bool $granted * @param EntryInterface $ace */ public function logIfNeeded($granted, EntryInterface $ace); diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableAclInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableAclInterface.php index 14b4c04727..f5ed9ddd2c 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableAclInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableAclInterface.php @@ -21,38 +21,38 @@ interface AuditableAclInterface extends MutableAclInterface /** * Updates auditing for class-based ACE * - * @param integer $index - * @param Boolean $auditSuccess - * @param Boolean $auditFailure + * @param int $index + * @param bool $auditSuccess + * @param bool $auditFailure */ public function updateClassAuditing($index, $auditSuccess, $auditFailure); /** * Updates auditing for class-field-based ACE * - * @param integer $index + * @param int $index * @param string $field - * @param Boolean $auditSuccess - * @param Boolean $auditFailure + * @param bool $auditSuccess + * @param bool $auditFailure */ public function updateClassFieldAuditing($index, $field, $auditSuccess, $auditFailure); /** * Updates auditing for object-based ACE * - * @param integer $index - * @param Boolean $auditSuccess - * @param Boolean $auditFailure + * @param int $index + * @param bool $auditSuccess + * @param bool $auditFailure */ public function updateObjectAuditing($index, $auditSuccess, $auditFailure); /** * Updates auditing for object-field-based ACE * - * @param integer $index + * @param int $index * @param string $field - * @param Boolean $auditSuccess - * @param Boolean $auditFailure + * @param bool $auditSuccess + * @param bool $auditFailure */ public function updateObjectFieldAuditing($index, $field, $auditSuccess, $auditFailure); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php index e957965c48..509acdafc1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php @@ -21,14 +21,14 @@ interface AuditableEntryInterface extends EntryInterface /** * Whether auditing for successful grants is turned on * - * @return Boolean + * @return bool */ public function isAuditFailure(); /** * Whether auditing for successful denies is turned on * - * @return Boolean + * @return bool */ public function isAuditSuccess(); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/EntryInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/EntryInterface.php index 98b754c111..b33f1f0b6f 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/EntryInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/EntryInterface.php @@ -31,14 +31,14 @@ interface EntryInterface extends \Serializable /** * The primary key of this ACE * - * @return integer + * @return int */ public function getId(); /** * The permission mask of this ACE * - * @return integer + * @return int */ public function getMask(); @@ -59,7 +59,7 @@ interface EntryInterface extends \Serializable /** * Returns whether this ACE is granting, or denying * - * @return Boolean + * @return bool */ public function isGranting(); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/MutableAclInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/MutableAclInterface.php index 365a779df3..8993aa5556 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/MutableAclInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/MutableAclInterface.php @@ -24,14 +24,14 @@ interface MutableAclInterface extends AclInterface /** * Deletes a class-based ACE * - * @param integer $index + * @param int $index */ public function deleteClassAce($index); /** * Deletes a class-field-based ACE * - * @param integer $index + * @param int $index * @param string $field */ public function deleteClassFieldAce($index, $field); @@ -39,14 +39,14 @@ interface MutableAclInterface extends AclInterface /** * Deletes an object-based ACE * - * @param integer $index + * @param int $index */ public function deleteObjectAce($index); /** * Deletes an object-field-based ACE * - * @param integer $index + * @param int $index * @param string $field */ public function deleteObjectFieldAce($index, $field); @@ -54,7 +54,7 @@ interface MutableAclInterface extends AclInterface /** * Returns the primary key of this ACL * - * @return integer + * @return int */ public function getId(); @@ -62,9 +62,9 @@ interface MutableAclInterface extends AclInterface * Inserts a class-based ACE * * @param SecurityIdentityInterface $sid - * @param integer $mask - * @param integer $index - * @param Boolean $granting + * @param int $mask + * @param int $index + * @param bool $granting * @param string $strategy */ public function insertClassAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null); @@ -74,9 +74,9 @@ interface MutableAclInterface extends AclInterface * * @param string $field * @param SecurityIdentityInterface $sid - * @param integer $mask - * @param integer $index - * @param Boolean $granting + * @param int $mask + * @param int $index + * @param bool $granting * @param string $strategy */ public function insertClassFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null); @@ -85,9 +85,9 @@ interface MutableAclInterface extends AclInterface * Inserts an object-based ACE * * @param SecurityIdentityInterface $sid - * @param integer $mask - * @param integer $index - * @param Boolean $granting + * @param int $mask + * @param int $index + * @param bool $granting * @param string $strategy */ public function insertObjectAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null); @@ -97,9 +97,9 @@ interface MutableAclInterface extends AclInterface * * @param string $field * @param SecurityIdentityInterface $sid - * @param integer $mask - * @param integer $index - * @param Boolean $granting + * @param int $mask + * @param int $index + * @param bool $granting * @param string $strategy */ public function insertObjectFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null); @@ -107,7 +107,7 @@ interface MutableAclInterface extends AclInterface /** * Sets whether entries are inherited * - * @param Boolean $boolean + * @param bool $boolean */ public function setEntriesInheriting($boolean); @@ -121,8 +121,8 @@ interface MutableAclInterface extends AclInterface /** * Updates a class-based ACE * - * @param integer $index - * @param integer $mask + * @param int $index + * @param int $mask * @param string $strategy if null the strategy should not be changed */ public function updateClassAce($index, $mask, $strategy = null); @@ -130,9 +130,9 @@ interface MutableAclInterface extends AclInterface /** * Updates a class-field-based ACE * - * @param integer $index + * @param int $index * @param string $field - * @param integer $mask + * @param int $mask * @param string $strategy if null the strategy should not be changed */ public function updateClassFieldAce($index, $field, $mask, $strategy = null); @@ -140,8 +140,8 @@ interface MutableAclInterface extends AclInterface /** * Updates an object-based ACE * - * @param integer $index - * @param integer $mask + * @param int $index + * @param int $mask * @param string $strategy if null the strategy should not be changed */ public function updateObjectAce($index, $mask, $strategy = null); @@ -149,9 +149,9 @@ interface MutableAclInterface extends AclInterface /** * Updates an object-field-based ACE * - * @param integer $index + * @param int $index * @param string $field - * @param integer $mask + * @param int $mask * @param string $strategy if null the strategy should not be changed */ public function updateObjectFieldAce($index, $field, $mask, $strategy = null); diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php index 8ad0ebae61..2ee365f44f 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php @@ -28,7 +28,7 @@ interface ObjectIdentityInterface * Example for Object Equality: $object1->getId() === $object2->getId() * * @param ObjectIdentityInterface $identity - * @return Boolean + * @return bool */ public function equals(ObjectIdentityInterface $identity); diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php index 7f8f81bb28..25f16877a6 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php @@ -24,8 +24,8 @@ interface PermissionGrantingStrategyInterface * @param AclInterface $acl * @param array $masks * @param array $sids - * @param Boolean $administrativeMode - * @return Boolean + * @param bool $administrativeMode + * @return bool */ public function isGranted(AclInterface $acl, array $masks, array $sids, $administrativeMode = false); @@ -36,9 +36,9 @@ interface PermissionGrantingStrategyInterface * @param string $field * @param array $masks * @param array $sids - * @param Boolean $administrativeMode + * @param bool $administrativeMode * - * @return Boolean + * @return bool */ public function isFieldGranted(AclInterface $acl, $field, array $masks, array $sids, $administrativeMode = false); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php index 97157f113a..fa3d543184 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php @@ -87,19 +87,19 @@ class BasicPermissionMap implements PermissionMapInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMasks($permission, $object) { if (!isset($this->map[$permission])) { - return null; + return; } return $this->map[$permission]; } /** - * {@inheritDoc} + * {@inheritdoc} */ public function contains($permission) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/MaskBuilder.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/MaskBuilder.php index 017e7c0241..4d475fbce4 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/MaskBuilder.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/MaskBuilder.php @@ -72,7 +72,7 @@ class MaskBuilder /** * Constructor * - * @param integer $mask optional; defaults to 0 + * @param int $mask optional; defaults to 0 * * @throws \InvalidArgumentException */ @@ -110,7 +110,7 @@ class MaskBuilder /** * Returns the mask of this permission * - * @return integer + * @return int */ public function get() { @@ -178,7 +178,7 @@ class MaskBuilder /** * Returns the code for the passed mask * - * @param integer $mask + * @param int $mask * @throws \InvalidArgumentException * @throws \RuntimeException * @return string diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php index 44c15cc945..20ca181485 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php @@ -34,7 +34,7 @@ interface PermissionMapInterface * Whether this map contains the given permission * * @param string $permission - * @return Boolean + * @return bool */ public function contains($permission); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Acl/Voter/AclVoter.php b/vendor/symfony/security/Symfony/Component/Security/Acl/Voter/AclVoter.php index 5e9aee6fa6..d401ef3bed 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Acl/Voter/AclVoter.php +++ b/vendor/symfony/security/Symfony/Component/Security/Acl/Voter/AclVoter.php @@ -134,7 +134,7 @@ class AclVoter implements VoterInterface * * @param string $class The class name * - * @return Boolean + * @return bool */ public function supportsClass($class) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php index 8b7474bec4..f713e8f68f 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php @@ -38,7 +38,7 @@ class AuthenticationProviderManager implements AuthenticationManagerInterface * Constructor. * * @param AuthenticationProviderInterface[] $providers An array of AuthenticationProviderInterface instances - * @param Boolean $eraseCredentials Whether to erase credentials after authentication or not + * @param bool $eraseCredentials Whether to erase credentials after authentication or not * * @throws \InvalidArgumentException */ @@ -49,7 +49,7 @@ class AuthenticationProviderManager implements AuthenticationManagerInterface } $this->providers = $providers; - $this->eraseCredentials = (Boolean) $eraseCredentials; + $this->eraseCredentials = (bool) $eraseCredentials; } public function setEventDispatcher(EventDispatcherInterface $dispatcher) diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php index 9b3ff3d1f0..d030459f37 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php @@ -36,7 +36,7 @@ class AuthenticationTrustResolver implements AuthenticationTrustResolverInterfac } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isAnonymous(TokenInterface $token = null) { @@ -48,7 +48,7 @@ class AuthenticationTrustResolver implements AuthenticationTrustResolverInterfac } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isRememberMe(TokenInterface $token = null) { @@ -60,7 +60,7 @@ class AuthenticationTrustResolver implements AuthenticationTrustResolverInterfac } /** - * {@inheritDoc} + * {@inheritdoc} */ public function isFullFledged(TokenInterface $token = null) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php index ac07db0afa..03b48e9eb6 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php @@ -28,7 +28,7 @@ interface AuthenticationTrustResolverInterface * * @param TokenInterface $token * - * @return Boolean + * @return bool */ public function isAnonymous(TokenInterface $token = null); @@ -38,7 +38,7 @@ interface AuthenticationTrustResolverInterface * * @param TokenInterface $token * - * @return Boolean + * @return bool */ public function isRememberMe(TokenInterface $token = null); @@ -47,7 +47,7 @@ interface AuthenticationTrustResolverInterface * * @param TokenInterface $token * - * @return Boolean + * @return bool */ public function isFullFledged(TokenInterface $token = null); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php index ea91075776..7fbbf858ac 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php @@ -40,7 +40,7 @@ class AnonymousAuthenticationProvider implements AuthenticationProviderInterface public function authenticate(TokenInterface $token) { if (!$this->supports($token)) { - return null; + return; } if ($this->key !== $token->getKey()) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php index f63a9248e0..23724dbaa3 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php @@ -29,7 +29,7 @@ interface AuthenticationProviderInterface extends AuthenticationManagerInterface * * @param TokenInterface $token A TokenInterface instance * - * @return Boolean true if the implementation supports the Token, false otherwise + * @return bool true if the implementation supports the Token, false otherwise */ public function supports(TokenInterface $token); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php index a9a22056d6..4913be8466 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php @@ -38,7 +38,7 @@ class DaoAuthenticationProvider extends UserAuthenticationProvider * @param UserCheckerInterface $userChecker An UserCheckerInterface instance * @param string $providerKey The provider key * @param EncoderFactoryInterface $encoderFactory An EncoderFactoryInterface instance - * @param Boolean $hideUserNotFoundExceptions Whether to hide user not found exception or not + * @param bool $hideUserNotFoundExceptions Whether to hide user not found exception or not */ public function __construct(UserProviderInterface $userProvider, UserCheckerInterface $userChecker, $providerKey, EncoderFactoryInterface $encoderFactory, $hideUserNotFoundExceptions = true) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php index 3affd7805a..21ce8d0ac8 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php @@ -53,7 +53,7 @@ class PreAuthenticatedAuthenticationProvider implements AuthenticationProviderIn public function authenticate(TokenInterface $token) { if (!$this->supports($token)) { - return null; + return; } if (!$user = $token->getUser()) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php index 18c3e70ade..3728c013d8 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php @@ -37,7 +37,7 @@ abstract class UserAuthenticationProvider implements AuthenticationProviderInter * * @param UserCheckerInterface $userChecker An UserCheckerInterface interface * @param string $providerKey A provider key - * @param Boolean $hideUserNotFoundExceptions Whether to hide user not found exception or not + * @param bool $hideUserNotFoundExceptions Whether to hide user not found exception or not * * @throws \InvalidArgumentException */ @@ -58,7 +58,7 @@ abstract class UserAuthenticationProvider implements AuthenticationProviderInter public function authenticate(TokenInterface $token) { if (!$this->supports($token)) { - return null; + return; } $username = $token->getUsername(); diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php index 5160fc5613..4590939dde 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php @@ -127,7 +127,7 @@ abstract class AbstractToken implements TokenInterface */ public function setAuthenticated($authenticated) { - $this->authenticated = (Boolean) $authenticated; + $this->authenticated = (bool) $authenticated; } /** @@ -188,7 +188,7 @@ abstract class AbstractToken implements TokenInterface * * @param string $name The attribute name * - * @return Boolean true if the attribute exists, false otherwise + * @return bool true if the attribute exists, false otherwise */ public function hasAttribute($name) { @@ -225,7 +225,7 @@ abstract class AbstractToken implements TokenInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function __toString() { @@ -247,7 +247,7 @@ abstract class AbstractToken implements TokenInterface } if ($this->user instanceof EquatableInterface) { - return ! (Boolean) $this->user->isEqualTo($user); + return ! (bool) $this->user->isEqualTo($user); } if ($this->user->getPassword() !== $user->getPassword()) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php index d39fec83d0..571816ca9e 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php @@ -57,7 +57,7 @@ class AnonymousToken extends AbstractToken } /** - * {@inheritDoc} + * {@inheritdoc} */ public function serialize() { @@ -65,7 +65,7 @@ class AnonymousToken extends AbstractToken } /** - * {@inheritDoc} + * {@inheritdoc} */ public function unserialize($serialized) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php index 11f69da32d..8f7d03fd27 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php @@ -69,14 +69,14 @@ interface TokenInterface extends \Serializable /** * Returns whether the user is authenticated or not. * - * @return Boolean true if the token has been authenticated, false otherwise + * @return bool true if the token has been authenticated, false otherwise */ public function isAuthenticated(); /** * Sets the authenticated flag. * - * @param Boolean $isAuthenticated The authenticated flag + * @param bool $isAuthenticated The authenticated flag */ public function setAuthenticated($isAuthenticated); @@ -104,7 +104,7 @@ interface TokenInterface extends \Serializable * * @param string $name The attribute name * - * @return Boolean true if the attribute exists, false otherwise + * @return bool true if the attribute exists, false otherwise */ public function hasAttribute($name); diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php index 18c3569aa9..726f62e0fd 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php @@ -32,8 +32,8 @@ class AccessDecisionManager implements AccessDecisionManagerInterface * * @param VoterInterface[] $voters An array of VoterInterface instances * @param string $strategy The vote strategy - * @param Boolean $allowIfAllAbstainDecisions Whether to grant access if all voters abstained or not - * @param Boolean $allowIfEqualGrantedDeniedDecisions Whether to grant access if result are equals + * @param bool $allowIfAllAbstainDecisions Whether to grant access if all voters abstained or not + * @param bool $allowIfEqualGrantedDeniedDecisions Whether to grant access if result are equals * * @throws \InvalidArgumentException */ @@ -50,8 +50,8 @@ class AccessDecisionManager implements AccessDecisionManagerInterface $this->voters = $voters; $this->strategy = $strategyMethod; - $this->allowIfAllAbstainDecisions = (Boolean) $allowIfAllAbstainDecisions; - $this->allowIfEqualGrantedDeniedDecisions = (Boolean) $allowIfEqualGrantedDeniedDecisions; + $this->allowIfAllAbstainDecisions = (bool) $allowIfAllAbstainDecisions; + $this->allowIfEqualGrantedDeniedDecisions = (bool) $allowIfEqualGrantedDeniedDecisions; } /** diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php index 742ea74fb6..ec82800dc6 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php @@ -27,7 +27,7 @@ interface AccessDecisionManagerInterface * @param array $attributes An array of attributes associated with the method being invoked * @param object $object The object to secure * - * @return Boolean true if the access is granted, false otherwise + * @return bool true if the access is granted, false otherwise */ public function decide(TokenInterface $token, array $attributes, $object = null); @@ -36,7 +36,7 @@ interface AccessDecisionManagerInterface * * @param string $attribute An attribute * - * @return Boolean true if this decision manager supports the attribute, false otherwise + * @return bool true if this decision manager supports the attribute, false otherwise */ public function supportsAttribute($attribute); diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php index 09953acc41..32638036da 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php @@ -32,7 +32,9 @@ class ExpressionVoter implements VoterInterface /** * Constructor. * - * @param ExpressionLanguage $expressionLanguage + * @param ExpressionLanguage $expressionLanguage + * @param AuthenticationTrustResolverInterface $trustResolver + * @param RoleHierarchyInterface|null $roleHierarchy */ public function __construct(ExpressionLanguage $expressionLanguage, AuthenticationTrustResolverInterface $trustResolver, RoleHierarchyInterface $roleHierarchy = null) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php index 0840c1c622..abc18b438b 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php @@ -29,7 +29,7 @@ interface VoterInterface * * @param string $attribute An attribute * - * @return Boolean true if this Voter supports the attribute, false otherwise + * @return bool true if this Voter supports the attribute, false otherwise */ public function supportsAttribute($attribute); @@ -38,7 +38,7 @@ interface VoterInterface * * @param string $class A class name * - * @return Boolean true if this Voter can process the class + * @return bool true if this Voter can process the class */ public function supportsClass($class); @@ -52,7 +52,7 @@ interface VoterInterface * @param object $object The object to secure * @param array $attributes An array of attributes associated with the method being invoked * - * @return integer either ACCESS_GRANTED, ACCESS_ABSTAIN, or ACCESS_DENIED + * @return int either ACCESS_GRANTED, ACCESS_ABSTAIN, or ACCESS_DENIED */ public function vote(TokenInterface $token, $object, array $attributes); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php index 5a0f12261c..1dcf3a6969 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php @@ -27,7 +27,7 @@ class BCryptPasswordEncoder extends BasePasswordEncoder /** * Constructor. * - * @param integer $cost The algorithmic cost that should be used + * @param int $cost The algorithmic cost that should be used * * @throws \RuntimeException When no BCrypt encoder is available * @throws \InvalidArgumentException if cost is out of range diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php index b83eb3050d..b27c2b0b95 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php @@ -79,7 +79,7 @@ abstract class BasePasswordEncoder implements PasswordEncoderInterface * @param string $password1 The first password * @param string $password2 The second password * - * @return Boolean true if the two passwords are the same, false otherwise + * @return bool true if the two passwords are the same, false otherwise */ protected function comparePasswords($password1, $password2) { @@ -89,7 +89,7 @@ abstract class BasePasswordEncoder implements PasswordEncoderInterface /** * Checks if the password is too long. * - * @return Boolean true if the password is too long, false otherwise + * @return bool true if the password is too long, false otherwise */ protected function isPasswordTooLong($password) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/EncoderFactory.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/EncoderFactory.php index 8bad61fabf..03373809e1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/EncoderFactory.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/EncoderFactory.php @@ -26,7 +26,7 @@ class EncoderFactory implements EncoderFactoryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getEncoder($user) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php index a7e5546f54..9aa240ad7c 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php @@ -28,8 +28,8 @@ class MessageDigestPasswordEncoder extends BasePasswordEncoder * Constructor. * * @param string $algorithm The digest algorithm to use - * @param Boolean $encodeHashAsBase64 Whether to base64 encode the password hash - * @param integer $iterations The number of iterations to use to stretch the password hash + * @param bool $encodeHashAsBase64 Whether to base64 encode the password hash + * @param int $iterations The number of iterations to use to stretch the password hash */ public function __construct($algorithm = 'sha512', $encodeHashAsBase64 = true, $iterations = 5000) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php index 78b4e42a87..23acaf3789 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php @@ -35,7 +35,7 @@ interface PasswordEncoderInterface * @param string $raw A raw password * @param string $salt The salt * - * @return Boolean true if the password is valid, false otherwise + * @return bool true if the password is valid, false otherwise */ public function isPasswordValid($encoded, $raw, $salt); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php index 8a5a958448..55b5261ee1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php @@ -37,9 +37,9 @@ class Pbkdf2PasswordEncoder extends BasePasswordEncoder * Constructor. * * @param string $algorithm The digest algorithm to use - * @param Boolean $encodeHashAsBase64 Whether to base64 encode the password hash - * @param integer $iterations The number of iterations to use to stretch the password hash - * @param integer $length Length of derived key to create + * @param bool $encodeHashAsBase64 Whether to base64 encode the password hash + * @param int $iterations The number of iterations to use to stretch the password hash + * @param int $length Length of derived key to create */ public function __construct($algorithm = 'sha512', $encodeHashAsBase64 = true, $iterations = 1000, $length = 40) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php index 22f3da4580..bdb058ab63 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php @@ -25,7 +25,7 @@ class PlaintextPasswordEncoder extends BasePasswordEncoder /** * Constructor. * - * @param Boolean $ignorePasswordCase Compare password case-insensitive + * @param bool $ignorePasswordCase Compare password case-insensitive */ public function __construct($ignorePasswordCase = false) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountExpiredException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountExpiredException.php index a5618ce621..4a712637b0 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountExpiredException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountExpiredException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class AccountExpiredException extends AccountStatusException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountStatusException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountStatusException.php index 7819e4dd09..9b29f634b4 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountStatusException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AccountStatusException.php @@ -45,7 +45,7 @@ abstract class AccountStatusException extends AuthenticationException } /** - * {@inheritDoc} + * {@inheritdoc} */ public function serialize() { @@ -56,7 +56,7 @@ abstract class AccountStatusException extends AuthenticationException } /** - * {@inheritDoc} + * {@inheritdoc} */ public function unserialize($str) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php index 633b2bee92..8595bed812 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php @@ -21,7 +21,7 @@ namespace Symfony\Component\Security\Core\Exception; class AuthenticationCredentialsNotFoundException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php index 758a4f0245..66f051d004 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class AuthenticationServiceException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/BadCredentialsException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/BadCredentialsException.php index 5deecca9b3..be061c7baa 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/BadCredentialsException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/BadCredentialsException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class BadCredentialsException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CookieTheftException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CookieTheftException.php index 8d9e154944..af97168495 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CookieTheftException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CookieTheftException.php @@ -21,7 +21,7 @@ namespace Symfony\Component\Security\Core\Exception; class CookieTheftException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php index b9bf2d158a..bcc1267a5f 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class CredentialsExpiredException extends AccountStatusException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/DisabledException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/DisabledException.php index 5571ab14a9..e9b784fbd4 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/DisabledException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/DisabledException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class DisabledException extends AccountStatusException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php index 74fc2b9b64..e33ef6ac93 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php @@ -22,7 +22,7 @@ namespace Symfony\Component\Security\Core\Exception; class InsufficientAuthenticationException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php index ce0e1f410e..84be85561d 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class InvalidCsrfTokenException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/LockedException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/LockedException.php index 6532f70a53..fffae74df8 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/LockedException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/LockedException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class LockedException extends AccountStatusException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/NonceExpiredException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/NonceExpiredException.php index 2f6681f1c9..998e987e40 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/NonceExpiredException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/NonceExpiredException.php @@ -21,7 +21,7 @@ namespace Symfony\Component\Security\Core\Exception; class NonceExpiredException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php index ea2b1fdf1f..af2e1b57b0 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php @@ -21,7 +21,7 @@ namespace Symfony\Component\Security\Core\Exception; class ProviderNotFoundException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/SessionUnavailableException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/SessionUnavailableException.php index 4b47b189ef..90b858a721 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/SessionUnavailableException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/SessionUnavailableException.php @@ -26,7 +26,7 @@ namespace Symfony\Component\Security\Core\Exception; class SessionUnavailableException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/TokenNotFoundException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/TokenNotFoundException.php index fb85abf0cf..b050302a4a 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/TokenNotFoundException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/TokenNotFoundException.php @@ -20,7 +20,7 @@ namespace Symfony\Component\Security\Core\Exception; class TokenNotFoundException extends AuthenticationException { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php index f656bacc6b..11607d336d 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php @@ -22,7 +22,7 @@ class UsernameNotFoundException extends AuthenticationException private $username; /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageKey() { @@ -50,7 +50,7 @@ class UsernameNotFoundException extends AuthenticationException } /** - * {@inheritDoc} + * {@inheritdoc} */ public function serialize() { @@ -61,7 +61,7 @@ class UsernameNotFoundException extends AuthenticationException } /** - * {@inheritDoc} + * {@inheritdoc} */ public function unserialize($str) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContext.php b/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContext.php index c55cecfa02..0326f1dc4a 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContext.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContext.php @@ -36,7 +36,7 @@ class SecurityContext implements SecurityContextInterface * * @param AuthenticationManagerInterface $authenticationManager An AuthenticationManager instance * @param AccessDecisionManagerInterface|null $accessDecisionManager An AccessDecisionManager instance - * @param Boolean $alwaysAuthenticate + * @param bool $alwaysAuthenticate */ public function __construct(AuthenticationManagerInterface $authenticationManager, AccessDecisionManagerInterface $accessDecisionManager, $alwaysAuthenticate = false) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContextInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContextInterface.php index 434f9a580a..ca816a8e48 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContextInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/SecurityContextInterface.php @@ -44,7 +44,7 @@ interface SecurityContextInterface * @param mixed $attributes * @param mixed $object * - * @return Boolean + * @return bool */ public function isGranted($attributes, $object = null); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/User/AdvancedUserInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/User/AdvancedUserInterface.php index 5b3a51a191..19775c0fd1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/User/AdvancedUserInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/User/AdvancedUserInterface.php @@ -43,7 +43,7 @@ interface AdvancedUserInterface extends UserInterface * Internally, if this method returns false, the authentication system * will throw an AccountExpiredException and prevent login. * - * @return Boolean true if the user's account is non expired, false otherwise + * @return bool true if the user's account is non expired, false otherwise * * @see AccountExpiredException */ @@ -55,7 +55,7 @@ interface AdvancedUserInterface extends UserInterface * Internally, if this method returns false, the authentication system * will throw a LockedException and prevent login. * - * @return Boolean true if the user is not locked, false otherwise + * @return bool true if the user is not locked, false otherwise * * @see LockedException */ @@ -67,7 +67,7 @@ interface AdvancedUserInterface extends UserInterface * Internally, if this method returns false, the authentication system * will throw a CredentialsExpiredException and prevent login. * - * @return Boolean true if the user's credentials are non expired, false otherwise + * @return bool true if the user's credentials are non expired, false otherwise * * @see CredentialsExpiredException */ @@ -79,7 +79,7 @@ interface AdvancedUserInterface extends UserInterface * Internally, if this method returns false, the authentication system * will throw a DisabledException and prevent login. * - * @return Boolean true if the user is enabled, false otherwise + * @return bool true if the user is enabled, false otherwise * * @see DisabledException */ diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/User/ChainUserProvider.php b/vendor/symfony/security/Symfony/Component/Security/Core/User/ChainUserProvider.php index fc720746dd..6e14a4ff26 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/User/ChainUserProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/User/ChainUserProvider.php @@ -40,7 +40,7 @@ class ChainUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function loadUserByUsername($username) { @@ -58,7 +58,7 @@ class ChainUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function refreshUser(UserInterface $user) { @@ -85,7 +85,7 @@ class ChainUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function supportsClass($class) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/User/EquatableInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/User/EquatableInterface.php index 645b77c142..c6082ce501 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/User/EquatableInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/User/EquatableInterface.php @@ -31,7 +31,7 @@ interface EquatableInterface * * @param UserInterface $user * - * @return Boolean + * @return bool */ public function isEqualTo(UserInterface $user); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/User/InMemoryUserProvider.php b/vendor/symfony/security/Symfony/Component/Security/Core/User/InMemoryUserProvider.php index 074c21e1f1..624eb3d5d5 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/User/InMemoryUserProvider.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/User/InMemoryUserProvider.php @@ -81,7 +81,7 @@ class InMemoryUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function refreshUser(UserInterface $user) { @@ -93,7 +93,7 @@ class InMemoryUserProvider implements UserProviderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function supportsClass($class) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/User/User.php b/vendor/symfony/security/Symfony/Component/Security/Core/User/User.php index b378e1b97c..ea2c6a4da6 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/User/User.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/User/User.php @@ -64,7 +64,6 @@ final class User implements AdvancedUserInterface */ public function getSalt() { - return null; } /** diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/User/UserProviderInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/User/UserProviderInterface.php index 6669c437af..6b7895cd20 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/User/UserProviderInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/User/UserProviderInterface.php @@ -70,7 +70,7 @@ interface UserProviderInterface * * @param string $class * - * @return Boolean + * @return bool */ public function supportsClass($class); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Util/SecureRandomInterface.php b/vendor/symfony/security/Symfony/Component/Security/Core/Util/SecureRandomInterface.php index 2c35a7219e..2cf777931b 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Util/SecureRandomInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Util/SecureRandomInterface.php @@ -21,7 +21,7 @@ interface SecureRandomInterface /** * Generates the specified number of secure random bytes. * - * @param integer $nbBytes + * @param int $nbBytes * * @return string */ diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Util/StringUtils.php b/vendor/symfony/security/Symfony/Component/Security/Core/Util/StringUtils.php index 2e8925d4a6..d47bd4bb37 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Util/StringUtils.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Util/StringUtils.php @@ -31,7 +31,7 @@ class StringUtils * @param string $knownString The string of known length to compare against * @param string $userInput The string that the user can control * - * @return Boolean true if the two strings are the same, false otherwise + * @return bool true if the two strings are the same, false otherwise */ public static function equals($knownString, $userInput) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php b/vendor/symfony/security/Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php index 76c4b3b57d..aee4cdad23 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php +++ b/vendor/symfony/security/Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) */ class UserPassword extends Constraint { diff --git a/vendor/symfony/security/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php b/vendor/symfony/security/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php index 2b9254b829..050b6c1ef1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php @@ -62,7 +62,7 @@ interface CsrfTokenManagerInterface * * @param CsrfToken $token A CSRF token * - * @return Boolean Returns true if the token is valid, false otherwise + * @return bool Returns true if the token is valid, false otherwise */ public function isTokenValid(CsrfToken $token); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php b/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php index 558273de22..122bc02bfb 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php +++ b/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php @@ -32,7 +32,7 @@ class UriSafeTokenGenerator implements TokenGeneratorInterface /** * The amount of entropy collected for each token (in bits). * - * @var integer + * @var int */ private $entropy; @@ -41,7 +41,7 @@ class UriSafeTokenGenerator implements TokenGeneratorInterface * * @param SecureRandomInterface|null $random The random value generator used for * generating entropy - * @param integer $entropy The amount of entropy collected for + * @param int $entropy The amount of entropy collected for * each token (in bits) */ public function __construct(SecureRandomInterface $random = null, $entropy = 256) diff --git a/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php b/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php index 8e9b280008..af5931b40b 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php +++ b/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php @@ -28,7 +28,7 @@ class NativeSessionTokenStorage implements TokenStorageInterface const SESSION_NAMESPACE = '_csrf'; /** - * @var Boolean + * @var bool */ private $sessionStarted = false; diff --git a/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php b/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php index 3fb3191249..ea3a6a8f55 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php +++ b/vendor/symfony/security/Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php @@ -53,7 +53,7 @@ interface TokenStorageInterface * * @param string $tokenId The token ID * - * @return Boolean Whether a token exists with the given ID + * @return bool Whether a token exists with the given ID */ public function hasToken($tokenId); } diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/AccessMap.php b/vendor/symfony/security/Symfony/Component/Security/Http/AccessMap.php index dc2e66a03a..116874a319 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/AccessMap.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/AccessMap.php @@ -37,7 +37,7 @@ class AccessMap implements AccessMapInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getPatterns(Request $request) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php b/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php index 70dcd1e858..f106a4afef 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php @@ -58,7 +58,7 @@ class DefaultAuthenticationFailureHandler implements AuthenticationFailureHandle } /** - * {@inheritDoc} + * {@inheritdoc} */ public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php b/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php index 0c084b9ea1..54d6fc1585 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php @@ -48,7 +48,7 @@ class DefaultAuthenticationSuccessHandler implements AuthenticationSuccessHandle } /** - * {@inheritDoc} + * {@inheritdoc} */ public function onAuthenticationSuccess(Request $request, TokenInterface $token) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php b/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php index 2280d8f5cb..09a55ef1bf 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php @@ -51,7 +51,7 @@ class SimpleAuthenticationHandler implements AuthenticationFailureHandlerInterfa } /** - * {@inheritDoc} + * {@inheritdoc} */ public function onAuthenticationSuccess(Request $request, TokenInterface $token) { @@ -78,7 +78,7 @@ class SimpleAuthenticationHandler implements AuthenticationFailureHandlerInterfa } /** - * {@inheritDoc} + * {@inheritdoc} */ public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php b/vendor/symfony/security/Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php index b78f0a9a89..c734db065e 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php @@ -34,14 +34,14 @@ class FormAuthenticationEntryPoint implements AuthenticationEntryPointInterface * @param HttpKernelInterface $kernel * @param HttpUtils $httpUtils An HttpUtils instance * @param string $loginPath The path to the login form - * @param Boolean $useForward Whether to forward or redirect to the login form + * @param bool $useForward Whether to forward or redirect to the login form */ public function __construct(HttpKernelInterface $kernel, HttpUtils $httpUtils, $loginPath, $useForward = false) { $this->httpKernel = $kernel; $this->httpUtils = $httpUtils; $this->loginPath = $loginPath; - $this->useForward = (Boolean) $useForward; + $this->useForward = (bool) $useForward; } /** diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall.php b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall.php index 392da0b575..7bad47a5be 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall.php @@ -85,7 +85,7 @@ class Firewall implements EventSubscriberInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public static function getSubscribedEvents() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php index 7fa991ce09..80bfcd0b96 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php @@ -171,7 +171,7 @@ abstract class AbstractAuthenticationListener implements ListenerInterface * * @param Request $request * - * @return Boolean + * @return bool */ protected function requiresAuthentication(Request $request) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/ContextListener.php b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/ContextListener.php index 05e260e74c..435c44026e 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/ContextListener.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/ContextListener.php @@ -170,7 +170,7 @@ class ContextListener implements ListenerInterface $this->logger->warning(sprintf('Username "%s" could not be found.', $notFound->getUsername())); } - return null; + return; } } diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/LogoutListener.php b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/LogoutListener.php index ed7f7fe3ce..91f17bb68d 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/LogoutListener.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/LogoutListener.php @@ -131,7 +131,7 @@ class LogoutListener implements ListenerInterface * * @param Request $request * - * @return Boolean + * @return bool */ protected function requiresLogout(Request $request) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php index f79ce5c412..20ce4f265d 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php @@ -50,10 +50,13 @@ class SimpleFormAuthenticationListener extends AbstractAuthenticationListener * successful, or failed authentication attempt * @param LoggerInterface $logger A LoggerInterface instance * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance - * @param SimpleFormAuthenticatorInterface $simpleAuthenticator A SimpleFormAuthenticatorInterface instance * @param CsrfTokenManagerInterface $csrfTokenManager A CsrfTokenManagerInterface instance + * @param SimpleFormAuthenticatorInterface $simpleAuthenticator A SimpleFormAuthenticatorInterface instance + * + * @throws \InvalidArgumentException In case no simple authenticator is provided + * @throws InvalidArgumentException In case an invalid CSRF token manager is passed */ - public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, CsrfTokenManagerInterface $csrfTokenManager = null, SimpleFormAuthenticatorInterface $simpleAuthenticator = null) + public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, $csrfTokenManager = null, SimpleFormAuthenticatorInterface $simpleAuthenticator = null) { if (!$simpleAuthenticator) { throw new \InvalidArgumentException('Missing simple authenticator'); diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php index 5aabf75fcf..9c07be1234 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php @@ -41,10 +41,17 @@ class X509AuthenticationListener extends AbstractPreAuthenticatedListener */ protected function getPreAuthenticatedData(Request $request) { - if (!$request->server->has($this->userKey)) { - throw new BadCredentialsException(sprintf('SSL key was not found: %s', $this->userKey)); + $user = null; + if ($request->server->has($this->userKey)) { + $user = $request->server->get($this->userKey); + } elseif ($request->server->has($this->credentialKey) && preg_match('#/emailAddress=(.+\@.+\..+)(/|$)#', $request->server->get($this->credentialKey), $matches)) { + $user = $matches[1]; } - return array($request->server->get($this->userKey), $request->server->get($this->credentialKey, '')); + if (null === $user) { + throw new BadCredentialsException(sprintf('SSL credentials not found: %s, %s', $this->userKey, $this->credentialKey)); + } + + return array($user, $request->server->get($this->credentialKey, '')); } } diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/FirewallMap.php b/vendor/symfony/security/Symfony/Component/Security/Http/FirewallMap.php index 0554bedc21..1bb73bd293 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/FirewallMap.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/FirewallMap.php @@ -36,7 +36,7 @@ class FirewallMap implements FirewallMapInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getListeners(Request $request) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/HttpUtils.php b/vendor/symfony/security/Symfony/Component/Security/Http/HttpUtils.php index 422c8ce9e9..451c12cba0 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/HttpUtils.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/HttpUtils.php @@ -53,7 +53,7 @@ class HttpUtils * * @param Request $request A Request instance * @param string $path A path (an absolute path (/foo), an absolute URL (http://...), or a route name (foo)) - * @param integer $status The status code + * @param int $status The status code * * @return RedirectResponse A RedirectResponse instance */ @@ -96,7 +96,7 @@ class HttpUtils * @param Request $request A Request instance * @param string $path A path (an absolute path (/foo), an absolute URL (http://...), or a route name (foo)) * - * @return Boolean true if the path is the same as the one from the Request, false otherwise + * @return bool true if the path is the same as the one from the Request, false otherwise */ public function checkRequestPath(Request $request, $path) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php b/vendor/symfony/security/Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php index 70f15cfca4..48626b0690 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php @@ -37,7 +37,7 @@ class DefaultLogoutSuccessHandler implements LogoutSuccessHandlerInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function onLogoutSuccess(Request $request) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php index 740d3d658c..be842088e9 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php @@ -142,8 +142,6 @@ abstract class AbstractRememberMeServices implements RememberMeServicesInterface } $this->cancelCookie($request); - - return null; } /** @@ -295,7 +293,7 @@ abstract class AbstractRememberMeServices implements RememberMeServicesInterface * * @param Request $request * - * @return Boolean + * @return bool */ protected function isRememberMeRequested(Request $request) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php index 6500bfd8ba..12478dce4a 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php @@ -62,7 +62,7 @@ class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function cancelCookie(Request $request) { @@ -79,7 +79,7 @@ class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function processAutoLoginCookie(array $cookieParts, Request $request) { @@ -117,7 +117,7 @@ class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/ResponseListener.php b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/ResponseListener.php index 60875877ef..2253c5d163 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/ResponseListener.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/ResponseListener.php @@ -36,7 +36,7 @@ class ResponseListener implements EventSubscriberInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public static function getSubscribedEvents() { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php index 571abbeeec..a6a4e666c1 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php @@ -27,7 +27,7 @@ use Symfony\Component\Security\Core\User\UserInterface; class TokenBasedRememberMeServices extends AbstractRememberMeServices { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function processAutoLoginCookie(array $cookieParts, Request $request) { @@ -73,7 +73,7 @@ class TokenBasedRememberMeServices extends AbstractRememberMeServices * @param string $hash1 The first hash * @param string $hash2 The second hash * - * @return Boolean true if the two hashes are the same, false otherwise + * @return bool true if the two hashes are the same, false otherwise */ private function compareHashes($hash1, $hash2) { @@ -90,7 +90,7 @@ class TokenBasedRememberMeServices extends AbstractRememberMeServices } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token) { @@ -116,7 +116,7 @@ class TokenBasedRememberMeServices extends AbstractRememberMeServices * * @param string $class * @param string $username The username - * @param integer $expires The Unix timestamp when the cookie expires + * @param int $expires The Unix timestamp when the cookie expires * @param string $password The encoded password * * @throws \RuntimeException if username contains invalid chars @@ -138,7 +138,7 @@ class TokenBasedRememberMeServices extends AbstractRememberMeServices * * @param string $class * @param string $username The username - * @param integer $expires The Unix timestamp when the cookie expires + * @param int $expires The Unix timestamp when the cookie expires * @param string $password The encoded password * * @throws \RuntimeException when the private key is empty diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php b/vendor/symfony/security/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php index e9c982641d..17160a18ef 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php @@ -38,7 +38,7 @@ class SessionAuthenticationStrategy implements SessionAuthenticationStrategyInte } /** - * {@inheritDoc} + * {@inheritdoc} */ public function onAuthentication(Request $request, TokenInterface $token) { diff --git a/vendor/symfony/security/Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php b/vendor/symfony/security/Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php index 7725f4beac..7eefb30967 100644 --- a/vendor/symfony/security/Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php +++ b/vendor/symfony/security/Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php @@ -35,11 +35,7 @@ class X509AuthenticationListenerTest extends \PHPUnit_Framework_TestCase $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'); - $listener = new X509AuthenticationListener( - $context, - $authenticationManager, - 'TheProviderKey' - ); + $listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey'); $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData'); $method->setAccessible(true); @@ -56,10 +52,39 @@ class X509AuthenticationListenerTest extends \PHPUnit_Framework_TestCase ); } + /** + * @dataProvider dataProviderGetPreAuthenticatedDataNoUser + */ + public function testGetPreAuthenticatedDataNoUser($emailAddress) + { + $credentials = 'CN=Sample certificate DN/emailAddress='.$emailAddress; + $request = new Request(array(), array(), array(), array(), array(), array('SSL_CLIENT_S_DN' => $credentials)); + + $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'); + + $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'); + + $listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey'); + + $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData'); + $method->setAccessible(true); + + $result = $method->invokeArgs($listener, array($request)); + $this->assertSame($result, array($emailAddress, $credentials)); + } + + public static function dataProviderGetPreAuthenticatedDataNoUser() + { + return array( + 'basicEmailAddress' => array('cert@example.com'), + 'emailAddressWithPlusSign' => array('cert+something@example.com'), + ); + } + /** * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException */ - public function testGetPreAuthenticatedDataNoUser() + public function testGetPreAuthenticatedDataNoData() { $request = new Request(array(), array(), array(), array(), array(), array()); @@ -67,11 +92,7 @@ class X509AuthenticationListenerTest extends \PHPUnit_Framework_TestCase $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'); - $listener = new X509AuthenticationListener( - $context, - $authenticationManager, - 'TheProviderKey' - ); + $listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey'); $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData'); $method->setAccessible(true); @@ -91,13 +112,7 @@ class X509AuthenticationListenerTest extends \PHPUnit_Framework_TestCase $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'); - $listener = new X509AuthenticationListener( - $context, - $authenticationManager, - 'TheProviderKey', - 'TheUserKey', - 'TheCredentialsKey' - ); + $listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey', 'TheUserKey', 'TheCredentialsKey'); $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData'); $method->setAccessible(true); diff --git a/vendor/symfony/security/Symfony/Component/Security/Resources/translations/security.th.xlf b/vendor/symfony/security/Symfony/Component/Security/Resources/translations/security.th.xlf new file mode 100644 index 0000000000..a8cb8d5ce7 --- /dev/null +++ b/vendor/symfony/security/Symfony/Component/Security/Resources/translations/security.th.xlf @@ -0,0 +1,71 @@ + + + + + + An authentication exception occurred. + พบความผิดพลาดในà¸à¸²à¸£à¸£à¸±à¸šà¸£à¸­à¸‡à¸•ัวตน + + + Authentication credentials could not be found. + ไม่พบข้อมูลในà¸à¸²à¸£à¸£à¸±à¸šà¸£à¸­à¸‡à¸•ัวตน (credentials) + + + Authentication request could not be processed due to a system problem. + คำร้องในà¸à¸²à¸£à¸£à¸±à¸šà¸£à¸­à¸‡à¸•ัวตนไม่สามารถดำเนินà¸à¸²à¸£à¹„ด้ เนื่องมาจาà¸à¸›à¸±à¸à¸«à¸²à¸‚องระบบ + + + Invalid credentials. + ข้อมูลà¸à¸²à¸£à¸£à¸±à¸šà¸£à¸­à¸‡à¸•ัวตนไม่ถูà¸à¸•้อง + + + Cookie has already been used by someone else. + Cookie ถูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ปà¹à¸¥à¹‰à¸§à¸”้วยผู้อื่น + + + Not privileged to request the resource. + ไม่ได้รับสิทธิ์ให้ใช้งานส่วนนี้ได้ + + + Invalid CSRF token. + CSRF token ไม่ถูà¸à¸•้อง + + + Digest nonce has expired. + Digest nonce หมดอายุ + + + No authentication provider found to support the authentication token. + ไม่พบ authentication provider ที่รองรับสำหรับ authentication token + + + No session available, it either timed out or cookies are not enabled. + ไม่มี session ที่พร้อมใช้งาน, Session หมดอายุไปà¹à¸¥à¹‰à¸§à¸«à¸£à¸·à¸­ cookies ไม่ถูà¸à¹€à¸›à¸´à¸”ใช้งาน + + + No token could be found. + ไม่พบ token + + + Username could not be found. + ไม่พบ Username + + + Account has expired. + บัà¸à¸Šà¸µà¸«à¸¡à¸”อายุไปà¹à¸¥à¹‰à¸§ + + + Credentials have expired. + ข้อมูลà¸à¸²à¸£à¸£à¸°à¸šà¸¸à¸•ัวตนหมดอายุà¹à¸¥à¹‰à¸§ + + + Account is disabled. + บัà¸à¸Šà¸µà¸–ูà¸à¸£à¸°à¸‡à¸±à¸šà¹à¸¥à¹‰à¸§ + + + Account is locked. + บัà¸à¸Šà¸µà¸–ูà¸à¸¥à¹‡à¸­à¸à¹à¸¥à¹‰à¸§ + + + + diff --git a/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/Stopwatch.php b/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/Stopwatch.php index 8631cf8927..99d09529f6 100644 --- a/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/Stopwatch.php +++ b/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/Stopwatch.php @@ -190,8 +190,6 @@ class Section return $child; } } - - return null; } /** diff --git a/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchEvent.php b/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchEvent.php index 93a7634431..09f3f85e67 100644 --- a/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchEvent.php +++ b/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchEvent.php @@ -147,7 +147,7 @@ class StopwatchEvent /** * Gets the relative time of the start of the first period. * - * @return integer The time (in milliseconds) + * @return int The time (in milliseconds) */ public function getStartTime() { @@ -157,7 +157,7 @@ class StopwatchEvent /** * Gets the relative time of the end of the last period. * - * @return integer The time (in milliseconds) + * @return int The time (in milliseconds) */ public function getEndTime() { @@ -169,7 +169,7 @@ class StopwatchEvent /** * Gets the duration of the events (including all periods). * - * @return integer The duration (in milliseconds) + * @return int The duration (in milliseconds) */ public function getDuration() { @@ -184,7 +184,7 @@ class StopwatchEvent /** * Gets the max memory usage of all periods. * - * @return integer The memory usage (in bytes) + * @return int The memory usage (in bytes) */ public function getMemory() { @@ -211,7 +211,7 @@ class StopwatchEvent /** * Formats a time. * - * @param integer|float $time A raw time + * @param int|float $time A raw time * * @return float The formatted time * diff --git a/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchPeriod.php b/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchPeriod.php index f757a016a9..bdc35c1119 100644 --- a/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchPeriod.php +++ b/vendor/symfony/stopwatch/Symfony/Component/Stopwatch/StopwatchPeriod.php @@ -25,20 +25,20 @@ class StopwatchPeriod /** * Constructor. * - * @param integer $start The relative time of the start of the period (in milliseconds) - * @param integer $end The relative time of the end of the period (in milliseconds) + * @param int $start The relative time of the start of the period (in milliseconds) + * @param int $end The relative time of the end of the period (in milliseconds) */ public function __construct($start, $end) { - $this->start = (integer) $start; - $this->end = (integer) $end; + $this->start = (int) $start; + $this->end = (int) $end; $this->memory = memory_get_usage(true); } /** * Gets the relative time of the start of the period. * - * @return integer The time (in milliseconds) + * @return int The time (in milliseconds) */ public function getStartTime() { @@ -48,7 +48,7 @@ class StopwatchPeriod /** * Gets the relative time of the end of the period. * - * @return integer The time (in milliseconds) + * @return int The time (in milliseconds) */ public function getEndTime() { @@ -58,7 +58,7 @@ class StopwatchPeriod /** * Gets the time spent in this period. * - * @return integer The period duration (in milliseconds) + * @return int The period duration (in milliseconds) */ public function getDuration() { @@ -68,7 +68,7 @@ class StopwatchPeriod /** * Gets the memory usage. * - * @return integer The memory usage (in bytes) + * @return int The memory usage (in bytes) */ public function getMemory() { diff --git a/vendor/symfony/templating/Symfony/Component/Templating/EngineInterface.php b/vendor/symfony/templating/Symfony/Component/Templating/EngineInterface.php index a7291bfa81..9302ba3ea1 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/EngineInterface.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/EngineInterface.php @@ -51,7 +51,7 @@ interface EngineInterface * * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance * - * @return Boolean true if the template exists, false otherwise + * @return bool true if the template exists, false otherwise * * @throws \RuntimeException if the engine cannot handle the template name * @@ -64,7 +64,7 @@ interface EngineInterface * * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance * - * @return Boolean true if this class supports the given template, false otherwise + * @return bool true if this class supports the given template, false otherwise * * @api */ diff --git a/vendor/symfony/templating/Symfony/Component/Templating/Helper/SlotsHelper.php b/vendor/symfony/templating/Symfony/Component/Templating/Helper/SlotsHelper.php index 98b2b872d8..8868215c71 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/Helper/SlotsHelper.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/Helper/SlotsHelper.php @@ -71,7 +71,7 @@ class SlotsHelper extends Helper * * @param string $name The slot name * - * @return Boolean + * @return bool * * @api */ @@ -84,7 +84,7 @@ class SlotsHelper extends Helper * Gets the slot value. * * @param string $name The slot name - * @param Boolean|string $default The default slot content + * @param bool|string $default The default slot content * * @return string The slot content * @@ -112,9 +112,9 @@ class SlotsHelper extends Helper * Outputs a slot. * * @param string $name The slot name - * @param Boolean|string $default The default slot content + * @param bool|string $default The default slot content * - * @return Boolean true if the slot is defined or if a default content has been provided, false otherwise + * @return bool true if the slot is defined or if a default content has been provided, false otherwise * * @api */ diff --git a/vendor/symfony/templating/Symfony/Component/Templating/Loader/CacheLoader.php b/vendor/symfony/templating/Symfony/Component/Templating/Loader/CacheLoader.php index 832b3cb7b5..08447232d3 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/Loader/CacheLoader.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/Loader/CacheLoader.php @@ -46,7 +46,7 @@ class CacheLoader extends Loader * * @param TemplateReferenceInterface $template A template * - * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise + * @return Storage|bool false if the template cannot be loaded, a Storage instance otherwise */ public function load(TemplateReferenceInterface $template) { @@ -92,9 +92,9 @@ class CacheLoader extends Loader * Returns true if the template is still fresh. * * @param TemplateReferenceInterface $template A template - * @param integer $time The last modification time of the cached template (timestamp) + * @param int $time The last modification time of the cached template (timestamp) * - * @return Boolean + * @return bool */ public function isFresh(TemplateReferenceInterface $template, $time) { diff --git a/vendor/symfony/templating/Symfony/Component/Templating/Loader/ChainLoader.php b/vendor/symfony/templating/Symfony/Component/Templating/Loader/ChainLoader.php index bcb250b08f..0548156aff 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/Loader/ChainLoader.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/Loader/ChainLoader.php @@ -50,7 +50,7 @@ class ChainLoader extends Loader * * @param TemplateReferenceInterface $template A template * - * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise + * @return Storage|bool false if the template cannot be loaded, a Storage instance otherwise */ public function load(TemplateReferenceInterface $template) { @@ -67,9 +67,9 @@ class ChainLoader extends Loader * Returns true if the template is still fresh. * * @param TemplateReferenceInterface $template A template - * @param integer $time The last modification time of the cached template (timestamp) + * @param int $time The last modification time of the cached template (timestamp) * - * @return Boolean + * @return bool */ public function isFresh(TemplateReferenceInterface $template, $time) { diff --git a/vendor/symfony/templating/Symfony/Component/Templating/Loader/FilesystemLoader.php b/vendor/symfony/templating/Symfony/Component/Templating/Loader/FilesystemLoader.php index 08c2e6a9d9..40747e5142 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/Loader/FilesystemLoader.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/Loader/FilesystemLoader.php @@ -43,7 +43,7 @@ class FilesystemLoader extends Loader * * @param TemplateReferenceInterface $template A template * - * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise + * @return Storage|bool false if the template cannot be loaded, a Storage instance otherwise * * @api */ @@ -93,9 +93,9 @@ class FilesystemLoader extends Loader * Returns true if the template is still fresh. * * @param TemplateReferenceInterface $template A template - * @param integer $time The last modification time of the cached template (timestamp) + * @param int $time The last modification time of the cached template (timestamp) * - * @return Boolean true if the template is still fresh, false otherwise + * @return bool true if the template is still fresh, false otherwise * * @api */ @@ -113,7 +113,7 @@ class FilesystemLoader extends Loader * * @param string $file A path * - * @return Boolean true if the path exists and is absolute, false otherwise + * @return bool true if the path exists and is absolute, false otherwise */ protected static function isAbsolutePath($file) { diff --git a/vendor/symfony/templating/Symfony/Component/Templating/Loader/LoaderInterface.php b/vendor/symfony/templating/Symfony/Component/Templating/Loader/LoaderInterface.php index 3f96222b11..a4365c6361 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/Loader/LoaderInterface.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/Loader/LoaderInterface.php @@ -28,7 +28,7 @@ interface LoaderInterface * * @param TemplateReferenceInterface $template A template * - * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise + * @return Storage|bool false if the template cannot be loaded, a Storage instance otherwise * * @api */ @@ -38,9 +38,9 @@ interface LoaderInterface * Returns true if the template is still fresh. * * @param TemplateReferenceInterface $template A template - * @param integer $time The last modification time of the cached template (timestamp) + * @param int $time The last modification time of the cached template (timestamp) * - * @return Boolean + * @return bool * * @api */ diff --git a/vendor/symfony/templating/Symfony/Component/Templating/PhpEngine.php b/vendor/symfony/templating/Symfony/Component/Templating/PhpEngine.php index 9ba1ae92da..e799db0bb1 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/PhpEngine.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/PhpEngine.php @@ -32,6 +32,9 @@ class PhpEngine implements EngineInterface, \ArrayAccess { protected $loader; protected $current; + /** + * @var HelperInterface[] + */ protected $helpers = array(); protected $parents = array(); protected $stack = array(); @@ -198,7 +201,7 @@ class PhpEngine implements EngineInterface, \ArrayAccess * * @param string $name The helper name * - * @return Boolean true if the helper is defined, false otherwise + * @return bool true if the helper is defined, false otherwise * * @api */ @@ -284,7 +287,7 @@ class PhpEngine implements EngineInterface, \ArrayAccess * * @param string $name The helper name * - * @return Boolean true if the helper is defined, false otherwise + * @return bool true if the helper is defined, false otherwise * * @api */ @@ -364,6 +367,10 @@ class PhpEngine implements EngineInterface, \ArrayAccess public function setCharset($charset) { $this->charset = $charset; + + foreach ($this->helpers as $helper) { + $helper->setCharset($this->charset); + } } /** diff --git a/vendor/symfony/templating/Symfony/Component/Templating/Tests/PhpEngineTest.php b/vendor/symfony/templating/Symfony/Component/Templating/Tests/PhpEngineTest.php index d7fe561656..fa0134aae1 100644 --- a/vendor/symfony/templating/Symfony/Component/Templating/Tests/PhpEngineTest.php +++ b/vendor/symfony/templating/Symfony/Component/Templating/Tests/PhpEngineTest.php @@ -13,7 +13,6 @@ namespace Symfony\Component\Templating\Tests; use Symfony\Component\Templating\PhpEngine; use Symfony\Component\Templating\Loader\Loader; -use Symfony\Component\Templating\Storage\Storage; use Symfony\Component\Templating\Storage\StringStorage; use Symfony\Component\Templating\Helper\SlotsHelper; use Symfony\Component\Templating\TemplateNameParser; @@ -152,10 +151,14 @@ class PhpEngineTest extends \PHPUnit_Framework_TestCase public function testGetSetCharset() { - $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader); - $this->assertEquals('UTF-8', $engine->getCharset(), '->getCharset() returns UTF-8 by default'); + $helper = new SlotsHelper(); + $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader, array($helper)); + $this->assertEquals('UTF-8', $engine->getCharset(), 'EngineInterface::getCharset() returns UTF-8 by default'); + $this->assertEquals('UTF-8', $helper->getCharset(), 'HelperInterface::getCharset() returns UTF-8 by default'); + $engine->setCharset('ISO-8859-1'); - $this->assertEquals('ISO-8859-1', $engine->getCharset(), '->setCharset() changes the default charset to use'); + $this->assertEquals('ISO-8859-1', $engine->getCharset(), 'EngineInterface::setCharset() changes the default charset to use'); + $this->assertEquals('ISO-8859-1', $helper->getCharset(), 'EngineInterface::setCharset() changes the default charset of helper'); } public function testGlobalVariables() diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php index 0b41190539..08005b097d 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/CsvFileDumper.php @@ -24,7 +24,7 @@ class CsvFileDumper extends FileDumper private $enclosure = '"'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain = 'messages') { @@ -54,7 +54,7 @@ class CsvFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php index ffe6017720..853f1771aa 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/FileDumper.php @@ -25,7 +25,7 @@ use Symfony\Component\Translation\MessageCatalogue; abstract class FileDumper implements DumperInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function dump(MessageCatalogue $messages, $options = array()) { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php index 979153ac22..2da7cf33b3 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IcuResFileDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\Translation\MessageCatalogue; class IcuResFileDumper implements DumperInterface { /** - * {@inheritDoc} + * {@inheritdoc} */ public function dump(MessageCatalogue $messages, $options = array()) { @@ -49,7 +49,7 @@ class IcuResFileDumper implements DumperInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain = 'messages') { @@ -126,7 +126,7 @@ class IcuResFileDumper implements DumperInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php index 173cf8c12d..45df389bd6 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/IniFileDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\Translation\MessageCatalogue; class IniFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain = 'messages') { @@ -36,7 +36,7 @@ class IniFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/JsonFileDumper.php index 762392b406..fea7827498 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/JsonFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/JsonFileDumper.php @@ -25,7 +25,7 @@ if (!defined('JSON_PRETTY_PRINT')) { class JsonFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain = 'messages') { @@ -33,7 +33,7 @@ class JsonFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php index a3a2a64933..26096d3552 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/MoFileDumper.php @@ -22,7 +22,7 @@ use Symfony\Component\Translation\Loader\MoFileLoader; class MoFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain = 'messages') { @@ -68,7 +68,7 @@ class MoFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php index e504facf2b..b354c1245c 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PhpFileDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\Translation\MessageCatalogue; class PhpFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function format(MessageCatalogue $messages, $domain) { @@ -31,7 +31,7 @@ class PhpFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php index 8ab589a94a..c091d4c41e 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/PoFileDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\Translation\MessageCatalogue; class PoFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain = 'messages') { @@ -47,7 +47,7 @@ class PoFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php index a1a848058e..42aa093481 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/QtFileDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\Translation\MessageCatalogue; class QtFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ public function format(MessageCatalogue $messages, $domain) { @@ -41,7 +41,7 @@ class QtFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php index 0d258aad36..96c0c8a387 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/XliffFileDumper.php @@ -21,7 +21,7 @@ use Symfony\Component\Translation\MessageCatalogue; class XliffFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function format(MessageCatalogue $messages, $domain) { @@ -57,7 +57,7 @@ class XliffFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php index d8072fb753..3fd3f1499d 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Dumper/YamlFileDumper.php @@ -22,7 +22,7 @@ use Symfony\Component\Yaml\Yaml; class YamlFileDumper extends FileDumper { /** - * {@inheritDoc} + * {@inheritdoc} */ protected function format(MessageCatalogue $messages, $domain) { @@ -30,7 +30,7 @@ class YamlFileDumper extends FileDumper } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function getExtension() { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php b/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php index 0d07a93f42..50e3c84579 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Extractor/ChainExtractor.php @@ -39,7 +39,7 @@ class ChainExtractor implements ExtractorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setPrefix($prefix) { @@ -49,7 +49,7 @@ class ChainExtractor implements ExtractorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extract($directory, MessageCatalogue $catalogue) { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Interval.php b/vendor/symfony/translation/Symfony/Component/Translation/Interval.php index 033b018840..1a50c3abe2 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Interval.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Interval.php @@ -36,10 +36,10 @@ class Interval /** * Tests if the given number is in the math interval. * - * @param integer $number A number + * @param int $number A number * @param string $interval An interval * - * @return Boolean + * @return bool * * @throws \InvalidArgumentException */ diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php index 104883b0c5..a36cd76e71 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuDatFileLoader.php @@ -36,7 +36,12 @@ class IcuDatFileLoader extends IcuResFileLoader throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); } - $rb = new \ResourceBundle($locale, $resource); + try { + $rb = new \ResourceBundle($locale, $resource); + } catch (\Exception $e) { + // HHVM compatibility: constructor throws on invalid resource + $rb = null; + } if (!$rb) { throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource)); diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php index 81b8e0fcec..7370fe0335 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/IcuResFileLoader.php @@ -36,7 +36,12 @@ class IcuResFileLoader implements LoaderInterface throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); } - $rb = new \ResourceBundle($locale, $resource); + try { + $rb = new \ResourceBundle($locale, $resource); + } catch (\Exception $e) { + // HHVM compatibility: constructor throws on invalid resource + $rb = null; + } if (!$rb) { throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource)); diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/JsonFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/JsonFileLoader.php index 4d3613b03f..515111e0e2 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Loader/JsonFileLoader.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/JsonFileLoader.php @@ -54,7 +54,7 @@ class JsonFileLoader extends ArrayLoader implements LoaderInterface /** * Translates JSON_ERROR_* constant into meaningful message. * - * @param integer $errorCode Error code returned by json_last_error() call + * @param int $errorCode Error code returned by json_last_error() call * * @return string Message string */ diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php index 88c397cf2f..f5fe1df8d6 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/MoFileLoader.php @@ -39,7 +39,7 @@ class MoFileLoader extends ArrayLoader implements LoaderInterface /** * The size of the header of a MO file in bytes. * - * @var integer Number of bytes. + * @var int Number of bytes. */ const MO_HEADER_SIZE = 28; @@ -169,14 +169,14 @@ class MoFileLoader extends ArrayLoader implements LoaderInterface * Reads an unsigned long from stream respecting endianess. * * @param resource $stream - * @param boolean $isBigEndian - * @return integer + * @param bool $isBigEndian + * @return int */ private function readLong($stream, $isBigEndian) { $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4)); $result = current($result); - return (integer) substr($result, -8); + return (int) substr($result, -8); } } diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php index 97b1c0c205..73f7f02364 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/PoFileLoader.php @@ -134,7 +134,7 @@ class PoFileLoader extends ArrayLoader implements LoaderInterface $item['ids']['plural'] = substr($line, 14, -1); } elseif (substr($line, 0, 7) === 'msgstr[') { $size = strpos($line, ']'); - $item['translated'][(integer) substr($line, 7, 1)] = substr($line, $size + 3, -1); + $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1); } } diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php index f46b5dfee4..a86b02c2ee 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Loader/XliffFileLoader.php @@ -124,7 +124,7 @@ class XliffFileLoader implements LoaderInterface /** * Returns the XML errors of the internal XML parser * - * @param Boolean $internalErrors + * @param bool $internalErrors * * @return array An array of errors */ diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php index 1d8a08d885..aa92a587fb 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogue.php @@ -253,8 +253,6 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf return $this->metadata[$domain][$key]; } } - - return null; } /** diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php index 5e9be20c73..9ea6d69986 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/MessageCatalogueInterface.php @@ -70,7 +70,7 @@ interface MessageCatalogueInterface * @param string $id The message id * @param string $domain The domain name * - * @return Boolean true if the message has a translation, false otherwise + * @return bool true if the message has a translation, false otherwise * * @api */ @@ -82,7 +82,7 @@ interface MessageCatalogueInterface * @param string $id The message id * @param string $domain The domain name * - * @return Boolean true if the message has a translation, false otherwise + * @return bool true if the message has a translation, false otherwise * * @api */ diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php b/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php index 8b416e947c..1802d16e27 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/MessageSelector.php @@ -40,7 +40,7 @@ class MessageSelector * {0} There are no apples|one: There is one apple|more: There are %count% apples * * @param string $message The message being translated - * @param integer $number The number of items represented for the message + * @param int $number The number of items represented for the message * @param string $locale The locale to use for choosing * * @return string diff --git a/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php index 1c4393510f..e93c6fbc71 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/MetadataAwareInterface.php @@ -25,8 +25,8 @@ interface MetadataAwareInterface * domain and then by key. Passing an empty key will return an array with all * metadata for the given domain. * - * @param string $domain The domain name * @param string $key The key + * @param string $domain The domain name * * @return mixed The value that was set or an array with the domains/keys or null */ @@ -47,8 +47,8 @@ interface MetadataAwareInterface * Passing an empty domain will delete all metadata. Passing an empty key will * delete all metadata for the given domain. * - * @param string $domain The domain name * @param string $key The key + * @param string $domain The domain name */ public function deleteMetadata($key = '', $domain = 'messages'); } diff --git a/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php b/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php index 1c695ea57a..b09a7878de 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/PluralizationRules.php @@ -24,10 +24,10 @@ class PluralizationRules /** * Returns the plural position to use for the given locale and number. * - * @param integer $number The number + * @param int $number The number * @param string $locale The locale * - * @return integer The plural position + * @return int The plural position */ public static function get($number, $locale) { @@ -180,7 +180,7 @@ class PluralizationRules return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); case 'ar': - return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number >= 3) && ($number <= 10)) ? 3 : ((($number >= 11) && ($number <= 99)) ? 4 : 5)))); + return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); default: return 0; diff --git a/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php b/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php index 26f9e2f97d..0381535468 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php @@ -95,7 +95,7 @@ class PluralizationRulesTest extends \PHPUnit_Framework_TestCase * * @param string $nplural plural expected * @param array $matrix containing langcodes and their plural index values. - * @param boolean $expectSuccess + * @param bool $expectSuccess */ protected function validateMatrix($nplural, $matrix, $expectSuccess = true) { diff --git a/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php b/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php index 8d12341fc1..35148c4d56 100644 --- a/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php +++ b/vendor/symfony/translation/Symfony/Component/Translation/TranslatorInterface.php @@ -38,7 +38,7 @@ interface TranslatorInterface * Translates the given choice message by choosing a translation according to a number. * * @param string $id The message id (may also be an object that can be cast to string) - * @param integer $number The number to use to find the indice of the message + * @param int $number The number to use to find the indice of the message * @param array $parameters An array of parameters for the message * @param string|null $domain The domain for the message or null to use the default * @param string|null $locale The locale or null to use the default diff --git a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/CodeExtension.php b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/CodeExtension.php index 852bd3af84..763f315f8a 100644 --- a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/CodeExtension.php +++ b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/CodeExtension.php @@ -157,7 +157,7 @@ class CodeExtension extends \Twig_Extension * Formats a file path. * * @param string $file An absolute file path - * @param integer $line The line number + * @param int $line The line number * @param string $text Use this text for the link rather than the file path * * @return string @@ -186,7 +186,7 @@ class CodeExtension extends \Twig_Extension * Returns the link for a given file/line pair. * * @param string $file An absolute file path - * @param integer $line The line number + * @param int $line The line number * * @return string A link of false */ diff --git a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/FormExtension.php b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/FormExtension.php index 429e65c519..74b2618af6 100644 --- a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/FormExtension.php +++ b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Extension/FormExtension.php @@ -113,7 +113,7 @@ class FormExtension extends \Twig_Extension * @param ChoiceView $choice The choice to check. * @param string|array $selectedValue The selected value to compare. * - * @return Boolean Whether the choice is selected. + * @return bool Whether the choice is selected. * * @see ChoiceView::isSelected() */ diff --git a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Form/TwigRendererEngine.php b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Form/TwigRendererEngine.php index 768a0816fd..cef761d025 100644 --- a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Form/TwigRendererEngine.php +++ b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Form/TwigRendererEngine.php @@ -74,7 +74,7 @@ class TwigRendererEngine extends AbstractRendererEngine implements TwigRendererE * @param FormView $view The form view for finding the applying themes. * @param string $blockName The name of the block to load. * - * @return Boolean True if the resource could be loaded, false otherwise. + * @return bool True if the resource could be loaded, false otherwise. */ protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName) { diff --git a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/Scope.php b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/Scope.php index 12ad604d35..635c54ece2 100644 --- a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/Scope.php +++ b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/Scope.php @@ -32,7 +32,7 @@ class Scope private $data = array(); /** - * @var boolean + * @var bool */ private $left = false; @@ -95,7 +95,7 @@ class Scope * * @param string $key * - * @return boolean + * @return bool */ public function has($key) { diff --git a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php index 592c250625..0ce1f3d92a 100644 --- a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php +++ b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php @@ -111,7 +111,7 @@ class TranslationNodeVisitor implements \Twig_NodeVisitorInterface } elseif ($arguments->hasNode($index)) { $argument = $arguments->getNode($index); } else { - return null; + return; } return $this->getReadDomainFromNode($argument); @@ -125,7 +125,7 @@ class TranslationNodeVisitor implements \Twig_NodeVisitorInterface private function getReadDomainFromNode(\Twig_Node $node = null) { if (null === $node) { - return null; + return; } if ($node instanceof \Twig_Node_Expression_Constant) { diff --git a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Translation/TwigExtractor.php b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Translation/TwigExtractor.php index 7f8d687308..50c8f9f6fe 100644 --- a/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Translation/TwigExtractor.php +++ b/vendor/symfony/twig-bridge/Symfony/Bridge/Twig/Translation/TwigExtractor.php @@ -50,7 +50,7 @@ class TwigExtractor implements ExtractorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function extract($directory, MessageCatalogue $catalogue) { @@ -63,7 +63,7 @@ class TwigExtractor implements ExtractorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function setPrefix($prefix) { diff --git a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php index dfd9143bc8..0f8a6ba7d6 100644 --- a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php +++ b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php @@ -69,7 +69,7 @@ class TemplateCacheCacheWarmer implements CacheWarmerInterface /** * Checks whether this warmer is optional or not. * - * @return Boolean always true + * @return bool always true */ public function isOptional() { diff --git a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php index 5a52791966..9557fb4aba 100644 --- a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php +++ b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php @@ -64,7 +64,7 @@ class ExceptionController } /** - * @param integer $startObLevel + * @param int $startObLevel * * @return string */ @@ -86,8 +86,8 @@ class ExceptionController /** * @param Request $request * @param string $format - * @param integer $code An HTTP response status code - * @param Boolean $debug + * @param int $code An HTTP response status code + * @param bool $debug * * @return TemplateReference */ diff --git a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Debug/TimedTwigEngine.php b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Debug/TimedTwigEngine.php index 33178e70a8..1a73eee9bb 100644 --- a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Debug/TimedTwigEngine.php +++ b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Debug/TimedTwigEngine.php @@ -12,7 +12,6 @@ namespace Symfony\Bundle\TwigBundle\Debug; use Symfony\Bundle\TwigBundle\TwigEngine; -use Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables; use Symfony\Component\Templating\TemplateNameParserInterface; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Component\Config\FileLocatorInterface; @@ -33,11 +32,10 @@ class TimedTwigEngine extends TwigEngine * @param TemplateNameParserInterface $parser A TemplateNameParserInterface instance * @param FileLocatorInterface $locator A FileLocatorInterface instance * @param Stopwatch $stopwatch A Stopwatch instance - * @param GlobalVariables $globals A GlobalVariables instance */ - public function __construct(\Twig_Environment $environment, TemplateNameParserInterface $parser, FileLocatorInterface $locator, Stopwatch $stopwatch, GlobalVariables $globals = null) + public function __construct(\Twig_Environment $environment, TemplateNameParserInterface $parser, FileLocatorInterface $locator, Stopwatch $stopwatch) { - parent::__construct($environment, $parser, $locator, $globals); + parent::__construct($environment, $parser, $locator); $this->stopwatch = $stopwatch; } diff --git a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Resources/config/debug.xml b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Resources/config/debug.xml index 2857e18b73..c44ae63121 100644 --- a/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Resources/config/debug.xml +++ b/vendor/symfony/twig-bundle/Symfony/Bundle/TwigBundle/Resources/config/debug.xml @@ -14,7 +14,6 @@ - diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php index 0f2c226ae9..c0b9ded483 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php @@ -169,7 +169,6 @@ abstract class Constraint */ public function getDefaultOption() { - return null; } /** diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php index fec20a9c2b..201db0f230 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php @@ -26,7 +26,7 @@ abstract class ConstraintValidator implements ConstraintValidatorInterface protected $context; /** - * {@inheritDoc} + * {@inheritdoc} */ public function initialize(ExecutionContextInterface $context) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php index 5cf36eccff..ade09ba2e1 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php @@ -39,22 +39,13 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getInstance(Constraint $constraint) { $className = $constraint->validatedBy(); - // The second condition is a hack that is needed when CollectionValidator - // calls itself recursively (Collection constraints can be nested). - // Since the context of the validator is overwritten when initialize() - // is called for the nested constraint, the outer validator is - // acting on the wrong context when the nested validation terminates. - // - // A better solution - which should be approached in Symfony 3.0 - is to - // remove the initialize() method and pass the context as last argument - // to validate() instead. - if (!isset($this->validators[$className]) || 'Symfony\Component\Validator\Constraints\CollectionValidator' === $className) { + if (!isset($this->validators[$className])) { $this->validators[$className] = 'validator.expression' === $className ? new ExpressionValidator($this->propertyAccessor) : new $className(); diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php index 36a42aaec4..ddd14dbdc0 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php @@ -34,7 +34,7 @@ class ConstraintViolation implements ConstraintViolationInterface private $messageParameters; /** - * @var integer|null + * @var int|null */ private $messagePluralization; @@ -72,7 +72,7 @@ class ConstraintViolation implements ConstraintViolationInterface * value. * @param mixed $invalidValue The invalid value causing the * violation. - * @param integer|null $messagePluralization The pluralization parameter. + * @param int|null $messagePluralization The pluralization parameter. * @param mixed $code The error code of the * violation, if any. */ @@ -118,7 +118,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageTemplate() { @@ -126,7 +126,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessageParameters() { @@ -134,7 +134,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessagePluralization() { @@ -142,7 +142,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMessage() { @@ -150,7 +150,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getRoot() { @@ -158,7 +158,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getPropertyPath() { @@ -166,7 +166,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getInvalidValue() { @@ -174,7 +174,7 @@ class ConstraintViolation implements ConstraintViolationInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getCode() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php index cf1d5b9967..32be7c6550 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php @@ -85,7 +85,7 @@ interface ConstraintViolationInterface * This method returns the value of the parameter for choosing the right * pluralization form (in this case "choices"). * - * @return integer|null The number to use to pluralize of the message. + * @return int|null The number to use to pluralize of the message. */ public function getMessagePluralization(); diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php index 84e0a6316d..cccfa86aea 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php @@ -52,7 +52,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function add(ConstraintViolationInterface $violation) { @@ -60,7 +60,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function addAll(ConstraintViolationListInterface $otherList) { @@ -70,7 +70,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function get($offset) { @@ -82,7 +82,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function has($offset) { @@ -90,7 +90,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function set($offset, ConstraintViolationInterface $violation) { @@ -98,7 +98,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function remove($offset) { @@ -106,7 +106,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getIterator() { @@ -114,7 +114,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function count() { @@ -122,7 +122,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function offsetExists($offset) { @@ -130,7 +130,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function offsetGet($offset) { @@ -138,7 +138,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function offsetSet($offset, $violation) { @@ -150,7 +150,7 @@ class ConstraintViolationList implements \IteratorAggregate, ConstraintViolation } /** - * {@inheritDoc} + * {@inheritdoc} */ public function offsetUnset($offset) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php index 21b857ec09..6923519ff5 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php @@ -41,7 +41,7 @@ interface ConstraintViolationListInterface extends \Traversable, \Countable, \Ar /** * Returns the violation at a given offset. * - * @param integer $offset The offset of the violation. + * @param int $offset The offset of the violation. * * @return ConstraintViolationInterface The violation. * @@ -54,9 +54,9 @@ interface ConstraintViolationListInterface extends \Traversable, \Countable, \Ar /** * Returns whether the given offset exists. * - * @param integer $offset The violation offset. + * @param int $offset The violation offset. * - * @return Boolean Whether the offset exists. + * @return bool Whether the offset exists. * * @api */ @@ -65,7 +65,7 @@ interface ConstraintViolationListInterface extends \Traversable, \Countable, \Ar /** * Sets a violation at a given offset. * - * @param integer $offset The violation offset. + * @param int $offset The violation offset. * @param ConstraintViolationInterface $violation The violation. * * @api @@ -75,7 +75,7 @@ interface ConstraintViolationListInterface extends \Traversable, \Countable, \Ar /** * Removes a violation at a given offset. * - * @param integer $offset The offset to remove. + * @param int $offset The offset to remove. * * @api */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparison.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparison.php index fdf080b206..fb1f1f3ef7 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparison.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparison.php @@ -25,7 +25,7 @@ abstract class AbstractComparison extends Constraint public $value; /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct($options = null) { @@ -40,7 +40,7 @@ abstract class AbstractComparison extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getDefaultOption() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php index d5f904bab9..010039ac61 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; abstract class AbstractComparisonValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { @@ -77,7 +77,7 @@ abstract class AbstractComparisonValidator extends ConstraintValidator * @param mixed $value1 The first value to compare * @param mixed $value2 The second value to compare * - * @return Boolean true if the relationship is valid, false otherwise + * @return bool true if the relationship is valid, false otherwise */ abstract protected function compareValues($value1, $value2); } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php index 537168625c..9513297132 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * @@ -26,7 +27,7 @@ class All extends Constraint public $constraints = array(); /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct($options = null) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php index c38f19a666..868863a552 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php @@ -23,7 +23,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class AllValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { @@ -35,11 +35,12 @@ class AllValidator extends ConstraintValidator throw new UnexpectedTypeException($value, 'array or Traversable'); } - $group = $this->context->getGroup(); + $context = $this->context; + $group = $context->getGroup(); foreach ($value as $key => $element) { foreach ($constraint->constraints as $constr) { - $this->context->validateValue($element, $constr, '['.$key.']', $group); + $context->validateValue($element, $constr, '['.$key.']', $group); } } } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php index 509479d5e6..766ce6c7bb 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php index 0a673588fc..06064620f1 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class BlankValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php index 01aeb6ddb7..ddc323a34f 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"CLASS", "PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php index 28b34250af..2c963381b1 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException; class CallbackValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($object, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php index 0bc1c93afc..a8f38a982d 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php @@ -17,6 +17,7 @@ use Symfony\Component\Validator\Constraint; * Metadata for the CardSchemeValidator. * * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) */ class CardScheme extends Constraint { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php index 50508aeed2..c2b3436206 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * @@ -34,7 +35,7 @@ class Choice extends Constraint public $maxMessage = 'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function getDefaultOption() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php index 294e7dbfc9..ef9ae6e3ad 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php @@ -28,7 +28,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class ChoiceValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php index 78fa5aee9d..1e9cb549de 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * @@ -30,7 +31,7 @@ class Collection extends Constraint public $missingFieldsMessage = 'This field is missing.'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct($options = null) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php index 904d62e08f..f7a9204eb6 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraints\Optional as BaseOptional; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php index 51af2de09c..e358343618 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraints\Required as BaseRequired; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php index f273ac40b9..e3ecc661e2 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php @@ -23,7 +23,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class CollectionValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { @@ -35,7 +35,17 @@ class CollectionValidator extends ConstraintValidator throw new UnexpectedTypeException($value, 'array or Traversable and ArrayAccess'); } - $group = $this->context->getGroup(); + // We need to keep the initialized context when CollectionValidator + // calls itself recursively (Collection constraints can be nested). + // Since the context of the validator is overwritten when initialize() + // is called for the nested constraint, the outer validator is + // acting on the wrong context when the nested validation terminates. + // + // A better solution - which should be approached in Symfony 3.0 - is to + // remove the initialize() method and pass the context as last argument + // to validate() instead. + $context = $this->context; + $group = $context->getGroup(); foreach ($constraint->fields as $field => $fieldConstraint) { if ( @@ -44,10 +54,10 @@ class CollectionValidator extends ConstraintValidator ($value instanceof \ArrayAccess && $value->offsetExists($field)) ) { foreach ($fieldConstraint->constraints as $constr) { - $this->context->validateValue($value[$field], $constr, '['.$field.']', $group); + $context->validateValue($value[$field], $constr, '['.$field.']', $group); } } elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) { - $this->context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array( + $context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array( '{{ field }}' => $field ), null); } @@ -56,7 +66,7 @@ class CollectionValidator extends ConstraintValidator if (!$constraint->allowExtraFields) { foreach ($value as $field => $fieldValue) { if (!isset($constraint->fields[$field])) { - $this->context->addViolationAt('['.$field.']', $constraint->extraFieldsMessage, array( + $context->addViolationAt('['.$field.']', $constraint->extraFieldsMessage, array( '{{ field }}' => $field ), $fieldValue); } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php index 4a233c19f6..1d64344b4a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\MissingOptionsException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php index 0a3be12f95..d7d5025b1c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php @@ -21,7 +21,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class CountValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php index 81fa7e05fd..ff6f3d0e0a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php index 1b3f8653e4..6a8d1d6446 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class CountryValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Currency.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Currency.php index b3bfc8f68b..c09fe88bf2 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Currency.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Currency.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Miha Vrhovnik * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CurrencyValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CurrencyValidator.php index 4465e46dfe..4451047cdd 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CurrencyValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CurrencyValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class CurrencyValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php index f9923052e0..9e29168965 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php index 0618bc9b99..1657f43afc 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php index f891f9d621..733a3b7f5e 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php @@ -25,7 +25,7 @@ class DateValidator extends ConstraintValidator const PATTERN = '/^(\d{4})-(\d{2})-(\d{2})$/'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php index 581dfb985f..95714ded2e 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php index e0593102bc..e14546ce82 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php @@ -23,7 +23,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class EmailValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { @@ -59,7 +59,7 @@ class EmailValidator extends ConstraintValidator * * @param string $host Host * - * @return Boolean + * @return bool */ private function checkMX($host) { @@ -71,7 +71,7 @@ class EmailValidator extends ConstraintValidator * * @param string $host Host * - * @return Boolean + * @return bool */ private function checkHost($host) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualTo.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualTo.php index 3ae29a89fd..8d3d7524dd 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualTo.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualTo.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualToValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualToValidator.php index 2919f13633..3739dbebfe 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualToValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EqualToValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class EqualToValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Expression.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Expression.php index b845a32392..dfa242c31a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Expression.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Expression.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"CLASS", "PROPERTY", "METHOD", "ANNOTATION"}) * * @author Fabien Potencier * @author Bernhard Schussek @@ -25,7 +26,7 @@ class Expression extends Constraint public $expression; /** - * {@inheritDoc} + * {@inheritdoc} */ public function getDefaultOption() { @@ -33,7 +34,7 @@ class Expression extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getRequiredOptions() { @@ -41,7 +42,7 @@ class Expression extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getTargets() { @@ -49,7 +50,7 @@ class Expression extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function validatedBy() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ExpressionValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ExpressionValidator.php index e27859b08c..8411d0d6a3 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ExpressionValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ExpressionValidator.php @@ -40,7 +40,7 @@ class ExpressionValidator extends ConstraintValidator } /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php index fec54456fb..fc2e3e49cb 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php index 7cead61508..4e8c4df269 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class FalseValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php index 9144c60472..80527171ec 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php index 06e16ebe2c..5f499810e6 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\HttpFoundation\File\UploadedFile; class FileValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThan.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThan.php index df91125660..ec7fafb3a4 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThan.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThan.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php index 782893a04d..36fdd9c097 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php index f3b8210a3c..2363204174 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class GreaterThanOrEqualValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanValidator.php index c37ba44dde..fdcf0c1f94 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GreaterThanValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class GreaterThanValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php index 304fab8c94..f3876711ae 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php @@ -15,6 +15,7 @@ namespace Symfony\Component\Validator\Constraints; * Annotation for group sequences * * @Annotation + * @Target({"CLASS", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php index 457155981a..f53f2b8986 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php @@ -15,8 +15,8 @@ namespace Symfony\Component\Validator\Constraints; * Annotation to define a group sequence provider * * @Annotation + * @Target({"CLASS", "ANNOTATION"}) */ class GroupSequenceProvider { - } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Iban.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Iban.php index b1621959c9..628d21cace 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Iban.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Iban.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) */ class Iban extends Constraint { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IbanValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IbanValidator.php index d26363f37b..640da3c702 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IbanValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IbanValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class IbanValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalTo.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalTo.php index f4ae5becc3..6d00286d23 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalTo.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalTo.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalToValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalToValidator.php index 3d979513e3..a1867262aa 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalToValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IdenticalToValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class IdenticalToValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php index 9fa8725c6d..6401603a75 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @api */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php index 76ce8767fc..902ad3bdf4 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php @@ -23,7 +23,7 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException; class ImageValidator extends FileValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php index 099f2aabd7..f8e61c6d9e 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php @@ -18,6 +18,7 @@ use Symfony\Component\Validator\Constraint; * Validates that a value is a valid IP address * * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * @author Joseph Bielawski @@ -68,7 +69,7 @@ class Ip extends Constraint public $message = 'This is not a valid IP address.'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function __construct($options = null) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php index 3358ec25c4..69afe61b71 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class IpValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Isbn.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Isbn.php index 4a11e23448..6c978cf3b8 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Isbn.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Isbn.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\MissingOptionsException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author The Whole Life To Learn */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IsbnValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IsbnValidator.php index 62a3b0388e..a000e382ed 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IsbnValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IsbnValidator.php @@ -25,7 +25,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class IsbnValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Issn.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Issn.php index d7d77b6571..01a0f4315f 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Issn.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Issn.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Antonio J. García Lagar */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IssnValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IssnValidator.php index 7e0baa876d..0e580ea96c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IssnValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IssnValidator.php @@ -25,7 +25,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class IssnValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php index d14bcd922b..e7c29dc64b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php index 5c4dbed298..87019705db 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class LanguageValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php index 84c7303e22..b353e9b24d 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\MissingOptionsException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php index 8090a2c6a8..8dc68483c8 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php @@ -21,7 +21,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class LengthValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThan.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThan.php index 3d30ba25d3..b116320037 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThan.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThan.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqual.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqual.php index 5171c359af..7faca84221 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqual.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqual.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php index 46204b4109..dcc93b2503 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class LessThanOrEqualValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanValidator.php index 3d86ef366a..081316a588 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LessThanValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class LessThanValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php index 9cdd7880d0..12a55464a6 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php index 97c6aed977..daf594800b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class LocaleValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php index f8fd35c6c8..1feafe3e5b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php @@ -17,6 +17,7 @@ use Symfony\Component\Validator\Constraint; * Metadata for the LuhnValidator. * * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) */ class Luhn extends Constraint { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php index 4365ca298a..c578c6d81f 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php index dd3dbdd849..98c2730fe8 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class NotBlankValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualTo.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualTo.php index c532565978..abd80920fb 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualTo.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualTo.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualToValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualToValidator.php index 6618f31e40..5710a85b93 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualToValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotEqualToValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class NotEqualToValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalTo.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalTo.php index 49da8586bb..fb4ef3f3c1 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalTo.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalTo.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Daniel Holmes */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php index ffcb8738df..ed8dc1c0dd 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Validator\Constraints; class NotIdenticalToValidator extends AbstractComparisonValidator { /** - * @inheritDoc + * {@inheritdoc} */ protected function compareValues($value1, $value2) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php index 6b1c7c0836..60416c76ec 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php index 4ee65928ef..254dd00d63 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class NotNullValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php index e0a00221d1..310455021b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php index 9753f43315..f0f09c492f 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class NullValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Optional.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Optional.php index 3f286e6340..36b615f3f3 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Optional.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Optional.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php index e705175521..067ffb8bf3 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\MissingOptionsException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php index 1a8ba15ac3..6f0ad51dba 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php @@ -20,7 +20,7 @@ use Symfony\Component\Validator\ConstraintValidator; class RangeValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php index e9aad6382c..aa4babba68 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * @@ -28,7 +29,7 @@ class Regex extends Constraint public $match = true; /** - * {@inheritDoc} + * {@inheritdoc} */ public function getDefaultOption() { @@ -36,7 +37,7 @@ class Regex extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getRequiredOptions() { @@ -78,7 +79,7 @@ class Regex extends Constraint { // If match = false, pattern should not be added to HTML5 validation if (!$this->match) { - return null; + return; } if (preg_match('/^(.)(\^?)(.*?)(\$?)\1$/', $this->pattern, $matches)) { @@ -92,7 +93,5 @@ class Regex extends Constraint return $start.$pattern.$end; } - - return null; } } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php index c39869d288..1f2febbbca 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php @@ -26,7 +26,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; class RegexValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Required.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Required.php index 609fffd841..66ced405e9 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Required.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Required.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek */ diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php index e7982ac6d6..42ede04325 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php index 31259cc4b3..cbaa816d1a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php @@ -25,7 +25,7 @@ class TimeValidator extends ConstraintValidator const PATTERN = '/^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php index 9e1d994ba2..788e36a9ee 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php index 2fbe0478ce..5ef74fd274 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class TrueValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php index cdcc10c91a..fc4cc72eb6 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * @@ -26,7 +27,7 @@ class Type extends Constraint public $type; /** - * {@inheritDoc} + * {@inheritdoc} */ public function getDefaultOption() { @@ -34,7 +35,7 @@ class Type extends Constraint } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getRequiredOptions() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php index ecc88dfbd1..f75bb0fd8b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php @@ -22,7 +22,7 @@ use Symfony\Component\Validator\ConstraintValidator; class TypeValidator extends ConstraintValidator { /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php index 3585e1b018..e867ee1f0a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php @@ -15,6 +15,7 @@ use Symfony\Component\Validator\Constraint; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php index 9b0f9de651..8ea05120bc 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php @@ -38,7 +38,7 @@ class UrlValidator extends ConstraintValidator $~ixu'; /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, Constraint $constraint) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php index ab4676d3df..99ec32667f 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php @@ -16,6 +16,7 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException; /** * @Annotation + * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) * * @author Bernhard Schussek * diff --git a/vendor/symfony/validator/Symfony/Component/Validator/DefaultTranslator.php b/vendor/symfony/validator/Symfony/Component/Validator/DefaultTranslator.php index 20b2e11350..c93f1b1f98 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/DefaultTranslator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/DefaultTranslator.php @@ -118,7 +118,7 @@ class DefaultTranslator implements TranslatorInterface * // -> These are 3 donkeys. * * @param string $id The message id - * @param integer $number The number to use to find the index of the message + * @param int $number The number to use to find the index of the message * @param array $parameters An array of parameters for the message * @param string $domain Ignored * @param string $locale Ignored diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php b/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php index 31a959187e..320aa7390a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php @@ -168,8 +168,6 @@ class ExecutionContext implements ExecutionContextInterface if ($this->metadata instanceof ClassBasedInterface) { return $this->metadata->getClassName(); } - - return null; } /** @@ -180,8 +178,6 @@ class ExecutionContext implements ExecutionContextInterface if ($this->metadata instanceof PropertyMetadataInterface) { return $this->metadata->getPropertyName(); } - - return null; } /** diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php index 0b6c86633d..00b9f0d2cc 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php @@ -91,8 +91,8 @@ interface ExecutionContextInterface * @param string $message The error message. * @param array $params The parameters substituted in the error message. * @param mixed $invalidValue The invalid, validated value. - * @param integer|null $pluralization The number to use to pluralize of the message. - * @param integer|null $code The violation code. + * @param int|null $pluralization The number to use to pluralize of the message. + * @param int|null $code The violation code. * * @api */ @@ -106,8 +106,8 @@ interface ExecutionContextInterface * @param string $message The error message. * @param array $params The parameters substituted in the error message. * @param mixed $invalidValue The invalid, validated value. - * @param integer|null $pluralization The number to use to pluralize of the message. - * @param integer|null $code The violation code. + * @param int|null $pluralization The number to use to pluralize of the message. + * @param int|null $code The violation code. * * @api */ @@ -147,9 +147,9 @@ interface ExecutionContextInterface * @param null|string|string[] $groups The groups to validate in. If you don't pass any * groups here, the current group of the context * will be used. - * @param Boolean $traverse Whether to traverse the value if it is an array + * @param bool $traverse Whether to traverse the value if it is an array * or an instance of \Traversable. - * @param Boolean $deep Whether to traverse the value recursively if + * @param bool $deep Whether to traverse the value recursively if * it is a collection of collections. */ public function validate($value, $subPath = '', $groups = null, $traverse = false, $deep = false); diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php index 90dd282e08..985a3d303b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php @@ -21,7 +21,7 @@ use Symfony\Component\Validator\MetadataFactoryInterface; class BlackholeMetadataFactory implements MetadataFactoryInterface { /** - * @inheritdoc + * {@inheritdoc} */ public function getMetadataFor($value) { @@ -29,7 +29,7 @@ class BlackholeMetadataFactory implements MetadataFactoryInterface } /** - * @inheritdoc + * {@inheritdoc} */ public function hasMetadataFor($value) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php index b7e003ec3d..553d7806ad 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -58,7 +58,7 @@ class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassB public $groupSequence = array(); /** - * @var Boolean + * @var bool */ public $groupSequenceProvider = false; @@ -166,7 +166,7 @@ class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassB } /** - * {@inheritDoc} + * {@inheritdoc} */ public function addConstraint(Constraint $constraint) { @@ -282,7 +282,7 @@ class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassB * * @param string $property The name of the property * - * @return Boolean + * @return bool */ public function hasMemberMetadatas($property) { @@ -358,7 +358,7 @@ class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassB /** * Returns whether this class has an overridden default group sequence. * - * @return Boolean + * @return bool */ public function hasGroupSequence() { @@ -392,7 +392,7 @@ class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassB /** * Sets whether a group sequence provider should be used. * - * @param Boolean $active + * @param bool $active * * @throws GroupDefinitionException */ @@ -412,7 +412,7 @@ class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassB /** * Returns whether the class is a group sequence provider. * - * @return Boolean + * @return bool */ public function isGroupSequenceProvider() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php index 9dedb79fd9..f7c48ed66c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php @@ -84,7 +84,7 @@ abstract class ElementMetadata /** * Returns whether this element has any constraints. * - * @return Boolean + * @return bool */ public function hasConstraints() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php index 1e44062463..a4a2548125 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php @@ -40,7 +40,7 @@ class GetterMetadata extends MemberMetadata } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getPropertyValue($object) { @@ -48,7 +48,7 @@ class GetterMetadata extends MemberMetadata } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function newReflectionMember($objectOrClassName) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php index 10745c72e7..51ed7b0222 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php @@ -29,7 +29,7 @@ class AnnotationLoader implements LoaderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function loadClassMetadata(ClassMetadata $metadata) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php index a0c9ef127f..7378daf5e8 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php @@ -47,7 +47,7 @@ class LoaderChain implements LoaderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function loadClassMetadata(ClassMetadata $metadata) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php index bd679b0f71..43358ad1d9 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php @@ -20,7 +20,7 @@ interface LoaderInterface * * @param ClassMetadata $metadata A metadata * - * @return Boolean + * @return bool */ public function loadClassMetadata(ClassMetadata $metadata); } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php index d8086b2b9c..54dcc57cc7 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php @@ -24,7 +24,7 @@ class StaticMethodLoader implements LoaderInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function loadClassMetadata(ClassMetadata $metadata) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php index 3f157c9241..c7d82c449c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php @@ -25,7 +25,7 @@ class XmlFileLoader extends FileLoader protected $classes = null; /** - * {@inheritDoc} + * {@inheritdoc} */ public function loadClassMetadata(ClassMetadata $metadata) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php index a4628cf073..02989ffe89 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php @@ -21,7 +21,7 @@ namespace Symfony\Component\Validator\Mapping\Loader; class XmlFilesLoader extends FilesLoader { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getFileLoaderInstance($file) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php index 9b3757d522..32d6c6ae7c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php @@ -26,7 +26,7 @@ class YamlFileLoader extends FileLoader protected $classes = null; /** - * {@inheritDoc} + * {@inheritdoc} */ public function loadClassMetadata(ClassMetadata $metadata) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php index bfffacef5c..12cd1a0af1 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php @@ -21,7 +21,7 @@ namespace Symfony\Component\Validator\Mapping\Loader; class YamlFilesLoader extends FilesLoader { /** - * {@inheritDoc} + * {@inheritdoc} */ public function getFileLoaderInstance($file) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php index c30a87ee06..6275c4146d 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php @@ -52,7 +52,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat } /** - * {@inheritDoc} + * {@inheritdoc} */ public function addConstraint(Constraint $constraint) { @@ -127,7 +127,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat * * @param object|string $objectOrClassName The object or the class name * - * @return Boolean + * @return bool */ public function isPublic($objectOrClassName) { @@ -139,7 +139,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat * * @param object|string $objectOrClassName The object or the class name * - * @return Boolean + * @return bool */ public function isProtected($objectOrClassName) { @@ -151,7 +151,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat * * @param object|string $objectOrClassName The object or the class name * - * @return Boolean + * @return bool */ public function isPrivate($objectOrClassName) { @@ -161,7 +161,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat /** * Returns whether objects stored in this member should be validated * - * @return Boolean + * @return bool */ public function isCascaded() { @@ -172,7 +172,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat * Returns whether arrays or traversable objects stored in this member * should be traversed and validated in each entry * - * @return Boolean + * @return bool */ public function isCollectionCascaded() { @@ -183,7 +183,7 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat * Returns whether arrays or traversable objects stored in this member * should be traversed recursively for inner arrays/traversable objects * - * @return Boolean + * @return bool */ public function isCollectionCascadedDeeply() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php index 468f196f04..f14b98ce6e 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php @@ -33,7 +33,7 @@ class PropertyMetadata extends MemberMetadata } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getPropertyValue($object) { @@ -41,7 +41,7 @@ class PropertyMetadata extends MemberMetadata } /** - * {@inheritDoc} + * {@inheritdoc} */ protected function newReflectionMember($objectOrClassName) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php index 6dbab06ab7..594225ac25 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php @@ -34,7 +34,7 @@ interface MetadataFactoryInterface * * @param mixed $value Some value. * - * @return Boolean Whether metadata exists for the value. + * @return bool Whether metadata exists for the value. */ public function hasMetadataFor($value); } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php index 20bafb2950..a3afb1db26 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php @@ -23,7 +23,7 @@ interface PropertyMetadataContainerInterface * * @param string $property The property name. * - * @return Boolean + * @return bool */ public function hasPropertyMetadata($property); diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf index 6310279cae..51de1275de 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Tato hodnota nesmí být typu {{ compared_value_type }} a zároveň nesmí být rovna {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + PomÄ›r stran obrázku je příliÅ¡ velký ({{ ratio }}). Maximální povolený pomÄ›r stran obrázku je {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + PomÄ›r stran obrázku je příliÅ¡ malý ({{ ratio }}). Minimální povolený pomÄ›r stran obrázku je {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + Strany obrázku jsou Ätvercové ({{ width }}x{{ height }}px). ÄŒtvercové obrázky nejsou povolené. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + Obrázek je orientovaný na šířku ({{ width }}x{{ height }}px). Obrázky orientované na šířku nejsou povolené. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + Obrázek je orientovaný na výšku ({{ width }}x{{ height }}px). Obrázky orientované na výšku nejsou povolené. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf index b3d9944b78..8f6144eead 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Dieser Wert sollte nicht identisch sein mit {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + Das Seitenverhältnis des Bildes ist zu groß ({{ ratio }}). Der erlaubte Maximalwert ist {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + Das Seitenverhältnis des Bildes ist zu klein ({{ ratio }}). Der erwartete Minimalwert ist {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + Das Bild ist quadratisch ({{ width }}x{{ height }}px). Quadratische Bilder sind nicht erlaubt. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + Das Bild ist im Querformat ({{ width }}x{{ height }}px). Bilder im Querformat sind nicht erlaubt. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + Das Bild ist im Hochformat ({{ width }}x{{ height }}px). Bilder im Hochformat sind nicht erlaubt. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf index 3b8b5d97a8..052189b0aa 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. This value should not be identical to {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf index 07848aae5f..2765fa2ae4 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Este valor no debería ser idéntico a {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + La proporción de la imagen es demasiado grande ({{ ratio }}). Maxima proporción permitida es {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + La proporción de la imagen es demasiado pequeña ({{ ratio }}). Mínima proporción permitida es {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + La imagen es cuadrada ({{ width }}x{{ height }}px). Imágenes cuadradas no son permitidas. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + La imagen está orientada horizontal ({{ width }}x{{ height }}px). Imágenes orientada horizontal no está permitido. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + La imagen está orientada vertical ({{ width }}x{{ height }}px). Imágenes orientada vertical no está permitido. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf index c1333f532c..66b4e29d55 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf @@ -180,7 +180,7 @@ This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters. - این مقدار Ù…ÛŒ بایست Ø¯Ù‚ÛŒÙØ§ {{ limit }} کاراکتر داشته باشد.|این مقدرا Ù…ÛŒ بایشت دقیقا {{ limit }} کاراکتر داشته باشد. + این مقدار Ù…ÛŒ بایست دقیقا {{ limit }} کاراکتر داشته باشد.| این مقدار Ù…ÛŒ بایست دقیقا {{ limit }} کاراکتر داشته باشد. The file was only partially uploaded. diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf index caa457823d..2a4f92342c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Cette valeur ne doit pas être identique à {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + Le rapport largeur/hauteur de l'image est trop grand ({{ ratio }}). Le rapport maximal autorisé est {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + Le rapport largeur/hauteur de l'image est trop petit ({{ ratio }}). Le rapport minimal attendu est {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + L'image est carrée ({{ width }}x{{ height }}px). Les images carrées ne sont pas autorisées. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + L'image est au format paysage ({{ width }}x{{ height }}px). Les images au format paysage ne sont pas autorisées. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + L'image est au format portrait ({{ width }}x{{ height }}px). Les images au format portrait ne sont pas autorisées. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf index b2263dadc8..94c71d540c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Ez az érték ne legyen ugyanolyan mint {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + A képarány túl nagy ({{ ratio }}). A megengedett legnagyobb képarány {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + A képarány túl kicsi ({{ ratio }}). A megengedett legkisebb képarány {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + A kép négyzet alakú ({{ width }}x{{ height }}px). A négyzet alakú képek nem engedélyezettek. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + A kép fekvÅ‘ tájolású ({{ width }}x{{ height }}px). A fekvÅ‘ tájolású képek nem engedélyezettek. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + A kép álló tájolású ({{ width }}x{{ height }}px). Az álló tájolású képek nem engedélyezettek. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf index 81463a6f79..1366192f33 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. {{ compared_value_type }}ã¨ã—ã¦ã®{{ compared_value }}ã¨ç­‰ã—ãã¦ã¯ã„ã‘ã¾ã›ã‚“。 + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + ç”»åƒã®ã‚¢ã‚¹ãƒšã‚¯ãƒˆæ¯”ãŒå¤§ãã™ãŽã¾ã™({{ ratio }})。{{ max_ratio }}ã¾ã§ã«ã—ã¦ãã ã•ã„。 + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + ç”»åƒã®ã‚¢ã‚¹ãƒšã‚¯ãƒˆæ¯”ãŒå°ã•ã™ãŽã¾ã™({{ ratio }})。{{ min_ratio }}以上ã«ã—ã¦ãã ã•ã„。 + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + ç”»åƒãŒæ­£æ–¹å½¢ã«ãªã£ã¦ã„ã¾ã™({{ width }}x{{ height }}ピクセル)。正方形ã®ç”»åƒã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + ç”»åƒãŒæ¨ªå‘ãã«ãªã£ã¦ã„ã¾ã™({{ width }}x{{ height }}ピクセル)。横å‘ãã®ç”»åƒã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + ç”»åƒãŒç¸¦å‘ãã«ãªã£ã¦ã„ã¾ã™({{ width }}x{{ height }}ピクセル)。縦å‘ãã®ç”»åƒã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“。 + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf index 2138ea9c01..0105b8bfe1 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Dëse Wäert sollt net identesch si mat {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + D'Säiteverhältnis vum Bild ass ze grouss ({{ ratio }}). Den erlaabte Maximalwäert ass {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + D'Säiteverhältnis vum Bild ass ze kleng ({{ ratio }}). Den erwaarte Minimalwäert ass {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + D'Bild ass quadratesch ({{ width }}x{{ height }}px). Quadratesch Biller sinn net erlaabt. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + D'Bild ass am Queeschformat ({{ width }}x{{ height }}px). Biller am Queeschformat sinn net erlaabt. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + D'Bild ass am Héichformat ({{ width }}x{{ height }}px). Biller am Héichformat sinn net erlaabt. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf index 4f435ce1fa..85c2e88c8a 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Ta wartość nie powinna być identycznego typu {{ compared_value_type }} oraz wartoÅ›ci {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + Proporcje obrazu sÄ… zbyt duże ({{ ratio }}). Maksymalne proporcje to {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + Proporcje obrazu sÄ… zbyt maÅ‚e ({{ ratio }}). Minimalne proporcje to {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + Obraz jest kwadratem ({{ width }}x{{ height }}px). Kwadratowe obrazy nie sÄ… akceptowane. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + Obraz jest panoramiczny ({{ width }}x{{ height }}px). Panoramiczne zdjÄ™cia nie sÄ… akceptowane. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + Obraz jest portretowy ({{ width }}x{{ height }}px). Portretowe zdjÄ™cia nie sÄ… akceptowane. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf index 2542788f34..f23c20fdd3 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf @@ -278,6 +278,26 @@ This value should not be identical to {{ compared_value_type }} {{ compared_value }}. Ta vrednost ne bi smela biti identiÄna {{ compared_value_type }} {{ compared_value }}. + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + Razmerje slike je preveliko ({{ ratio }}). NajveÄje dovoljeno razmerje je {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + Razmerje slike je premajhno ({{ ratio }}). NajmanjÅ¡e priÄakovano razmerje je {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + Slika je kvadrat ({{ width }}x{{ height }}px). Kvadratne slike niso dovoljene. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + Slika je ležeÄe usmerjena ({{ width }}x{{ height }}px). LežeÄe usmerjene slike niso dovoljene. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + Slika je pokonÄno usmerjena ({{ width }}x{{ height }}px). PokonÄno usmerjene slike niso dovoljene. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf index c4e8a88759..83fd9732f0 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf @@ -242,6 +242,62 @@ This value is not a valid ISSN. Ово није валидан ISSN. + + This value is not a valid currency. + Ово није валидна валута. + + + This value should be equal to {{ compared_value }}. + Ова вредноÑÑ‚ треба да буде {{ compared_value }}. + + + This value should be greater than {{ compared_value }}. + Ова вредноÑÑ‚ треба да буде већа од {{ compared_value }}. + + + This value should be greater than or equal to {{ compared_value }}. + Ова вредноÑÑ‚ треба да буде већа или једнака {{ compared_value }}. + + + This value should be identical to {{ compared_value_type }} {{ compared_value }}. + Ова вредноÑÑ‚ треба да буде идентична Ñа {{ compared_value_type }} {{ compared_value }}. + + + This value should be less than {{ compared_value }}. + Ова вредноÑÑ‚ треба да буде мања од {{ compared_value }}. + + + This value should be less than or equal to {{ compared_value }}. + Ова вредноÑÑ‚ треба да буде мања или једнака {{ compared_value }}. + + + This value should not be equal to {{ compared_value }}. + Ова вредноÑÑ‚ не треба да буде једнака {{ compared_value }}. + + + This value should not be identical to {{ compared_value_type }} {{ compared_value }}. + Ова вредноÑÑ‚ не треба да буде идентична Ñа {{ compared_value_type }} {{ compared_value }}. + + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + Размера ове Ñлике је превелика ({{ ratio }}). МакÑимална дозвољена размера је {{ max_ratio }}. + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + Размера ове Ñлике је премала ({{ ratio }}). Минимална очекивана размера је {{ min_ratio }}. + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + Слика је квадратна ({{ width }}x{{ height }}px). Квадратне Ñлике ниÑу дозвољене. + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + Слика је оријентације пејзажа ({{ width }}x{{ height }}px). Пејзажна оријентација Ñлика није дозвољена. + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + Слика је оријантације портрета ({{ width }}x{{ height }}px). Портретна оријентација Ñлика није дозвољена. + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.th.xlf b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.th.xlf new file mode 100644 index 0000000000..467b39dfc0 --- /dev/null +++ b/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.th.xlf @@ -0,0 +1,303 @@ + + + + + + This value should be false. + ค่านี้ควรจะเป็น false + + + This value should be true. + ค่านี้ควรจะเป็น true + + + This value should be of type {{ type }}. + ค่านี้ควรจะเป็นชนิด {{ type }} + + + This value should be blank. + ควรจะเป็นค่าว่าง + + + The value you selected is not a valid choice. + คุณเลือà¸à¸„่าที่ไม่ตรงà¸à¸±à¸šà¸•ัวเลือภ+ + + You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices. + คุณต้องเลือà¸à¸­à¸¢à¹ˆà¸²à¸‡à¸™à¹‰à¸­à¸¢ {{ limit }} ตัวเลือภ+ + + You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices. + คุณเลือà¸à¹„ด้มาà¸à¸—ี่สุด {{ limit }} ตัวเลือภ+ + + One or more of the given values is invalid. + มีบางค่าที่ส่งมาไม่ถูà¸à¸•้อง + + + The fields {{ fields }} were not expected. + {{ fields }} ฟิลด์เหล่านี้ไม่ใช่ฟิลด์ที่ถูà¸à¸•้อง + + + The fields {{ fields }} are missing. + {{ fields }} ฟิลด์เหล่านี้หายไป + + + This value is not a valid date. + ค่าของวันที่ไม่ถูà¸à¸•้อง + + + This value is not a valid datetime. + ค่าของวันที่à¹à¸¥à¸°à¹€à¸§à¸¥à¸²à¹„ม่ถูà¸à¸•้อง + + + This value is not a valid email address. + ค่าของอีเมล์ไม่ถูà¸à¸•้อง + + + The file could not be found. + ไม่พบไฟล์ + + + The file is not readable. + ไฟล์ไม่อยู่ในสถานะที่สามารถอ่านได้ + + + The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}. + ไฟล์ใหà¸à¹ˆà¹€à¸à¸´à¸™ ({{ size }} {{ suffix }}) อนุà¸à¸²à¸•ให้ใหà¸à¹ˆà¸—ี่สุดได้ไม่เà¸à¸´à¸™ {{ limit }} {{ suffix }} + + + The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}. + Mime type ของไฟล์ไม่ถูà¸à¸•้อง ({{ type }}) Mime types ที่อนุà¸à¸²à¸•คือ {{ types }} + + + This value should be {{ limit }} or less. + ค่านี้ควรจะเป็น {{ limit }} หรือน้อยà¸à¸§à¹ˆà¸²à¸™à¸±à¹‰à¸™ + + + This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less. + ค่านี้ยาวเà¸à¸´à¸™à¹„ป ควรจะมีà¹à¸„่ {{ limit }} ตัวอัà¸à¸©à¸£à¸«à¸£à¸·à¸­à¸™à¹‰à¸­à¸¢à¸à¸§à¹ˆà¸²à¸™à¸±à¹‰à¸™ + + + This value should be {{ limit }} or more. + ค่านี้ควรจะมี {{ limit }} หรือมาà¸à¸à¸§à¹ˆà¸²à¸™à¸±à¹‰à¸™ + + + This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more. + ค่านี้สั้นเà¸à¸´à¸™à¹„ป ควรจะมี {{ limit }} ตัวอัà¸à¸©à¸£à¸«à¸£à¸·à¸­à¸¡à¸²à¸à¸à¸§à¹ˆà¸²à¸™à¸±à¹‰à¸™ + + + This value should not be blank. + ค่านี้ไม่ควรเป็นค่าว่าง + + + This value should not be null. + ค่านี้ไม่ควรเป็นค่า null + + + This value should be null. + ค่านี้ควรเป็นค่า null + + + This value is not valid. + ค่านี้ไม่ถูà¸à¸•้อง + + + This value is not a valid time. + ค่าของเวลาไม่ถูà¸à¸•้อง + + + This value is not a valid URL. + ค่าของ URL ไม่ถูà¸à¸•้อง + + + The two values should be equal. + ค่าทั้งสองค่าควรจะเหมือนà¸à¸±à¸™ + + + The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}. + ขนาดไฟล์ใหà¸à¹ˆà¹€à¸à¸´à¸™à¹„ป อนุà¸à¸²à¸•ให้ไฟล์ขนาดใหà¸à¹ˆà¹„ด้ไม่เà¸à¸´à¸™ {{ limit }} {{ suffix }} + + + The file is too large. + ขนาดไฟล์ใหà¸à¹ˆà¹€à¸à¸´à¸™à¹„ป + + + The file could not be uploaded. + ไม่สามารถอัปโหลดไฟล์ได้ + + + This value should be a valid number. + ค่าของตัวเลขไม่ถูà¸à¸•้อง + + + This file is not a valid image. + ไฟล์นี้ไม่ใช่ไฟล์รูปภาพ + + + This is not a valid IP address. + ค่าของ IP ไม่ถูà¸à¸•้อง + + + This value is not a valid language. + ค่าของภาษาไม่ถูà¸à¸•้อง + + + This value is not a valid locale. + ค่าของภูมิภาค (Locale) ไม่ถูà¸à¸•้อง + + + This value is not a valid country. + ค่าของประเทศไม่ถูà¸à¸•้อง + + + This value is already used. + Tค่านี้ถูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ปà¹à¸¥à¹‰à¸§ + + + The size of the image could not be detected. + ไม่สามารถตรวจสอบขนาดไฟล์ของภาพได้ + + + The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. + ความà¸à¸§à¹‰à¸²à¸‡à¸‚องภาพเà¸à¸´à¸™à¸‚นาด ({{ width }}px) อนุà¸à¸²à¸•ให้à¸à¸§à¹‰à¸²à¸‡à¹„ด้มาà¸à¸—ี่สุด {{ max_width }}px + + + The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. + ความà¸à¸§à¹‰à¸²à¸‡à¸‚องภาพไม่ได้ขนาด ({{ width }}px) อนุà¸à¸²à¸•ให้สั้นที่สุด {{ min_width }}px + + + The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. + ความสูงของภาพเà¸à¸´à¸™à¸‚นาด ({{ height }}px) อนุà¸à¸²à¸•ให้สูงได้มาà¸à¸—ี่สุด {{ max_height }}px + + + The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. + ความสูงของภาพไม่ได้ขนาด ({{ height }}px) อนุà¸à¸²à¸•ให้สูงอย่างน้อยที่สุด {{ min_height }}px + + + This value should be the user current password. + ค่านี้ควรจะเป็นรหัสผ่านปัจจุบันของผู้ใช้ + + + This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters. + ค่านี้ควรจะมีความยาว {{ limit }} ตัวอัà¸à¸©à¸£ + + + The file was only partially uploaded. + อัปโหลดไฟล์ได้เพียงบางส่วนเท่านั้น + + + No file was uploaded. + ไม่มีไฟล์ใดถูà¸à¸­à¸±à¸›à¹‚หลด + + + No temporary folder was configured in php.ini. + ไม่พบไฟล์ temp ควรจะà¸à¸³à¸«à¸™à¸”ใน php.ini + + + Cannot write temporary file to disk. + ไม่สามารถเขียน temp ไฟล์ลงดิสà¸à¹Œà¹„ด้ + + + A PHP extension caused the upload to fail. + PHP extension เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดมีปัà¸à¸«à¸² + + + This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more. + คอเล็à¸à¸Šà¸±à¹ˆà¸™à¸™à¸µà¹‰à¸„วรจะประà¸à¸­à¸šà¹„ปด้วยอ่างน้อย {{ limit }} สมาชิภ+ + + This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less. + คอเล็à¸à¸Šà¸±à¹ˆà¸™à¸™à¸µà¹‰à¹„ม่ควรมีสมาชิà¸à¹€à¸à¸´à¸™ {{ limit }} + + + This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements. + คอเล็à¸à¸Šà¸±à¹ˆà¸™à¸™à¸µà¹‰à¸„วรจะมีสมาชิภ{{ limit }} เท่านั้น + + + Invalid card number. + หมายเลขบัตรไม่ถูà¸à¸•้อง + + + Unsupported card type or invalid card number. + ไม่รู้จัà¸à¸›à¸£à¸°à¹€à¸ à¸—ของบัตร หรือหมายเลขบัตรไม่ถูà¸à¸•้อง + + + This is not a valid International Bank Account Number (IBAN). + นี่ไม่ถูà¸à¸•้องตาม International Bank Account Number (IBAN) + + + This value is not a valid ISBN-10. + ค่านี้ไม่ถูà¸à¸•้องตาม ISBN-10 + + + This value is not a valid ISBN-13. + ค่านี้ไม่ถูà¸à¸•้องตาม ISBN-13 + + + This value is neither a valid ISBN-10 nor a valid ISBN-13. + ค่านี้ไม่ถูà¸à¸•้องตามทั้ง ISBN-10 à¹à¸¥à¸° ISBN-13 + + + This value is not a valid ISSN. + ค่านี้ไม่ถุà¸à¸•้องตาม ISSN + + + This value is not a valid currency. + ค่านี้ไม่ถูà¸à¸•้องตามสà¸à¸¸à¸¥à¹€à¸‡à¸´à¸™ + + + This value should be equal to {{ compared_value }}. + ค่านี้ไม่ตรงà¸à¸±à¸š {{ compared_value }} + + + This value should be greater than {{ compared_value }}. + ค่านี้ควรจะมาà¸à¸à¸§à¹ˆà¸² {{ compared_value }} + + + This value should be greater than or equal to {{ compared_value }}. + ค่านี้ควรจะมาà¸à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸­à¸•รงà¸à¸±à¸š {{ compared_value }} + + + This value should be identical to {{ compared_value_type }} {{ compared_value }}. + ค่านี้ควรจะเหมือนà¸à¸±à¸™à¸à¸±à¸š {{ compared_value_type }} {{ compared_value }} + + + This value should be less than {{ compared_value }}. + ค่านี้ควรจะน้อยà¸à¸§à¹ˆà¸² {{ compared_value }} + + + This value should be less than or equal to {{ compared_value }}. + ค่านี้ควรจะน้อยà¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸­à¹€à¸—่าà¸à¸±à¸š {{ compared_value }} + + + This value should not be equal to {{ compared_value }}. + ค่านี้ไม่ควรเท่าà¸à¸±à¸™à¸à¸±à¸š {{ compared_value }} + + + This value should not be identical to {{ compared_value_type }} {{ compared_value }}. + ค่านี้ไม่ควรเหมือนà¸à¸±à¸™à¸à¸±à¸š {{ compared_value_type }} {{ compared_value }} + + + The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. + สัดส่วนของภาพใหà¸à¹ˆà¹€à¸à¸´à¸™ ({{ ratio }}) สามารถมีขนาดใหà¸à¹ˆà¸—ี่สุดได้ {{ max_ratio }} + + + The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. + สัดส่วนของภาพเล็à¸à¹€à¸à¸´à¸™ ({{ ratio }}) สามารถมีขนาดเล็à¸à¸—ี่สุดได้ {{ min_ratio }} + + + The image is square ({{ width }}x{{ height }}px). Square images are not allowed. + รูปภาพเป็นจุตรัส ({{ width }}x{{ height }}px) ไม่อนุà¸à¸²à¸•ภาพที่เป็นสี่เหลี่ยมจตุรัส + + + The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed. + ภาพนี้เป็นà¹à¸™à¸§à¸™à¸­à¸™ ({{ width }}x{{ height }}px) ไม่อนุà¸à¸²à¸•ภาพที่เป็นà¹à¸™à¸§à¸™à¸­à¸™ + + + The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed. + ภาพนี้เป็นà¹à¸™à¸§à¸•ั้ง ({{ width }}x{{ height }}px) ไม่อนุà¸à¸²à¸•ภาพที่เป็นà¹à¸™à¸§à¸•ั้ง + + + + diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php index 6f8abc1012..46b1b56269 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php @@ -30,7 +30,7 @@ class EqualToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -45,7 +45,7 @@ class EqualToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php index 2f97b03eb4..9393bec619 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php @@ -30,7 +30,7 @@ class GreaterThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCas } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -46,7 +46,7 @@ class GreaterThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCas } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php index 1fc5311cf5..c9db80f78f 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php @@ -30,7 +30,7 @@ class GreaterThanValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -44,7 +44,7 @@ class GreaterThanValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php index 39234239c0..c5267f1820 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php @@ -30,7 +30,7 @@ class IdenticalToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -47,7 +47,7 @@ class IdenticalToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php index 24ad0faf75..15d68e9382 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php @@ -30,7 +30,7 @@ class LessThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -48,7 +48,7 @@ class LessThanOrEqualValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php index 3b001926e9..8d42d83f31 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php @@ -30,7 +30,7 @@ class LessThanValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -44,7 +44,7 @@ class LessThanValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php index dcf46a668d..3ad33a6f0c 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php @@ -30,7 +30,7 @@ class NotEqualToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -44,7 +44,7 @@ class NotEqualToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php index 28026c0874..f5b4a90c08 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php @@ -30,7 +30,7 @@ class NotIdenticalToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideValidComparisons() { @@ -45,7 +45,7 @@ class NotIdenticalToValidatorTest extends AbstractComparisonValidatorTestCase } /** - * {@inheritDoc} + * {@inheritdoc} */ public function provideInvalidComparisons() { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php index dcc9c027bf..b35128a147 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php @@ -11,13 +11,14 @@ namespace Symfony\Component\Validator\Tests; +use Symfony\Component\Validator\Constraints\Collection; +use Symfony\Component\Validator\Constraints\All; +use Symfony\Component\Validator\ConstraintValidatorFactory; use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\ConstraintViolationList; use Symfony\Component\Validator\ExecutionContext; -use Symfony\Component\Validator\Constraints\Collection; use Symfony\Component\Validator\Tests\Fixtures\ConstraintA; use Symfony\Component\Validator\ValidationVisitor; -use Symfony\Component\Validator\ConstraintValidatorFactory; class ExecutionContextTest extends \PHPUnit_Framework_TestCase { @@ -277,22 +278,50 @@ class ExecutionContextTest extends \PHPUnit_Framework_TestCase $this->assertEquals('bam.baz', $this->context->getPropertyPath('bam.baz')); } - public function testGetPropertyPathWithNestedCollectionsMixed() + public function testGetPropertyPathWithNestedCollectionsAndAllMixed() { $constraints = new Collection(array( - 'foo' => new Collection(array( - 'foo' => new ConstraintA(), - 'bar' => new ConstraintA(), - )), + 'shelves' => new All(array('constraints' => array( + new Collection(array( + 'name' => new ConstraintA(), + 'books' => new All(array('constraints' => array( + new ConstraintA() + ))) + )) + ))), 'name' => new ConstraintA() )); + $data = array( + 'shelves' => array( + array( + 'name' => 'Research', + 'books' => array('foo', 'bar'), + ), + array( + 'name' => 'VALID', + 'books' => array('foozy', 'VALID', 'bazzy'), + ), + ), + 'name' => 'Library', + ); + $expectedViolationPaths = array( + '[shelves][0][name]', + '[shelves][0][books][0]', + '[shelves][0][books][1]', + '[shelves][1][books][0]', + '[shelves][1][books][2]', + '[name]' + ); $visitor = new ValidationVisitor('Root', $this->metadataFactory, new ConstraintValidatorFactory(), $this->translator); $context = new ExecutionContext($visitor, $this->translator, self::TRANS_DOMAIN); - $context->validateValue(array('foo' => array('foo' => 'VALID')), $constraints); - $violations = $context->getViolations(); + $context->validateValue($data, $constraints); + + foreach ($context->getViolations() as $violation) { + $violationPaths[] = $violation->getPropertyPath(); + } - $this->assertEquals('[name]', $violations[1]->getPropertyPath()); + $this->assertEquals($expectedViolationPaths, $violationPaths); } } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php index 787c78c691..b3b85c895b 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php @@ -33,7 +33,5 @@ class ConstraintAValidator extends ConstraintValidator return; } - - return; } } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php index 854e80f35d..a019dd6f83 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php @@ -19,7 +19,5 @@ class FailingConstraintValidator extends ConstraintValidator public function validate($value, Constraint $constraint) { $this->context->addViolation($constraint->message, array()); - - return; } } diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php index e4163718b3..05b63b8ca3 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php @@ -57,8 +57,8 @@ interface ValidationVisitorInterface * @param mixed $value The value to validate. * @param string $group The validation group to validate. * @param string $propertyPath The current property path in the validation graph. - * @param Boolean $traverse Whether to traverse the value if it is traversable. - * @param Boolean $deep Whether to traverse nested traversable values recursively. + * @param bool $traverse Whether to traverse the value if it is traversable. + * @param bool $deep Whether to traverse nested traversable values recursively. * * @throws Exception\NoSuchMetadataException If no metadata can be found for * the given value. diff --git a/vendor/symfony/validator/Symfony/Component/Validator/Validator.php b/vendor/symfony/validator/Symfony/Component/Validator/Validator.php index a7bcc3a0a6..39d886a171 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/Validator.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/Validator.php @@ -72,7 +72,7 @@ class Validator implements ValidatorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getMetadataFor($value) { @@ -80,7 +80,7 @@ class Validator implements ValidatorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function validate($value, $groups = null, $traverse = false, $deep = false) { @@ -94,7 +94,7 @@ class Validator implements ValidatorInterface } /** - * {@inheritDoc} + * {@inheritdoc} * * @throws ValidatorException If the metadata for the value does not support properties. */ @@ -125,7 +125,7 @@ class Validator implements ValidatorInterface } /** - * {@inheritDoc} + * {@inheritdoc} * * @throws ValidatorException If the metadata for the value does not support properties. */ @@ -156,7 +156,7 @@ class Validator implements ValidatorInterface } /** - * {@inheritDoc} + * {@inheritdoc} */ public function validateValue($value, $constraints, $groups = null) { diff --git a/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php b/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php index 98e02d90cf..f12f851139 100644 --- a/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php +++ b/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php @@ -28,8 +28,8 @@ interface ValidatorInterface * * @param mixed $value The value to validate * @param array|null $groups The validation groups to validate. - * @param Boolean $traverse Whether to traverse the value if it is traversable. - * @param Boolean $deep Whether to traverse nested traversable values recursively. + * @param bool $traverse Whether to traverse the value if it is traversable. + * @param bool $deep Whether to traverse nested traversable values recursively. * * @return ConstraintViolationListInterface A list of constraint violations. If the * list is empty, validation succeeded. diff --git a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php index 57f628ca6d..cd3e17c7f5 100644 --- a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php +++ b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php @@ -239,7 +239,7 @@ class ProfilerController $this->profiler->disable(); if (!$profile = $this->profiler->loadProfile($token)) { - return new Response('', 200, array('Content-Type' => 'text/html')); + return new Response('', 404, array('Content-Type' => 'text/html')); } // the toolbar position (top, bottom, normal, or null -- use the configuration) diff --git a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php index 8e3ac9d808..fbbb15038d 100644 --- a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php +++ b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php @@ -43,8 +43,8 @@ class WebDebugToolbarListener implements EventSubscriberInterface { $this->twig = $twig; $this->urlGenerator = $urlGenerator; - $this->interceptRedirects = (Boolean) $interceptRedirects; - $this->mode = (integer) $mode; + $this->interceptRedirects = (bool) $interceptRedirects; + $this->mode = (int) $mode; $this->position = $position; } @@ -105,16 +105,8 @@ class WebDebugToolbarListener implements EventSubscriberInterface */ protected function injectToolbar(Response $response) { - if (function_exists('mb_stripos')) { - $posrFunction = 'mb_strripos'; - $substrFunction = 'mb_substr'; - } else { - $posrFunction = 'strripos'; - $substrFunction = 'substr'; - } - $content = $response->getContent(); - $pos = $posrFunction($content, ''); + $pos = strripos($content, ''); if (false !== $pos) { $toolbar = "\n".str_replace("\n", '', $this->twig->render( @@ -124,7 +116,7 @@ class WebDebugToolbarListener implements EventSubscriberInterface 'token' => $response->headers->get('X-Debug-Token'), ) ))."\n"; - $content = $substrFunction($content, 0, $pos).$toolbar.$substrFunction($content, $pos); + $content = substr($content, 0, $pos).$toolbar.substr($content, $pos); $response->setContent($content); } } diff --git a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig index c4e3df610e..3830047198 100644 --- a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig +++ b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig @@ -9,12 +9,26 @@ request = function(url, onSuccess, onError, payload, options) { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); options = options || {}; + options.maxTries = options.maxTries || 0; xhr.open(options.method || 'GET', url, true); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.onreadystatechange = function(state) { - if (4 === xhr.readyState && 200 === xhr.status) { + if (4 !== xhr.readyState) { + return null; + } + + if (xhr.status == 404 && options.maxTries > 1) { + setTimeout(function(){ + options.maxTries--; + request(url, onSuccess, onError, payload, options); + }, 500); + + return null; + } + + if (200 === xhr.status) { (onSuccess || noop)(xhr); - } else if (4 === xhr.readyState && xhr.status != 200) { + } else { (onError || noop)(xhr); } }; @@ -75,6 +89,7 @@ (onSuccess || noop)(xhr, el); }, function(xhr) { (onError || noop)(xhr, el); }, + '', options ); } diff --git a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig index f3d5a71347..fb098ae91b 100644 --- a/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig +++ b/vendor/symfony/web-profiler-bundle/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig @@ -34,7 +34,8 @@ if (xhr.status !== 0) { confirm('An error occurred while loading the web debug toolbar (' + xhr.status + ': ' + xhr.statusText + ').\n\nDo you want to open the profiler?') && (window.location = '{{ path("_profiler", { "token": token }) }}'); } - } + }, + {'maxTries': 5} ); })(); /*]]>*/ diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php index 8709f8b7e4..26103c88ec 100644 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php +++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php @@ -21,14 +21,14 @@ class Dumper /** * The amount of spaces to use for indentation of nested nodes. * - * @var integer + * @var int */ protected $indentation = 4; /** * Sets the indentation. * - * @param integer $num The amount of spaces to use for indentation of nested nodes. + * @param int $num The amount of spaces to use for indentation of nested nodes. */ public function setIndentation($num) { @@ -39,10 +39,10 @@ class Dumper * Dumps a PHP value to YAML. * * @param mixed $input The PHP value - * @param integer $inline The level where you switch to inline YAML - * @param integer $indent The level of indentation (used internally) - * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param Boolean $objectSupport true if object support is enabled, false otherwise + * @param int $inline The level where you switch to inline YAML + * @param int $indent The level of indentation (used internally) + * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise + * @param bool $objectSupport true if object support is enabled, false otherwise * * @return string The YAML representation of the PHP value */ diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php index 3576e9ae6f..4a6b621613 100644 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php +++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php @@ -44,7 +44,7 @@ class Escaper * * @param string $value A PHP value * - * @return Boolean True if the value would require double quotes. + * @return bool True if the value would require double quotes. */ public static function requiresDoubleQuoting($value) { @@ -68,7 +68,7 @@ class Escaper * * @param string $value A PHP value * - * @return Boolean True if the value would require single quotes. + * @return bool True if the value would require single quotes. */ public static function requiresSingleQuoting($value) { diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php index 938097b8b3..ff01d6b9a6 100644 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php +++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php @@ -34,8 +34,8 @@ class ParseException extends RuntimeException * Constructor. * * @param string $message The error message - * @param integer $parsedLine The line where the error occurred - * @param integer $snippet The snippet of code near the problem + * @param int $parsedLine The line where the error occurred + * @param int $snippet The snippet of code near the problem * @param string $parsedFile The file name where the error occurred * @param \Exception $previous The previous exception */ @@ -100,7 +100,7 @@ class ParseException extends RuntimeException /** * Gets the line where the error occurred. * - * @return integer The file line + * @return int The file line */ public function getParsedLine() { @@ -110,7 +110,7 @@ class ParseException extends RuntimeException /** * Sets the line where the error occurred. * - * @param integer $parsedLine The file line + * @param int $parsedLine The file line */ public function setParsedLine($parsedLine) { diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php index 7a2d1486af..b0d6a031f8 100644 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php +++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php @@ -30,8 +30,8 @@ class Inline * Converts a YAML string to a PHP array. * * @param string $value A YAML string - * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param Boolean $objectSupport true if object support is enabled, false otherwise + * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise + * @param bool $objectSupport true if object support is enabled, false otherwise * * @return array A PHP array representing the YAML string * @@ -83,8 +83,8 @@ class Inline * Dumps a given PHP variable to a YAML string. * * @param mixed $value The PHP variable to convert - * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param Boolean $objectSupport true if object support is enabled, false otherwise + * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise + * @param bool $objectSupport true if object support is enabled, false otherwise * * @return string The YAML string representing the PHP array * @@ -149,8 +149,8 @@ class Inline * Dumps a PHP array to a YAML string. * * @param array $value The PHP array to dump - * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param Boolean $objectSupport true if object support is enabled, false otherwise + * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise + * @param bool $objectSupport true if object support is enabled, false otherwise * * @return string The YAML string representing the PHP array */ @@ -159,7 +159,7 @@ class Inline // array $keys = array_keys($value); if ((1 == count($keys) && '0' == $keys[0]) - || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (integer) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2) + || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2) ) { $output = array(); foreach ($value as $val) { @@ -184,8 +184,8 @@ class Inline * @param scalar $scalar * @param string $delimiters * @param array $stringDelimiters - * @param integer &$i - * @param Boolean $evaluate + * @param int &$i + * @param bool $evaluate * * @return string A YAML string * @@ -232,7 +232,7 @@ class Inline * Parses a quoted scalar to YAML. * * @param string $scalar - * @param integer &$i + * @param int &$i * * @return string A YAML string * @@ -262,7 +262,7 @@ class Inline * Parses a sequence to a YAML string. * * @param string $sequence - * @param integer &$i + * @param int &$i * * @return string A YAML string * @@ -318,7 +318,7 @@ class Inline * Parses a mapping to a YAML string. * * @param string $mapping - * @param integer &$i + * @param int &$i * * @return string A YAML string * @@ -393,7 +393,7 @@ class Inline case 'null' === $scalarLower: case '' === $scalar: case '~' === $scalar: - return null; + return; case 'true' === $scalarLower: return true; case 'false' === $scalarLower: @@ -414,7 +414,7 @@ class Inline throw new ParseException('Object support when parsing a YAML file has been disabled.'); } - return null; + return; case ctype_digit($scalar): $raw = $scalar; $cast = intval($scalar); diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php index 36aa9b0ace..d4e0a9fa66 100644 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php +++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php @@ -31,7 +31,7 @@ class Parser /** * Constructor * - * @param integer $offset The offset of YAML document (used for line numbers in error messages) + * @param int $offset The offset of YAML document (used for line numbers in error messages) */ public function __construct($offset = 0) { @@ -42,8 +42,8 @@ class Parser * Parses a YAML string to a PHP value. * * @param string $value A YAML string - * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param Boolean $objectSupport true if object support is enabled, false otherwise + * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise + * @param bool $objectSupport true if object support is enabled, false otherwise * * @return mixed A PHP value * @@ -261,7 +261,7 @@ class Parser /** * Returns the current line number (takes the offset into account). * - * @return integer The current line number + * @return int The current line number */ private function getRealCurrentLineNb() { @@ -271,7 +271,7 @@ class Parser /** * Returns the current line indentation. * - * @return integer The current line indentation + * @return int The current line indentation */ private function getCurrentLineIndentation() { @@ -281,7 +281,7 @@ class Parser /** * Returns the next embed block of YAML. * - * @param integer $indentation The indent level at which the block is to be read, or null for default + * @param int $indentation The indent level at which the block is to be read, or null for default * * @return string A YAML string * @@ -349,7 +349,7 @@ class Parser /** * Moves the parser to the next line. * - * @return Boolean + * @return bool */ private function moveToNextLine() { @@ -374,8 +374,8 @@ class Parser * Parses a YAML value. * * @param string $value A YAML value - * @param Boolean $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise - * @param Boolean $objectSupport True if object support is enabled, false otherwise + * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise + * @param bool $objectSupport True if object support is enabled, false otherwise * * @return mixed A PHP value * @@ -418,7 +418,7 @@ class Parser * * @param string $separator The separator that was used to begin this folded scalar (| or >) * @param string $indicator The indicator that was used to begin this folded scalar (+ or -) - * @param integer $indentation The indentation that was used to begin this folded scalar + * @param int $indentation The indentation that was used to begin this folded scalar * * @return string The text value */ @@ -497,7 +497,7 @@ class Parser /** * Returns true if the next line is indented. * - * @return Boolean Returns true if the next line is indented, false otherwise + * @return bool Returns true if the next line is indented, false otherwise */ private function isNextLineIndented() { @@ -525,7 +525,7 @@ class Parser /** * Returns true if the current line is blank or if it is a comment line. * - * @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise + * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise */ private function isCurrentLineEmpty() { @@ -535,7 +535,7 @@ class Parser /** * Returns true if the current line is blank. * - * @return Boolean Returns true if the current line is blank, false otherwise + * @return bool Returns true if the current line is blank, false otherwise */ private function isCurrentLineBlank() { @@ -545,7 +545,7 @@ class Parser /** * Returns true if the current line is a comment line. * - * @return Boolean Returns true if the current line is a comment line, false otherwise + * @return bool Returns true if the current line is a comment line, false otherwise */ private function isCurrentLineComment() { @@ -596,7 +596,7 @@ class Parser /** * Returns true if the next line starts unindented collection * - * @return Boolean Returns true if the next line starts unindented collection, false otherwise + * @return bool Returns true if the next line starts unindented collection, false otherwise */ private function isNextLineUnIndentedCollection() { @@ -628,7 +628,7 @@ class Parser /** * Returns true if the string is un-indented collection item * - * @return Boolean Returns true if the string is un-indented collection item, false otherwise + * @return bool Returns true if the string is un-indented collection item, false otherwise */ private function isStringUnIndentedCollectionItem() { diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php index c98f6ecdd9..61793fb3ae 100644 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php +++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php @@ -39,8 +39,8 @@ class Yaml * as an input is a deprecated feature and will be removed in 3.0. * * @param string $input Path to a YAML file or a string containing YAML - * @param Boolean $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise - * @param Boolean $objectSupport True if object support is enabled, false otherwise + * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise + * @param bool $objectSupport True if object support is enabled, false otherwise * * @return array The YAML converted to a PHP array * @@ -81,10 +81,10 @@ class Yaml * to convert the array into friendly YAML. * * @param array $array PHP array - * @param integer $inline The level where you switch to inline YAML - * @param integer $indent The amount of spaces to use for indentation of nested nodes. - * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param Boolean $objectSupport true if object support is enabled, false otherwise + * @param int $inline The level where you switch to inline YAML + * @param int $indent The amount of spaces to use for indentation of nested nodes. + * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise + * @param bool $objectSupport true if object support is enabled, false otherwise * * @return string A YAML string representing the original PHP array * diff --git a/vendor/zendframework/zend-escaper/Zend/Escaper/Escaper.php b/vendor/zendframework/zend-escaper/Zend/Escaper/Escaper.php new file mode 100644 index 0000000000..28acfe0522 --- /dev/null +++ b/vendor/zendframework/zend-escaper/Zend/Escaper/Escaper.php @@ -0,0 +1,389 @@ + 'quot', // quotation mark + 38 => 'amp', // ampersand + 60 => 'lt', // less-than sign + 62 => 'gt', // greater-than sign + ); + + /** + * Current encoding for escaping. If not UTF-8, we convert strings from this encoding + * pre-escaping and back to this encoding post-escaping. + * + * @var string + */ + protected $encoding = 'utf-8'; + + /** + * Holds the value of the special flags passed as second parameter to + * htmlspecialchars(). We modify these for PHP 5.4 to take advantage + * of the new ENT_SUBSTITUTE flag for correctly dealing with invalid + * UTF-8 sequences. + * + * @var string + */ + protected $htmlSpecialCharsFlags = ENT_QUOTES; + + /** + * Static Matcher which escapes characters for HTML Attribute contexts + * + * @var callable + */ + protected $htmlAttrMatcher; + + /** + * Static Matcher which escapes characters for Javascript contexts + * + * @var callable + */ + protected $jsMatcher; + + /** + * Static Matcher which escapes characters for CSS Attribute contexts + * + * @var callable + */ + protected $cssMatcher; + + /** + * List of all encoding supported by this class + * + * @var array + */ + protected $supportedEncodings = array( + 'iso-8859-1', 'iso8859-1', 'iso-8859-5', 'iso8859-5', + 'iso-8859-15', 'iso8859-15', 'utf-8', 'cp866', + 'ibm866', '866', 'cp1251', 'windows-1251', + 'win-1251', '1251', 'cp1252', 'windows-1252', + '1252', 'koi8-r', 'koi8-ru', 'koi8r', + 'big5', '950', 'gb2312', '936', + 'big5-hkscs', 'shift_jis', 'sjis', 'sjis-win', + 'cp932', '932', 'euc-jp', 'eucjp', + 'eucjp-win', 'macroman' + ); + + /** + * Constructor: Single parameter allows setting of global encoding for use by + * the current object. If PHP 5.4 is detected, additional ENT_SUBSTITUTE flag + * is set for htmlspecialchars() calls. + * + * @param string $encoding + * @throws Exception\InvalidArgumentException + */ + public function __construct($encoding = null) + { + if ($encoding !== null) { + $encoding = (string) $encoding; + if ($encoding === '') { + throw new Exception\InvalidArgumentException( + get_class($this) . ' constructor parameter does not allow a blank value' + ); + } + + $encoding = strtolower($encoding); + if (!in_array($encoding, $this->supportedEncodings)) { + throw new Exception\InvalidArgumentException( + 'Value of \'' . $encoding . '\' passed to ' . get_class($this) + . ' constructor parameter is invalid. Provide an encoding supported by htmlspecialchars()' + ); + } + + $this->encoding = $encoding; + } + + if (defined('ENT_SUBSTITUTE')) { + $this->htmlSpecialCharsFlags|= ENT_SUBSTITUTE; + } + + // set matcher callbacks + $this->htmlAttrMatcher = array($this, 'htmlAttrMatcher'); + $this->jsMatcher = array($this, 'jsMatcher'); + $this->cssMatcher = array($this, 'cssMatcher'); + } + + /** + * Return the encoding that all output/input is expected to be encoded in. + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Escape a string for the HTML Body context where there are very few characters + * of special meaning. Internally this will use htmlspecialchars(). + * + * @param string $string + * @return string + */ + public function escapeHtml($string) + { + $result = htmlspecialchars($string, $this->htmlSpecialCharsFlags, $this->encoding); + return $result; + } + + /** + * Escape a string for the HTML Attribute context. We use an extended set of characters + * to escape that are not covered by htmlspecialchars() to cover cases where an attribute + * might be unquoted or quoted illegally (e.g. backticks are valid quotes for IE). + * + * @param string $string + * @return string + */ + public function escapeHtmlAttr($string) + { + $string = $this->toUtf8($string); + if ($string === '' || ctype_digit($string)) { + return $string; + } + + $result = preg_replace_callback('/[^a-z0-9,\.\-_]/iSu', $this->htmlAttrMatcher, $string); + return $this->fromUtf8($result); + } + + /** + * Escape a string for the Javascript context. This does not use json_encode(). An extended + * set of characters are escaped beyond ECMAScript's rules for Javascript literal string + * escaping in order to prevent misinterpretation of Javascript as HTML leading to the + * injection of special characters and entities. The escaping used should be tolerant + * of cases where HTML escaping was not applied on top of Javascript escaping correctly. + * Backslash escaping is not used as it still leaves the escaped character as-is and so + * is not useful in a HTML context. + * + * @param string $string + * @return string + */ + public function escapeJs($string) + { + $string = $this->toUtf8($string); + if ($string === '' || ctype_digit($string)) { + return $string; + } + + $result = preg_replace_callback('/[^a-z0-9,\._]/iSu', $this->jsMatcher, $string); + return $this->fromUtf8($result); + } + + /** + * Escape a string for the URI or Parameter contexts. This should not be used to escape + * an entire URI - only a subcomponent being inserted. The function is a simple proxy + * to rawurlencode() which now implements RFC 3986 since PHP 5.3 completely. + * + * @param string $string + * @return string + */ + public function escapeUrl($string) + { + return rawurlencode($string); + } + + /** + * Escape a string for the CSS context. CSS escaping can be applied to any string being + * inserted into CSS and escapes everything except alphanumerics. + * + * @param string $string + * @return string + */ + public function escapeCss($string) + { + $string = $this->toUtf8($string); + if ($string === '' || ctype_digit($string)) { + return $string; + } + + $result = preg_replace_callback('/[^a-z0-9]/iSu', $this->cssMatcher, $string); + return $this->fromUtf8($result); + } + + /** + * Callback function for preg_replace_callback that applies HTML Attribute + * escaping to all matches. + * + * @param array $matches + * @return string + */ + protected function htmlAttrMatcher($matches) + { + $chr = $matches[0]; + $ord = ord($chr); + + /** + * The following replaces characters undefined in HTML with the + * hex entity for the Unicode replacement character. + */ + if (($ord <= 0x1f && $chr != "\t" && $chr != "\n" && $chr != "\r") + || ($ord >= 0x7f && $ord <= 0x9f) + ) { + return '�'; + } + + /** + * Check if the current character to escape has a name entity we should + * replace it with while grabbing the integer value of the character. + */ + if (strlen($chr) > 1) { + $chr = $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8'); + } + + $hex = bin2hex($chr); + $ord = hexdec($hex); + if (isset(static::$htmlNamedEntityMap[$ord])) { + return '&' . static::$htmlNamedEntityMap[$ord] . ';'; + } + + /** + * Per OWASP recommendations, we'll use upper hex entities + * for any other characters where a named entity does not exist. + */ + if ($ord > 255) { + return sprintf('&#x%04X;', $ord); + } + return sprintf('&#x%02X;', $ord); + } + + /** + * Callback function for preg_replace_callback that applies Javascript + * escaping to all matches. + * + * @param array $matches + * @return string + */ + protected function jsMatcher($matches) + { + $chr = $matches[0]; + if (strlen($chr) == 1) { + return sprintf('\\x%02X', ord($chr)); + } + $chr = $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8'); + return sprintf('\\u%04s', strtoupper(bin2hex($chr))); + } + + /** + * Callback function for preg_replace_callback that applies CSS + * escaping to all matches. + * + * @param array $matches + * @return string + */ + protected function cssMatcher($matches) + { + $chr = $matches[0]; + if (strlen($chr) == 1) { + $ord = ord($chr); + } else { + $chr = $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8'); + $ord = hexdec(bin2hex($chr)); + } + return sprintf('\\%X ', $ord); + } + + /** + * Converts a string to UTF-8 from the base encoding. The base encoding is set via this + * class' constructor. + * + * @param string $string + * @throws Exception\RuntimeException + * @return string + */ + protected function toUtf8($string) + { + if ($this->getEncoding() === 'utf-8') { + $result = $string; + } else { + $result = $this->convertEncoding($string, 'UTF-8', $this->getEncoding()); + } + + if (!$this->isUtf8($result)) { + throw new Exception\RuntimeException(sprintf( + 'String to be escaped was not valid UTF-8 or could not be converted: %s', $result + )); + } + + return $result; + } + + /** + * Converts a string from UTF-8 to the base encoding. The base encoding is set via this + * class' constructor. + * @param string $string + * @return string + */ + protected function fromUtf8($string) + { + if ($this->getEncoding() === 'utf-8') { + return $string; + } + + return $this->convertEncoding($string, $this->getEncoding(), 'UTF-8'); + } + + /** + * Checks if a given string appears to be valid UTF-8 or not. + * + * @param string $string + * @return bool + */ + protected function isUtf8($string) + { + return ($string === '' || preg_match('/^./su', $string)); + } + + /** + * Encoding conversion helper which wraps iconv and mbstring where they exist or throws + * and exception where neither is available. + * + * @param string $string + * @param string $to + * @param array|string $from + * @throws Exception\RuntimeException + * @return string + */ + protected function convertEncoding($string, $to, $from) + { + $result = ''; + if (function_exists('iconv')) { + $result = iconv($from, $to, $string); + } elseif (function_exists('mb_convert_encoding')) { + $result = mb_convert_encoding($string, $to, $from); + } else { + throw new Exception\RuntimeException( + get_class($this) + . ' requires either the iconv or mbstring extension to be installed' + . ' when escaping for non UTF-8 strings.' + ); + } + + if ($result === false) { + return ''; // return non-fatal blank string on encoding errors from users + } + return $result; + } +} diff --git a/vendor/zendframework/zend-escaper/Zend/Escaper/Exception/ExceptionInterface.php b/vendor/zendframework/zend-escaper/Zend/Escaper/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..7d3a5f6d00 --- /dev/null +++ b/vendor/zendframework/zend-escaper/Zend/Escaper/Exception/ExceptionInterface.php @@ -0,0 +1,13 @@ +=5.3.23" + }, + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Exception/BadMethodCallException.php b/vendor/zendframework/zend-feed/Zend/Feed/Exception/BadMethodCallException.php new file mode 100644 index 0000000000..ef0173a5b2 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Exception/BadMethodCallException.php @@ -0,0 +1,15 @@ +setOptions($options); + } + } + + /** + * Process any injected configuration options + * + * @param array|Traversable $options Options array or Traversable object + * @return AbstractCallback + * @throws Exception\InvalidArgumentException + */ + public function setOptions($options) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (!is_array($options)) { + throw new Exception\InvalidArgumentException('Array or Traversable object' + . 'expected, got ' . gettype($options)); + } + + if (is_array($options)) { + $this->setOptions($options); + } + + if (array_key_exists('storage', $options)) { + $this->setStorage($options['storage']); + } + return $this; + } + + /** + * Send the response, including all headers. + * If you wish to handle this via Zend\Http, use the getter methods + * to retrieve any data needed to be set on your HTTP Response object, or + * simply give this object the HTTP Response instance to work with for you! + * + * @return void + */ + public function sendResponse() + { + $this->getHttpResponse()->send(); + } + + /** + * Sets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used + * to background save any verification tokens associated with a subscription + * or other. + * + * @param Model\SubscriptionPersistenceInterface $storage + * @return AbstractCallback + */ + public function setStorage(Model\SubscriptionPersistenceInterface $storage) + { + $this->storage = $storage; + return $this; + } + + /** + * Gets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used + * to background save any verification tokens associated with a subscription + * or other. + * + * @return Model\SubscriptionPersistenceInterface + * @throws Exception\RuntimeException + */ + public function getStorage() + { + if ($this->storage === null) { + throw new Exception\RuntimeException('No storage object has been' + . ' set that subclasses Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence'); + } + return $this->storage; + } + + /** + * An instance of a class handling Http Responses. This is implemented in + * Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with + * (i.e. not inherited from) Zend\Controller\Response\Http. + * + * @param HttpResponse|PhpResponse $httpResponse + * @return AbstractCallback + * @throws Exception\InvalidArgumentException + */ + public function setHttpResponse($httpResponse) + { + if (!$httpResponse instanceof HttpResponse && !$httpResponse instanceof PhpResponse) { + throw new Exception\InvalidArgumentException('HTTP Response object must' + . ' implement one of Zend\Feed\Pubsubhubbub\HttpResponse or' + . ' Zend\Http\PhpEnvironment\Response'); + } + $this->httpResponse = $httpResponse; + return $this; + } + + /** + * An instance of a class handling Http Responses. This is implemented in + * Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with + * (i.e. not inherited from) Zend\Controller\Response\Http. + * + * @return HttpResponse|PhpResponse + */ + public function getHttpResponse() + { + if ($this->httpResponse === null) { + $this->httpResponse = new HttpResponse; + } + return $this->httpResponse; + } + + /** + * Sets the number of Subscribers for which any updates are on behalf of. + * In other words, is this class serving one or more subscribers? How many? + * Defaults to 1 if left unchanged. + * + * @param string|int $count + * @return AbstractCallback + * @throws Exception\InvalidArgumentException + */ + public function setSubscriberCount($count) + { + $count = intval($count); + if ($count <= 0) { + throw new Exception\InvalidArgumentException('Subscriber count must be' + . ' greater than zero'); + } + $this->subscriberCount = $count; + return $this; + } + + /** + * Gets the number of Subscribers for which any updates are on behalf of. + * In other words, is this class serving one or more subscribers? How many? + * + * @return int + */ + public function getSubscriberCount() + { + return $this->subscriberCount; + } + + /** + * Attempt to detect the callback URL (specifically the path forward) + * @return string + */ + protected function _detectCallbackUrl() + { + $callbackUrl = ''; + if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) { + $callbackUrl = $_SERVER['HTTP_X_ORIGINAL_URL']; + } elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) { + $callbackUrl = $_SERVER['HTTP_X_REWRITE_URL']; + } elseif (isset($_SERVER['REQUEST_URI'])) { + $callbackUrl = $_SERVER['REQUEST_URI']; + $scheme = 'http'; + if ($_SERVER['HTTPS'] == 'on') { + $scheme = 'https'; + } + $schemeAndHttpHost = $scheme . '://' . $this->_getHttpHost(); + if (strpos($callbackUrl, $schemeAndHttpHost) === 0) { + $callbackUrl = substr($callbackUrl, strlen($schemeAndHttpHost)); + } + } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { + $callbackUrl= $_SERVER['ORIG_PATH_INFO']; + if (!empty($_SERVER['QUERY_STRING'])) { + $callbackUrl .= '?' . $_SERVER['QUERY_STRING']; + } + } + return $callbackUrl; + } + + /** + * Get the HTTP host + * + * @return string + */ + protected function _getHttpHost() + { + if (!empty($_SERVER['HTTP_HOST'])) { + return $_SERVER['HTTP_HOST']; + } + $scheme = 'http'; + if ($_SERVER['HTTPS'] == 'on') { + $scheme = 'https'; + } + $name = $_SERVER['SERVER_NAME']; + $port = $_SERVER['SERVER_PORT']; + if (($scheme == 'http' && $port == 80) + || ($scheme == 'https' && $port == 443) + ) { + return $name; + } + + return $name . ':' . $port; + } + + /** + * Retrieve a Header value from either $_SERVER or Apache + * + * @param string $header + * @return bool|string + */ + protected function _getHeader($header) + { + $temp = strtoupper(str_replace('-', '_', $header)); + if (!empty($_SERVER[$temp])) { + return $_SERVER[$temp]; + } + $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header)); + if (!empty($_SERVER[$temp])) { + return $_SERVER[$temp]; + } + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + if (!empty($headers[$header])) { + return $headers[$header]; + } + } + return false; + } + + /** + * Return the raw body of the request + * + * @return string|false Raw body, or false if not present + */ + protected function _getRawBody() + { + $body = file_get_contents('php://input'); + if (strlen(trim($body)) == 0 && isset($GLOBALS['HTTP_RAW_POST_DATA'])) { + $body = $GLOBALS['HTTP_RAW_POST_DATA']; + } + if (strlen(trim($body)) > 0) { + return $body; + } + return false; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/CallbackInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/CallbackInterface.php new file mode 100644 index 0000000000..8873c3db48 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/CallbackInterface.php @@ -0,0 +1,51 @@ +sendHeaders(); + echo $this->getContent(); + } + + /** + * Send all headers + * + * Sends any headers specified. If an {@link setHttpResponseCode() HTTP response code} + * has been specified, it is sent with the first header. + * + * @return void + */ + public function sendHeaders() + { + if (count($this->headers) || (200 != $this->statusCode)) { + $this->canSendHeaders(true); + } elseif (200 == $this->statusCode) { + return; + } + $httpCodeSent = false; + foreach ($this->headers as $header) { + if (!$httpCodeSent && $this->statusCode) { + header($header['name'] . ': ' . $header['value'], $header['replace'], $this->statusCode); + $httpCodeSent = true; + } else { + header($header['name'] . ': ' . $header['value'], $header['replace']); + } + } + if (!$httpCodeSent) { + header('HTTP/1.1 ' . $this->statusCode); + } + } + + /** + * Set a header + * + * If $replace is true, replaces any headers already defined with that + * $name. + * + * @param string $name + * @param string $value + * @param bool $replace + * @return \Zend\Feed\PubSubHubbub\HttpResponse + */ + public function setHeader($name, $value, $replace = false) + { + $name = $this->_normalizeHeader($name); + $value = (string) $value; + if ($replace) { + foreach ($this->headers as $key => $header) { + if ($name == $header['name']) { + unset($this->headers[$key]); + } + } + } + $this->headers[] = array( + 'name' => $name, + 'value' => $value, + 'replace' => $replace, + ); + + return $this; + } + + /** + * Check if a specific Header is set and return its value + * + * @param string $name + * @return string|null + */ + public function getHeader($name) + { + $name = $this->_normalizeHeader($name); + foreach ($this->headers as $header) { + if ($header['name'] == $name) { + return $header['value']; + } + } + } + + /** + * Return array of headers; see {@link $headers} for format + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Can we send headers? + * + * @param bool $throw Whether or not to throw an exception if headers have been sent; defaults to false + * @return HttpResponse + * @throws Exception\RuntimeException + */ + public function canSendHeaders($throw = false) + { + $ok = headers_sent($file, $line); + if ($ok && $throw) { + throw new Exception\RuntimeException('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); + } + return !$ok; + } + + /** + * Set HTTP response code to use with headers + * + * @param int $code + * @return HttpResponse + * @throws Exception\InvalidArgumentException + */ + public function setStatusCode($code) + { + if (!is_int($code) || (100 > $code) || (599 < $code)) { + throw new Exception\InvalidArgumentException('Invalid HTTP response' + . ' code:' . $code); + } + $this->statusCode = $code; + return $this; + } + + /** + * Retrieve HTTP response code + * + * @return int + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * Set body content + * + * @param string $content + * @return \Zend\Feed\PubSubHubbub\HttpResponse + */ + public function setContent($content) + { + $this->content = (string) $content; + $this->setHeader('content-length', strlen($content)); + return $this; + } + + /** + * Return the body content + * + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * Normalizes a header name to X-Capitalized-Names + * + * @param string $name + * @return string + */ + protected function _normalizeHeader($name) + { + $filtered = str_replace(array('-', '_'), ' ', (string) $name); + $filtered = ucwords(strtolower($filtered)); + $filtered = str_replace(' ', '-', $filtered); + return $filtered; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/AbstractModel.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/AbstractModel.php new file mode 100644 index 0000000000..92e688133e --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/AbstractModel.php @@ -0,0 +1,39 @@ +db = new TableGateway($table, null); + } else { + $this->db = $tableGateway; + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/Subscription.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/Subscription.php new file mode 100644 index 0000000000..9571106a40 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/Subscription.php @@ -0,0 +1,142 @@ +db->select(array('id' => $data['id'])); + if ($result && (0 < count($result))) { + $data['created_time'] = $result->current()->created_time; + $now = $this->getNow(); + if (array_key_exists('lease_seconds', $data) + && $data['lease_seconds'] + ) { + $data['expiration_time'] = $now->add(new DateInterval('PT' . $data['lease_seconds'] . 'S')) + ->format('Y-m-d H:i:s'); + } + $this->db->update( + $data, + array('id' => $data['id']) + ); + return false; + } + + $this->db->insert($data); + return true; + } + + /** + * Get subscription by ID/key + * + * @param string $key + * @return array + * @throws PubSubHubbub\Exception\InvalidArgumentException + */ + public function getSubscription($key) + { + if (empty($key) || !is_string($key)) { + throw new PubSubHubbub\Exception\InvalidArgumentException('Invalid parameter "key"' + .' of "' . $key . '" must be a non-empty string'); + } + $result = $this->db->select(array('id' => $key)); + if (count($result)) { + return $result->current()->getArrayCopy(); + } + return false; + } + + /** + * Determine if a subscription matching the key exists + * + * @param string $key + * @return bool + * @throws PubSubHubbub\Exception\InvalidArgumentException + */ + public function hasSubscription($key) + { + if (empty($key) || !is_string($key)) { + throw new PubSubHubbub\Exception\InvalidArgumentException('Invalid parameter "key"' + .' of "' . $key . '" must be a non-empty string'); + } + $result = $this->db->select(array('id' => $key)); + if (count($result)) { + return true; + } + return false; + } + + /** + * Delete a subscription + * + * @param string $key + * @return bool + */ + public function deleteSubscription($key) + { + $result = $this->db->select(array('id' => $key)); + if (count($result)) { + $this->db->delete( + array('id' => $key) + ); + return true; + } + return false; + } + + /** + * Get a new DateTime or the one injected for testing + * + * @return DateTime + */ + public function getNow() + { + if (null === $this->now) { + return new DateTime(); + } + return $this->now; + } + + /** + * Set a DateTime instance for assisting with unit testing + * + * @param DateTime $now + * @return Subscription + */ + public function setNow(DateTime $now) + { + $this->now = $now; + return $this; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/SubscriptionPersistenceInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/SubscriptionPersistenceInterface.php new file mode 100644 index 0000000000..77b2e71f9d --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Model/SubscriptionPersistenceInterface.php @@ -0,0 +1,47 @@ +getHubs(); + } + + /** + * Allows the external environment to make ZendOAuth use a specific + * Client instance. + * + * @param Http\Client $httpClient + * @return void + */ + public static function setHttpClient(Http\Client $httpClient) + { + static::$httpClient = $httpClient; + } + + /** + * Return the singleton instance of the HTTP Client. Note that + * the instance is reset and cleared of previous parameters GET/POST. + * Headers are NOT reset but handled by this component if applicable. + * + * @return Http\Client + */ + public static function getHttpClient() + { + if (!isset(static::$httpClient)) { + static::$httpClient = new Http\Client; + } else { + static::$httpClient->resetParameters(); + } + return static::$httpClient; + } + + /** + * Simple mechanism to delete the entire singleton HTTP Client instance + * which forces a new instantiation for subsequent requests. + * + * @return void + */ + public static function clearHttpClient() + { + static::$httpClient = null; + } + + /** + * Set the Escaper instance + * + * If null, resets the instance + * + * @param null|Escaper $escaper + */ + public static function setEscaper(Escaper $escaper = null) + { + static::$escaper = $escaper; + } + + /** + * Get the Escaper instance + * + * If none registered, lazy-loads an instance. + * + * @return Escaper + */ + public static function getEscaper() + { + if (null === static::$escaper) { + static::setEscaper(new Escaper()); + } + return static::$escaper; + } + + /** + * RFC 3986 safe url encoding method + * + * @param string $string + * @return string + */ + public static function urlencode($string) + { + $escaper = static::getEscaper(); + $rawencoded = $escaper->escapeUrl($string); + $rfcencoded = str_replace('%7E', '~', $rawencoded); + return $rfcencoded; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Publisher.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Publisher.php new file mode 100644 index 0000000000..916ffcad59 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Publisher.php @@ -0,0 +1,397 @@ +setOptions($options); + } + } + + /** + * Process any injected configuration options + * + * @param array|Traversable $options Options array or Traversable object + * @return Publisher + * @throws Exception\InvalidArgumentException + */ + public function setOptions($options) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (!is_array($options)) { + throw new Exception\InvalidArgumentException('Array or Traversable object' + . 'expected, got ' . gettype($options)); + } + if (array_key_exists('hubUrls', $options)) { + $this->addHubUrls($options['hubUrls']); + } + if (array_key_exists('updatedTopicUrls', $options)) { + $this->addUpdatedTopicUrls($options['updatedTopicUrls']); + } + if (array_key_exists('parameters', $options)) { + $this->setParameters($options['parameters']); + } + return $this; + } + + /** + * Add a Hub Server URL supported by Publisher + * + * @param string $url + * @return Publisher + * @throws Exception\InvalidArgumentException + */ + public function addHubUrl($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + . ' of "' . $url . '" must be a non-empty string and a valid' + . 'URL'); + } + $this->hubUrls[] = $url; + return $this; + } + + /** + * Add an array of Hub Server URLs supported by Publisher + * + * @param array $urls + * @return Publisher + */ + public function addHubUrls(array $urls) + { + foreach ($urls as $url) { + $this->addHubUrl($url); + } + return $this; + } + + /** + * Remove a Hub Server URL + * + * @param string $url + * @return Publisher + */ + public function removeHubUrl($url) + { + if (!in_array($url, $this->getHubUrls())) { + return $this; + } + $key = array_search($url, $this->hubUrls); + unset($this->hubUrls[$key]); + return $this; + } + + /** + * Return an array of unique Hub Server URLs currently available + * + * @return array + */ + public function getHubUrls() + { + $this->hubUrls = array_unique($this->hubUrls); + return $this->hubUrls; + } + + /** + * Add a URL to a topic (Atom or RSS feed) which has been updated + * + * @param string $url + * @return Publisher + * @throws Exception\InvalidArgumentException + */ + public function addUpdatedTopicUrl($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + . ' of "' . $url . '" must be a non-empty string and a valid' + . 'URL'); + } + $this->updatedTopicUrls[] = $url; + return $this; + } + + /** + * Add an array of Topic URLs which have been updated + * + * @param array $urls + * @return Publisher + */ + public function addUpdatedTopicUrls(array $urls) + { + foreach ($urls as $url) { + $this->addUpdatedTopicUrl($url); + } + return $this; + } + + /** + * Remove an updated topic URL + * + * @param string $url + * @return Publisher + */ + public function removeUpdatedTopicUrl($url) + { + if (!in_array($url, $this->getUpdatedTopicUrls())) { + return $this; + } + $key = array_search($url, $this->updatedTopicUrls); + unset($this->updatedTopicUrls[$key]); + return $this; + } + + /** + * Return an array of unique updated topic URLs currently available + * + * @return array + */ + public function getUpdatedTopicUrls() + { + $this->updatedTopicUrls = array_unique($this->updatedTopicUrls); + return $this->updatedTopicUrls; + } + + /** + * Notifies a single Hub Server URL of changes + * + * @param string $url The Hub Server's URL + * @return void + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + public function notifyHub($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + . ' of "' . $url . '" must be a non-empty string and a valid' + . 'URL'); + } + $client = $this->_getHttpClient(); + $client->setUri($url); + $response = $client->getResponse(); + if ($response->getStatusCode() !== 204) { + throw new Exception\RuntimeException('Notification to Hub Server ' + . 'at "' . $url . '" appears to have failed with a status code of "' + . $response->getStatusCode() . '" and message "' + . $response->getContent() . '"'); + } + } + + /** + * Notifies all Hub Server URLs of changes + * + * If a Hub notification fails, certain data will be retained in an + * an array retrieved using getErrors(), if a failure occurs for any Hubs + * the isSuccess() check will return FALSE. This method is designed not + * to needlessly fail with an Exception/Error unless from Zend\Http\Client. + * + * @return void + * @throws Exception\RuntimeException + */ + public function notifyAll() + { + $client = $this->_getHttpClient(); + $hubs = $this->getHubUrls(); + if (empty($hubs)) { + throw new Exception\RuntimeException('No Hub Server URLs' + . ' have been set so no notifications can be sent'); + } + $this->errors = array(); + foreach ($hubs as $url) { + $client->setUri($url); + $response = $client->getResponse(); + if ($response->getStatusCode() !== 204) { + $this->errors[] = array( + 'response' => $response, + 'hubUrl' => $url + ); + } + } + } + + /** + * Add an optional parameter to the update notification requests + * + * @param string $name + * @param string|null $value + * @return Publisher + * @throws Exception\InvalidArgumentException + */ + public function setParameter($name, $value = null) + { + if (is_array($name)) { + $this->setParameters($name); + return $this; + } + if (empty($name) || !is_string($name)) { + throw new Exception\InvalidArgumentException('Invalid parameter "name"' + . ' of "' . $name . '" must be a non-empty string'); + } + if ($value === null) { + $this->removeParameter($name); + return $this; + } + if (empty($value) || (!is_string($value) && $value !== null)) { + throw new Exception\InvalidArgumentException('Invalid parameter "value"' + . ' of "' . $value . '" must be a non-empty string'); + } + $this->parameters[$name] = $value; + return $this; + } + + /** + * Add an optional parameter to the update notification requests + * + * @param array $parameters + * @return Publisher + */ + public function setParameters(array $parameters) + { + foreach ($parameters as $name => $value) { + $this->setParameter($name, $value); + } + return $this; + } + + /** + * Remove an optional parameter for the notification requests + * + * @param string $name + * @return Publisher + * @throws Exception\InvalidArgumentException + */ + public function removeParameter($name) + { + if (empty($name) || !is_string($name)) { + throw new Exception\InvalidArgumentException('Invalid parameter "name"' + . ' of "' . $name . '" must be a non-empty string'); + } + if (array_key_exists($name, $this->parameters)) { + unset($this->parameters[$name]); + } + return $this; + } + + /** + * Return an array of optional parameters for notification requests + * + * @return array + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Returns a boolean indicator of whether the notifications to Hub + * Servers were ALL successful. If even one failed, FALSE is returned. + * + * @return bool + */ + public function isSuccess() + { + return !(count($this->errors) != 0); + } + + /** + * Return an array of errors met from any failures, including keys: + * 'response' => the Zend\Http\Response object from the failure + * 'hubUrl' => the URL of the Hub Server whose notification failed + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Get a basic prepared HTTP client for use + * + * @return \Zend\Http\Client + * @throws Exception\RuntimeException + */ + protected function _getHttpClient() + { + $client = PubSubHubbub::getHttpClient(); + $client->setMethod(HttpRequest::METHOD_POST); + $client->setOptions(array( + 'useragent' => 'Zend_Feed_Pubsubhubbub_Publisher/' . Version::VERSION, + )); + $params = array(); + $params[] = 'hub.mode=publish'; + $topics = $this->getUpdatedTopicUrls(); + if (empty($topics)) { + throw new Exception\RuntimeException('No updated topic URLs' + . ' have been set'); + } + foreach ($topics as $topicUrl) { + $params[] = 'hub.url=' . urlencode($topicUrl); + } + $optParams = $this->getParameters(); + foreach ($optParams as $name => $value) { + $params[] = urlencode($name) . '=' . urlencode($value); + } + $paramString = implode('&', $params); + $client->setRawBody($paramString); + return $client; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Subscriber.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Subscriber.php new file mode 100644 index 0000000000..265fe776b1 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Subscriber.php @@ -0,0 +1,837 @@ +setOptions($options); + } + } + + /** + * Process any injected configuration options + * + * @param array|Traversable $options + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function setOptions($options) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (!is_array($options)) { + throw new Exception\InvalidArgumentException('Array or Traversable object' + . 'expected, got ' . gettype($options)); + } + if (array_key_exists('hubUrls', $options)) { + $this->addHubUrls($options['hubUrls']); + } + if (array_key_exists('callbackUrl', $options)) { + $this->setCallbackUrl($options['callbackUrl']); + } + if (array_key_exists('topicUrl', $options)) { + $this->setTopicUrl($options['topicUrl']); + } + if (array_key_exists('storage', $options)) { + $this->setStorage($options['storage']); + } + if (array_key_exists('leaseSeconds', $options)) { + $this->setLeaseSeconds($options['leaseSeconds']); + } + if (array_key_exists('parameters', $options)) { + $this->setParameters($options['parameters']); + } + if (array_key_exists('authentications', $options)) { + $this->addAuthentications($options['authentications']); + } + if (array_key_exists('usePathParameter', $options)) { + $this->usePathParameter($options['usePathParameter']); + } + if (array_key_exists('preferredVerificationMode', $options)) { + $this->setPreferredVerificationMode( + $options['preferredVerificationMode'] + ); + } + return $this; + } + + /** + * Set the topic URL (RSS or Atom feed) to which the intended (un)subscribe + * event will relate + * + * @param string $url + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function setTopicUrl($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + .' of "' . $url . '" must be a non-empty string and a valid' + .' URL'); + } + $this->topicUrl = $url; + return $this; + } + + /** + * Set the topic URL (RSS or Atom feed) to which the intended (un)subscribe + * event will relate + * + * @return string + * @throws Exception\RuntimeException + */ + public function getTopicUrl() + { + if (empty($this->topicUrl)) { + throw new Exception\RuntimeException('A valid Topic (RSS or Atom' + . ' feed) URL MUST be set before attempting any operation'); + } + return $this->topicUrl; + } + + /** + * Set the number of seconds for which any subscription will remain valid + * + * @param int $seconds + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function setLeaseSeconds($seconds) + { + $seconds = intval($seconds); + if ($seconds <= 0) { + throw new Exception\InvalidArgumentException('Expected lease seconds' + . ' must be an integer greater than zero'); + } + $this->leaseSeconds = $seconds; + return $this; + } + + /** + * Get the number of lease seconds on subscriptions + * + * @return int + */ + public function getLeaseSeconds() + { + return $this->leaseSeconds; + } + + /** + * Set the callback URL to be used by Hub Servers when communicating with + * this Subscriber + * + * @param string $url + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function setCallbackUrl($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + . ' of "' . $url . '" must be a non-empty string and a valid' + . ' URL'); + } + $this->callbackUrl = $url; + return $this; + } + + /** + * Get the callback URL to be used by Hub Servers when communicating with + * this Subscriber + * + * @return string + * @throws Exception\RuntimeException + */ + public function getCallbackUrl() + { + if (empty($this->callbackUrl)) { + throw new Exception\RuntimeException('A valid Callback URL MUST be' + . ' set before attempting any operation'); + } + return $this->callbackUrl; + } + + /** + * Set preferred verification mode (sync or async). By default, this + * Subscriber prefers synchronous verification, but does support + * asynchronous if that's the Hub Server's utilised mode. + * + * Zend\Feed\Pubsubhubbub\Subscriber will always send both modes, whose + * order of occurrence in the parameter list determines this preference. + * + * @param string $mode Should be 'sync' or 'async' + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function setPreferredVerificationMode($mode) + { + if ($mode !== PubSubHubbub::VERIFICATION_MODE_SYNC + && $mode !== PubSubHubbub::VERIFICATION_MODE_ASYNC + ) { + throw new Exception\InvalidArgumentException('Invalid preferred' + . ' mode specified: "' . $mode . '" but should be one of' + . ' Zend\Feed\Pubsubhubbub::VERIFICATION_MODE_SYNC or' + . ' Zend\Feed\Pubsubhubbub::VERIFICATION_MODE_ASYNC'); + } + $this->preferredVerificationMode = $mode; + return $this; + } + + /** + * Get preferred verification mode (sync or async). + * + * @return string + */ + public function getPreferredVerificationMode() + { + return $this->preferredVerificationMode; + } + + /** + * Add a Hub Server URL supported by Publisher + * + * @param string $url + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function addHubUrl($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + . ' of "' . $url . '" must be a non-empty string and a valid' + . ' URL'); + } + $this->hubUrls[] = $url; + return $this; + } + + /** + * Add an array of Hub Server URLs supported by Publisher + * + * @param array $urls + * @return Subscriber + */ + public function addHubUrls(array $urls) + { + foreach ($urls as $url) { + $this->addHubUrl($url); + } + return $this; + } + + /** + * Remove a Hub Server URL + * + * @param string $url + * @return Subscriber + */ + public function removeHubUrl($url) + { + if (!in_array($url, $this->getHubUrls())) { + return $this; + } + $key = array_search($url, $this->hubUrls); + unset($this->hubUrls[$key]); + return $this; + } + + /** + * Return an array of unique Hub Server URLs currently available + * + * @return array + */ + public function getHubUrls() + { + $this->hubUrls = array_unique($this->hubUrls); + return $this->hubUrls; + } + + /** + * Add authentication credentials for a given URL + * + * @param string $url + * @param array $authentication + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function addAuthentication($url, array $authentication) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter "url"' + . ' of "' . $url . '" must be a non-empty string and a valid' + . ' URL'); + } + $this->authentications[$url] = $authentication; + return $this; + } + + /** + * Add authentication credentials for hub URLs + * + * @param array $authentications + * @return Subscriber + */ + public function addAuthentications(array $authentications) + { + foreach ($authentications as $url => $authentication) { + $this->addAuthentication($url, $authentication); + } + return $this; + } + + /** + * Get all hub URL authentication credentials + * + * @return array + */ + public function getAuthentications() + { + return $this->authentications; + } + + /** + * Set flag indicating whether or not to use a path parameter + * + * @param bool $bool + * @return Subscriber + */ + public function usePathParameter($bool = true) + { + $this->usePathParameter = $bool; + return $this; + } + + /** + * Add an optional parameter to the (un)subscribe requests + * + * @param string $name + * @param string|null $value + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function setParameter($name, $value = null) + { + if (is_array($name)) { + $this->setParameters($name); + return $this; + } + if (empty($name) || !is_string($name)) { + throw new Exception\InvalidArgumentException('Invalid parameter "name"' + . ' of "' . $name . '" must be a non-empty string'); + } + if ($value === null) { + $this->removeParameter($name); + return $this; + } + if (empty($value) || (!is_string($value) && $value !== null)) { + throw new Exception\InvalidArgumentException('Invalid parameter "value"' + . ' of "' . $value . '" must be a non-empty string'); + } + $this->parameters[$name] = $value; + return $this; + } + + /** + * Add an optional parameter to the (un)subscribe requests + * + * @param array $parameters + * @return Subscriber + */ + public function setParameters(array $parameters) + { + foreach ($parameters as $name => $value) { + $this->setParameter($name, $value); + } + return $this; + } + + /** + * Remove an optional parameter for the (un)subscribe requests + * + * @param string $name + * @return Subscriber + * @throws Exception\InvalidArgumentException + */ + public function removeParameter($name) + { + if (empty($name) || !is_string($name)) { + throw new Exception\InvalidArgumentException('Invalid parameter "name"' + . ' of "' . $name . '" must be a non-empty string'); + } + if (array_key_exists($name, $this->parameters)) { + unset($this->parameters[$name]); + } + return $this; + } + + /** + * Return an array of optional parameters for (un)subscribe requests + * + * @return array + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Sets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used to background + * save any verification tokens associated with a subscription or other. + * + * @param Model\SubscriptionPersistenceInterface $storage + * @return Subscriber + */ + public function setStorage(Model\SubscriptionPersistenceInterface $storage) + { + $this->storage = $storage; + return $this; + } + + /** + * Gets an instance of Zend\Feed\Pubsubhubbub\Storage\StoragePersistence used + * to background save any verification tokens associated with a subscription + * or other. + * + * @return Model\SubscriptionPersistenceInterface + * @throws Exception\RuntimeException + */ + public function getStorage() + { + if ($this->storage === null) { + throw new Exception\RuntimeException('No storage vehicle ' + . 'has been set.'); + } + return $this->storage; + } + + /** + * Subscribe to one or more Hub Servers using the stored Hub URLs + * for the given Topic URL (RSS or Atom feed) + * + * @return void + */ + public function subscribeAll() + { + $this->_doRequest('subscribe'); + } + + /** + * Unsubscribe from one or more Hub Servers using the stored Hub URLs + * for the given Topic URL (RSS or Atom feed) + * + * @return void + */ + public function unsubscribeAll() + { + $this->_doRequest('unsubscribe'); + } + + /** + * Returns a boolean indicator of whether the notifications to Hub + * Servers were ALL successful. If even one failed, FALSE is returned. + * + * @return bool + */ + public function isSuccess() + { + if (count($this->errors) > 0) { + return false; + } + return true; + } + + /** + * Return an array of errors met from any failures, including keys: + * 'response' => the Zend\Http\Response object from the failure + * 'hubUrl' => the URL of the Hub Server whose notification failed + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Return an array of Hub Server URLs who returned a response indicating + * operation in Asynchronous Verification Mode, i.e. they will not confirm + * any (un)subscription immediately but at a later time (Hubs may be + * doing this as a batch process when load balancing) + * + * @return array + */ + public function getAsyncHubs() + { + return $this->asyncHubs; + } + + /** + * Executes an (un)subscribe request + * + * @param string $mode + * @return void + * @throws Exception\RuntimeException + */ + protected function _doRequest($mode) + { + $client = $this->_getHttpClient(); + $hubs = $this->getHubUrls(); + if (empty($hubs)) { + throw new Exception\RuntimeException('No Hub Server URLs' + . ' have been set so no subscriptions can be attempted'); + } + $this->errors = array(); + $this->asyncHubs = array(); + foreach ($hubs as $url) { + if (array_key_exists($url, $this->authentications)) { + $auth = $this->authentications[$url]; + $client->setAuth($auth[0], $auth[1]); + } + $client->setUri($url); + $client->setRawBody($params = $this->_getRequestParameters($url, $mode)); + $response = $client->send(); + if ($response->getStatusCode() !== 204 + && $response->getStatusCode() !== 202 + ) { + $this->errors[] = array( + 'response' => $response, + 'hubUrl' => $url, + ); + /** + * At first I thought it was needed, but the backend storage will + * allow tracking async without any user interference. It's left + * here in case the user is interested in knowing what Hubs + * are using async verification modes so they may update Models and + * move these to asynchronous processes. + */ + } elseif ($response->getStatusCode() == 202) { + $this->asyncHubs[] = array( + 'response' => $response, + 'hubUrl' => $url, + ); + } + } + } + + /** + * Get a basic prepared HTTP client for use + * + * @return \Zend\Http\Client + */ + protected function _getHttpClient() + { + $client = PubSubHubbub::getHttpClient(); + $client->setMethod(HttpRequest::METHOD_POST); + $client->setOptions(array('useragent' => 'Zend_Feed_Pubsubhubbub_Subscriber/' + . Version::VERSION)); + return $client; + } + + /** + * Return a list of standard protocol/optional parameters for addition to + * client's POST body that are specific to the current Hub Server URL + * + * @param string $hubUrl + * @param string $mode + * @return string + * @throws Exception\InvalidArgumentException + */ + protected function _getRequestParameters($hubUrl, $mode) + { + if (!in_array($mode, array('subscribe', 'unsubscribe'))) { + throw new Exception\InvalidArgumentException('Invalid mode specified: "' + . $mode . '" which should have been "subscribe" or "unsubscribe"'); + } + + $params = array( + 'hub.mode' => $mode, + 'hub.topic' => $this->getTopicUrl(), + ); + + if ($this->getPreferredVerificationMode() + == PubSubHubbub::VERIFICATION_MODE_SYNC + ) { + $vmodes = array( + PubSubHubbub::VERIFICATION_MODE_SYNC, + PubSubHubbub::VERIFICATION_MODE_ASYNC, + ); + } else { + $vmodes = array( + PubSubHubbub::VERIFICATION_MODE_ASYNC, + PubSubHubbub::VERIFICATION_MODE_SYNC, + ); + } + $params['hub.verify'] = array(); + foreach ($vmodes as $vmode) { + $params['hub.verify'][] = $vmode; + } + + /** + * Establish a persistent verify_token and attach key to callback + * URL's path/query_string + */ + $key = $this->_generateSubscriptionKey($params, $hubUrl); + $token = $this->_generateVerifyToken(); + $params['hub.verify_token'] = $token; + + // Note: query string only usable with PuSH 0.2 Hubs + if (!$this->usePathParameter) { + $params['hub.callback'] = $this->getCallbackUrl() + . '?xhub.subscription=' . PubSubHubbub::urlencode($key); + } else { + $params['hub.callback'] = rtrim($this->getCallbackUrl(), '/') + . '/' . PubSubHubbub::urlencode($key); + } + if ($mode == 'subscribe' && $this->getLeaseSeconds() !== null) { + $params['hub.lease_seconds'] = $this->getLeaseSeconds(); + } + + // hub.secret not currently supported + $optParams = $this->getParameters(); + foreach ($optParams as $name => $value) { + $params[$name] = $value; + } + + // store subscription to storage + $now = new DateTime(); + $expires = null; + if (isset($params['hub.lease_seconds'])) { + $expires = $now->add(new DateInterval('PT' . $params['hub.lease_seconds'] . 'S')) + ->format('Y-m-d H:i:s'); + } + $data = array( + 'id' => $key, + 'topic_url' => $params['hub.topic'], + 'hub_url' => $hubUrl, + 'created_time' => $now->format('Y-m-d H:i:s'), + 'lease_seconds' => $params['hub.lease_seconds'], + 'verify_token' => hash('sha256', $params['hub.verify_token']), + 'secret' => null, + 'expiration_time' => $expires, + 'subscription_state' => ($mode == 'unsubscribe')? PubSubHubbub::SUBSCRIPTION_TODELETE : PubSubHubbub::SUBSCRIPTION_NOTVERIFIED, + ); + $this->getStorage()->setSubscription($data); + + return $this->_toByteValueOrderedString( + $this->_urlEncode($params) + ); + } + + /** + * Simple helper to generate a verification token used in (un)subscribe + * requests to a Hub Server. Follows no particular method, which means + * it might be improved/changed in future. + * + * @return string + */ + protected function _generateVerifyToken() + { + if (!empty($this->testStaticToken)) { + return $this->testStaticToken; + } + return uniqid(rand(), true) . time(); + } + + /** + * Simple helper to generate a verification token used in (un)subscribe + * requests to a Hub Server. + * + * @param array $params + * @param string $hubUrl The Hub Server URL for which this token will apply + * @return string + */ + protected function _generateSubscriptionKey(array $params, $hubUrl) + { + $keyBase = $params['hub.topic'] . $hubUrl; + $key = md5($keyBase); + + return $key; + } + + /** + * URL Encode an array of parameters + * + * @param array $params + * @return array + */ + protected function _urlEncode(array $params) + { + $encoded = array(); + foreach ($params as $key => $value) { + if (is_array($value)) { + $ekey = PubSubHubbub::urlencode($key); + $encoded[$ekey] = array(); + foreach ($value as $duplicateKey) { + $encoded[$ekey][] + = PubSubHubbub::urlencode($duplicateKey); + } + } else { + $encoded[PubSubHubbub::urlencode($key)] + = PubSubHubbub::urlencode($value); + } + } + return $encoded; + } + + /** + * Order outgoing parameters + * + * @param array $params + * @return array + */ + protected function _toByteValueOrderedString(array $params) + { + $return = array(); + uksort($params, 'strnatcmp'); + foreach ($params as $key => $value) { + if (is_array($value)) { + foreach ($value as $keyduplicate) { + $return[] = $key . '=' . $keyduplicate; + } + } else { + $return[] = $key . '=' . $value; + } + } + return implode('&', $return); + } + + /** + * This is STRICTLY for testing purposes only... + */ + protected $testStaticToken = null; + + final public function setTestStaticToken($token) + { + $this->testStaticToken = (string) $token; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Subscriber/Callback.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Subscriber/Callback.php new file mode 100644 index 0000000000..5ec8af2fe1 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Subscriber/Callback.php @@ -0,0 +1,316 @@ +subscriptionKey = $key; + return $this; + } + + /** + * Handle any callback from a Hub Server responding to a subscription or + * unsubscription request. This should be the Hub Server confirming the + * the request prior to taking action on it. + * + * @param array $httpGetData GET data if available and not in $_GET + * @param bool $sendResponseNow Whether to send response now or when asked + * @return void + */ + public function handle(array $httpGetData = null, $sendResponseNow = false) + { + if ($httpGetData === null) { + $httpGetData = $_GET; + } + + /** + * Handle any feed updates (sorry for the mess :P) + * + * This DOES NOT attempt to process a feed update. Feed updates + * SHOULD be validated/processed by an asynchronous process so as + * to avoid holding up responses to the Hub. + */ + $contentType = $this->_getHeader('Content-Type'); + if (strtolower($_SERVER['REQUEST_METHOD']) == 'post' + && $this->_hasValidVerifyToken(null, false) + && (stripos($contentType, 'application/atom+xml') === 0 + || stripos($contentType, 'application/rss+xml') === 0 + || stripos($contentType, 'application/xml') === 0 + || stripos($contentType, 'text/xml') === 0 + || stripos($contentType, 'application/rdf+xml') === 0) + ) { + $this->setFeedUpdate($this->_getRawBody()); + $this->getHttpResponse()->setHeader('X-Hub-On-Behalf-Of', $this->getSubscriberCount()); + /** + * Handle any (un)subscribe confirmation requests + */ + } elseif ($this->isValidHubVerification($httpGetData)) { + $this->getHttpResponse()->setContent($httpGetData['hub_challenge']); + + switch (strtolower($httpGetData['hub_mode'])) { + case 'subscribe': + $data = $this->currentSubscriptionData; + $data['subscription_state'] = PubSubHubbub\PubSubHubbub::SUBSCRIPTION_VERIFIED; + if (isset($httpGetData['hub_lease_seconds'])) { + $data['lease_seconds'] = $httpGetData['hub_lease_seconds']; + } + $this->getStorage()->setSubscription($data); + break; + case 'unsubscribe': + $verifyTokenKey = $this->_detectVerifyTokenKey($httpGetData); + $this->getStorage()->deleteSubscription($verifyTokenKey); + break; + default: + throw new Exception\RuntimeException(sprintf( + 'Invalid hub_mode ("%s") provided', + $httpGetData['hub_mode'] + )); + } + /** + * Hey, C'mon! We tried everything else! + */ + } else { + $this->getHttpResponse()->setStatusCode(404); + } + + if ($sendResponseNow) { + $this->sendResponse(); + } + } + + /** + * Checks validity of the request simply by making a quick pass and + * confirming the presence of all REQUIRED parameters. + * + * @param array $httpGetData + * @return bool + */ + public function isValidHubVerification(array $httpGetData) + { + /** + * As per the specification, the hub.verify_token is OPTIONAL. This + * implementation of Pubsubhubbub considers it REQUIRED and will + * always send a hub.verify_token parameter to be echoed back + * by the Hub Server. Therefore, its absence is considered invalid. + */ + if (strtolower($_SERVER['REQUEST_METHOD']) !== 'get') { + return false; + } + $required = array( + 'hub_mode', + 'hub_topic', + 'hub_challenge', + 'hub_verify_token', + ); + foreach ($required as $key) { + if (!array_key_exists($key, $httpGetData)) { + return false; + } + } + if ($httpGetData['hub_mode'] !== 'subscribe' + && $httpGetData['hub_mode'] !== 'unsubscribe' + ) { + return false; + } + if ($httpGetData['hub_mode'] == 'subscribe' + && !array_key_exists('hub_lease_seconds', $httpGetData) + ) { + return false; + } + if (!Uri::factory($httpGetData['hub_topic'])->isValid()) { + return false; + } + + /** + * Attempt to retrieve any Verification Token Key attached to Callback + * URL's path by our Subscriber implementation + */ + if (!$this->_hasValidVerifyToken($httpGetData)) { + return false; + } + return true; + } + + /** + * Sets a newly received feed (Atom/RSS) sent by a Hub as an update to a + * Topic we've subscribed to. + * + * @param string $feed + * @return \Zend\Feed\PubSubHubbub\Subscriber\Callback + */ + public function setFeedUpdate($feed) + { + $this->feedUpdate = $feed; + return $this; + } + + /** + * Check if any newly received feed (Atom/RSS) update was received + * + * @return bool + */ + public function hasFeedUpdate() + { + if ($this->feedUpdate === null) { + return false; + } + return true; + } + + /** + * Gets a newly received feed (Atom/RSS) sent by a Hub as an update to a + * Topic we've subscribed to. + * + * @return string + */ + public function getFeedUpdate() + { + return $this->feedUpdate; + } + + /** + * Check for a valid verify_token. By default attempts to compare values + * with that sent from Hub, otherwise merely ascertains its existence. + * + * @param array $httpGetData + * @param bool $checkValue + * @return bool + */ + protected function _hasValidVerifyToken(array $httpGetData = null, $checkValue = true) + { + $verifyTokenKey = $this->_detectVerifyTokenKey($httpGetData); + if (empty($verifyTokenKey)) { + return false; + } + $verifyTokenExists = $this->getStorage()->hasSubscription($verifyTokenKey); + if (!$verifyTokenExists) { + return false; + } + if ($checkValue) { + $data = $this->getStorage()->getSubscription($verifyTokenKey); + $verifyToken = $data['verify_token']; + if ($verifyToken !== hash('sha256', $httpGetData['hub_verify_token'])) { + return false; + } + $this->currentSubscriptionData = $data; + return true; + } + return true; + } + + /** + * Attempt to detect the verification token key. This would be passed in + * the Callback URL (which we are handling with this class!) as a URI + * path part (the last part by convention). + * + * @param null|array $httpGetData + * @return false|string + */ + protected function _detectVerifyTokenKey(array $httpGetData = null) + { + /** + * Available when sub keys encoding in Callback URL path + */ + if (isset($this->subscriptionKey)) { + return $this->subscriptionKey; + } + + /** + * Available only if allowed by PuSH 0.2 Hubs + */ + if (is_array($httpGetData) + && isset($httpGetData['xhub_subscription']) + ) { + return $httpGetData['xhub_subscription']; + } + + /** + * Available (possibly) if corrupted in transit and not part of $_GET + */ + $params = $this->_parseQueryString(); + if (isset($params['xhub.subscription'])) { + return rawurldecode($params['xhub.subscription']); + } + + return false; + } + + /** + * Build an array of Query String parameters. + * This bypasses $_GET which munges parameter names and cannot accept + * multiple parameters with the same key. + * + * @return array|void + */ + protected function _parseQueryString() + { + $params = array(); + $queryString = ''; + if (isset($_SERVER['QUERY_STRING'])) { + $queryString = $_SERVER['QUERY_STRING']; + } + if (empty($queryString)) { + return array(); + } + $parts = explode('&', $queryString); + foreach ($parts as $kvpair) { + $pair = explode('=', $kvpair); + $key = rawurldecode($pair[0]); + $value = rawurldecode($pair[1]); + if (isset($params[$key])) { + if (is_array($params[$key])) { + $params[$key][] = $value; + } else { + $params[$key] = array($params[$key], $value); + } + } else { + $params[$key] = $value; + } + } + return $params; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Version.php b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Version.php new file mode 100644 index 0000000000..edee6953bc --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/PubSubHubbub/Version.php @@ -0,0 +1,15 @@ +entry = $entry; + $this->entryKey = $entryKey; + $this->domDocument = $entry->ownerDocument; + if ($type !== null) { + $this->data['type'] = $type; + } else { + $this->data['type'] = Reader::detectType($entry); + } + $this->_loadExtensions(); + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the entry element + * + * @return DOMElement + */ + public function getElement() + { + return $this->entry; + } + + /** + * Get the Entry's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } + return $assumed; + } + + /** + * Get entry as xml + * + * @return string + */ + public function saveXml() + { + $dom = new DOMDocument('1.0', $this->getEncoding()); + $entry = $dom->importNode($this->getElement(), true); + $dom->appendChild($entry); + return $dom->saveXml(); + } + + /** + * Get the entry type + * + * @return string + */ + public function getType() + { + return $this->data['type']; + } + + /** + * Get the XPath query object + * + * @return DOMXPath + */ + public function getXpath() + { + if (!$this->xpath) { + $this->setXpath(new DOMXPath($this->getDomDocument())); + } + return $this->xpath; + } + + /** + * Set the XPath query + * + * @param DOMXPath $xpath + * @return \Zend\Feed\Reader\AbstractEntry + */ + public function setXpath(DOMXPath $xpath) + { + $this->xpath = $xpath; + return $this; + } + + /** + * Get registered extensions + * + * @return array + */ + public function getExtensions() + { + return $this->extensions; + } + + /** + * Return an Extension object with the matching name (postfixed with _Entry) + * + * @param string $name + * @return \Zend\Feed\Reader\Extension\AbstractEntry + */ + public function getExtension($name) + { + if (array_key_exists($name . '\Entry', $this->extensions)) { + return $this->extensions[$name . '\Entry']; + } + return null; + } + + /** + * Method overloading: call given method on first extension implementing it + * + * @param string $method + * @param array $args + * @return mixed + * @throws Exception\BadMethodCallException if no extensions implements the method + */ + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + throw new Exception\BadMethodCallException('Method: ' . $method + . 'does not exist and could not be located on a registered Extension'); + } + + /** + * Load extensions from Zend\Feed\Reader\Reader + * + * @return void + */ + protected function _loadExtensions() + { + $all = Reader::getExtensions(); + $feed = $all['entry']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + $className = Reader::getPluginLoader()->getClassName($extension); + $this->extensions[$extension] = new $className( + $this->getElement(), $this->entryKey, $this->data['type'] + ); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/AbstractFeed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/AbstractFeed.php new file mode 100644 index 0000000000..57ed45d3ec --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/AbstractFeed.php @@ -0,0 +1,300 @@ +domDocument = $domDocument; + $this->xpath = new DOMXPath($this->domDocument); + + if ($type !== null) { + $this->data['type'] = $type; + } else { + $this->data['type'] = Reader::detectType($this->domDocument); + } + $this->registerNamespaces(); + $this->indexEntries(); + $this->loadExtensions(); + } + + /** + * Set an original source URI for the feed being parsed. This value + * is returned from getFeedLink() method if the feed does not carry + * a self-referencing URI. + * + * @param string $uri + */ + public function setOriginalSourceUri($uri) + { + $this->originalSourceUri = $uri; + } + + /** + * Get an original source URI for the feed being parsed. Returns null if + * unset or the feed was not imported from a URI. + * + * @return string|null + */ + public function getOriginalSourceUri() + { + return $this->originalSourceUri; + } + + /** + * Get the number of feed entries. + * Required by the Iterator interface. + * + * @return int + */ + public function count() + { + return count($this->entries); + } + + /** + * Return the current entry + * + * @return \Zend\Feed\Reader\AbstractEntry + */ + public function current() + { + if (substr($this->getType(), 0, 3) == 'rss') { + $reader = new Entry\RSS($this->entries[$this->key()], $this->key(), $this->getType()); + } else { + $reader = new Entry\Atom($this->entries[$this->key()], $this->key(), $this->getType()); + } + + $reader->setXpath($this->xpath); + + return $reader; + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the Feed's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } + return $assumed; + } + + /** + * Get feed as xml + * + * @return string + */ + public function saveXml() + { + return $this->getDomDocument()->saveXml(); + } + + /** + * Get the DOMElement representing the items/feed element + * + * @return DOMElement + */ + public function getElement() + { + return $this->getDomDocument()->documentElement; + } + + /** + * Get the DOMXPath object for this feed + * + * @return DOMXPath + */ + public function getXpath() + { + return $this->xpath; + } + + /** + * Get the feed type + * + * @return string + */ + public function getType() + { + return $this->data['type']; + } + + /** + * Return the current feed key + * + * @return int + */ + public function key() + { + return $this->entriesKey; + } + + /** + * Move the feed pointer forward + * + */ + public function next() + { + ++$this->entriesKey; + } + + /** + * Reset the pointer in the feed object + * + */ + public function rewind() + { + $this->entriesKey = 0; + } + + /** + * Check to see if the iterator is still valid + * + * @return bool + */ + public function valid() + { + return 0 <= $this->entriesKey && $this->entriesKey < $this->count(); + } + + public function getExtensions() + { + return $this->extensions; + } + + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + throw new Exception\BadMethodCallException('Method: ' . $method + . 'does not exist and could not be located on a registered Extension'); + } + + /** + * Return an Extension object with the matching name (postfixed with _Feed) + * + * @param string $name + * @return \Zend\Feed\Reader\Extension\AbstractFeed + */ + public function getExtension($name) + { + if (array_key_exists($name . '\Feed', $this->extensions)) { + return $this->extensions[$name . '\Feed']; + } + return null; + } + + protected function loadExtensions() + { + $all = Reader::getExtensions(); + $manager = Reader::getExtensionManager(); + $feed = $all['feed']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + $plugin = $manager->get($extension); + $plugin->setDomDocument($this->getDomDocument()); + $plugin->setType($this->data['type']); + $plugin->setXpath($this->xpath); + $this->extensions[$extension] = $plugin; + } + } + + /** + * Read all entries to the internal entries array + * + */ + abstract protected function indexEntries(); + + /** + * Register the default namespaces for the current feed format + * + */ + abstract protected function registerNamespaces(); +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection.php new file mode 100644 index 0000000000..172eecce15 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection.php @@ -0,0 +1,17 @@ +getIterator() as $element) { + $authors[] = $element['name']; + } + return array_unique($authors); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection/Category.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection/Category.php new file mode 100644 index 0000000000..15112ceae3 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection/Category.php @@ -0,0 +1,35 @@ +getIterator() as $element) { + if (isset($element['label']) && !empty($element['label'])) { + $categories[] = $element['label']; + } else { + $categories[] = $element['term']; + } + } + return array_unique($categories); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection/Collection.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection/Collection.php new file mode 100644 index 0000000000..e3a6ae3d78 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Collection/Collection.php @@ -0,0 +1,17 @@ +entry = $entry; + $this->entryKey = $entryKey; + $this->domDocument = $entry->ownerDocument; + if ($type !== null) { + $this->data['type'] = $type; + } elseif ($this->domDocument !== null) { + $this->data['type'] = Reader\Reader::detectType($this->domDocument); + } else { + $this->data['type'] = Reader\Reader::TYPE_ANY; + } + $this->loadExtensions(); + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the entry element + * + * @return DOMElement + */ + public function getElement() + { + return $this->entry; + } + + /** + * Get the Entry's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } + return $assumed; + } + + /** + * Get entry as xml + * + * @return string + */ + public function saveXml() + { + $dom = new DOMDocument('1.0', $this->getEncoding()); + $entry = $dom->importNode($this->getElement(), true); + $dom->appendChild($entry); + return $dom->saveXml(); + } + + /** + * Get the entry type + * + * @return string + */ + public function getType() + { + return $this->data['type']; + } + + /** + * Get the XPath query object + * + * @return DOMXPath + */ + public function getXpath() + { + if (!$this->xpath) { + $this->setXpath(new DOMXPath($this->getDomDocument())); + } + return $this->xpath; + } + + /** + * Set the XPath query + * + * @param DOMXPath $xpath + * @return AbstractEntry + */ + public function setXpath(DOMXPath $xpath) + { + $this->xpath = $xpath; + return $this; + } + + /** + * Get registered extensions + * + * @return array + */ + public function getExtensions() + { + return $this->extensions; + } + + /** + * Return an Extension object with the matching name (postfixed with _Entry) + * + * @param string $name + * @return Reader\Extension\AbstractEntry + */ + public function getExtension($name) + { + if (array_key_exists($name . '\\Entry', $this->extensions)) { + return $this->extensions[$name . '\\Entry']; + } + return null; + } + + /** + * Method overloading: call given method on first extension implementing it + * + * @param string $method + * @param array $args + * @return mixed + * @throws Exception\RuntimeException if no extensions implements the method + */ + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + throw new Exception\RuntimeException('Method: ' . $method + . ' does not exist and could not be located on a registered Extension'); + } + + /** + * Load extensions from Zend\Feed\Reader\Reader + * + * @return void + */ + protected function loadExtensions() + { + $all = Reader\Reader::getExtensions(); + $manager = Reader\Reader::getExtensionManager(); + $feed = $all['entry']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + $plugin = $manager->get($extension); + $plugin->setEntryElement($this->getElement()); + $plugin->setEntryKey($this->entryKey); + $plugin->setType($this->data['type']); + $this->extensions[$extension] = $plugin; + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Entry/Atom.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Entry/Atom.php new file mode 100644 index 0000000000..ed61a21e5f --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Entry/Atom.php @@ -0,0 +1,370 @@ +xpathQuery = '//atom:entry[' . ($this->entryKey + 1) . ']'; + + $manager = Reader\Reader::getExtensionManager(); + $extensions = array('Atom\Entry', 'Thread\Entry', 'DublinCore\Entry'); + + foreach ($extensions as $name) { + $extension = $manager->get($name); + $extension->setEntryElement($entry); + $extension->setEntryKey($entryKey); + $extension->setType($type); + $this->extensions[$name] = $extension; + } + } + + /** + * Get the specified author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $people = $this->getExtension('Atom')->getAuthors(); + + $this->data['authors'] = $people; + + return $this->data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (array_key_exists('content', $this->data)) { + return $this->data['content']; + } + + $content = $this->getExtension('Atom')->getContent(); + + $this->data['content'] = $content; + + return $this->data['content']; + } + + /** + * Get the entry creation date + * + * @return string + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->data)) { + return $this->data['datecreated']; + } + + $dateCreated = $this->getExtension('Atom')->getDateCreated(); + + $this->data['datecreated'] = $dateCreated; + + return $this->data['datecreated']; + } + + /** + * Get the entry modification date + * + * @return string + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->data)) { + return $this->data['datemodified']; + } + + $dateModified = $this->getExtension('Atom')->getDateModified(); + + $this->data['datemodified'] = $dateModified; + + return $this->data['datemodified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = $this->getExtension('Atom')->getDescription(); + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the entry enclosure + * + * @return string + */ + public function getEnclosure() + { + if (array_key_exists('enclosure', $this->data)) { + return $this->data['enclosure']; + } + + $enclosure = $this->getExtension('Atom')->getEnclosure(); + + $this->data['enclosure'] = $enclosure; + + return $this->data['enclosure']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = $this->getExtension('Atom')->getId(); + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get a specific link + * + * @param int $index + * @return string + */ + public function getLink($index = 0) + { + if (!array_key_exists('links', $this->data)) { + $this->getLinks(); + } + + if (isset($this->data['links'][$index])) { + return $this->data['links'][$index]; + } + + return null; + } + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (array_key_exists('links', $this->data)) { + return $this->data['links']; + } + + $links = $this->getExtension('Atom')->getLinks(); + + $this->data['links'] = $links; + + return $this->data['links']; + } + + /** + * Get a permalink to the entry + * + * @return string + */ + public function getPermalink() + { + return $this->getLink(0); + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = $this->getExtension('Atom')->getTitle(); + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return int + */ + public function getCommentCount() + { + if (array_key_exists('commentcount', $this->data)) { + return $this->data['commentcount']; + } + + $commentcount = $this->getExtension('Thread')->getCommentCount(); + + if (!$commentcount) { + $commentcount = $this->getExtension('Atom')->getCommentCount(); + } + + $this->data['commentcount'] = $commentcount; + + return $this->data['commentcount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (array_key_exists('commentlink', $this->data)) { + return $this->data['commentlink']; + } + + $commentlink = $this->getExtension('Atom')->getCommentLink(); + + $this->data['commentlink'] = $commentlink; + + return $this->data['commentlink']; + } + + /** + * Returns a URI pointing to a feed of all comments for this entry + * + * @return string + */ + public function getCommentFeedLink() + { + if (array_key_exists('commentfeedlink', $this->data)) { + return $this->data['commentfeedlink']; + } + + $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink(); + + $this->data['commentfeedlink'] = $commentfeedlink; + + return $this->data['commentfeedlink']; + } + + /** + * Get category data as a Reader\Reader_Collection_Category object + * + * @return Reader\Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + $categoryCollection = $this->getExtension('Atom')->getCategories(); + + if (count($categoryCollection) == 0) { + $categoryCollection = $this->getExtension('DublinCore')->getCategories(); + } + + $this->data['categories'] = $categoryCollection; + + return $this->data['categories']; + } + + /** + * Get source feed metadata from the entry + * + * @return Reader\Feed\Atom\Source|null + */ + public function getSource() + { + if (array_key_exists('source', $this->data)) { + return $this->data['source']; + } + + $source = $this->getExtension('Atom')->getSource(); + + $this->data['source'] = $source; + + return $this->data['source']; + } + + /** + * Set the XPath query (incl. on all Extensions) + * + * @param DOMXPath $xpath + * @return void + */ + public function setXpath(DOMXPath $xpath) + { + parent::setXpath($xpath); + foreach ($this->extensions as $extension) { + $extension->setXpath($this->xpath); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Entry/EntryInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Entry/EntryInterface.php new file mode 100644 index 0000000000..86fea3ec58 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Entry/EntryInterface.php @@ -0,0 +1,129 @@ +xpathQueryRss = '//item[' . ($this->entryKey+1) . ']'; + $this->xpathQueryRdf = '//rss:item[' . ($this->entryKey+1) . ']'; + + $manager = Reader\Reader::getExtensionManager(); + $extensions = array( + 'DublinCore\Entry', + 'Content\Entry', + 'Atom\Entry', + 'WellFormedWeb\Entry', + 'Slash\Entry', + 'Thread\Entry', + ); + foreach ($extensions as $name) { + $extension = $manager->get($name); + $extension->setEntryElement($entry); + $extension->setEntryKey($entryKey); + $extension->setType($type); + $this->extensions[$name] = $extension; + } + } + + /** + * Get an author entry + * + * @param int $index + * @return string + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $authors = array(); + $authorsDc = $this->getExtension('DublinCore')->getAuthors(); + if (!empty($authorsDc)) { + foreach ($authorsDc as $author) { + $authors[] = array( + 'name' => $author['name'] + ); + } + } + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $list = $this->xpath->query($this->xpathQueryRss . '//author'); + } else { + $list = $this->xpath->query($this->xpathQueryRdf . '//rss:author'); + } + if ($list->length) { + foreach ($list as $author) { + $string = trim($author->nodeValue); + $email = null; + $name = null; + $data = array(); + // Pretty rough parsing - but it's a catchall + if (preg_match("/^.*@[^ ]*/", $string, $matches)) { + $data['email'] = trim($matches[0]); + if (preg_match("/\((.*)\)$/", $string, $matches)) { + $data['name'] = $matches[1]; + } + $authors[] = $data; + } + } + } + + if (count($authors) == 0) { + $authors = $this->getExtension('Atom')->getAuthors(); + } else { + $authors = new Reader\Collection\Author( + Reader\Reader::arrayUnique($authors) + ); + } + + if (count($authors) == 0) { + $authors = null; + } + + $this->data['authors'] = $authors; + + return $this->data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (array_key_exists('content', $this->data)) { + return $this->data['content']; + } + + $content = $this->getExtension('Content')->getContent(); + + if (!$content) { + $content = $this->getDescription(); + } + + if (empty($content)) { + $content = $this->getExtension('Atom')->getContent(); + } + + $this->data['content'] = $content; + + return $this->data['content']; + } + + /** + * Get the entry's date of creation + * + * @return string + */ + public function getDateCreated() + { + return $this->getDateModified(); + } + + /** + * Get the entry's date of modification + * + * @throws Exception\RuntimeException + * @return string + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->data)) { + return $this->data['datemodified']; + } + + $dateModified = null; + $date = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $dateModified = $this->xpath->evaluate('string(' . $this->xpathQueryRss . '/pubDate)'); + if ($dateModified) { + $dateModifiedParsed = strtotime($dateModified); + if ($dateModifiedParsed) { + $date = new DateTime('@' . $dateModifiedParsed); + } else { + $dateStandards = array(DateTime::RSS, DateTime::RFC822, + DateTime::RFC2822, null); + foreach ($dateStandards as $standard) { + try { + $date = date_create_from_format($standard, $dateModified); + break; + } catch (\Exception $e) { + if ($standard == null) { + throw new Exception\RuntimeException( + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' + . $e->getMessage(), + 0, $e + ); + } + } + } + } + } + } + + if (!$date) { + $date = $this->getExtension('DublinCore')->getDate(); + } + + if (!$date) { + $date = $this->getExtension('Atom')->getDateModified(); + } + + if (!$date) { + $date = null; + } + + $this->data['datemodified'] = $date; + + return $this->data['datemodified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $description = $this->xpath->evaluate('string(' . $this->xpathQueryRss . '/description)'); + } else { + $description = $this->xpath->evaluate('string(' . $this->xpathQueryRdf . '/rss:description)'); + } + + if (!$description) { + $description = $this->getExtension('DublinCore')->getDescription(); + } + + if (empty($description)) { + $description = $this->getExtension('Atom')->getDescription(); + } + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the entry enclosure + * @return string + */ + public function getEnclosure() + { + if (array_key_exists('enclosure', $this->data)) { + return $this->data['enclosure']; + } + + $enclosure = null; + + if ($this->getType() == Reader\Reader::TYPE_RSS_20) { + $nodeList = $this->xpath->query($this->xpathQueryRss . '/enclosure'); + + if ($nodeList->length > 0) { + $enclosure = new \stdClass(); + $enclosure->url = $nodeList->item(0)->getAttribute('url'); + $enclosure->length = $nodeList->item(0)->getAttribute('length'); + $enclosure->type = $nodeList->item(0)->getAttribute('type'); + } + } + + if (!$enclosure) { + $enclosure = $this->getExtension('Atom')->getEnclosure(); + } + + $this->data['enclosure'] = $enclosure; + + return $this->data['enclosure']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $id = $this->xpath->evaluate('string(' . $this->xpathQueryRss . '/guid)'); + } + + if (!$id) { + $id = $this->getExtension('DublinCore')->getId(); + } + + if (empty($id)) { + $id = $this->getExtension('Atom')->getId(); + } + + if (!$id) { + if ($this->getPermalink()) { + $id = $this->getPermalink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get a specific link + * + * @param int $index + * @return string + */ + public function getLink($index = 0) + { + if (!array_key_exists('links', $this->data)) { + $this->getLinks(); + } + + if (isset($this->data['links'][$index])) { + return $this->data['links'][$index]; + } + + return null; + } + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (array_key_exists('links', $this->data)) { + return $this->data['links']; + } + + $links = array(); + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $list = $this->xpath->query($this->xpathQueryRss . '//link'); + } else { + $list = $this->xpath->query($this->xpathQueryRdf . '//rss:link'); + } + + if (!$list->length) { + $links = $this->getExtension('Atom')->getLinks(); + } else { + foreach ($list as $link) { + $links[] = $link->nodeValue; + } + } + + $this->data['links'] = $links; + + return $this->data['links']; + } + + /** + * Get all categories + * + * @return Reader\Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $list = $this->xpath->query($this->xpathQueryRss . '//category'); + } else { + $list = $this->xpath->query($this->xpathQueryRdf . '//rss:category'); + } + + if ($list->length) { + $categoryCollection = new Reader\Collection\Category; + foreach ($list as $category) { + $categoryCollection[] = array( + 'term' => $category->nodeValue, + 'scheme' => $category->getAttribute('domain'), + 'label' => $category->nodeValue, + ); + } + } else { + $categoryCollection = $this->getExtension('DublinCore')->getCategories(); + } + + if (count($categoryCollection) == 0) { + $categoryCollection = $this->getExtension('Atom')->getCategories(); + } + + $this->data['categories'] = $categoryCollection; + + return $this->data['categories']; + } + + /** + * Get a permalink to the entry + * + * @return string + */ + public function getPermalink() + { + return $this->getLink(0); + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $title = $this->xpath->evaluate('string(' . $this->xpathQueryRss . '/title)'); + } else { + $title = $this->xpath->evaluate('string(' . $this->xpathQueryRdf . '/rss:title)'); + } + + if (!$title) { + $title = $this->getExtension('DublinCore')->getTitle(); + } + + if (!$title) { + $title = $this->getExtension('Atom')->getTitle(); + } + + if (!$title) { + $title = null; + } + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return string|null + */ + public function getCommentCount() + { + if (array_key_exists('commentcount', $this->data)) { + return $this->data['commentcount']; + } + + $commentcount = $this->getExtension('Slash')->getCommentCount(); + + if (!$commentcount) { + $commentcount = $this->getExtension('Thread')->getCommentCount(); + } + + if (!$commentcount) { + $commentcount = $this->getExtension('Atom')->getCommentCount(); + } + + if (!$commentcount) { + $commentcount = null; + } + + $this->data['commentcount'] = $commentcount; + + return $this->data['commentcount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (array_key_exists('commentlink', $this->data)) { + return $this->data['commentlink']; + } + + $commentlink = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $commentlink = $this->xpath->evaluate('string(' . $this->xpathQueryRss . '/comments)'); + } + + if (!$commentlink) { + $commentlink = $this->getExtension('Atom')->getCommentLink(); + } + + if (!$commentlink) { + $commentlink = null; + } + + $this->data['commentlink'] = $commentlink; + + return $this->data['commentlink']; + } + + /** + * Returns a URI pointing to a feed of all comments for this entry + * + * @return string + */ + public function getCommentFeedLink() + { + if (array_key_exists('commentfeedlink', $this->data)) { + return $this->data['commentfeedlink']; + } + + $commentfeedlink = $this->getExtension('WellFormedWeb')->getCommentFeedLink(); + + if (!$commentfeedlink) { + $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rss'); + } + + if (!$commentfeedlink) { + $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rdf'); + } + + if (!$commentfeedlink) { + $commentfeedlink = null; + } + + $this->data['commentfeedlink'] = $commentfeedlink; + + return $this->data['commentfeedlink']; + } + + /** + * Set the XPath query (incl. on all Extensions) + * + * @param DOMXPath $xpath + * @return void + */ + public function setXpath(DOMXPath $xpath) + { + parent::setXpath($xpath); + foreach ($this->extensions as $extension) { + $extension->setXpath($this->xpath); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Exception/BadMethodCallException.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Exception/BadMethodCallException.php new file mode 100644 index 0000000000..ee1ef94cba --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Exception/BadMethodCallException.php @@ -0,0 +1,17 @@ +entry = $entry; + $this->domDocument = $entry->ownerDocument; + return $this; + } + + /** + * Get the entry DOMElement + * + * @return DOMElement + */ + public function getEntryElement() + { + return $this->entry; + } + + /** + * Set the entry key + * + * @param string $entryKey + * @return AbstractEntry + */ + public function setEntryKey($entryKey) + { + $this->entryKey = $entryKey; + return $this; + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the Entry's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + return $assumed; + } + + /** + * Set the entry type + * + * Has side effect of setting xpath prefix + * + * @param string $type + * @return AbstractEntry + */ + public function setType($type) + { + if (null === $type) { + $this->data['type'] = null; + return $this; + } + + $this->data['type'] = $type; + if ($type === Reader\Reader::TYPE_RSS_10 + || $type === Reader\Reader::TYPE_RSS_090 + ) { + $this->setXpathPrefix('//rss:item[' . ($this->entryKey + 1) . ']'); + return $this; + } + + if ($type === Reader\Reader::TYPE_ATOM_10 + || $type === Reader\Reader::TYPE_ATOM_03 + ) { + $this->setXpathPrefix('//atom:entry[' . ($this->entryKey + 1) . ']'); + return $this; + } + + $this->setXpathPrefix('//item[' . ($this->entryKey + 1) . ']'); + return $this; + } + + /** + * Get the entry type + * + * @return string + */ + public function getType() + { + $type = $this->data['type']; + if ($type === null) { + $type = Reader\Reader::detectType($this->getEntryElement(), true); + $this->setType($type); + } + + return $type; + } + + /** + * Set the XPath query + * + * @param DOMXPath $xpath + * @return AbstractEntry + */ + public function setXpath(DOMXPath $xpath) + { + $this->xpath = $xpath; + $this->registerNamespaces(); + return $this; + } + + /** + * Get the XPath query object + * + * @return DOMXPath + */ + public function getXpath() + { + if (!$this->xpath) { + $this->setXpath(new DOMXPath($this->getDomDocument())); + } + return $this->xpath; + } + + /** + * Serialize the entry to an array + * + * @return array + */ + public function toArray() + { + return $this->data; + } + + /** + * Get the XPath prefix + * + * @return string + */ + public function getXpathPrefix() + { + return $this->xpathPrefix; + } + + /** + * Set the XPath prefix + * + * @param string $prefix + * @return AbstractEntry + */ + public function setXpathPrefix($prefix) + { + $this->xpathPrefix = $prefix; + return $this; + } + + /** + * Register XML namespaces + * + * @return void + */ + abstract protected function registerNamespaces(); +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/AbstractFeed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/AbstractFeed.php new file mode 100644 index 0000000000..1bea2e4980 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/AbstractFeed.php @@ -0,0 +1,176 @@ +domDocument = $dom; + return $this; + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the Feed's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + return $assumed; + } + + /** + * Set the feed type + * + * @param string $type + * @return AbstractFeed + */ + public function setType($type) + { + $this->data['type'] = $type; + return $this; + } + + /** + * Get the feed type + * + * If null, it will attempt to autodetect the type. + * + * @return string + */ + public function getType() + { + $type = $this->data['type']; + if (null === $type) { + $type = Reader\Reader::detectType($this->getDomDocument()); + $this->setType($type); + } + return $type; + } + + + /** + * Return the feed as an array + * + * @return array + */ + public function toArray() // untested + { + return $this->data; + } + + /** + * Set the XPath query + * + * @param DOMXPath $xpath + * @return AbstractEntry + */ + public function setXpath(DOMXPath $xpath = null) + { + if (null === $xpath) { + $this->xpath = null; + return $this; + } + + $this->xpath = $xpath; + $this->registerNamespaces(); + return $this; + } + + /** + * Get the DOMXPath object + * + * @return string + */ + public function getXpath() + { + if (null === $this->xpath) { + $this->setXpath(new DOMXPath($this->getDomDocument())); + } + + return $this->xpath; + } + + /** + * Get the XPath prefix + * + * @return string + */ + public function getXpathPrefix() + { + return $this->xpathPrefix; + } + + /** + * Set the XPath prefix + * + * @param string $prefix + * @return void + */ + public function setXpathPrefix($prefix) + { + $this->xpathPrefix = $prefix; + } + + /** + * Register the default namespaces for the current feed format + */ + abstract protected function registerNamespaces(); +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Atom/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Atom/Entry.php new file mode 100644 index 0000000000..aa91a5c9c3 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Atom/Entry.php @@ -0,0 +1,628 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return Collection\Author + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $authors = array(); + $list = $this->getXpath()->query($this->getXpathPrefix() . '//atom:author'); + + if (!$list->length) { + /** + * TODO: Limit query to feed level els only! + */ + $list = $this->getXpath()->query('//atom:author'); + } + + if ($list->length) { + foreach ($list as $author) { + $author = $this->getAuthorFromElement($author); + if (!empty($author)) { + $authors[] = $author; + } + } + } + + if (count($authors) == 0) { + $authors = new Collection\Author(); + } else { + $authors = new Collection\Author( + Reader\Reader::arrayUnique($authors) + ); + } + + $this->data['authors'] = $authors; + return $this->data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (array_key_exists('content', $this->data)) { + return $this->data['content']; + } + + $content = null; + + $el = $this->getXpath()->query($this->getXpathPrefix() . '/atom:content'); + if ($el->length > 0) { + $el = $el->item(0); + $type = $el->getAttribute('type'); + switch ($type) { + case '': + case 'text': + case 'text/plain': + case 'html': + case 'text/html': + $content = $el->nodeValue; + break; + case 'xhtml': + $this->getXpath()->registerNamespace('xhtml', 'http://www.w3.org/1999/xhtml'); + $xhtml = $this->getXpath()->query( + $this->getXpathPrefix() . '/atom:content/xhtml:div' + )->item(0); + $d = new DOMDocument('1.0', $this->getEncoding()); + $xhtmls = $d->importNode($xhtml, true); + $d->appendChild($xhtmls); + $content = $this->collectXhtml( + $d->saveXML(), + $d->lookupPrefix('http://www.w3.org/1999/xhtml') + ); + break; + } + } + + if (!$content) { + $content = $this->getDescription(); + } + + $this->data['content'] = trim($content); + + return $this->data['content']; + } + + /** + * Parse out XHTML to remove the namespacing + * + * @param $xhtml + * @param $prefix + * @return mixed + */ + protected function collectXhtml($xhtml, $prefix) + { + if (!empty($prefix)) $prefix = $prefix . ':'; + $matches = array( + "/<\?xml[^<]*>[^<]*<" . $prefix . "div[^<]*/", + "/<\/" . $prefix . "div>\s*$/" + ); + $xhtml = preg_replace($matches, '', $xhtml); + if (!empty($prefix)) { + $xhtml = preg_replace("/(<[\/]?)" . $prefix . "([a-zA-Z]+)/", '$1$2', $xhtml); + } + return $xhtml; + } + + /** + * Get the entry creation date + * + * @return string + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->data)) { + return $this->data['datecreated']; + } + + $date = null; + + if ($this->getAtomType() === Reader\Reader::TYPE_ATOM_03) { + $dateCreated = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:created)'); + } else { + $dateCreated = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:published)'); + } + + if ($dateCreated) { + $date = new DateTime($dateCreated); + } + + $this->data['datecreated'] = $date; + + return $this->data['datecreated']; + } + + /** + * Get the entry modification date + * + * @return string + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->data)) { + return $this->data['datemodified']; + } + + $date = null; + + if ($this->getAtomType() === Reader\Reader::TYPE_ATOM_03) { + $dateModified = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:modified)'); + } else { + $dateModified = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:updated)'); + } + + if ($dateModified) { + $date = new DateTime($dateModified); + } + + $this->data['datemodified'] = $date; + + return $this->data['datemodified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:summary)'); + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the entry enclosure + * + * @return string + */ + public function getEnclosure() + { + if (array_key_exists('enclosure', $this->data)) { + return $this->data['enclosure']; + } + + $enclosure = null; + + $nodeList = $this->getXpath()->query($this->getXpathPrefix() . '/atom:link[@rel="enclosure"]'); + + if ($nodeList->length > 0) { + $enclosure = new stdClass(); + $enclosure->url = $nodeList->item(0)->getAttribute('href'); + $enclosure->length = $nodeList->item(0)->getAttribute('length'); + $enclosure->type = $nodeList->item(0)->getAttribute('type'); + } + + $this->data['enclosure'] = $enclosure; + + return $this->data['enclosure']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:id)'); + + if (!$id) { + if ($this->getPermalink()) { + $id = $this->getPermalink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get the base URI of the feed (if set). + * + * @return string|null + */ + public function getBaseUrl() + { + if (array_key_exists('baseUrl', $this->data)) { + return $this->data['baseUrl']; + } + + $baseUrl = $this->getXpath()->evaluate('string(' + . $this->getXpathPrefix() . '/@xml:base[1]' + . ')'); + + if (!$baseUrl) { + $baseUrl = $this->getXpath()->evaluate('string(//@xml:base[1])'); + } + + if (!$baseUrl) { + $baseUrl = null; + } + + $this->data['baseUrl'] = $baseUrl; + + return $this->data['baseUrl']; + } + + /** + * Get a specific link + * + * @param int $index + * @return string + */ + public function getLink($index = 0) + { + if (!array_key_exists('links', $this->data)) { + $this->getLinks(); + } + + if (isset($this->data['links'][$index])) { + return $this->data['links'][$index]; + } + + return null; + } + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (array_key_exists('links', $this->data)) { + return $this->data['links']; + } + + $links = array(); + + $list = $this->getXpath()->query( + $this->getXpathPrefix() . '//atom:link[@rel="alternate"]/@href' . '|' . + $this->getXpathPrefix() . '//atom:link[not(@rel)]/@href' + ); + + if ($list->length) { + foreach ($list as $link) { + $links[] = $this->absolutiseUri($link->value); + } + } + + $this->data['links'] = $links; + + return $this->data['links']; + } + + /** + * Get a permalink to the entry + * + * @return string + */ + public function getPermalink() + { + return $this->getLink(0); + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:title)'); + + if (!$title) { + $title = null; + } + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return int + */ + public function getCommentCount() + { + if (array_key_exists('commentcount', $this->data)) { + return $this->data['commentcount']; + } + + $count = null; + + $this->getXpath()->registerNamespace('thread10', 'http://purl.org/syndication/thread/1.0'); + $list = $this->getXpath()->query( + $this->getXpathPrefix() . '//atom:link[@rel="replies"]/@thread10:count' + ); + + if ($list->length) { + $count = $list->item(0)->value; + } + + $this->data['commentcount'] = $count; + + return $this->data['commentcount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (array_key_exists('commentlink', $this->data)) { + return $this->data['commentlink']; + } + + $link = null; + + $list = $this->getXpath()->query( + $this->getXpathPrefix() . '//atom:link[@rel="replies" and @type="text/html"]/@href' + ); + + if ($list->length) { + $link = $list->item(0)->value; + $link = $this->absolutiseUri($link); + } + + $this->data['commentlink'] = $link; + + return $this->data['commentlink']; + } + + /** + * Returns a URI pointing to a feed of all comments for this entry + * + * @param string $type + * @return string + */ + public function getCommentFeedLink($type = 'atom') + { + if (array_key_exists('commentfeedlink', $this->data)) { + return $this->data['commentfeedlink']; + } + + $link = null; + + $list = $this->getXpath()->query( + $this->getXpathPrefix() . '//atom:link[@rel="replies" and @type="application/' . $type.'+xml"]/@href' + ); + + if ($list->length) { + $link = $list->item(0)->value; + $link = $this->absolutiseUri($link); + } + + $this->data['commentfeedlink'] = $link; + + return $this->data['commentfeedlink']; + } + + /** + * Get all categories + * + * @return Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + if ($this->getAtomType() == Reader\Reader::TYPE_ATOM_10) { + $list = $this->getXpath()->query($this->getXpathPrefix() . '//atom:category'); + } else { + /** + * Since Atom 0.3 did not support categories, it would have used the + * Dublin Core extension. However there is a small possibility Atom 0.3 + * may have been retrofitted to use Atom 1.0 instead. + */ + $this->getXpath()->registerNamespace('atom10', Reader\Reader::NAMESPACE_ATOM_10); + $list = $this->getXpath()->query($this->getXpathPrefix() . '//atom10:category'); + } + + if ($list->length) { + $categoryCollection = new Collection\Category; + foreach ($list as $category) { + $categoryCollection[] = array( + 'term' => $category->getAttribute('term'), + 'scheme' => $category->getAttribute('scheme'), + 'label' => $category->getAttribute('label') + ); + } + } else { + return new Collection\Category; + } + + $this->data['categories'] = $categoryCollection; + + return $this->data['categories']; + } + + /** + * Get source feed metadata from the entry + * + * @return Reader\Feed\Atom\Source|null + */ + public function getSource() + { + if (array_key_exists('source', $this->data)) { + return $this->data['source']; + } + + $source = null; + // TODO: Investigate why _getAtomType() fails here. Is it even needed? + if ($this->getType() == Reader\Reader::TYPE_ATOM_10) { + $list = $this->getXpath()->query($this->getXpathPrefix() . '/atom:source[1]'); + if ($list->length) { + $element = $list->item(0); + $source = new Reader\Feed\Atom\Source($element, $this->getXpathPrefix()); + } + } + + $this->data['source'] = $source; + return $this->data['source']; + } + + /** + * Attempt to absolutise the URI, i.e. if a relative URI apply the + * xml:base value as a prefix to turn into an absolute URI. + * + * @param $link + * @return string + */ + protected function absolutiseUri($link) + { + if (!Uri::factory($link)->isAbsolute()) { + if ($this->getBaseUrl() !== null) { + $link = $this->getBaseUrl() . $link; + if (!Uri::factory($link)->isValid()) { + $link = null; + } + } + } + return $link; + } + + /** + * Get an author entry + * + * @param DOMElement $element + * @return string + */ + protected function getAuthorFromElement(DOMElement $element) + { + $author = array(); + + $emailNode = $element->getElementsByTagName('email'); + $nameNode = $element->getElementsByTagName('name'); + $uriNode = $element->getElementsByTagName('uri'); + + if ($emailNode->length && strlen($emailNode->item(0)->nodeValue) > 0) { + $author['email'] = $emailNode->item(0)->nodeValue; + } + + if ($nameNode->length && strlen($nameNode->item(0)->nodeValue) > 0) { + $author['name'] = $nameNode->item(0)->nodeValue; + } + + if ($uriNode->length && strlen($uriNode->item(0)->nodeValue) > 0) { + $author['uri'] = $uriNode->item(0)->nodeValue; + } + + if (empty($author)) { + return null; + } + return $author; + } + + /** + * Register the default namespaces for the current feed format + */ + protected function registerNamespaces() + { + switch ($this->getAtomType()) { + case Reader\Reader::TYPE_ATOM_03: + $this->getXpath()->registerNamespace('atom', Reader\Reader::NAMESPACE_ATOM_03); + break; + default: + $this->getXpath()->registerNamespace('atom', Reader\Reader::NAMESPACE_ATOM_10); + break; + } + } + + /** + * Detect the presence of any Atom namespaces in use + * + * @return string + */ + protected function getAtomType() + { + $dom = $this->getDomDocument(); + $prefixAtom03 = $dom->lookupPrefix(Reader\Reader::NAMESPACE_ATOM_03); + $prefixAtom10 = $dom->lookupPrefix(Reader\Reader::NAMESPACE_ATOM_10); + if ($dom->isDefaultNamespace(Reader\Reader::NAMESPACE_ATOM_03) + || !empty($prefixAtom03)) { + return Reader\Reader::TYPE_ATOM_03; + } + if ($dom->isDefaultNamespace(Reader\Reader::NAMESPACE_ATOM_10) + || !empty($prefixAtom10)) { + return Reader\Reader::TYPE_ATOM_10; + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Atom/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Atom/Feed.php new file mode 100644 index 0000000000..986d23fdb3 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Atom/Feed.php @@ -0,0 +1,536 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return Collection\Author + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $list = $this->xpath->query('//atom:author'); + + $authors = array(); + + if ($list->length) { + foreach ($list as $author) { + $author = $this->getAuthorFromElement($author); + if (!empty($author)) { + $authors[] = $author; + } + } + } + + if (count($authors) == 0) { + $authors = new Collection\Author(); + } else { + $authors = new Collection\Author( + Reader\Reader::arrayUnique($authors) + ); + } + + $this->data['authors'] = $authors; + + return $this->data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->data)) { + return $this->data['copyright']; + } + + $copyright = null; + + if ($this->getType() === Reader\Reader::TYPE_ATOM_03) { + $copyright = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:copyright)'); + } else { + $copyright = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:rights)'); + } + + if (!$copyright) { + $copyright = null; + } + + $this->data['copyright'] = $copyright; + + return $this->data['copyright']; + } + + /** + * Get the feed creation date + * + * @return DateTime|null + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->data)) { + return $this->data['datecreated']; + } + + $date = null; + + if ($this->getType() === Reader\Reader::TYPE_ATOM_03) { + $dateCreated = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:created)'); + } else { + $dateCreated = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:published)'); + } + + if ($dateCreated) { + $date = new DateTime($dateCreated); + } + + $this->data['datecreated'] = $date; + + return $this->data['datecreated']; + } + + /** + * Get the feed modification date + * + * @return DateTime|null + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->data)) { + return $this->data['datemodified']; + } + + $date = null; + + if ($this->getType() === Reader\Reader::TYPE_ATOM_03) { + $dateModified = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:modified)'); + } else { + $dateModified = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:updated)'); + } + + if ($dateModified) { + $date = new DateTime($dateModified); + } + + $this->data['datemodified'] = $date; + + return $this->data['datemodified']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = null; + + if ($this->getType() === Reader\Reader::TYPE_ATOM_03) { + $description = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:tagline)'); + } else { + $description = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:subtitle)'); + } + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (array_key_exists('generator', $this->data)) { + return $this->data['generator']; + } + // TODO: Add uri support + $generator = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:generator)'); + + if (!$generator) { + $generator = null; + } + + $this->data['generator'] = $generator; + + return $this->data['generator']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:id)'); + + if (!$id) { + if ($this->getLink()) { + $id = $this->getLink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->data)) { + return $this->data['language']; + } + + $language = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:lang)'); + + if (!$language) { + $language = $this->xpath->evaluate('string(//@xml:lang[1])'); + } + + if (!$language) { + $language = null; + } + + $this->data['language'] = $language; + + return $this->data['language']; + } + + /** + * Get the feed image + * + * @return array|null + */ + public function getImage() + { + if (array_key_exists('image', $this->data)) { + return $this->data['image']; + } + + $imageUrl = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:logo)'); + + if (!$imageUrl) { + $image = null; + } else { + $image = array('uri' => $imageUrl); + } + + $this->data['image'] = $image; + + return $this->data['image']; + } + + /** + * Get the base URI of the feed (if set). + * + * @return string|null + */ + public function getBaseUrl() + { + if (array_key_exists('baseUrl', $this->data)) { + return $this->data['baseUrl']; + } + + $baseUrl = $this->xpath->evaluate('string(//@xml:base[1])'); + + if (!$baseUrl) { + $baseUrl = null; + } + $this->data['baseUrl'] = $baseUrl; + + return $this->data['baseUrl']; + } + + /** + * Get a link to the source website + * + * @return string|null + */ + public function getLink() + { + if (array_key_exists('link', $this->data)) { + return $this->data['link']; + } + + $link = null; + + $list = $this->xpath->query( + $this->getXpathPrefix() . '/atom:link[@rel="alternate"]/@href' . '|' . + $this->getXpathPrefix() . '/atom:link[not(@rel)]/@href' + ); + + if ($list->length) { + $link = $list->item(0)->nodeValue; + $link = $this->absolutiseUri($link); + } + + $this->data['link'] = $link; + + return $this->data['link']; + } + + /** + * Get a link to the feed's XML Url + * + * @return string|null + */ + public function getFeedLink() + { + if (array_key_exists('feedlink', $this->data)) { + return $this->data['feedlink']; + } + + $link = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:link[@rel="self"]/@href)'); + + $link = $this->absolutiseUri($link); + + $this->data['feedlink'] = $link; + + return $this->data['feedlink']; + } + + /** + * Get an array of any supported Pusubhubbub endpoints + * + * @return array|null + */ + public function getHubs() + { + if (array_key_exists('hubs', $this->data)) { + return $this->data['hubs']; + } + $hubs = array(); + + $list = $this->xpath->query($this->getXpathPrefix() + . '//atom:link[@rel="hub"]/@href'); + + if ($list->length) { + foreach ($list as $uri) { + $hubs[] = $this->absolutiseUri($uri->nodeValue); + } + } else { + $hubs = null; + } + + $this->data['hubs'] = $hubs; + + return $this->data['hubs']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:title)'); + + if (!$title) { + $title = null; + } + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * Get all categories + * + * @return Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + if ($this->getType() == Reader\Reader::TYPE_ATOM_10) { + $list = $this->xpath->query($this->getXpathPrefix() . '/atom:category'); + } else { + /** + * Since Atom 0.3 did not support categories, it would have used the + * Dublin Core extension. However there is a small possibility Atom 0.3 + * may have been retrofittied to use Atom 1.0 instead. + */ + $this->xpath->registerNamespace('atom10', Reader\Reader::NAMESPACE_ATOM_10); + $list = $this->xpath->query($this->getXpathPrefix() . '/atom10:category'); + } + + if ($list->length) { + $categoryCollection = new Collection\Category; + foreach ($list as $category) { + $categoryCollection[] = array( + 'term' => $category->getAttribute('term'), + 'scheme' => $category->getAttribute('scheme'), + 'label' => $category->getAttribute('label') + ); + } + } else { + return new Collection\Category; + } + + $this->data['categories'] = $categoryCollection; + + return $this->data['categories']; + } + + /** + * Get an author entry in RSS format + * + * @param DOMElement $element + * @return string + */ + protected function getAuthorFromElement(DOMElement $element) + { + $author = array(); + + $emailNode = $element->getElementsByTagName('email'); + $nameNode = $element->getElementsByTagName('name'); + $uriNode = $element->getElementsByTagName('uri'); + + if ($emailNode->length && strlen($emailNode->item(0)->nodeValue) > 0) { + $author['email'] = $emailNode->item(0)->nodeValue; + } + + if ($nameNode->length && strlen($nameNode->item(0)->nodeValue) > 0) { + $author['name'] = $nameNode->item(0)->nodeValue; + } + + if ($uriNode->length && strlen($uriNode->item(0)->nodeValue) > 0) { + $author['uri'] = $uriNode->item(0)->nodeValue; + } + + if (empty($author)) { + return null; + } + return $author; + } + + /** + * Attempt to absolutise the URI, i.e. if a relative URI apply the + * xml:base value as a prefix to turn into an absolute URI. + */ + protected function absolutiseUri($link) + { + if (!Uri::factory($link)->isAbsolute()) { + if ($this->getBaseUrl() !== null) { + $link = $this->getBaseUrl() . $link; + if (!Uri::factory($link)->isValid()) { + $link = null; + } + } + } + return $link; + } + + /** + * Register the default namespaces for the current feed format + */ + protected function registerNamespaces() + { + if ($this->getType() == Reader\Reader::TYPE_ATOM_10 + || $this->getType() == Reader\Reader::TYPE_ATOM_03 + ) { + return; // pre-registered at Feed level + } + $atomDetected = $this->getAtomType(); + switch ($atomDetected) { + case Reader\Reader::TYPE_ATOM_03: + $this->xpath->registerNamespace('atom', Reader\Reader::NAMESPACE_ATOM_03); + break; + default: + $this->xpath->registerNamespace('atom', Reader\Reader::NAMESPACE_ATOM_10); + break; + } + } + + /** + * Detect the presence of any Atom namespaces in use + */ + protected function getAtomType() + { + $dom = $this->getDomDocument(); + $prefixAtom03 = $dom->lookupPrefix(Reader\Reader::NAMESPACE_ATOM_03); + $prefixAtom10 = $dom->lookupPrefix(Reader\Reader::NAMESPACE_ATOM_10); + if ($dom->isDefaultNamespace(Reader\Reader::NAMESPACE_ATOM_10) + || !empty($prefixAtom10) + ) { + return Reader\Reader::TYPE_ATOM_10; + } + if ($dom->isDefaultNamespace(Reader\Reader::NAMESPACE_ATOM_03) + || !empty($prefixAtom03) + ) { + return Reader\Reader::TYPE_ATOM_03; + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Content/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Content/Entry.php new file mode 100644 index 0000000000..f48a360f2b --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Content/Entry.php @@ -0,0 +1,37 @@ +getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $content = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/content:encoded)'); + } else { + $content = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/content:encoded)'); + } + return $content; + } + + /** + * Register RSS Content Module namespace + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php new file mode 100644 index 0000000000..6770b4fe0e --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php @@ -0,0 +1,73 @@ +getLicenses(); + + if (isset($licenses[$index])) { + return $licenses[$index]; + } + + return null; + } + + /** + * Get the entry licenses + * + * @return array + */ + public function getLicenses() + { + $name = 'licenses'; + if (array_key_exists($name, $this->data)) { + return $this->data[$name]; + } + + $licenses = array(); + $list = $this->xpath->evaluate($this->getXpathPrefix() . '//cc:license'); + + if ($list->length) { + foreach ($list as $license) { + $licenses[] = $license->nodeValue; + } + + $licenses = array_unique($licenses); + } else { + $cc = new Feed(); + $licenses = $cc->getLicenses(); + } + + $this->data[$name] = $licenses; + + return $this->data[$name]; + } + + /** + * Register Creative Commons namespaces + * + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('cc', 'http://backend.userland.com/creativeCommonsRssModule'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php new file mode 100644 index 0000000000..103bce7f94 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php @@ -0,0 +1,71 @@ +getLicenses(); + + if (isset($licenses[$index])) { + return $licenses[$index]; + } + + return null; + } + + /** + * Get the entry licenses + * + * @return array + */ + public function getLicenses() + { + $name = 'licenses'; + if (array_key_exists($name, $this->data)) { + return $this->data[$name]; + } + + $licenses = array(); + $list = $this->xpath->evaluate('channel/cc:license'); + + if ($list->length) { + foreach ($list as $license) { + $licenses[] = $license->nodeValue; + } + + $licenses = array_unique($licenses); + } + + $this->data[$name] = $licenses; + + return $this->data[$name]; + } + + /** + * Register Creative Commons namespaces + * + * @return void + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('cc', 'http://backend.userland.com/creativeCommonsRssModule'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/DublinCore/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/DublinCore/Entry.php new file mode 100644 index 0000000000..2713353cad --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/DublinCore/Entry.php @@ -0,0 +1,238 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $authors = array(); + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc11:creator'); + + if (!$list->length) { + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc10:creator'); + } + if (!$list->length) { + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc11:publisher'); + + if (!$list->length) { + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc10:publisher'); + } + } + + if ($list->length) { + foreach ($list as $author) { + $authors[] = array( + 'name' => $author->nodeValue + ); + } + $authors = new Collection\Author( + Reader\Reader::arrayUnique($authors) + ); + } else { + $authors = null; + } + + $this->data['authors'] = $authors; + + return $this->data['authors']; + } + + /** + * Get categories (subjects under DC) + * + * @return Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc11:subject'); + + if (!$list->length) { + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc10:subject'); + } + + if ($list->length) { + $categoryCollection = new Collection\Category; + foreach ($list as $category) { + $categoryCollection[] = array( + 'term' => $category->nodeValue, + 'scheme' => null, + 'label' => $category->nodeValue, + ); + } + } else { + $categoryCollection = new Collection\Category; + } + + $this->data['categories'] = $categoryCollection; + return $this->data['categories']; + } + + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + return $this->getDescription(); + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = null; + $description = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:description)'); + + if (!$description) { + $description = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:description)'); + } + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = null; + $id = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:identifier)'); + + if (!$id) { + $id = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:identifier)'); + } + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = null; + $title = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:title)'); + + if (!$title) { + $title = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:title)'); + } + + if (!$title) { + $title = null; + } + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * + * + * @return DateTime|null + */ + public function getDate() + { + if (array_key_exists('date', $this->data)) { + return $this->data['date']; + } + + $d = null; + $date = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:date)'); + + if (!$date) { + $date = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:date)'); + } + + if ($date) { + $d = new DateTime($date); + } + + $this->data['date'] = $d; + + return $this->data['date']; + } + + /** + * Register DC namespaces + * + * @return void + */ + protected function registerNamespaces() + { + $this->getXpath()->registerNamespace('dc10', 'http://purl.org/dc/elements/1.0/'); + $this->getXpath()->registerNamespace('dc11', 'http://purl.org/dc/elements/1.1/'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/DublinCore/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/DublinCore/Feed.php new file mode 100644 index 0000000000..2738ac732b --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/DublinCore/Feed.php @@ -0,0 +1,281 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $authors = array(); + $list = $this->getXpath()->query('//dc11:creator'); + + if (!$list->length) { + $list = $this->getXpath()->query('//dc10:creator'); + } + if (!$list->length) { + $list = $this->getXpath()->query('//dc11:publisher'); + + if (!$list->length) { + $list = $this->getXpath()->query('//dc10:publisher'); + } + } + + if ($list->length) { + foreach ($list as $author) { + $authors[] = array( + 'name' => $author->nodeValue + ); + } + $authors = new Collection\Author( + Reader\Reader::arrayUnique($authors) + ); + } else { + $authors = null; + } + + $this->data['authors'] = $authors; + + return $this->data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->data)) { + return $this->data['copyright']; + } + + $copyright = null; + $copyright = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:rights)'); + + if (!$copyright) { + $copyright = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:rights)'); + } + + if (!$copyright) { + $copyright = null; + } + + $this->data['copyright'] = $copyright; + + return $this->data['copyright']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = null; + $description = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:description)'); + + if (!$description) { + $description = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:description)'); + } + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = null; + $id = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:identifier)'); + + if (!$id) { + $id = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:identifier)'); + } + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->data)) { + return $this->data['language']; + } + + $language = null; + $language = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:language)'); + + if (!$language) { + $language = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:language)'); + } + + if (!$language) { + $language = null; + } + + $this->data['language'] = $language; + + return $this->data['language']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = null; + $title = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:title)'); + + if (!$title) { + $title = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:title)'); + } + + if (!$title) { + $title = null; + } + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * + * + * @return DateTime|null + */ + public function getDate() + { + if (array_key_exists('date', $this->data)) { + return $this->data['date']; + } + + $d = null; + $date = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc11:date)'); + + if (!$date) { + $date = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/dc10:date)'); + } + + if ($date) { + $d = new DateTime($date); + } + + $this->data['date'] = $d; + + return $this->data['date']; + } + + /** + * Get categories (subjects under DC) + * + * @return Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc11:subject'); + + if (!$list->length) { + $list = $this->getXpath()->evaluate($this->getXpathPrefix() . '//dc10:subject'); + } + + if ($list->length) { + $categoryCollection = new Collection\Category; + foreach ($list as $category) { + $categoryCollection[] = array( + 'term' => $category->nodeValue, + 'scheme' => null, + 'label' => $category->nodeValue, + ); + } + } else { + $categoryCollection = new Collection\Category; + } + + $this->data['categories'] = $categoryCollection; + return $this->data['categories']; + } + + /** + * Register the default namespaces for the current feed format + * + * @return void + */ + protected function registerNamespaces() + { + $this->getXpath()->registerNamespace('dc10', 'http://purl.org/dc/elements/1.0/'); + $this->getXpath()->registerNamespace('dc11', 'http://purl.org/dc/elements/1.1/'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Podcast/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Podcast/Entry.php new file mode 100644 index 0000000000..c97e64ff47 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Podcast/Entry.php @@ -0,0 +1,180 @@ +data['author'])) { + return $this->data['author']; + } + + $author = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:author)'); + + if (!$author) { + $author = null; + } + + $this->data['author'] = $author; + + return $this->data['author']; + } + + /** + * Get the entry block + * + * @return string + */ + public function getBlock() + { + if (isset($this->data['block'])) { + return $this->data['block']; + } + + $block = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:block)'); + + if (!$block) { + $block = null; + } + + $this->data['block'] = $block; + + return $this->data['block']; + } + + /** + * Get the entry duration + * + * @return string + */ + public function getDuration() + { + if (isset($this->data['duration'])) { + return $this->data['duration']; + } + + $duration = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:duration)'); + + if (!$duration) { + $duration = null; + } + + $this->data['duration'] = $duration; + + return $this->data['duration']; + } + + /** + * Get the entry explicit + * + * @return string + */ + public function getExplicit() + { + if (isset($this->data['explicit'])) { + return $this->data['explicit']; + } + + $explicit = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:explicit)'); + + if (!$explicit) { + $explicit = null; + } + + $this->data['explicit'] = $explicit; + + return $this->data['explicit']; + } + + /** + * Get the entry keywords + * + * @return string + */ + public function getKeywords() + { + if (isset($this->data['keywords'])) { + return $this->data['keywords']; + } + + $keywords = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:keywords)'); + + if (!$keywords) { + $keywords = null; + } + + $this->data['keywords'] = $keywords; + + return $this->data['keywords']; + } + + /** + * Get the entry subtitle + * + * @return string + */ + public function getSubtitle() + { + if (isset($this->data['subtitle'])) { + return $this->data['subtitle']; + } + + $subtitle = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:subtitle)'); + + if (!$subtitle) { + $subtitle = null; + } + + $this->data['subtitle'] = $subtitle; + + return $this->data['subtitle']; + } + + /** + * Get the entry summary + * + * @return string + */ + public function getSummary() + { + if (isset($this->data['summary'])) { + return $this->data['summary']; + } + + $summary = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:summary)'); + + if (!$summary) { + $summary = null; + } + + $this->data['summary'] = $summary; + + return $this->data['summary']; + } + + /** + * Register iTunes namespace + * + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Podcast/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Podcast/Feed.php new file mode 100644 index 0000000000..66b13a48b2 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Podcast/Feed.php @@ -0,0 +1,277 @@ +data['author'])) { + return $this->data['author']; + } + + $author = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:author)'); + + if (!$author) { + $author = null; + } + + $this->data['author'] = $author; + + return $this->data['author']; + } + + /** + * Get the entry block + * + * @return string + */ + public function getBlock() + { + if (isset($this->data['block'])) { + return $this->data['block']; + } + + $block = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:block)'); + + if (!$block) { + $block = null; + } + + $this->data['block'] = $block; + + return $this->data['block']; + } + + /** + * Get the entry category + * + * @return string + */ + public function getItunesCategories() + { + if (isset($this->data['categories'])) { + return $this->data['categories']; + } + + $categoryList = $this->xpath->query($this->getXpathPrefix() . '/itunes:category'); + + $categories = array(); + + if ($categoryList->length > 0) { + foreach ($categoryList as $node) { + $children = null; + + if ($node->childNodes->length > 0) { + $children = array(); + + foreach ($node->childNodes as $childNode) { + if (!($childNode instanceof DOMText)) { + $children[$childNode->getAttribute('text')] = null; + } + } + } + + $categories[$node->getAttribute('text')] = $children; + } + } + + + if (!$categories) { + $categories = null; + } + + $this->data['categories'] = $categories; + + return $this->data['categories']; + } + + /** + * Get the entry explicit + * + * @return string + */ + public function getExplicit() + { + if (isset($this->data['explicit'])) { + return $this->data['explicit']; + } + + $explicit = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:explicit)'); + + if (!$explicit) { + $explicit = null; + } + + $this->data['explicit'] = $explicit; + + return $this->data['explicit']; + } + + /** + * Get the entry image + * + * @return string + */ + public function getItunesImage() + { + if (isset($this->data['image'])) { + return $this->data['image']; + } + + $image = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:image/@href)'); + + if (!$image) { + $image = null; + } + + $this->data['image'] = $image; + + return $this->data['image']; + } + + /** + * Get the entry keywords + * + * @return string + */ + public function getKeywords() + { + if (isset($this->data['keywords'])) { + return $this->data['keywords']; + } + + $keywords = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:keywords)'); + + if (!$keywords) { + $keywords = null; + } + + $this->data['keywords'] = $keywords; + + return $this->data['keywords']; + } + + /** + * Get the entry's new feed url + * + * @return string + */ + public function getNewFeedUrl() + { + if (isset($this->data['new-feed-url'])) { + return $this->data['new-feed-url']; + } + + $newFeedUrl = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:new-feed-url)'); + + if (!$newFeedUrl) { + $newFeedUrl = null; + } + + $this->data['new-feed-url'] = $newFeedUrl; + + return $this->data['new-feed-url']; + } + + /** + * Get the entry owner + * + * @return string + */ + public function getOwner() + { + if (isset($this->data['owner'])) { + return $this->data['owner']; + } + + $owner = null; + + $email = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:owner/itunes:email)'); + $name = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:owner/itunes:name)'); + + if (!empty($email)) { + $owner = $email . (empty($name) ? '' : ' (' . $name . ')'); + } elseif (!empty($name)) { + $owner = $name; + } + + if (!$owner) { + $owner = null; + } + + $this->data['owner'] = $owner; + + return $this->data['owner']; + } + + /** + * Get the entry subtitle + * + * @return string + */ + public function getSubtitle() + { + if (isset($this->data['subtitle'])) { + return $this->data['subtitle']; + } + + $subtitle = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:subtitle)'); + + if (!$subtitle) { + $subtitle = null; + } + + $this->data['subtitle'] = $subtitle; + + return $this->data['subtitle']; + } + + /** + * Get the entry summary + * + * @return string + */ + public function getSummary() + { + if (isset($this->data['summary'])) { + return $this->data['summary']; + } + + $summary = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:summary)'); + + if (!$summary) { + $summary = null; + } + + $this->data['summary'] = $summary; + + return $this->data['summary']; + } + + /** + * Register iTunes namespace + * + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Slash/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Slash/Entry.php new file mode 100644 index 0000000000..2c47568f91 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Slash/Entry.php @@ -0,0 +1,121 @@ +getData('section'); + } + + /** + * Get the entry department + * + * @return string|null + */ + public function getDepartment() + { + return $this->getData('department'); + } + + /** + * Get the entry hit_parade + * + * @return array + */ + public function getHitParade() + { + $name = 'hit_parade'; + + if (isset($this->data[$name])) { + return $this->data[$name]; + } + + $stringParade = $this->getData($name); + $hitParade = array(); + + if (!empty($stringParade)) { + $stringParade = explode(',', $stringParade); + + foreach ($stringParade as $hit) + $hitParade[] = $hit + 0; //cast to integer + } + + $this->data[$name] = $hitParade; + return $hitParade; + } + + /** + * Get the entry comments + * + * @return int + */ + public function getCommentCount() + { + $name = 'comments'; + + if (isset($this->data[$name])) { + return $this->data[$name]; + } + + $comments = $this->getData($name, 'string'); + + if (!$comments) { + $this->data[$name] = null; + return $this->data[$name]; + } + + return $comments; + } + + /** + * Get the entry data specified by name + * @param string $name + * @param string $type + * + * @return mixed|null + */ + protected function getData($name, $type = 'string') + { + if (array_key_exists($name, $this->data)) { + return $this->data[$name]; + } + + $data = $this->xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/slash10:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->data[$name] = $data; + + return $data; + } + + /** + * Register Slash namespaces + * + * @return void + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('slash10', 'http://purl.org/rss/1.0/modules/slash/'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Syndication/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Syndication/Feed.php new file mode 100644 index 0000000000..db1724c14c --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Syndication/Feed.php @@ -0,0 +1,151 @@ +getData($name); + + if ($period === null) { + $this->data[$name] = 'daily'; + return 'daily'; //Default specified by spec + } + + switch ($period) { + case 'hourly': + case 'daily': + case 'weekly': + case 'yearly': + return $period; + default: + throw new Reader\Exception\InvalidArgumentException("Feed specified invalid update period: '$period'." + . " Must be one of hourly, daily, weekly or yearly" + ); + } + } + + /** + * Get update frequency + * + * @return int + */ + public function getUpdateFrequency() + { + $name = 'updateFrequency'; + $freq = $this->getData($name, 'number'); + + if (!$freq || $freq < 1) { + $this->data[$name] = 1; + return 1; + } + + return $freq; + } + + /** + * Get update frequency as ticks + * + * @return int + */ + public function getUpdateFrequencyAsTicks() + { + $name = 'updateFrequency'; + $freq = $this->getData($name, 'number'); + + if (!$freq || $freq < 1) { + $this->data[$name] = 1; + $freq = 1; + } + + $period = $this->getUpdatePeriod(); + $ticks = 1; + + switch ($period) { + case 'yearly': + $ticks *= 52; //TODO: fix generalisation, how? + // no break + case 'weekly': + $ticks *= 7; + // no break + case 'daily': + $ticks *= 24; + // no break + case 'hourly': + $ticks *= 3600; + break; + default: //Never arrive here, exception thrown in getPeriod() + break; + } + + return $ticks / $freq; + } + + /** + * Get update base + * + * @return DateTime|null + */ + public function getUpdateBase() + { + $updateBase = $this->getData('updateBase'); + $date = null; + if ($updateBase) { + $date = DateTime::createFromFormat(DateTime::W3C, $updateBase); + } + return $date; + } + + /** + * Get the entry data specified by name + * + * @param string $name + * @param string $type + * @return mixed|null + */ + private function getData($name, $type = 'string') + { + if (array_key_exists($name, $this->data)) { + return $this->data[$name]; + } + + $data = $this->xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/syn10:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->data[$name] = $data; + + return $data; + } + + /** + * Register Syndication namespaces + * + * @return void + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('syn10', 'http://purl.org/rss/1.0/modules/syndication/'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Thread/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Thread/Entry.php new file mode 100644 index 0000000000..d3bc315871 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/Thread/Entry.php @@ -0,0 +1,72 @@ +getData('total'); + } + + /** + * Get the entry data specified by name + * + * @param string $name + * @return mixed|null + */ + protected function getData($name) + { + if (array_key_exists($name, $this->data)) { + return $this->data[$name]; + } + + $data = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/thread10:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->data[$name] = $data; + + return $data; + } + + /** + * Register Atom Thread Extension 1.0 namespace + * + * @return void + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('thread10', 'http://purl.org/syndication/thread/1.0'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php new file mode 100644 index 0000000000..6d5a977053 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php @@ -0,0 +1,50 @@ +data)) { + return $this->data[$name]; + } + + $data = $this->xpath->evaluate('string(' . $this->getXpathPrefix() . '/wfw:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->data[$name] = $data; + + return $data; + } + + /** + * Register Slash namespaces + * + * @return void + */ + protected function registerNamespaces() + { + $this->xpath->registerNamespace('wfw', 'http://wellformedweb.org/CommentAPI/'); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/ExtensionManager.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/ExtensionManager.php new file mode 100644 index 0000000000..9103643a30 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/ExtensionManager.php @@ -0,0 +1,80 @@ +pluginManager = $pluginManager; + } + + /** + * Method overloading + * + * Proxy to composed ExtensionPluginManager instance. + * + * @param string $method + * @param array $args + * @return mixed + * @throws Exception\BadMethodCallException + */ + public function __call($method, $args) + { + if (!method_exists($this->pluginManager, $method)) { + throw new Exception\BadMethodCallException(sprintf( + 'Method by name of %s does not exist in %s', + $method, + __CLASS__ + )); + } + return call_user_func_array(array($this->pluginManager, $method), $args); + } + + /** + * Get the named extension + * + * @param string $name + * @return Extension\AbstractEntry|Extension\AbstractFeed + */ + public function get($name) + { + return $this->pluginManager->get($name); + } + + /** + * Do we have the named extension? + * + * @param string $name + * @return bool + */ + public function has($name) + { + return $this->pluginManager->has($name); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/ExtensionManagerInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/ExtensionManagerInterface.php new file mode 100644 index 0000000000..4bbb91d9e9 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/ExtensionManagerInterface.php @@ -0,0 +1,29 @@ + 'Zend\Feed\Reader\Extension\Atom\Entry', + 'atomfeed' => 'Zend\Feed\Reader\Extension\Atom\Feed', + 'contententry' => 'Zend\Feed\Reader\Extension\Content\Entry', + 'creativecommonsentry' => 'Zend\Feed\Reader\Extension\CreativeCommons\Entry', + 'creativecommonsfeed' => 'Zend\Feed\Reader\Extension\CreativeCommons\Feed', + 'dublincoreentry' => 'Zend\Feed\Reader\Extension\DublinCore\Entry', + 'dublincorefeed' => 'Zend\Feed\Reader\Extension\DublinCore\Feed', + 'podcastentry' => 'Zend\Feed\Reader\Extension\Podcast\Entry', + 'podcastfeed' => 'Zend\Feed\Reader\Extension\Podcast\Feed', + 'slashentry' => 'Zend\Feed\Reader\Extension\Slash\Entry', + 'syndicationfeed' => 'Zend\Feed\Reader\Extension\Syndication\Feed', + 'threadentry' => 'Zend\Feed\Reader\Extension\Thread\Entry', + 'wellformedwebentry' => 'Zend\Feed\Reader\Extension\WellFormedWeb\Entry', + ); + + /** + * Do not share instances + * + * @var bool + */ + protected $shareByDefault = false; + + /** + * Validate the plugin + * + * Checks that the extension loaded is of a valid type. + * + * @param mixed $plugin + * @return void + * @throws Exception\InvalidArgumentException if invalid + */ + public function validatePlugin($plugin) + { + if ($plugin instanceof Extension\AbstractEntry + || $plugin instanceof Extension\AbstractFeed + ) { + // we're okay + return; + } + + throw new Exception\InvalidArgumentException(sprintf( + 'Plugin of type %s is invalid; must implement %s\Extension\AbstractFeed ' + . 'or %s\Extension\AbstractEntry', + (is_object($plugin) ? get_class($plugin) : gettype($plugin)), + __NAMESPACE__, + __NAMESPACE__ + )); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/AbstractFeed.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/AbstractFeed.php new file mode 100644 index 0000000000..0d5f2b835a --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/AbstractFeed.php @@ -0,0 +1,307 @@ +domDocument = $domDocument; + $this->xpath = new DOMXPath($this->domDocument); + + if ($type !== null) { + $this->data['type'] = $type; + } else { + $this->data['type'] = Reader\Reader::detectType($this->domDocument); + } + $this->registerNamespaces(); + $this->indexEntries(); + $this->loadExtensions(); + } + + /** + * Set an original source URI for the feed being parsed. This value + * is returned from getFeedLink() method if the feed does not carry + * a self-referencing URI. + * + * @param string $uri + */ + public function setOriginalSourceUri($uri) + { + $this->originalSourceUri = $uri; + } + + /** + * Get an original source URI for the feed being parsed. Returns null if + * unset or the feed was not imported from a URI. + * + * @return string|null + */ + public function getOriginalSourceUri() + { + return $this->originalSourceUri; + } + + /** + * Get the number of feed entries. + * Required by the Iterator interface. + * + * @return int + */ + public function count() + { + return count($this->entries); + } + + /** + * Return the current entry + * + * @return \Zend\Feed\Reader\Entry\EntryInterface + */ + public function current() + { + if (substr($this->getType(), 0, 3) == 'rss') { + $reader = new Reader\Entry\Rss($this->entries[$this->key()], $this->key(), $this->getType()); + } else { + $reader = new Reader\Entry\Atom($this->entries[$this->key()], $this->key(), $this->getType()); + } + + $reader->setXpath($this->xpath); + + return $reader; + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the Feed's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } + return $assumed; + } + + /** + * Get feed as xml + * + * @return string + */ + public function saveXml() + { + return $this->getDomDocument()->saveXml(); + } + + /** + * Get the DOMElement representing the items/feed element + * + * @return DOMElement + */ + public function getElement() + { + return $this->getDomDocument()->documentElement; + } + + /** + * Get the DOMXPath object for this feed + * + * @return DOMXPath + */ + public function getXpath() + { + return $this->xpath; + } + + /** + * Get the feed type + * + * @return string + */ + public function getType() + { + return $this->data['type']; + } + + /** + * Return the current feed key + * + * @return int + */ + public function key() + { + return $this->entriesKey; + } + + /** + * Move the feed pointer forward + * + */ + public function next() + { + ++$this->entriesKey; + } + + /** + * Reset the pointer in the feed object + * + */ + public function rewind() + { + $this->entriesKey = 0; + } + + /** + * Check to see if the iterator is still valid + * + * @return bool + */ + public function valid() + { + return 0 <= $this->entriesKey && $this->entriesKey < $this->count(); + } + + public function getExtensions() + { + return $this->extensions; + } + + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + throw new Exception\BadMethodCallException('Method: ' . $method + . 'does not exist and could not be located on a registered Extension'); + } + + /** + * Return an Extension object with the matching name (postfixed with _Feed) + * + * @param string $name + * @return \Zend\Feed\Reader\Extension\AbstractFeed + */ + public function getExtension($name) + { + if (array_key_exists($name . '\\Feed', $this->extensions)) { + return $this->extensions[$name . '\\Feed']; + } + return null; + } + + protected function loadExtensions() + { + $all = Reader\Reader::getExtensions(); + $manager = Reader\Reader::getExtensionManager(); + $feed = $all['feed']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + if (!$manager->has($extension)) { + throw new Exception\RuntimeException(sprintf('Unable to load extension "%s"; cannot find class', $extension)); + } + $plugin = $manager->get($extension); + $plugin->setDomDocument($this->getDomDocument()); + $plugin->setType($this->data['type']); + $plugin->setXpath($this->xpath); + $this->extensions[$extension] = $plugin; + } + } + + /** + * Read all entries to the internal entries array + * + */ + abstract protected function indexEntries(); + + /** + * Register the default namespaces for the current feed format + * + */ + abstract protected function registerNamespaces(); +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/Atom.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/Atom.php new file mode 100644 index 0000000000..02a8f6244d --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/Atom.php @@ -0,0 +1,410 @@ +get('Atom\Feed'); + $atomFeed->setDomDocument($dom); + $atomFeed->setType($this->data['type']); + $atomFeed->setXpath($this->xpath); + $this->extensions['Atom\\Feed'] = $atomFeed; + + $atomFeed = $manager->get('DublinCore\Feed'); + $atomFeed->setDomDocument($dom); + $atomFeed->setType($this->data['type']); + $atomFeed->setXpath($this->xpath); + $this->extensions['DublinCore\\Feed'] = $atomFeed; + + foreach ($this->extensions as $extension) { + $extension->setXpathPrefix('/atom:feed'); + } + } + + /** + * Get a single author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $authors = $this->getExtension('Atom')->getAuthors(); + + $this->data['authors'] = $authors; + + return $this->data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->data)) { + return $this->data['copyright']; + } + + $copyright = $this->getExtension('Atom')->getCopyright(); + + if (!$copyright) { + $copyright = null; + } + + $this->data['copyright'] = $copyright; + + return $this->data['copyright']; + } + + /** + * Get the feed creation date + * + * @return string|null + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->data)) { + return $this->data['datecreated']; + } + + $dateCreated = $this->getExtension('Atom')->getDateCreated(); + + if (!$dateCreated) { + $dateCreated = null; + } + + $this->data['datecreated'] = $dateCreated; + + return $this->data['datecreated']; + } + + /** + * Get the feed modification date + * + * @return string|null + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->data)) { + return $this->data['datemodified']; + } + + $dateModified = $this->getExtension('Atom')->getDateModified(); + + if (!$dateModified) { + $dateModified = null; + } + + $this->data['datemodified'] = $dateModified; + + return $this->data['datemodified']; + } + + /** + * Get the feed lastBuild date. This is not implemented in Atom. + * + * @return string|null + */ + public function getLastBuildDate() + { + return null; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = $this->getExtension('Atom')->getDescription(); + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (array_key_exists('generator', $this->data)) { + return $this->data['generator']; + } + + $generator = $this->getExtension('Atom')->getGenerator(); + + $this->data['generator'] = $generator; + + return $this->data['generator']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = $this->getExtension('Atom')->getId(); + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->data)) { + return $this->data['language']; + } + + $language = $this->getExtension('Atom')->getLanguage(); + + if (!$language) { + $language = $this->xpath->evaluate('string(//@xml:lang[1])'); + } + + if (!$language) { + $language = null; + } + + $this->data['language'] = $language; + + return $this->data['language']; + } + + /** + * Get a link to the source website + * + * @return string|null + */ + public function getBaseUrl() + { + if (array_key_exists('baseUrl', $this->data)) { + return $this->data['baseUrl']; + } + + $baseUrl = $this->getExtension('Atom')->getBaseUrl(); + + $this->data['baseUrl'] = $baseUrl; + + return $this->data['baseUrl']; + } + + /** + * Get a link to the source website + * + * @return string|null + */ + public function getLink() + { + if (array_key_exists('link', $this->data)) { + return $this->data['link']; + } + + $link = $this->getExtension('Atom')->getLink(); + + $this->data['link'] = $link; + + return $this->data['link']; + } + + /** + * Get feed image data + * + * @return array|null + */ + public function getImage() + { + if (array_key_exists('image', $this->data)) { + return $this->data['image']; + } + + $link = $this->getExtension('Atom')->getImage(); + + $this->data['image'] = $link; + + return $this->data['image']; + } + + /** + * Get a link to the feed's XML Url + * + * @return string|null + */ + public function getFeedLink() + { + if (array_key_exists('feedlink', $this->data)) { + return $this->data['feedlink']; + } + + $link = $this->getExtension('Atom')->getFeedLink(); + + if ($link === null || empty($link)) { + $link = $this->getOriginalSourceUri(); + } + + $this->data['feedlink'] = $link; + + return $this->data['feedlink']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = $this->getExtension('Atom')->getTitle(); + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * Get an array of any supported Pusubhubbub endpoints + * + * @return array|null + */ + public function getHubs() + { + if (array_key_exists('hubs', $this->data)) { + return $this->data['hubs']; + } + + $hubs = $this->getExtension('Atom')->getHubs(); + + $this->data['hubs'] = $hubs; + + return $this->data['hubs']; + } + + /** + * Get all categories + * + * @return Reader\Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + $categoryCollection = $this->getExtension('Atom')->getCategories(); + + if (count($categoryCollection) == 0) { + $categoryCollection = $this->getExtension('DublinCore')->getCategories(); + } + + $this->data['categories'] = $categoryCollection; + + return $this->data['categories']; + } + + /** + * Read all entries to the internal entries array + * + * @return void + */ + protected function indexEntries() + { + if ($this->getType() == Reader\Reader::TYPE_ATOM_10 || + $this->getType() == Reader\Reader::TYPE_ATOM_03) { + $entries = array(); + $entries = $this->xpath->evaluate('//atom:entry'); + + foreach ($entries as $index => $entry) { + $this->entries[$index] = $entry; + } + } + } + + /** + * Register the default namespaces for the current feed format + * + */ + protected function registerNamespaces() + { + switch ($this->data['type']) { + case Reader\Reader::TYPE_ATOM_03: + $this->xpath->registerNamespace('atom', Reader\Reader::NAMESPACE_ATOM_03); + break; + case Reader\Reader::TYPE_ATOM_10: + default: + $this->xpath->registerNamespace('atom', Reader\Reader::NAMESPACE_ATOM_10); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/Atom/Source.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/Atom/Source.php new file mode 100644 index 0000000000..fada128592 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/Atom/Source.php @@ -0,0 +1,94 @@ +domDocument = $source->ownerDocument; + $this->xpath = new DOMXPath($this->domDocument); + $this->data['type'] = $type; + $this->registerNamespaces(); + $this->loadExtensions(); + + $manager = Reader\Reader::getExtensionManager(); + $extensions = array('Atom\Feed', 'DublinCore\Feed'); + + foreach ($extensions as $name) { + $extension = $manager->get($name); + $extension->setDomDocument($this->domDocument); + $extension->setType($this->data['type']); + $extension->setXpath($this->xpath); + $this->extensions[$name] = $extension; + } + + foreach ($this->extensions as $extension) { + $extension->setXpathPrefix(rtrim($xpathPrefix, '/') . '/atom:source'); + } + } + + /** + * Since this is not an Entry carrier but a vehicle for Feed metadata, any + * applicable Entry methods are stubbed out and do nothing. + */ + + /** + * @return void + */ + public function count() {} + + /** + * @return void + */ + public function current() {} + + /** + * @return void + */ + public function key() {} + + /** + * @return void + */ + public function next() {} + + /** + * @return void + */ + public function rewind() {} + + /** + * @return void + */ + public function valid() {} + + /** + * @return void + */ + protected function indexEntries() {} +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/FeedInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/FeedInterface.php new file mode 100644 index 0000000000..4ba3293d49 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Feed/FeedInterface.php @@ -0,0 +1,111 @@ +get('DublinCore\Feed'); + $feed->setDomDocument($dom); + $feed->setType($this->data['type']); + $feed->setXpath($this->xpath); + $this->extensions['DublinCore\Feed'] = $feed; + + $feed = $manager->get('Atom\Feed'); + $feed->setDomDocument($dom); + $feed->setType($this->data['type']); + $feed->setXpath($this->xpath); + $this->extensions['Atom\Feed'] = $feed; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090 + ) { + $xpathPrefix = '/rss/channel'; + } else { + $xpathPrefix = '/rdf:RDF/rss:channel'; + } + foreach ($this->extensions as $extension) { + $extension->setXpathPrefix($xpathPrefix); + } + } + + /** + * Get a single author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->data)) { + return $this->data['authors']; + } + + $authors = array(); + $authorsDc = $this->getExtension('DublinCore')->getAuthors(); + if (!empty($authorsDc)) { + foreach ($authorsDc as $author) { + $authors[] = array( + 'name' => $author['name'] + ); + } + } + + /** + * Technically RSS doesn't specific author element use at the feed level + * but it's supported on a "just in case" basis. + */ + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 + && $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $list = $this->xpath->query('//author'); + } else { + $list = $this->xpath->query('//rss:author'); + } + if ($list->length) { + foreach ($list as $author) { + $string = trim($author->nodeValue); + $email = null; + $name = null; + $data = array(); + // Pretty rough parsing - but it's a catchall + if (preg_match("/^.*@[^ ]*/", $string, $matches)) { + $data['email'] = trim($matches[0]); + if (preg_match("/\((.*)\)$/", $string, $matches)) { + $data['name'] = $matches[1]; + } + $authors[] = $data; + } + } + } + + if (count($authors) == 0) { + $authors = $this->getExtension('Atom')->getAuthors(); + } else { + $authors = new Reader\Collection\Author( + Reader\Reader::arrayUnique($authors) + ); + } + + if (count($authors) == 0) { + $authors = null; + } + + $this->data['authors'] = $authors; + + return $this->data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->data)) { + return $this->data['copyright']; + } + + $copyright = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $copyright = $this->xpath->evaluate('string(/rss/channel/copyright)'); + } + + if (!$copyright && $this->getExtension('DublinCore') !== null) { + $copyright = $this->getExtension('DublinCore')->getCopyright(); + } + + if (empty($copyright)) { + $copyright = $this->getExtension('Atom')->getCopyright(); + } + + if (!$copyright) { + $copyright = null; + } + + $this->data['copyright'] = $copyright; + + return $this->data['copyright']; + } + + /** + * Get the feed creation date + * + * @return string|null + */ + public function getDateCreated() + { + return $this->getDateModified(); + } + + /** + * Get the feed modification date + * + * @return DateTime + * @throws Exception\RuntimeException + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->data)) { + return $this->data['datemodified']; + } + + $dateModified = null; + $date = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $dateModified = $this->xpath->evaluate('string(/rss/channel/pubDate)'); + if (!$dateModified) { + $dateModified = $this->xpath->evaluate('string(/rss/channel/lastBuildDate)'); + } + if ($dateModified) { + $dateModifiedParsed = strtotime($dateModified); + if ($dateModifiedParsed) { + $date = new DateTime('@' . $dateModifiedParsed); + } else { + $dateStandards = array(DateTime::RSS, DateTime::RFC822, + DateTime::RFC2822, null); + foreach ($dateStandards as $standard) { + try { + $date = DateTime::createFromFormat($standard, $dateModified); + break; + } catch (\Exception $e) { + if ($standard == null) { + throw new Exception\RuntimeException( + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' + . $e->getMessage(), + 0, $e + ); + } + } + } + } + } + } + + if (!$date) { + $date = $this->getExtension('DublinCore')->getDate(); + } + + if (!$date) { + $date = $this->getExtension('Atom')->getDateModified(); + } + + if (!$date) { + $date = null; + } + + $this->data['datemodified'] = $date; + + return $this->data['datemodified']; + } + + /** + * Get the feed lastBuild date + * + * @throws Exception\RuntimeException + * @return DateTime + */ + public function getLastBuildDate() + { + if (array_key_exists('lastBuildDate', $this->data)) { + return $this->data['lastBuildDate']; + } + + $lastBuildDate = null; + $date = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $lastBuildDate = $this->xpath->evaluate('string(/rss/channel/lastBuildDate)'); + if ($lastBuildDate) { + $lastBuildDateParsed = strtotime($lastBuildDate); + if ($lastBuildDateParsed) { + $date = new DateTime('@' . $lastBuildDateParsed); + } else { + $dateStandards = array(DateTime::RSS, DateTime::RFC822, + DateTime::RFC2822, null); + foreach ($dateStandards as $standard) { + try { + $date = DateTime::createFromFormat($standard, $lastBuildDateParsed); + break; + } catch (\Exception $e) { + if ($standard == null) { + throw new Exception\RuntimeException( + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' + . $e->getMessage(), + 0, $e + ); + } + } + } + } + } + } + + if (!$date) { + $date = null; + } + + $this->data['lastBuildDate'] = $date; + + return $this->data['lastBuildDate']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->data)) { + return $this->data['description']; + } + + $description = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $description = $this->xpath->evaluate('string(/rss/channel/description)'); + } else { + $description = $this->xpath->evaluate('string(/rdf:RDF/rss:channel/rss:description)'); + } + + if (!$description && $this->getExtension('DublinCore') !== null) { + $description = $this->getExtension('DublinCore')->getDescription(); + } + + if (empty($description)) { + $description = $this->getExtension('Atom')->getDescription(); + } + + if (!$description) { + $description = null; + } + + $this->data['description'] = $description; + + return $this->data['description']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->data)) { + return $this->data['id']; + } + + $id = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $id = $this->xpath->evaluate('string(/rss/channel/guid)'); + } + + if (!$id && $this->getExtension('DublinCore') !== null) { + $id = $this->getExtension('DublinCore')->getId(); + } + + if (empty($id)) { + $id = $this->getExtension('Atom')->getId(); + } + + if (!$id) { + if ($this->getLink()) { + $id = $this->getLink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->data['id'] = $id; + + return $this->data['id']; + } + + /** + * Get the feed image data + * + * @return array|null + */ + public function getImage() + { + if (array_key_exists('image', $this->data)) { + return $this->data['image']; + } + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $list = $this->xpath->query('/rss/channel/image'); + $prefix = '/rss/channel/image[1]'; + } else { + $list = $this->xpath->query('/rdf:RDF/rss:channel/rss:image'); + $prefix = '/rdf:RDF/rss:channel/rss:image[1]'; + } + if ($list->length > 0) { + $image = array(); + $value = $this->xpath->evaluate('string(' . $prefix . '/url)'); + if ($value) { + $image['uri'] = $value; + } + $value = $this->xpath->evaluate('string(' . $prefix . '/link)'); + if ($value) { + $image['link'] = $value; + } + $value = $this->xpath->evaluate('string(' . $prefix . '/title)'); + if ($value) { + $image['title'] = $value; + } + $value = $this->xpath->evaluate('string(' . $prefix . '/height)'); + if ($value) { + $image['height'] = $value; + } + $value = $this->xpath->evaluate('string(' . $prefix . '/width)'); + if ($value) { + $image['width'] = $value; + } + $value = $this->xpath->evaluate('string(' . $prefix . '/description)'); + if ($value) { + $image['description'] = $value; + } + } else { + $image = null; + } + + $this->data['image'] = $image; + + return $this->data['image']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->data)) { + return $this->data['language']; + } + + $language = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $language = $this->xpath->evaluate('string(/rss/channel/language)'); + } + + if (!$language && $this->getExtension('DublinCore') !== null) { + $language = $this->getExtension('DublinCore')->getLanguage(); + } + + if (empty($language)) { + $language = $this->getExtension('Atom')->getLanguage(); + } + + if (!$language) { + $language = $this->xpath->evaluate('string(//@xml:lang[1])'); + } + + if (!$language) { + $language = null; + } + + $this->data['language'] = $language; + + return $this->data['language']; + } + + /** + * Get a link to the feed + * + * @return string|null + */ + public function getLink() + { + if (array_key_exists('link', $this->data)) { + return $this->data['link']; + } + + $link = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $link = $this->xpath->evaluate('string(/rss/channel/link)'); + } else { + $link = $this->xpath->evaluate('string(/rdf:RDF/rss:channel/rss:link)'); + } + + if (empty($link)) { + $link = $this->getExtension('Atom')->getLink(); + } + + if (!$link) { + $link = null; + } + + $this->data['link'] = $link; + + return $this->data['link']; + } + + /** + * Get a link to the feed XML + * + * @return string|null + */ + public function getFeedLink() + { + if (array_key_exists('feedlink', $this->data)) { + return $this->data['feedlink']; + } + + $link = null; + + $link = $this->getExtension('Atom')->getFeedLink(); + + if ($link === null || empty($link)) { + $link = $this->getOriginalSourceUri(); + } + + $this->data['feedlink'] = $link; + + return $this->data['feedlink']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (array_key_exists('generator', $this->data)) { + return $this->data['generator']; + } + + $generator = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $generator = $this->xpath->evaluate('string(/rss/channel/generator)'); + } + + if (!$generator) { + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $generator = $this->xpath->evaluate('string(/rss/channel/atom:generator)'); + } else { + $generator = $this->xpath->evaluate('string(/rdf:RDF/rss:channel/atom:generator)'); + } + } + + if (empty($generator)) { + $generator = $this->getExtension('Atom')->getGenerator(); + } + + if (!$generator) { + $generator = null; + } + + $this->data['generator'] = $generator; + + return $this->data['generator']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->data)) { + return $this->data['title']; + } + + $title = null; + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $title = $this->xpath->evaluate('string(/rss/channel/title)'); + } else { + $title = $this->xpath->evaluate('string(/rdf:RDF/rss:channel/rss:title)'); + } + + if (!$title && $this->getExtension('DublinCore') !== null) { + $title = $this->getExtension('DublinCore')->getTitle(); + } + + if (!$title) { + $title = $this->getExtension('Atom')->getTitle(); + } + + if (!$title) { + $title = null; + } + + $this->data['title'] = $title; + + return $this->data['title']; + } + + /** + * Get an array of any supported Pusubhubbub endpoints + * + * @return array|null + */ + public function getHubs() + { + if (array_key_exists('hubs', $this->data)) { + return $this->data['hubs']; + } + + $hubs = $this->getExtension('Atom')->getHubs(); + + if (empty($hubs)) { + $hubs = null; + } else { + $hubs = array_unique($hubs); + } + + $this->data['hubs'] = $hubs; + + return $this->data['hubs']; + } + + /** + * Get all categories + * + * @return Reader\Collection\Category + */ + public function getCategories() + { + if (array_key_exists('categories', $this->data)) { + return $this->data['categories']; + } + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && + $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $list = $this->xpath->query('/rss/channel//category'); + } else { + $list = $this->xpath->query('/rdf:RDF/rss:channel//rss:category'); + } + + if ($list->length) { + $categoryCollection = new Collection\Category; + foreach ($list as $category) { + $categoryCollection[] = array( + 'term' => $category->nodeValue, + 'scheme' => $category->getAttribute('domain'), + 'label' => $category->nodeValue, + ); + } + } else { + $categoryCollection = $this->getExtension('DublinCore')->getCategories(); + } + + if (count($categoryCollection) == 0) { + $categoryCollection = $this->getExtension('Atom')->getCategories(); + } + + $this->data['categories'] = $categoryCollection; + + return $this->data['categories']; + } + + /** + * Read all entries to the internal entries array + * + */ + protected function indexEntries() + { + $entries = array(); + + if ($this->getType() !== Reader\Reader::TYPE_RSS_10 && $this->getType() !== Reader\Reader::TYPE_RSS_090) { + $entries = $this->xpath->evaluate('//item'); + } else { + $entries = $this->xpath->evaluate('//rss:item'); + } + + foreach ($entries as $index => $entry) { + $this->entries[$index] = $entry; + } + } + + /** + * Register the default namespaces for the current feed format + * + */ + protected function registerNamespaces() + { + switch ($this->data['type']) { + case Reader\Reader::TYPE_RSS_10: + $this->xpath->registerNamespace('rdf', Reader\Reader::NAMESPACE_RDF); + $this->xpath->registerNamespace('rss', Reader\Reader::NAMESPACE_RSS_10); + break; + + case Reader\Reader::TYPE_RSS_090: + $this->xpath->registerNamespace('rdf', Reader\Reader::NAMESPACE_RDF); + $this->xpath->registerNamespace('rss', Reader\Reader::NAMESPACE_RSS_090); + break; + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/FeedSet.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/FeedSet.php new file mode 100644 index 0000000000..a432ac3be5 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/FeedSet.php @@ -0,0 +1,127 @@ +getAttribute('rel')) !== 'alternate' + || !$link->getAttribute('type') || !$link->getAttribute('href')) { + continue; + } + if (!isset($this->rss) && $link->getAttribute('type') == 'application/rss+xml') { + $this->rss = $this->absolutiseUri(trim($link->getAttribute('href')), $uri); + } elseif (!isset($this->atom) && $link->getAttribute('type') == 'application/atom+xml') { + $this->atom = $this->absolutiseUri(trim($link->getAttribute('href')), $uri); + } elseif (!isset($this->rdf) && $link->getAttribute('type') == 'application/rdf+xml') { + $this->rdf = $this->absolutiseUri(trim($link->getAttribute('href')), $uri); + } + $this[] = new static(array( + 'rel' => 'alternate', + 'type' => $link->getAttribute('type'), + 'href' => $this->absolutiseUri(trim($link->getAttribute('href')), $uri), + )); + } + } + + /** + * Attempt to turn a relative URI into an absolute URI + */ + protected function absolutiseUri($link, $uri = null) + { + $linkUri = Uri::factory($link); + if (!$linkUri->isAbsolute() or !$linkUri->isValid()) { + if ($uri !== null) { + $uri = Uri::factory($uri); + + if ($link[0] !== '/') { + $link = $uri->getPath() . '/' . $link; + } + + $link = $uri->getScheme() . '://' . $uri->getHost() . '/' . $this->canonicalizePath($link); + if (!Uri::factory($link)->isValid()) { + $link = null; + } + } + } + return $link; + } + + /** + * Canonicalize relative path + */ + protected function canonicalizePath($path) + { + $parts = array_filter(explode('/', $path)); + $absolutes = array(); + foreach ($parts as $part) { + if ('.' == $part) { + continue; + } + if ('..' == $part) { + array_pop($absolutes); + } else { + $absolutes[] = $part; + } + } + return implode('/', $absolutes); + } + + /** + * Supports lazy loading of feeds using Reader::import() but + * delegates any other operations to the parent class. + * + * @param string $offset + * @return mixed + */ + public function offsetGet($offset) + { + if ($offset == 'feed' && !$this->offsetExists('feed')) { + if (!$this->offsetExists('href')) { + return null; + } + $feed = Reader::import($this->offsetGet('href')); + $this->offsetSet('feed', $feed); + return $feed; + } + return parent::offsetGet($offset); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Reader/Http/ClientInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Http/ClientInterface.php new file mode 100644 index 0000000000..43932f7612 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Reader/Http/ClientInterface.php @@ -0,0 +1,21 @@ + array( + 'DublinCore\Feed', + 'Atom\Feed' + ), + 'entry' => array( + 'Content\Entry', + 'DublinCore\Entry', + 'Atom\Entry' + ), + 'core' => array( + 'DublinCore\Feed', + 'Atom\Feed', + 'Content\Entry', + 'DublinCore\Entry', + 'Atom\Entry' + ) + ); + + /** + * Get the Feed cache + * + * @return CacheStorage + */ + public static function getCache() + { + return static::$cache; + } + + /** + * Set the feed cache + * + * @param CacheStorage $cache + * @return void + */ + public static function setCache(CacheStorage $cache) + { + static::$cache = $cache; + } + + /** + * Set the HTTP client instance + * + * Sets the HTTP client object to use for retrieving the feeds. + * + * @param ZendHttp\Client $httpClient + * @return void + */ + public static function setHttpClient(ZendHttp\Client $httpClient) + { + static::$httpClient = $httpClient; + } + + + /** + * Gets the HTTP client object. If none is set, a new ZendHttp\Client will be used. + * + * @return ZendHttp\Client + */ + public static function getHttpClient() + { + if (!static::$httpClient instanceof ZendHttp\Client) { + static::$httpClient = new ZendHttp\Client(); + } + + return static::$httpClient; + } + + /** + * Toggle using POST instead of PUT and DELETE HTTP methods + * + * Some feed implementations do not accept PUT and DELETE HTTP + * methods, or they can't be used because of proxies or other + * measures. This allows turning on using POST where PUT and + * DELETE would normally be used; in addition, an + * X-Method-Override header will be sent with a value of PUT or + * DELETE as appropriate. + * + * @param bool $override Whether to override PUT and DELETE. + * @return void + */ + public static function setHttpMethodOverride($override = true) + { + static::$httpMethodOverride = $override; + } + + /** + * Get the HTTP override state + * + * @return bool + */ + public static function getHttpMethodOverride() + { + return static::$httpMethodOverride; + } + + /** + * Set the flag indicating whether or not to use HTTP conditional GET + * + * @param bool $bool + * @return void + */ + public static function useHttpConditionalGet($bool = true) + { + static::$httpConditionalGet = $bool; + } + + /** + * Import a feed by providing a URI + * + * @param string $uri The URI to the feed + * @param string $etag OPTIONAL Last received ETag for this resource + * @param string $lastModified OPTIONAL Last-Modified value for this resource + * @return Feed\FeedInterface + * @throws Exception\RuntimeException + */ + public static function import($uri, $etag = null, $lastModified = null) + { + $cache = self::getCache(); + $feed = null; + $responseXml = ''; + $client = self::getHttpClient(); + $client->resetParameters(); + $headers = new ZendHttp\Headers(); + $client->setHeaders($headers); + $client->setUri($uri); + $cacheId = 'Zend_Feed_Reader_' . md5($uri); + + if (static::$httpConditionalGet && $cache) { + $data = $cache->getItem($cacheId); + if ($data) { + if ($etag === null) { + $etag = $cache->getItem($cacheId . '_etag'); + } + if ($lastModified === null) { + $lastModified = $cache->getItem($cacheId . '_lastmodified'); + } + if ($etag) { + $headers->addHeaderLine('If-None-Match', $etag); + } + if ($lastModified) { + $headers->addHeaderLine('If-Modified-Since', $lastModified); + } + } + $response = $client->send(); + if ($response->getStatusCode() !== 200 && $response->getStatusCode() !== 304) { + throw new Exception\RuntimeException('Feed failed to load, got response code ' . $response->getStatusCode()); + } + if ($response->getStatusCode() == 304) { + $responseXml = $data; + } else { + $responseXml = $response->getBody(); + $cache->setItem($cacheId, $responseXml); + if ($response->getHeaders()->get('ETag')) { + $cache->setItem($cacheId . '_etag', $response->getHeaders()->get('ETag')->getFieldValue()); + } + if ($response->getHeaders()->get('Last-Modified')) { + $cache->setItem($cacheId . '_lastmodified', $response->getHeaders()->get('Last-Modified')->getFieldValue()); + } + } + return static::importString($responseXml); + } elseif ($cache) { + $data = $cache->getItem($cacheId); + if ($data) { + return static::importString($data); + } + $response = $client->send(); + if ((int) $response->getStatusCode() !== 200) { + throw new Exception\RuntimeException('Feed failed to load, got response code ' . $response->getStatusCode()); + } + $responseXml = $response->getBody(); + $cache->setItem($cacheId, $responseXml); + return static::importString($responseXml); + } else { + $response = $client->send(); + if ((int) $response->getStatusCode() !== 200) { + throw new Exception\RuntimeException('Feed failed to load, got response code ' . $response->getStatusCode()); + } + $reader = static::importString($response->getBody()); + $reader->setOriginalSourceUri($uri); + return $reader; + } + } + + /** + * Import a feed from a remote URI + * + * Performs similarly to import(), except it uses the HTTP client passed to + * the method, and does not take into account cached data. + * + * Primary purpose is to make it possible to use the Reader with alternate + * HTTP client implementations. + * + * @param string $uri + * @param Http\Client $client + * @return self + * @throws Exception\RuntimeException if response is not an Http\ResponseInterface + */ + public static function importRemoteFeed($uri, Http\ClientInterface $client) + { + $response = $client->get($uri); + if (!$response instanceof Http\ResponseInterface) { + throw new Exception\RuntimeException(sprintf( + 'Did not receive a %s\Http\ResponseInterface from the provided HTTP client; received "%s"', + __NAMESPACE__, + (is_object($response) ? get_class($response) : gettype($response)) + )); + } + + if ((int) $response->getStatusCode() !== 200) { + throw new Exception\RuntimeException('Feed failed to load, got response code ' . $response->getStatusCode()); + } + $reader = static::importString($response->getBody()); + $reader->setOriginalSourceUri($uri); + return $reader; + } + + /** + * Import a feed from a string + * + * @param string $string + * @return Feed\FeedInterface + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + public static function importString($string) + { + $trimmed = trim($string); + if (!is_string($string) || empty($trimmed)) { + throw new Exception\InvalidArgumentException('Only non empty strings are allowed as input'); + } + + $libxmlErrflag = libxml_use_internal_errors(true); + $oldValue = libxml_disable_entity_loader(true); + $dom = new DOMDocument; + $status = $dom->loadXML(trim($string)); + foreach ($dom->childNodes as $child) { + if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { + throw new Exception\InvalidArgumentException( + 'Invalid XML: Detected use of illegal DOCTYPE' + ); + } + } + libxml_disable_entity_loader($oldValue); + libxml_use_internal_errors($libxmlErrflag); + + if (!$status) { + // Build error message + $error = libxml_get_last_error(); + if ($error && $error->message) { + $error->message = trim($error->message); + $errormsg = "DOMDocument cannot parse XML: {$error->message}"; + } else { + $errormsg = "DOMDocument cannot parse XML: Please check the XML document's validity"; + } + throw new Exception\RuntimeException($errormsg); + } + + $type = static::detectType($dom); + + static::registerCoreExtensions(); + + if (substr($type, 0, 3) == 'rss') { + $reader = new Feed\Rss($dom, $type); + } elseif (substr($type, 8, 5) == 'entry') { + $reader = new Entry\Atom($dom->documentElement, 0, self::TYPE_ATOM_10); + } elseif (substr($type, 0, 4) == 'atom') { + $reader = new Feed\Atom($dom, $type); + } else { + throw new Exception\RuntimeException('The URI used does not point to a ' + . 'valid Atom, RSS or RDF feed that Zend\Feed\Reader can parse.'); + } + return $reader; + } + + /** + * Imports a feed from a file located at $filename. + * + * @param string $filename + * @throws Exception\RuntimeException + * @return Feed\FeedInterface + */ + public static function importFile($filename) + { + ErrorHandler::start(); + $feed = file_get_contents($filename); + $err = ErrorHandler::stop(); + if ($feed === false) { + throw new Exception\RuntimeException("File '{$filename}' could not be loaded", 0, $err); + } + return static::importString($feed); + } + + /** + * Find feed links + * + * @param $uri + * @return FeedSet + * @throws Exception\RuntimeException + */ + public static function findFeedLinks($uri) + { + $client = static::getHttpClient(); + $client->setUri($uri); + $response = $client->send(); + if ($response->getStatusCode() !== 200) { + throw new Exception\RuntimeException("Failed to access $uri, got response code " . $response->getStatusCode()); + } + $responseHtml = $response->getBody(); + $libxmlErrflag = libxml_use_internal_errors(true); + $oldValue = libxml_disable_entity_loader(true); + $dom = new DOMDocument; + $status = $dom->loadHTML(trim($responseHtml)); + libxml_disable_entity_loader($oldValue); + libxml_use_internal_errors($libxmlErrflag); + if (!$status) { + // Build error message + $error = libxml_get_last_error(); + if ($error && $error->message) { + $error->message = trim($error->message); + $errormsg = "DOMDocument cannot parse HTML: {$error->message}"; + } else { + $errormsg = "DOMDocument cannot parse HTML: Please check the XML document's validity"; + } + throw new Exception\RuntimeException($errormsg); + } + $feedSet = new FeedSet; + $links = $dom->getElementsByTagName('link'); + $feedSet->addLinks($links, $uri); + return $feedSet; + } + + /** + * Detect the feed type of the provided feed + * + * @param Feed\AbstractFeed|DOMDocument|string $feed + * @param bool $specOnly + * @return string + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + public static function detectType($feed, $specOnly = false) + { + if ($feed instanceof Feed\AbstractFeed) { + $dom = $feed->getDomDocument(); + } elseif ($feed instanceof DOMDocument) { + $dom = $feed; + } elseif (is_string($feed) && !empty($feed)) { + ErrorHandler::start(E_NOTICE|E_WARNING); + ini_set('track_errors', 1); + $oldValue = libxml_disable_entity_loader(true); + $dom = new DOMDocument; + $status = $dom->loadXML($feed); + foreach ($dom->childNodes as $child) { + if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { + throw new Exception\InvalidArgumentException( + 'Invalid XML: Detected use of illegal DOCTYPE' + ); + } + } + libxml_disable_entity_loader($oldValue); + ini_restore('track_errors'); + ErrorHandler::stop(); + if (!$status) { + if (!isset($phpErrormsg)) { + if (function_exists('xdebug_is_enabled')) { + $phpErrormsg = '(error message not available, when XDebug is running)'; + } else { + $phpErrormsg = '(error message not available)'; + } + } + throw new Exception\RuntimeException("DOMDocument cannot parse XML: $phpErrormsg"); + } + } else { + throw new Exception\InvalidArgumentException('Invalid object/scalar provided: must' + . ' be of type Zend\Feed\Reader\Feed, DomDocument or string'); + } + $xpath = new DOMXPath($dom); + + if ($xpath->query('/rss')->length) { + $type = self::TYPE_RSS_ANY; + $version = $xpath->evaluate('string(/rss/@version)'); + + if (strlen($version) > 0) { + switch ($version) { + case '2.0': + $type = self::TYPE_RSS_20; + break; + + case '0.94': + $type = self::TYPE_RSS_094; + break; + + case '0.93': + $type = self::TYPE_RSS_093; + break; + + case '0.92': + $type = self::TYPE_RSS_092; + break; + + case '0.91': + $type = self::TYPE_RSS_091; + break; + } + } + + return $type; + } + + $xpath->registerNamespace('rdf', self::NAMESPACE_RDF); + + if ($xpath->query('/rdf:RDF')->length) { + $xpath->registerNamespace('rss', self::NAMESPACE_RSS_10); + + if ($xpath->query('/rdf:RDF/rss:channel')->length + || $xpath->query('/rdf:RDF/rss:image')->length + || $xpath->query('/rdf:RDF/rss:item')->length + || $xpath->query('/rdf:RDF/rss:textinput')->length + ) { + return self::TYPE_RSS_10; + } + + $xpath->registerNamespace('rss', self::NAMESPACE_RSS_090); + + if ($xpath->query('/rdf:RDF/rss:channel')->length + || $xpath->query('/rdf:RDF/rss:image')->length + || $xpath->query('/rdf:RDF/rss:item')->length + || $xpath->query('/rdf:RDF/rss:textinput')->length + ) { + return self::TYPE_RSS_090; + } + } + + $xpath->registerNamespace('atom', self::NAMESPACE_ATOM_10); + + if ($xpath->query('//atom:feed')->length) { + return self::TYPE_ATOM_10; + } + + if ($xpath->query('//atom:entry')->length) { + if ($specOnly == true) { + return self::TYPE_ATOM_10; + } else { + return self::TYPE_ATOM_10_ENTRY; + } + } + + $xpath->registerNamespace('atom', self::NAMESPACE_ATOM_03); + + if ($xpath->query('//atom:feed')->length) { + return self::TYPE_ATOM_03; + } + + return self::TYPE_ANY; + } + + /** + * Set plugin manager for use with Extensions + * + * @param ExtensionManagerInterface $extensionManager + */ + public static function setExtensionManager(ExtensionManagerInterface $extensionManager) + { + static::$extensionManager = $extensionManager; + } + + /** + * Get plugin manager for use with Extensions + * + * @return ExtensionManagerInterface + */ + public static function getExtensionManager() + { + if (!isset(static::$extensionManager)) { + static::setExtensionManager(new ExtensionManager()); + } + return static::$extensionManager; + } + + /** + * Register an Extension by name + * + * @param string $name + * @return void + * @throws Exception\RuntimeException if unable to resolve Extension class + */ + public static function registerExtension($name) + { + $feedName = $name . '\Feed'; + $entryName = $name . '\Entry'; + $manager = static::getExtensionManager(); + if (static::isRegistered($name)) { + if ($manager->has($feedName) || $manager->has($entryName)) { + return; + } + } + + if (!$manager->has($feedName) && !$manager->has($entryName)) { + throw new Exception\RuntimeException('Could not load extension: ' . $name + . ' using Plugin Loader. Check prefix paths are configured and extension exists.'); + } + if ($manager->has($feedName)) { + static::$extensions['feed'][] = $feedName; + } + if ($manager->has($entryName)) { + static::$extensions['entry'][] = $entryName; + } + } + + /** + * Is a given named Extension registered? + * + * @param string $extensionName + * @return bool + */ + public static function isRegistered($extensionName) + { + $feedName = $extensionName . '\Feed'; + $entryName = $extensionName . '\Entry'; + if (in_array($feedName, static::$extensions['feed']) + || in_array($entryName, static::$extensions['entry']) + ) { + return true; + } + return false; + } + + /** + * Get a list of extensions + * + * @return array + */ + public static function getExtensions() + { + return static::$extensions; + } + + /** + * Reset class state to defaults + * + * @return void + */ + public static function reset() + { + static::$cache = null; + static::$httpClient = null; + static::$httpMethodOverride = false; + static::$httpConditionalGet = false; + static::$extensionManager = null; + static::$extensions = array( + 'feed' => array( + 'DublinCore\Feed', + 'Atom\Feed' + ), + 'entry' => array( + 'Content\Entry', + 'DublinCore\Entry', + 'Atom\Entry' + ), + 'core' => array( + 'DublinCore\Feed', + 'Atom\Feed', + 'Content\Entry', + 'DublinCore\Entry', + 'Atom\Entry' + ) + ); + } + + /** + * Register core (default) extensions + * + * @return void + */ + protected static function registerCoreExtensions() + { + static::registerExtension('DublinCore'); + static::registerExtension('Content'); + static::registerExtension('Atom'); + static::registerExtension('Slash'); + static::registerExtension('WellFormedWeb'); + static::registerExtension('Thread'); + static::registerExtension('Podcast'); + } + + /** + * Utility method to apply array_unique operation to a multidimensional + * array. + * + * @param array + * @return array + */ + public static function arrayUnique(array $array) + { + foreach ($array as &$value) { + $value = serialize($value); + } + $array = array_unique($array); + foreach ($array as &$value) { + $value = unserialize($value); + } + return $array; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Uri.php b/vendor/zendframework/zend-feed/Zend/Feed/Uri.php new file mode 100644 index 0000000000..940bce11ab --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Uri.php @@ -0,0 +1,184 @@ +valid = false; + return; + } + + $this->scheme = isset($parsed['scheme']) ? $parsed['scheme'] : null; + $this->host = isset($parsed['host']) ? $parsed['host'] : null; + $this->port = isset($parsed['port']) ? $parsed['port'] : null; + $this->user = isset($parsed['user']) ? $parsed['user'] : null; + $this->pass = isset($parsed['pass']) ? $parsed['pass'] : null; + $this->path = isset($parsed['path']) ? $parsed['path'] : null; + $this->query = isset($parsed['query']) ? $parsed['query'] : null; + $this->fragment = isset($parsed['fragment']) ? $parsed['fragment'] : null; + } + + /** + * Create an instance + * + * Useful for chained validations + * + * @param string $uri + * @return self + */ + public static function factory($uri) + { + return new static($uri); + } + + /** + * Retrieve the host + * + * @return string + */ + public function getHost() + { + return $this->host; + } + + /** + * Retrieve the URI path + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Retrieve the scheme + * + * @return string + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * Is the URI valid? + * + * @return bool + */ + public function isValid() + { + if (false === $this->valid) { + return false; + } + + if ($this->scheme && !in_array($this->scheme, $this->validSchemes)) { + return false; + } + + if ($this->host) { + if ($this->path && substr($this->path, 0, 1) != '/') { + return false; + } + return true; + } + + // no host, but user and/or port... what? + if ($this->user || $this->port) { + return false; + } + + if ($this->path) { + // Check path-only (no host) URI + if (substr($this->path, 0, 2) == '//') { + return false; + } + return true; + } + + if (! ($this->query || $this->fragment)) { + // No host, path, query or fragment - this is not a valid URI + return false; + } + + return true; + } + + /** + * Is the URI absolute? + * + * @return bool + */ + public function isAbsolute() + { + return ($this->scheme !== null); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/AbstractFeed.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/AbstractFeed.php new file mode 100644 index 0000000000..b96a5302dc --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/AbstractFeed.php @@ -0,0 +1,848 @@ +_loadExtensions(); + } + + /** + * Set a single author + * + * The following option keys are supported: + * 'name' => (string) The name + * 'email' => (string) An optional email + * 'uri' => (string) An optional and valid URI + * + * @param array $author + * @throws Exception\InvalidArgumentException If any value of $author not follow the format. + * @return AbstractFeed + */ + public function addAuthor(array $author) + { + // Check array values + if (!array_key_exists('name', $author) + || empty($author['name']) + || !is_string($author['name']) + ) { + throw new Exception\InvalidArgumentException( + 'Invalid parameter: author array must include a "name" key with a non-empty string value'); + } + + if (isset($author['email'])) { + if (empty($author['email']) || !is_string($author['email'])) { + throw new Exception\InvalidArgumentException( + 'Invalid parameter: "email" array value must be a non-empty string'); + } + } + if (isset($author['uri'])) { + if (empty($author['uri']) || !is_string($author['uri']) || + !Uri::factory($author['uri'])->isValid() + ) { + throw new Exception\InvalidArgumentException( + 'Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI'); + } + } + + $this->data['authors'][] = $author; + + return $this; + } + + /** + * Set an array with feed authors + * + * @see addAuthor + * @param array $authors + * @return AbstractFeed + */ + public function addAuthors(array $authors) + { + foreach ($authors as $author) { + $this->addAuthor($author); + } + + return $this; + } + + /** + * Set the copyright entry + * + * @param string $copyright + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setCopyright($copyright) + { + if (empty($copyright) || !is_string($copyright)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['copyright'] = $copyright; + + return $this; + } + + /** + * Set the feed creation date + * + * @param null|int|DateTime + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setDateCreated($date = null) + { + if ($date === null) { + $date = new DateTime(); + } elseif (is_int($date)) { + $date = new DateTime('@' . $date); + } elseif (!$date instanceof DateTime) { + throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' + . ' passed as parameter'); + } + $this->data['dateCreated'] = $date; + + return $this; + } + + /** + * Set the feed modification date + * + * @param null|int|DateTime + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setDateModified($date = null) + { + if ($date === null) { + $date = new DateTime(); + } elseif (is_int($date)) { + $date = new DateTime('@' . $date); + } elseif (!$date instanceof DateTime) { + throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' + . ' passed as parameter'); + } + $this->data['dateModified'] = $date; + + return $this; + } + + /** + * Set the feed last-build date. Ignored for Atom 1.0. + * + * @param null|int|DateTime + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setLastBuildDate($date = null) + { + if ($date === null) { + $date = new DateTime(); + } elseif (is_int($date)) { + $date = new DateTime('@' . $date); + } elseif (!$date instanceof DateTime) { + throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' + . ' passed as parameter'); + } + $this->data['lastBuildDate'] = $date; + + return $this; + } + + /** + * Set the feed description + * + * @param string $description + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setDescription($description) + { + if (empty($description) || !is_string($description)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['description'] = $description; + + return $this; + } + + /** + * Set the feed generator entry + * + * @param array|string $name + * @param null|string $version + * @param null|string $uri + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setGenerator($name, $version = null, $uri = null) + { + if (is_array($name)) { + $data = $name; + if (empty($data['name']) || !is_string($data['name'])) { + throw new Exception\InvalidArgumentException('Invalid parameter: "name" must be a non-empty string'); + } + $generator = array('name' => $data['name']); + if (isset($data['version'])) { + if (empty($data['version']) || !is_string($data['version'])) { + throw new Exception\InvalidArgumentException('Invalid parameter: "version" must be a non-empty string'); + } + $generator['version'] = $data['version']; + } + if (isset($data['uri'])) { + if (empty($data['uri']) || !is_string($data['uri']) || !Uri::factory($data['uri'])->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "uri" must be a non-empty string and a valid URI/IRI'); + } + $generator['uri'] = $data['uri']; + } + } else { + if (empty($name) || !is_string($name)) { + throw new Exception\InvalidArgumentException('Invalid parameter: "name" must be a non-empty string'); + } + $generator = array('name' => $name); + if (isset($version)) { + if (empty($version) || !is_string($version)) { + throw new Exception\InvalidArgumentException('Invalid parameter: "version" must be a non-empty string'); + } + $generator['version'] = $version; + } + if (isset($uri)) { + if (empty($uri) || !is_string($uri) || !Uri::factory($uri)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "uri" must be a non-empty string and a valid URI/IRI'); + } + $generator['uri'] = $uri; + } + } + $this->data['generator'] = $generator; + + return $this; + } + + /** + * Set the feed ID - URI or URN (via PCRE pattern) supported + * + * @param string $id + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setId($id) + { + if ((empty($id) || !is_string($id) || !Uri::factory($id)->isValid()) + && !preg_match("#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#", $id) + && !$this->_validateTagUri($id) + ) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string and valid URI/IRI'); + } + $this->data['id'] = $id; + + return $this; + } + + /** + * Validate a URI using the tag scheme (RFC 4151) + * + * @param string $id + * @return bool + */ + protected function _validateTagUri($id) + { + if (preg_match('/^tag:(?P.*),(?P\d{4}-?\d{0,2}-?\d{0,2}):(?P.*)(.*:)*$/', $id, $matches)) { + $dvalid = false; + $nvalid = false; + $date = $matches['date']; + $d6 = strtotime($date); + if ((strlen($date) == 4) && $date <= date('Y')) { + $dvalid = true; + } elseif ((strlen($date) == 7) && ($d6 < strtotime("now"))) { + $dvalid = true; + } elseif ((strlen($date) == 10) && ($d6 < strtotime("now"))) { + $dvalid = true; + } + $validator = new Validator\EmailAddress; + if ($validator->isValid($matches['name'])) { + $nvalid = true; + } else { + $nvalid = $validator->isValid('info@' . $matches['name']); + } + return $dvalid && $nvalid; + + } + return false; + } + + /** + * Set a feed image (URI at minimum). Parameter is a single array with the + * required key 'uri'. When rendering as RSS, the required keys are 'uri', + * 'title' and 'link'. RSS also specifies three optional parameters 'width', + * 'height' and 'description'. Only 'uri' is required and used for Atom rendering. + * + * @param array $data + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setImage(array $data) + { + if (empty($data['uri']) || !is_string($data['uri']) + || !Uri::factory($data['uri'])->isValid() + ) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter \'uri\'' + . ' must be a non-empty string and valid URI/IRI'); + } + $this->data['image'] = $data; + + return $this; + } + + /** + * Set the feed language + * + * @param string $language + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setLanguage($language) + { + if (empty($language) || !is_string($language)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['language'] = $language; + + return $this; + } + + /** + * Set a link to the HTML source + * + * @param string $link + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setLink($link) + { + if (empty($link) || !is_string($link) || !Uri::factory($link)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string and valid URI/IRI'); + } + $this->data['link'] = $link; + + return $this; + } + + /** + * Set a link to an XML feed for any feed type/version + * + * @param string $link + * @param string $type + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setFeedLink($link, $type) + { + if (empty($link) || !is_string($link) || !Uri::factory($link)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "link"" must be a non-empty string and valid URI/IRI'); + } + if (!in_array(strtolower($type), array('rss', 'rdf', 'atom'))) { + throw new Exception\InvalidArgumentException('Invalid parameter: "type"; You must declare the type of feed the link points to, i.e. RSS, RDF or Atom'); + } + $this->data['feedLinks'][strtolower($type)] = $link; + + return $this; + } + + /** + * Set the feed title + * + * @param string $title + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setTitle($title) + { + if (empty($title) || !is_string($title)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['title'] = $title; + + return $this; + } + + /** + * Set the feed character encoding + * + * @param string $encoding + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setEncoding($encoding) + { + if (empty($encoding) || !is_string($encoding)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['encoding'] = $encoding; + + return $this; + } + + /** + * Set the feed's base URL + * + * @param string $url + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function setBaseUrl($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "url" array value' + . ' must be a non-empty string and valid URI/IRI'); + } + $this->data['baseUrl'] = $url; + + return $this; + } + + /** + * Add a Pubsubhubbub hub endpoint URL + * + * @param string $url + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function addHub($url) + { + if (empty($url) || !is_string($url) || !Uri::factory($url)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "url" array value' + . ' must be a non-empty string and valid URI/IRI'); + } + if (!isset($this->data['hubs'])) { + $this->data['hubs'] = array(); + } + $this->data['hubs'][] = $url; + + return $this; + } + + /** + * Add Pubsubhubbub hub endpoint URLs + * + * @param array $urls + * @return AbstractFeed + */ + public function addHubs(array $urls) + { + foreach ($urls as $url) { + $this->addHub($url); + } + + return $this; + } + + /** + * Add a feed category + * + * @param array $category + * @throws Exception\InvalidArgumentException + * @return AbstractFeed + */ + public function addCategory(array $category) + { + if (!isset($category['term'])) { + throw new Exception\InvalidArgumentException('Each category must be an array and ' + . 'contain at least a "term" element containing the machine ' + . ' readable category name'); + } + if (isset($category['scheme'])) { + if (empty($category['scheme']) + || !is_string($category['scheme']) + || !Uri::factory($category['scheme'])->isValid() + ) { + throw new Exception\InvalidArgumentException('The Atom scheme or RSS domain of' + . ' a category must be a valid URI'); + } + } + if (!isset($this->data['categories'])) { + $this->data['categories'] = array(); + } + $this->data['categories'][] = $category; + + return $this; + } + + /** + * Set an array of feed categories + * + * @param array $categories + * @return AbstractFeed + */ + public function addCategories(array $categories) + { + foreach ($categories as $category) { + $this->addCategory($category); + } + + return $this; + } + + /** + * Get a single author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + if (isset($this->data['authors'][$index])) { + return $this->data['authors'][$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (!array_key_exists('authors', $this->data)) { + return null; + } + return $this->data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (!array_key_exists('copyright', $this->data)) { + return null; + } + return $this->data['copyright']; + } + + /** + * Get the feed creation date + * + * @return string|null + */ + public function getDateCreated() + { + if (!array_key_exists('dateCreated', $this->data)) { + return null; + } + return $this->data['dateCreated']; + } + + /** + * Get the feed modification date + * + * @return string|null + */ + public function getDateModified() + { + if (!array_key_exists('dateModified', $this->data)) { + return null; + } + return $this->data['dateModified']; + } + + /** + * Get the feed last-build date + * + * @return string|null + */ + public function getLastBuildDate() + { + if (!array_key_exists('lastBuildDate', $this->data)) { + return null; + } + return $this->data['lastBuildDate']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (!array_key_exists('description', $this->data)) { + return null; + } + return $this->data['description']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (!array_key_exists('generator', $this->data)) { + return null; + } + return $this->data['generator']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (!array_key_exists('id', $this->data)) { + return null; + } + return $this->data['id']; + } + + /** + * Get the feed image URI + * + * @return array + */ + public function getImage() + { + if (!array_key_exists('image', $this->data)) { + return null; + } + return $this->data['image']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (!array_key_exists('language', $this->data)) { + return null; + } + return $this->data['language']; + } + + /** + * Get a link to the HTML source + * + * @return string|null + */ + public function getLink() + { + if (!array_key_exists('link', $this->data)) { + return null; + } + return $this->data['link']; + } + + /** + * Get a link to the XML feed + * + * @return string|null + */ + public function getFeedLinks() + { + if (!array_key_exists('feedLinks', $this->data)) { + return null; + } + return $this->data['feedLinks']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (!array_key_exists('title', $this->data)) { + return null; + } + return $this->data['title']; + } + + /** + * Get the feed character encoding + * + * @return string|null + */ + public function getEncoding() + { + if (!array_key_exists('encoding', $this->data)) { + return 'UTF-8'; + } + return $this->data['encoding']; + } + + /** + * Get the feed's base url + * + * @return string|null + */ + public function getBaseUrl() + { + if (!array_key_exists('baseUrl', $this->data)) { + return null; + } + return $this->data['baseUrl']; + } + + /** + * Get the URLs used as Pubsubhubbub hubs endpoints + * + * @return string|null + */ + public function getHubs() + { + if (!array_key_exists('hubs', $this->data)) { + return null; + } + return $this->data['hubs']; + } + + /** + * Get the feed categories + * + * @return string|null + */ + public function getCategories() + { + if (!array_key_exists('categories', $this->data)) { + return null; + } + return $this->data['categories']; + } + + /** + * Resets the instance and deletes all data + * + * @return void + */ + public function reset() + { + $this->data = array(); + } + + /** + * Set the current feed type being exported to "rss" or "atom". This allows + * other objects to gracefully choose whether to execute or not, depending + * on their appropriateness for the current type, e.g. renderers. + * + * @param string $type + * @return AbstractFeed + */ + public function setType($type) + { + $this->type = $type; + return $this; + } + + /** + * Retrieve the current or last feed type exported. + * + * @return string Value will be "rss" or "atom" + */ + public function getType() + { + return $this->type; + } + + /** + * Unset a specific data point + * + * @param string $name + * @return AbstractFeed + */ + public function remove($name) + { + if (isset($this->data[$name])) { + unset($this->data[$name]); + } + return $this; + } + + /** + * Method overloading: call given method on first extension implementing it + * + * @param string $method + * @param array $args + * @return mixed + * @throws Exception\BadMethodCallException if no extensions implements the method + */ + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + try { + return call_user_func_array(array($extension, $method), $args); + } catch (Exception\BadMethodCallException $e) { + } + } + throw new Exception\BadMethodCallException( + 'Method: ' . $method . ' does not exist and could not be located on a registered Extension' + ); + } + + /** + * Load extensions from Zend\Feed\Writer\Writer + * + * @throws Exception\RuntimeException + * @return void + */ + protected function _loadExtensions() + { + $all = Writer::getExtensions(); + $manager = Writer::getExtensionManager(); + $exts = $all['feed']; + foreach ($exts as $ext) { + if (!$manager->has($ext)) { + throw new Exception\RuntimeException(sprintf('Unable to load extension "%s"; could not resolve to class', $ext)); + } + $this->extensions[$ext] = $manager->get($ext); + $this->extensions[$ext]->setEncoding($this->getEncoding()); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Deleted.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Deleted.php new file mode 100644 index 0000000000..b4a6567a0d --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Deleted.php @@ -0,0 +1,237 @@ +data['encoding'] = $encoding; + + return $this; + } + + /** + * Get the feed character encoding + * + * @return string|null + */ + public function getEncoding() + { + if (!array_key_exists('encoding', $this->data)) { + return 'UTF-8'; + } + return $this->data['encoding']; + } + + /** + * Unset a specific data point + * + * @param string $name + * @return Deleted + */ + public function remove($name) + { + if (isset($this->data[$name])) { + unset($this->data[$name]); + } + + return $this; + } + + /** + * Set the current feed type being exported to "rss" or "atom". This allows + * other objects to gracefully choose whether to execute or not, depending + * on their appropriateness for the current type, e.g. renderers. + * + * @param string $type + * @return Deleted + */ + public function setType($type) + { + $this->type = $type; + return $this; + } + + /** + * Retrieve the current or last feed type exported. + * + * @return string Value will be "rss" or "atom" + */ + public function getType() + { + return $this->type; + } + + /** + * Set reference + * + * @param $reference + * @throws Exception\InvalidArgumentException + * @return Deleted + */ + public function setReference($reference) + { + if (empty($reference) || !is_string($reference)) { + throw new Exception\InvalidArgumentException('Invalid parameter: reference must be a non-empty string'); + } + $this->data['reference'] = $reference; + + return $this; + } + + /** + * @return string + */ + public function getReference() + { + if (!array_key_exists('reference', $this->data)) { + return null; + } + return $this->data['reference']; + } + + /** + * Set when + * + * @param null|string|DateTime $date + * @throws Exception\InvalidArgumentException + * @return Deleted + */ + public function setWhen($date = null) + { + if ($date === null) { + $date = new DateTime(); + } elseif (is_int($date)) { + $date = new DateTime('@' . $date); + } elseif (!$date instanceof DateTime) { + throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' + . ' passed as parameter'); + } + $this->data['when'] = $date; + + return $this; + } + + /** + * @return DateTime + */ + public function getWhen() + { + if (!array_key_exists('when', $this->data)) { + return null; + } + return $this->data['when']; + } + + /** + * Set by + * + * @param array $by + * @throws Exception\InvalidArgumentException + * @return Deleted + */ + public function setBy(array $by) + { + $author = array(); + if (!array_key_exists('name', $by) + || empty($by['name']) + || !is_string($by['name']) + ) { + throw new Exception\InvalidArgumentException('Invalid parameter: author array must include a' + . ' "name" key with a non-empty string value'); + } + $author['name'] = $by['name']; + if (isset($by['email'])) { + if (empty($by['email']) || !is_string($by['email'])) { + throw new Exception\InvalidArgumentException('Invalid parameter: "email" array' + . ' value must be a non-empty string'); + } + $author['email'] = $by['email']; + } + if (isset($by['uri'])) { + if (empty($by['uri']) + || !is_string($by['uri']) + || !Uri::factory($by['uri'])->isValid() + ) { + throw new Exception\InvalidArgumentException('Invalid parameter: "uri" array value must' + . ' be a non-empty string and valid URI/IRI'); + } + $author['uri'] = $by['uri']; + } + $this->data['by'] = $author; + + return $this; + } + + /** + * @return string + */ + public function getBy() + { + if (!array_key_exists('by', $this->data)) { + return null; + } + return $this->data['by']; + } + + /** + * @param string $comment + * @return Deleted + */ + public function setComment($comment) + { + $this->data['comment'] = $comment; + return $this; + } + + /** + * @return string + */ + public function getComment() + { + if (!array_key_exists('comment', $this->data)) { + return null; + } + return $this->data['comment']; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Entry.php new file mode 100644 index 0000000000..af8cf7a102 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Entry.php @@ -0,0 +1,766 @@ +_loadExtensions(); + } + + /** + * Set a single author + * + * The following option keys are supported: + * 'name' => (string) The name + * 'email' => (string) An optional email + * 'uri' => (string) An optional and valid URI + * + * @param array $author + * @throws Exception\InvalidArgumentException If any value of $author not follow the format. + * @return Entry + */ + public function addAuthor(array $author) + { + // Check array values + if (!array_key_exists('name', $author) + || empty($author['name']) + || !is_string($author['name']) + ) { + throw new Exception\InvalidArgumentException( + 'Invalid parameter: author array must include a "name" key with a non-empty string value'); + } + + if (isset($author['email'])) { + if (empty($author['email']) || !is_string($author['email'])) { + throw new Exception\InvalidArgumentException( + 'Invalid parameter: "email" array value must be a non-empty string'); + } + } + if (isset($author['uri'])) { + if (empty($author['uri']) || !is_string($author['uri']) || + !Uri::factory($author['uri'])->isValid() + ) { + throw new Exception\InvalidArgumentException( + 'Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI'); + } + } + + $this->data['authors'][] = $author; + + return $this; + } + + /** + * Set an array with feed authors + * + * @see addAuthor + * @param array $authors + * @return Entry + */ + public function addAuthors(array $authors) + { + foreach ($authors as $author) { + $this->addAuthor($author); + } + + return $this; + } + + /** + * Set the feed character encoding + * + * @param string $encoding + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setEncoding($encoding) + { + if (empty($encoding) || !is_string($encoding)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['encoding'] = $encoding; + + return $this; + } + + /** + * Get the feed character encoding + * + * @return string|null + */ + public function getEncoding() + { + if (!array_key_exists('encoding', $this->data)) { + return 'UTF-8'; + } + return $this->data['encoding']; + } + + /** + * Set the copyright entry + * + * @param string $copyright + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setCopyright($copyright) + { + if (empty($copyright) || !is_string($copyright)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['copyright'] = $copyright; + + return $this; + } + + /** + * Set the entry's content + * + * @param string $content + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setContent($content) + { + if (empty($content) || !is_string($content)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['content'] = $content; + + return $this; + } + + /** + * Set the feed creation date + * + * @param null|int|DateTime $date + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setDateCreated($date = null) + { + if ($date === null) { + $date = new DateTime(); + } elseif (is_int($date)) { + $date = new DateTime('@' . $date); + } elseif (!$date instanceof DateTime) { + throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp passed as parameter'); + } + $this->data['dateCreated'] = $date; + + return $this; + } + + /** + * Set the feed modification date + * + * @param null|int|DateTime $date + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setDateModified($date = null) + { + if ($date === null) { + $date = new DateTime(); + } elseif (is_int($date)) { + $date = new DateTime('@' . $date); + } elseif (!$date instanceof DateTime) { + throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp passed as parameter'); + } + $this->data['dateModified'] = $date; + + return $this; + } + + /** + * Set the feed description + * + * @param string $description + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setDescription($description) + { + if (empty($description) || !is_string($description)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['description'] = $description; + + return $this; + } + + /** + * Set the feed ID + * + * @param string $id + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setId($id) + { + if (empty($id) || !is_string($id)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['id'] = $id; + + return $this; + } + + /** + * Set a link to the HTML source of this entry + * + * @param string $link + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setLink($link) + { + if (empty($link) || !is_string($link) || !Uri::factory($link)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string and valid URI/IRI'); + } + $this->data['link'] = $link; + + return $this; + } + + /** + * Set the number of comments associated with this entry + * + * @param int $count + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setCommentCount($count) + { + if (!is_numeric($count) || (int) $count != $count || (int) $count < 0) { + throw new Exception\InvalidArgumentException('Invalid parameter: "count" must be a positive integer number or zero'); + } + $this->data['commentCount'] = (int) $count; + + return $this; + } + + /** + * Set a link to a HTML page containing comments associated with this entry + * + * @param string $link + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setCommentLink($link) + { + if (empty($link) || !is_string($link) || !Uri::factory($link)->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "link" must be a non-empty string and valid URI/IRI'); + } + $this->data['commentLink'] = $link; + + return $this; + } + + /** + * Set a link to an XML feed for any comments associated with this entry + * + * @param array $link + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setCommentFeedLink(array $link) + { + if (!isset($link['uri']) || !is_string($link['uri']) || !Uri::factory($link['uri'])->isValid()) { + throw new Exception\InvalidArgumentException('Invalid parameter: "link" must be a non-empty string and valid URI/IRI'); + } + if (!isset($link['type']) || !in_array($link['type'], array('atom', 'rss', 'rdf'))) { + throw new Exception\InvalidArgumentException('Invalid parameter: "type" must be one' + . ' of "atom", "rss" or "rdf"'); + } + if (!isset($this->data['commentFeedLinks'])) { + $this->data['commentFeedLinks'] = array(); + } + $this->data['commentFeedLinks'][] = $link; + + return $this; + } + + /** + * Set a links to an XML feed for any comments associated with this entry. + * Each link is an array with keys "uri" and "type", where type is one of: + * "atom", "rss" or "rdf". + * + * @param array $links + * @return Entry + */ + public function setCommentFeedLinks(array $links) + { + foreach ($links as $link) { + $this->setCommentFeedLink($link); + } + + return $this; + } + + /** + * Set the feed title + * + * @param string $title + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setTitle($title) + { + if (empty($title) || !is_string($title)) { + throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); + } + $this->data['title'] = $title; + + return $this; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (!array_key_exists('authors', $this->data)) { + return null; + } + return $this->data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (!array_key_exists('content', $this->data)) { + return null; + } + return $this->data['content']; + } + + /** + * Get the entry copyright information + * + * @return string + */ + public function getCopyright() + { + if (!array_key_exists('copyright', $this->data)) { + return null; + } + return $this->data['copyright']; + } + + /** + * Get the entry creation date + * + * @return string + */ + public function getDateCreated() + { + if (!array_key_exists('dateCreated', $this->data)) { + return null; + } + return $this->data['dateCreated']; + } + + /** + * Get the entry modification date + * + * @return string + */ + public function getDateModified() + { + if (!array_key_exists('dateModified', $this->data)) { + return null; + } + return $this->data['dateModified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (!array_key_exists('description', $this->data)) { + return null; + } + return $this->data['description']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (!array_key_exists('id', $this->data)) { + return null; + } + return $this->data['id']; + } + + /** + * Get a link to the HTML source + * + * @return string|null + */ + public function getLink() + { + if (!array_key_exists('link', $this->data)) { + return null; + } + return $this->data['link']; + } + + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (!array_key_exists('links', $this->data)) { + return null; + } + return $this->data['links']; + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (!array_key_exists('title', $this->data)) { + return null; + } + return $this->data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return int + */ + public function getCommentCount() + { + if (!array_key_exists('commentCount', $this->data)) { + return null; + } + return $this->data['commentCount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (!array_key_exists('commentLink', $this->data)) { + return null; + } + return $this->data['commentLink']; + } + + /** + * Returns an array of URIs pointing to a feed of all comments for this entry + * where the array keys indicate the feed type (atom, rss or rdf). + * + * @return string + */ + public function getCommentFeedLinks() + { + if (!array_key_exists('commentFeedLinks', $this->data)) { + return null; + } + return $this->data['commentFeedLinks']; + } + + /** + * Add an entry category + * + * @param array $category + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function addCategory(array $category) + { + if (!isset($category['term'])) { + throw new Exception\InvalidArgumentException('Each category must be an array and ' + . 'contain at least a "term" element containing the machine ' + . ' readable category name'); + } + if (isset($category['scheme'])) { + if (empty($category['scheme']) + || !is_string($category['scheme']) + || !Uri::factory($category['scheme'])->isValid() + ) { + throw new Exception\InvalidArgumentException('The Atom scheme or RSS domain of' + . ' a category must be a valid URI'); + } + } + if (!isset($this->data['categories'])) { + $this->data['categories'] = array(); + } + $this->data['categories'][] = $category; + + return $this; + } + + /** + * Set an array of entry categories + * + * @param array $categories + * @return Entry + */ + public function addCategories(array $categories) + { + foreach ($categories as $category) { + $this->addCategory($category); + } + + return $this; + } + + /** + * Get the entry categories + * + * @return string|null + */ + public function getCategories() + { + if (!array_key_exists('categories', $this->data)) { + return null; + } + return $this->data['categories']; + } + + /** + * Adds an enclosure to the entry. The array parameter may contain the + * keys 'uri', 'type' and 'length'. Only 'uri' is required for Atom, though the + * others must also be provided or RSS rendering (where they are required) + * will throw an Exception. + * + * @param array $enclosure + * @throws Exception\InvalidArgumentException + * @return Entry + */ + public function setEnclosure(array $enclosure) + { + if (!isset($enclosure['uri'])) { + throw new Exception\InvalidArgumentException('Enclosure "uri" is not set'); + } + if (!Uri::factory($enclosure['uri'])->isValid()) { + throw new Exception\InvalidArgumentException('Enclosure "uri" is not a valid URI/IRI'); + } + $this->data['enclosure'] = $enclosure; + + return $this; + } + + /** + * Retrieve an array of all enclosures to be added to entry. + * + * @return array + */ + public function getEnclosure() + { + if (!array_key_exists('enclosure', $this->data)) { + return null; + } + return $this->data['enclosure']; + } + + /** + * Unset a specific data point + * + * @param string $name + * @return Entry + */ + public function remove($name) + { + if (isset($this->data[$name])) { + unset($this->data[$name]); + } + + return $this; + } + + /** + * Get registered extensions + * + * @return array + */ + public function getExtensions() + { + return $this->extensions; + } + + /** + * Return an Extension object with the matching name (postfixed with _Entry) + * + * @param string $name + * @return object + */ + public function getExtension($name) + { + if (array_key_exists($name . '\\Entry', $this->extensions)) { + return $this->extensions[$name . '\\Entry']; + } + return null; + } + + /** + * Set the current feed type being exported to "rss" or "atom". This allows + * other objects to gracefully choose whether to execute or not, depending + * on their appropriateness for the current type, e.g. renderers. + * + * @param string $type + * @return Entry + */ + public function setType($type) + { + $this->type = $type; + return $this; + } + + /** + * Retrieve the current or last feed type exported. + * + * @return string Value will be "rss" or "atom" + */ + public function getType() + { + return $this->type; + } + + /** + * Method overloading: call given method on first extension implementing it + * + * @param string $method + * @param array $args + * @return mixed + * @throws Exception\BadMethodCallException if no extensions implements the method + */ + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + try { + return call_user_func_array(array($extension, $method), $args); + } catch (\BadMethodCallException $e) { + } + } + throw new Exception\BadMethodCallException('Method: ' . $method + . ' does not exist and could not be located on a registered Extension'); + } + + /** + * Creates a new Zend\Feed\Writer\Source data container for use. This is NOT + * added to the current feed automatically, but is necessary to create a + * container with some initial values preset based on the current feed data. + * + * @return Source + */ + public function createSource() + { + $source = new Source; + if ($this->getEncoding()) { + $source->setEncoding($this->getEncoding()); + } + $source->setType($this->getType()); + return $source; + } + + /** + * Appends a Zend\Feed\Writer\Entry object representing a new entry/item + * the feed data container's internal group of entries. + * + * @param Source $source + * @return Entry + */ + public function setSource(Source $source) + { + $this->data['source'] = $source; + return $this; + } + + /** + * @return Source + */ + public function getSource() + { + if (isset($this->data['source'])) { + return $this->data['source']; + } + return null; + } + + /** + * Load extensions from Zend\Feed\Writer\Writer + * + * @return void + */ + protected function _loadExtensions() + { + $all = Writer::getExtensions(); + $manager = Writer::getExtensionManager(); + $exts = $all['entry']; + foreach ($exts as $ext) { + $this->extensions[$ext] = $manager->get($ext); + $this->extensions[$ext]->setEncoding($this->getEncoding()); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Exception/BadMethodCallException.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Exception/BadMethodCallException.php new file mode 100644 index 0000000000..e03851184b --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Exception/BadMethodCallException.php @@ -0,0 +1,22 @@ +container = $container; + return $this; + } + + /** + * Set feed encoding + * + * @param string $enc + * @return AbstractRenderer + */ + public function setEncoding($enc) + { + $this->encoding = $enc; + return $this; + } + + /** + * Get feed encoding + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Set DOMDocument and DOMElement on which to operate + * + * @param DOMDocument $dom + * @param DOMElement $base + * @return AbstractRenderer + */ + public function setDomDocument(DOMDocument $dom, DOMElement $base) + { + $this->dom = $dom; + $this->base = $base; + return $this; + } + + /** + * Get data container being rendered + * + * @return mixed + */ + public function getDataContainer() + { + return $this->container; + } + + /** + * Set feed type + * + * @param string $type + * @return AbstractRenderer + */ + public function setType($type) + { + $this->type = $type; + return $this; + } + + /** + * Get feedtype + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Set root element of document + * + * @param DOMElement $root + * @return AbstractRenderer + */ + public function setRootElement(DOMElement $root) + { + $this->rootElement = $root; + return $this; + } + + /** + * Get root element + * + * @return DOMElement + */ + public function getRootElement() + { + return $this->rootElement; + } + + /** + * Append namespaces to feed + * + * @return void + */ + abstract protected function _appendNamespaces(); +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Atom/Renderer/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Atom/Renderer/Feed.php new file mode 100644 index 0000000000..f790259588 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Atom/Renderer/Feed.php @@ -0,0 +1,109 @@ +getType()) == 'atom') { + return; + } + $this->_setFeedLinks($this->dom, $this->base); + $this->_setHubs($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append namespaces to root element of feed + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:atom', + 'http://www.w3.org/2005/Atom'); + } + + /** + * Set feed link elements + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setFeedLinks(DOMDocument $dom, DOMElement $root) + { + $flinks = $this->getDataContainer()->getFeedLinks(); + if (!$flinks || empty($flinks)) { + return; + } + foreach ($flinks as $type => $href) { + if (strtolower($type) == $this->getType()) { // issue 2605 + $mime = 'application/' . strtolower($type) . '+xml'; + $flink = $dom->createElement('atom:link'); + $root->appendChild($flink); + $flink->setAttribute('rel', 'self'); + $flink->setAttribute('type', $mime); + $flink->setAttribute('href', $href); + } + } + $this->called = true; + } + + /** + * Set PuSH hubs + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setHubs(DOMDocument $dom, DOMElement $root) + { + $hubs = $this->getDataContainer()->getHubs(); + if (!$hubs || empty($hubs)) { + return; + } + foreach ($hubs as $hubUrl) { + $hub = $dom->createElement('atom:link'); + $hub->setAttribute('rel', 'hub'); + $hub->setAttribute('href', $hubUrl); + $root->appendChild($hub); + } + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php new file mode 100644 index 0000000000..6d64bc2fc3 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php @@ -0,0 +1,76 @@ +getType()) == 'atom') { + return; + } + $this->_setContent($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append namespaces to root element + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:content', + 'http://purl.org/rss/1.0/modules/content/'); + } + + /** + * Set entry content + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setContent(DOMDocument $dom, DOMElement $root) + { + $content = $this->getDataContainer()->getContent(); + if (!$content) { + return; + } + $element = $dom->createElement('content:encoded'); + $root->appendChild($element); + $cdata = $dom->createCDATASection($content); + $element->appendChild($cdata); + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php new file mode 100644 index 0000000000..d7ca4fda74 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php @@ -0,0 +1,80 @@ +getType()) == 'atom') { + return; + } + $this->_setAuthors($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append namespaces to entry + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:dc', + 'http://purl.org/dc/elements/1.1/'); + } + + /** + * Set entry author elements + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->getDataContainer()->getAuthors(); + if (!$authors || empty($authors)) { + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('dc:creator'); + if (array_key_exists('name', $data)) { + $text = $dom->createTextNode($data['name']); + $author->appendChild($text); + $root->appendChild($author); + } + } + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php new file mode 100644 index 0000000000..e888fbd073 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php @@ -0,0 +1,80 @@ +getType()) == 'atom') { + return; + } + $this->_setAuthors($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append namespaces to feed element + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:dc', + 'http://purl.org/dc/elements/1.1/'); + } + + /** + * Set feed authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->getDataContainer()->getAuthors(); + if (!$authors || empty($authors)) { + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('dc:creator'); + if (array_key_exists('name', $data)) { + $text = $dom->createTextNode($data['name']); + $author->appendChild($text); + $root->appendChild($author); + } + } + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Entry.php new file mode 100644 index 0000000000..1b7b64aa5b --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Entry.php @@ -0,0 +1,246 @@ +stringWrapper = StringUtils::getWrapper($this->encoding); + } + + /** + * Set feed encoding + * + * @param string $enc + * @return Entry + */ + public function setEncoding($enc) + { + $this->stringWrapper = StringUtils::getWrapper($enc); + $this->encoding = $enc; + return $this; + } + + /** + * Get feed encoding + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Set a block value of "yes" or "no". You may also set an empty string. + * + * @param string + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesBlock($value) + { + if (!ctype_alpha($value) && strlen($value) > 0) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "block" may only' + . ' contain alphabetic characters'); + } + + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "block" may only' + . ' contain a maximum of 255 characters'); + } + $this->data['block'] = $value; + } + + /** + * Add authors to itunes entry + * + * @param array $values + * @return Entry + */ + public function addItunesAuthors(array $values) + { + foreach ($values as $value) { + $this->addItunesAuthor($value); + } + return $this; + } + + /** + * Add author to itunes entry + * + * @param string $value + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function addItunesAuthor($value) + { + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "author" may only' + . ' contain a maximum of 255 characters each'); + } + if (!isset($this->data['authors'])) { + $this->data['authors'] = array(); + } + $this->data['authors'][] = $value; + return $this; + } + + /** + * Set duration + * + * @param int $value + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesDuration($value) + { + $value = (string) $value; + if (!ctype_digit($value) + && !preg_match("/^\d+:[0-5]{1}[0-9]{1}$/", $value) + && !preg_match("/^\d+:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/", $value) + ) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "duration" may only' + . ' be of a specified [[HH:]MM:]SS format'); + } + $this->data['duration'] = $value; + return $this; + } + + /** + * Set "explicit" flag + * + * @param bool $value + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesExplicit($value) + { + if (!in_array($value, array('yes', 'no', 'clean'))) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "explicit" may only' + . ' be one of "yes", "no" or "clean"'); + } + $this->data['explicit'] = $value; + return $this; + } + + /** + * Set keywords + * + * @param array $value + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesKeywords(array $value) + { + if (count($value) > 12) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "keywords" may only' + . ' contain a maximum of 12 terms'); + } + + $concat = implode(',', $value); + if ($this->stringWrapper->strlen($concat) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "keywords" may only' + . ' have a concatenated length of 255 chars where terms are delimited' + . ' by a comma'); + } + $this->data['keywords'] = $value; + return $this; + } + + /** + * Set subtitle + * + * @param string $value + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesSubtitle($value) + { + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "subtitle" may only' + . ' contain a maximum of 255 characters'); + } + $this->data['subtitle'] = $value; + return $this; + } + + /** + * Set summary + * + * @param string $value + * @return Entry + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesSummary($value) + { + if ($this->stringWrapper->strlen($value) > 4000) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "summary" may only' + . ' contain a maximum of 4000 characters'); + } + $this->data['summary'] = $value; + return $this; + } + + /** + * Overloading to itunes specific setters + * + * @param string $method + * @param array $params + * @throws Writer\Exception\BadMethodCallException + * @return mixed + */ + public function __call($method, array $params) + { + $point = lcfirst(substr($method, 9)); + if (!method_exists($this, 'setItunes' . ucfirst($point)) + && !method_exists($this, 'addItunes' . ucfirst($point)) + ) { + throw new Writer\Exception\BadMethodCallException( + 'invalid method: ' . $method + ); + } + if (!array_key_exists($point, $this->data) + || empty($this->data[$point]) + ) { + return null; + } + return $this->data[$point]; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Feed.php new file mode 100644 index 0000000000..22c54db6e6 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Feed.php @@ -0,0 +1,362 @@ +stringWrapper = StringUtils::getWrapper($this->encoding); + } + + /** + * Set feed encoding + * + * @param string $enc + * @return Feed + */ + public function setEncoding($enc) + { + $this->stringWrapper = StringUtils::getWrapper($enc); + $this->encoding = $enc; + return $this; + } + + /** + * Get feed encoding + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Set a block value of "yes" or "no". You may also set an empty string. + * + * @param string + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesBlock($value) + { + if (!ctype_alpha($value) && strlen($value) > 0) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "block" may only' + . ' contain alphabetic characters'); + } + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "block" may only' + . ' contain a maximum of 255 characters'); + } + $this->data['block'] = $value; + return $this; + } + + /** + * Add feed authors + * + * @param array $values + * @return Feed + */ + public function addItunesAuthors(array $values) + { + foreach ($values as $value) { + $this->addItunesAuthor($value); + } + return $this; + } + + /** + * Add feed author + * + * @param string $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function addItunesAuthor($value) + { + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "author" may only' + . ' contain a maximum of 255 characters each'); + } + if (!isset($this->data['authors'])) { + $this->data['authors'] = array(); + } + $this->data['authors'][] = $value; + return $this; + } + + /** + * Set feed categories + * + * @param array $values + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesCategories(array $values) + { + if (!isset($this->data['categories'])) { + $this->data['categories'] = array(); + } + foreach ($values as $key => $value) { + if (!is_array($value)) { + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "category" may only' + . ' contain a maximum of 255 characters each'); + } + $this->data['categories'][] = $value; + } else { + if ($this->stringWrapper->strlen($key) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "category" may only' + . ' contain a maximum of 255 characters each'); + } + $this->data['categories'][$key] = array(); + foreach ($value as $val) { + if ($this->stringWrapper->strlen($val) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "category" may only' + . ' contain a maximum of 255 characters each'); + } + $this->data['categories'][$key][] = $val; + } + } + } + return $this; + } + + /** + * Set feed image (icon) + * + * @param string $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesImage($value) + { + if (!Uri::factory($value)->isValid()) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "image" may only' + . ' be a valid URI/IRI'); + } + if (!in_array(substr($value, -3), array('jpg', 'png'))) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "image" may only' + . ' use file extension "jpg" or "png" which must be the last three' + . ' characters of the URI (i.e. no query string or fragment)'); + } + $this->data['image'] = $value; + return $this; + } + + /** + * Set feed cumulative duration + * + * @param string $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesDuration($value) + { + $value = (string) $value; + if (!ctype_digit($value) + && !preg_match("/^\d+:[0-5]{1}[0-9]{1}$/", $value) + && !preg_match("/^\d+:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/", $value) + ) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "duration" may only' + . ' be of a specified [[HH:]MM:]SS format'); + } + $this->data['duration'] = $value; + return $this; + } + + /** + * Set "explicit" flag + * + * @param bool $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesExplicit($value) + { + if (!in_array($value, array('yes', 'no', 'clean'))) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "explicit" may only' + . ' be one of "yes", "no" or "clean"'); + } + $this->data['explicit'] = $value; + return $this; + } + + /** + * Set feed keywords + * + * @param array $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesKeywords(array $value) + { + if (count($value) > 12) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "keywords" may only' + . ' contain a maximum of 12 terms'); + } + $concat = implode(',', $value); + if ($this->stringWrapper->strlen($concat) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "keywords" may only' + . ' have a concatenated length of 255 chars where terms are delimited' + . ' by a comma'); + } + $this->data['keywords'] = $value; + return $this; + } + + /** + * Set new feed URL + * + * @param string $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesNewFeedUrl($value) + { + if (!Uri::factory($value)->isValid()) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "newFeedUrl" may only' + . ' be a valid URI/IRI'); + } + $this->data['newFeedUrl'] = $value; + return $this; + } + + /** + * Add feed owners + * + * @param array $values + * @return Feed + */ + public function addItunesOwners(array $values) + { + foreach ($values as $value) { + $this->addItunesOwner($value); + } + return $this; + } + + /** + * Add feed owner + * + * @param array $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function addItunesOwner(array $value) + { + if (!isset($value['name']) || !isset($value['email'])) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "owner" must' + . ' be an array containing keys "name" and "email"'); + } + if ($this->stringWrapper->strlen($value['name']) > 255 + || $this->stringWrapper->strlen($value['email']) > 255 + ) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: any "owner" may only' + . ' contain a maximum of 255 characters each for "name" and "email"'); + } + if (!isset($this->data['owners'])) { + $this->data['owners'] = array(); + } + $this->data['owners'][] = $value; + return $this; + } + + /** + * Set feed subtitle + * + * @param string $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesSubtitle($value) + { + if ($this->stringWrapper->strlen($value) > 255) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "subtitle" may only' + . ' contain a maximum of 255 characters'); + } + $this->data['subtitle'] = $value; + return $this; + } + + /** + * Set feed summary + * + * @param string $value + * @return Feed + * @throws Writer\Exception\InvalidArgumentException + */ + public function setItunesSummary($value) + { + if ($this->stringWrapper->strlen($value) > 4000) { + throw new Writer\Exception\InvalidArgumentException('invalid parameter: "summary" may only' + . ' contain a maximum of 4000 characters'); + } + $this->data['summary'] = $value; + return $this; + } + + /** + * Overloading: proxy to internal setters + * + * @param string $method + * @param array $params + * @return mixed + * @throws Writer\Exception\BadMethodCallException + */ + public function __call($method, array $params) + { + $point = lcfirst(substr($method, 9)); + if (!method_exists($this, 'setItunes' . ucfirst($point)) + && !method_exists($this, 'addItunes' . ucfirst($point)) + ) { + throw new Writer\Exception\BadMethodCallException( + 'invalid method: ' . $method + ); + } + if (!array_key_exists($point, $this->data) || empty($this->data[$point])) { + return null; + } + return $this->data[$point]; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php new file mode 100644 index 0000000000..bc57d1daa2 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php @@ -0,0 +1,200 @@ +_setAuthors($this->dom, $this->base); + $this->_setBlock($this->dom, $this->base); + $this->_setDuration($this->dom, $this->base); + $this->_setExplicit($this->dom, $this->base); + $this->_setKeywords($this->dom, $this->base); + $this->_setSubtitle($this->dom, $this->base); + $this->_setSummary($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append namespaces to entry root + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:itunes', + 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + } + + /** + * Set entry authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->getDataContainer()->getItunesAuthors(); + if (!$authors || empty($authors)) { + return; + } + foreach ($authors as $author) { + $el = $dom->createElement('itunes:author'); + $text = $dom->createTextNode($author); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + } + + /** + * Set itunes block + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBlock(DOMDocument $dom, DOMElement $root) + { + $block = $this->getDataContainer()->getItunesBlock(); + if ($block === null) { + return; + } + $el = $dom->createElement('itunes:block'); + $text = $dom->createTextNode($block); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set entry duration + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDuration(DOMDocument $dom, DOMElement $root) + { + $duration = $this->getDataContainer()->getItunesDuration(); + if (!$duration) { + return; + } + $el = $dom->createElement('itunes:duration'); + $text = $dom->createTextNode($duration); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set explicit flag + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setExplicit(DOMDocument $dom, DOMElement $root) + { + $explicit = $this->getDataContainer()->getItunesExplicit(); + if ($explicit === null) { + return; + } + $el = $dom->createElement('itunes:explicit'); + $text = $dom->createTextNode($explicit); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set entry keywords + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setKeywords(DOMDocument $dom, DOMElement $root) + { + $keywords = $this->getDataContainer()->getItunesKeywords(); + if (!$keywords || empty($keywords)) { + return; + } + $el = $dom->createElement('itunes:keywords'); + $text = $dom->createTextNode(implode(',', $keywords)); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set entry subtitle + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setSubtitle(DOMDocument $dom, DOMElement $root) + { + $subtitle = $this->getDataContainer()->getItunesSubtitle(); + if (!$subtitle) { + return; + } + $el = $dom->createElement('itunes:subtitle'); + $text = $dom->createTextNode($subtitle); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set entry summary + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setSummary(DOMDocument $dom, DOMElement $root) + { + $summary = $this->getDataContainer()->getItunesSummary(); + if (!$summary) { + return; + } + $el = $dom->createElement('itunes:summary'); + $text = $dom->createTextNode($summary); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php new file mode 100644 index 0000000000..d5b565780d --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php @@ -0,0 +1,304 @@ +_setAuthors($this->dom, $this->base); + $this->_setBlock($this->dom, $this->base); + $this->_setCategories($this->dom, $this->base); + $this->_setImage($this->dom, $this->base); + $this->_setDuration($this->dom, $this->base); + $this->_setExplicit($this->dom, $this->base); + $this->_setKeywords($this->dom, $this->base); + $this->_setNewFeedUrl($this->dom, $this->base); + $this->_setOwners($this->dom, $this->base); + $this->_setSubtitle($this->dom, $this->base); + $this->_setSummary($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append feed namespaces + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:itunes', + 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + } + + /** + * Set feed authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->getDataContainer()->getItunesAuthors(); + if (!$authors || empty($authors)) { + return; + } + foreach ($authors as $author) { + $el = $dom->createElement('itunes:author'); + $text = $dom->createTextNode($author); + $el->appendChild($text); + $root->appendChild($el); + } + $this->called = true; + } + + /** + * Set feed itunes block + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBlock(DOMDocument $dom, DOMElement $root) + { + $block = $this->getDataContainer()->getItunesBlock(); + if ($block === null) { + return; + } + $el = $dom->createElement('itunes:block'); + $text = $dom->createTextNode($block); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set feed categories + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCategories(DOMDocument $dom, DOMElement $root) + { + $cats = $this->getDataContainer()->getItunesCategories(); + if (!$cats || empty($cats)) { + return; + } + foreach ($cats as $key => $cat) { + if (!is_array($cat)) { + $el = $dom->createElement('itunes:category'); + $el->setAttribute('text', $cat); + $root->appendChild($el); + } else { + $el = $dom->createElement('itunes:category'); + $el->setAttribute('text', $key); + $root->appendChild($el); + foreach ($cat as $subcat) { + $el2 = $dom->createElement('itunes:category'); + $el2->setAttribute('text', $subcat); + $el->appendChild($el2); + } + } + } + $this->called = true; + } + + /** + * Set feed image (icon) + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setImage(DOMDocument $dom, DOMElement $root) + { + $image = $this->getDataContainer()->getItunesImage(); + if (!$image) { + return; + } + $el = $dom->createElement('itunes:image'); + $el->setAttribute('href', $image); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set feed cumulative duration + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDuration(DOMDocument $dom, DOMElement $root) + { + $duration = $this->getDataContainer()->getItunesDuration(); + if (!$duration) { + return; + } + $el = $dom->createElement('itunes:duration'); + $text = $dom->createTextNode($duration); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set explicit flag + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setExplicit(DOMDocument $dom, DOMElement $root) + { + $explicit = $this->getDataContainer()->getItunesExplicit(); + if ($explicit === null) { + return; + } + $el = $dom->createElement('itunes:explicit'); + $text = $dom->createTextNode($explicit); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set feed keywords + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setKeywords(DOMDocument $dom, DOMElement $root) + { + $keywords = $this->getDataContainer()->getItunesKeywords(); + if (!$keywords || empty($keywords)) { + return; + } + $el = $dom->createElement('itunes:keywords'); + $text = $dom->createTextNode(implode(',', $keywords)); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set feed's new URL + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setNewFeedUrl(DOMDocument $dom, DOMElement $root) + { + $url = $this->getDataContainer()->getItunesNewFeedUrl(); + if (!$url) { + return; + } + $el = $dom->createElement('itunes:new-feed-url'); + $text = $dom->createTextNode($url); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set feed owners + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setOwners(DOMDocument $dom, DOMElement $root) + { + $owners = $this->getDataContainer()->getItunesOwners(); + if (!$owners || empty($owners)) { + return; + } + foreach ($owners as $owner) { + $el = $dom->createElement('itunes:owner'); + $name = $dom->createElement('itunes:name'); + $text = $dom->createTextNode($owner['name']); + $name->appendChild($text); + $email = $dom->createElement('itunes:email'); + $text = $dom->createTextNode($owner['email']); + $email->appendChild($text); + $root->appendChild($el); + $el->appendChild($name); + $el->appendChild($email); + } + $this->called = true; + } + + /** + * Set feed subtitle + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setSubtitle(DOMDocument $dom, DOMElement $root) + { + $subtitle = $this->getDataContainer()->getItunesSubtitle(); + if (!$subtitle) { + return; + } + $el = $dom->createElement('itunes:subtitle'); + $text = $dom->createTextNode($subtitle); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } + + /** + * Set feed summary + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setSummary(DOMDocument $dom, DOMElement $root) + { + $summary = $this->getDataContainer()->getItunesSummary(); + if (!$summary) { + return; + } + $el = $dom->createElement('itunes:summary'); + $text = $dom->createTextNode($summary); + $el->appendChild($text); + $root->appendChild($el); + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/RendererInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/RendererInterface.php new file mode 100644 index 0000000000..e72346c205 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/RendererInterface.php @@ -0,0 +1,49 @@ +getType()) == 'atom') { + return; // RSS 2.0 only + } + $this->_setCommentCount($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append entry namespaces + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:slash', + 'http://purl.org/rss/1.0/modules/slash/'); + } + + /** + * Set entry comment count + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCommentCount(DOMDocument $dom, DOMElement $root) + { + $count = $this->getDataContainer()->getCommentCount(); + if (!$count) { + $count = 0; + } + $tcount = $this->dom->createElement('slash:comments'); + $tcount->nodeValue = $count; + $root->appendChild($tcount); + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php new file mode 100644 index 0000000000..bbf4595ed8 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php @@ -0,0 +1,129 @@ +getType()) == 'rss') { + return; // Atom 1.0 only + } + $this->_setCommentLink($this->dom, $this->base); + $this->_setCommentFeedLinks($this->dom, $this->base); + $this->_setCommentCount($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append entry namespaces + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:thr', + 'http://purl.org/syndication/thread/1.0'); + } + + /** + * Set comment link + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCommentLink(DOMDocument $dom, DOMElement $root) + { + $link = $this->getDataContainer()->getCommentLink(); + if (!$link) { + return; + } + $clink = $this->dom->createElement('link'); + $clink->setAttribute('rel', 'replies'); + $clink->setAttribute('type', 'text/html'); + $clink->setAttribute('href', $link); + $count = $this->getDataContainer()->getCommentCount(); + if ($count !== null) { + $clink->setAttribute('thr:count', $count); + } + $root->appendChild($clink); + $this->called = true; + } + + /** + * Set comment feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCommentFeedLinks(DOMDocument $dom, DOMElement $root) + { + $links = $this->getDataContainer()->getCommentFeedLinks(); + if (!$links || empty($links)) { + return; + } + foreach ($links as $link) { + $flink = $this->dom->createElement('link'); + $flink->setAttribute('rel', 'replies'); + $flink->setAttribute('type', 'application/' . $link['type'] . '+xml'); + $flink->setAttribute('href', $link['uri']); + $count = $this->getDataContainer()->getCommentCount(); + if ($count !== null) { + $flink->setAttribute('thr:count', $count); + } + $root->appendChild($flink); + $this->called = true; + } + } + + /** + * Set entry comment count + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCommentCount(DOMDocument $dom, DOMElement $root) + { + $count = $this->getDataContainer()->getCommentCount(); + if ($count === null) { + return; + } + $tcount = $this->dom->createElement('thr:total'); + $tcount->nodeValue = $count; + $root->appendChild($tcount); + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php new file mode 100644 index 0000000000..be13b71d95 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php @@ -0,0 +1,80 @@ +getType()) == 'atom') { + return; // RSS 2.0 only + } + $this->_setCommentFeedLinks($this->dom, $this->base); + if ($this->called) { + $this->_appendNamespaces(); + } + } + + /** + * Append entry namespaces + * + * @return void + */ + protected function _appendNamespaces() + { + $this->getRootElement()->setAttribute('xmlns:wfw', + 'http://wellformedweb.org/CommentAPI/'); + } + + /** + * Set entry comment feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCommentFeedLinks(DOMDocument $dom, DOMElement $root) + { + $links = $this->getDataContainer()->getCommentFeedLinks(); + if (!$links || empty($links)) { + return; + } + foreach ($links as $link) { + if ($link['type'] == 'rss') { + $flink = $this->dom->createElement('wfw:commentRss'); + $text = $dom->createTextNode($link['uri']); + $flink->appendChild($text); + $root->appendChild($flink); + } + } + $this->called = true; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/ExtensionManager.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/ExtensionManager.php new file mode 100644 index 0000000000..5310050a0d --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/ExtensionManager.php @@ -0,0 +1,80 @@ +pluginManager = $pluginManager; + } + + /** + * Method overloading + * + * Proxy to composed ExtensionPluginManager instance. + * + * @param string $method + * @param array $args + * @return mixed + * @throws Exception\BadMethodCallException + */ + public function __call($method, $args) + { + if (!method_exists($this->pluginManager, $method)) { + throw new Exception\BadMethodCallException(sprintf( + 'Method by name of %s does not exist in %s', + $method, + __CLASS__ + )); + } + return call_user_func_array(array($this->pluginManager, $method), $args); + } + + /** + * Get the named extension + * + * @param string $name + * @return Extension\AbstractEntry|Extension\AbstractFeed + */ + public function get($name) + { + return $this->pluginManager->get($name); + } + + /** + * Do we have the named extension? + * + * @param string $name + * @return bool + */ + public function has($name) + { + return $this->pluginManager->has($name); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/ExtensionManagerInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/ExtensionManagerInterface.php new file mode 100644 index 0000000000..0f7e023fec --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/ExtensionManagerInterface.php @@ -0,0 +1,29 @@ + 'Zend\Feed\Writer\Extension\Atom\Renderer\Feed', + 'contentrendererentry' => 'Zend\Feed\Writer\Extension\Content\Renderer\Entry', + 'dublincorerendererentry' => 'Zend\Feed\Writer\Extension\DublinCore\Renderer\Entry', + 'dublincorerendererfeed' => 'Zend\Feed\Writer\Extension\DublinCore\Renderer\Feed', + 'itunesentry' => 'Zend\Feed\Writer\Extension\ITunes\Entry', + 'itunesfeed' => 'Zend\Feed\Writer\Extension\ITunes\Feed', + 'itunesrendererentry' => 'Zend\Feed\Writer\Extension\ITunes\Renderer\Entry', + 'itunesrendererfeed' => 'Zend\Feed\Writer\Extension\ITunes\Renderer\Feed', + 'slashrendererentry' => 'Zend\Feed\Writer\Extension\Slash\Renderer\Entry', + 'threadingrendererentry' => 'Zend\Feed\Writer\Extension\Threading\Renderer\Entry', + 'wellformedwebrendererentry' => 'Zend\Feed\Writer\Extension\WellFormedWeb\Renderer\Entry', + ); + + /** + * Do not share instances + * + * @var bool + */ + protected $shareByDefault = false; + + /** + * Validate the plugin + * + * Checks that the extension loaded is of a valid type. + * + * @param mixed $plugin + * @return void + * @throws Exception\InvalidArgumentException if invalid + */ + public function validatePlugin($plugin) + { + if ($plugin instanceof Extension\AbstractRenderer) { + // we're okay + return; + } + + if ('Feed' == substr(get_class($plugin), -4)) { + // we're okay + return; + } + + if ('Entry' == substr(get_class($plugin), -5)) { + // we're okay + return; + } + + throw new Exception\InvalidArgumentException(sprintf( + 'Plugin of type %s is invalid; must implement %s\Extension\RendererInterface ' + . 'or the classname must end in "Feed" or "Entry"', + (is_object($plugin) ? get_class($plugin) : gettype($plugin)), + __NAMESPACE__ + )); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Feed.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Feed.php new file mode 100644 index 0000000000..99f2698a2a --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Feed.php @@ -0,0 +1,240 @@ +getEncoding()) { + $entry->setEncoding($this->getEncoding()); + } + $entry->setType($this->getType()); + return $entry; + } + + /** + * Appends a Zend\Feed\Writer\Deleted object representing a new entry tombstone + * to the feed data container's internal group of entries. + * + * @param Deleted $deleted + * @return void + */ + public function addTombstone(Deleted $deleted) + { + $this->entries[] = $deleted; + } + + /** + * Creates a new Zend\Feed\Writer\Deleted data container for use. This is NOT + * added to the current feed automatically, but is necessary to create a + * container with some initial values preset based on the current feed data. + * + * @return Deleted + */ + public function createTombstone() + { + $deleted = new Deleted; + if ($this->getEncoding()) { + $deleted->setEncoding($this->getEncoding()); + } + $deleted->setType($this->getType()); + return $deleted; + } + + /** + * Appends a Zend\Feed\Writer\Entry object representing a new entry/item + * the feed data container's internal group of entries. + * + * @param Entry $entry + * @return Feed + */ + public function addEntry(Entry $entry) + { + $this->entries[] = $entry; + return $this; + } + + /** + * Removes a specific indexed entry from the internal queue. Entries must be + * added to a feed container in order to be indexed. + * + * @param int $index + * @throws Exception\InvalidArgumentException + * @return Feed + */ + public function removeEntry($index) + { + if (!isset($this->entries[$index])) { + throw new Exception\InvalidArgumentException('Undefined index: ' . $index . '. Entry does not exist.'); + } + unset($this->entries[$index]); + + return $this; + } + + /** + * Retrieve a specific indexed entry from the internal queue. Entries must be + * added to a feed container in order to be indexed. + * + * @param int $index + * @throws Exception\InvalidArgumentException + */ + public function getEntry($index = 0) + { + if (isset($this->entries[$index])) { + return $this->entries[$index]; + } + throw new Exception\InvalidArgumentException('Undefined index: ' . $index . '. Entry does not exist.'); + } + + /** + * Orders all indexed entries by date, thus offering date ordered readable + * content where a parser (or Homo Sapien) ignores the generic rule that + * XML element order is irrelevant and has no intrinsic meaning. + * + * Using this method will alter the original indexation. + * + * @return Feed + */ + public function orderByDate() + { + /** + * Could do with some improvement for performance perhaps + */ + $timestamp = time(); + $entries = array(); + foreach ($this->entries as $entry) { + if ($entry->getDateModified()) { + $timestamp = (int) $entry->getDateModified()->getTimestamp(); + } elseif ($entry->getDateCreated()) { + $timestamp = (int) $entry->getDateCreated()->getTimestamp(); + } + $entries[$timestamp] = $entry; + } + krsort($entries, SORT_NUMERIC); + $this->entries = array_values($entries); + + return $this; + } + + /** + * Get the number of feed entries. + * Required by the Iterator interface. + * + * @return int + */ + public function count() + { + return count($this->entries); + } + + /** + * Return the current entry + * + * @return Entry + */ + public function current() + { + return $this->entries[$this->key()]; + } + + /** + * Return the current feed key + * + * @return mixed + */ + public function key() + { + return $this->entriesKey; + } + + /** + * Move the feed pointer forward + * + * @return void + */ + public function next() + { + ++$this->entriesKey; + } + + /** + * Reset the pointer in the feed object + * + * @return void + */ + public function rewind() + { + $this->entriesKey = 0; + } + + /** + * Check to see if the iterator is still valid + * + * @return bool + */ + public function valid() + { + return 0 <= $this->entriesKey && $this->entriesKey < $this->count(); + } + + /** + * Attempt to build and return the feed resulting from the data set + * + * @param string $type The feed type "rss" or "atom" to export as + * @param bool $ignoreExceptions + * @throws Exception\InvalidArgumentException + * @return string + */ + public function export($type, $ignoreExceptions = false) + { + $this->setType(strtolower($type)); + $type = ucfirst($this->getType()); + if ($type !== 'Rss' && $type !== 'Atom') { + throw new Exception\InvalidArgumentException('Invalid feed type specified: ' . $type . '.' + . ' Should be one of "rss" or "atom".'); + } + $renderClass = 'Zend\\Feed\\Writer\\Renderer\\Feed\\' . $type; + $renderer = new $renderClass($this); + if ($ignoreExceptions) { + $renderer->ignoreExceptions(); + } + return $renderer->render()->saveXml(); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/FeedFactory.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/FeedFactory.php new file mode 100644 index 0000000000..15e7a3468c --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/FeedFactory.php @@ -0,0 +1,127 @@ + $value) { + // Setters + $key = static::convertKey($key); + $method = 'set' . $key; + if (method_exists($feed, $method)) { + switch ($method) { + case 'setfeedlink': + if (!is_array($value)) { + // Need an array + break; + } + if (!array_key_exists('link', $value) || !array_key_exists('type', $value)) { + // Need both keys to set this correctly + break; + } + $feed->setFeedLink($value['link'], $value['type']); + break; + default: + $feed->$method($value); + break; + } + continue; + } + + // Entries + if ('entries' == $key) { + static::createEntries($value, $feed); + continue; + } + } + + return $feed; + } + + /** + * Normalize a key + * + * @param string $key + * @return string + */ + protected static function convertKey($key) + { + $key = str_replace('_', '', strtolower($key)); + return $key; + } + + /** + * Create and attach entries to a feed + * + * @param array|Traversable $entries + * @param Feed $feed + * @throws Exception\InvalidArgumentException + * @return void + */ + protected static function createEntries($entries, Feed $feed) + { + if (!is_array($entries) && !$entries instanceof Traversable) { + throw new Exception\InvalidArgumentException(sprintf( + '%s::factory expects the "entries" value to be an array or Traversable; received "%s"', + get_called_class(), + (is_object($entries) ? get_class($entries) : gettype($entries)) + )); + } + + foreach ($entries as $data) { + if (!is_array($data) && !$data instanceof Traversable && !$data instanceof Entry) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects an array, Traversable, or Zend\Feed\Writer\Entry argument; received "%s"', + __METHOD__, + (is_object($data) ? get_class($data) : gettype($data)) + )); + } + + // Use case 1: Entry item + if ($data instanceof Entry) { + $feed->addEntry($data); + continue; + } + + // Use case 2: iterate item and populate entry + $entry = $feed->createEntry(); + foreach ($data as $key => $value) { + $key = static::convertKey($key); + $method = 'set' . $key; + if (!method_exists($entry, $method)) { + continue; + } + $entry->$method($value); + } + $feed->addEntry($entry); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/AbstractRenderer.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/AbstractRenderer.php new file mode 100644 index 0000000000..e104501983 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/AbstractRenderer.php @@ -0,0 +1,233 @@ +container = $container; + $this->setType($container->getType()); + $this->_loadExtensions(); + } + + /** + * Save XML to string + * + * @return string + */ + public function saveXml() + { + return $this->getDomDocument()->saveXml(); + } + + /** + * Get DOM document + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->dom; + } + + /** + * Get document element from DOM + * + * @return DOMElement + */ + public function getElement() + { + return $this->getDomDocument()->documentElement; + } + + /** + * Get data container of items being rendered + * + * @return Writer\AbstractFeed + */ + public function getDataContainer() + { + return $this->container; + } + + /** + * Set feed encoding + * + * @param string $enc + * @return AbstractRenderer + */ + public function setEncoding($enc) + { + $this->encoding = $enc; + return $this; + } + + /** + * Get feed encoding + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Indicate whether or not to ignore exceptions + * + * @param bool $bool + * @return AbstractRenderer + * @throws Writer\Exception\InvalidArgumentException + */ + public function ignoreExceptions($bool = true) + { + if (!is_bool($bool)) { + throw new Writer\Exception\InvalidArgumentException('Invalid parameter: $bool. Should be TRUE or FALSE (defaults to TRUE if null)'); + } + $this->ignoreExceptions = $bool; + return $this; + } + + /** + * Get exception list + * + * @return array + */ + public function getExceptions() + { + return $this->exceptions; + } + + /** + * Set the current feed type being exported to "rss" or "atom". This allows + * other objects to gracefully choose whether to execute or not, depending + * on their appropriateness for the current type, e.g. renderers. + * + * @param string $type + */ + public function setType($type) + { + $this->type = $type; + } + + /** + * Retrieve the current or last feed type exported. + * + * @return string Value will be "rss" or "atom" + */ + public function getType() + { + return $this->type; + } + + /** + * Sets the absolute root element for the XML feed being generated. This + * helps simplify the appending of namespace declarations, but also ensures + * namespaces are added to the root element - not scattered across the entire + * XML file - may assist namespace unsafe parsers and looks pretty ;). + * + * @param DOMElement $root + */ + public function setRootElement(DOMElement $root) + { + $this->rootElement = $root; + } + + /** + * Retrieve the absolute root element for the XML feed being generated. + * + * @return DOMElement + */ + public function getRootElement() + { + return $this->rootElement; + } + + /** + * Load extensions from Zend\Feed\Writer\Writer + * + * @return void + */ + protected function _loadExtensions() + { + Writer\Writer::registerCoreExtensions(); + $manager = Writer\Writer::getExtensionManager(); + $all = Writer\Writer::getExtensions(); + if (stripos(get_class($this), 'entry')) { + $exts = $all['entryRenderer']; + } else { + $exts = $all['feedRenderer']; + } + foreach ($exts as $extension) { + $plugin = $manager->get($extension); + $plugin->setDataContainer($this->getDataContainer()); + $plugin->setEncoding($this->getEncoding()); + $this->extensions[$extension] = $plugin; + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Atom.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Atom.php new file mode 100644 index 0000000000..28b325d40c --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Atom.php @@ -0,0 +1,427 @@ +dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $entry = $this->dom->createElementNS(Writer\Writer::NAMESPACE_ATOM_10, 'entry'); + $this->dom->appendChild($entry); + + $this->_setSource($this->dom, $entry); + $this->_setTitle($this->dom, $entry); + $this->_setDescription($this->dom, $entry); + $this->_setDateCreated($this->dom, $entry); + $this->_setDateModified($this->dom, $entry); + $this->_setLink($this->dom, $entry); + $this->_setId($this->dom, $entry); + $this->_setAuthors($this->dom, $entry); + $this->_setEnclosure($this->dom, $entry); + $this->_setContent($this->dom, $entry); + $this->_setCategories($this->dom, $entry); + + foreach ($this->extensions as $ext) { + $ext->setType($this->getType()); + $ext->setRootElement($this->getRootElement()); + $ext->setDOMDocument($this->getDOMDocument(), $entry); + $ext->render(); + } + + return $this; + } + + /** + * Set entry title + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setTitle(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getTitle()) { + $message = 'Atom 1.0 entry elements MUST contain exactly one' + . ' atom:title element but a title has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $title = $dom->createElement('title'); + $root->appendChild($title); + $title->setAttribute('type', 'html'); + $cdata = $dom->createCDATASection($this->getDataContainer()->getTitle()); + $title->appendChild($cdata); + } + + /** + * Set entry description + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDescription(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDescription()) { + return; // unless src content or base64 + } + $subtitle = $dom->createElement('summary'); + $root->appendChild($subtitle); + $subtitle->setAttribute('type', 'html'); + $cdata = $dom->createCDATASection( + $this->getDataContainer()->getDescription() + ); + $subtitle->appendChild($cdata); + } + + /** + * Set date entry was modified + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setDateModified(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateModified()) { + $message = 'Atom 1.0 entry elements MUST contain exactly one' + . ' atom:updated element but a modification date has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $updated = $dom->createElement('updated'); + $root->appendChild($updated); + $text = $dom->createTextNode( + $this->getDataContainer()->getDateModified()->format(DateTime::ISO8601) + ); + $updated->appendChild($text); + } + + /** + * Set date entry was created + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateCreated(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateCreated()) { + return; + } + $el = $dom->createElement('published'); + $root->appendChild($el); + $text = $dom->createTextNode( + $this->getDataContainer()->getDateCreated()->format(DateTime::ISO8601) + ); + $el->appendChild($text); + } + + /** + * Set entry authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->container->getAuthors(); + if ((!$authors || empty($authors))) { + /** + * This will actually trigger an Exception at the feed level if + * a feed level author is not set. + */ + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('author'); + $name = $this->dom->createElement('name'); + $author->appendChild($name); + $root->appendChild($author); + $text = $dom->createTextNode($data['name']); + $name->appendChild($text); + if (array_key_exists('email', $data)) { + $email = $this->dom->createElement('email'); + $author->appendChild($email); + $text = $dom->createTextNode($data['email']); + $email->appendChild($text); + } + if (array_key_exists('uri', $data)) { + $uri = $this->dom->createElement('uri'); + $author->appendChild($uri); + $text = $dom->createTextNode($data['uri']); + $uri->appendChild($text); + } + } + } + + /** + * Set entry enclosure + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setEnclosure(DOMDocument $dom, DOMElement $root) + { + $data = $this->container->getEnclosure(); + if ((!$data || empty($data))) { + return; + } + $enclosure = $this->dom->createElement('link'); + $enclosure->setAttribute('rel', 'enclosure'); + if (isset($data['type'])) { + $enclosure->setAttribute('type', $data['type']); + } + if (isset($data['length'])) { + $enclosure->setAttribute('length', $data['length']); + } + $enclosure->setAttribute('href', $data['uri']); + $root->appendChild($enclosure); + } + + protected function _setLink(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getLink()) { + return; + } + $link = $dom->createElement('link'); + $root->appendChild($link); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('type', 'text/html'); + $link->setAttribute('href', $this->getDataContainer()->getLink()); + } + + /** + * Set entry identifier + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setId(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getId() + && !$this->getDataContainer()->getLink()) { + $message = 'Atom 1.0 entry elements MUST contain exactly one ' + . 'atom:id element, or as an alternative, we can use the same ' + . 'value as atom:link however neither a suitable link nor an ' + . 'id have been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + if (!$this->getDataContainer()->getId()) { + $this->getDataContainer()->setId( + $this->getDataContainer()->getLink()); + } + if (!Uri::factory($this->getDataContainer()->getId())->isValid() + && !preg_match( + "#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#", + $this->getDataContainer()->getId()) + && !$this->_validateTagUri($this->getDataContainer()->getId()) + ) { + throw new Writer\Exception\InvalidArgumentException('Atom 1.0 IDs must be a valid URI/IRI'); + } + $id = $dom->createElement('id'); + $root->appendChild($id); + $text = $dom->createTextNode($this->getDataContainer()->getId()); + $id->appendChild($text); + } + + /** + * Validate a URI using the tag scheme (RFC 4151) + * + * @param string $id + * @return bool + */ + protected function _validateTagUri($id) + { + if (preg_match('/^tag:(?P.*),(?P\d{4}-?\d{0,2}-?\d{0,2}):(?P.*)(.*:)*$/', $id, $matches)) { + $dvalid = false; + $nvalid = false; + $date = $matches['date']; + $d6 = strtotime($date); + if ((strlen($date) == 4) && $date <= date('Y')) { + $dvalid = true; + } elseif ((strlen($date) == 7) && ($d6 < strtotime("now"))) { + $dvalid = true; + } elseif ((strlen($date) == 10) && ($d6 < strtotime("now"))) { + $dvalid = true; + } + $validator = new Validator\EmailAddress; + if ($validator->isValid($matches['name'])) { + $nvalid = true; + } else { + $nvalid = $validator->isValid('info@' . $matches['name']); + } + return $dvalid && $nvalid; + + } + return false; + } + + /** + * Set entry content + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setContent(DOMDocument $dom, DOMElement $root) + { + $content = $this->getDataContainer()->getContent(); + if (!$content && !$this->getDataContainer()->getLink()) { + $message = 'Atom 1.0 entry elements MUST contain exactly one ' + . 'atom:content element, or as an alternative, at least one link ' + . 'with a rel attribute of "alternate" to indicate an alternate ' + . 'method to consume the content.'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + if (!$content) { + return; + } + $element = $dom->createElement('content'); + $element->setAttribute('type', 'xhtml'); + $xhtmlElement = $this->_loadXhtml($content); + $xhtml = $dom->importNode($xhtmlElement, true); + $element->appendChild($xhtml); + $root->appendChild($element); + } + + /** + * Load a HTML string and attempt to normalise to XML + */ + protected function _loadXhtml($content) + { + $xhtml = ''; + if (class_exists('tidy', false)) { + $tidy = new \tidy; + $config = array( + 'output-xhtml' => true, + 'show-body-only' => true, + 'quote-nbsp' => false + ); + $encoding = str_replace('-', '', $this->getEncoding()); + $tidy->parseString($content, $config, $encoding); + $tidy->cleanRepair(); + $xhtml = (string) $tidy; + } else { + $xhtml = $content; + } + $xhtml = preg_replace(array( + "/(<[\/]?)([a-zA-Z]+)/" + ), '$1xhtml:$2', $xhtml); + $dom = new DOMDocument('1.0', $this->getEncoding()); + $dom->loadXML('' + . $xhtml . ''); + return $dom->documentElement; + } + + /** + * Set entry categories + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCategories(DOMDocument $dom, DOMElement $root) + { + $categories = $this->getDataContainer()->getCategories(); + if (!$categories) { + return; + } + foreach ($categories as $cat) { + $category = $dom->createElement('category'); + $category->setAttribute('term', $cat['term']); + if (isset($cat['label'])) { + $category->setAttribute('label', $cat['label']); + } else { + $category->setAttribute('label', $cat['term']); + } + if (isset($cat['scheme'])) { + $category->setAttribute('scheme', $cat['scheme']); + } + $root->appendChild($category); + } + } + + /** + * Append Source element (Atom 1.0 Feed Metadata) + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setSource(DOMDocument $dom, DOMElement $root) + { + $source = $this->getDataContainer()->getSource(); + if (!$source) { + return; + } + $renderer = new Renderer\Feed\AtomSource($source); + $renderer->setType($this->getType()); + $element = $renderer->render()->getElement(); + $imported = $dom->importNode($element, true); + $root->appendChild($imported); + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php new file mode 100644 index 0000000000..65ace00bd7 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php @@ -0,0 +1,102 @@ +dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $entry = $this->dom->createElement('at:deleted-entry'); + $this->dom->appendChild($entry); + + $entry->setAttribute('ref', $this->container->getReference()); + $entry->setAttribute('when', $this->container->getWhen()->format(DateTime::ISO8601)); + + $this->_setBy($this->dom, $entry); + $this->_setComment($this->dom, $entry); + + return $this; + } + + /** + * Set tombstone comment + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setComment(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getComment()) { + return; + } + $c = $dom->createElement('at:comment'); + $root->appendChild($c); + $c->setAttribute('type', 'html'); + $cdata = $dom->createCDATASection($this->getDataContainer()->getComment()); + $c->appendChild($cdata); + } + + /** + * Set entry authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBy(DOMDocument $dom, DOMElement $root) + { + $data = $this->container->getBy(); + if ((!$data || empty($data))) { + return; + } + $author = $this->dom->createElement('at:by'); + $name = $this->dom->createElement('name'); + $author->appendChild($name); + $root->appendChild($author); + $text = $dom->createTextNode($data['name']); + $name->appendChild($text); + if (array_key_exists('email', $data)) { + $email = $this->dom->createElement('email'); + $author->appendChild($email); + $text = $dom->createTextNode($data['email']); + $email->appendChild($text); + } + if (array_key_exists('uri', $data)) { + $uri = $this->dom->createElement('uri'); + $author->appendChild($uri); + $text = $dom->createTextNode($data['uri']); + $uri->appendChild($text); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/AtomDeleted.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/AtomDeleted.php new file mode 100644 index 0000000000..1ed4aa3d9e --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/AtomDeleted.php @@ -0,0 +1,104 @@ +dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $entry = $this->dom->createElement('at:deleted-entry'); + $this->dom->appendChild($entry); + + $entry->setAttribute('ref', $this->container->getReference()); + $entry->setAttribute('when', $this->container->getWhen()->format(DateTime::ISO8601)); + + $this->_setBy($this->dom, $entry); + $this->_setComment($this->dom, $entry); + + return $this; + } + + /** + * Set tombstone comment + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setComment(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getComment()) { + return; + } + $c = $dom->createElement('at:comment'); + $root->appendChild($c); + $c->setAttribute('type', 'html'); + $cdata = $dom->createCDATASection($this->getDataContainer()->getComment()); + $c->appendChild($cdata); + } + + /** + * Set entry authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBy(DOMDocument $dom, DOMElement $root) + { + $data = $this->container->getBy(); + if ((!$data || empty($data))) { + return; + } + $author = $this->dom->createElement('at:by'); + $name = $this->dom->createElement('name'); + $author->appendChild($name); + $root->appendChild($author); + $text = $dom->createTextNode($data['name']); + $name->appendChild($text); + if (array_key_exists('email', $data)) { + $email = $this->dom->createElement('email'); + $author->appendChild($email); + $text = $dom->createTextNode($data['email']); + $email->appendChild($text); + } + if (array_key_exists('uri', $data)) { + $uri = $this->dom->createElement('uri'); + $author->appendChild($uri); + $text = $dom->createTextNode($data['uri']); + $uri->appendChild($text); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Rss.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Rss.php new file mode 100644 index 0000000000..2338cdc213 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Entry/Rss.php @@ -0,0 +1,329 @@ +dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $this->dom->substituteEntities = false; + $entry = $this->dom->createElement('item'); + $this->dom->appendChild($entry); + + $this->_setTitle($this->dom, $entry); + $this->_setDescription($this->dom, $entry); + $this->_setDateCreated($this->dom, $entry); + $this->_setDateModified($this->dom, $entry); + $this->_setLink($this->dom, $entry); + $this->_setId($this->dom, $entry); + $this->_setAuthors($this->dom, $entry); + $this->_setEnclosure($this->dom, $entry); + $this->_setCommentLink($this->dom, $entry); + $this->_setCategories($this->dom, $entry); + foreach ($this->extensions as $ext) { + $ext->setType($this->getType()); + $ext->setRootElement($this->getRootElement()); + $ext->setDOMDocument($this->getDOMDocument(), $entry); + $ext->render(); + } + + return $this; + } + + /** + * Set entry title + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setTitle(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDescription() + && !$this->getDataContainer()->getTitle()) { + $message = 'RSS 2.0 entry elements SHOULD contain exactly one' + . ' title element but a title has not been set. In addition, there' + . ' is no description as required in the absence of a title.'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $title = $dom->createElement('title'); + $root->appendChild($title); + $text = $dom->createTextNode($this->getDataContainer()->getTitle()); + $title->appendChild($text); + } + + /** + * Set entry description + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setDescription(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDescription() + && !$this->getDataContainer()->getTitle()) { + $message = 'RSS 2.0 entry elements SHOULD contain exactly one' + . ' description element but a description has not been set. In' + . ' addition, there is no title element as required in the absence' + . ' of a description.'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + if (!$this->getDataContainer()->getDescription()) { + return; + } + $subtitle = $dom->createElement('description'); + $root->appendChild($subtitle); + $text = $dom->createCDATASection($this->getDataContainer()->getDescription()); + $subtitle->appendChild($text); + } + + /** + * Set date entry was last modified + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateModified(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateModified()) { + return; + } + + $updated = $dom->createElement('pubDate'); + $root->appendChild($updated); + $text = $dom->createTextNode( + $this->getDataContainer()->getDateModified()->format(DateTime::RSS) + ); + $updated->appendChild($text); + } + + /** + * Set date entry was created + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateCreated(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateCreated()) { + return; + } + if (!$this->getDataContainer()->getDateModified()) { + $this->getDataContainer()->setDateModified( + $this->getDataContainer()->getDateCreated() + ); + } + } + + /** + * Set entry authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->container->getAuthors(); + if ((!$authors || empty($authors))) { + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('author'); + $name = $data['name']; + if (array_key_exists('email', $data)) { + $name = $data['email'] . ' (' . $data['name'] . ')'; + } + $text = $dom->createTextNode($name); + $author->appendChild($text); + $root->appendChild($author); + } + } + + /** + * Set entry enclosure + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setEnclosure(DOMDocument $dom, DOMElement $root) + { + $data = $this->container->getEnclosure(); + if ((!$data || empty($data))) { + return; + } + if (!isset($data['type'])) { + $exception = new Writer\Exception\InvalidArgumentException('Enclosure "type" is not set'); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + if (!isset($data['length'])) { + $exception = new Writer\Exception\InvalidArgumentException('Enclosure "length" is not set'); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + if (isset($data['length']) && (int) $data['length'] <= 0) { + $exception = new Writer\Exception\InvalidArgumentException('Enclosure "length" must be an integer' + . ' indicating the content\'s length in bytes'); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $enclosure = $this->dom->createElement('enclosure'); + $enclosure->setAttribute('type', $data['type']); + $enclosure->setAttribute('length', $data['length']); + $enclosure->setAttribute('url', $data['uri']); + $root->appendChild($enclosure); + } + + /** + * Set link to entry + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setLink(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getLink()) { + return; + } + $link = $dom->createElement('link'); + $root->appendChild($link); + $text = $dom->createTextNode($this->getDataContainer()->getLink()); + $link->appendChild($text); + } + + /** + * Set entry identifier + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setId(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getId() + && !$this->getDataContainer()->getLink()) { + return; + } + + $id = $dom->createElement('guid'); + $root->appendChild($id); + if (!$this->getDataContainer()->getId()) { + $this->getDataContainer()->setId( + $this->getDataContainer()->getLink()); + } + $text = $dom->createTextNode($this->getDataContainer()->getId()); + $id->appendChild($text); + if (!Uri::factory($this->getDataContainer()->getId())->isValid()) { + $id->setAttribute('isPermaLink', 'false'); + } + } + + /** + * Set link to entry comments + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCommentLink(DOMDocument $dom, DOMElement $root) + { + $link = $this->getDataContainer()->getCommentLink(); + if (!$link) { + return; + } + $clink = $this->dom->createElement('comments'); + $text = $dom->createTextNode($link); + $clink->appendChild($text); + $root->appendChild($clink); + } + + /** + * Set entry categories + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCategories(DOMDocument $dom, DOMElement $root) + { + $categories = $this->getDataContainer()->getCategories(); + if (!$categories) { + return; + } + foreach ($categories as $cat) { + $category = $dom->createElement('category'); + if (isset($cat['scheme'])) { + $category->setAttribute('domain', $cat['scheme']); + } + $text = $dom->createCDATASection($cat['term']); + $category->appendChild($text); + $root->appendChild($category); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/AbstractAtom.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/AbstractAtom.php new file mode 100644 index 0000000000..e7ad9f56ba --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/AbstractAtom.php @@ -0,0 +1,403 @@ +getDataContainer()->getLanguage()) { + $root->setAttribute('xml:lang', $this->getDataContainer() + ->getLanguage()); + } + } + + /** + * Set feed title + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setTitle(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getTitle()) { + $message = 'Atom 1.0 feed elements MUST contain exactly one' + . ' atom:title element but a title has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $title = $dom->createElement('title'); + $root->appendChild($title); + $title->setAttribute('type', 'text'); + $text = $dom->createTextNode($this->getDataContainer()->getTitle()); + $title->appendChild($text); + } + + /** + * Set feed description + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDescription(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDescription()) { + return; + } + $subtitle = $dom->createElement('subtitle'); + $root->appendChild($subtitle); + $subtitle->setAttribute('type', 'text'); + $text = $dom->createTextNode($this->getDataContainer()->getDescription()); + $subtitle->appendChild($text); + } + + /** + * Set date feed was last modified + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setDateModified(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateModified()) { + $message = 'Atom 1.0 feed elements MUST contain exactly one' + . ' atom:updated element but a modification date has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $updated = $dom->createElement('updated'); + $root->appendChild($updated); + $text = $dom->createTextNode( + $this->getDataContainer()->getDateModified()->format(DateTime::ISO8601) + ); + $updated->appendChild($text); + } + + /** + * Set feed generator string + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setGenerator(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getGenerator()) { + $this->getDataContainer()->setGenerator('Zend_Feed_Writer', + Version::VERSION, 'http://framework.zend.com'); + } + + $gdata = $this->getDataContainer()->getGenerator(); + $generator = $dom->createElement('generator'); + $root->appendChild($generator); + $text = $dom->createTextNode($gdata['name']); + $generator->appendChild($text); + if (array_key_exists('uri', $gdata)) { + $generator->setAttribute('uri', $gdata['uri']); + } + if (array_key_exists('version', $gdata)) { + $generator->setAttribute('version', $gdata['version']); + } + } + + /** + * Set link to feed + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setLink(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getLink()) { + return; + } + $link = $dom->createElement('link'); + $root->appendChild($link); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('type', 'text/html'); + $link->setAttribute('href', $this->getDataContainer()->getLink()); + } + + /** + * Set feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setFeedLinks(DOMDocument $dom, DOMElement $root) + { + $flinks = $this->getDataContainer()->getFeedLinks(); + if (!$flinks || !array_key_exists('atom', $flinks)) { + $message = 'Atom 1.0 feed elements SHOULD contain one atom:link ' + . 'element with a rel attribute value of "self". This is the ' + . 'preferred URI for retrieving Atom Feed Documents representing ' + . 'this Atom feed but a feed link has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + foreach ($flinks as $type => $href) { + $mime = 'application/' . strtolower($type) . '+xml'; + $flink = $dom->createElement('link'); + $root->appendChild($flink); + $flink->setAttribute('rel', 'self'); + $flink->setAttribute('type', $mime); + $flink->setAttribute('href', $href); + } + } + + /** + * Set feed authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->container->getAuthors(); + if (!$authors || empty($authors)) { + /** + * Technically we should defer an exception until we can check + * that all entries contain an author. If any entry is missing + * an author, then a missing feed author element is invalid + */ + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('author'); + $name = $this->dom->createElement('name'); + $author->appendChild($name); + $root->appendChild($author); + $text = $dom->createTextNode($data['name']); + $name->appendChild($text); + if (array_key_exists('email', $data)) { + $email = $this->dom->createElement('email'); + $author->appendChild($email); + $text = $dom->createTextNode($data['email']); + $email->appendChild($text); + } + if (array_key_exists('uri', $data)) { + $uri = $this->dom->createElement('uri'); + $author->appendChild($uri); + $text = $dom->createTextNode($data['uri']); + $uri->appendChild($text); + } + } + } + + /** + * Set feed identifier + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setId(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getId() + && !$this->getDataContainer()->getLink()) { + $message = 'Atom 1.0 feed elements MUST contain exactly one ' + . 'atom:id element, or as an alternative, we can use the same ' + . 'value as atom:link however neither a suitable link nor an ' + . 'id have been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + if (!$this->getDataContainer()->getId()) { + $this->getDataContainer()->setId( + $this->getDataContainer()->getLink()); + } + $id = $dom->createElement('id'); + $root->appendChild($id); + $text = $dom->createTextNode($this->getDataContainer()->getId()); + $id->appendChild($text); + } + + /** + * Set feed copyright + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCopyright(DOMDocument $dom, DOMElement $root) + { + $copyright = $this->getDataContainer()->getCopyright(); + if (!$copyright) { + return; + } + $copy = $dom->createElement('rights'); + $root->appendChild($copy); + $text = $dom->createTextNode($copyright); + $copy->appendChild($text); + } + + /** + * Set feed level logo (image) + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setImage(DOMDocument $dom, DOMElement $root) + { + $image = $this->getDataContainer()->getImage(); + if (!$image) { + return; + } + $img = $dom->createElement('logo'); + $root->appendChild($img); + $text = $dom->createTextNode($image['uri']); + $img->appendChild($text); + } + + /** + * Set date feed was created + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateCreated(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateCreated()) { + return; + } + if (!$this->getDataContainer()->getDateModified()) { + $this->getDataContainer()->setDateModified( + $this->getDataContainer()->getDateCreated() + ); + } + } + + /** + * Set base URL to feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBaseUrl(DOMDocument $dom, DOMElement $root) + { + $baseUrl = $this->getDataContainer()->getBaseUrl(); + if (!$baseUrl) { + return; + } + $root->setAttribute('xml:base', $baseUrl); + } + + /** + * Set hubs to which this feed pushes + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setHubs(DOMDocument $dom, DOMElement $root) + { + $hubs = $this->getDataContainer()->getHubs(); + if (!$hubs) { + return; + } + foreach ($hubs as $hubUrl) { + $hub = $dom->createElement('link'); + $hub->setAttribute('rel', 'hub'); + $hub->setAttribute('href', $hubUrl); + $root->appendChild($hub); + } + } + + /** + * Set feed categories + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCategories(DOMDocument $dom, DOMElement $root) + { + $categories = $this->getDataContainer()->getCategories(); + if (!$categories) { + return; + } + foreach ($categories as $cat) { + $category = $dom->createElement('category'); + $category->setAttribute('term', $cat['term']); + if (isset($cat['label'])) { + $category->setAttribute('label', $cat['label']); + } else { + $category->setAttribute('label', $cat['term']); + } + if (isset($cat['scheme'])) { + $category->setAttribute('scheme', $cat['scheme']); + } + $root->appendChild($category); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom.php new file mode 100644 index 0000000000..87b6b94ac0 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom.php @@ -0,0 +1,96 @@ +container->getEncoding()) { + $this->container->setEncoding('UTF-8'); + } + $this->dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $root = $this->dom->createElementNS( + Writer\Writer::NAMESPACE_ATOM_10, 'feed' + ); + $this->setRootElement($root); + $this->dom->appendChild($root); + $this->_setLanguage($this->dom, $root); + $this->_setBaseUrl($this->dom, $root); + $this->_setTitle($this->dom, $root); + $this->_setDescription($this->dom, $root); + $this->_setImage($this->dom, $root); + $this->_setDateCreated($this->dom, $root); + $this->_setDateModified($this->dom, $root); + $this->_setGenerator($this->dom, $root); + $this->_setLink($this->dom, $root); + $this->_setFeedLinks($this->dom, $root); + $this->_setId($this->dom, $root); + $this->_setAuthors($this->dom, $root); + $this->_setCopyright($this->dom, $root); + $this->_setCategories($this->dom, $root); + $this->_setHubs($this->dom, $root); + + foreach ($this->extensions as $ext) { + $ext->setType($this->getType()); + $ext->setRootElement($this->getRootElement()); + $ext->setDOMDocument($this->getDOMDocument(), $root); + $ext->render(); + } + + foreach ($this->container as $entry) { + if ($this->getDataContainer()->getEncoding()) { + $entry->setEncoding($this->getDataContainer()->getEncoding()); + } + if ($entry instanceof Writer\Entry) { + $renderer = new Renderer\Entry\Atom($entry); + } else { + if (!$this->dom->documentElement->hasAttribute('xmlns:at')) { + $this->dom->documentElement->setAttribute( + 'xmlns:at', 'http://purl.org/atompub/tombstones/1.0' + ); + } + $renderer = new Renderer\Entry\AtomDeleted($entry); + } + if ($this->ignoreExceptions === true) { + $renderer->ignoreExceptions(); + } + $renderer->setType($this->getType()); + $renderer->setRootElement($this->dom->documentElement); + $renderer->render(); + $element = $renderer->getElement(); + $imported = $this->dom->importNode($element, true); + $root->appendChild($imported); + } + return $this; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom/AbstractAtom.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom/AbstractAtom.php new file mode 100644 index 0000000000..379cd5c9f7 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom/AbstractAtom.php @@ -0,0 +1,400 @@ +getDataContainer()->getLanguage()) { + $root->setAttribute('xml:lang', $this->getDataContainer() + ->getLanguage()); + } + } + + /** + * Set feed title + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Feed\Exception\InvalidArgumentException + */ + protected function _setTitle(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getTitle()) { + $message = 'Atom 1.0 feed elements MUST contain exactly one' + . ' atom:title element but a title has not been set'; + $exception = new Feed\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $title = $dom->createElement('title'); + $root->appendChild($title); + $title->setAttribute('type', 'text'); + $text = $dom->createTextNode($this->getDataContainer()->getTitle()); + $title->appendChild($text); + } + + /** + * Set feed description + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDescription(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDescription()) { + return; + } + $subtitle = $dom->createElement('subtitle'); + $root->appendChild($subtitle); + $subtitle->setAttribute('type', 'text'); + $text = $dom->createTextNode($this->getDataContainer()->getDescription()); + $subtitle->appendChild($text); + } + + /** + * Set date feed was last modified + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Feed\Exception\InvalidArgumentException + */ + protected function _setDateModified(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateModified()) { + $message = 'Atom 1.0 feed elements MUST contain exactly one' + . ' atom:updated element but a modification date has not been set'; + $exception = new Feed\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $updated = $dom->createElement('updated'); + $root->appendChild($updated); + $text = $dom->createTextNode( + $this->getDataContainer()->getDateModified()->format(DateTime::ISO8601) + ); + $updated->appendChild($text); + } + + /** + * Set feed generator string + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setGenerator(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getGenerator()) { + $this->getDataContainer()->setGenerator('Zend_Feed_Writer', + Version::VERSION, 'http://framework.zend.com'); + } + + $gdata = $this->getDataContainer()->getGenerator(); + $generator = $dom->createElement('generator'); + $root->appendChild($generator); + $text = $dom->createTextNode($gdata['name']); + $generator->appendChild($text); + if (array_key_exists('uri', $gdata)) { + $generator->setAttribute('uri', $gdata['uri']); + } + if (array_key_exists('version', $gdata)) { + $generator->setAttribute('version', $gdata['version']); + } + } + + /** + * Set link to feed + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setLink(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getLink()) { + return; + } + $link = $dom->createElement('link'); + $root->appendChild($link); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('type', 'text/html'); + $link->setAttribute('href', $this->getDataContainer()->getLink()); + } + + /** + * Set feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Feed\Exception\InvalidArgumentException + */ + protected function _setFeedLinks(DOMDocument $dom, DOMElement $root) + { + $flinks = $this->getDataContainer()->getFeedLinks(); + if (!$flinks || !array_key_exists('atom', $flinks)) { + $message = 'Atom 1.0 feed elements SHOULD contain one atom:link ' + . 'element with a rel attribute value of "self". This is the ' + . 'preferred URI for retrieving Atom Feed Documents representing ' + . 'this Atom feed but a feed link has not been set'; + $exception = new Feed\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + foreach ($flinks as $type => $href) { + $mime = 'application/' . strtolower($type) . '+xml'; + $flink = $dom->createElement('link'); + $root->appendChild($flink); + $flink->setAttribute('rel', 'self'); + $flink->setAttribute('type', $mime); + $flink->setAttribute('href', $href); + } + } + + /** + * Set feed authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->container->getAuthors(); + if (!$authors || empty($authors)) { + /** + * Technically we should defer an exception until we can check + * that all entries contain an author. If any entry is missing + * an author, then a missing feed author element is invalid + */ + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('author'); + $name = $this->dom->createElement('name'); + $author->appendChild($name); + $root->appendChild($author); + $text = $dom->createTextNode($data['name']); + $name->appendChild($text); + if (array_key_exists('email', $data)) { + $email = $this->dom->createElement('email'); + $author->appendChild($email); + $text = $dom->createTextNode($data['email']); + $email->appendChild($text); + } + if (array_key_exists('uri', $data)) { + $uri = $this->dom->createElement('uri'); + $author->appendChild($uri); + $text = $dom->createTextNode($data['uri']); + $uri->appendChild($text); + } + } + } + + /** + * Set feed identifier + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Feed\Exception\InvalidArgumentException + */ + protected function _setId(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getId() + && !$this->getDataContainer()->getLink()) { + $message = 'Atom 1.0 feed elements MUST contain exactly one ' + . 'atom:id element, or as an alternative, we can use the same ' + . 'value as atom:link however neither a suitable link nor an ' + . 'id have been set'; + $exception = new Feed\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + if (!$this->getDataContainer()->getId()) { + $this->getDataContainer()->setId( + $this->getDataContainer()->getLink()); + } + $id = $dom->createElement('id'); + $root->appendChild($id); + $text = $dom->createTextNode($this->getDataContainer()->getId()); + $id->appendChild($text); + } + + /** + * Set feed copyright + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCopyright(DOMDocument $dom, DOMElement $root) + { + $copyright = $this->getDataContainer()->getCopyright(); + if (!$copyright) { + return; + } + $copy = $dom->createElement('rights'); + $root->appendChild($copy); + $text = $dom->createTextNode($copyright); + $copy->appendChild($text); + } + /** + * Set feed level logo (image) + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setImage(DOMDocument $dom, DOMElement $root) + { + $image = $this->getDataContainer()->getImage(); + if (!$image) { + return; + } + $img = $dom->createElement('logo'); + $root->appendChild($img); + $text = $dom->createTextNode($image['uri']); + $img->appendChild($text); + } + + + /** + * Set date feed was created + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateCreated(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateCreated()) { + return; + } + if (!$this->getDataContainer()->getDateModified()) { + $this->getDataContainer()->setDateModified( + $this->getDataContainer()->getDateCreated() + ); + } + } + + /** + * Set base URL to feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBaseUrl(DOMDocument $dom, DOMElement $root) + { + $baseUrl = $this->getDataContainer()->getBaseUrl(); + if (!$baseUrl) { + return; + } + $root->setAttribute('xml:base', $baseUrl); + } + + /** + * Set hubs to which this feed pushes + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setHubs(DOMDocument $dom, DOMElement $root) + { + $hubs = $this->getDataContainer()->getHubs(); + if (!$hubs) { + return; + } + foreach ($hubs as $hubUrl) { + $hub = $dom->createElement('link'); + $hub->setAttribute('rel', 'hub'); + $hub->setAttribute('href', $hubUrl); + $root->appendChild($hub); + } + } + + /** + * Set feed categories + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCategories(DOMDocument $dom, DOMElement $root) + { + $categories = $this->getDataContainer()->getCategories(); + if (!$categories) { + return; + } + foreach ($categories as $cat) { + $category = $dom->createElement('category'); + $category->setAttribute('term', $cat['term']); + if (isset($cat['label'])) { + $category->setAttribute('label', $cat['label']); + } else { + $category->setAttribute('label', $cat['term']); + } + if (isset($cat['scheme'])) { + $category->setAttribute('scheme', $cat['scheme']); + } + $root->appendChild($category); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php new file mode 100644 index 0000000000..006c6ae4ae --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php @@ -0,0 +1,93 @@ +container->getEncoding()) { + $this->container->setEncoding('UTF-8'); + } + $this->dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $root = $this->dom->createElement('source'); + $this->setRootElement($root); + $this->dom->appendChild($root); + $this->_setLanguage($this->dom, $root); + $this->_setBaseUrl($this->dom, $root); + $this->_setTitle($this->dom, $root); + $this->_setDescription($this->dom, $root); + $this->_setDateCreated($this->dom, $root); + $this->_setDateModified($this->dom, $root); + $this->_setGenerator($this->dom, $root); + $this->_setLink($this->dom, $root); + $this->_setFeedLinks($this->dom, $root); + $this->_setId($this->dom, $root); + $this->_setAuthors($this->dom, $root); + $this->_setCopyright($this->dom, $root); + $this->_setCategories($this->dom, $root); + + foreach ($this->extensions as $ext) { + $ext->setType($this->getType()); + $ext->setRootElement($this->getRootElement()); + $ext->setDomDocument($this->getDomDocument(), $root); + $ext->render(); + } + return $this; + } + + /** + * Set feed generator string + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setGenerator(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getGenerator()) { + return; + } + + $gdata = $this->getDataContainer()->getGenerator(); + $generator = $dom->createElement('generator'); + $root->appendChild($generator); + $text = $dom->createTextNode($gdata['name']); + $generator->appendChild($text); + if (array_key_exists('uri', $gdata)) { + $generator->setAttribute('uri', $gdata['uri']); + } + if (array_key_exists('version', $gdata)) { + $generator->setAttribute('version', $gdata['version']); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/AtomSource.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/AtomSource.php new file mode 100644 index 0000000000..739c6f7299 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/AtomSource.php @@ -0,0 +1,95 @@ +container->getEncoding()) { + $this->container->setEncoding('UTF-8'); + } + $this->dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $root = $this->dom->createElement('source'); + $this->setRootElement($root); + $this->dom->appendChild($root); + $this->_setLanguage($this->dom, $root); + $this->_setBaseUrl($this->dom, $root); + $this->_setTitle($this->dom, $root); + $this->_setDescription($this->dom, $root); + $this->_setDateCreated($this->dom, $root); + $this->_setDateModified($this->dom, $root); + $this->_setGenerator($this->dom, $root); + $this->_setLink($this->dom, $root); + $this->_setFeedLinks($this->dom, $root); + $this->_setId($this->dom, $root); + $this->_setAuthors($this->dom, $root); + $this->_setCopyright($this->dom, $root); + $this->_setCategories($this->dom, $root); + + foreach ($this->extensions as $ext) { + $ext->setType($this->getType()); + $ext->setRootElement($this->getRootElement()); + $ext->setDOMDocument($this->getDOMDocument(), $root); + $ext->render(); + } + return $this; + } + + /** + * Set feed generator string + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setGenerator(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getGenerator()) { + return; + } + + $gdata = $this->getDataContainer()->getGenerator(); + $generator = $dom->createElement('generator'); + $root->appendChild($generator); + $text = $dom->createTextNode($gdata['name']); + $generator->appendChild($text); + if (array_key_exists('uri', $gdata)) { + $generator->setAttribute('uri', $gdata['uri']); + } + if (array_key_exists('version', $gdata)) { + $generator->setAttribute('version', $gdata['version']); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Rss.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Rss.php new file mode 100644 index 0000000000..75c502e323 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/Feed/Rss.php @@ -0,0 +1,484 @@ +dom = new DOMDocument('1.0', $this->container->getEncoding()); + $this->dom->formatOutput = true; + $this->dom->substituteEntities = false; + $rss = $this->dom->createElement('rss'); + $this->setRootElement($rss); + $rss->setAttribute('version', '2.0'); + + $channel = $this->dom->createElement('channel'); + $rss->appendChild($channel); + $this->dom->appendChild($rss); + $this->_setLanguage($this->dom, $channel); + $this->_setBaseUrl($this->dom, $channel); + $this->_setTitle($this->dom, $channel); + $this->_setDescription($this->dom, $channel); + $this->_setImage($this->dom, $channel); + $this->_setDateCreated($this->dom, $channel); + $this->_setDateModified($this->dom, $channel); + $this->_setLastBuildDate($this->dom, $channel); + $this->_setGenerator($this->dom, $channel); + $this->_setLink($this->dom, $channel); + $this->_setAuthors($this->dom, $channel); + $this->_setCopyright($this->dom, $channel); + $this->_setCategories($this->dom, $channel); + + foreach ($this->extensions as $ext) { + $ext->setType($this->getType()); + $ext->setRootElement($this->getRootElement()); + $ext->setDOMDocument($this->getDOMDocument(), $channel); + $ext->render(); + } + + foreach ($this->container as $entry) { + if ($this->getDataContainer()->getEncoding()) { + $entry->setEncoding($this->getDataContainer()->getEncoding()); + } + if ($entry instanceof Writer\Entry) { + $renderer = new Renderer\Entry\Rss($entry); + } else { + continue; + } + if ($this->ignoreExceptions === true) { + $renderer->ignoreExceptions(); + } + $renderer->setType($this->getType()); + $renderer->setRootElement($this->dom->documentElement); + $renderer->render(); + $element = $renderer->getElement(); + $imported = $this->dom->importNode($element, true); + $channel->appendChild($imported); + } + return $this; + } + + /** + * Set feed language + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setLanguage(DOMDocument $dom, DOMElement $root) + { + $lang = $this->getDataContainer()->getLanguage(); + if (!$lang) { + return; + } + $language = $dom->createElement('language'); + $root->appendChild($language); + $language->nodeValue = $lang; + } + + /** + * Set feed title + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setTitle(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getTitle()) { + $message = 'RSS 2.0 feed elements MUST contain exactly one' + . ' title element but a title has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $title = $dom->createElement('title'); + $root->appendChild($title); + $text = $dom->createTextNode($this->getDataContainer()->getTitle()); + $title->appendChild($text); + } + + /** + * Set feed description + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setDescription(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDescription()) { + $message = 'RSS 2.0 feed elements MUST contain exactly one' + . ' description element but one has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $subtitle = $dom->createElement('description'); + $root->appendChild($subtitle); + $text = $dom->createTextNode($this->getDataContainer()->getDescription()); + $subtitle->appendChild($text); + } + + /** + * Set date feed was last modified + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateModified(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateModified()) { + return; + } + + $updated = $dom->createElement('pubDate'); + $root->appendChild($updated); + $text = $dom->createTextNode( + $this->getDataContainer()->getDateModified()->format(DateTime::RSS) + ); + $updated->appendChild($text); + } + + /** + * Set feed generator string + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setGenerator(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getGenerator()) { + $this->getDataContainer()->setGenerator('Zend_Feed_Writer', + Version::VERSION, 'http://framework.zend.com'); + } + + $gdata = $this->getDataContainer()->getGenerator(); + $generator = $dom->createElement('generator'); + $root->appendChild($generator); + $name = $gdata['name']; + if (array_key_exists('version', $gdata)) { + $name .= ' ' . $gdata['version']; + } + if (array_key_exists('uri', $gdata)) { + $name .= ' (' . $gdata['uri'] . ')'; + } + $text = $dom->createTextNode($name); + $generator->appendChild($text); + } + + /** + * Set link to feed + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setLink(DOMDocument $dom, DOMElement $root) + { + $value = $this->getDataContainer()->getLink(); + if (!$value) { + $message = 'RSS 2.0 feed elements MUST contain exactly one' + . ' link element but one has not been set'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $link = $dom->createElement('link'); + $root->appendChild($link); + $text = $dom->createTextNode($value); + $link->appendChild($text); + if (!Uri::factory($value)->isValid()) { + $link->setAttribute('isPermaLink', 'false'); + } + } + + /** + * Set feed authors + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setAuthors(DOMDocument $dom, DOMElement $root) + { + $authors = $this->getDataContainer()->getAuthors(); + if (!$authors || empty($authors)) { + return; + } + foreach ($authors as $data) { + $author = $this->dom->createElement('author'); + $name = $data['name']; + if (array_key_exists('email', $data)) { + $name = $data['email'] . ' (' . $data['name'] . ')'; + } + $text = $dom->createTextNode($name); + $author->appendChild($text); + $root->appendChild($author); + } + } + + /** + * Set feed copyright + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCopyright(DOMDocument $dom, DOMElement $root) + { + $copyright = $this->getDataContainer()->getCopyright(); + if (!$copyright) { + return; + } + $copy = $dom->createElement('copyright'); + $root->appendChild($copy); + $text = $dom->createTextNode($copyright); + $copy->appendChild($text); + } + + /** + * Set feed channel image + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + * @throws Writer\Exception\InvalidArgumentException + */ + protected function _setImage(DOMDocument $dom, DOMElement $root) + { + $image = $this->getDataContainer()->getImage(); + if (!$image) { + return; + } + + if (!isset($image['title']) || empty($image['title']) + || !is_string($image['title']) + ) { + $message = 'RSS 2.0 feed images must include a title'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + if (empty($image['link']) || !is_string($image['link']) + || !Uri::factory($image['link'])->isValid() + ) { + $message = 'Invalid parameter: parameter \'link\'' + . ' must be a non-empty string and valid URI/IRI'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + + $img = $dom->createElement('image'); + $root->appendChild($img); + + $url = $dom->createElement('url'); + $text = $dom->createTextNode($image['uri']); + $url->appendChild($text); + + $title = $dom->createElement('title'); + $text = $dom->createTextNode($image['title']); + $title->appendChild($text); + + $link = $dom->createElement('link'); + $text = $dom->createTextNode($image['link']); + $link->appendChild($text); + + $img->appendChild($url); + $img->appendChild($title); + $img->appendChild($link); + + if (isset($image['height'])) { + if (!ctype_digit((string) $image['height']) || $image['height'] > 400) { + $message = 'Invalid parameter: parameter \'height\'' + . ' must be an integer not exceeding 400'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $height = $dom->createElement('height'); + $text = $dom->createTextNode($image['height']); + $height->appendChild($text); + $img->appendChild($height); + } + if (isset($image['width'])) { + if (!ctype_digit((string) $image['width']) || $image['width'] > 144) { + $message = 'Invalid parameter: parameter \'width\'' + . ' must be an integer not exceeding 144'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $width = $dom->createElement('width'); + $text = $dom->createTextNode($image['width']); + $width->appendChild($text); + $img->appendChild($width); + } + if (isset($image['description'])) { + if (empty($image['description']) || !is_string($image['description'])) { + $message = 'Invalid parameter: parameter \'description\'' + . ' must be a non-empty string'; + $exception = new Writer\Exception\InvalidArgumentException($message); + if (!$this->ignoreExceptions) { + throw $exception; + } else { + $this->exceptions[] = $exception; + return; + } + } + $desc = $dom->createElement('description'); + $text = $dom->createTextNode($image['description']); + $desc->appendChild($text); + $img->appendChild($desc); + } + } + + /** + * Set date feed was created + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setDateCreated(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getDateCreated()) { + return; + } + if (!$this->getDataContainer()->getDateModified()) { + $this->getDataContainer()->setDateModified( + $this->getDataContainer()->getDateCreated() + ); + } + } + + /** + * Set date feed last build date + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setLastBuildDate(DOMDocument $dom, DOMElement $root) + { + if (!$this->getDataContainer()->getLastBuildDate()) { + return; + } + + $lastBuildDate = $dom->createElement('lastBuildDate'); + $root->appendChild($lastBuildDate); + $text = $dom->createTextNode( + $this->getDataContainer()->getLastBuildDate()->format(DateTime::RSS) + ); + $lastBuildDate->appendChild($text); + } + + /** + * Set base URL to feed links + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setBaseUrl(DOMDocument $dom, DOMElement $root) + { + $baseUrl = $this->getDataContainer()->getBaseUrl(); + if (!$baseUrl) { + return; + } + $root->setAttribute('xml:base', $baseUrl); + } + + /** + * Set feed categories + * + * @param DOMDocument $dom + * @param DOMElement $root + * @return void + */ + protected function _setCategories(DOMDocument $dom, DOMElement $root) + { + $categories = $this->getDataContainer()->getCategories(); + if (!$categories) { + return; + } + foreach ($categories as $cat) { + $category = $dom->createElement('category'); + if (isset($cat['scheme'])) { + $category->setAttribute('domain', $cat['scheme']); + } + $text = $dom->createTextNode($cat['term']); + $category->appendChild($text); + $root->appendChild($category); + } + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/RendererInterface.php b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/RendererInterface.php new file mode 100644 index 0000000000..b2e0e00a32 --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/Writer/Renderer/RendererInterface.php @@ -0,0 +1,100 @@ + array(), + 'feed' => array(), + 'entryRenderer' => array(), + 'feedRenderer' => array(), + ); + + /** + * Set plugin loader for use with Extensions + * + * @param ExtensionManagerInterface + */ + public static function setExtensionManager(ExtensionManagerInterface $extensionManager) + { + static::$extensionManager = $extensionManager; + } + + /** + * Get plugin manager for use with Extensions + * + * @return ExtensionManagerInterface + */ + public static function getExtensionManager() + { + if (!isset(static::$extensionManager)) { + static::setExtensionManager(new ExtensionManager()); + } + return static::$extensionManager; + } + + /** + * Register an Extension by name + * + * @param string $name + * @return void + * @throws Exception\RuntimeException if unable to resolve Extension class + */ + public static function registerExtension($name) + { + $feedName = $name . '\Feed'; + $entryName = $name . '\Entry'; + $feedRendererName = $name . '\Renderer\Feed'; + $entryRendererName = $name . '\Renderer\Entry'; + $manager = static::getExtensionManager(); + if (static::isRegistered($name)) { + if ($manager->has($feedName) + || $manager->has($entryName) + || $manager->has($feedRendererName) + || $manager->has($entryRendererName) + ) { + return; + } + } + if (!$manager->has($feedName) + && !$manager->has($entryName) + && !$manager->has($feedRendererName) + && !$manager->has($entryRendererName) + ) { + throw new Exception\RuntimeException('Could not load extension: ' . $name + . 'using Plugin Loader. Check prefix paths are configured and extension exists.'); + } + if ($manager->has($feedName)) { + static::$extensions['feed'][] = $feedName; + } + if ($manager->has($entryName)) { + static::$extensions['entry'][] = $entryName; + } + if ($manager->has($feedRendererName)) { + static::$extensions['feedRenderer'][] = $feedRendererName; + } + if ($manager->has($entryRendererName)) { + static::$extensions['entryRenderer'][] = $entryRendererName; + } + } + + /** + * Is a given named Extension registered? + * + * @param string $extensionName + * @return bool + */ + public static function isRegistered($extensionName) + { + $feedName = $extensionName . '\Feed'; + $entryName = $extensionName . '\Entry'; + $feedRendererName = $extensionName . '\Renderer\Feed'; + $entryRendererName = $extensionName . '\Renderer\Entry'; + if (in_array($feedName, static::$extensions['feed']) + || in_array($entryName, static::$extensions['entry']) + || in_array($feedRendererName, static::$extensions['feedRenderer']) + || in_array($entryRendererName, static::$extensions['entryRenderer']) + ) { + return true; + } + return false; + } + + /** + * Get a list of extensions + * + * @return array + */ + public static function getExtensions() + { + return static::$extensions; + } + + /** + * Reset class state to defaults + * + * @return void + */ + public static function reset() + { + static::$extensionManager = null; + static::$extensions = array( + 'entry' => array(), + 'feed' => array(), + 'entryRenderer' => array(), + 'feedRenderer' => array(), + ); + } + + /** + * Register core (default) extensions + * + * @return void + */ + public static function registerCoreExtensions() + { + static::registerExtension('DublinCore'); + static::registerExtension('Content'); + static::registerExtension('Atom'); + static::registerExtension('Slash'); + static::registerExtension('WellFormedWeb'); + static::registerExtension('Threading'); + static::registerExtension('ITunes'); + } + + public static function lcfirst($str) + { + $str[0] = strtolower($str[0]); + return $str; + } +} diff --git a/vendor/zendframework/zend-feed/Zend/Feed/composer.json b/vendor/zendframework/zend-feed/Zend/Feed/composer.json new file mode 100644 index 0000000000..7f8250e90b --- /dev/null +++ b/vendor/zendframework/zend-feed/Zend/Feed/composer.json @@ -0,0 +1,40 @@ +{ + "name": "zendframework/zend-feed", + "description": "provides functionality for consuming RSS and Atom feeds", + "license": "BSD-3-Clause", + "keywords": [ + "zf2", + "feed" + ], + "autoload": { + "psr-0": { + "Zend\\Feed\\": "" + } + }, + "target-dir": "Zend/Feed", + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-db": "self.version", + "zendframework/zend-cache": "self.version", + "zendframework/zend-http": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-validator": "self.version" + }, + "suggest": { + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-http": "Zend\\Http for PubSubHubbub, and optionally for use with Zend\\Feed\\Reader", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for default/recommended ExtensionManager implementations", + "zendframework/zend-validator": "Zend\\Validator component" + }, + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/AbstractMessage.php b/vendor/zendframework/zend-http/Zend/Http/AbstractMessage.php new file mode 100644 index 0000000000..0c607e8a4d --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/AbstractMessage.php @@ -0,0 +1,105 @@ +version = $version; + return $this; + } + + /** + * Return the HTTP version for this request + * + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Provide an alternate Parameter Container implementation for headers in this object, + * (this is NOT the primary API for value setting, for that see getHeaders()) + * + * @see getHeaders() + * @param Headers $headers + * @return AbstractMessage + */ + public function setHeaders(Headers $headers) + { + $this->headers = $headers; + return $this; + } + + /** + * Return the header container responsible for headers + * + * @return Headers + */ + public function getHeaders() + { + if ($this->headers === null || is_string($this->headers)) { + // this is only here for fromString lazy loading + $this->headers = (is_string($this->headers)) ? Headers::fromString($this->headers) : new Headers(); + } + + return $this->headers; + } + + /** + * Allow PHP casting of this object + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Client.php b/vendor/zendframework/zend-http/Zend/Http/Client.php new file mode 100644 index 0000000000..2c608eeb3a --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Client.php @@ -0,0 +1,1412 @@ + 5, + 'strictredirects' => false, + 'useragent' => 'Zend\Http\Client', + 'timeout' => 10, + 'adapter' => 'Zend\Http\Client\Adapter\Socket', + 'httpversion' => Request::VERSION_11, + 'storeresponse' => true, + 'keepalive' => false, + 'outputstream' => false, + 'encodecookies' => true, + 'argseparator' => null, + 'rfc3986strict' => false + ); + + /** + * Fileinfo magic database resource + * + * This variable is populated the first time _detectFileMimeType is called + * and is then reused on every call to this method + * + * @var resource + */ + protected static $fileInfoDb = null; + + /** + * Constructor + * + * @param string $uri + * @param array|Traversable $options + */ + public function __construct($uri = null, $options = null) + { + if ($uri !== null) { + $this->setUri($uri); + } + if ($options !== null) { + $this->setOptions($options); + } + } + + /** + * Set configuration parameters for this HTTP client + * + * @param array|Traversable $options + * @return Client + * @throws Client\Exception\InvalidArgumentException + */ + public function setOptions($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (!is_array($options)) { + throw new Client\Exception\InvalidArgumentException('Config parameter is not valid'); + } + + /** Config Key Normalization */ + foreach ($options as $k => $v) { + $this->config[str_replace(array('-', '_', ' ', '.'), '', strtolower($k))] = $v; // replace w/ normalized + } + + // Pass configuration options to the adapter if it exists + if ($this->adapter instanceof Client\Adapter\AdapterInterface) { + $this->adapter->setOptions($options); + } + + return $this; + } + + /** + * Load the connection adapter + * + * While this method is not called more than one for a client, it is + * separated from ->request() to preserve logic and readability + * + * @param Client\Adapter\AdapterInterface|string $adapter + * @return Client + * @throws Client\Exception\InvalidArgumentException + */ + public function setAdapter($adapter) + { + if (is_string($adapter)) { + if (!class_exists($adapter)) { + throw new Client\Exception\InvalidArgumentException('Unable to locate adapter class "' . $adapter . '"'); + } + $adapter = new $adapter; + } + + if (! $adapter instanceof Client\Adapter\AdapterInterface) { + throw new Client\Exception\InvalidArgumentException('Passed adapter is not a HTTP connection adapter'); + } + + $this->adapter = $adapter; + $config = $this->config; + unset($config['adapter']); + $this->adapter->setOptions($config); + return $this; + } + + /** + * Load the connection adapter + * + * @return Client\Adapter\AdapterInterface $adapter + */ + public function getAdapter() + { + if (! $this->adapter) { + $this->setAdapter($this->config['adapter']); + } + + return $this->adapter; + } + + /** + * Set request + * + * @param Request $request + * @return Client + */ + public function setRequest(Request $request) + { + $this->request = $request; + return $this; + } + + /** + * Get Request + * + * @return Request + */ + public function getRequest() + { + if (empty($this->request)) { + $this->request = new Request(); + } + return $this->request; + } + + /** + * Set response + * + * @param Response $response + * @return Client + */ + public function setResponse(Response $response) + { + $this->response = $response; + return $this; + } + + /** + * Get Response + * + * @return Response + */ + public function getResponse() + { + if (empty($this->response)) { + $this->response = new Response(); + } + return $this->response; + } + + + /** + * Get the last request (as a string) + * + * @return string + */ + public function getLastRawRequest() + { + return $this->lastRawRequest; + } + + /** + * Get the last response (as a string) + * + * @return string + */ + public function getLastRawResponse() + { + return $this->lastRawResponse; + } + + /** + * Get the redirections count + * + * @return int + */ + public function getRedirectionsCount() + { + return $this->redirectCounter; + } + + /** + * Set Uri (to the request) + * + * @param string|Http $uri + * @return Client + */ + public function setUri($uri) + { + if (!empty($uri)) { + // remember host of last request + $lastHost = $this->getRequest()->getUri()->getHost(); + $this->getRequest()->setUri($uri); + + // if host changed, the HTTP authentication should be cleared for security + // reasons, see #4215 for a discussion - currently authentication is also + // cleared for peer subdomains due to technical limits + $nextHost = $this->getRequest()->getUri()->getHost(); + if (!preg_match('/' . preg_quote($lastHost, '/') . '$/i', $nextHost)) { + $this->clearAuth(); + } + + // Set auth if username and password has been specified in the uri + if ($this->getUri()->getUser() && $this->getUri()->getPassword()) { + $this->setAuth($this->getUri()->getUser(), $this->getUri()->getPassword()); + } + + // We have no ports, set the defaults + if (! $this->getUri()->getPort()) { + $this->getUri()->setPort(($this->getUri()->getScheme() == 'https' ? 443 : 80)); + } + } + return $this; + } + + /** + * Get uri (from the request) + * + * @return Http + */ + public function getUri() + { + return $this->getRequest()->getUri(); + } + + /** + * Set the HTTP method (to the request) + * + * @param string $method + * @return Client + */ + public function setMethod($method) + { + $method = $this->getRequest()->setMethod($method)->getMethod(); + + if (($method == Request::METHOD_POST || $method == Request::METHOD_PUT || + $method == Request::METHOD_DELETE || $method == Request::METHOD_PATCH) + && empty($this->encType)) { + $this->setEncType(self::ENC_URLENCODED); + } + + return $this; + } + + /** + * Get the HTTP method + * + * @return string + */ + public function getMethod() + { + return $this->getRequest()->getMethod(); + } + + /** + * Set the query string argument separator + * + * @param string $argSeparator + * @return Client + */ + public function setArgSeparator($argSeparator) + { + $this->setOptions(array("argseparator" => $argSeparator)); + return $this; + } + + /** + * Get the query string argument separator + * + * @return string + */ + public function getArgSeparator() + { + $argSeparator = $this->config['argseparator']; + if (empty($argSeparator)) { + $argSeparator = ini_get('arg_separator.output'); + $this->setArgSeparator($argSeparator); + } + return $argSeparator; + } + + /** + * Set the encoding type and the boundary (if any) + * + * @param string $encType + * @param string $boundary + * @return Client + */ + public function setEncType($encType, $boundary = null) + { + if (!empty($encType)) { + if (!empty($boundary)) { + $this->encType = $encType . "; boundary={$boundary}"; + } else { + $this->encType = $encType; + } + } + return $this; + } + + /** + * Get the encoding type + * + * @return string + */ + public function getEncType() + { + return $this->encType; + } + + /** + * Set raw body (for advanced use cases) + * + * @param string $body + * @return Client + */ + public function setRawBody($body) + { + $this->getRequest()->setContent($body); + return $this; + } + + /** + * Set the POST parameters + * + * @param array $post + * @return Client + */ + public function setParameterPost(array $post) + { + $this->getRequest()->getPost()->fromArray($post); + return $this; + } + + /** + * Set the GET parameters + * + * @param array $query + * @return Client + */ + public function setParameterGet(array $query) + { + $this->getRequest()->getQuery()->fromArray($query); + return $this; + } + + /** + * Reset all the HTTP parameters (request, response, etc) + * + * @param bool $clearCookies Also clear all valid cookies? (defaults to false) + * @param bool $clearAuth Also clear http authentication? (defaults to true) + * @return Client + */ + public function resetParameters($clearCookies = false /*, $clearAuth = true */) + { + $clearAuth = true; + if (func_num_args() > 1) { + $clearAuth = func_get_arg(1); + } + + $uri = $this->getUri(); + + $this->streamName = null; + $this->encType = null; + $this->request = null; + $this->response = null; + $this->lastRawRequest = null; + $this->lastRawResponse = null; + + $this->setUri($uri); + + if ($clearCookies) { + $this->clearCookies(); + } + + if ($clearAuth) { + $this->clearAuth(); + } + + return $this; + } + + /** + * Return the current cookies + * + * @return array + */ + public function getCookies() + { + return $this->cookies; + } + + /** + * Get the cookie Id (name+domain+path) + * + * @param Header\SetCookie|Header\Cookie $cookie + * @return string|bool + */ + protected function getCookieId($cookie) + { + if (($cookie instanceof Header\SetCookie) || ($cookie instanceof Header\Cookie)) { + return $cookie->getName() . $cookie->getDomain() . $cookie->getPath(); + } + return false; + } + + /** + * Add a cookie + * + * @param array|ArrayIterator|Header\SetCookie|string $cookie + * @param string $value + * @param string $expire + * @param string $path + * @param string $domain + * @param bool $secure + * @param bool $httponly + * @param string $maxAge + * @param string $version + * @throws Exception\InvalidArgumentException + * @return Client + */ + public function addCookie($cookie, $value = null, $expire = null, $path = null, $domain = null, $secure = false, $httponly = true, $maxAge = null, $version = null) + { + if (is_array($cookie) || $cookie instanceof ArrayIterator) { + foreach ($cookie as $setCookie) { + if ($setCookie instanceof Header\SetCookie) { + $this->cookies[$this->getCookieId($setCookie)] = $setCookie; + } else { + throw new Exception\InvalidArgumentException('The cookie parameter is not a valid Set-Cookie type'); + } + } + } elseif (is_string($cookie) && $value !== null) { + $setCookie = new Header\SetCookie($cookie, $value, $expire, $path, $domain, $secure, $httponly, $maxAge, $version); + $this->cookies[$this->getCookieId($setCookie)] = $setCookie; + } elseif ($cookie instanceof Header\SetCookie) { + $this->cookies[$this->getCookieId($cookie)] = $cookie; + } else { + throw new Exception\InvalidArgumentException('Invalid parameter type passed as Cookie'); + } + return $this; + } + + /** + * Set an array of cookies + * + * @param array $cookies + * @throws Exception\InvalidArgumentException + * @return Client + */ + public function setCookies($cookies) + { + if (is_array($cookies)) { + $this->clearCookies(); + foreach ($cookies as $name => $value) { + $this->addCookie($name, $value); + } + } else { + throw new Exception\InvalidArgumentException('Invalid cookies passed as parameter, it must be an array'); + } + return $this; + } + + /** + * Clear all the cookies + */ + public function clearCookies() + { + $this->cookies = array(); + } + + /** + * Set the headers (for the request) + * + * @param Headers|array $headers + * @throws Exception\InvalidArgumentException + * @return Client + */ + public function setHeaders($headers) + { + if (is_array($headers)) { + $newHeaders = new Headers(); + $newHeaders->addHeaders($headers); + $this->getRequest()->setHeaders($newHeaders); + } elseif ($headers instanceof Headers) { + $this->getRequest()->setHeaders($headers); + } else { + throw new Exception\InvalidArgumentException('Invalid parameter headers passed'); + } + return $this; + } + + /** + * Check if exists the header type specified + * + * @param string $name + * @return bool + */ + public function hasHeader($name) + { + $headers = $this->getRequest()->getHeaders(); + + if ($headers instanceof Headers) { + return $headers->has($name); + } + + return false; + } + + /** + * Get the header value of the request + * + * @param string $name + * @return string|bool + */ + public function getHeader($name) + { + $headers = $this->getRequest()->getHeaders(); + + if ($headers instanceof Headers) { + if ($headers->get($name)) { + return $headers->get($name)->getFieldValue(); + } + } + return false; + } + + /** + * Set streaming for received data + * + * @param string|bool $streamfile Stream file, true for temp file, false/null for no streaming + * @return \Zend\Http\Client + */ + public function setStream($streamfile = true) + { + $this->setOptions(array("outputstream" => $streamfile)); + return $this; + } + + /** + * Get status of streaming for received data + * @return bool|string + */ + public function getStream() + { + if (null !== $this->streamName) { + return $this->streamName; + } + + return $this->config['outputstream']; + } + + /** + * Create temporary stream + * + * @throws Exception\RuntimeException + * @return resource + */ + protected function openTempStream() + { + $this->streamName = $this->config['outputstream']; + + if (!is_string($this->streamName)) { + // If name is not given, create temp name + $this->streamName = tempnam( + isset($this->config['streamtmpdir']) ? $this->config['streamtmpdir'] : sys_get_temp_dir(), + 'Zend\Http\Client' + ); + } + + ErrorHandler::start(); + $fp = fopen($this->streamName, "w+b"); + $error = ErrorHandler::stop(); + if (false === $fp) { + if ($this->adapter instanceof Client\Adapter\AdapterInterface) { + $this->adapter->close(); + } + throw new Exception\RuntimeException("Could not open temp file {$this->streamName}", 0, $error); + } + + return $fp; + } + + /** + * Create a HTTP authentication "Authorization:" header according to the + * specified user, password and authentication method. + * + * @param string $user + * @param string $password + * @param string $type + * @throws Exception\InvalidArgumentException + * @return Client + */ + public function setAuth($user, $password, $type = self::AUTH_BASIC) + { + if (!defined('self::AUTH_' . strtoupper($type))) { + throw new Exception\InvalidArgumentException("Invalid or not supported authentication type: '$type'"); + } + if (empty($user)) { + throw new Exception\InvalidArgumentException("The username cannot be empty"); + } + + $this->auth = array ( + 'user' => $user, + 'password' => $password, + 'type' => $type + + ); + + return $this; + } + + /** + * Clear http authentication + */ + public function clearAuth() + { + $this->auth = array(); + } + + /** + * Calculate the response value according to the HTTP authentication type + * + * @see http://www.faqs.org/rfcs/rfc2617.html + * @param string $user + * @param string $password + * @param string $type + * @param array $digest + * @param null|string $entityBody + * @throws Exception\InvalidArgumentException + * @return string|bool + */ + protected function calcAuthDigest($user, $password, $type = self::AUTH_BASIC, $digest = array(), $entityBody = null) + { + if (!defined('self::AUTH_' . strtoupper($type))) { + throw new Exception\InvalidArgumentException("Invalid or not supported authentication type: '$type'"); + } + $response = false; + switch (strtolower($type)) { + case self::AUTH_BASIC : + // In basic authentication, the user name cannot contain ":" + if (strpos($user, ':') !== false) { + throw new Exception\InvalidArgumentException("The user name cannot contain ':' in Basic HTTP authentication"); + } + $response = base64_encode($user . ':' . $password); + break; + case self::AUTH_DIGEST : + if (empty($digest)) { + throw new Exception\InvalidArgumentException("The digest cannot be empty"); + } + foreach ($digest as $key => $value) { + if (!defined('self::DIGEST_' . strtoupper($key))) { + throw new Exception\InvalidArgumentException("Invalid or not supported digest authentication parameter: '$key'"); + } + } + $ha1 = md5($user . ':' . $digest['realm'] . ':' . $password); + if (empty($digest['qop']) || strtolower($digest['qop']) == 'auth') { + $ha2 = md5($this->getMethod() . ':' . $this->getUri()->getPath()); + } elseif (strtolower($digest['qop']) == 'auth-int') { + if (empty($entityBody)) { + throw new Exception\InvalidArgumentException("I cannot use the auth-int digest authentication without the entity body"); + } + $ha2 = md5($this->getMethod() . ':' . $this->getUri()->getPath() . ':' . md5($entityBody)); + } + if (empty($digest['qop'])) { + $response = md5($ha1 . ':' . $digest['nonce'] . ':' . $ha2); + } else { + $response = md5($ha1 . ':' . $digest['nonce'] . ':' . $digest['nc'] + . ':' . $digest['cnonce'] . ':' . $digest['qoc'] . ':' . $ha2); + } + break; + } + return $response; + } + + /** + * Dispatch + * + * @param Stdlib\RequestInterface $request + * @param Stdlib\ResponseInterface $response + * @return Stdlib\ResponseInterface + */ + public function dispatch(Stdlib\RequestInterface $request, Stdlib\ResponseInterface $response = null) + { + $response = $this->send($request); + return $response; + } + + /** + * Send HTTP request + * + * @param Request $request + * @return Response + * @throws Exception\RuntimeException + * @throws Client\Exception\RuntimeException + */ + public function send(Request $request = null) + { + if ($request !== null) { + $this->setRequest($request); + } + + $this->redirectCounter = 0; + $response = null; + + $adapter = $this->getAdapter(); + + // Send the first request. If redirected, continue. + do { + // uri + $uri = $this->getUri(); + + // query + $query = $this->getRequest()->getQuery(); + + if (!empty($query)) { + $queryArray = $query->toArray(); + + if (!empty($queryArray)) { + $newUri = $uri->toString(); + $queryString = http_build_query($query, null, $this->getArgSeparator()); + + if ($this->config['rfc3986strict']) { + $queryString = str_replace('+', '%20', $queryString); + } + + if (strpos($newUri, '?') !== false) { + $newUri .= $this->getArgSeparator() . $queryString; + } else { + $newUri .= '?' . $queryString; + } + + $uri = new Http($newUri); + } + } + // If we have no ports, set the defaults + if (!$uri->getPort()) { + $uri->setPort($uri->getScheme() == 'https' ? 443 : 80); + } + + // method + $method = $this->getRequest()->getMethod(); + + // body + $body = $this->prepareBody(); + + // headers + $headers = $this->prepareHeaders($body, $uri); + + $secure = $uri->getScheme() == 'https'; + + // cookies + $cookie = $this->prepareCookies($uri->getHost(), $uri->getPath(), $secure); + if ($cookie->getFieldValue()) { + $headers['Cookie'] = $cookie->getFieldValue(); + } + + // check that adapter supports streaming before using it + if (is_resource($body) && !($adapter instanceof Client\Adapter\StreamInterface)) { + throw new Client\Exception\RuntimeException('Adapter does not support streaming'); + } + + // calling protected method to allow extending classes + // to wrap the interaction with the adapter + $response = $this->doRequest($uri, $method, $secure, $headers, $body); + + if (! $response) { + throw new Exception\RuntimeException('Unable to read response, or response is empty'); + } + + if ($this->config['storeresponse']) { + $this->lastRawResponse = $response; + } else { + $this->lastRawResponse = null; + } + + if ($this->config['outputstream']) { + $stream = $this->getStream(); + if (!is_resource($stream) && is_string($stream)) { + $stream = fopen($stream, 'r'); + } + $streamMetaData = stream_get_meta_data($stream); + if ($streamMetaData['seekable']) { + rewind($stream); + } + // cleanup the adapter + $adapter->setOutputStream(null); + $response = Response\Stream::fromStream($response, $stream); + $response->setStreamName($this->streamName); + if (!is_string($this->config['outputstream'])) { + // we used temp name, will need to clean up + $response->setCleanup(true); + } + } else { + $response = $this->getResponse()->fromString($response); + } + + // Get the cookies from response (if any) + $setCookies = $response->getCookie(); + if (!empty($setCookies)) { + $this->addCookie($setCookies); + } + + // If we got redirected, look for the Location header + if ($response->isRedirect() && ($response->getHeaders()->has('Location'))) { + + // Avoid problems with buggy servers that add whitespace at the + // end of some headers + $location = trim($response->getHeaders()->get('Location')->getFieldValue()); + + // Check whether we send the exact same request again, or drop the parameters + // and send a GET request + if ($response->getStatusCode() == 303 || + ((! $this->config['strictredirects']) && ($response->getStatusCode() == 302 || + $response->getStatusCode() == 301))) { + + $this->resetParameters(false, false); + $this->setMethod(Request::METHOD_GET); + } + + + // If we got a well formed absolute URI + if (($scheme = substr($location, 0, 6)) && + ($scheme == 'http:/' || $scheme == 'https:')) { + // setURI() clears parameters if host changed, see #4215 + $this->setUri($location); + } else { + + // Split into path and query and set the query + if (strpos($location, '?') !== false) { + list($location, $query) = explode('?', $location, 2); + } else { + $query = ''; + } + $this->getUri()->setQuery($query); + + // Else, if we got just an absolute path, set it + if (strpos($location, '/') === 0) { + $this->getUri()->setPath($location); + // Else, assume we have a relative path + } else { + // Get the current path directory, removing any trailing slashes + $path = $this->getUri()->getPath(); + $path = rtrim(substr($path, 0, strrpos($path, '/')), "/"); + $this->getUri()->setPath($path . '/' . $location); + } + } + ++$this->redirectCounter; + + } else { + // If we didn't get any location, stop redirecting + break; + } + + } while ($this->redirectCounter <= $this->config['maxredirects']); + + $this->response = $response; + return $response; + } + + /** + * Fully reset the HTTP client (auth, cookies, request, response, etc.) + * + * @return Client + */ + public function reset() + { + $this->resetParameters(); + $this->clearAuth(); + $this->clearCookies(); + + return $this; + } + + /** + * Set a file to upload (using a POST request) + * + * Can be used in two ways: + * + * 1. $data is null (default): $filename is treated as the name if a local file which + * will be read and sent. Will try to guess the content type using mime_content_type(). + * 2. $data is set - $filename is sent as the file name, but $data is sent as the file + * contents and no file is read from the file system. In this case, you need to + * manually set the Content-Type ($ctype) or it will default to + * application/octet-stream. + * + * @param string $filename Name of file to upload, or name to save as + * @param string $formname Name of form element to send as + * @param string $data Data to send (if null, $filename is read and sent) + * @param string $ctype Content type to use (if $data is set and $ctype is + * null, will be application/octet-stream) + * @return Client + * @throws Exception\RuntimeException + */ + public function setFileUpload($filename, $formname, $data = null, $ctype = null) + { + if ($data === null) { + ErrorHandler::start(); + $data = file_get_contents($filename); + $error = ErrorHandler::stop(); + if ($data === false) { + throw new Exception\RuntimeException("Unable to read file '{$filename}' for upload", 0, $error); + } + if (!$ctype) { + $ctype = $this->detectFileMimeType($filename); + } + } + + $this->getRequest()->getFiles()->set($filename, array( + 'formname' => $formname, + 'filename' => basename($filename), + 'ctype' => $ctype, + 'data' => $data + )); + + return $this; + } + + /** + * Remove a file to upload + * + * @param string $filename + * @return bool + */ + public function removeFileUpload($filename) + { + $file = $this->getRequest()->getFiles()->get($filename); + if (!empty($file)) { + $this->getRequest()->getFiles()->set($filename, null); + return true; + } + return false; + } + + /** + * Prepare Cookies + * + * @param string $domain + * @param string $path + * @param bool $secure + * @return Header\Cookie|bool + */ + protected function prepareCookies($domain, $path, $secure) + { + $validCookies = array(); + + if (!empty($this->cookies)) { + foreach ($this->cookies as $id => $cookie) { + if ($cookie->isExpired()) { + unset($this->cookies[$id]); + continue; + } + + if ($cookie->isValidForRequest($domain, $path, $secure)) { + // OAM hack some domains try to set the cookie multiple times + $validCookies[$cookie->getName()] = $cookie; + } + } + } + + $cookies = Header\Cookie::fromSetCookieArray($validCookies); + $cookies->setEncodeValue($this->config['encodecookies']); + + return $cookies; + } + + /** + * Prepare the request headers + * + * @param resource|string $body + * @param Http $uri + * @throws Exception\RuntimeException + * @return array + */ + protected function prepareHeaders($body, $uri) + { + $headers = array(); + + // Set the host header + if ($this->config['httpversion'] == Request::VERSION_11) { + $host = $uri->getHost(); + // If the port is not default, add it + if (!(($uri->getScheme() == 'http' && $uri->getPort() == 80) || + ($uri->getScheme() == 'https' && $uri->getPort() == 443))) { + $host .= ':' . $uri->getPort(); + } + + $headers['Host'] = $host; + } + + // Set the connection header + if (!$this->getRequest()->getHeaders()->has('Connection')) { + if (!$this->config['keepalive']) { + $headers['Connection'] = 'close'; + } + } + + // Set the Accept-encoding header if not set - depending on whether + // zlib is available or not. + if (!$this->getRequest()->getHeaders()->has('Accept-Encoding')) { + if (function_exists('gzinflate')) { + $headers['Accept-Encoding'] = 'gzip, deflate'; + } else { + $headers['Accept-Encoding'] = 'identity'; + } + } + + + // Set the user agent header + if (!$this->getRequest()->getHeaders()->has('User-Agent') && isset($this->config['useragent'])) { + $headers['User-Agent'] = $this->config['useragent']; + } + + // Set HTTP authentication if needed + if (!empty($this->auth)) { + switch ($this->auth['type']) { + case self::AUTH_BASIC : + $auth = $this->calcAuthDigest($this->auth['user'], $this->auth['password'], $this->auth['type']); + if ($auth !== false) { + $headers['Authorization'] = 'Basic ' . $auth; + } + break; + case self::AUTH_DIGEST : + throw new Exception\RuntimeException("The digest authentication is not implemented yet"); + } + } + + // Content-type + $encType = $this->getEncType(); + if (!empty($encType)) { + $headers['Content-Type'] = $encType; + } + + if (!empty($body)) { + if (is_resource($body)) { + $fstat = fstat($body); + $headers['Content-Length'] = $fstat['size']; + } else { + $headers['Content-Length'] = strlen($body); + } + } + + // Merge the headers of the request (if any) + // here we need right 'http field' and not lowercase letters + $requestHeaders = $this->getRequest()->getHeaders(); + foreach ($requestHeaders as $requestHeaderElement) { + $headers[$requestHeaderElement->getFieldName()] = $requestHeaderElement->getFieldValue(); + } + return $headers; + } + + + /** + * Prepare the request body (for PATCH, POST and PUT requests) + * + * @return string + * @throws \Zend\Http\Client\Exception\RuntimeException + */ + protected function prepareBody() + { + // According to RFC2616, a TRACE request should not have a body. + if ($this->getRequest()->isTrace()) { + return ''; + } + + $rawBody = $this->getRequest()->getContent(); + if (!empty($rawBody)) { + return $rawBody; + } + + $body = ''; + $totalFiles = 0; + + if (!$this->getRequest()->getHeaders()->has('Content-Type')) { + $totalFiles = count($this->getRequest()->getFiles()->toArray()); + // If we have files to upload, force encType to multipart/form-data + if ($totalFiles > 0) { + $this->setEncType(self::ENC_FORMDATA); + } + } else { + $this->setEncType($this->getHeader('Content-Type')); + } + + // If we have POST parameters or files, encode and add them to the body + if (count($this->getRequest()->getPost()->toArray()) > 0 || $totalFiles > 0) { + if (stripos($this->getEncType(), self::ENC_FORMDATA) === 0) { + $boundary = '---ZENDHTTPCLIENT-' . md5(microtime()); + $this->setEncType(self::ENC_FORMDATA, $boundary); + + // Get POST parameters and encode them + $params = self::flattenParametersArray($this->getRequest()->getPost()->toArray()); + foreach ($params as $pp) { + $body .= $this->encodeFormData($boundary, $pp[0], $pp[1]); + } + + // Encode files + foreach ($this->getRequest()->getFiles()->toArray() as $file) { + $fhead = array('Content-Type' => $file['ctype']); + $body .= $this->encodeFormData($boundary, $file['formname'], $file['data'], $file['filename'], $fhead); + } + $body .= "--{$boundary}--\r\n"; + } elseif (stripos($this->getEncType(), self::ENC_URLENCODED) === 0) { + // Encode body as application/x-www-form-urlencoded + $body = http_build_query($this->getRequest()->getPost()->toArray()); + } else { + throw new Client\Exception\RuntimeException("Cannot handle content type '{$this->encType}' automatically"); + } + } + + return $body; + } + + + /** + * Attempt to detect the MIME type of a file using available extensions + * + * This method will try to detect the MIME type of a file. If the fileinfo + * extension is available, it will be used. If not, the mime_magic + * extension which is deprecated but is still available in many PHP setups + * will be tried. + * + * If neither extension is available, the default application/octet-stream + * MIME type will be returned + * + * @param string $file File path + * @return string MIME type + */ + protected function detectFileMimeType($file) + { + $type = null; + + // First try with fileinfo functions + if (function_exists('finfo_open')) { + if (static::$fileInfoDb === null) { + ErrorHandler::start(); + static::$fileInfoDb = finfo_open(FILEINFO_MIME); + ErrorHandler::stop(); + } + + if (static::$fileInfoDb) { + $type = finfo_file(static::$fileInfoDb, $file); + } + + } elseif (function_exists('mime_content_type')) { + $type = mime_content_type($file); + } + + // Fallback to the default application/octet-stream + if (! $type) { + $type = 'application/octet-stream'; + } + + return $type; + } + + /** + * Encode data to a multipart/form-data part suitable for a POST request. + * + * @param string $boundary + * @param string $name + * @param mixed $value + * @param string $filename + * @param array $headers Associative array of optional headers @example ("Content-Transfer-Encoding" => "binary") + * @return string + */ + public function encodeFormData($boundary, $name, $value, $filename = null, $headers = array()) + { + $ret = "--{$boundary}\r\n" . + 'Content-Disposition: form-data; name="' . $name . '"'; + + if ($filename) { + $ret .= '; filename="' . $filename . '"'; + } + $ret .= "\r\n"; + + foreach ($headers as $hname => $hvalue) { + $ret .= "{$hname}: {$hvalue}\r\n"; + } + $ret .= "\r\n"; + $ret .= "{$value}\r\n"; + + return $ret; + } + + /** + * Convert an array of parameters into a flat array of (key, value) pairs + * + * Will flatten a potentially multi-dimentional array of parameters (such + * as POST parameters) into a flat array of (key, value) paris. In case + * of multi-dimentional arrays, square brackets ([]) will be added to the + * key to indicate an array. + * + * @since 1.9 + * + * @param array $parray + * @param string $prefix + * @return array + */ + protected function flattenParametersArray($parray, $prefix = null) + { + if (!is_array($parray)) { + return $parray; + } + + $parameters = array(); + + foreach ($parray as $name => $value) { + // Calculate array key + if ($prefix) { + if (is_int($name)) { + $key = $prefix . '[]'; + } else { + $key = $prefix . "[$name]"; + } + } else { + $key = $name; + } + + if (is_array($value)) { + $parameters = array_merge($parameters, $this->flattenParametersArray($value, $key)); + + } else { + $parameters[] = array($key, $value); + } + } + + return $parameters; + } + + /** + * Separating this from send method allows subclasses to wrap + * the interaction with the adapter + * + * @param Http $uri + * @param string $method + * @param bool $secure + * @param array $headers + * @param string $body + * @return string the raw response + * @throws Exception\RuntimeException + */ + protected function doRequest(Http $uri, $method, $secure = false, $headers = array(), $body = '') + { + // Open the connection, send the request and read the response + $this->adapter->connect($uri->getHost(), $uri->getPort(), $secure); + + if ($this->config['outputstream']) { + if ($this->adapter instanceof Client\Adapter\StreamInterface) { + $stream = $this->openTempStream(); + $this->adapter->setOutputStream($stream); + } else { + throw new Exception\RuntimeException('Adapter does not support streaming'); + } + } + // HTTP connection + $this->lastRawRequest = $this->adapter->write($method, + $uri, $this->config['httpversion'], $headers, $body); + + return $this->adapter->read(); + } + + /** + * Create a HTTP authentication "Authorization:" header according to the + * specified user, password and authentication method. + * + * @see http://www.faqs.org/rfcs/rfc2617.html + * @param string $user + * @param string $password + * @param string $type + * @return string + * @throws Client\Exception\InvalidArgumentException + */ + public static function encodeAuthHeader($user, $password, $type = self::AUTH_BASIC) + { + $authHeader = null; + + switch ($type) { + case self::AUTH_BASIC: + // In basic authentication, the user name cannot contain ":" + if (strpos($user, ':') !== false) { + throw new Client\Exception\InvalidArgumentException("The user name cannot contain ':' in 'Basic' HTTP authentication"); + } + + $authHeader = 'Basic ' . base64_encode($user . ':' . $password); + break; + + //case self::AUTH_DIGEST: + /** + * @todo Implement digest authentication + */ + // break; + + default: + throw new Client\Exception\InvalidArgumentException("Not a supported HTTP authentication type: '$type'"); + + } + return $authHeader; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/AdapterInterface.php b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/AdapterInterface.php new file mode 100644 index 0000000000..9e423ebbe7 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/AdapterInterface.php @@ -0,0 +1,60 @@ +invalidOverwritableCurlOptions = array( + CURLOPT_HTTPGET, + CURLOPT_POST, + CURLOPT_UPLOAD, + CURLOPT_CUSTOMREQUEST, + CURLOPT_HEADER, + CURLOPT_RETURNTRANSFER, + CURLOPT_HTTPHEADER, + CURLOPT_POSTFIELDS, + CURLOPT_INFILE, + CURLOPT_INFILESIZE, + CURLOPT_PORT, + CURLOPT_MAXREDIRS, + CURLOPT_CONNECTTIMEOUT, + CURL_HTTP_VERSION_1_1, + CURL_HTTP_VERSION_1_0, + ); + } + + /** + * Set the configuration array for the adapter + * + * @param array|Traversable $options + * @return Curl + * @throws AdapterException\InvalidArgumentException + */ + public function setOptions($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (!is_array($options)) { + throw new AdapterException\InvalidArgumentException( + 'Array or Traversable object expected, got ' . gettype($options) + ); + } + + /** Config Key Normalization */ + foreach ($options as $k => $v) { + unset($options[$k]); // unset original value + $options[str_replace(array('-', '_', ' ', '.'), '', strtolower($k))] = $v; // replace w/ normalized + } + + if (isset($options['proxyuser']) && isset($options['proxypass'])) { + $this->setCurlOption(CURLOPT_PROXYUSERPWD, $options['proxyuser'] . ":" . $options['proxypass']); + unset($options['proxyuser'], $options['proxypass']); + } + + foreach ($options as $k => $v) { + $option = strtolower($k); + switch ($option) { + case 'proxyhost': + $this->setCurlOption(CURLOPT_PROXY, $v); + break; + case 'proxyport': + $this->setCurlOption(CURLOPT_PROXYPORT, $v); + break; + default: + if (is_array($v) && isset($this->config[$option]) && is_array($this->config[$option])) { + $v = ArrayUtils::merge($this->config[$option], $v); + } + $this->config[$option] = $v; + break; + } + } + + return $this; + } + + /** + * Retrieve the array of all configuration options + * + * @return array + */ + public function getConfig() + { + return $this->config; + } + + /** + * Direct setter for cURL adapter related options. + * + * @param string|int $option + * @param mixed $value + * @return Curl + */ + public function setCurlOption($option, $value) + { + if (!isset($this->config['curloptions'])) { + $this->config['curloptions'] = array(); + } + $this->config['curloptions'][$option] = $value; + return $this; + } + + /** + * Initialize curl + * + * @param string $host + * @param int $port + * @param bool $secure + * @return void + * @throws AdapterException\RuntimeException if unable to connect + */ + public function connect($host, $port = 80, $secure = false) + { + // If we're already connected, disconnect first + if ($this->curl) { + $this->close(); + } + + // If we are connected to a different server or port, disconnect first + if ($this->curl + && is_array($this->connectedTo) + && ($this->connectedTo[0] != $host + || $this->connectedTo[1] != $port) + ) { + $this->close(); + } + + // Do the actual connection + $this->curl = curl_init(); + if ($port != 80) { + curl_setopt($this->curl, CURLOPT_PORT, intval($port)); + } + + if (isset($this->config['timeout'])) { + // Set timeout + curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, $this->config['timeout']); + } + + if (isset($this->config['maxredirects'])) { + // Set Max redirects + curl_setopt($this->curl, CURLOPT_MAXREDIRS, $this->config['maxredirects']); + } + + if (!$this->curl) { + $this->close(); + + throw new AdapterException\RuntimeException('Unable to Connect to ' . $host . ':' . $port); + } + + if ($secure !== false) { + // Behave the same like Zend\Http\Adapter\Socket on SSL options. + if (isset($this->config['sslcert'])) { + curl_setopt($this->curl, CURLOPT_SSLCERT, $this->config['sslcert']); + } + if (isset($this->config['sslpassphrase'])) { + curl_setopt($this->curl, CURLOPT_SSLCERTPASSWD, $this->config['sslpassphrase']); + } + } + + // Update connected_to + $this->connectedTo = array($host, $port); + } + + /** + * Send request to the remote server + * + * @param string $method + * @param \Zend\Uri\Uri $uri + * @param float $httpVersion + * @param array $headers + * @param string $body + * @return string $request + * @throws AdapterException\RuntimeException If connection fails, connected to wrong host, no PUT file defined, unsupported method, or unsupported cURL option + * @throws AdapterException\InvalidArgumentException if $method is currently not supported + */ + public function write($method, $uri, $httpVersion = 1.1, $headers = array(), $body = '') + { + // Make sure we're properly connected + if (!$this->curl) { + throw new AdapterException\RuntimeException("Trying to write but we are not connected"); + } + + if ($this->connectedTo[0] != $uri->getHost() || $this->connectedTo[1] != $uri->getPort()) { + throw new AdapterException\RuntimeException("Trying to write but we are connected to the wrong host"); + } + + // set URL + curl_setopt($this->curl, CURLOPT_URL, $uri->__toString()); + + // ensure correct curl call + $curlValue = true; + switch ($method) { + case 'GET' : + $curlMethod = CURLOPT_HTTPGET; + break; + + case 'POST' : + $curlMethod = CURLOPT_POST; + break; + + case 'PUT' : + // There are two different types of PUT request, either a Raw Data string has been set + // or CURLOPT_INFILE and CURLOPT_INFILESIZE are used. + if (is_resource($body)) { + $this->config['curloptions'][CURLOPT_INFILE] = $body; + } + if (isset($this->config['curloptions'][CURLOPT_INFILE])) { + // Now we will probably already have Content-Length set, so that we have to delete it + // from $headers at this point: + if (!isset($headers['Content-Length']) + && !isset($this->config['curloptions'][CURLOPT_INFILESIZE]) + ) { + throw new AdapterException\RuntimeException("Cannot set a file-handle for cURL option CURLOPT_INFILE without also setting its size in CURLOPT_INFILESIZE."); + } + + if (isset($headers['Content-Length'])) { + $this->config['curloptions'][CURLOPT_INFILESIZE] = (int) $headers['Content-Length']; + unset($headers['Content-Length']); + } + + if (is_resource($body)) { + $body = ''; + } + + $curlMethod = CURLOPT_UPLOAD; + } else { + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "PUT"; + } + break; + + case 'PATCH' : + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "PATCH"; + break; + + case 'DELETE' : + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "DELETE"; + break; + + case 'OPTIONS' : + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "OPTIONS"; + break; + + case 'TRACE' : + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "TRACE"; + break; + + case 'HEAD' : + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "HEAD"; + break; + + default: + // For now, through an exception for unsupported request methods + throw new AdapterException\InvalidArgumentException("Method '$method' currently not supported"); + } + + if (is_resource($body) && $curlMethod != CURLOPT_UPLOAD) { + throw new AdapterException\RuntimeException("Streaming requests are allowed only with PUT"); + } + + // get http version to use + $curlHttp = ($httpVersion == 1.1) ? CURL_HTTP_VERSION_1_1 : CURL_HTTP_VERSION_1_0; + + // mark as HTTP request and set HTTP method + curl_setopt($this->curl, $curlHttp, true); + curl_setopt($this->curl, $curlMethod, $curlValue); + + if ($this->outputStream) { + // headers will be read into the response + curl_setopt($this->curl, CURLOPT_HEADER, false); + curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, array($this, "readHeader")); + // and data will be written into the file + curl_setopt($this->curl, CURLOPT_FILE, $this->outputStream); + } else { + // ensure headers are also returned + curl_setopt($this->curl, CURLOPT_HEADER, true); + + // ensure actual response is returned + curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); + } + + // Treating basic auth headers in a special way + if (array_key_exists('Authorization', $headers) && 'Basic' == substr($headers['Authorization'], 0, 5)) { + curl_setopt($this->curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($this->curl, CURLOPT_USERPWD, base64_decode(substr($headers['Authorization'], 6))); + unset($headers['Authorization']); + } + + // set additional headers + if (!isset($headers['Accept'])) { + $headers['Accept'] = ''; + } + $curlHeaders = array(); + foreach ($headers as $key => $value) { + $curlHeaders[] = $key . ': ' . $value; + } + + curl_setopt($this->curl, CURLOPT_HTTPHEADER, $curlHeaders); + + /** + * Make sure POSTFIELDS is set after $curlMethod is set: + * @link http://de2.php.net/manual/en/function.curl-setopt.php#81161 + */ + if ($method == 'POST') { + curl_setopt($this->curl, CURLOPT_POSTFIELDS, $body); + } elseif ($curlMethod == CURLOPT_UPLOAD) { + // this covers a PUT by file-handle: + // Make the setting of this options explicit (rather than setting it through the loop following a bit lower) + // to group common functionality together. + curl_setopt($this->curl, CURLOPT_INFILE, $this->config['curloptions'][CURLOPT_INFILE]); + curl_setopt($this->curl, CURLOPT_INFILESIZE, $this->config['curloptions'][CURLOPT_INFILESIZE]); + unset($this->config['curloptions'][CURLOPT_INFILE]); + unset($this->config['curloptions'][CURLOPT_INFILESIZE]); + } elseif ($method == 'PUT') { + // This is a PUT by a setRawData string, not by file-handle + curl_setopt($this->curl, CURLOPT_POSTFIELDS, $body); + } elseif ($method == 'PATCH') { + curl_setopt($this->curl, CURLOPT_POSTFIELDS, $body); + } + + // set additional curl options + if (isset($this->config['curloptions'])) { + foreach ((array) $this->config['curloptions'] as $k => $v) { + if (!in_array($k, $this->invalidOverwritableCurlOptions)) { + if (curl_setopt($this->curl, $k, $v) == false) { + throw new AdapterException\RuntimeException(sprintf("Unknown or erroreous cURL option '%s' set", $k)); + } + } + } + } + + // send the request + + $response = curl_exec($this->curl); + // if we used streaming, headers are already there + if (!is_resource($this->outputStream)) { + $this->response = $response; + } + + $request = curl_getinfo($this->curl, CURLINFO_HEADER_OUT); + $request .= $body; + + if (empty($this->response)) { + throw new AdapterException\RuntimeException("Error in cURL request: " . curl_error($this->curl)); + } + + // cURL automatically decodes chunked-messages, this means we have to disallow the Zend\Http\Response to do it again + if (stripos($this->response, "Transfer-Encoding: chunked\r\n")) { + $this->response = str_ireplace("Transfer-Encoding: chunked\r\n", '', $this->response); + } + + // cURL can automatically handle content encoding; prevent double-decoding from occurring + if (isset($this->config['curloptions'][CURLOPT_ENCODING]) + && '' == $this->config['curloptions'][CURLOPT_ENCODING] + && stripos($this->response, "Content-Encoding: gzip\r\n") + ) { + $this->response = str_ireplace("Content-Encoding: gzip\r\n", '', $this->response); + } + + // Eliminate multiple HTTP responses. + do { + $parts = preg_split('|(?:\r?\n){2}|m', $this->response, 2); + $again = false; + + if (isset($parts[1]) && preg_match("|^HTTP/1\.[01](.*?)\r\n|mi", $parts[1])) { + $this->response = $parts[1]; + $again = true; + } + } while ($again); + + // cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string: + if (stripos($this->response, "HTTP/1.0 200 Connection established\r\n\r\n") !== false) { + $this->response = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $this->response); + } + + return $request; + } + + /** + * Return read response from server + * + * @return string + */ + public function read() + { + return $this->response; + } + + /** + * Close the connection to the server + * + */ + public function close() + { + if (is_resource($this->curl)) { + curl_close($this->curl); + } + $this->curl = null; + $this->connectedTo = array(null, null); + } + + /** + * Get cUrl Handle + * + * @return resource + */ + public function getHandle() + { + return $this->curl; + } + + /** + * Set output stream for the response + * + * @param resource $stream + * @return Curl + */ + public function setOutputStream($stream) + { + $this->outputStream = $stream; + return $this; + } + + /** + * Header reader function for CURL + * + * @param resource $curl + * @param string $header + * @return int + */ + public function readHeader($curl, $header) + { + $this->response .= $header; + return strlen($header); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/Exception/ExceptionInterface.php b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..1190599934 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/Exception/ExceptionInterface.php @@ -0,0 +1,15 @@ + 'ssl', + 'sslcert' => null, + 'sslpassphrase' => null, + 'sslverifypeer' => true, + 'sslcapath' => null, + 'sslallowselfsigned' => false, + 'sslusecontext' => false, + 'proxy_host' => '', + 'proxy_port' => 8080, + 'proxy_user' => '', + 'proxy_pass' => '', + 'proxy_auth' => Client::AUTH_BASIC, + 'persistent' => false + ); + + /** + * Whether HTTPS CONNECT was already negotiated with the proxy or not + * + * @var bool + */ + protected $negotiated = false; + + /** + * Set the configuration array for the adapter + * + * @param array $options + */ + public function setOptions($options = array()) + { + //enforcing that the proxy keys are set in the form proxy_* + foreach ($options as $k => $v) { + if (preg_match("/^proxy[a-z]+/", $k)) { + $options['proxy_' . substr($k, 5, strlen($k))] = $v; + unset($options[$k]); + } + } + + parent::setOptions($options); + } + + /** + * Connect to the remote server + * + * Will try to connect to the proxy server. If no proxy was set, will + * fall back to the target server (behave like regular Socket adapter) + * + * @param string $host + * @param int $port + * @param bool $secure + * @throws AdapterException\RuntimeException + */ + public function connect($host, $port = 80, $secure = false) + { + // If no proxy is set, fall back to Socket adapter + if (! $this->config['proxy_host']) { + parent::connect($host, $port, $secure); + return; + } + + /* Url might require stream context even if proxy connection doesn't */ + if ($secure) { + $this->config['sslusecontext'] = true; + } + + // Connect (a non-secure connection) to the proxy server + parent::connect( + $this->config['proxy_host'], + $this->config['proxy_port'], + false + ); + } + + /** + * Send request to the proxy server + * + * @param string $method + * @param \Zend\Uri\Uri $uri + * @param string $httpVer + * @param array $headers + * @param string $body + * @throws AdapterException\RuntimeException + * @return string Request as string + */ + public function write($method, $uri, $httpVer = '1.1', $headers = array(), $body = '') + { + // If no proxy is set, fall back to default Socket adapter + if (! $this->config['proxy_host']) return parent::write($method, $uri, $httpVer, $headers, $body); + + // Make sure we're properly connected + if (! $this->socket) { + throw new AdapterException\RuntimeException("Trying to write but we are not connected"); + } + + $host = $this->config['proxy_host']; + $port = $this->config['proxy_port']; + + if ($this->connectedTo[0] != "tcp://$host" || $this->connectedTo[1] != $port) { + throw new AdapterException\RuntimeException("Trying to write but we are connected to the wrong proxy server"); + } + + // Add Proxy-Authorization header + if ($this->config['proxy_user'] && ! isset($headers['proxy-authorization'])) { + $headers['proxy-authorization'] = Client::encodeAuthHeader( + $this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth'] + ); + } + + // if we are proxying HTTPS, preform CONNECT handshake with the proxy + if ($uri->getScheme() == 'https' && (! $this->negotiated)) { + $this->connectHandshake($uri->getHost(), $uri->getPort(), $httpVer, $headers); + $this->negotiated = true; + } + + // Save request method for later + $this->method = $method; + + // Build request headers + if ($this->negotiated) { + $path = $uri->getPath(); + if ($uri->getQuery()) { + $path .= '?' . $uri->getQuery(); + } + $request = "$method $path HTTP/$httpVer\r\n"; + } else { + $request = "$method $uri HTTP/$httpVer\r\n"; + } + + // Add all headers to the request string + foreach ($headers as $k => $v) { + if (is_string($k)) $v = "$k: $v"; + $request .= "$v\r\n"; + } + + if (is_resource($body)) { + $request .= "\r\n"; + } else { + // Add the request body + $request .= "\r\n" . $body; + } + + // Send the request + ErrorHandler::start(); + $test = fwrite($this->socket, $request); + $error = ErrorHandler::stop(); + if (!$test) { + throw new AdapterException\RuntimeException("Error writing request to proxy server", 0, $error); + } + + if (is_resource($body)) { + if (stream_copy_to_stream($body, $this->socket) == 0) { + throw new AdapterException\RuntimeException('Error writing request to server'); + } + } + + return $request; + } + + /** + * Preform handshaking with HTTPS proxy using CONNECT method + * + * @param string $host + * @param int $port + * @param string $httpVer + * @param array $headers + * @throws AdapterException\RuntimeException + */ + protected function connectHandshake($host, $port = 443, $httpVer = '1.1', array &$headers = array()) + { + $request = "CONNECT $host:$port HTTP/$httpVer\r\n" . + "Host: " . $this->config['proxy_host'] . "\r\n"; + + // Add the user-agent header + if (isset($this->config['useragent'])) { + $request .= "User-agent: " . $this->config['useragent'] . "\r\n"; + } + + // If the proxy-authorization header is set, send it to proxy but remove + // it from headers sent to target host + if (isset($headers['proxy-authorization'])) { + $request .= "Proxy-authorization: " . $headers['proxy-authorization'] . "\r\n"; + unset($headers['proxy-authorization']); + } + + $request .= "\r\n"; + + // Send the request + ErrorHandler::start(); + $test = fwrite($this->socket, $request); + $error = ErrorHandler::stop(); + if (!$test) { + throw new AdapterException\RuntimeException("Error writing request to proxy server", 0, $error); + } + + // Read response headers only + $response = ''; + $gotStatus = false; + ErrorHandler::start(); + while ($line = fgets($this->socket)) { + $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); + if ($gotStatus) { + $response .= $line; + if (!rtrim($line)) break; + } + } + ErrorHandler::stop(); + + // Check that the response from the proxy is 200 + if (Response::extractCode($response) != 200) { + throw new AdapterException\RuntimeException("Unable to connect to HTTPS proxy. Server response: " . $response); + } + + // If all is good, switch socket to secure mode. We have to fall back + // through the different modes + $modes = array( + STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_SSLv3_CLIENT, + STREAM_CRYPTO_METHOD_SSLv23_CLIENT, + STREAM_CRYPTO_METHOD_SSLv2_CLIENT + ); + + $success = false; + foreach ($modes as $mode) { + $success = stream_socket_enable_crypto($this->socket, true, $mode); + if ($success) break; + } + + if (! $success) { + throw new AdapterException\RuntimeException("Unable to connect to" . + " HTTPS server through proxy: could not negotiate secure connection."); + } + } + + /** + * Close the connection to the server + * + */ + public function close() + { + parent::close(); + $this->negotiated = false; + } + + /** + * Destructor: make sure the socket is disconnected + * + */ + public function __destruct() + { + if ($this->socket) $this->close(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/Socket.php b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/Socket.php new file mode 100644 index 0000000000..8ef2415155 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/Socket.php @@ -0,0 +1,630 @@ + STREAM_CRYPTO_METHOD_SSLv23_CLIENT, + 'sslv2' => STREAM_CRYPTO_METHOD_SSLv2_CLIENT, + 'sslv3' => STREAM_CRYPTO_METHOD_SSLv3_CLIENT, + 'tls' => STREAM_CRYPTO_METHOD_TLS_CLIENT + ); + + /** + * The socket for server connection + * + * @var resource|null + */ + protected $socket = null; + + /** + * What host/port are we connected to? + * + * @var array + */ + protected $connectedTo = array(null, null); + + /** + * Stream for storing output + * + * @var resource + */ + protected $outStream = null; + + /** + * Parameters array + * + * @var array + */ + protected $config = array( + 'persistent' => false, + 'ssltransport' => 'ssl', + 'sslcert' => null, + 'sslpassphrase' => null, + 'sslverifypeer' => true, + 'sslcafile' => null, + 'sslcapath' => null, + 'sslallowselfsigned' => false, + 'sslusecontext' => false + ); + + /** + * Request method - will be set by write() and might be used by read() + * + * @var string + */ + protected $method = null; + + /** + * Stream context + * + * @var resource + */ + protected $context = null; + + /** + * Adapter constructor, currently empty. Config is set using setOptions() + * + */ + public function __construct() + { + } + + /** + * Set the configuration array for the adapter + * + * @param array|Traversable $options + * @throws AdapterException\InvalidArgumentException + */ + public function setOptions($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (!is_array($options)) { + throw new AdapterException\InvalidArgumentException( + 'Array or Zend\Config object expected, got ' . gettype($options) + ); + } + + foreach ($options as $k => $v) { + $this->config[strtolower($k)] = $v; + } + } + + /** + * Retrieve the array of all configuration options + * + * @return array + */ + public function getConfig() + { + return $this->config; + } + + /** + * Set the stream context for the TCP connection to the server + * + * Can accept either a pre-existing stream context resource, or an array + * of stream options, similar to the options array passed to the + * stream_context_create() PHP function. In such case a new stream context + * will be created using the passed options. + * + * @since Zend Framework 1.9 + * + * @param mixed $context Stream context or array of context options + * @throws Exception\InvalidArgumentException + * @return Socket + */ + public function setStreamContext($context) + { + if (is_resource($context) && get_resource_type($context) == 'stream-context') { + $this->context = $context; + + } elseif (is_array($context)) { + $this->context = stream_context_create($context); + + } else { + // Invalid parameter + throw new AdapterException\InvalidArgumentException( + "Expecting either a stream context resource or array, got " . gettype($context) + ); + } + + return $this; + } + + /** + * Get the stream context for the TCP connection to the server. + * + * If no stream context is set, will create a default one. + * + * @return resource + */ + public function getStreamContext() + { + if (! $this->context) { + $this->context = stream_context_create(); + } + + return $this->context; + } + + /** + * Connect to the remote server + * + * @param string $host + * @param int $port + * @param bool $secure + * @throws AdapterException\RuntimeException + */ + public function connect($host, $port = 80, $secure = false) + { + // If we are connected to the wrong host, disconnect first + $connectedHost = (strpos($this->connectedTo[0], '://')) + ? substr($this->connectedTo[0], (strpos($this->connectedTo[0], '://') + 3), strlen($this->connectedTo[0])) + : $this->connectedTo[0]; + + if ($connectedHost != $host || $this->connectedTo[1] != $port) { + if (is_resource($this->socket)) { + $this->close(); + } + } + + // Now, if we are not connected, connect + if (!is_resource($this->socket) || ! $this->config['keepalive']) { + $context = $this->getStreamContext(); + + if ($secure || $this->config['sslusecontext']) { + if ($this->config['sslverifypeer'] !== null) { + if (!stream_context_set_option($context, 'ssl', 'verify_peer', $this->config['sslverifypeer'])) { + throw new AdapterException\RuntimeException('Unable to set sslverifypeer option'); + } + } + + if ($this->config['sslcafile']) { + if (!stream_context_set_option($context, 'ssl', 'cafile', $this->config['sslcafile'])) { + throw new AdapterException\RuntimeException('Unable to set sslcafile option'); + } + } + + if ($this->config['sslcapath']) { + if (!stream_context_set_option($context, 'ssl', 'capath', $this->config['sslcapath'])) { + throw new AdapterException\RuntimeException('Unable to set sslcapath option'); + } + } + + if ($this->config['sslallowselfsigned'] !== null) { + if (!stream_context_set_option($context, 'ssl', 'allow_self_signed', $this->config['sslallowselfsigned'])) { + throw new AdapterException\RuntimeException('Unable to set sslallowselfsigned option'); + } + } + + if ($this->config['sslcert'] !== null) { + if (!stream_context_set_option($context, 'ssl', 'local_cert', $this->config['sslcert'])) { + throw new AdapterException\RuntimeException('Unable to set sslcert option'); + } + } + + if ($this->config['sslpassphrase'] !== null) { + if (!stream_context_set_option($context, 'ssl', 'passphrase', $this->config['sslpassphrase'])) { + throw new AdapterException\RuntimeException('Unable to set sslpassphrase option'); + } + } + } + + $flags = STREAM_CLIENT_CONNECT; + if ($this->config['persistent']) { + $flags |= STREAM_CLIENT_PERSISTENT; + } + + ErrorHandler::start(); + $this->socket = stream_socket_client( + $host . ':' . $port, + $errno, + $errstr, + (int) $this->config['timeout'], + $flags, + $context + ); + $error = ErrorHandler::stop(); + + if (!$this->socket) { + $this->close(); + throw new AdapterException\RuntimeException( + sprintf( + 'Unable to connect to %s:%d%s', + $host, + $port, + ($error ? ' . Error #' . $error->getCode() . ': ' . $error->getMessage() : '') + ), + 0, + $error + ); + } + + // Set the stream timeout + if (!stream_set_timeout($this->socket, (int) $this->config['timeout'])) { + throw new AdapterException\RuntimeException('Unable to set the connection timeout'); + } + + if ($secure || $this->config['sslusecontext']) { + if ($this->config['ssltransport'] && isset(static::$sslCryptoTypes[$this->config['ssltransport']])) { + $sslCryptoMethod = static::$sslCryptoTypes[$this->config['ssltransport']]; + } else { + $sslCryptoMethod = STREAM_CRYPTO_METHOD_SSLv3_CLIENT; + } + + ErrorHandler::start(); + $test = stream_socket_enable_crypto($this->socket, true, $sslCryptoMethod); + $error = ErrorHandler::stop(); + if (!$test || $error) { + // Error handling is kind of difficult when it comes to SSL + $errorString = ''; + if (extension_loaded('openssl')) { + while (($sslError = openssl_error_string()) != false) { + $errorString .= "; SSL error: $sslError"; + } + } + $this->close(); + + if ((! $errorString) && $this->config['sslverifypeer']) { + // There's good chance our error is due to sslcapath not being properly set + if (! ($this->config['sslcafile'] || $this->config['sslcapath'])) { + $errorString = 'make sure the "sslcafile" or "sslcapath" option are properly set for the environment.'; + } elseif ($this->config['sslcafile'] && !is_file($this->config['sslcafile'])) { + $errorString = 'make sure the "sslcafile" option points to a valid SSL certificate file'; + } elseif ($this->config['sslcapath'] && !is_dir($this->config['sslcapath'])) { + $errorString = 'make sure the "sslcapath" option points to a valid SSL certificate directory'; + } + } + + if ($errorString) { + $errorString = ": $errorString"; + } + + throw new AdapterException\RuntimeException(sprintf( + 'Unable to enable crypto on TCP connection %s%s', + $host, + $errorString + ), 0, $error); + } + + $host = $this->config['ssltransport'] . "://" . $host; + } else { + $host = 'tcp://' . $host; + } + + // Update connectedTo + $this->connectedTo = array($host, $port); + } + } + + + /** + * Send request to the remote server + * + * @param string $method + * @param \Zend\Uri\Uri $uri + * @param string $httpVer + * @param array $headers + * @param string $body + * @throws AdapterException\RuntimeException + * @return string Request as string + */ + public function write($method, $uri, $httpVer = '1.1', $headers = array(), $body = '') + { + // Make sure we're properly connected + if (! $this->socket) { + throw new AdapterException\RuntimeException('Trying to write but we are not connected'); + } + + $host = $uri->getHost(); + $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; + if ($this->connectedTo[0] != $host || $this->connectedTo[1] != $uri->getPort()) { + throw new AdapterException\RuntimeException('Trying to write but we are connected to the wrong host'); + } + + // Save request method for later + $this->method = $method; + + // Build request headers + $path = $uri->getPath(); + if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); + $request = "{$method} {$path} HTTP/{$httpVer}\r\n"; + foreach ($headers as $k => $v) { + if (is_string($k)) $v = ucfirst($k) . ": $v"; + $request .= "$v\r\n"; + } + + if (is_resource($body)) { + $request .= "\r\n"; + } else { + // Add the request body + $request .= "\r\n" . $body; + } + + // Send the request + ErrorHandler::start(); + $test = fwrite($this->socket, $request); + $error = ErrorHandler::stop(); + if (false === $test) { + throw new AdapterException\RuntimeException('Error writing request to server', 0, $error); + } + + if (is_resource($body)) { + if (stream_copy_to_stream($body, $this->socket) == 0) { + throw new AdapterException\RuntimeException('Error writing request to server'); + } + } + + return $request; + } + + /** + * Read response from server + * + * @throws AdapterException\RuntimeException + * @return string + */ + public function read() + { + // First, read headers only + $response = ''; + $gotStatus = false; + + while (($line = fgets($this->socket)) !== false) { + $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); + if ($gotStatus) { + $response .= $line; + if (rtrim($line) === '') break; + } + } + + $this->_checkSocketReadTimeout(); + + $responseObj= Response::fromString($response); + + $statusCode = $responseObj->getStatusCode(); + + // Handle 100 and 101 responses internally by restarting the read again + if ($statusCode == 100 || $statusCode == 101) return $this->read(); + + // Check headers to see what kind of connection / transfer encoding we have + $headers = $responseObj->getHeaders(); + + /** + * Responses to HEAD requests and 204 or 304 responses are not expected + * to have a body - stop reading here + */ + if ($statusCode == 304 || $statusCode == 204 || + $this->method == \Zend\Http\Request::METHOD_HEAD) { + + // Close the connection if requested to do so by the server + $connection = $headers->get('connection'); + if ($connection && $connection->getFieldValue() == 'close') { + $this->close(); + } + return $response; + } + + // If we got a 'transfer-encoding: chunked' header + $transferEncoding = $headers->get('transfer-encoding'); + $contentLength = $headers->get('content-length'); + if ($transferEncoding !== false) { + + if (strtolower($transferEncoding->getFieldValue()) == 'chunked') { + + do { + $line = fgets($this->socket); + $this->_checkSocketReadTimeout(); + + $chunk = $line; + + // Figure out the next chunk size + $chunksize = trim($line); + if (! ctype_xdigit($chunksize)) { + $this->close(); + throw new AdapterException\RuntimeException('Invalid chunk size "' . + $chunksize . '" unable to read chunked body'); + } + + // Convert the hexadecimal value to plain integer + $chunksize = hexdec($chunksize); + + // Read next chunk + $readTo = ftell($this->socket) + $chunksize; + + do { + $currentPos = ftell($this->socket); + if ($currentPos >= $readTo) break; + + if ($this->outStream) { + if (stream_copy_to_stream($this->socket, $this->outStream, $readTo - $currentPos) == 0) { + $this->_checkSocketReadTimeout(); + break; + } + } else { + $line = fread($this->socket, $readTo - $currentPos); + if ($line === false || strlen($line) === 0) { + $this->_checkSocketReadTimeout(); + break; + } + $chunk .= $line; + } + } while (! feof($this->socket)); + + ErrorHandler::start(); + $chunk .= fgets($this->socket); + ErrorHandler::stop(); + $this->_checkSocketReadTimeout(); + + if (!$this->outStream) { + $response .= $chunk; + } + } while ($chunksize > 0); + } else { + $this->close(); + throw new AdapterException\RuntimeException('Cannot handle "' . + $transferEncoding->getFieldValue() . '" transfer encoding'); + } + + // We automatically decode chunked-messages when writing to a stream + // this means we have to disallow the Zend\Http\Response to do it again + if ($this->outStream) { + $response = str_ireplace("Transfer-Encoding: chunked\r\n", '', $response); + } + // Else, if we got the content-length header, read this number of bytes + } elseif ($contentLength !== false) { + + // If we got more than one Content-Length header (see ZF-9404) use + // the last value sent + if (is_array($contentLength)) { + $contentLength = $contentLength[count($contentLength) - 1]; + } + $contentLength = $contentLength->getFieldValue(); + + $currentPos = ftell($this->socket); + $chunk = ''; + + for ($readTo = $currentPos + $contentLength; + $readTo > $currentPos; + $currentPos = ftell($this->socket)) { + + if ($this->outStream) { + if (stream_copy_to_stream($this->socket, $this->outStream, $readTo - $currentPos) == 0) { + $this->_checkSocketReadTimeout(); + break; + } + } else { + $chunk = fread($this->socket, $readTo - $currentPos); + if ($chunk === false || strlen($chunk) === 0) { + $this->_checkSocketReadTimeout(); + break; + } + + $response .= $chunk; + } + + // Break if the connection ended prematurely + if (feof($this->socket)) break; + } + + // Fallback: just read the response until EOF + } else { + + do { + if ($this->outStream) { + if (stream_copy_to_stream($this->socket, $this->outStream) == 0) { + $this->_checkSocketReadTimeout(); + break; + } + } else { + $buff = fread($this->socket, 8192); + if ($buff === false || strlen($buff) === 0) { + $this->_checkSocketReadTimeout(); + break; + } else { + $response .= $buff; + } + } + + } while (feof($this->socket) === false); + + $this->close(); + } + + // Close the connection if requested to do so by the server + $connection = $headers->get('connection'); + if ($connection && $connection->getFieldValue() == 'close') { + $this->close(); + } + + return $response; + } + + /** + * Close the connection to the server + * + */ + public function close() + { + if (is_resource($this->socket)) { + ErrorHandler::start(); + fclose($this->socket); + ErrorHandler::stop(); + } + $this->socket = null; + $this->connectedTo = array(null, null); + } + + /** + * Check if the socket has timed out - if so close connection and throw + * an exception + * + * @throws AdapterException\TimeoutException with READ_TIMEOUT code + */ + protected function _checkSocketReadTimeout() + { + if ($this->socket) { + $info = stream_get_meta_data($this->socket); + $timedout = $info['timed_out']; + if ($timedout) { + $this->close(); + throw new AdapterException\TimeoutException( + "Read timed out after {$this->config['timeout']} seconds", + AdapterException\TimeoutException::READ_TIMEOUT + ); + } + } + } + + /** + * Set output stream for the response + * + * @param resource $stream + * @return \Zend\Http\Client\Adapter\Socket + */ + public function setOutputStream($stream) + { + $this->outStream = $stream; + return $this; + } + + /** + * Destructor: make sure the socket is disconnected + * + * If we are in persistent TCP mode, will not close the connection + * + */ + public function __destruct() + { + if (! $this->config['persistent']) { + if ($this->socket) $this->close(); + } + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/StreamInterface.php b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/StreamInterface.php new file mode 100644 index 0000000000..6dd1a5045d --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Client/Adapter/StreamInterface.php @@ -0,0 +1,28 @@ +nextRequestWillFail = (bool) $flag; + + return $this; + } + + /** + * Set the configuration array for the adapter + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function setOptions($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (! is_array($options)) { + throw new Exception\InvalidArgumentException( + 'Array or Traversable object expected, got ' . gettype($options) + ); + } + + foreach ($options as $k => $v) { + $this->config[strtolower($k)] = $v; + } + } + + + /** + * Connect to the remote server + * + * @param string $host + * @param int $port + * @param bool $secure + * @throws Exception\RuntimeException + */ + public function connect($host, $port = 80, $secure = false) + { + if ($this->nextRequestWillFail) { + $this->nextRequestWillFail = false; + throw new Exception\RuntimeException('Request failed'); + } + } + + /** + * Send request to the remote server + * + * @param string $method + * @param \Zend\Uri\Uri $uri + * @param string $httpVer + * @param array $headers + * @param string $body + * @return string Request as string + */ + public function write($method, $uri, $httpVer = '1.1', $headers = array(), $body = '') + { + $host = $uri->getHost(); + $host = (strtolower($uri->getScheme()) == 'https' ? 'sslv2://' . $host : $host); + + // Build request headers + $path = $uri->getPath(); + if (empty($path)) { + $path = '/'; + } + if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); + $request = "{$method} {$path} HTTP/{$httpVer}\r\n"; + foreach ($headers as $k => $v) { + if (is_string($k)) $v = ucfirst($k) . ": $v"; + $request .= "$v\r\n"; + } + + // Add the request body + $request .= "\r\n" . $body; + + // Do nothing - just return the request as string + + return $request; + } + + /** + * Return the response set in $this->setResponse() + * + * @return string + */ + public function read() + { + if ($this->responseIndex >= count($this->responses)) { + $this->responseIndex = 0; + } + return $this->responses[$this->responseIndex++]; + } + + /** + * Close the connection (dummy) + * + */ + public function close() + { } + + /** + * Set the HTTP response(s) to be returned by this adapter + * + * @param \Zend\Http\Response|array|string $response + */ + public function setResponse($response) + { + if ($response instanceof Response) { + $response = $response->toString(); + } + + $this->responses = (array) $response; + $this->responseIndex = 0; + } + + /** + * Add another response to the response buffer. + * + * @param string|Response $response + */ + public function addResponse($response) + { + if ($response instanceof Response) { + $response = $response->toString(); + } + + $this->responses[] = $response; + } + + /** + * Sets the position of the response buffer. Selects which + * response will be returned on the next call to read(). + * + * @param int $index + * @throws Exception\OutOfRangeException + */ + public function setResponseIndex($index) + { + if ($index < 0 || $index >= count($this->responses)) { + throw new Exception\OutOfRangeException( + 'Index out of range of response buffer size'); + } + $this->responseIndex = $index; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Client/Exception/ExceptionInterface.php b/vendor/zendframework/zend-http/Zend/Http/Client/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..5e9723b97c --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Client/Exception/ExceptionInterface.php @@ -0,0 +1,15 @@ +setUri($url); + $request->setMethod(Request::METHOD_GET); + + if (!empty($query) && is_array($query)) { + $request->getQuery()->fromArray($query); + } + + if (!empty($headers) && is_array($headers)) { + $request->getHeaders()->addHeaders($headers); + } + + if (!empty($body)) { + $request->setContent($body); + } + + return static::getStaticClient()->send($request); + } + + /** + * HTTP POST METHOD (static) + * + * @param string $url + * @param array $params + * @param array $headers + * @param mixed $body + * @throws Exception\InvalidArgumentException + * @return Response|bool + */ + public static function post($url, $params, $headers = array(), $body = null) + { + if (empty($url)) { + return false; + } + + $request= new Request(); + $request->setUri($url); + $request->setMethod(Request::METHOD_POST); + + if (!empty($params) && is_array($params)) { + $request->getPost()->fromArray($params); + } else { + throw new Exception\InvalidArgumentException('The array of post parameters is empty'); + } + + if (!isset($headers['Content-Type'])) { + $headers['Content-Type']= Client::ENC_URLENCODED; + } + + if (!empty($headers) && is_array($headers)) { + $request->getHeaders()->addHeaders($headers); + } + + if (!empty($body)) { + $request->setContent($body); + } + + return static::getStaticClient()->send($request); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Cookies.php b/vendor/zendframework/zend-http/Zend/Http/Cookies.php new file mode 100644 index 0000000000..7d4ac275da --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Cookies.php @@ -0,0 +1,370 @@ +getDomain(); + $path = $cookie->getPath(); + if (!isset($this->cookies[$domain])) { + $this->cookies[$domain] = array(); + } + if (!isset($this->cookies[$domain][$path])) { + $this->cookies[$domain][$path] = array(); + } + $this->cookies[$domain][$path][$cookie->getName()] = $cookie; + $this->rawCookies[] = $cookie; + } else { + throw new Exception\InvalidArgumentException('Supplient argument is not a valid cookie string or object'); + } + } + + /** + * Parse an HTTP response, adding all the cookies set in that response + * + * @param Response $response + * @param Uri\Uri|string $refUri Requested URI + */ + public function addCookiesFromResponse(Response $response, $refUri) + { + $cookieHdrs = $response->getHeaders()->get('Set-Cookie'); + + if (is_array($cookieHdrs) || $cookieHdrs instanceof ArrayIterator) { + foreach ($cookieHdrs as $cookie) { + $this->addCookie($cookie, $refUri); + } + } elseif (is_string($cookieHdrs)) { + $this->addCookie($cookieHdrs, $refUri); + } + } + + /** + * Get all cookies in the cookie jar as an array + * + * @param int $retAs Whether to return cookies as objects of \Zend\Http\Header\SetCookie or as strings + * @return array|string + */ + public function getAllCookies($retAs = self::COOKIE_OBJECT) + { + $cookies = $this->_flattenCookiesArray($this->cookies, $retAs); + return $cookies; + } + + /** + * Return an array of all cookies matching a specific request according to the request URI, + * whether session cookies should be sent or not, and the time to consider as "now" when + * checking cookie expiry time. + * + * @param string|Uri\Uri $uri URI to check against (secure, domain, path) + * @param bool $matchSessionCookies Whether to send session cookies + * @param int $retAs Whether to return cookies as objects of \Zend\Http\Header\Cookie or as strings + * @param int $now Override the current time when checking for expiry time + * @throws Exception\InvalidArgumentException if invalid URI specified + * @return array|string + */ + public function getMatchingCookies($uri, $matchSessionCookies = true, + $retAs = self::COOKIE_OBJECT, $now = null) + { + if (is_string($uri)) { + $uri = Uri\UriFactory::factory($uri, 'http'); + } elseif (!$uri instanceof Uri\Uri) { + throw new Exception\InvalidArgumentException("Invalid URI string or object passed"); + } + + $host = $uri->getHost(); + if (empty($host)) { + throw new Exception\InvalidArgumentException('Invalid URI specified; does not contain a host'); + } + + // First, reduce the array of cookies to only those matching domain and path + $cookies = $this->_matchDomain($host); + $cookies = $this->_matchPath($cookies, $uri->getPath()); + $cookies = $this->_flattenCookiesArray($cookies, self::COOKIE_OBJECT); + + // Next, run Cookie->match on all cookies to check secure, time and session matching + $ret = array(); + foreach ($cookies as $cookie) { + if ($cookie->match($uri, $matchSessionCookies, $now)) { + $ret[] = $cookie; + } + } + // Now, use self::_flattenCookiesArray again - only to convert to the return format ;) + $ret = $this->_flattenCookiesArray($ret, $retAs); + + return $ret; + } + + /** + * Get a specific cookie according to a URI and name + * + * @param Uri\Uri|string $uri The uri (domain and path) to match + * @param string $cookieName The cookie's name + * @param int $retAs Whether to return cookies as objects of \Zend\Http\Header\SetCookie or as strings + * @throws Exception\InvalidArgumentException if invalid URI specified or invalid $retAs value + * @return SetCookie|string + */ + public function getCookie($uri, $cookieName, $retAs = self::COOKIE_OBJECT) + { + if (is_string($uri)) { + $uri = Uri\UriFactory::factory($uri, 'http'); + } elseif (!$uri instanceof Uri\Uri) { + throw new Exception\InvalidArgumentException('Invalid URI specified'); + } + + $host = $uri->getHost(); + if (empty($host)) { + throw new Exception\InvalidArgumentException('Invalid URI specified; host missing'); + } + + // Get correct cookie path + $path = $uri->getPath(); + $path = substr($path, 0, strrpos($path, '/')); + if (! $path) { + $path = '/'; + } + + if (isset($this->cookies[$uri->getHost()][$path][$cookieName])) { + $cookie = $this->cookies[$uri->getHost()][$path][$cookieName]; + + switch ($retAs) { + case self::COOKIE_OBJECT: + return $cookie; + break; + + case self::COOKIE_STRING_ARRAY: + case self::COOKIE_STRING_CONCAT: + return $cookie->__toString(); + break; + + default: + throw new Exception\InvalidArgumentException("Invalid value passed for \$retAs: {$retAs}"); + break; + } + } + + return false; + } + + /** + * Helper function to recursively flatten an array. Should be used when exporting the + * cookies array (or parts of it) + * + * @param \Zend\Http\Header\SetCookie|array $ptr + * @param int $retAs What value to return + * @return array|string + */ + protected function _flattenCookiesArray($ptr, $retAs = self::COOKIE_OBJECT) + { + if (is_array($ptr)) { + $ret = ($retAs == self::COOKIE_STRING_CONCAT ? '' : array()); + foreach ($ptr as $item) { + if ($retAs == self::COOKIE_STRING_CONCAT) { + $ret .= $this->_flattenCookiesArray($item, $retAs); + } else { + $ret = array_merge($ret, $this->_flattenCookiesArray($item, $retAs)); + } + } + return $ret; + } elseif ($ptr instanceof SetCookie) { + switch ($retAs) { + case self::COOKIE_STRING_ARRAY: + return array($ptr->__toString()); + break; + + case self::COOKIE_STRING_CONCAT: + return $ptr->__toString(); + break; + + case self::COOKIE_OBJECT: + default: + return array($ptr); + break; + } + } + + return null; + } + + /** + * Return a subset of the cookies array matching a specific domain + * + * @param string $domain + * @return array + */ + protected function _matchDomain($domain) + { + $ret = array(); + + foreach (array_keys($this->cookies) as $cdom) { + if (SetCookie::matchCookieDomain($cdom, $domain)) { + $ret[$cdom] = $this->cookies[$cdom]; + } + } + + return $ret; + } + + /** + * Return a subset of a domain-matching cookies that also match a specified path + * + * @param array $domains + * @param string $path + * @return array + */ + protected function _matchPath($domains, $path) + { + $ret = array(); + + foreach ($domains as $dom => $pathsArray) { + foreach (array_keys($pathsArray) as $cpath) { + if (SetCookie::matchCookiePath($cpath, $path)) { + if (! isset($ret[$dom])) { + $ret[$dom] = array(); + } + + $ret[$dom][$cpath] = $pathsArray[$cpath]; + } + } + } + + return $ret; + } + + /** + * Create a new Cookies object and automatically load into it all the + * cookies set in a Response object. If $uri is set, it will be + * considered as the requested URI for setting default domain and path + * of the cookie. + * + * @param Response $response HTTP Response object + * @param Uri\Uri|string $refUri The requested URI + * @return Cookies + * @todo Add the $uri functionality. + */ + public static function fromResponse(Response $response, $refUri) + { + $jar = new static(); + $jar->addCookiesFromResponse($response, $refUri); + return $jar; + } + + /** + * Tells if the array of cookies is empty + * + * @return bool + */ + public function isEmpty() + { + return count($this) == 0; + } + + /** + * Empties the cookieJar of any cookie + * + * @return Cookies + */ + public function reset() + { + $this->cookies = $this->rawCookies = array(); + return $this; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Exception/ExceptionInterface.php b/vendor/zendframework/zend-http/Zend/Http/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..b58caddf88 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Exception/ExceptionInterface.php @@ -0,0 +1,14 @@ +getFieldName())) { + $value = $headerLine; // This is just for preserve the BC. + } + } else { + $value = $headerLine; + } + + foreach ($this->getFieldValuePartsFromHeaderLine($value) as $value) { + $this->addFieldValuePartToQueue($value); + } + } + + /** + * Factory method: parse Accept header string + * + * @param string $headerLine + * @return Accept + */ + public static function fromString($headerLine) + { + $obj = new static(); + $obj->parseHeaderLine($headerLine); + return $obj; + } + + /** + * Parse the Field Value Parts represented by a header line + * + * @param string $headerLine + * @throws Exception\InvalidArgumentException If header is invalid + * @return array + */ + public function getFieldValuePartsFromHeaderLine($headerLine) + { + // process multiple accept values, they may be between quotes + if (!preg_match_all('/(?:[^,"]|"(?:[^\\\"]|\\\.)*")+/', $headerLine, $values) + || !isset($values[0]) + ) { + throw new Exception\InvalidArgumentException( + 'Invalid header line for ' . $this->getFieldName() . ' header string' + ); + } + + $out = array(); + foreach ($values[0] as $value) { + $value = trim($value); + + $out[] = $this->parseFieldValuePart($value); + } + + return $out; + } + + /** + * Parse the accept params belonging to a media range + * + * @param string $fieldValuePart + * @return stdClass + */ + protected function parseFieldValuePart($fieldValuePart) + { + $raw = $subtypeWhole = $type = $fieldValuePart; + if ($pos = strpos($fieldValuePart, ';')) { + $type = substr($fieldValuePart, 0, $pos); + } + + $params = $this->getParametersFromFieldValuePart($fieldValuePart); + + if ($pos = strpos($fieldValuePart, ';')) { + $fieldValuePart = trim(substr($fieldValuePart, 0, $pos)); + } + + $format = '*'; + $subtype = '*'; + + return (object) array( + 'typeString' => trim($fieldValuePart), + 'type' => $type, + 'subtype' => $subtype, + 'subtypeRaw' => $subtypeWhole, + 'format' => $format, + 'priority' => isset($params['q']) ? $params['q'] : 1, + 'params' => $params, + 'raw' => trim($raw) + ); + } + + /** + * Parse the keys contained in the header line + * + * @param string $fieldValuePart + * @return array + */ + protected function getParametersFromFieldValuePart($fieldValuePart) + { + $params = array(); + if ((($pos = strpos($fieldValuePart, ';')) !== false)) { + preg_match_all('/(?:[^;"]|"(?:[^\\\"]|\\\.)*")+/', $fieldValuePart, $paramsStrings); + + if (isset($paramsStrings[0])) { + array_shift($paramsStrings[0]); + $paramsStrings = $paramsStrings[0]; + } + + foreach ($paramsStrings as $param) { + $explode = explode('=', $param, 2); + + $value = trim($explode[1]); + if (isset($value[0]) && $value[0] == '"' && substr($value, -1) == '"') { + $value = substr(substr($value, 1), 0, -1); + } + + $params[trim($explode[0])] = stripslashes($value); + } + } + + return $params; + } + + + /** + * Get field value + * + * @param array|null $values + * @return string + */ + public function getFieldValue($values = null) + { + if (!$values) { + return $this->getFieldValue($this->fieldValueParts); + } + + $strings = array(); + foreach ($values as $value) { + $params = $value->params; + array_walk($params, array($this, 'assembleAcceptParam')); + $strings[] = implode(';', array($value->typeString) + $params); + } + + return implode(', ', $strings); + } + + + /** + * Assemble and escape the field value parameters based on RFC 2616 section 2.1 + * + * @todo someone should review this thoroughly + * @param string $value + * @param string $key + * @return string + */ + protected function assembleAcceptParam(&$value, $key) + { + $separators = array('(', ')', '<', '>', '@', ',', ';', ':', + '/', '[', ']', '?', '=', '{', '}', ' ', "\t"); + + $escaped = preg_replace_callback('/[[:cntrl:]"\\\\]/', // escape cntrl, ", \ + function ($v) { + return '\\' . $v[0]; + }, + $value + ); + + if ($escaped == $value && !array_intersect(str_split($value), $separators)) { + $value = $key . '=' . $value; + } else { + $value = $key . '="' . $escaped . '"'; + } + + return $value; + } + + /** + * Add a type, with the given priority + * + * @param string $type + * @param int|float $priority + * @param array (optional) $params + * @throws Exception\InvalidArgumentException + * @return Accept + */ + protected function addType($type, $priority = 1, array $params = array()) + { + if (!preg_match($this->regexAddType, $type)) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects a valid type; received "%s"', + __METHOD__, + (string) $type + )); + } + + if (!is_int($priority) && !is_float($priority) && !is_numeric($priority) + || $priority > 1 || $priority < 0 + ) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects a numeric priority; received %s', + __METHOD__, + (string) $priority + )); + } + + if ($priority != 1) { + $params = array('q' => sprintf('%01.1f', $priority)) + $params; + } + + $assembledString = $this->getFieldValue( + array((object) array('typeString' => $type, 'params' => $params)) + ); + + $value = $this->parseFieldValuePart($assembledString); + $this->addFieldValuePartToQueue($value); + return $this; + } + + + /** + * Does the header have the requested type? + * + * @param array|string $matchAgainst + * @return bool + */ + protected function hasType($matchAgainst) + { + return (bool) $this->match($matchAgainst); + } + + /** + * Match a media string against this header + * + * @param array|string $matchAgainst + * @return Accept\FieldValuePArt\AcceptFieldValuePart|bool The matched value or false + */ + public function match($matchAgainst) + { + if (is_string($matchAgainst)) { + $matchAgainst = $this->getFieldValuePartsFromHeaderLine($matchAgainst); + } + + foreach ($this->getPrioritized() as $left) { + foreach ($matchAgainst as $right) { + if ($right->type == '*' || $left->type == '*') { + if ($this->matchAcceptParams($left, $right)) { + $left->setMatchedAgainst($right); + + return $left; + } + } + + if ($left->type == $right->type) { + if ((($left->subtype == $right->subtype || + ($right->subtype == '*' || $left->subtype == '*')) && + ($left->format == $right->format || + $right->format == '*' || $left->format == '*'))) + { + if ($this->matchAcceptParams($left, $right)) { + $left->setMatchedAgainst($right); + + return $left; + } + } + } + + + } + } + + return false; + } + + /** + * Return a match where all parameters in argument #1 match those in argument #2 + * + * @param array $match1 + * @param array $match2 + * @return bool|array + */ + protected function matchAcceptParams($match1, $match2) + { + foreach ($match2->params as $key => $value) { + if (isset($match1->params[$key])) { + if (strpos($value, '-')) { + preg_match( + '/^(?|([^"-]*)|"([^"]*)")-(?|([^"-]*)|"([^"]*)")\z/', + $value, + $pieces + ); + + if (count($pieces) == 3 && + (version_compare($pieces[1], $match1->params[$key], '<=') xor + version_compare($pieces[2], $match1->params[$key], '>=') + ) + ) { + return false; + } + } elseif (strpos($value, '|')) { + $options = explode('|', $value); + $good = false; + foreach ($options as $option) { + if ($option == $match1->params[$key]) { + $good = true; + break; + } + } + + if (!$good) { + return false; + } + } elseif ($match1->params[$key] != $value) { + return false; + } + } + + } + + return $match1; + } + + + /** + * Add a key/value combination to the internal queue + * + * @param stdClass $value + * @return number + */ + protected function addFieldValuePartToQueue($value) + { + $this->fieldValueParts[] = $value; + $this->sorted = false; + } + + /** + * Sort the internal Field Value Parts + * + * @See rfc2616 sect 14.1 + * Media ranges can be overridden by more specific media ranges or + * specific media types. If more than one media range applies to a given + * type, the most specific reference has precedence. For example, + * + * Accept: text/*, text/html, text/html;level=1, * /* + * + * have the following precedence: + * + * 1) text/html;level=1 + * 2) text/html + * 3) text/* + * 4) * /* + * + * @return number + */ + protected function sortFieldValueParts() + { + $sort = function ($a, $b) { // If A has higher precedence than B, return -1. + if ($a->priority > $b->priority) { + return -1; + } elseif ($a->priority < $b->priority) { + return 1; + } + + // Asterisks + $values = array('type', 'subtype', 'format'); + foreach ($values as $value) { + if ($a->$value == '*' && $b->$value != '*') { + return 1; + } elseif ($b->$value == '*' && $a->$value != '*') { + return -1; + } + } + + if ($a->type == 'application' && $b->type != 'application') { + return -1; + } elseif ($b->type == 'application' && $a->type != 'application') { + return 1; + } + + //@todo count number of dots in case of type==application in subtype + + // So far they're still the same. Longest string length may be more specific + if (strlen($a->raw) == strlen($b->raw)) return 0; + return (strlen($a->raw) > strlen($b->raw)) ? -1 : 1; + }; + + usort($this->fieldValueParts, $sort); + $this->sorted = true; + } + + /** + * @return array with all the keys, values and parameters this header represents: + */ + public function getPrioritized() + { + if (!$this->sorted) { + $this->sortFieldValueParts(); + } + + return $this->fieldValueParts; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AbstractDate.php b/vendor/zendframework/zend-http/Zend/Http/Header/AbstractDate.php new file mode 100644 index 0000000000..5990dc4fa3 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AbstractDate.php @@ -0,0 +1,230 @@ + 'D, d M Y H:i:s \G\M\T', + self::DATE_RFC1036 => 'D, d M y H:i:s \G\M\T', + self::DATE_ANSIC => 'D M j H:i:s Y', + ); + + /** + * Create date-based header from string + * + * @param string $headerLine + * @return AbstractDate + * @throws Exception\InvalidArgumentException + */ + public static function fromString($headerLine) + { + $dateHeader = new static(); + + list($name, $date) = GenericHeader::splitHeaderLine($headerLine); + + // check to ensure proper header type for this factory + if (strtolower($name) !== strtolower($dateHeader->getFieldName())) { + throw new Exception\InvalidArgumentException( + 'Invalid header line for "' . $dateHeader->getFieldName() . '" header string' + ); + } + + $dateHeader->setDate($date); + + return $dateHeader; + } + + /** + * Set date output format + * + * @param int $format + * @throws Exception\InvalidArgumentException + */ + public static function setDateFormat($format) + { + if (!isset(static::$dateFormats[$format])) { + throw new Exception\InvalidArgumentException( + "No constant defined for provided date format: {$format}" + ); + } + + static::$dateFormat = static::$dateFormats[$format]; + } + + /** + * Return current date output format + * + * @return string + */ + public static function getDateFormat() + { + return static::$dateFormat; + } + + /** + * Set the date for this header, this can be a string or an instance of \DateTime + * + * @param string|DateTime $date + * @return AbstractDate + * @throws Exception\InvalidArgumentException + */ + public function setDate($date) + { + if (is_string($date)) { + try { + $date = new DateTime($date, new DateTimeZone('GMT')); + } catch (\Exception $e) { + throw new Exception\InvalidArgumentException( + sprintf('Invalid date passed as string (%s)', (string) $date), + $e->getCode(), + $e + ); + } + } elseif (!($date instanceof DateTime)) { + throw new Exception\InvalidArgumentException('Date must be an instance of \DateTime or a string'); + } + + $date->setTimezone(new DateTimeZone('GMT')); + $this->date = $date; + + return $this; + } + + /** + * Return date for this header + * + * @return string + */ + public function getDate() + { + return $this->date()->format(static::$dateFormat); + } + + /** + * Return date for this header as an instance of \DateTime + * + * @return DateTime + */ + public function date() + { + if ($this->date === null) { + $this->date = new DateTime(null, new DateTimeZone('GMT')); + } + return $this->date; + } + + /** + * Compare provided date to date for this header + * Returns < 0 if date in header is less than $date; > 0 if it's greater, and 0 if they are equal. + * @see \strcmp() + * + * @param string|DateTime $date + * @return int + * @throws Exception\InvalidArgumentException + */ + public function compareTo($date) + { + if (is_string($date)) { + try { + $date = new DateTime($date, new DateTimeZone('GMT')); + } catch (\Exception $e) { + throw new Exception\InvalidArgumentException( + sprintf('Invalid Date passed as string (%s)', (string) $date), + $e->getCode(), + $e + ); + } + } elseif (!($date instanceof DateTime)) { + throw new Exception\InvalidArgumentException('Date must be an instance of \DateTime or a string'); + } + + $dateTimestamp = $date->getTimestamp(); + $thisTimestamp = $this->date()->getTimestamp(); + + return ($thisTimestamp === $dateTimestamp) ? 0 : (($thisTimestamp > $dateTimestamp) ? 1 : -1); + } + + /** + * Get header value as formatted date + * + * @return string + */ + public function getFieldValue() + { + return $this->getDate(); + } + + /** + * Return header line + * + * @return string + */ + public function toString() + { + return $this->getFieldName() . ': ' . $this->getDate(); + } + + /** + * Allow casting to string + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AbstractLocation.php b/vendor/zendframework/zend-http/Zend/Http/Header/AbstractLocation.php new file mode 100644 index 0000000000..12088cc9e0 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AbstractLocation.php @@ -0,0 +1,145 @@ +getFieldName())) { + throw new Exception\InvalidArgumentException( + 'Invalid header line for "' . $locationHeader->getFieldName() . '" header string' + ); + } + + $locationHeader->setUri(trim($uri)); + + return $locationHeader; + } + + /** + * Set the URI/URL for this header, this can be a string or an instance of Zend\Uri\Http + * + * @param string|UriInterface $uri + * @return AbstractLocation + * @throws Exception\InvalidArgumentException + */ + public function setUri($uri) + { + if (is_string($uri)) { + try { + $uri = UriFactory::factory($uri); + } catch (UriException\InvalidUriPartException $e) { + throw new Exception\InvalidArgumentException( + sprintf('Invalid URI passed as string (%s)', (string) $uri), + $e->getCode(), + $e + ); + } + } elseif (!($uri instanceof UriInterface)) { + throw new Exception\InvalidArgumentException('URI must be an instance of Zend\Uri\Http or a string'); + } + $this->uri = $uri; + + return $this; + } + + /** + * Return the URI for this header + * + * @return string + */ + public function getUri() + { + if ($this->uri instanceof UriInterface) { + return $this->uri->toString(); + } + return $this->uri; + } + + /** + * Return the URI for this header as an instance of Zend\Uri\Http + * + * @return UriInterface + */ + public function uri() + { + if ($this->uri === null || is_string($this->uri)) { + $this->uri = UriFactory::factory($this->uri); + } + return $this->uri; + } + + /** + * Get header value as URI string + * + * @return string + */ + public function getFieldValue() + { + return $this->getUri(); + } + + /** + * Output header line + * + * @return string + */ + public function toString() + { + return $this->getFieldName() . ': ' . $this->getUri(); + } + + /** + * Allow casting to string + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Accept.php b/vendor/zendframework/zend-http/Zend/Http/Header/Accept.php new file mode 100644 index 0000000000..2c344d352f --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Accept.php @@ -0,0 +1,119 @@ +getFieldValue(); + } + + /** + * Add a media type, with the given priority + * + * @param string $type + * @param int|float $priority + * @param array $params + * @return Accept + */ + public function addMediaType($type, $priority = 1, array $params = array()) + { + return $this->addType($type, $priority, $params); + } + + /** + * Does the header have the requested media type? + * + * @param string $type + * @return bool + */ + public function hasMediaType($type) + { + return $this->hasType($type); + } + + /** + * Parse the keys contained in the header line + * + * @param string $fieldValuePart + * @return FieldValuePart\AcceptFieldValuePart + * @see \Zend\Http\Header\AbstractAccept::parseFieldValuePart() + */ + protected function parseFieldValuePart($fieldValuePart) + { + $raw = $fieldValuePart; + if ($pos = strpos($fieldValuePart, '/')) { + $type = trim(substr($fieldValuePart, 0, $pos)); + } else { + $type = trim(substr($fieldValuePart, 0)); + } + + $params = $this->getParametersFromFieldValuePart($fieldValuePart); + + if ($pos = strpos($fieldValuePart, ';')) { + $fieldValuePart = trim(substr($fieldValuePart, 0, $pos)); + } + + if ($pos = strpos($fieldValuePart, '/')) { + $subtypeWhole = $format = $subtype = trim(substr($fieldValuePart, strpos($fieldValuePart, '/') + 1)); + } else { + $subtypeWhole = ''; + $format = '*'; + $subtype = '*'; + } + + $pos = strpos($subtype, '+'); + if (false !== $pos) { + $format = trim(substr($subtype, $pos + 1)); + $subtype = trim(substr($subtype, 0, $pos)); + } + + $aggregated = array( + 'typeString' => trim($fieldValuePart), + 'type' => $type, + 'subtype' => $subtype, + 'subtypeRaw' => $subtypeWhole, + 'format' => $format, + 'priority' => isset($params['q']) ? $params['q'] : 1, + 'params' => $params, + 'raw' => trim($raw), + ); + + return new FieldValuePart\AcceptFieldValuePart((object) $aggregated); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/AbstractFieldValuePart.php b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/AbstractFieldValuePart.php new file mode 100644 index 0000000000..15a7a5bc15 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/AbstractFieldValuePart.php @@ -0,0 +1,114 @@ +internalValues = $internalValues; + } + + /** + * Set a Field Value Part this Field Value Part matched against. + * + * @param AbstractFieldValuePart $matchedAgainst + * @return AbstractFieldValuePart provides fluent interface + */ + public function setMatchedAgainst(AbstractFieldValuePart $matchedAgainst) + { + $this->matchedAgainst = $matchedAgainst; + return $this; + } + + /** + * Get a Field Value Part this Field Value Part matched against. + * + * @return AbstractFieldValuePart|null + */ + public function getMatchedAgainst() + { + return $this->matchedAgainst; + } + + /** + * + * @return object + */ + protected function getInternalValues() + { + return $this->internalValues; + } + + /** + * @return string $typeString + */ + public function getTypeString() + { + return $this->getInternalValues()->typeString; + } + + /** + * @return float $priority + */ + public function getPriority() + { + return (float) $this->getInternalValues()->priority; + } + + /** + * @return \stdClass $params + */ + public function getParams() + { + return (object) $this->getInternalValues()->params; + } + + /** + * @return string $raw + */ + public function getRaw() + { + return $this->getInternalValues()->raw; + } + + /** + * + * @param mixed + * @return mixed + */ + public function __get($key) + { + return $this->getInternalValues()->$key; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/AcceptFieldValuePart.php b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/AcceptFieldValuePart.php new file mode 100644 index 0000000000..d14bedb13e --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/AcceptFieldValuePart.php @@ -0,0 +1,44 @@ +getInternalValues()->subtype; + } + + /** + * @return string + */ + public function getSubtypeRaw() + { + return $this->getInternalValues()->subtypeRaw; + } + + /** + * @return string + */ + public function getFormat() + { + return $this->getInternalValues()->format; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/CharsetFieldValuePart.php b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/CharsetFieldValuePart.php new file mode 100644 index 0000000000..9a4e76fb75 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/CharsetFieldValuePart.php @@ -0,0 +1,29 @@ +getInternalValues()->type; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/EncodingFieldValuePart.php b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/EncodingFieldValuePart.php new file mode 100644 index 0000000000..72246680ee --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/EncodingFieldValuePart.php @@ -0,0 +1,29 @@ +getInternalValues()->type; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/LanguageFieldValuePart.php b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/LanguageFieldValuePart.php new file mode 100644 index 0000000000..9f8ba704e6 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Accept/FieldValuePart/LanguageFieldValuePart.php @@ -0,0 +1,35 @@ +getInternalValues()->typeString; + } + + public function getPrimaryTag() + { + return $this->getInternalValues()->type; + } + + public function getSubTag() + { + return $this->getInternalValues()->subtype; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AcceptCharset.php b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptCharset.php new file mode 100644 index 0000000000..5c49c93d28 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptCharset.php @@ -0,0 +1,79 @@ +getFieldValue(); + } + + /** + * Add a charset, with the given priority + * + * @param string $type + * @param int|float $priority + * @return Accept + */ + public function addCharset($type, $priority = 1) + { + return $this->addType($type, $priority); + } + + /** + * Does the header have the requested charset? + * + * @param string $type + * @return bool + */ + public function hasCharset($type) + { + return $this->hasType($type); + } + + /** + * Parse the keys contained in the header line + * + * @param string $fieldValuePart + * @return \Zend\Http\Header\Accept\FieldValuePart\CharsetFieldValuePart + * @see \Zend\Http\Header\AbstractAccept::parseFieldValuePart() + */ + protected function parseFieldValuePart($fieldValuePart) + { + $internalValues = parent::parseFieldValuePart($fieldValuePart); + + return new FieldValuePart\CharsetFieldValuePart($internalValues); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AcceptEncoding.php b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptEncoding.php new file mode 100644 index 0000000000..b5771b0f19 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptEncoding.php @@ -0,0 +1,80 @@ +getFieldValue(); + } + + /** + * Add an encoding, with the given priority + * + * @param string $type + * @param int|float $priority + * @return Accept + */ + public function addEncoding($type, $priority = 1) + { + return $this->addType($type, $priority); + } + + /** + * Does the header have the requested encoding? + * + * @param string $type + * @return bool + */ + public function hasEncoding($type) + { + return $this->hasType($type); + } + + /** + * Parse the keys contained in the header line + * + * @param string $fieldValuePart + * @return \Zend\Http\Header\Accept\FieldValuePart\EncodingFieldValuePart + * @see \Zend\Http\Header\AbstractAccept::parseFieldValuePart() + */ + protected function parseFieldValuePart($fieldValuePart) + { + $internalValues = parent::parseFieldValuePart($fieldValuePart); + + return new FieldValuePart\EncodingFieldValuePart($internalValues); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AcceptLanguage.php b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptLanguage.php new file mode 100644 index 0000000000..f36473a357 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptLanguage.php @@ -0,0 +1,110 @@ +getFieldValue(); + } + + /** + * Add a language, with the given priority + * + * @param string $type + * @param int|float $priority + * @return Accept + */ + public function addLanguage($type, $priority = 1) + { + return $this->addType($type, $priority); + } + + /** + * Does the header have the requested language? + * + * @param string $type + * @return bool + */ + public function hasLanguage($type) + { + return $this->hasType($type); + } + + /** + * Parse the keys contained in the header line + * + * @param string $fieldValuePart + * @return \Zend\Http\Header\Accept\FieldValuePart\LanguageFieldValuePart + * @see \Zend\Http\Header\AbstractAccept::parseFieldValuePart() + */ + protected function parseFieldValuePart($fieldValuePart) + { + $raw = $fieldValuePart; + if ($pos = strpos($fieldValuePart, '-')) { + $type = trim(substr($fieldValuePart, 0, $pos)); + } else { + $type = trim(substr($fieldValuePart, 0)); + } + + $params = $this->getParametersFromFieldValuePart($fieldValuePart); + + if ($pos = strpos($fieldValuePart, ';')) { + $fieldValuePart = $type = trim(substr($fieldValuePart, 0, $pos)); + } + + if ($pos = strpos($fieldValuePart, '-')) { + $subtypeWhole = $format = $subtype = trim(substr($fieldValuePart, strpos($fieldValuePart, '-')+1)); + } else { + $subtypeWhole = ''; + $format = '*'; + $subtype = '*'; + } + + $aggregated = array( + 'typeString' => trim($fieldValuePart), + 'type' => $type, + 'subtype' => $subtype, + 'subtypeRaw' => $subtypeWhole, + 'format' => $format, + 'priority' => isset($params['q']) ? $params['q'] : 1, + 'params' => $params, + 'raw' => trim($raw) + ); + + return new FieldValuePart\LanguageFieldValuePart((object) $aggregated); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AcceptRanges.php b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptRanges.php new file mode 100644 index 0000000000..97e0c91e9d --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AcceptRanges.php @@ -0,0 +1,66 @@ +rangeUnit = $rangeUnit; + } + + public function getFieldName() + { + return 'Accept-Ranges'; + } + + public function getFieldValue() + { + return $this->getRangeUnit(); + } + + public function setRangeUnit($rangeUnit) + { + $this->rangeUnit = $rangeUnit; + return $this; + } + + public function getRangeUnit() + { + return $this->rangeUnit; + } + + public function toString() + { + return 'Accept-Ranges: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Age.php b/vendor/zendframework/zend-http/Zend/Http/Header/Age.php new file mode 100644 index 0000000000..633614b06e --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Age.php @@ -0,0 +1,106 @@ +setDeltaSeconds($deltaSeconds); + } + } + + /** + * Get header name + * + * @return string + */ + public function getFieldName() + { + return 'Age'; + } + + /** + * Get header value (number of seconds) + * + * @return int + */ + public function getFieldValue() + { + return $this->getDeltaSeconds(); + } + + /** + * Set number of seconds + * + * @param int $delta + * @return RetryAfter + */ + public function setDeltaSeconds($delta) + { + $this->deltaSeconds = (int) $delta; + return $this; + } + + /** + * Get number of seconds + * + * @return int + */ + public function getDeltaSeconds() + { + return $this->deltaSeconds; + } + + /** + * Return header line + * In case of overflow RFC states to set value of 2147483648 (2^31) + * + * @return string + */ + public function toString() + { + return 'Age: ' . (($this->deltaSeconds >= PHP_INT_MAX) ? '2147483648' : $this->deltaSeconds); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Allow.php b/vendor/zendframework/zend-http/Zend/Http/Header/Allow.php new file mode 100644 index 0000000000..e1f4e75b1f --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Allow.php @@ -0,0 +1,173 @@ + false, + Request::METHOD_GET => true, + Request::METHOD_HEAD => false, + Request::METHOD_POST => true, + Request::METHOD_PUT => false, + Request::METHOD_DELETE => false, + Request::METHOD_TRACE => false, + Request::METHOD_CONNECT => false, + Request::METHOD_PATCH => false, + ); + + /** + * Create Allow header from header line + * + * @param string $headerLine + * @return Allow + * @throws Exception\InvalidArgumentException + */ + public static function fromString($headerLine) + { + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); + + // check to ensure proper header type for this factory + if (strtolower($name) !== 'allow') { + throw new Exception\InvalidArgumentException('Invalid header line for Allow string: "' . $name . '"'); + } + + $header = new static(); + $header->disallowMethods(array_keys($header->getAllMethods())); + $header->allowMethods(explode(',', $value)); + + return $header; + } + + /** + * Get header name + * + * @return string + */ + public function getFieldName() + { + return 'Allow'; + } + + /** + * Get comma-separated list of allowed methods + * + * @return string + */ + public function getFieldValue() + { + return implode(', ', array_keys($this->methods, true, true)); + } + + /** + * Get list of all defined methods + * + * @return array + */ + public function getAllMethods() + { + return $this->methods; + } + + /** + * Get list of allowed methods + * + * @return array + */ + public function getAllowedMethods() + { + return array_keys($this->methods, true, true); + } + + /** + * Allow methods or list of methods + * + * @param array|string $allowedMethods + * @return Allow + */ + public function allowMethods($allowedMethods) + { + foreach ((array) $allowedMethods as $method) { + $method = trim(strtoupper($method)); + $this->methods[$method] = true; + } + + return $this; + } + + /** + * Disallow methods or list of methods + * + * @param array|string $disallowedMethods + * @return Allow + */ + public function disallowMethods($disallowedMethods) + { + foreach ((array) $disallowedMethods as $method) { + $method = trim(strtoupper($method)); + $this->methods[$method] = false; + } + + return $this; + } + + /** + * Convenience alias for @see disallowMethods() + * + * @param array|string $disallowedMethods + * @return Allow + */ + public function denyMethods($disallowedMethods) + { + return $this->disallowMethods($disallowedMethods); + } + + /** + * Check whether method is allowed + * + * @param string $method + * @return bool + */ + public function isAllowedMethod($method) + { + $method = trim(strtoupper($method)); + + // disallow unknown method + if (! isset($this->methods[$method])) { + $this->methods[$method] = false; + } + + return $this->methods[$method]; + } + + /** + * Return header as string + * + * @return string + */ + public function toString() + { + return 'Allow: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/AuthenticationInfo.php b/vendor/zendframework/zend-http/Zend/Http/Header/AuthenticationInfo.php new file mode 100644 index 0000000000..a35cebc666 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/AuthenticationInfo.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Authentication-Info'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Authentication-Info: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Authorization.php b/vendor/zendframework/zend-http/Zend/Http/Header/Authorization.php new file mode 100644 index 0000000000..98ee0307b6 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Authorization.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Authorization'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Authorization: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/CacheControl.php b/vendor/zendframework/zend-http/Zend/Http/Header/CacheControl.php new file mode 100644 index 0000000000..ef92ecfdfe --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/CacheControl.php @@ -0,0 +1,243 @@ + $value) { + $header->addDirective($key, $value); + } + + return $header; + } + + /** + * Required from HeaderDescription interface + * + * @return string + */ + public function getFieldName() + { + return 'Cache-Control'; + } + + /** + * Checks if the internal directives array is empty + * + * @return bool + */ + public function isEmpty() + { + return empty($this->directives); + } + + /** + * Add a directive + * For directives like 'max-age=60', $value = '60' + * For directives like 'private', use the default $value = true + * + * @param string $key + * @param string|bool $value + * @return CacheControl - provides the fluent interface + */ + public function addDirective($key, $value = true) + { + $this->directives[$key] = $value; + return $this; + } + + /** + * Check the internal directives array for a directive + * + * @param string $key + * @return bool + */ + public function hasDirective($key) + { + return array_key_exists($key, $this->directives); + } + + /** + * Fetch the value of a directive from the internal directive array + * + * @param string $key + * @return string|null + */ + public function getDirective($key) + { + return array_key_exists($key, $this->directives) ? $this->directives[$key] : null; + } + + /** + * Remove a directive + * + * @param string $key + * @return CacheControl - provides the fluent interface + */ + public function removeDirective($key) + { + unset($this->directives[$key]); + return $this; + } + + /** + * Assembles the directives into a comma-delimited string + * + * @return string + */ + public function getFieldValue() + { + $parts = array(); + ksort($this->directives); + foreach ($this->directives as $key => $value) { + if (true === $value) { + $parts[] = $key; + } else { + if (preg_match('#[^a-zA-Z0-9._-]#', $value)) { + $value = '"' . $value.'"'; + } + $parts[] = "$key=$value"; + } + } + return implode(', ', $parts); + } + + /** + * Returns a string representation of the HTTP Cache-Control header + * + * @return string + */ + public function toString() + { + return 'Cache-Control: ' . $this->getFieldValue(); + } + + /** + * Internal function for parsing the value part of a + * HTTP Cache-Control header + * + * @param string $value + * @throws Exception\InvalidArgumentException + * @return array + */ + protected static function parseValue($value) + { + $value = trim($value); + + $directives = array(); + + // handle empty string early so we don't need a separate start state + if ($value == '') { + return $directives; + } + + $lastMatch = null; + + state_directive: + switch (static::match(array('[a-zA-Z][a-zA-Z_-]*'), $value, $lastMatch)) { + case 0: + $directive = $lastMatch; + goto state_value; + break; + + default: + throw new Exception\InvalidArgumentException('expected DIRECTIVE'); + break; + } + + state_value: + switch (static::match(array('="[^"]*"', '=[^",\s;]*'), $value, $lastMatch)) { + case 0: + $directives[$directive] = substr($lastMatch, 2, -1); + goto state_separator; + break; + + case 1: + $directives[$directive] = rtrim(substr($lastMatch, 1)); + goto state_separator; + break; + + default: + $directives[$directive] = true; + goto state_separator; + break; + } + + state_separator: + switch (static::match(array('\s*,\s*', '$'), $value, $lastMatch)) { + case 0: + goto state_directive; + break; + + case 1: + return $directives; + break; + + default: + throw new Exception\InvalidArgumentException('expected SEPARATOR or END'); + break; + + } + } + + /** + * Internal function used by parseValue to match tokens + * + * @param array $tokens + * @param string $string + * @param string $lastMatch + * @return int + */ + protected static function match($tokens, &$string, &$lastMatch) + { + foreach ($tokens as $i => $token) { + if (preg_match('/^' . $token . '/', $string, $matches)) { + $lastMatch = $matches[0]; + $string = substr($string, strlen($matches[0])); + return $i; + } + } + return -1; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Connection.php b/vendor/zendframework/zend-http/Zend/Http/Header/Connection.php new file mode 100644 index 0000000000..16cb1258be --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Connection.php @@ -0,0 +1,120 @@ +setValue(trim($value)); + + return $header; + } + + + /** + * Set Connection header to define persistent connection + * + * @param bool $flag + * @return Connection + */ + public function setPersistent($flag) + { + if ((bool) $flag === true) { + $this->value = self::CONNECTION_KEEP_ALIVE; + } else { + $this->value = self::CONNECTION_CLOSE; + } + return $this; + } + + /** + * Get whether this connection is persistent + * + * @return bool + */ + public function isPersistent() + { + return ($this->value === self::CONNECTION_KEEP_ALIVE); + } + + /** + * Set arbitrary header value + * RFC allows any token as value, 'close' and 'keep-alive' are commonly used + * + * @param string $value + * @return Connection + */ + public function setValue($value) + { + $this->value = strtolower($value); + return $this; + } + + + /** + * Connection header name + * + * @return string + */ + public function getFieldName() + { + return 'Connection'; + } + + /** + * Connection header value + * + * @return string + */ + public function getFieldValue() + { + return $this->value; + } + + /** + * Return header line + * + * @return string + */ + public function toString() + { + return 'Connection: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentDisposition.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentDisposition.php new file mode 100644 index 0000000000..60b1f7a574 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentDisposition.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-Disposition'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-Disposition: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentEncoding.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentEncoding.php new file mode 100644 index 0000000000..b3a99478a4 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentEncoding.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-Encoding'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-Encoding: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentLanguage.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentLanguage.php new file mode 100644 index 0000000000..d0250ccd00 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentLanguage.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-Language'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-Language: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentLength.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentLength.php new file mode 100644 index 0000000000..e4c89862ab --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentLength.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-Length'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-Length: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentLocation.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentLocation.php new file mode 100644 index 0000000000..018761d2bf --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentLocation.php @@ -0,0 +1,28 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-MD5'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-MD5: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentRange.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentRange.php new file mode 100644 index 0000000000..4c3f473d31 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentRange.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-Range'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-Range: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentSecurityPolicy.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentSecurityPolicy.php new file mode 100644 index 0000000000..5ddb53359e --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentSecurityPolicy.php @@ -0,0 +1,150 @@ +directives; + } + + /** + * Sets the directive to consist of the source list + * + * Reverses http://www.w3.org/TR/CSP/#parsing-1 + * + * @param string $name The directive name. + * @param array $sources The source list. + * @return self + * @throws Exception\InvalidArgumentException If the name is not a valid directive name. + */ + public function setDirective($name, array $sources) + { + if (!in_array($name, $this->validDirectiveNames, true)) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects a valid directive name; received "%s"', + __METHOD__, + (string) $name + )); + } + if (empty($sources)) { + $this->directives[$name] = "'none'"; + } else { + $this->directives[$name] = implode(' ', $sources); + } + return $this; + } + + /** + * Create Content Security Policy header from a given header line + * + * @param string $headerLine The header line to parse. + * @return self + * @throws Exception\InvalidArgumentException If the name field in the given header line does not match. + */ + public static function fromString($headerLine) + { + $header = new static(); + $headerName = $header->getFieldName(); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); + // Ensure the proper header name + if (strcasecmp($name, $headerName) != 0) { + throw new Exception\InvalidArgumentException(sprintf( + 'Invalid header line for %s string: "%s"', + $headerName, + $name + )); + } + // As per http://www.w3.org/TR/CSP/#parsing + $tokens = explode(';', $value); + foreach ($tokens as $token) { + $token = trim($token); + if ($token) { + list($directiveName, $directiveValue) = explode(' ', $token, 2); + if (!isset($header->directives[$directiveName])) { + $header->directives[$directiveName] = $directiveValue; + } + } + } + return $header; + } + + /** + * Get the header name + * + * @return string + */ + public function getFieldName() + { + return 'Content-Security-Policy'; + } + + /** + * Get the header value + * + * @return string + */ + public function getFieldValue() + { + $directives = array(); + foreach ($this->directives as $name => $value) { + $directives[] = sprintf('%s %s;', $name, $value); + } + return implode(' ', $directives); + } + + /** + * Return the header as a string + * + * @return string + */ + public function toString() + { + return sprintf('%s: %s', $this->getFieldName(), $this->getFieldValue()); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentTransferEncoding.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentTransferEncoding.php new file mode 100644 index 0000000000..b531489b89 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentTransferEncoding.php @@ -0,0 +1,56 @@ +value = $value; + } + + public function getFieldName() + { + return 'Content-Transfer-Encoding'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Content-Transfer-Encoding: ' . $this->getFieldValue(); + } + +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ContentType.php b/vendor/zendframework/zend-http/Zend/Http/Header/ContentType.php new file mode 100644 index 0000000000..df67954956 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ContentType.php @@ -0,0 +1,392 @@ + 0) { + $parameters = array(); + foreach ($parts as $parameter) { + $parameter = trim($parameter); + if (!preg_match('/^(?P[^\s\=]+)\=(?P[^\s\=]*)$/', $parameter, $matches)) { + continue; + } + $parameters[$matches['key']] = $matches['value']; + } + $header->setParameters($parameters); + } + + return $header; + } + + public function __construct($value = null, $mediaType = null) + { + $this->value = $value; + $this->mediaType = $mediaType; + } + + /** + * Determine if the mediatype value in this header matches the provided criteria + * + * @param array|string $matchAgainst + * @return string|bool Matched value or false + */ + public function match($matchAgainst) + { + if (is_string($matchAgainst)) { + $matchAgainst = $this->splitMediaTypesFromString($matchAgainst); + } + + $mediaType = $this->getMediaType(); + $left = $this->getMediaTypeObjectFromString($mediaType); + + foreach ($matchAgainst as $matchType) { + $matchType = strtolower($matchType); + + if ($mediaType == $matchType) { + return $matchType; + } + + $right = $this->getMediaTypeObjectFromString($matchType); + + // Is the right side a wildcard type? + if ($right->type == '*') { + if ($this->validateSubtype($right, $left)) { + return $matchType; + } + } + + // Do the types match? + if ($right->type == $left->type) { + if ($this->validateSubtype($right, $left)) { + return $matchType; + } + } + } + + return false; + } + + /** + * Create a string representation of the header + * + * @return string + */ + public function toString() + { + return 'Content-Type: ' . $this->getFieldValue(); + } + + /** + * Get the field name + * + * @return string + */ + public function getFieldName() + { + return 'Content-Type'; + } + + /** + * Get the field value + * + * @return string + */ + public function getFieldValue() + { + if (null !== $this->value) { + return $this->value; + } + return $this->assembleValue(); + } + + /** + * Set the media type + * + * @param string $mediaType + * @return self + */ + public function setMediaType($mediaType) + { + $this->mediaType = strtolower($mediaType); + $this->value = null; + return $this; + } + + /** + * Get the media type + * + * @return string + */ + public function getMediaType() + { + return $this->mediaType; + } + + /** + * Set additional content-type parameters + * + * @param array $parameters + * @return self + */ + public function setParameters(array $parameters) + { + $this->parameters = array_merge($this->parameters, $parameters); + $this->value = null; + return $this; + } + + /** + * Get any additional content-type parameters currently set + * + * @return array + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Set the content-type character set encoding + * + * @param string $charset + * @return self + */ + public function setCharset($charset) + { + $this->parameters['charset'] = $charset; + $this->value = null; + return $this; + } + + /** + * Get the content-type character set encoding, if any + * + * @return null|string + */ + public function getCharset() + { + if (isset($this->parameters['charset'])) { + return $this->parameters['charset']; + } + return null; + } + + /** + * Assemble the value based on the media type and any available parameters + * + * @return string + */ + protected function assembleValue() + { + $mediaType = $this->getMediaType(); + if (empty($this->parameters)) { + return $mediaType; + } + + $parameters = array(); + foreach ($this->parameters as $key => $value) { + $parameters[] = sprintf('%s=%s', $key, $value); + } + + return sprintf('%s; %s', $mediaType, implode('; ', $parameters)); + } + + /** + * Split comma-separated media types into an array + * + * @param string $criteria + * @return array + */ + protected function splitMediaTypesFromString($criteria) + { + $mediaTypes = explode(',', $criteria); + array_walk( + $mediaTypes, + function (&$value) { + $value = trim($value); + } + ); + + return $mediaTypes; + } + + /** + * Split a mediatype string into an object with the following parts: + * + * - type + * - subtype + * - format + * + * @param string $string + * @return stdClass + */ + protected function getMediaTypeObjectFromString($string) + { + if (!is_string($string)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Non-string mediatype "%s" provided', + (is_object($string) ? get_class($string) : gettype($string)) + )); + } + + $parts = explode('/', $string, 2); + if (1 == count($parts)) { + throw new Exception\DomainException(sprintf( + 'Invalid mediatype "%s" provided', + $string + )); + } + + $type = array_shift($parts); + $subtype = array_shift($parts); + $format = $subtype; + if (strstr($subtype, '+')) { + $parts = explode('+', $subtype, 2); + $subtype = array_shift($parts); + $format = array_shift($parts); + } + + $mediaType = (object) array( + 'type' => $type, + 'subtype' => $subtype, + 'format' => $format, + ); + + return $mediaType; + } + + /** + * Validate a subtype + * + * @param stdClass $right + * @param stdClass $left + * @return bool + */ + protected function validateSubtype($right, $left) + { + // Is the right side a wildcard subtype? + if ($right->subtype == '*') { + return $this->validateFormat($right, $left); + } + + // Do the right side and left side subtypes match? + if ($right->subtype == $left->subtype) { + return $this->validateFormat($right, $left); + } + + // Is the right side a partial wildcard? + if ('*' == substr($right->subtype, -1)) { + // validate partial-wildcard subtype + if (!$this->validatePartialWildcard($right->subtype, $left->subtype)) { + return false; + } + // Finally, verify format is valid + return $this->validateFormat($right, $left); + } + + // Does the right side subtype match the left side format? + if ($right->subtype == $left->format) { + return true; + } + + // At this point, there is no valid match + return false; + } + + /** + * Validate the format + * + * Validate that the right side format matches what the left side defines. + * + * @param string $right + * @param string $left + * @return bool + */ + protected function validateFormat($right, $left) + { + if ($right->format && $left->format) { + if ($right->format == '*') { + return true; + } + if ($right->format == $left->format) { + return true; + } + return false; + } + + return true; + } + + /** + * Validate a partial wildcard (i.e., string ending in '*') + * + * @param string $right + * @param string $left + * @return bool + */ + protected function validatePartialWildcard($right, $left) + { + $requiredSegment = substr($right, 0, strlen($right) - 1); + if ($requiredSegment == $left) { + return true; + } + + if (strlen($requiredSegment) >= strlen($left)) { + return false; + } + + if (0 === strpos($left, $requiredSegment)) { + return true; + } + + return false; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Cookie.php b/vendor/zendframework/zend-http/Zend/Http/Header/Cookie.php new file mode 100644 index 0000000000..0a737a24f6 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Cookie.php @@ -0,0 +1,117 @@ +getName(), $nvPairs)) { + throw new Exception\InvalidArgumentException('Two cookies with the same name were provided to ' . __CLASS__ . '::' . __METHOD__); + } + + $nvPairs[$setCookie->getName()] = $setCookie->getValue(); + } + return new static($nvPairs); + } + + public static function fromString($headerLine) + { + $header = new static(); + + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); + + // check to ensure proper header type for this factory + if (strtolower($name) !== 'cookie') { + throw new Exception\InvalidArgumentException('Invalid header line for Server string: "' . $name . '"'); + } + + $nvPairs = preg_split('#;\s*#', $value); + + $arrayInfo = array(); + foreach ($nvPairs as $nvPair) { + $parts = explode('=', $nvPair, 2); + if (count($parts) != 2) { + throw new Exception\RuntimeException('Malformed Cookie header found'); + } + list($name, $value) = $parts; + $arrayInfo[$name] = urldecode($value); + } + + $header->exchangeArray($arrayInfo); + + return $header; + } + + public function __construct(array $array = array()) + { + parent::__construct($array, ArrayObject::ARRAY_AS_PROPS); + } + + public function setEncodeValue($encodeValue) + { + $this->encodeValue = (bool) $encodeValue; + return $this; + } + + public function getEncodeValue() + { + return $this->encodeValue; + } + + public function getFieldName() + { + return 'Cookie'; + } + + public function getFieldValue() + { + $nvPairs = array(); + + foreach ($this as $name => $value) { + $nvPairs[] = $name . '=' . (($this->encodeValue) ? urlencode($value) : $value); + } + + return implode('; ', $nvPairs); + } + + public function toString() + { + return 'Cookie: ' . $this->getFieldValue(); + } + + /** + * Get the cookie as a string, suitable for sending as a "Cookie" header in an + * HTTP request + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Date.php b/vendor/zendframework/zend-http/Zend/Http/Header/Date.php new file mode 100644 index 0000000000..f310da1093 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Date.php @@ -0,0 +1,28 @@ +value = $value; + } + + public function getFieldName() + { + return 'Etag'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Etag: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Exception/DomainException.php b/vendor/zendframework/zend-http/Zend/Http/Header/Exception/DomainException.php new file mode 100644 index 0000000000..dc3f03f8f2 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Exception/DomainException.php @@ -0,0 +1,14 @@ +value = $value; + } + + public function getFieldName() + { + return 'Expect'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Expect: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Expires.php b/vendor/zendframework/zend-http/Zend/Http/Header/Expires.php new file mode 100644 index 0000000000..82e8d89c48 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Expires.php @@ -0,0 +1,28 @@ +value = $value; + } + + public function getFieldName() + { + return 'From'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'From: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/GenericHeader.php b/vendor/zendframework/zend-http/Zend/Http/Header/GenericHeader.php new file mode 100644 index 0000000000..81fa5217b7 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/GenericHeader.php @@ -0,0 +1,161 @@ +setFieldName($fieldName); + } + + if ($fieldValue !== null) { + $this->setFieldValue($fieldValue); + } + } + + /** + * Set header field name + * + * @param string $fieldName + * @return GenericHeader + * @throws Exception\InvalidArgumentException If the name does not match with RFC 2616 format. + */ + public function setFieldName($fieldName) + { + if (!is_string($fieldName) || empty($fieldName)) { + throw new Exception\InvalidArgumentException('Header name must be a string'); + } + + // Pre-filter to normalize valid characters, change underscore to dash + $fieldName = str_replace('_', '-', $fieldName); + + /* + * Following RFC 2616 section 4.2 + * + * message-header = field-name ":" [ field-value ] + * field-name = token + * + * @see http://tools.ietf.org/html/rfc2616#section-2.2 for token definition. + */ + if (!preg_match('/^[!#-\'*+\-\.0-9A-Z\^-z|~]+$/', $fieldName)) { + throw new Exception\InvalidArgumentException( + 'Header name must be a valid RFC 2616 (section 4.2) field-name.' + ); + } + + $this->fieldName = $fieldName; + return $this; + } + + /** + * Retrieve header field name + * + * @return string + */ + public function getFieldName() + { + return $this->fieldName; + } + + /** + * Set header field value + * + * @param string $fieldValue + * @return GenericHeader + */ + public function setFieldValue($fieldValue) + { + $fieldValue = (string) $fieldValue; + + if (preg_match('/^\s+$/', $fieldValue)) { + $fieldValue = ''; + } + + $this->fieldValue = $fieldValue; + return $this; + } + + /** + * Retrieve header field value + * + * @return string + */ + public function getFieldValue() + { + return $this->fieldValue; + } + + /** + * Cast to string as a well formed HTTP header line + * + * Returns in form of "NAME: VALUE\r\n" + * + * @return string + */ + public function toString() + { + return $this->getFieldName() . ': ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/GenericMultiHeader.php b/vendor/zendframework/zend-http/Zend/Http/Header/GenericMultiHeader.php new file mode 100644 index 0000000000..62e1c27112 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/GenericMultiHeader.php @@ -0,0 +1,42 @@ +getFieldName(); + $values = array($this->getFieldValue()); + foreach ($headers as $header) { + if (!$header instanceof static) { + throw new Exception\InvalidArgumentException('This method toStringMultipleHeaders was expecting an array of headers of the same type'); + } + $values[] = $header->getFieldValue(); + } + return $name . ': ' . implode(',', $values) . "\r\n"; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/HeaderInterface.php b/vendor/zendframework/zend-http/Zend/Http/Header/HeaderInterface.php new file mode 100644 index 0000000000..1cd2e4654a --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/HeaderInterface.php @@ -0,0 +1,49 @@ +value = $value; + } + + public function getFieldName() + { + return 'Host'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Host: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/IfMatch.php b/vendor/zendframework/zend-http/Zend/Http/Header/IfMatch.php new file mode 100644 index 0000000000..a190ea7703 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/IfMatch.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'If-Match'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'If-Match: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/IfModifiedSince.php b/vendor/zendframework/zend-http/Zend/Http/Header/IfModifiedSince.php new file mode 100644 index 0000000000..d8d9f9a625 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/IfModifiedSince.php @@ -0,0 +1,28 @@ +value = $value; + } + + public function getFieldName() + { + return 'If-None-Match'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'If-None-Match: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/IfRange.php b/vendor/zendframework/zend-http/Zend/Http/Header/IfRange.php new file mode 100644 index 0000000000..ed7f78b8ee --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/IfRange.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'If-Range'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'If-Range: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/IfUnmodifiedSince.php b/vendor/zendframework/zend-http/Zend/Http/Header/IfUnmodifiedSince.php new file mode 100644 index 0000000000..2615596af5 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/IfUnmodifiedSince.php @@ -0,0 +1,28 @@ +value = $value; + } + + public function getFieldName() + { + return 'Keep-Alive'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Keep-Alive: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/LastModified.php b/vendor/zendframework/zend-http/Zend/Http/Header/LastModified.php new file mode 100644 index 0000000000..d9ea8bdb6e --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/LastModified.php @@ -0,0 +1,28 @@ +value = $value; + } + + public function getFieldName() + { + return 'Max-Forwards'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Max-Forwards: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/MultipleHeaderInterface.php b/vendor/zendframework/zend-http/Zend/Http/Header/MultipleHeaderInterface.php new file mode 100644 index 0000000000..3034f7b4a4 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/MultipleHeaderInterface.php @@ -0,0 +1,15 @@ +isValid()) { + throw new Exception\InvalidArgumentException('Invalid header value for Origin key: "' . $name . '"'); + } + + // @todo implementation details + $header->value = $value; + + return $header; + } + + public function getFieldName() + { + return 'Origin'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Origin: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Pragma.php b/vendor/zendframework/zend-http/Zend/Http/Header/Pragma.php new file mode 100644 index 0000000000..e193b98c67 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Pragma.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Pragma'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Pragma: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ProxyAuthenticate.php b/vendor/zendframework/zend-http/Zend/Http/Header/ProxyAuthenticate.php new file mode 100644 index 0000000000..c233e7ad3b --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ProxyAuthenticate.php @@ -0,0 +1,69 @@ +value = $value; + } + + public function getFieldName() + { + return 'Proxy-Authenticate'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Proxy-Authenticate: ' . $this->getFieldValue(); + } + + public function toStringMultipleHeaders(array $headers) + { + $strings = array($this->toString()); + foreach ($headers as $header) { + if (!$header instanceof ProxyAuthenticate) { + throw new Exception\RuntimeException( + 'The ProxyAuthenticate multiple header implementation can only accept an array of ProxyAuthenticate headers' + ); + } + $strings[] = $header->toString(); + } + return implode("\r\n", $strings); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/ProxyAuthorization.php b/vendor/zendframework/zend-http/Zend/Http/Header/ProxyAuthorization.php new file mode 100644 index 0000000000..321411a5e2 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/ProxyAuthorization.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Proxy-Authorization'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Proxy-Authorization: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Range.php b/vendor/zendframework/zend-http/Zend/Http/Header/Range.php new file mode 100644 index 0000000000..b18cea4e0f --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Range.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Range'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Range: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Referer.php b/vendor/zendframework/zend-http/Zend/Http/Header/Referer.php new file mode 100644 index 0000000000..cde2f8615c --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Referer.php @@ -0,0 +1,45 @@ +uri->setFragment(null); + + return $this; + } + + /** + * Return header name + * + * @return string + */ + public function getFieldName() + { + return 'Referer'; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Refresh.php b/vendor/zendframework/zend-http/Zend/Http/Header/Refresh.php new file mode 100644 index 0000000000..557924c1d0 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Refresh.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Refresh'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Refresh: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/RetryAfter.php b/vendor/zendframework/zend-http/Zend/Http/Header/RetryAfter.php new file mode 100644 index 0000000000..cdd239aa42 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/RetryAfter.php @@ -0,0 +1,107 @@ +getFieldName())) { + throw new Exception\InvalidArgumentException( + 'Invalid header line for "' . $dateHeader->getFieldName() . '" header string' + ); + } + + if (is_numeric($date)) { + $dateHeader->setDeltaSeconds($date); + } else { + $dateHeader->setDate($date); + } + + return $dateHeader; + } + + /** + * Set number of seconds + * + * @param int $delta + * @return RetryAfter + */ + public function setDeltaSeconds($delta) + { + $this->deltaSeconds = (int) $delta; + return $this; + } + + /** + * Get number of seconds + * + * @return int + */ + public function getDeltaSeconds() + { + return $this->deltaSeconds; + } + + /** + * Get header name + * + * @return string + */ + public function getFieldName() + { + return 'Retry-After'; + } + + /** + * Returns date if it's set, or number of seconds + * + * @return int|string + */ + public function getFieldValue() + { + return ($this->date === null) ? $this->deltaSeconds : $this->getDate(); + } + + /** + * Return header line + * + * @return string + */ + public function toString() + { + return 'Retry-After: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Server.php b/vendor/zendframework/zend-http/Zend/Http/Header/Server.php new file mode 100644 index 0000000000..1cf38b1964 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Server.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Server'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Server: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/SetCookie.php b/vendor/zendframework/zend-http/Zend/Http/Header/SetCookie.php new file mode 100644 index 0000000000..0f5903d31e --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/SetCookie.php @@ -0,0 +1,629 @@ +[^=]+)=\s*("?)(?P[^"]*)\2#', $keyValue, $matches)) { + $headerKey = $matches['headerKey']; + $headerValue= $matches['headerValue']; + } else { + $headerKey = $keyValue; + $headerValue = null; + } + + // First K=V pair is always the cookie name and value + if ($header->getName() === NULL) { + $header->setName($headerKey); + $header->setValue(urldecode($headerValue)); + continue; + } + + // Process the remaining elements + switch (str_replace(array('-', '_'), '', strtolower($headerKey))) { + case 'expires' : $header->setExpires($headerValue); break; + case 'domain' : $header->setDomain($headerValue); break; + case 'path' : $header->setPath($headerValue); break; + case 'secure' : $header->setSecure(true); break; + case 'httponly': $header->setHttponly(true); break; + case 'version' : $header->setVersion((int) $headerValue); break; + case 'maxage' : $header->setMaxAge((int) $headerValue); break; + default: + // Intentionally omitted + } + } + + return $header; + }; + } + + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); + + // some sites return set-cookie::value, this is to get rid of the second : + $name = (strtolower($name) =='set-cookie:') ? 'set-cookie' : $name; + + // check to ensure proper header type for this factory + if (strtolower($name) !== 'set-cookie') { + throw new Exception\InvalidArgumentException('Invalid header line for Set-Cookie string: "' . $name . '"'); + } + + $multipleHeaders = preg_split('#(?type = 'Cookie'; + + $this->setName($name) + ->setValue($value) + ->setVersion($version) + ->setMaxAge($maxAge) + ->setDomain($domain) + ->setExpires($expires) + ->setPath($path) + ->setSecure($secure) + ->setHttpOnly($httponly); + } + + /** + * @return string 'Set-Cookie' + */ + public function getFieldName() + { + return 'Set-Cookie'; + } + + /** + * @throws Exception\RuntimeException + * @return string + */ + public function getFieldValue() + { + if ($this->getName() == '') { + return ''; + } + + $value = urlencode($this->getValue()); + if ( $this->hasQuoteFieldValue() ) { + $value = '"'. $value . '"'; + } + + $fieldValue = $this->getName() . '=' . $value; + + $version = $this->getVersion(); + if ($version!==null) { + $fieldValue .= '; Version=' . $version; + } + + $maxAge = $this->getMaxAge(); + if ($maxAge!==null) { + $fieldValue .= '; Max-Age=' . $maxAge; + } + + $expires = $this->getExpires(); + if ($expires) { + $fieldValue .= '; Expires=' . $expires; + } + + $domain = $this->getDomain(); + if ($domain) { + $fieldValue .= '; Domain=' . $domain; + } + + $path = $this->getPath(); + if ($path) { + $fieldValue .= '; Path=' . $path; + } + + if ($this->isSecure()) { + $fieldValue .= '; Secure'; + } + + if ($this->isHttponly()) { + $fieldValue .= '; HttpOnly'; + } + + return $fieldValue; + } + + /** + * @param string $name + * @throws Exception\InvalidArgumentException + * @return SetCookie + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $value + * @return SetCookie + */ + public function setValue($value) + { + $this->value = $value; + return $this; + } + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Set version + * + * @param int $version + * @throws Exception\InvalidArgumentException + * @return SetCookie + */ + public function setVersion($version) + { + if ($version !== null && !is_int($version)) { + throw new Exception\InvalidArgumentException('Invalid Version number specified'); + } + $this->version = $version; + return $this; + } + + /** + * Get version + * + * @return int + */ + public function getVersion() + { + return $this->version; + } + + /** + * Set Max-Age + * + * @param int $maxAge + * @throws Exception\InvalidArgumentException + * @return SetCookie + */ + public function setMaxAge($maxAge) + { + if ($maxAge !== null && (!is_int($maxAge) || ($maxAge < 0))) { + throw new Exception\InvalidArgumentException('Invalid Max-Age number specified'); + } + $this->maxAge = $maxAge; + return $this; + } + + /** + * Get Max-Age + * + * @return int + */ + public function getMaxAge() + { + return $this->maxAge; + } + + /** + * @param int|string $expires + * @throws Exception\InvalidArgumentException + * @return SetCookie + */ + public function setExpires($expires) + { + if ($expires === null) { + $this->expires = null; + return $this; + } + + $tsExpires = $expires; + if (is_string($expires)) { + $tsExpires = strtotime($expires); + + // if $tsExpires is invalid and PHP is compiled as 32bit. Check if it fail reason is the 2038 bug + if (!is_int($tsExpires) && PHP_INT_SIZE === 4) { + $dateTime = new \DateTime($expires); + if ( $dateTime->format('Y') > 2038) { + $tsExpires = PHP_INT_MAX; + } + } + } + + if (!is_int($tsExpires) || $tsExpires < 0) { + throw new Exception\InvalidArgumentException('Invalid expires time specified'); + } + + $this->expires = $tsExpires; + return $this; + } + + /** + * @param bool $inSeconds + * @return int|string + */ + public function getExpires($inSeconds = false) + { + if ($this->expires === null) { + return; + } + if ($inSeconds) { + return $this->expires; + } + return gmdate('D, d-M-Y H:i:s', $this->expires) . ' GMT'; + } + + /** + * @param string $domain + * @return SetCookie + */ + public function setDomain($domain) + { + $this->domain = $domain; + return $this; + } + + /** + * @return string + */ + public function getDomain() + { + return $this->domain; + } + + /** + * @param string $path + * @return SetCookie + */ + public function setPath($path) + { + $this->path = $path; + return $this; + } + + /** + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * @param bool $secure + * @return SetCookie + */ + public function setSecure($secure) + { + $this->secure = $secure; + return $this; + } + + /** + * Set whether the value for this cookie should be quoted + * + * @param bool $quotedValue + * @return SetCookie + */ + public function setQuoteFieldValue($quotedValue) + { + $this->quoteFieldValue = (bool) $quotedValue; + return $this; + } + + /** + * @return bool + */ + public function isSecure() + { + return $this->secure; + } + + /** + * @param bool $httponly + * @return SetCookie + */ + public function setHttponly($httponly) + { + $this->httponly = $httponly; + return $this; + } + + /** + * @return bool + */ + public function isHttponly() + { + return $this->httponly; + } + + /** + * Check whether the cookie has expired + * + * Always returns false if the cookie is a session cookie (has no expiry time) + * + * @param int $now Timestamp to consider as "now" + * @return bool + */ + public function isExpired($now = null) + { + if ($now === null) { + $now = time(); + } + + if (is_int($this->expires) && $this->expires < $now) { + return true; + } + + return false; + } + + /** + * Check whether the cookie is a session cookie (has no expiry time set) + * + * @return bool + */ + public function isSessionCookie() + { + return ($this->expires === null); + } + + /** + * Check whether the value for this cookie should be quoted + * + * @return bool + */ + public function hasQuoteFieldValue() + { + return $this->quoteFieldValue; + } + + public function isValidForRequest($requestDomain, $path, $isSecure = false) + { + if ($this->getDomain() && (strrpos($requestDomain, $this->getDomain()) === false)) { + return false; + } + + if ($this->getPath() && (strpos($path, $this->getPath()) !== 0)) { + return false; + } + + if ($this->secure && $this->isSecure()!==$isSecure) { + return false; + } + + return true; + + } + + /** + * Checks whether the cookie should be sent or not in a specific scenario + * + * @param string|\Zend\Uri\Uri $uri URI to check against (secure, domain, path) + * @param bool $matchSessionCookies Whether to send session cookies + * @param int $now Override the current time when checking for expiry time + * @return bool + * @throws Exception\InvalidArgumentException If URI does not have HTTP or HTTPS scheme. + */ + public function match($uri, $matchSessionCookies = true, $now = null) + { + if (is_string ($uri)) { + $uri = UriFactory::factory($uri); + } + + // Make sure we have a valid Zend_Uri_Http object + if (! ($uri->isValid() && ($uri->getScheme() == 'http' || $uri->getScheme() =='https'))) { + throw new Exception\InvalidArgumentException('Passed URI is not a valid HTTP or HTTPS URI'); + } + + // Check that the cookie is secure (if required) and not expired + if ($this->secure && $uri->getScheme() != 'https') return false; + if ($this->isExpired($now)) return false; + if ($this->isSessionCookie() && ! $matchSessionCookies) return false; + + // Check if the domain matches + if (! self::matchCookieDomain($this->getDomain(), $uri->getHost())) { + return false; + } + + // Check that path matches using prefix match + if (! self::matchCookiePath($this->getPath(), $uri->getPath())) { + return false; + } + + // If we didn't die until now, return true. + return true; + } + + /** + * Check if a cookie's domain matches a host name. + * + * Used by Zend\Http\Cookies for cookie matching + * + * @param string $cookieDomain + * @param string $host + * + * @return bool + */ + public static function matchCookieDomain($cookieDomain, $host) + { + $cookieDomain = strtolower($cookieDomain); + $host = strtolower($host); + // Check for either exact match or suffix match + return ($cookieDomain == $host || + preg_match('/' . preg_quote($cookieDomain) . '$/', $host)); + } + + /** + * Check if a cookie's path matches a URL path + * + * Used by Zend\Http\Cookies for cookie matching + * + * @param string $cookiePath + * @param string $path + * @return bool + */ + public static function matchCookiePath($cookiePath, $path) + { + return (strpos($path, $cookiePath) === 0); + } + + public function toString() + { + return 'Set-Cookie: ' . $this->getFieldValue(); + } + + public function toStringMultipleHeaders(array $headers) + { + $headerLine = $this->toString(); + /* @var $header SetCookie */ + foreach ($headers as $header) { + if (!$header instanceof SetCookie) { + throw new Exception\RuntimeException( + 'The SetCookie multiple header implementation can only accept an array of SetCookie headers' + ); + } + $headerLine .= "\n" . $header->toString(); + } + return $headerLine; + } + + +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/TE.php b/vendor/zendframework/zend-http/Zend/Http/Header/TE.php new file mode 100644 index 0000000000..baf8175ca8 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/TE.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'TE'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'TE: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Trailer.php b/vendor/zendframework/zend-http/Zend/Http/Header/Trailer.php new file mode 100644 index 0000000000..6e032b3344 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Trailer.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Trailer'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Trailer: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/TransferEncoding.php b/vendor/zendframework/zend-http/Zend/Http/Header/TransferEncoding.php new file mode 100644 index 0000000000..8f4380d8d2 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/TransferEncoding.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Transfer-Encoding'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Transfer-Encoding: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Upgrade.php b/vendor/zendframework/zend-http/Zend/Http/Header/Upgrade.php new file mode 100644 index 0000000000..b133c65959 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Upgrade.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Upgrade'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Upgrade: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/UserAgent.php b/vendor/zendframework/zend-http/Zend/Http/Header/UserAgent.php new file mode 100644 index 0000000000..16a02087be --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/UserAgent.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'User-Agent'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'User-Agent: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Vary.php b/vendor/zendframework/zend-http/Zend/Http/Header/Vary.php new file mode 100644 index 0000000000..86c944c782 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Vary.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Vary'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Vary: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Via.php b/vendor/zendframework/zend-http/Zend/Http/Header/Via.php new file mode 100644 index 0000000000..aba2a00d99 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Via.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Via'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Via: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/WWWAuthenticate.php b/vendor/zendframework/zend-http/Zend/Http/Header/WWWAuthenticate.php new file mode 100644 index 0000000000..bec6574d70 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/WWWAuthenticate.php @@ -0,0 +1,69 @@ +value = $value; + } + + public function getFieldName() + { + return 'WWW-Authenticate'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'WWW-Authenticate: ' . $this->getFieldValue(); + } + + public function toStringMultipleHeaders(array $headers) + { + $strings = array($this->toString()); + foreach ($headers as $header) { + if (!$header instanceof WWWAuthenticate) { + throw new Exception\RuntimeException( + 'The WWWAuthenticate multiple header implementation can only accept an array of WWWAuthenticate headers' + ); + } + $strings[] = $header->toString(); + } + return implode("\r\n", $strings); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Header/Warning.php b/vendor/zendframework/zend-http/Zend/Http/Header/Warning.php new file mode 100644 index 0000000000..e0b8699730 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Header/Warning.php @@ -0,0 +1,55 @@ +value = $value; + } + + public function getFieldName() + { + return 'Warning'; + } + + public function getFieldValue() + { + return $this->value; + } + + public function toString() + { + return 'Warning: ' . $this->getFieldValue(); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/HeaderLoader.php b/vendor/zendframework/zend-http/Zend/Http/HeaderLoader.php new file mode 100644 index 0000000000..af617d6704 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/HeaderLoader.php @@ -0,0 +1,79 @@ + 'Zend\Http\Header\Accept', + 'acceptcharset' => 'Zend\Http\Header\AcceptCharset', + 'acceptencoding' => 'Zend\Http\Header\AcceptEncoding', + 'acceptlanguage' => 'Zend\Http\Header\AcceptLanguage', + 'acceptranges' => 'Zend\Http\Header\AcceptRanges', + 'age' => 'Zend\Http\Header\Age', + 'allow' => 'Zend\Http\Header\Allow', + 'authenticationinfo' => 'Zend\Http\Header\AuthenticationInfo', + 'authorization' => 'Zend\Http\Header\Authorization', + 'cachecontrol' => 'Zend\Http\Header\CacheControl', + 'connection' => 'Zend\Http\Header\Connection', + 'contentdisposition' => 'Zend\Http\Header\ContentDisposition', + 'contentencoding' => 'Zend\Http\Header\ContentEncoding', + 'contentlanguage' => 'Zend\Http\Header\ContentLanguage', + 'contentlength' => 'Zend\Http\Header\ContentLength', + 'contentlocation' => 'Zend\Http\Header\ContentLocation', + 'contentmd5' => 'Zend\Http\Header\ContentMD5', + 'contentrange' => 'Zend\Http\Header\ContentRange', + 'contenttransferencoding' => 'Zend\Http\Header\ContentTransferEncoding', + 'contenttype' => 'Zend\Http\Header\ContentType', + 'cookie' => 'Zend\Http\Header\Cookie', + 'date' => 'Zend\Http\Header\Date', + 'etag' => 'Zend\Http\Header\Etag', + 'expect' => 'Zend\Http\Header\Expect', + 'expires' => 'Zend\Http\Header\Expires', + 'from' => 'Zend\Http\Header\From', + 'host' => 'Zend\Http\Header\Host', + 'ifmatch' => 'Zend\Http\Header\IfMatch', + 'ifmodifiedsince' => 'Zend\Http\Header\IfModifiedSince', + 'ifnonematch' => 'Zend\Http\Header\IfNoneMatch', + 'ifrange' => 'Zend\Http\Header\IfRange', + 'ifunmodifiedsince' => 'Zend\Http\Header\IfUnmodifiedSince', + 'keepalive' => 'Zend\Http\Header\KeepAlive', + 'lastmodified' => 'Zend\Http\Header\LastModified', + 'location' => 'Zend\Http\Header\Location', + 'maxforwards' => 'Zend\Http\Header\MaxForwards', + 'origin' => 'Zend\Http\Header\Origin', + 'pragma' => 'Zend\Http\Header\Pragma', + 'proxyauthenticate' => 'Zend\Http\Header\ProxyAuthenticate', + 'proxyauthorization' => 'Zend\Http\Header\ProxyAuthorization', + 'range' => 'Zend\Http\Header\Range', + 'referer' => 'Zend\Http\Header\Referer', + 'refresh' => 'Zend\Http\Header\Refresh', + 'retryafter' => 'Zend\Http\Header\RetryAfter', + 'server' => 'Zend\Http\Header\Server', + 'setcookie' => 'Zend\Http\Header\SetCookie', + 'te' => 'Zend\Http\Header\TE', + 'trailer' => 'Zend\Http\Header\Trailer', + 'transferencoding' => 'Zend\Http\Header\TransferEncoding', + 'upgrade' => 'Zend\Http\Header\Upgrade', + 'useragent' => 'Zend\Http\Header\UserAgent', + 'vary' => 'Zend\Http\Header\Vary', + 'via' => 'Zend\Http\Header\Via', + 'warning' => 'Zend\Http\Header\Warning', + 'wwwauthenticate' => 'Zend\Http\Header\WWWAuthenticate' + ); +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Headers.php b/vendor/zendframework/zend-http/Zend/Http/Headers.php new file mode 100644 index 0000000000..440b5be327 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Headers.php @@ -0,0 +1,456 @@ +[^()><@,;:\"\\/\[\]?=}{ \t]+):.*$/', $line, $matches)) { + if ($current) { + // a header name was present, then store the current complete line + $headers->headersKeys[] = static::createKey($current['name']); + $headers->headers[] = $current; + } + $current = array( + 'name' => $matches['name'], + 'line' => trim($line) + ); + } elseif (preg_match('/^(?P\s+).*$/', $line, $matches)) { + // continuation: append to current line + $current['line'] .= "\r\n" . $matches['ws'] . trim($line); + } elseif (preg_match('/^\s*$/', $line)) { + // empty line indicates end of headers + break; + } else { + // Line does not match header format! + throw new Exception\RuntimeException(sprintf( + 'Line "%s" does not match header format!', + $line + )); + } + } + if ($current) { + $headers->headersKeys[] = static::createKey($current['name']); + $headers->headers[] = $current; + } + return $headers; + } + + /** + * Set an alternate implementation for the PluginClassLoader + * + * @param \Zend\Loader\PluginClassLocator $pluginClassLoader + * @return Headers + */ + public function setPluginClassLoader(PluginClassLocator $pluginClassLoader) + { + $this->pluginClassLoader = $pluginClassLoader; + return $this; + } + + /** + * Return an instance of a PluginClassLocator, lazyload and inject map if necessary + * + * @return PluginClassLocator + */ + public function getPluginClassLoader() + { + if ($this->pluginClassLoader === null) { + $this->pluginClassLoader = new HeaderLoader(); + } + return $this->pluginClassLoader; + } + + /** + * Add many headers at once + * + * Expects an array (or Traversable object) of type/value pairs. + * + * @param array|Traversable $headers + * @return Headers + * @throws Exception\InvalidArgumentException + */ + public function addHeaders($headers) + { + if (!is_array($headers) && !$headers instanceof Traversable) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expected array or Traversable; received "%s"', + (is_object($headers) ? get_class($headers) : gettype($headers)) + )); + } + + foreach ($headers as $name => $value) { + if (is_int($name)) { + if (is_string($value)) { + $this->addHeaderLine($value); + } elseif (is_array($value) && count($value) == 1) { + $this->addHeaderLine(key($value), current($value)); + } elseif (is_array($value) && count($value) == 2) { + $this->addHeaderLine($value[0], $value[1]); + } elseif ($value instanceof Header\HeaderInterface) { + $this->addHeader($value); + } + } elseif (is_string($name)) { + $this->addHeaderLine($name, $value); + } + + } + + return $this; + } + + /** + * Add a raw header line, either in name => value, or as a single string 'name: value' + * + * This method allows for lazy-loading in that the parsing and instantiation of Header object + * will be delayed until they are retrieved by either get() or current() + * + * @throws Exception\InvalidArgumentException + * @param string $headerFieldNameOrLine + * @param string $fieldValue optional + * @return Headers + */ + public function addHeaderLine($headerFieldNameOrLine, $fieldValue = null) + { + $matches = null; + if (preg_match('/^(?P[^()><@,;:\"\\/\[\]?=}{ \t]+):.*$/', $headerFieldNameOrLine, $matches) + && $fieldValue === null) { + // is a header + $headerName = $matches['name']; + $headerKey = static::createKey($matches['name']); + $line = $headerFieldNameOrLine; + } elseif ($fieldValue === null) { + throw new Exception\InvalidArgumentException('A field name was provided without a field value'); + } else { + $headerName = $headerFieldNameOrLine; + $headerKey = static::createKey($headerFieldNameOrLine); + if (is_array($fieldValue)) { + $fieldValue = implode(', ', $fieldValue); + } + $line = $headerFieldNameOrLine . ': ' . $fieldValue; + } + + $this->headersKeys[] = $headerKey; + $this->headers[] = array('name' => $headerName, 'line' => $line); + + return $this; + } + + /** + * Add a Header to this container, for raw values @see addHeaderLine() and addHeaders() + * + * @param Header\HeaderInterface $header + * @return Headers + */ + public function addHeader(Header\HeaderInterface $header) + { + $this->headersKeys[] = static::createKey($header->getFieldName()); + $this->headers[] = $header; + + return $this; + } + + /** + * Remove a Header from the container + * + * @param Header\HeaderInterface $header + * @return bool + */ + public function removeHeader(Header\HeaderInterface $header) + { + $index = array_search($header, $this->headers, true); + if ($index !== false) { + unset($this->headersKeys[$index]); + unset($this->headers[$index]); + + return true; + } + return false; + } + + /** + * Clear all headers + * + * Removes all headers from queue + * + * @return Headers + */ + public function clearHeaders() + { + $this->headers = $this->headersKeys = array(); + return $this; + } + + /** + * Get all headers of a certain name/type + * + * @param string $name + * @return bool|Header\HeaderInterface|ArrayIterator + */ + public function get($name) + { + $key = static::createKey($name); + if (!in_array($key, $this->headersKeys)) { + return false; + } + + $class = ($this->getPluginClassLoader()->load($key)) ?: 'Zend\Http\Header\GenericHeader'; + + if (in_array('Zend\Http\Header\MultipleHeaderInterface', class_implements($class, true))) { + $headers = array(); + foreach (array_keys($this->headersKeys, $key) as $index) { + if (is_array($this->headers[$index])) { + $this->lazyLoadHeader($index); + } + } + foreach (array_keys($this->headersKeys, $key) as $index) { + $headers[] = $this->headers[$index]; + } + return new ArrayIterator($headers); + } + + $index = array_search($key, $this->headersKeys); + if ($index === false) { + return false; + } + + if (is_array($this->headers[$index])) { + return $this->lazyLoadHeader($index); + } + return $this->headers[$index]; + } + + /** + * Test for existence of a type of header + * + * @param string $name + * @return bool + */ + public function has($name) + { + return (in_array(static::createKey($name), $this->headersKeys)); + } + + /** + * Advance the pointer for this object as an iterator + * + * @return void + */ + public function next() + { + next($this->headers); + } + + /** + * Return the current key for this object as an iterator + * + * @return mixed + */ + public function key() + { + return (key($this->headers)); + } + + /** + * Is this iterator still valid? + * + * @return bool + */ + public function valid() + { + return (current($this->headers) !== false); + } + + /** + * Reset the internal pointer for this object as an iterator + * + * @return void + */ + public function rewind() + { + reset($this->headers); + } + + /** + * Return the current value for this iterator, lazy loading it if need be + * + * @return array|Header\HeaderInterface + */ + public function current() + { + $current = current($this->headers); + if (is_array($current)) { + $current = $this->lazyLoadHeader(key($this->headers)); + } + return $current; + } + + /** + * Return the number of headers in this contain, if all headers have not been parsed, actual count could + * increase if MultipleHeader objects exist in the Request/Response. If you need an exact count, iterate + * + * @return int count of currently known headers + */ + public function count() + { + return count($this->headers); + } + + /** + * Render all headers at once + * + * This method handles the normal iteration of headers; it is up to the + * concrete classes to prepend with the appropriate status/request line. + * + * @return string + */ + public function toString() + { + $headers = ''; + foreach ($this->toArray() as $fieldName => $fieldValue) { + if (is_array($fieldValue)) { + // Handle multi-value headers + foreach ($fieldValue as $value) { + $headers .= $fieldName . ': ' . $value . "\r\n"; + } + continue; + } + // Handle single-value headers + $headers .= $fieldName . ': ' . $fieldValue . "\r\n"; + } + return $headers; + } + + /** + * Return the headers container as an array + * + * @todo determine how to produce single line headers, if they are supported + * @return array + */ + public function toArray() + { + $headers = array(); + /* @var $header Header\HeaderInterface */ + foreach ($this->headers as $header) { + if ($header instanceof Header\MultipleHeaderInterface) { + $name = $header->getFieldName(); + if (!isset($headers[$name])) { + $headers[$name] = array(); + } + $headers[$name][] = $header->getFieldValue(); + } elseif ($header instanceof Header\HeaderInterface) { + $headers[$header->getFieldName()] = $header->getFieldValue(); + } else { + $matches = null; + preg_match('/^(?P[^()><@,;:\"\\/\[\]?=}{ \t]+):\s*(?P.*)$/', $header['line'], $matches); + if ($matches) { + $headers[$matches['name']] = $matches['value']; + } + } + } + return $headers; + } + + /** + * By calling this, it will force parsing and loading of all headers, after this count() will be accurate + * + * @return bool + */ + public function forceLoading() + { + foreach ($this as $item) { + // $item should now be loaded + } + return true; + } + + /** + * @param $index + * @return mixed|void + */ + protected function lazyLoadHeader($index) + { + $current = $this->headers[$index]; + + $key = $this->headersKeys[$index]; + /* @var $class Header\HeaderInterface */ + $class = ($this->getPluginClassLoader()->load($key)) ?: 'Zend\Http\Header\GenericHeader'; + + $headers = $class::fromString($current['line']); + if (is_array($headers)) { + $this->headers[$index] = $current = array_shift($headers); + foreach ($headers as $header) { + $this->headersKeys[] = $key; + $this->headers[] = $header; + } + return $current; + } + + $this->headers[$index] = $current = $headers; + return $current; + } + + /** + * Create array key from header name + * + * @param string $name + * @return string + */ + protected static function createKey($name) + { + return str_replace(array('-', '_', ' ', '.'), '', strtolower($name)); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/RemoteAddress.php b/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/RemoteAddress.php new file mode 100644 index 0000000000..077768ab8f --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/RemoteAddress.php @@ -0,0 +1,172 @@ +useProxy = $useProxy; + return $this; + } + + /** + * Checks proxy handling setting. + * + * @return bool Current setting value. + */ + public function getUseProxy() + { + return $this->useProxy; + } + + /** + * Set list of trusted proxy addresses + * + * @param array $trustedProxies + * @return RemoteAddress + */ + public function setTrustedProxies(array $trustedProxies) + { + $this->trustedProxies = $trustedProxies; + return $this; + } + + /** + * Set the header to introspect for proxy IPs + * + * @param string $header + * @return RemoteAddress + */ + public function setProxyHeader($header = 'X-Forwarded-For') + { + $this->proxyHeader = $this->normalizeProxyHeader($header); + return $this; + } + + /** + * Returns client IP address. + * + * @return string IP address. + */ + public function getIpAddress() + { + $ip = $this->getIpAddressFromProxy(); + if ($ip) { + return $ip; + } + + // direct IP address + if (isset($_SERVER['REMOTE_ADDR'])) { + return $_SERVER['REMOTE_ADDR']; + } + + return ''; + } + + /** + * Attempt to get the IP address for a proxied client + * + * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2 + * @return false|string + */ + protected function getIpAddressFromProxy() + { + if (!$this->useProxy + || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies)) + ) { + return false; + } + + $header = $this->proxyHeader; + if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) { + return false; + } + + // Extract IPs + $ips = explode(',', $_SERVER[$header]); + // trim, so we can compare against trusted proxies properly + $ips = array_map('trim', $ips); + // remove trusted proxy IPs + $ips = array_diff($ips, $this->trustedProxies); + + // Any left? + if (empty($ips)) { + return false; + } + + // Since we've removed any known, trusted proxy servers, the right-most + // address represents the first IP we do not know about -- i.e., we do + // not know if it is a proxy server, or a client. As such, we treat it + // as the originating IP. + // @see http://en.wikipedia.org/wiki/X-Forwarded-For + $ip = array_pop($ips); + return $ip; + } + + + /** + * Normalize a header string + * + * Normalizes a header string to a format that is compatible with + * $_SERVER + * + * @param string $header + * @return string + */ + protected function normalizeProxyHeader($header) + { + $header = strtoupper($header); + $header = str_replace('-', '_', $header); + if (0 !== strpos($header, 'HTTP_')) { + $header = 'HTTP_' . $header; + } + return $header; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/Request.php b/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/Request.php new file mode 100644 index 0000000000..4a6cf81c50 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/Request.php @@ -0,0 +1,579 @@ +setEnv(new Parameters($_ENV)); + + if ($_GET) { + $this->setQuery(new Parameters($_GET)); + } + if ($_POST) { + $this->setPost(new Parameters($_POST)); + } + if ($_COOKIE) { + $this->setCookies(new Parameters($_COOKIE)); + } + if ($_FILES) { + // convert PHP $_FILES superglobal + $files = $this->mapPhpFiles(); + $this->setFiles(new Parameters($files)); + } + + $this->setServer(new Parameters($_SERVER)); + } + + /** + * Get raw request body + * + * @return string + */ + public function getContent() + { + if (empty($this->content)) { + $requestBody = file_get_contents('php://input'); + if (strlen($requestBody) > 0) { + $this->content = $requestBody; + } + } + + return $this->content; + } + + /** + * Set cookies + * + * Instantiate and set cookies. + * + * @param $cookie + * @return Request + */ + public function setCookies($cookie) + { + $this->getHeaders()->addHeader(new Cookie((array) $cookie)); + return $this; + } + + /** + * Set the request URI. + * + * @param string $requestUri + * @return self + */ + public function setRequestUri($requestUri) + { + $this->requestUri = $requestUri; + return $this; + } + + /** + * Get the request URI. + * + * @return string + */ + public function getRequestUri() + { + if ($this->requestUri === null) { + $this->requestUri = $this->detectRequestUri(); + } + return $this->requestUri; + } + + /** + * Set the base URL. + * + * @param string $baseUrl + * @return self + */ + public function setBaseUrl($baseUrl) + { + $this->baseUrl = rtrim($baseUrl, '/'); + return $this; + } + + /** + * Get the base URL. + * + * @return string + */ + public function getBaseUrl() + { + if ($this->baseUrl === null) { + $this->setBaseUrl($this->detectBaseUrl()); + } + return $this->baseUrl; + } + + /** + * Set the base path. + * + * @param string $basePath + * @return self + */ + public function setBasePath($basePath) + { + $this->basePath = rtrim($basePath, '/'); + return $this; + } + + /** + * Get the base path. + * + * @return string + */ + public function getBasePath() + { + if ($this->basePath === null) { + $this->setBasePath($this->detectBasePath()); + } + + return $this->basePath; + } + + /** + * Provide an alternate Parameter Container implementation for server parameters in this object, + * (this is NOT the primary API for value setting, for that see getServer()) + * + * @param ParametersInterface $server + * @return Request + */ + public function setServer(ParametersInterface $server) + { + $this->serverParams = $server; + + // This seems to be the only way to get the Authorization header on Apache + if (function_exists('apache_request_headers')) { + $apacheRequestHeaders = apache_request_headers(); + if (!isset($this->serverParams['HTTP_AUTHORIZATION'])) { + if (isset($apacheRequestHeaders['Authorization'])) { + $this->serverParams->set('HTTP_AUTHORIZATION', $apacheRequestHeaders['Authorization']); + } elseif (isset($apacheRequestHeaders['authorization'])) { + $this->serverParams->set('HTTP_AUTHORIZATION', $apacheRequestHeaders['authorization']); + } + } + } + + // set headers + $headers = array(); + + foreach ($server as $key => $value) { + if ($value && strpos($key, 'HTTP_') === 0) { + if (strpos($key, 'HTTP_COOKIE') === 0) { + // Cookies are handled using the $_COOKIE superglobal + continue; + } + $name = strtr(substr($key, 5), '_', ' '); + $name = strtr(ucwords(strtolower($name)), ' ', '-'); + } elseif ($value && strpos($key, 'CONTENT_') === 0) { + $name = substr($key, 8); // Content- + $name = 'Content-' . (($name == 'MD5') ? $name : ucfirst(strtolower($name))); + } else { + continue; + } + + $headers[$name] = $value; + } + + $this->getHeaders()->addHeaders($headers); + + // set method + if (isset($this->serverParams['REQUEST_METHOD'])) { + $this->setMethod($this->serverParams['REQUEST_METHOD']); + } + + // set HTTP version + if (isset($this->serverParams['SERVER_PROTOCOL']) + && strpos($this->serverParams['SERVER_PROTOCOL'], self::VERSION_10) !== false + ) { + $this->setVersion(self::VERSION_10); + } + + // set URI + $uri = new HttpUri(); + + // URI scheme + if ((!empty($this->serverParams['HTTPS']) && $this->serverParams['HTTPS'] !== 'off') + || (!empty($this->serverParams['HTTP_X_FORWARDED_PROTO']) && $this->serverParams['HTTP_X_FORWARDED_PROTO'] == 'https') + ) { + $scheme = 'https'; + } else { + $scheme = 'http'; + } + $uri->setScheme($scheme); + + // URI host & port + $host = null; + $port = null; + + // Set the host + if ($this->getHeaders()->get('host')) { + $host = $this->getHeaders()->get('host')->getFieldValue(); + + // works for regname, IPv4 & IPv6 + if (preg_match('|\:(\d+)$|', $host, $matches)) { + $host = substr($host, 0, -1 * (strlen($matches[1]) + 1)); + $port = (int) $matches[1]; + } + + // set up a validator that check if the hostname is legal (not spoofed) + $hostnameValidator = new HostnameValidator(array( + 'allow' => HostnameValidator::ALLOW_ALL, + 'useIdnCheck' => false, + 'useTldCheck' => false, + )); + // If invalid. Reset the host & port + if (!$hostnameValidator->isValid($host)) { + $host = null; + $port = null; + } + } + + if (!$host && isset($this->serverParams['SERVER_NAME'])) { + $host = $this->serverParams['SERVER_NAME']; + if (isset($this->serverParams['SERVER_PORT'])) { + $port = (int) $this->serverParams['SERVER_PORT']; + } + // Check for missinterpreted IPv6-Address + // Reported at least for Safari on Windows + if (isset($this->serverParams['SERVER_ADDR']) && preg_match('/^\[[0-9a-fA-F\:]+\]$/', $host)) { + $host = '[' . $this->serverParams['SERVER_ADDR'] . ']'; + if ($port . ']' == substr($host, strrpos($host, ':')+1)) { + // The last digit of the IPv6-Address has been taken as port + // Unset the port so the default port can be used + $port = null; + } + } + } + $uri->setHost($host); + $uri->setPort($port); + + // URI path + $requestUri = $this->getRequestUri(); + if (($qpos = strpos($requestUri, '?')) !== false) { + $requestUri = substr($requestUri, 0, $qpos); + } + + $uri->setPath($requestUri); + + // URI query + if (isset($this->serverParams['QUERY_STRING'])) { + $uri->setQuery($this->serverParams['QUERY_STRING']); + } + + $this->setUri($uri); + + return $this; + } + + /** + * Return the parameter container responsible for server parameters or a single parameter value. + * + * @param string|null $name Parameter name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the parameter is missing. + * @see http://www.faqs.org/rfcs/rfc3875.html + * @return \Zend\Stdlib\ParametersInterface|mixed + */ + public function getServer($name = null, $default = null) + { + if ($this->serverParams === null) { + $this->serverParams = new Parameters(); + } + + if ($name === null) { + return $this->serverParams; + } + + return $this->serverParams->get($name, $default); + } + + /** + * Provide an alternate Parameter Container implementation for env parameters in this object, + * (this is NOT the primary API for value setting, for that see env()) + * + * @param ParametersInterface $env + * @return Request + */ + public function setEnv(ParametersInterface $env) + { + $this->envParams = $env; + return $this; + } + + /** + * Return the parameter container responsible for env parameters or a single parameter value. + * + * @param string|null $name Parameter name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the parameter is missing. * @return \Zend\Stdlib\ParametersInterface + * @return \Zend\Stdlib\ParametersInterface|mixed + */ + public function getEnv($name = null, $default = null) + { + if ($this->envParams === null) { + $this->envParams = new Parameters(); + } + + if ($name === null) { + return $this->envParams; + } + + return $this->envParams->get($name, $default); + } + + /** + * Convert PHP superglobal $_FILES into more sane parameter=value structure + * This handles form file input with brackets (name=files[]) + * + * @return array + */ + protected function mapPhpFiles() + { + $files = array(); + foreach ($_FILES as $fileName => $fileParams) { + $files[$fileName] = array(); + foreach ($fileParams as $param => $data) { + if (!is_array($data)) { + $files[$fileName][$param] = $data; + } else { + foreach ($data as $i => $v) { + $this->mapPhpFileParam($files[$fileName], $param, $i, $v); + } + } + } + } + + return $files; + } + + /** + * @param array $array + * @param string $paramName + * @param int|string $index + * @param string|array $value + */ + protected function mapPhpFileParam(&$array, $paramName, $index, $value) + { + if (!is_array($value)) { + $array[$index][$paramName] = $value; + } else { + foreach ($value as $i => $v) { + $this->mapPhpFileParam($array[$index], $paramName, $i, $v); + } + } + } + + /** + * Detect the base URI for the request + * + * Looks at a variety of criteria in order to attempt to autodetect a base + * URI, including rewrite URIs, proxy URIs, etc. + * + * @return string + */ + protected function detectRequestUri() + { + $requestUri = null; + $server = $this->getServer(); + + // Check this first so IIS will catch. + $httpXRewriteUrl = $server->get('HTTP_X_REWRITE_URL'); + if ($httpXRewriteUrl !== null) { + $requestUri = $httpXRewriteUrl; + } + + // Check for IIS 7.0 or later with ISAPI_Rewrite + $httpXOriginalUrl = $server->get('HTTP_X_ORIGINAL_URL'); + if ($httpXOriginalUrl !== null) { + $requestUri = $httpXOriginalUrl; + } + + // IIS7 with URL Rewrite: make sure we get the unencoded url + // (double slash problem). + $iisUrlRewritten = $server->get('IIS_WasUrlRewritten'); + $unencodedUrl = $server->get('UNENCODED_URL', ''); + if ('1' == $iisUrlRewritten && '' !== $unencodedUrl) { + return $unencodedUrl; + } + + // HTTP proxy requests setup request URI with scheme and host [and port] + // + the URL path, only use URL path. + if (!$httpXRewriteUrl) { + $requestUri = $server->get('REQUEST_URI'); + } + + if ($requestUri !== null) { + return preg_replace('#^[^/:]+://[^/]+#', '', $requestUri); + } + + // IIS 5.0, PHP as CGI. + $origPathInfo = $server->get('ORIG_PATH_INFO'); + if ($origPathInfo !== null) { + $queryString = $server->get('QUERY_STRING', ''); + if ($queryString !== '') { + $origPathInfo .= '?' . $queryString; + } + return $origPathInfo; + } + + return '/'; + } + + /** + * Auto-detect the base path from the request environment + * + * Uses a variety of criteria in order to detect the base URL of the request + * (i.e., anything additional to the document root). + * + * + * @return string + */ + protected function detectBaseUrl() + { + $baseUrl = ''; + $filename = $this->getServer()->get('SCRIPT_FILENAME', ''); + $scriptName = $this->getServer()->get('SCRIPT_NAME'); + $phpSelf = $this->getServer()->get('PHP_SELF'); + $origScriptName = $this->getServer()->get('ORIG_SCRIPT_NAME'); + + if ($scriptName !== null && basename($scriptName) === $filename) { + $baseUrl = $scriptName; + } elseif ($phpSelf !== null && basename($phpSelf) === $filename) { + $baseUrl = $phpSelf; + } elseif ($origScriptName !== null && basename($origScriptName) === $filename) { + // 1and1 shared hosting compatibility. + $baseUrl = $origScriptName; + } else { + // Backtrack up the SCRIPT_FILENAME to find the portion + // matching PHP_SELF. + + $baseUrl = '/'; + $basename = basename($filename); + if ($basename) { + $path = ($phpSelf ? trim($phpSelf, '/') : ''); + $baseUrl .= substr($path, 0, strpos($path, $basename)) . $basename; + } + } + + // Does the base URL have anything in common with the request URI? + $requestUri = $this->getRequestUri(); + + // Full base URL matches. + if (0 === strpos($requestUri, $baseUrl)) { + return $baseUrl; + } + + // Directory portion of base path matches. + $baseDir = str_replace('\\', '/', dirname($baseUrl)); + if (0 === strpos($requestUri, $baseDir)) { + return $baseDir; + } + + $truncatedRequestUri = $requestUri; + + if (false !== ($pos = strpos($requestUri, '?'))) { + $truncatedRequestUri = substr($requestUri, 0, $pos); + } + + $basename = basename($baseUrl); + + // No match whatsoever + if (empty($basename) || false === strpos($truncatedRequestUri, $basename)) { + return ''; + } + + // If using mod_rewrite or ISAPI_Rewrite strip the script filename + // out of the base path. $pos !== 0 makes sure it is not matching a + // value from PATH_INFO or QUERY_STRING. + if (strlen($requestUri) >= strlen($baseUrl) + && (false !== ($pos = strpos($requestUri, $baseUrl)) && $pos !== 0) + ) { + $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); + } + + return $baseUrl; + } + + /** + * Autodetect the base path of the request + * + * Uses several criteria to determine the base path of the request. + * + * @return string + */ + protected function detectBasePath() + { + $filename = basename($this->getServer()->get('SCRIPT_FILENAME', '')); + $baseUrl = $this->getBaseUrl(); + + // Empty base url detected + if ($baseUrl === '') { + return ''; + } + + // basename() matches the script filename; return the directory + if (basename($baseUrl) === $filename) { + return str_replace('\\', '/', dirname($baseUrl)); + } + + // Base path is identical to base URL + return $baseUrl; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/Response.php b/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/Response.php new file mode 100644 index 0000000000..1ffbdb1e22 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/PhpEnvironment/Response.php @@ -0,0 +1,132 @@ +version) { + $this->version = $this->detectVersion(); + } + return $this->version; + } + + /** + * Detect the current used protocol version. + * If detection failed it falls back to version 1.0. + * + * @return string + */ + protected function detectVersion() + { + if (isset($_SERVER['SERVER_PROTOCOL']) && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') { + return self::VERSION_11; + } + + return self::VERSION_10; + } + + /** + * @return bool + */ + public function headersSent() + { + return headers_sent(); + } + + /** + * @return bool + */ + public function contentSent() + { + return $this->contentSent; + } + + /** + * Send HTTP headers + * + * @return Response + */ + public function sendHeaders() + { + if ($this->headersSent()) { + return $this; + } + + $status = $this->renderStatusLine(); + header($status); + + /** @var \Zend\Http\Header\HeaderInterface $header */ + foreach ($this->getHeaders() as $header) { + if ($header instanceof MultipleHeaderInterface) { + header($header->toString(), false); + continue; + } + header($header->toString()); + } + + $this->headersSent = true; + return $this; + } + + /** + * Send content + * + * @return Response + */ + public function sendContent() + { + if ($this->contentSent()) { + return $this; + } + + echo $this->getContent(); + $this->contentSent = true; + return $this; + } + + /** + * Send HTTP response + * + * @return Response + */ + public function send() + { + $this->sendHeaders() + ->sendContent(); + return $this; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/README.md b/vendor/zendframework/zend-http/Zend/Http/README.md new file mode 100644 index 0000000000..64b4436f81 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/README.md @@ -0,0 +1,15 @@ +HTTP Component from ZF2 +======================= + +This is the HTTP component for ZF2. + +- File issues at https://github.com/zendframework/zf2/issues +- Create pull requests against https://github.com/zendframework/zf2 +- Documentation is at http://framework.zend.com/docs + +LICENSE +------- + +The files in this archive are released under the [Zend Framework +license](http://framework.zend.com/license), which is a 3-clause BSD license. + diff --git a/vendor/zendframework/zend-http/Zend/Http/Request.php b/vendor/zendframework/zend-http/Zend/Http/Request.php new file mode 100644 index 0000000000..71d36805fe --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Request.php @@ -0,0 +1,506 @@ +' . $methods . ')\s(?P[^ ]*)(?:\sHTTP\/(?P\d+\.\d+)){0,1}#'; + $firstLine = array_shift($lines); + if (!preg_match($regex, $firstLine, $matches)) { + throw new Exception\InvalidArgumentException( + 'A valid request line was not found in the provided string' + ); + } + + $request->setMethod($matches['method']); + $request->setUri($matches['uri']); + + if (isset($matches['version'])) { + $request->setVersion($matches['version']); + } + + if (count($lines) == 0) { + return $request; + } + + $isHeader = true; + $headers = $rawBody = array(); + while ($lines) { + $nextLine = array_shift($lines); + if ($nextLine == '') { + $isHeader = false; + continue; + } + if ($isHeader) { + $headers[] = $nextLine; + } else { + $rawBody[] = $nextLine; + } + } + + if ($headers) { + $request->headers = implode("\r\n", $headers); + } + + if ($rawBody) { + $request->setContent(implode("\r\n", $rawBody)); + } + + return $request; + } + + /** + * Set the method for this request + * + * @param string $method + * @return Request + * @throws Exception\InvalidArgumentException + */ + public function setMethod($method) + { + $method = strtoupper($method); + if (!defined('static::METHOD_' . $method)) { + throw new Exception\InvalidArgumentException('Invalid HTTP method passed'); + } + $this->method = $method; + return $this; + } + + /** + * Return the method for this request + * + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * Set the URI/URL for this request, this can be a string or an instance of Zend\Uri\Http + * + * @throws Exception\InvalidArgumentException + * @param string|HttpUri $uri + * @return Request + */ + public function setUri($uri) + { + if (is_string($uri)) { + try { + $uri = new HttpUri($uri); + } catch (UriException\InvalidUriPartException $e) { + throw new Exception\InvalidArgumentException( + sprintf('Invalid URI passed as string (%s)', (string) $uri), + $e->getCode(), + $e + ); + } + } elseif (!($uri instanceof HttpUri)) { + throw new Exception\InvalidArgumentException( + 'URI must be an instance of Zend\Uri\Http or a string' + ); + } + $this->uri = $uri; + + return $this; + } + + /** + * Return the URI for this request object + * + * @return HttpUri + */ + public function getUri() + { + if ($this->uri === null || is_string($this->uri)) { + $this->uri = new HttpUri($this->uri); + } + return $this->uri; + } + + /** + * Return the URI for this request object as a string + * + * @return string + */ + public function getUriString() + { + if ($this->uri instanceof HttpUri) { + return $this->uri->toString(); + } + return $this->uri; + } + + /** + * Provide an alternate Parameter Container implementation for query parameters in this object, + * (this is NOT the primary API for value setting, for that see getQuery()) + * + * @param \Zend\Stdlib\ParametersInterface $query + * @return Request + */ + public function setQuery(ParametersInterface $query) + { + $this->queryParams = $query; + return $this; + } + + /** + * Return the parameter container responsible for query parameters or a single query parameter + * + * @param string|null $name Parameter name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the parameter is missing. + * @return \Zend\Stdlib\ParametersInterface|mixed + */ + public function getQuery($name = null, $default = null) + { + if ($this->queryParams === null) { + $this->queryParams = new Parameters(); + } + + if ($name === null) { + return $this->queryParams; + } + + return $this->queryParams->get($name, $default); + } + + /** + * Provide an alternate Parameter Container implementation for post parameters in this object, + * (this is NOT the primary API for value setting, for that see getPost()) + * + * @param \Zend\Stdlib\ParametersInterface $post + * @return Request + */ + public function setPost(ParametersInterface $post) + { + $this->postParams = $post; + return $this; + } + + /** + * Return the parameter container responsible for post parameters or a single post parameter. + * + * @param string|null $name Parameter name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the parameter is missing. + * @return \Zend\Stdlib\ParametersInterface|mixed + */ + public function getPost($name = null, $default = null) + { + if ($this->postParams === null) { + $this->postParams = new Parameters(); + } + + if ($name === null) { + return $this->postParams; + } + + return $this->postParams->get($name, $default); + } + + /** + * Return the Cookie header, this is the same as calling $request->getHeaders()->get('Cookie'); + * + * @convenience $request->getHeaders()->get('Cookie'); + * @return Header\Cookie + */ + public function getCookie() + { + return $this->getHeaders()->get('Cookie'); + } + + /** + * Provide an alternate Parameter Container implementation for file parameters in this object, + * (this is NOT the primary API for value setting, for that see getFiles()) + * + * @param ParametersInterface $files + * @return Request + */ + public function setFiles(ParametersInterface $files) + { + $this->fileParams = $files; + return $this; + } + + /** + * Return the parameter container responsible for file parameters or a single file. + * + * @param string|null $name Parameter name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the parameter is missing. + * @return ParametersInterface|mixed + */ + public function getFiles($name = null, $default = null) + { + if ($this->fileParams === null) { + $this->fileParams = new Parameters(); + } + + if ($name === null) { + return $this->fileParams; + } + + return $this->fileParams->get($name, $default); + } + + /** + * Return the header container responsible for headers or all headers of a certain name/type + * + * @see \Zend\Http\Headers::get() + * @param string|null $name Header name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the requested header is missing. + * @return \Zend\Http\Headers|bool|\Zend\Http\Header\HeaderInterface|\ArrayIterator + */ + public function getHeaders($name = null, $default = false) + { + if ($this->headers === null || is_string($this->headers)) { + // this is only here for fromString lazy loading + $this->headers = (is_string($this->headers)) ? Headers::fromString($this->headers) : new Headers(); + } + + if ($name === null) { + return $this->headers; + } + + if ($this->headers->has($name)) { + return $this->headers->get($name); + } + + return $default; + } + + /** + * Get all headers of a certain name/type. + * + * @see Request::getHeaders() + * @param string|null $name Header name to retrieve, or null to get the whole container. + * @param mixed|null $default Default value to use when the requested header is missing. + * @return \Zend\Http\Headers|bool|\Zend\Http\Header\HeaderInterface|\ArrayIterator + */ + public function getHeader($name, $default = false) + { + return $this->getHeaders($name, $default); + } + + /** + * Is this an OPTIONS method request? + * + * @return bool + */ + public function isOptions() + { + return ($this->method === self::METHOD_OPTIONS); + } + + /** + * Is this a PROPFIND method request? + * + * @return bool + */ + public function isPropFind() + { + return ($this->method === self::METHOD_PROPFIND); + } + + /** + * Is this a GET method request? + * + * @return bool + */ + public function isGet() + { + return ($this->method === self::METHOD_GET); + } + + /** + * Is this a HEAD method request? + * + * @return bool + */ + public function isHead() + { + return ($this->method === self::METHOD_HEAD); + } + + /** + * Is this a POST method request? + * + * @return bool + */ + public function isPost() + { + return ($this->method === self::METHOD_POST); + } + + /** + * Is this a PUT method request? + * + * @return bool + */ + public function isPut() + { + return ($this->method === self::METHOD_PUT); + } + + /** + * Is this a DELETE method request? + * + * @return bool + */ + public function isDelete() + { + return ($this->method === self::METHOD_DELETE); + } + + /** + * Is this a TRACE method request? + * + * @return bool + */ + public function isTrace() + { + return ($this->method === self::METHOD_TRACE); + } + + /** + * Is this a CONNECT method request? + * + * @return bool + */ + public function isConnect() + { + return ($this->method === self::METHOD_CONNECT); + } + + /** + * Is this a PATCH method request? + * + * @return bool + */ + public function isPatch() + { + return ($this->method === self::METHOD_PATCH); + } + + /** + * Is the request a Javascript XMLHttpRequest? + * + * Should work with Prototype/Script.aculo.us, possibly others. + * + * @return bool + */ + public function isXmlHttpRequest() + { + $header = $this->getHeaders()->get('X_REQUESTED_WITH'); + return false !== $header && $header->getFieldValue() == 'XMLHttpRequest'; + } + + /** + * Is this a Flash request? + * + * @return bool + */ + public function isFlashRequest() + { + $header = $this->getHeaders()->get('USER_AGENT'); + return false !== $header && stristr($header->getFieldValue(), ' flash'); + } + + /** + * Return the formatted request line (first line) for this http request + * + * @return string + */ + public function renderRequestLine() + { + return $this->method . ' ' . (string) $this->uri . ' HTTP/' . $this->version; + } + + /** + * @return string + */ + public function toString() + { + $str = $this->renderRequestLine() . "\r\n"; + $str .= $this->getHeaders()->toString(); + $str .= "\r\n"; + $str .= $this->getContent(); + return $str; + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Response.php b/vendor/zendframework/zend-http/Zend/Http/Response.php new file mode 100644 index 0000000000..56c420dc49 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Response.php @@ -0,0 +1,547 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + // SUCCESS CODES + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-status', + 208 => 'Already Reported', + // REDIRECTION CODES + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', // Deprecated + 307 => 'Temporary Redirect', + // CLIENT ERROR + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + // SERVER ERROR + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required', + ); + + /** + * @var int Status code + */ + protected $statusCode = 200; + + /** + * @var string|null Null means it will be looked up from the $reasonPhrase list above + */ + protected $reasonPhrase = null; + + /** + * Populate object from string + * + * @param string $string + * @return self + * @throws Exception\InvalidArgumentException + */ + public static function fromString($string) + { + $lines = explode("\r\n", $string); + if (!is_array($lines) || count($lines) == 1) { + $lines = explode("\n", $string); + } + + $firstLine = array_shift($lines); + + $response = new static(); + + $regex = '/^HTTP\/(?P1\.[01]) (?P\d{3})(?:[ ]+(?P.*))?$/'; + $matches = array(); + if (!preg_match($regex, $firstLine, $matches)) { + throw new Exception\InvalidArgumentException( + 'A valid response status line was not found in the provided string' + ); + } + + $response->version = $matches['version']; + $response->setStatusCode($matches['status']); + $response->setReasonPhrase((isset($matches['reason']) ? $matches['reason'] : '')); + + if (count($lines) == 0) { + return $response; + } + + $isHeader = true; + $headers = $content = array(); + + while ($lines) { + $nextLine = array_shift($lines); + + if ($isHeader && $nextLine == '') { + $isHeader = false; + continue; + } + if ($isHeader) { + $headers[] = $nextLine; + } else { + $content[] = $nextLine; + } + } + + if ($headers) { + $response->headers = implode("\r\n", $headers); + } + + if ($content) { + $response->setContent(implode("\r\n", $content)); + } + + return $response; + } + + /** + * @return Header\SetCookie[] + */ + public function getCookie() + { + return $this->getHeaders()->get('Set-Cookie'); + } + + /** + * Set HTTP status code and (optionally) message + * + * @param int $code + * @throws Exception\InvalidArgumentException + * @return self + */ + public function setStatusCode($code) + { + $const = get_class($this) . '::STATUS_CODE_' . $code; + if (!is_numeric($code) || !defined($const)) { + $code = is_scalar($code) ? $code : gettype($code); + throw new Exception\InvalidArgumentException(sprintf( + 'Invalid status code provided: "%s"', + $code + )); + } + $this->statusCode = (int) $code; + return $this; + } + + /** + * Retrieve HTTP status code + * + * @return int + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * Set custom HTTP status code + * + * @param int $code + * @throws Exception\InvalidArgumentException + * @return self + */ + public function setCustomStatusCode($code) + { + if (!is_numeric($code)) { + $code = is_scalar($code) ? $code : gettype($code); + throw new Exception\InvalidArgumentException(sprintf( + 'Invalid status code provided: "%s"', + $code + )); + } + + $this->statusCode = (int) $code; + return $this; + + } + + /** + * @param string $reasonPhrase + * @return self + */ + public function setReasonPhrase($reasonPhrase) + { + $this->reasonPhrase = trim($reasonPhrase); + return $this; + } + + /** + * Get HTTP status message + * + * @return string + */ + public function getReasonPhrase() + { + if (null == $this->reasonPhrase and isset($this->recommendedReasonPhrases[$this->statusCode])) { + return $this->recommendedReasonPhrases[$this->statusCode]; + } + return $this->reasonPhrase; + } + + /** + * Get the body of the response + * + * @return string + */ + public function getBody() + { + $body = (string) $this->getContent(); + + $transferEncoding = $this->getHeaders()->get('Transfer-Encoding'); + + if (!empty($transferEncoding)) { + if (strtolower($transferEncoding->getFieldValue()) == 'chunked') { + $body = $this->decodeChunkedBody($body); + } + } + + $contentEncoding = $this->getHeaders()->get('Content-Encoding'); + + if (!empty($contentEncoding)) { + $contentEncoding = $contentEncoding->getFieldValue(); + if ($contentEncoding =='gzip') { + $body = $this->decodeGzip($body); + } elseif ($contentEncoding == 'deflate') { + $body = $this->decodeDeflate($body); + } + } + + return $body; + } + + /** + * Does the status code indicate a client error? + * + * @return bool + */ + public function isClientError() + { + $code = $this->getStatusCode(); + return ($code < 500 && $code >= 400); + } + + /** + * Is the request forbidden due to ACLs? + * + * @return bool + */ + public function isForbidden() + { + return (403 == $this->getStatusCode()); + } + + /** + * Is the current status "informational"? + * + * @return bool + */ + public function isInformational() + { + $code = $this->getStatusCode(); + return ($code >= 100 && $code < 200); + } + + /** + * Does the status code indicate the resource is not found? + * + * @return bool + */ + public function isNotFound() + { + return (404 === $this->getStatusCode()); + } + + /** + * Do we have a normal, OK response? + * + * @return bool + */ + public function isOk() + { + return (200 === $this->getStatusCode()); + } + + /** + * Does the status code reflect a server error? + * + * @return bool + */ + public function isServerError() + { + $code = $this->getStatusCode(); + return (500 <= $code && 600 > $code); + } + + /** + * Do we have a redirect? + * + * @return bool + */ + public function isRedirect() + { + $code = $this->getStatusCode(); + return (300 <= $code && 400 > $code); + } + + /** + * Was the response successful? + * + * @return bool + */ + public function isSuccess() + { + $code = $this->getStatusCode(); + return (200 <= $code && 300 > $code); + } + + /** + * Render the status line header + * + * @return string + */ + public function renderStatusLine() + { + $status = sprintf( + 'HTTP/%s %d %s', + $this->getVersion(), + $this->getStatusCode(), + $this->getReasonPhrase() + ); + return trim($status); + } + + /** + * Render entire response as HTTP response string + * + * @return string + */ + public function toString() + { + $str = $this->renderStatusLine() . "\r\n"; + $str .= $this->getHeaders()->toString(); + $str .= "\r\n"; + $str .= $this->getContent(); + return $str; + } + + /** + * Decode a "chunked" transfer-encoded body and return the decoded text + * + * @param string $body + * @return string + * @throws Exception\RuntimeException + */ + protected function decodeChunkedBody($body) + { + $decBody = ''; + + while (trim($body)) { + if (! preg_match("/^([\da-fA-F]+)[^\r\n]*\r\n/sm", $body, $m)) { + throw new Exception\RuntimeException( + "Error parsing body - doesn't seem to be a chunked message" + ); + } + + $length = hexdec(trim($m[1])); + $cut = strlen($m[0]); + $decBody .= substr($body, $cut, $length); + $body = substr($body, $cut + $length + 2); + } + + return $decBody; + } + + /** + * Decode a gzip encoded message (when Content-encoding = gzip) + * + * Currently requires PHP with zlib support + * + * @param string $body + * @return string + * @throws Exception\RuntimeException + */ + protected function decodeGzip($body) + { + if (!function_exists('gzinflate')) { + throw new Exception\RuntimeException( + 'zlib extension is required in order to decode "gzip" encoding' + ); + } + + ErrorHandler::start(); + $return = gzinflate(substr($body, 10)); + $test = ErrorHandler::stop(); + if ($test) { + throw new Exception\RuntimeException( + 'Error occurred during gzip inflation', + 0, + $test + ); + } + return $return; + } + + /** + * Decode a zlib deflated message (when Content-encoding = deflate) + * + * Currently requires PHP with zlib support + * + * @param string $body + * @return string + * @throws Exception\RuntimeException + */ + protected function decodeDeflate($body) + { + if (!function_exists('gzuncompress')) { + throw new Exception\RuntimeException( + 'zlib extension is required in order to decode "deflate" encoding' + ); + } + + /** + * Some servers (IIS ?) send a broken deflate response, without the + * RFC-required zlib header. + * + * We try to detect the zlib header, and if it does not exist we + * teat the body is plain DEFLATE content. + * + * This method was adapted from PEAR HTTP_Request2 by (c) Alexey Borzov + * + * @link http://framework.zend.com/issues/browse/ZF-6040 + */ + $zlibHeader = unpack('n', substr($body, 0, 2)); + + if ($zlibHeader[1] % 31 == 0) { + return gzuncompress($body); + } + return gzinflate($body); + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/Response/Stream.php b/vendor/zendframework/zend-http/Zend/Http/Response/Stream.php new file mode 100644 index 0000000000..4da7a3f652 --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/Response/Stream.php @@ -0,0 +1,295 @@ +contentLength = $contentLength; + } + + /** + * Get content length + * + * @return int|null + */ + public function getContentLength() + { + return $this->contentLength; + } + + /** + * Get the response as stream + * + * @return resource + */ + public function getStream() + { + return $this->stream; + } + + /** + * Set the response stream + * + * @param resource $stream + * @return Stream + */ + public function setStream($stream) + { + $this->stream = $stream; + return $this; + } + + /** + * Get the cleanup trigger + * + * @return bool + */ + public function getCleanup() + { + return $this->cleanup; + } + + /** + * Set the cleanup trigger + * + * @param bool $cleanup + */ + public function setCleanup($cleanup = true) + { + $this->cleanup = $cleanup; + } + + /** + * Get file name associated with the stream + * + * @return string + */ + public function getStreamName() + { + return $this->streamName; + } + + /** + * Set file name associated with the stream + * + * @param string $streamName Name to set + * @return Stream + */ + public function setStreamName($streamName) + { + $this->streamName = $streamName; + return $this; + } + + /** + * Create a new Zend\Http\Response\Stream object from a stream + * + * @param string $responseString + * @param resource $stream + * @return Stream + * @throws Exception\InvalidArgumentException + * @throws Exception\OutOfRangeException + */ + public static function fromStream($responseString, $stream) + { + if (!is_resource($stream) || get_resource_type($stream) !== 'stream') { + throw new Exception\InvalidArgumentException('A valid stream is required'); + } + + $headerComplete = false; + $headersString = ''; + + $responseArray = explode("\n", $responseString); + + while (count($responseArray)) { + $nextLine = array_shift($responseArray); + $headersString .= $nextLine."\n"; + $nextLineTrimmed = trim($nextLine); + if ($nextLineTrimmed == '') { + $headerComplete = true; + break; + } + } + + if (!$headerComplete) { + while (false !== ($nextLine = fgets($stream))) { + + $headersString .= trim($nextLine)."\r\n"; + if ($nextLine == "\r\n" || $nextLine == "\n") { + $headerComplete = true; + break; + } + } + } + + if (!$headerComplete) { + throw new Exception\OutOfRangeException('End of header not found'); + } + + /** @var Stream $response */ + $response = static::fromString($headersString); + + if (is_resource($stream)) { + $response->setStream($stream); + } + + if (count($responseArray)) { + $response->content = implode("\n", $responseArray); + } + + $headers = $response->getHeaders(); + foreach ($headers as $header) { + if ($header instanceof \Zend\Http\Header\ContentLength) { + $response->setContentLength((int) $header->getFieldValue()); + $contentLength = $response->getContentLength(); + if (strlen($response->content) > $contentLength) { + throw new Exception\OutOfRangeException(sprintf( + 'Too much content was extracted from the stream (%d instead of %d bytes)', + strlen($response->content), + $contentLength + )); + } + break; + } + } + + return $response; + } + + /** + * Get the response body as string + * + * This method returns the body of the HTTP response (the content), as it + * should be in it's readable version - that is, after decoding it (if it + * was decoded), deflating it (if it was gzip compressed), etc. + * + * If you want to get the raw body (as transferred on wire) use + * $this->getRawBody() instead. + * + * @return string + */ + public function getBody() + { + if ($this->stream != null) { + $this->readStream(); + } + return parent::getBody(); + } + + /** + * Get the raw response body (as transferred "on wire") as string + * + * If the body is encoded (with Transfer-Encoding, not content-encoding - + * IE "chunked" body), gzip compressed, etc. it will not be decoded. + * + * @return string + */ + public function getRawBody() + { + if ($this->stream) { + $this->readStream(); + } + return $this->content; + } + + /** + * Read stream content and return it as string + * + * Function reads the remainder of the body from the stream and closes the stream. + * + * @return string + */ + protected function readStream() + { + $contentLength = $this->getContentLength(); + if (null !== $contentLength) { + $bytes = $contentLength - $this->contentStreamed; + } else { + $bytes = -1; // Read the whole buffer + } + + if (!is_resource($this->stream) || $bytes == 0) { + return ''; + } + + $this->content .= stream_get_contents($this->stream, $bytes); + $this->contentStreamed += strlen($this->content); + + if ($this->getContentLength() == $this->contentStreamed) { + $this->stream = null; + } + } + + /** + * Destructor + */ + public function __destruct() + { + if (is_resource($this->stream)) { + $this->stream = null; //Could be listened by others + } + if ($this->cleanup) { + ErrorHandler::start(E_WARNING); + unlink($this->streamName); + ErrorHandler::stop(); + } + } +} diff --git a/vendor/zendframework/zend-http/Zend/Http/composer.json b/vendor/zendframework/zend-http/Zend/Http/composer.json new file mode 100644 index 0000000000..167b67333a --- /dev/null +++ b/vendor/zendframework/zend-http/Zend/Http/composer.json @@ -0,0 +1,28 @@ +{ + "name": "zendframework/zend-http", + "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", + "license": "BSD-3-Clause", + "keywords": [ + "zf2", + "http" + ], + "autoload": { + "psr-0": { + "Zend\\Http\\": "" + } + }, + "target-dir": "Zend/Http", + "require": { + "php": ">=5.3.23", + "zendframework/zend-loader": "self.version", + "zendframework/zend-stdlib": "self.version", + "zendframework/zend-uri": "self.version", + "zendframework/zend-validator": "self.version" + }, + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + } +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/AutoloaderFactory.php b/vendor/zendframework/zend-loader/Zend/Loader/AutoloaderFactory.php new file mode 100644 index 0000000000..be282072ad --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/AutoloaderFactory.php @@ -0,0 +1,220 @@ + + * array( + * '' => $autoloaderOptions, + * ) + * + * + * The factory will then loop through and instantiate each autoloader with + * the specified options, and register each with the spl_autoloader. + * + * You may retrieve the concrete autoloader instances later using + * {@link getRegisteredAutoloaders()}. + * + * Note that the class names must be resolvable on the include_path or via + * the Zend library, using PSR-0 rules (unless the class has already been + * loaded). + * + * @param array|Traversable $options (optional) options to use. Defaults to Zend\Loader\StandardAutoloader + * @return void + * @throws Exception\InvalidArgumentException for invalid options + * @throws Exception\InvalidArgumentException for unloadable autoloader classes + * @throws Exception\DomainException for autoloader classes not implementing SplAutoloader + */ + public static function factory($options = null) + { + if (null === $options) { + if (!isset(static::$loaders[static::STANDARD_AUTOLOADER])) { + $autoloader = static::getStandardAutoloader(); + $autoloader->register(); + static::$loaders[static::STANDARD_AUTOLOADER] = $autoloader; + } + + // Return so we don't hit the next check's exception (we're done here anyway) + return; + } + + if (!is_array($options) && !($options instanceof Traversable)) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException( + 'Options provided must be an array or Traversable' + ); + } + + foreach ($options as $class => $autoloaderOptions) { + if (!isset(static::$loaders[$class])) { + $autoloader = static::getStandardAutoloader(); + if (!class_exists($class) && !$autoloader->autoload($class)) { + require_once 'Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException( + sprintf('Autoloader class "%s" not loaded', $class) + ); + } + + if (!static::isSubclassOf($class, 'Zend\Loader\SplAutoloader')) { + require_once 'Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException( + sprintf('Autoloader class %s must implement Zend\\Loader\\SplAutoloader', $class) + ); + } + + if ($class === static::STANDARD_AUTOLOADER) { + $autoloader->setOptions($autoloaderOptions); + } else { + $autoloader = new $class($autoloaderOptions); + } + $autoloader->register(); + static::$loaders[$class] = $autoloader; + } else { + static::$loaders[$class]->setOptions($autoloaderOptions); + } + } + } + + /** + * Get a list of all autoloaders registered with the factory + * + * Returns an array of autoloader instances. + * + * @return array + */ + public static function getRegisteredAutoloaders() + { + return static::$loaders; + } + + /** + * Retrieves an autoloader by class name + * + * @param string $class + * @return SplAutoloader + * @throws Exception\InvalidArgumentException for non-registered class + */ + public static function getRegisteredAutoloader($class) + { + if (!isset(static::$loaders[$class])) { + require_once 'Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException(sprintf('Autoloader class "%s" not loaded', $class)); + } + return static::$loaders[$class]; + } + + /** + * Unregisters all autoloaders that have been registered via the factory. + * This will NOT unregister autoloaders registered outside of the fctory. + * + * @return void + */ + public static function unregisterAutoloaders() + { + foreach (static::getRegisteredAutoloaders() as $class => $autoloader) { + spl_autoload_unregister(array($autoloader, 'autoload')); + unset(static::$loaders[$class]); + } + } + + /** + * Unregister a single autoloader by class name + * + * @param string $autoloaderClass + * @return bool + */ + public static function unregisterAutoloader($autoloaderClass) + { + if (!isset(static::$loaders[$autoloaderClass])) { + return false; + } + + $autoloader = static::$loaders[$autoloaderClass]; + spl_autoload_unregister(array($autoloader, 'autoload')); + unset(static::$loaders[$autoloaderClass]); + return true; + } + + /** + * Get an instance of the standard autoloader + * + * Used to attempt to resolve autoloader classes, using the + * StandardAutoloader. The instance is marked as a fallback autoloader, to + * allow resolving autoloaders not under the "Zend" namespace. + * + * @return SplAutoloader + */ + protected static function getStandardAutoloader() + { + if (null !== static::$standardAutoloader) { + return static::$standardAutoloader; + } + + + if (!class_exists(static::STANDARD_AUTOLOADER)) { + // Extract the filename from the classname + $stdAutoloader = substr(strrchr(static::STANDARD_AUTOLOADER, '\\'), 1); + require_once __DIR__ . "/$stdAutoloader.php"; + } + $loader = new StandardAutoloader(); + static::$standardAutoloader = $loader; + return static::$standardAutoloader; + } + + /** + * Checks if the object has this class as one of its parents + * + * @see https://bugs.php.net/bug.php?id=53727 + * @see https://github.com/zendframework/zf2/pull/1807 + * + * @param string $className + * @param string $type + * @return bool + */ + protected static function isSubclassOf($className, $type) + { + if (is_subclass_of($className, $type)) { + return true; + } + if (PHP_VERSION_ID >= 50307) { + return false; + } + if (!interface_exists($type)) { + return false; + } + $r = new ReflectionClass($className); + return $r->implementsInterface($type); + } +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/ClassMapAutoloader.php b/vendor/zendframework/zend-loader/Zend/Loader/ClassMapAutoloader.php new file mode 100644 index 0000000000..58b6378dbe --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/ClassMapAutoloader.php @@ -0,0 +1,221 @@ +setOptions($options); + } + } + + /** + * Configure the autoloader + * + * Proxies to {@link registerAutoloadMaps()}. + * + * @param array|Traversable $options + * @return ClassMapAutoloader + */ + public function setOptions($options) + { + $this->registerAutoloadMaps($options); + return $this; + } + + /** + * Register an autoload map + * + * An autoload map may be either an associative array, or a file returning + * an associative array. + * + * An autoload map should be an associative array containing + * classname/file pairs. + * + * @param string|array $map + * @throws Exception\InvalidArgumentException + * @return ClassMapAutoloader + */ + public function registerAutoloadMap($map) + { + if (is_string($map)) { + $location = $map; + if ($this === ($map = $this->loadMapFromFile($location))) { + return $this; + } + } + + if (!is_array($map)) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException(sprintf( + 'Map file provided does not return a map. Map file: "%s"', + (isset($location) && is_string($location) ? $location : 'unexpected type: ' . gettype($map)) + )); + } + + $this->map = array_merge($this->map, $map); + + if (isset($location)) { + $this->mapsLoaded[] = $location; + } + + return $this; + } + + /** + * Register many autoload maps at once + * + * @param array $locations + * @throws Exception\InvalidArgumentException + * @return ClassMapAutoloader + */ + public function registerAutoloadMaps($locations) + { + if (!is_array($locations) && !($locations instanceof Traversable)) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException('Map list must be an array or implement Traversable'); + } + foreach ($locations as $location) { + $this->registerAutoloadMap($location); + } + return $this; + } + + /** + * Retrieve current autoload map + * + * @return array + */ + public function getAutoloadMap() + { + return $this->map; + } + + /** + * {@inheritDoc} + */ + public function autoload($class) + { + if (isset($this->map[$class])) { + require_once $this->map[$class]; + + return $class; + } + + return false; + } + + /** + * Register the autoloader with spl_autoload registry + * + * @return void + */ + public function register() + { + spl_autoload_register(array($this, 'autoload'), true, true); + } + + /** + * Load a map from a file + * + * If the map has been previously loaded, returns the current instance; + * otherwise, returns whatever was returned by calling include() on the + * location. + * + * @param string $location + * @return ClassMapAutoloader|mixed + * @throws Exception\InvalidArgumentException for nonexistent locations + */ + protected function loadMapFromFile($location) + { + if (!file_exists($location)) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException(sprintf( + 'Map file provided does not exist. Map file: "%s"', + (is_string($location) ? $location : 'unexpected type: ' . gettype($location)) + )); + } + + if (!$path = static::realPharPath($location)) { + $path = realpath($location); + } + + if (in_array($path, $this->mapsLoaded)) { + // Already loaded this map + return $this; + } + + $map = include $path; + + return $map; + } + + /** + * Resolve the real_path() to a file within a phar. + * + * @see https://bugs.php.net/bug.php?id=52769 + * @param string $path + * @return string + */ + public static function realPharPath($path) + { + if (!preg_match('|^phar:(/{2,3})|',$path, $match)) { + return; + } + + $prefixLength = 5 + strlen($match[1]); + $parts = explode('/', str_replace(array('/', '\\'), '/', substr($path, $prefixLength))); + $parts = array_values(array_filter($parts, function ($p) { + return ($p !== '' && $p !== '.'); + })); + + array_walk($parts, function ($value, $key) use (&$parts) { + if ($value === '..') { + unset($parts[$key], $parts[$key-1]); + $parts = array_values($parts); + } + }); + + if (file_exists($realPath = str_pad('phar:', $prefixLength, '/') . implode('/', $parts))) { + return $realPath; + } + } +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/Exception/BadMethodCallException.php b/vendor/zendframework/zend-loader/Zend/Loader/Exception/BadMethodCallException.php new file mode 100644 index 0000000000..3ae448817f --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/Exception/BadMethodCallException.php @@ -0,0 +1,17 @@ + path + */ + protected $explicitPaths = array(); + + /** + * @var array An array of namespaceName => namespacePath + */ + protected $namespacedPaths = array(); + + /** + * @var array An array of supported phar extensions (filled on constructor) + */ + protected $pharExtensions = array(); + + /** + * @var array An array of module classes to their containing files + */ + protected $moduleClassMap = array(); + + /** + * Constructor + * + * Allow configuration of the autoloader via the constructor. + * + * @param null|array|Traversable $options + */ + public function __construct($options = null) + { + if (extension_loaded('phar')) { + $this->pharExtensions = array( + 'phar', + 'phar.tar', + 'tar', + ); + + // ext/zlib enabled -> phar can read gzip & zip compressed files + if (extension_loaded('zlib')) { + $this->pharExtensions[] = 'phar.gz'; + $this->pharExtensions[] = 'phar.tar.gz'; + $this->pharExtensions[] = 'tar.gz'; + + $this->pharExtensions[] = 'phar.zip'; + $this->pharExtensions[] = 'zip'; + } + + // ext/bzip2 enabled -> phar can read bz2 compressed files + if (extension_loaded('bzip2')) { + $this->pharExtensions[] = 'phar.bz2'; + $this->pharExtensions[] = 'phar.tar.bz2'; + $this->pharExtensions[] = 'tar.bz2'; + } + } + + if (null !== $options) { + $this->setOptions($options); + } + } + + /** + * Configure the autoloader + * + * In most cases, $options should be either an associative array or + * Traversable object. + * + * @param array|Traversable $options + * @return ModuleAutoloader + */ + public function setOptions($options) + { + $this->registerPaths($options); + return $this; + } + + /** + * Retrieves the class map for all loaded modules. + * + * @return array + */ + public function getModuleClassMap() + { + return $this->moduleClassMap; + } + + /** + * Sets the class map used to speed up the module autoloading. + * + * @param array $classmap + * @return ModuleAutoloader + */ + public function setModuleClassMap(array $classmap) + { + $this->moduleClassMap = $classmap; + + return $this; + } + + /** + * Autoload a class + * + * @param $class + * @return mixed + * False [if unable to load $class] + * get_class($class) [if $class is successfully loaded] + */ + public function autoload($class) + { + // Limit scope of this autoloader + if (substr($class, -7) !== '\Module') { + return false; + } + + if (isset($this->moduleClassMap[$class])) { + require_once $this->moduleClassMap[$class]; + return $class; + } + + $moduleName = substr($class, 0, -7); + if (isset($this->explicitPaths[$moduleName])) { + $classLoaded = $this->loadModuleFromDir($this->explicitPaths[$moduleName], $class); + if ($classLoaded) { + return $classLoaded; + } + + $classLoaded = $this->loadModuleFromPhar($this->explicitPaths[$moduleName], $class); + if ($classLoaded) { + return $classLoaded; + } + } + + if (count($this->namespacedPaths) >= 1) { + foreach ($this->namespacedPaths as $namespace => $path) { + if (false === strpos($moduleName, $namespace)) { + continue; + } + + $moduleNameBuffer = str_replace($namespace . "\\", "", $moduleName ); + $path .= DIRECTORY_SEPARATOR . $moduleNameBuffer . DIRECTORY_SEPARATOR; + + $classLoaded = $this->loadModuleFromDir($path, $class); + if ($classLoaded) { + return $classLoaded; + } + + $classLoaded = $this->loadModuleFromPhar($path, $class); + if ($classLoaded) { + return $classLoaded; + } + } + } + + + $moduleClassPath = str_replace('\\', DIRECTORY_SEPARATOR, $moduleName); + + $pharSuffixPattern = null; + if ($this->pharExtensions) { + $pharSuffixPattern = '(' . implode('|', array_map('preg_quote', $this->pharExtensions)) . ')'; + } + + foreach ($this->paths as $path) { + $path = $path . $moduleClassPath; + + if ($path == '.' || substr($path, 0, 2) == './' || substr($path, 0, 2) == '.\\') { + $basePath = realpath('.'); + + if (false === $basePath) { + $basePath = getcwd(); + } + + $path = rtrim($basePath, '\/\\') . substr($path, 1); + } + + $classLoaded = $this->loadModuleFromDir($path, $class); + if ($classLoaded) { + return $classLoaded; + } + + // No directory with Module.php, searching for phars + if ($pharSuffixPattern) { + foreach (new GlobIterator($path . '.*') as $entry) { + if ($entry->isDir()) { + continue; + } + + if (!preg_match('#.+\.' . $pharSuffixPattern . '$#', $entry->getPathname())) { + continue; + } + + $classLoaded = $this->loadModuleFromPhar($entry->getPathname(), $class); + if ($classLoaded) { + return $classLoaded; + } + } + } + } + + return false; + } + + /** + * loadModuleFromDir + * + * @param string $dirPath + * @param string $class + * @return mixed + * False [if unable to load $class] + * get_class($class) [if $class is successfully loaded] + */ + protected function loadModuleFromDir($dirPath, $class) + { + $file = new SplFileInfo($dirPath . '/Module.php'); + if ($file->isReadable() && $file->isFile()) { + // Found directory with Module.php in it + require_once $file->getRealPath(); + if (class_exists($class)) { + $this->moduleClassMap[$class] = $file->getRealPath(); + return $class; + } + } + return false; + } + + /** + * loadModuleFromPhar + * + * @param string $pharPath + * @param string $class + * @return mixed + * False [if unable to load $class] + * get_class($class) [if $class is successfully loaded] + */ + protected function loadModuleFromPhar($pharPath, $class) + { + $pharPath = static::normalizePath($pharPath, false); + $file = new SplFileInfo($pharPath); + if (!$file->isReadable() || !$file->isFile()) { + return false; + } + + $fileRealPath = $file->getRealPath(); + + // Phase 0: Check for executable phar with Module class in stub + if (strpos($fileRealPath, '.phar') !== false) { + // First see if the stub makes the Module class available + require_once $fileRealPath; + if (class_exists($class)) { + $this->moduleClassMap[$class] = $fileRealPath; + return $class; + } + } + + // Phase 1: Not executable phar, no stub, or stub did not provide Module class; try Module.php directly + $moduleClassFile = 'phar://' . $fileRealPath . '/Module.php'; + $moduleFile = new SplFileInfo($moduleClassFile); + if ($moduleFile->isReadable() && $moduleFile->isFile()) { + require_once $moduleClassFile; + if (class_exists($class)) { + $this->moduleClassMap[$class] = $moduleClassFile; + return $class; + } + } + + // Phase 2: Check for nested module directory within archive + // Checks for /path/to/MyModule.tar/MyModule/Module.php + // (shell-integrated zip/tar utilities wrap directories like this) + $pharBaseName = $this->pharFileToModuleName($fileRealPath); + $moduleClassFile = 'phar://' . $fileRealPath . '/' . $pharBaseName . '/Module.php'; + $moduleFile = new SplFileInfo($moduleClassFile); + if ($moduleFile->isReadable() && $moduleFile->isFile()) { + require_once $moduleClassFile; + if (class_exists($class)) { + $this->moduleClassMap[$class] = $moduleClassFile; + return $class; + } + } + + return false; + } + + /** + * Register the autoloader with spl_autoload registry + * + * @return void + */ + public function register() + { + spl_autoload_register(array($this, 'autoload')); + } + + /** + * Unregister the autoloader with spl_autoload registry + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'autoload')); + } + + /** + * registerPaths + * + * @param array|Traversable $paths + * @throws \InvalidArgumentException + * @return ModuleAutoloader + */ + public function registerPaths($paths) + { + if (!is_array($paths) && !$paths instanceof Traversable) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException( + 'Parameter to \\Zend\\Loader\\ModuleAutoloader\'s ' + . 'registerPaths method must be an array or ' + . 'implement the Traversable interface' + ); + } + + foreach ($paths as $module => $path) { + if (is_string($module)) { + $this->registerPath($path, $module); + } else { + $this->registerPath($path); + } + } + + return $this; + } + + /** + * registerPath + * + * @param string $path + * @param bool|string $moduleName + * @throws \InvalidArgumentException + * @return ModuleAutoloader + */ + public function registerPath($path, $moduleName = false) + { + if (!is_string($path)) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException(sprintf( + 'Invalid path provided; must be a string, received %s', + gettype($path) + )); + } + if ($moduleName) { + if (in_array( substr($moduleName, -2), array('\\*', '\\%'))) { + $this->namespacedPaths[substr($moduleName, 0, -2)] = static::normalizePath($path); + } else { + $this->explicitPaths[$moduleName] = static::normalizePath($path); + } + } else { + $this->paths[] = static::normalizePath($path); + } + return $this; + } + + /** + * getPaths + * + * This is primarily for unit testing, but could have other uses. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Returns the base module name from the path to a phar + * + * @param string $pharPath + * @return string + */ + protected function pharFileToModuleName($pharPath) + { + do { + $pathinfo = pathinfo($pharPath); + $pharPath = $pathinfo['filename']; + } while (isset($pathinfo['extension'])); + return $pathinfo['filename']; + } + + /** + * Normalize a path for insertion in the stack + * + * @param string $path + * @param bool $trailingSlash Whether trailing slash should be included + * @return string + */ + public static function normalizePath($path, $trailingSlash = true) + { + $path = rtrim($path, '/'); + $path = rtrim($path, '\\'); + if ($trailingSlash) { + $path .= DIRECTORY_SEPARATOR; + } + return $path; + } +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/PluginClassLoader.php b/vendor/zendframework/zend-loader/Zend/Loader/PluginClassLoader.php new file mode 100644 index 0000000000..637014444a --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/PluginClassLoader.php @@ -0,0 +1,217 @@ + class name pairs + * @var array + */ + protected $plugins = array(); + + /** + * Static map allow global seeding of plugin loader + * @var array + */ + protected static $staticMap = array(); + + /** + * Constructor + * + * @param null|array|Traversable $map If provided, seeds the loader with a map + */ + public function __construct($map = null) + { + // Merge in static overrides + if (!empty(static::$staticMap)) { + $this->registerPlugins(static::$staticMap); + } + + // Merge in constructor arguments + if ($map !== null) { + $this->registerPlugins($map); + } + } + + /** + * Add a static map of plugins + * + * A null value will clear the static map. + * + * @param null|array|Traversable $map + * @throws Exception\InvalidArgumentException + * @return void + */ + public static function addStaticMap($map) + { + if (null === $map) { + static::$staticMap = array(); + return; + } + + if (!is_array($map) && !$map instanceof Traversable) { + throw new Exception\InvalidArgumentException('Expects an array or Traversable object'); + } + foreach ($map as $key => $value) { + static::$staticMap[$key] = $value; + } + } + + /** + * Register a class to a given short name + * + * @param string $shortName + * @param string $className + * @return PluginClassLoader + */ + public function registerPlugin($shortName, $className) + { + $this->plugins[strtolower($shortName)] = $className; + return $this; + } + + /** + * Register many plugins at once + * + * If $map is a string, assumes that the map is the class name of a + * Traversable object (likely a ShortNameLocator); it will then instantiate + * this class and use it to register plugins. + * + * If $map is an array or Traversable object, it will iterate it to + * register plugin names/classes. + * + * For all other arguments, or if the string $map is not a class or not a + * Traversable class, an exception will be raised. + * + * @param string|array|Traversable $map + * @return PluginClassLoader + * @throws Exception\InvalidArgumentException + */ + public function registerPlugins($map) + { + if (is_string($map)) { + if (!class_exists($map)) { + throw new Exception\InvalidArgumentException('Map class provided is invalid'); + } + $map = new $map; + } + if (is_array($map)) { + $map = new ArrayIterator($map); + } + if (!$map instanceof Traversable) { + throw new Exception\InvalidArgumentException('Map provided is invalid; must be traversable'); + } + + // iterator_apply doesn't work as expected with IteratorAggregate + if ($map instanceof IteratorAggregate) { + $map = $map->getIterator(); + } + + foreach ($map as $name => $class) { + if (is_int($name) || is_numeric($name)) { + if (!is_object($class) && class_exists($class)) { + $class = new $class(); + } + + if ($class instanceof Traversable) { + $this->registerPlugins($class); + continue; + } + } + + $this->registerPlugin($name, $class); + } + + return $this; + } + + /** + * Unregister a short name lookup + * + * @param mixed $shortName + * @return PluginClassLoader + */ + public function unregisterPlugin($shortName) + { + $lookup = strtolower($shortName); + if (array_key_exists($lookup, $this->plugins)) { + unset($this->plugins[$lookup]); + } + return $this; + } + + /** + * Get a list of all registered plugins + * + * @return array|Traversable + */ + public function getRegisteredPlugins() + { + return $this->plugins; + } + + /** + * Whether or not a plugin by a specific name has been registered + * + * @param string $name + * @return bool + */ + public function isLoaded($name) + { + $lookup = strtolower($name); + return isset($this->plugins[$lookup]); + } + + /** + * Return full class name for a named helper + * + * @param string $name + * @return string|false + */ + public function getClassName($name) + { + return $this->load($name); + } + + /** + * Load a helper via the name provided + * + * @param string $name + * @return string|false + */ + public function load($name) + { + if (!$this->isLoaded($name)) { + return false; + } + return $this->plugins[strtolower($name)]; + } + + /** + * Defined by IteratorAggregate + * + * Returns an instance of ArrayIterator, containing a map of + * all plugins + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->plugins); + } +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/PluginClassLocator.php b/vendor/zendframework/zend-loader/Zend/Loader/PluginClassLocator.php new file mode 100644 index 0000000000..e141586c00 --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/PluginClassLocator.php @@ -0,0 +1,43 @@ + + * spl_autoload_register(array($this, 'autoload')); + * + * + * @return void + */ + public function register(); +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/StandardAutoloader.php b/vendor/zendframework/zend-loader/Zend/Loader/StandardAutoloader.php new file mode 100644 index 0000000000..cddcf26e8e --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/StandardAutoloader.php @@ -0,0 +1,327 @@ +setOptions($options); + } + } + + /** + * Configure autoloader + * + * Allows specifying both "namespace" and "prefix" pairs, using the + * following structure: + * + * array( + * 'namespaces' => array( + * 'Zend' => '/path/to/Zend/library', + * 'Doctrine' => '/path/to/Doctrine/library', + * ), + * 'prefixes' => array( + * 'Phly_' => '/path/to/Phly/library', + * ), + * 'fallback_autoloader' => true, + * ) + * + * + * @param array|\Traversable $options + * @throws Exception\InvalidArgumentException + * @return StandardAutoloader + */ + public function setOptions($options) + { + if (!is_array($options) && !($options instanceof \Traversable)) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException('Options must be either an array or Traversable'); + } + + foreach ($options as $type => $pairs) { + switch ($type) { + case self::AUTOREGISTER_ZF: + if ($pairs) { + $this->registerNamespace('Zend', dirname(__DIR__)); + $this->registerNamespace('ZendXml', dirname(dirname((__DIR__))) . '/ZendXml'); + } + break; + case self::LOAD_NS: + if (is_array($pairs) || $pairs instanceof \Traversable) { + $this->registerNamespaces($pairs); + } + break; + case self::LOAD_PREFIX: + if (is_array($pairs) || $pairs instanceof \Traversable) { + $this->registerPrefixes($pairs); + } + break; + case self::ACT_AS_FALLBACK: + $this->setFallbackAutoloader($pairs); + break; + default: + // ignore + } + } + return $this; + } + + /** + * Set flag indicating fallback autoloader status + * + * @param bool $flag + * @return StandardAutoloader + */ + public function setFallbackAutoloader($flag) + { + $this->fallbackAutoloaderFlag = (bool) $flag; + return $this; + } + + /** + * Is this autoloader acting as a fallback autoloader? + * + * @return bool + */ + public function isFallbackAutoloader() + { + return $this->fallbackAutoloaderFlag; + } + + /** + * Register a namespace/directory pair + * + * @param string $namespace + * @param string $directory + * @return StandardAutoloader + */ + public function registerNamespace($namespace, $directory) + { + $namespace = rtrim($namespace, self::NS_SEPARATOR) . self::NS_SEPARATOR; + $this->namespaces[$namespace] = $this->normalizeDirectory($directory); + return $this; + } + + /** + * Register many namespace/directory pairs at once + * + * @param array $namespaces + * @throws Exception\InvalidArgumentException + * @return StandardAutoloader + */ + public function registerNamespaces($namespaces) + { + if (!is_array($namespaces) && !$namespaces instanceof \Traversable) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException('Namespace pairs must be either an array or Traversable'); + } + + foreach ($namespaces as $namespace => $directory) { + $this->registerNamespace($namespace, $directory); + } + return $this; + } + + /** + * Register a prefix/directory pair + * + * @param string $prefix + * @param string $directory + * @return StandardAutoloader + */ + public function registerPrefix($prefix, $directory) + { + $prefix = rtrim($prefix, self::PREFIX_SEPARATOR). self::PREFIX_SEPARATOR; + $this->prefixes[$prefix] = $this->normalizeDirectory($directory); + return $this; + } + + /** + * Register many namespace/directory pairs at once + * + * @param array $prefixes + * @throws Exception\InvalidArgumentException + * @return StandardAutoloader + */ + public function registerPrefixes($prefixes) + { + if (!is_array($prefixes) && !$prefixes instanceof \Traversable) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException('Prefix pairs must be either an array or Traversable'); + } + + foreach ($prefixes as $prefix => $directory) { + $this->registerPrefix($prefix, $directory); + } + return $this; + } + + /** + * Defined by Autoloadable; autoload a class + * + * @param string $class + * @return false|string + */ + public function autoload($class) + { + $isFallback = $this->isFallbackAutoloader(); + if (false !== strpos($class, self::NS_SEPARATOR)) { + if ($this->loadClass($class, self::LOAD_NS)) { + return $class; + } elseif ($isFallback) { + return $this->loadClass($class, self::ACT_AS_FALLBACK); + } + return false; + } + if (false !== strpos($class, self::PREFIX_SEPARATOR)) { + if ($this->loadClass($class, self::LOAD_PREFIX)) { + return $class; + } elseif ($isFallback) { + return $this->loadClass($class, self::ACT_AS_FALLBACK); + } + return false; + } + if ($isFallback) { + return $this->loadClass($class, self::ACT_AS_FALLBACK); + } + return false; + } + + /** + * Register the autoloader with spl_autoload + * + * @return void + */ + public function register() + { + spl_autoload_register(array($this, 'autoload')); + } + + /** + * Transform the class name to a filename + * + * @param string $class + * @param string $directory + * @return string + */ + protected function transformClassNameToFilename($class, $directory) + { + // $class may contain a namespace portion, in which case we need + // to preserve any underscores in that portion. + $matches = array(); + preg_match('/(?P.+\\\)?(?P[^\\\]+$)/', $class, $matches); + + $class = (isset($matches['class'])) ? $matches['class'] : ''; + $namespace = (isset($matches['namespace'])) ? $matches['namespace'] : ''; + + return $directory + . str_replace(self::NS_SEPARATOR, '/', $namespace) + . str_replace(self::PREFIX_SEPARATOR, '/', $class) + . '.php'; + } + + /** + * Load a class, based on its type (namespaced or prefixed) + * + * @param string $class + * @param string $type + * @return bool|string + * @throws Exception\InvalidArgumentException + */ + protected function loadClass($class, $type) + { + if (!in_array($type, array(self::LOAD_NS, self::LOAD_PREFIX, self::ACT_AS_FALLBACK))) { + require_once __DIR__ . '/Exception/InvalidArgumentException.php'; + throw new Exception\InvalidArgumentException(); + } + + // Fallback autoloading + if ($type === self::ACT_AS_FALLBACK) { + // create filename + $filename = $this->transformClassNameToFilename($class, ''); + $resolvedName = stream_resolve_include_path($filename); + if ($resolvedName !== false) { + return include $resolvedName; + } + return false; + } + + // Namespace and/or prefix autoloading + foreach ($this->$type as $leader => $path) { + if (0 === strpos($class, $leader)) { + // Trim off leader (namespace or prefix) + $trimmedClass = substr($class, strlen($leader)); + + // create filename + $filename = $this->transformClassNameToFilename($trimmedClass, $path); + if (file_exists($filename)) { + return include $filename; + } + } + } + return false; + } + + /** + * Normalize the directory to include a trailing directory separator + * + * @param string $directory + * @return string + */ + protected function normalizeDirectory($directory) + { + $last = $directory[strlen($directory) - 1]; + if (in_array($last, array('/', '\\'))) { + $directory[strlen($directory) - 1] = DIRECTORY_SEPARATOR; + return $directory; + } + $directory .= DIRECTORY_SEPARATOR; + return $directory; + } +} diff --git a/vendor/zendframework/zend-loader/Zend/Loader/composer.json b/vendor/zendframework/zend-loader/Zend/Loader/composer.json new file mode 100644 index 0000000000..f0b419f67d --- /dev/null +++ b/vendor/zendframework/zend-loader/Zend/Loader/composer.json @@ -0,0 +1,24 @@ +{ + "name": "zendframework/zend-loader", + "description": " ", + "license": "BSD-3-Clause", + "keywords": [ + "zf2", + "loader" + ], + "autoload": { + "psr-0": { + "Zend\\Loader\\": "" + } + }, + "target-dir": "Zend/Loader", + "require": { + "php": ">=5.3.23" + }, + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/AbstractFactoryInterface.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/AbstractFactoryInterface.php new file mode 100644 index 0000000000..f54205b25a --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/AbstractFactoryInterface.php @@ -0,0 +1,33 @@ +addInitializer(function ($instance) use ($self) { + if ($instance instanceof ServiceLocatorAwareInterface) { + $instance->setServiceLocator($self); + } + }); + } + + /** + * Validate the plugin + * + * Checks that the filter loaded is either a valid callback or an instance + * of FilterInterface. + * + * @param mixed $plugin + * @return void + * @throws Exception\RuntimeException if invalid + */ + abstract public function validatePlugin($plugin); + + /** + * Retrieve a service from the manager by name + * + * Allows passing an array of options to use when creating the instance. + * createFromInvokable() will use these and pass them to the instance + * constructor if not null and a non-empty array. + * + * @param string $name + * @param array $options + * @param bool $usePeeringServiceManagers + * @return object + */ + public function get($name, $options = array(), $usePeeringServiceManagers = true) + { + // Allow specifying a class name directly; registers as an invokable class + if (!$this->has($name) && $this->autoAddInvokableClass && class_exists($name)) { + $this->setInvokableClass($name, $name); + } + + $this->creationOptions = $options; + $instance = parent::get($name, $usePeeringServiceManagers); + $this->creationOptions = null; + $this->validatePlugin($instance); + return $instance; + } + + /** + * Register a service with the locator. + * + * Validates that the service object via validatePlugin() prior to + * attempting to register it. + * + * @param string $name + * @param mixed $service + * @param bool $shared + * @return AbstractPluginManager + * @throws Exception\InvalidServiceNameException + */ + public function setService($name, $service, $shared = true) + { + if ($service) { + $this->validatePlugin($service); + } + parent::setService($name, $service, $shared); + return $this; + } + + /** + * Set the main service locator so factories can have access to it to pull deps + * + * @param ServiceLocatorInterface $serviceLocator + * @return AbstractPluginManager + */ + public function setServiceLocator(ServiceLocatorInterface $serviceLocator) + { + $this->serviceLocator = $serviceLocator; + return $this; + } + + /** + * Get the main plugin manager. Useful for fetching dependencies from within factories. + * + * @return ServiceLocatorInterface + */ + public function getServiceLocator() + { + return $this->serviceLocator; + } + + /** + * Attempt to create an instance via an invokable class + * + * Overrides parent implementation by passing $creationOptions to the + * constructor, if non-null. + * + * @param string $canonicalName + * @param string $requestedName + * @return null|\stdClass + * @throws Exception\ServiceNotCreatedException If resolved class does not exist + */ + protected function createFromInvokable($canonicalName, $requestedName) + { + $invokable = $this->invokableClasses[$canonicalName]; + + if (null === $this->creationOptions + || (is_array($this->creationOptions) && empty($this->creationOptions)) + ) { + $instance = new $invokable(); + } else { + $instance = new $invokable($this->creationOptions); + } + + return $instance; + } + + /** + * Attempt to create an instance via a factory class + * + * Overrides parent implementation by passing $creationOptions to the + * constructor, if non-null. + * + * @param string $canonicalName + * @param string $requestedName + * @return mixed + * @throws Exception\ServiceNotCreatedException If factory is not callable + */ + protected function createFromFactory($canonicalName, $requestedName) + { + $factory = $this->factories[$canonicalName]; + $hasCreationOptions = !(null === $this->creationOptions || (is_array($this->creationOptions) && empty($this->creationOptions))); + + if (is_string($factory) && class_exists($factory, true)) { + if (!$hasCreationOptions) { + $factory = new $factory(); + } else { + $factory = new $factory($this->creationOptions); + } + + $this->factories[$canonicalName] = $factory; + } + + if ($factory instanceof FactoryInterface) { + $instance = $this->createServiceViaCallback(array($factory, 'createService'), $canonicalName, $requestedName); + } elseif (is_callable($factory)) { + $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName); + } else { + throw new Exception\ServiceNotCreatedException(sprintf( + 'While attempting to create %s%s an invalid factory was registered for this instance type.', $canonicalName, ($requestedName ? '(alias: ' . $requestedName . ')' : '') + )); + } + + return $instance; + } + + /** + * Create service via callback + * + * @param callable $callable + * @param string $cName + * @param string $rName + * @throws Exception\ServiceNotCreatedException + * @throws Exception\ServiceNotFoundException + * @throws Exception\CircularDependencyFoundException + * @return object + */ + protected function createServiceViaCallback($callable, $cName, $rName) + { + if (is_object($callable)) { + $factory = $callable; + } elseif (is_array($callable)) { + // reset both rewinds and returns the value of the first array element + $factory = reset($callable); + } + + if (isset($factory) + && ($factory instanceof MutableCreationOptionsInterface) + && is_array($this->creationOptions) + && !empty($this->creationOptions) + ) { + $factory->setCreationOptions($this->creationOptions); + } + + return parent::createServiceViaCallback($callable, $cName, $rName); + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Config.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Config.php new file mode 100644 index 0000000000..c64bb0e7c3 --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Config.php @@ -0,0 +1,166 @@ +config = $config; + } + + /** + * Get allow override + * + * @return null|bool + */ + public function getAllowOverride() + { + return (isset($this->config['allow_override'])) ? $this->config['allow_override'] : null; + } + + /** + * Get factories + * + * @return array + */ + public function getFactories() + { + return (isset($this->config['factories'])) ? $this->config['factories'] : array(); + } + + /** + * Get abstract factories + * + * @return array + */ + public function getAbstractFactories() + { + return (isset($this->config['abstract_factories'])) ? $this->config['abstract_factories'] : array(); + } + + /** + * Get invokables + * + * @return array + */ + public function getInvokables() + { + return (isset($this->config['invokables'])) ? $this->config['invokables'] : array(); + } + + /** + * Get services + * + * @return array + */ + public function getServices() + { + return (isset($this->config['services'])) ? $this->config['services'] : array(); + } + + /** + * Get aliases + * + * @return array + */ + public function getAliases() + { + return (isset($this->config['aliases'])) ? $this->config['aliases'] : array(); + } + + /** + * Get initializers + * + * @return array + */ + public function getInitializers() + { + return (isset($this->config['initializers'])) ? $this->config['initializers'] : array(); + } + + /** + * Get shared + * + * @return array + */ + public function getShared() + { + return (isset($this->config['shared'])) ? $this->config['shared'] : array(); + } + + /** + * Get the delegator services map, with keys being the services acting as delegates, + * and values being the delegator factories names + * + * @return array + */ + public function getDelegators() + { + return (isset($this->config['delegators'])) ? $this->config['delegators'] : array(); + } + + /** + * Configure service manager + * + * @param ServiceManager $serviceManager + * @return void + */ + public function configureServiceManager(ServiceManager $serviceManager) + { + if (($allowOverride = $this->getAllowOverride()) !== null) { + $serviceManager->setAllowOverride($allowOverride); + } + + foreach ($this->getFactories() as $name => $factory) { + $serviceManager->setFactory($name, $factory); + } + + foreach ($this->getAbstractFactories() as $factory) { + $serviceManager->addAbstractFactory($factory); + } + + foreach ($this->getInvokables() as $name => $invokable) { + $serviceManager->setInvokableClass($name, $invokable); + } + + foreach ($this->getServices() as $name => $service) { + $serviceManager->setService($name, $service); + } + + foreach ($this->getAliases() as $alias => $nameOrAlias) { + $serviceManager->setAlias($alias, $nameOrAlias); + } + + foreach ($this->getInitializers() as $initializer) { + $serviceManager->addInitializer($initializer); + } + + foreach ($this->getShared() as $name => $isShared) { + $serviceManager->setShared($name, $isShared); + } + + foreach ($this->getDelegators() as $originalServiceName => $delegators) { + foreach ($delegators as $delegator) { + $serviceManager->addDelegator($originalServiceName, $delegator); + } + } + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ConfigInterface.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ConfigInterface.php new file mode 100644 index 0000000000..1593312a3a --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ConfigInterface.php @@ -0,0 +1,21 @@ +di = $di; + if (in_array($useServiceLocator, array(self::USE_SL_BEFORE_DI, self::USE_SL_AFTER_DI, self::USE_SL_NONE))) { + $this->useServiceLocator = $useServiceLocator; + } + + // since we are using this in a proxy-fashion, localize state + $this->definitions = $this->di->definitions; + $this->instanceManager = $this->di->instanceManager; + } + + /** + * {@inheritDoc} + */ + public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) + { + $this->serviceLocator = $serviceLocator; + if ($requestedName) { + return $this->get($requestedName, array()); + } + + return $this->get($name, array()); + } + + /** + * {@inheritDoc} + */ + public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) + { + if ($this->instanceManager->hasSharedInstance($requestedName) + || $this->instanceManager->hasAlias($requestedName) + || $this->instanceManager->hasConfig($requestedName) + || $this->instanceManager->hasTypePreferences($requestedName) + ) { + return true; + } + + if (! $this->definitions->hasClass($requestedName) || interface_exists($requestedName)) { + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiInstanceManagerProxy.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiInstanceManagerProxy.php new file mode 100644 index 0000000000..cdd4bf9fa6 --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiInstanceManagerProxy.php @@ -0,0 +1,71 @@ +diInstanceManager = $diInstanceManager; + $this->serviceLocator = $serviceLocator; + + // localize state + $this->aliases = &$diInstanceManager->aliases; + $this->sharedInstances = &$diInstanceManager->sharedInstances; + $this->sharedInstancesWithParams = &$diInstanceManager->sharedInstancesWithParams; + $this->configurations = &$diInstanceManager->configurations; + $this->typePreferences = &$diInstanceManager->typePreferences; + } + + /** + * Determine if we have a shared instance by class or alias + * + * @param $classOrAlias + * @return bool + */ + public function hasSharedInstance($classOrAlias) + { + return ($this->serviceLocator->has($classOrAlias) || $this->diInstanceManager->hasSharedInstance($classOrAlias)); + } + + /** + * Get shared instance + * + * @param $classOrAlias + * @return mixed + */ + public function getSharedInstance($classOrAlias) + { + if ($this->serviceLocator->has($classOrAlias)) { + return $this->serviceLocator->get($classOrAlias); + } + + return $this->diInstanceManager->getSharedInstance($classOrAlias); + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiServiceFactory.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiServiceFactory.php new file mode 100644 index 0000000000..c64784c58d --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiServiceFactory.php @@ -0,0 +1,122 @@ +di = $di; + $this->name = $name; + $this->parameters = $parameters; + if (in_array($useServiceLocator, array(self::USE_SL_BEFORE_DI, self::USE_SL_AFTER_DI, self::USE_SL_NONE))) { + $this->useServiceLocator = $useServiceLocator; + } + + // since we are using this in a proxy-fashion, localize state + $this->definitions = $this->di->definitions; + $this->instanceManager = $this->di->instanceManager; + } + + /** + * Create service + * + * @param ServiceLocatorInterface $serviceLocator + * @return object + */ + public function createService(ServiceLocatorInterface $serviceLocator) + { + $this->serviceLocator = $serviceLocator; + return $this->get($this->name, $this->parameters); + } + + /** + * Override, as we want it to use the functionality defined in the proxy + * + * @param string $name + * @param array $params + * @return object + * @throws Exception\ServiceNotFoundException + */ + public function get($name, array $params = array()) + { + // allow this di service to get dependencies from the service locator BEFORE trying di + if ($this->useServiceLocator == self::USE_SL_BEFORE_DI && $this->serviceLocator->has($name)) { + return $this->serviceLocator->get($name); + } + + try { + + $service = parent::get($name, $params); + return $service; + + } catch (DiClassNotFoundException $e) { + + // allow this di service to get dependencies from the service locator AFTER trying di + if ($this->useServiceLocator == self::USE_SL_AFTER_DI && $this->serviceLocator->has($name)) { + return $this->serviceLocator->get($name); + } else { + throw new Exception\ServiceNotFoundException( + sprintf('Service %s was not found in this DI instance', $name), + null, + $e + ); + } + } + + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiServiceInitializer.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiServiceInitializer.php new file mode 100644 index 0000000000..6bfe8d2eaf --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Di/DiServiceInitializer.php @@ -0,0 +1,67 @@ +di = $di; + $this->serviceLocator = $serviceLocator; + $this->diInstanceManagerProxy = ($diImProxy) ?: new DiInstanceManagerProxy($di->instanceManager(), $serviceLocator); + } + + /** + * Initialize + * + * @param $instance + * @param ServiceLocatorInterface $serviceLocator + * @throws \Exception + */ + public function initialize($instance, ServiceLocatorInterface $serviceLocator) + { + $instanceManager = $this->di->instanceManager; + $this->di->instanceManager = $this->diInstanceManagerProxy; + try { + $this->di->injectDependencies($instance); + $this->di->instanceManager = $instanceManager; + } catch (\Exception $e) { + $this->di->instanceManager = $instanceManager; + throw $e; + } + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Exception/CircularDependencyFoundException.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Exception/CircularDependencyFoundException.php new file mode 100644 index 0000000000..d50ef311ad --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Exception/CircularDependencyFoundException.php @@ -0,0 +1,14 @@ +proxyFactory = $proxyFactory; + $this->servicesMap = $servicesMap; + } + + /** + * {@inheritDoc} + * + * @return object|\ProxyManager\Proxy\LazyLoadingInterface|\ProxyManager\Proxy\ValueHolderInterface + */ + public function createDelegatorWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName, $callback) + { + $initializer = function (& $wrappedInstance, LazyLoadingInterface $proxy) use ($callback) { + $proxy->setProxyInitializer(null); + + $wrappedInstance = call_user_func($callback); + + return true; + }; + + if (isset($this->servicesMap[$requestedName])) { + return $this->proxyFactory->createProxy($this->servicesMap[$requestedName], $initializer); + } elseif (isset($this->servicesMap[$name])) { + return $this->proxyFactory->createProxy($this->servicesMap[$name], $initializer); + } + + throw new Exception\InvalidServiceNameException( + sprintf('The requested service "%s" was not found in the provided services map', $requestedName) + ); + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Proxy/LazyServiceFactoryFactory.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Proxy/LazyServiceFactoryFactory.php new file mode 100644 index 0000000000..2f363a0b63 --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/Proxy/LazyServiceFactoryFactory.php @@ -0,0 +1,62 @@ +get('Config'); + + if (!isset($config['lazy_services'])) { + throw new Exception\InvalidArgumentException('Missing "lazy_services" config key'); + } + + $lazyServices = $config['lazy_services']; + + if (!isset($lazyServices['class_map'])) { + throw new Exception\InvalidArgumentException('Missing "class_map" config key in "lazy_services"'); + } + + $factoryConfig = new Configuration(); + + if (isset($lazyServices['proxies_namespace'])) { + $factoryConfig->setProxiesNamespace($lazyServices['proxies_namespace']); + } + + if (isset($lazyServices['proxies_target_dir'])) { + $factoryConfig->setProxiesTargetDir($lazyServices['proxies_target_dir']); + } + + if (!isset($lazyServices['write_proxy_files']) || ! $lazyServices['write_proxy_files']) { + $factoryConfig->setGeneratorStrategy(new EvaluatingGeneratorStrategy()); + } + + spl_autoload_register($factoryConfig->getProxyAutoloader()); + + return new LazyServiceFactory(new LazyLoadingValueHolderFactory($factoryConfig), $lazyServices['class_map']); + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/README.md b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/README.md new file mode 100644 index 0000000000..9a4ed65071 --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/README.md @@ -0,0 +1,15 @@ +ServiceManager Component from ZF2 +================================= + +This is the ServiceManager component for ZF2. + +- File issues at https://github.com/zendframework/zf2/issues +- Create pull requests against https://github.com/zendframework/zf2 +- Documentation is at http://framework.zend.com/docs + +LICENSE +------- + +The files in this archive are released under the [Zend Framework +license](http://framework.zend.com/license), which is a 3-clause BSD license. + diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceLocatorAwareInterface.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceLocatorAwareInterface.php new file mode 100644 index 0000000000..7f53ada01d --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceLocatorAwareInterface.php @@ -0,0 +1,27 @@ +serviceLocator = $serviceLocator; + + return $this; + } + + /** + * Get service locator + * + * @return ServiceLocatorInterface + */ + public function getServiceLocator() + { + return $this->serviceLocator; + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceLocatorInterface.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceLocatorInterface.php new file mode 100644 index 0000000000..b9a04e5dc1 --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceLocatorInterface.php @@ -0,0 +1,33 @@ + '', '_' => '', ' ' => '', '\\' => '', '/' => ''); + + /** + * Constructor + * + * @param ConfigInterface $config + */ + public function __construct(ConfigInterface $config = null) + { + if ($config) { + $config->configureServiceManager($this); + } + } + + /** + * Set allow override + * + * @param $allowOverride + * @return ServiceManager + */ + public function setAllowOverride($allowOverride) + { + $this->allowOverride = (bool) $allowOverride; + return $this; + } + + /** + * Get allow override + * + * @return bool + */ + public function getAllowOverride() + { + return $this->allowOverride; + } + + /** + * Set flag indicating whether services are shared by default + * + * @param bool $shareByDefault + * @return ServiceManager + * @throws Exception\RuntimeException if allowOverride is false + */ + public function setShareByDefault($shareByDefault) + { + if ($this->allowOverride === false) { + throw new Exception\RuntimeException(sprintf( + '%s: cannot alter default shared service setting; container is marked immutable (allow_override is false)', + get_class($this) . '::' . __FUNCTION__ + )); + } + $this->shareByDefault = (bool) $shareByDefault; + return $this; + } + + /** + * Are services shared by default? + * + * @return bool + */ + public function shareByDefault() + { + return $this->shareByDefault; + } + + /** + * Set throw exceptions in create + * + * @param bool $throwExceptionInCreate + * @return ServiceManager + */ + public function setThrowExceptionInCreate($throwExceptionInCreate) + { + $this->throwExceptionInCreate = $throwExceptionInCreate; + return $this; + } + + /** + * Get throw exceptions in create + * + * @return bool + */ + public function getThrowExceptionInCreate() + { + return $this->throwExceptionInCreate; + } + + /** + * Set flag indicating whether to pull from peering manager before attempting creation + * + * @param bool $retrieveFromPeeringManagerFirst + * @return ServiceManager + */ + public function setRetrieveFromPeeringManagerFirst($retrieveFromPeeringManagerFirst = true) + { + $this->retrieveFromPeeringManagerFirst = (bool) $retrieveFromPeeringManagerFirst; + return $this; + } + + /** + * Should we retrieve from the peering manager prior to attempting to create a service? + * + * @return bool + */ + public function retrieveFromPeeringManagerFirst() + { + return $this->retrieveFromPeeringManagerFirst; + } + + /** + * Set invokable class + * + * @param string $name + * @param string $invokableClass + * @param bool $shared + * @return ServiceManager + * @throws Exception\InvalidServiceNameException + */ + public function setInvokableClass($name, $invokableClass, $shared = null) + { + $cName = $this->canonicalizeName($name); + + if ($this->has(array($cName, $name), false)) { + if ($this->allowOverride === false) { + throw new Exception\InvalidServiceNameException(sprintf( + 'A service by the name or alias "%s" already exists and cannot be overridden; please use an alternate name', + $name + )); + } + $this->unregisterService($cName); + } + + if ($shared === null) { + $shared = $this->shareByDefault; + } + + $this->invokableClasses[$cName] = $invokableClass; + $this->shared[$cName] = (bool) $shared; + + return $this; + } + + /** + * Set factory + * + * @param string $name + * @param string|FactoryInterface|callable $factory + * @param bool $shared + * @return ServiceManager + * @throws Exception\InvalidArgumentException + * @throws Exception\InvalidServiceNameException + */ + public function setFactory($name, $factory, $shared = null) + { + $cName = $this->canonicalizeName($name); + + if (!($factory instanceof FactoryInterface || is_string($factory) || is_callable($factory))) { + throw new Exception\InvalidArgumentException( + 'Provided abstract factory must be the class name of an abstract factory or an instance of an AbstractFactoryInterface.' + ); + } + + if ($this->has(array($cName, $name), false)) { + if ($this->allowOverride === false) { + throw new Exception\InvalidServiceNameException(sprintf( + 'A service by the name or alias "%s" already exists and cannot be overridden, please use an alternate name', + $name + )); + } + $this->unregisterService($cName); + } + + if ($shared === null) { + $shared = $this->shareByDefault; + } + + $this->factories[$cName] = $factory; + $this->shared[$cName] = (bool) $shared; + + return $this; + } + + /** + * Add abstract factory + * + * @param AbstractFactoryInterface|string $factory + * @param bool $topOfStack + * @return ServiceManager + * @throws Exception\InvalidArgumentException if the abstract factory is invalid + */ + public function addAbstractFactory($factory, $topOfStack = true) + { + if (!$factory instanceof AbstractFactoryInterface && is_string($factory)) { + $factory = new $factory(); + } + + if (!$factory instanceof AbstractFactoryInterface) { + throw new Exception\InvalidArgumentException( + 'Provided abstract factory must be the class name of an abstract' + . ' factory or an instance of an AbstractFactoryInterface.' + ); + } + + if ($topOfStack) { + array_unshift($this->abstractFactories, $factory); + } else { + array_push($this->abstractFactories, $factory); + } + return $this; + } + + /** + * Sets the given service name as to be handled by a delegator factory + * + * @param string $serviceName name of the service being the delegate + * @param string $delegatorFactoryName name of the service being the delegator factory + * + * @return ServiceManager + */ + public function addDelegator($serviceName, $delegatorFactoryName) + { + $cName = $this->canonicalizeName($serviceName); + + if (!isset($this->delegators[$cName])) { + $this->delegators[$cName] = array(); + } + + $this->delegators[$cName][] = $delegatorFactoryName; + + return $this; + } + + /** + * Add initializer + * + * @param callable|InitializerInterface $initializer + * @param bool $topOfStack + * @return ServiceManager + * @throws Exception\InvalidArgumentException + */ + public function addInitializer($initializer, $topOfStack = true) + { + if (!($initializer instanceof InitializerInterface || is_callable($initializer))) { + if (is_string($initializer)) { + $initializer = new $initializer; + } + + if (!($initializer instanceof InitializerInterface || is_callable($initializer))) { + throw new Exception\InvalidArgumentException('$initializer should be callable.'); + } + } + + if ($topOfStack) { + array_unshift($this->initializers, $initializer); + } else { + array_push($this->initializers, $initializer); + } + return $this; + } + + /** + * Register a service with the locator + * + * @param string $name + * @param mixed $service + * @return ServiceManager + * @throws Exception\InvalidServiceNameException + */ + public function setService($name, $service) + { + $cName = $this->canonicalizeName($name); + + if ($this->has($cName, false)) { + if ($this->allowOverride === false) { + throw new Exception\InvalidServiceNameException(sprintf( + '%s: A service by the name "%s" or alias already exists and cannot be overridden, please use an alternate name.', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + $this->unregisterService($cName); + } + + $this->instances[$cName] = $service; + + return $this; + } + + /** + * @param string $name + * @param bool $isShared + * @return ServiceManager + * @throws Exception\ServiceNotFoundException + */ + public function setShared($name, $isShared) + { + $cName = $this->canonicalizeName($name); + + if ( + !isset($this->invokableClasses[$cName]) + && !isset($this->factories[$cName]) + && !$this->canCreateFromAbstractFactory($cName, $name) + ) { + throw new Exception\ServiceNotFoundException(sprintf( + '%s: A service by the name "%s" was not found and could not be marked as shared', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + + $this->shared[$cName] = (bool) $isShared; + return $this; + } + + /** + * Resolve the alias for the given canonical name + * + * @param string $cName The canonical name to resolve + * @return string The resolved canonical name + */ + protected function resolveAlias($cName) + { + $stack = array(); + + while ($this->hasAlias($cName)) { + if (isset($stack[$cName])) { + throw new Exception\CircularReferenceException(sprintf( + 'Circular alias reference: %s -> %s', + implode(' -> ', $stack), + $cName + )); + } + + $stack[$cName] = $cName; + $cName = $this->aliases[$cName]; + } + + return $cName; + } + + /** + * Retrieve a registered instance + * + * @param string $name + * @param bool $usePeeringServiceManagers + * @throws Exception\ServiceNotFoundException + * @return object|array + */ + public function get($name, $usePeeringServiceManagers = true) + { + // inlined code from ServiceManager::canonicalizeName for performance + if (isset($this->canonicalNames[$name])) { + $cName = $this->canonicalNames[$name]; + } else { + $cName = $this->canonicalizeName($name); + } + + $isAlias = false; + + if ($this->hasAlias($cName)) { + $isAlias = true; + $cName = $this->resolveAlias($cName); + } + + $instance = null; + + if ($usePeeringServiceManagers && $this->retrieveFromPeeringManagerFirst) { + $instance = $this->retrieveFromPeeringManager($name); + + if (null !== $instance) { + return $instance; + } + } + + if (isset($this->instances[$cName])) { + return $this->instances[$cName]; + } + + if (!$instance) { + $this->checkNestedContextStart($cName); + if ( + isset($this->invokableClasses[$cName]) + || isset($this->factories[$cName]) + || isset($this->aliases[$cName]) + || $this->canCreateFromAbstractFactory($cName, $name) + ) { + $instance = $this->create(array($cName, $name)); + } elseif ($isAlias && $this->canCreateFromAbstractFactory($name, $cName)) { + /* + * case of an alias leading to an abstract factory : + * 'my-alias' => 'my-abstract-defined-service' + * $name = 'my-alias' + * $cName = 'my-abstract-defined-service' + */ + $instance = $this->create(array($name, $cName)); + } elseif ($usePeeringServiceManagers && !$this->retrieveFromPeeringManagerFirst) { + $instance = $this->retrieveFromPeeringManager($name); + } + $this->checkNestedContextStop(); + } + + // Still no instance? raise an exception + if ($instance === null) { + $this->checkNestedContextStop(true); + if ($isAlias) { + throw new Exception\ServiceNotFoundException(sprintf( + 'An alias "%s" was requested but no service could be found.', + $name + )); + } + + throw new Exception\ServiceNotFoundException(sprintf( + '%s was unable to fetch or create an instance for %s', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + + if ( + ($this->shareByDefault && !isset($this->shared[$cName])) + || (isset($this->shared[$cName]) && $this->shared[$cName] === true) + ) { + $this->instances[$cName] = $instance; + } + + return $instance; + } + + /** + * Create an instance of the requested service + * + * @param string|array $name + * + * @return bool|object + */ + public function create($name) + { + if (is_array($name)) { + list($cName, $rName) = $name; + } else { + $rName = $name; + + // inlined code from ServiceManager::canonicalizeName for performance + if (isset($this->canonicalNames[$rName])) { + $cName = $this->canonicalNames[$name]; + } else { + $cName = $this->canonicalizeName($name); + } + } + + if (isset($this->delegators[$cName])) { + return $this->createDelegatorFromFactory($cName, $rName); + } + + return $this->doCreate($rName, $cName); + } + + /** + * Creates a callback that uses a delegator to create a service + * + * @param DelegatorFactoryInterface|callable $delegatorFactory the delegator factory + * @param string $rName requested service name + * @param string $cName canonical service name + * @param callable $creationCallback callback for instantiating the real service + * + * @return callable + */ + private function createDelegatorCallback($delegatorFactory, $rName, $cName, $creationCallback) + { + $serviceManager = $this; + + return function () use ($serviceManager, $delegatorFactory, $rName, $cName, $creationCallback) { + return $delegatorFactory instanceof DelegatorFactoryInterface + ? $delegatorFactory->createDelegatorWithName($serviceManager, $cName, $rName, $creationCallback) + : $delegatorFactory($serviceManager, $cName, $rName, $creationCallback); + }; + } + + /** + * Actually creates the service + * + * @param string $rName real service name + * @param string $cName canonicalized service name + * + * @return bool|mixed|null|object + * @throws Exception\ServiceNotFoundException + * + * @internal this method is internal because of PHP 5.3 compatibility - do not explicitly use it + */ + public function doCreate($rName, $cName) + { + $instance = null; + + if (isset($this->factories[$cName])) { + $instance = $this->createFromFactory($cName, $rName); + } + + if ($instance === null && isset($this->invokableClasses[$cName])) { + $instance = $this->createFromInvokable($cName, $rName); + } + $this->checkNestedContextStart($cName); + if ($instance === null && $this->canCreateFromAbstractFactory($cName, $rName)) { + $instance = $this->createFromAbstractFactory($cName, $rName); + } + $this->checkNestedContextStop(); + + if ($instance === null && $this->throwExceptionInCreate) { + $this->checkNestedContextStop(true); + throw new Exception\ServiceNotFoundException(sprintf( + 'No valid instance was found for %s%s', + $cName, + ($rName ? '(alias: ' . $rName . ')' : '') + )); + } + + // Do not call initializers if we do not have an instance + if ($instance === null) { + return $instance; + } + + foreach ($this->initializers as $initializer) { + if ($initializer instanceof InitializerInterface) { + $initializer->initialize($instance, $this); + } else { + call_user_func($initializer, $instance, $this); + } + } + + return $instance; + } + + /** + * Determine if we can create an instance. + * Proxies to has() + * + * @param string|array $name + * @param bool $checkAbstractFactories + * @return bool + * @deprecated this method is being deprecated as of zendframework 2.3, and may be removed in future major versions + */ + public function canCreate($name, $checkAbstractFactories = true) + { + trigger_error(sprintf('%s is deprecated; please use %s::has', __METHOD__, __CLASS__), E_USER_DEPRECATED); + return $this->has($name, $checkAbstractFactories, false); + } + + /** + * Determine if an instance exists. + * + * @param string|array $name An array argument accepts exactly two values. + * Example: array('canonicalName', 'requestName') + * @param bool $checkAbstractFactories + * @param bool $usePeeringServiceManagers + * @return bool + */ + public function has($name, $checkAbstractFactories = true, $usePeeringServiceManagers = true) + { + if (is_string($name)) { + $rName = $name; + + // inlined code from ServiceManager::canonicalizeName for performance + if (isset($this->canonicalNames[$rName])) { + $cName = $this->canonicalNames[$rName]; + } else { + $cName = $this->canonicalizeName($name); + } + } elseif (is_array($name) && count($name) >= 2) { + list($cName, $rName) = $name; + } else { + return false; + } + + if (isset($this->invokableClasses[$cName]) + || isset($this->factories[$cName]) + || isset($this->aliases[$cName]) + || isset($this->instances[$cName]) + || ($checkAbstractFactories && $this->canCreateFromAbstractFactory($cName, $rName)) + ) { + return true; + } + + if ($usePeeringServiceManagers) { + foreach ($this->peeringServiceManagers as $peeringServiceManager) { + if ($peeringServiceManager->has($name)) { + return true; + } + } + } + + return false; + } + + /** + * Determine if we can create an instance from an abstract factory. + * + * @param string $cName + * @param string $rName + * @return bool + */ + public function canCreateFromAbstractFactory($cName, $rName) + { + if (array_key_exists($cName, $this->nestedContext)) { + $context = $this->nestedContext[$cName]; + if ($context === false) { + return false; + } elseif (is_object($context)) { + return !isset($this->pendingAbstractFactoryRequests[get_class($context).$cName]); + } + } + $this->checkNestedContextStart($cName); + // check abstract factories + $result = false; + $this->nestedContext[$cName] = false; + foreach ($this->abstractFactories as $abstractFactory) { + $pendingKey = get_class($abstractFactory).$cName; + if (isset($this->pendingAbstractFactoryRequests[$pendingKey])) { + $result = false; + break; + } + + if ($abstractFactory->canCreateServiceWithName($this, $cName, $rName)) { + $this->nestedContext[$cName] = $abstractFactory; + $result = true; + break; + } + } + $this->checkNestedContextStop(); + return $result; + } + + /** + * Ensure the alias definition will not result in a circular reference + * + * @param string $alias + * @param string $nameOrAlias + * @throws Exception\CircularReferenceException + * @return self + */ + protected function checkForCircularAliasReference($alias, $nameOrAlias) + { + $aliases = $this->aliases; + $aliases[$alias] = $nameOrAlias; + $stack = array(); + + while (isset($aliases[$alias])) { + if (isset($stack[$alias])) { + throw new Exception\CircularReferenceException(sprintf( + 'The alias definition "%s" : "%s" results in a circular reference: "%s" -> "%s"', + $alias, + $nameOrAlias, + implode('" -> "', $stack), + $alias + )); + } + + $stack[$alias] = $alias; + $alias = $aliases[$alias]; + } + + return $this; + } + + /** + * @param string $alias + * @param string $nameOrAlias + * @return ServiceManager + * @throws Exception\ServiceNotFoundException + * @throws Exception\InvalidServiceNameException + */ + public function setAlias($alias, $nameOrAlias) + { + if (!is_string($alias) || !is_string($nameOrAlias)) { + throw new Exception\InvalidServiceNameException('Service or alias names must be strings.'); + } + + $cAlias = $this->canonicalizeName($alias); + $nameOrAlias = $this->canonicalizeName($nameOrAlias); + + if ($alias == '' || $nameOrAlias == '') { + throw new Exception\InvalidServiceNameException('Invalid service name alias'); + } + + if ($this->allowOverride === false && $this->has(array($cAlias, $alias), false)) { + throw new Exception\InvalidServiceNameException(sprintf( + 'An alias by the name "%s" or "%s" already exists', + $cAlias, + $alias + )); + } + + if ($this->hasAlias($alias)) { + $this->checkForCircularAliasReference($cAlias, $nameOrAlias); + } + + $this->aliases[$cAlias] = $nameOrAlias; + return $this; + } + + /** + * Determine if we have an alias + * + * @param string $alias + * @return bool + */ + public function hasAlias($alias) + { + return isset($this->aliases[$this->canonicalizeName($alias)]); + } + + /** + * Create scoped service manager + * + * @param string $peering + * @return ServiceManager + */ + public function createScopedServiceManager($peering = self::SCOPE_PARENT) + { + $scopedServiceManager = new ServiceManager(); + if ($peering == self::SCOPE_PARENT) { + $scopedServiceManager->peeringServiceManagers[] = $this; + } + if ($peering == self::SCOPE_CHILD) { + $this->peeringServiceManagers[] = $scopedServiceManager; + } + return $scopedServiceManager; + } + + /** + * Add a peering relationship + * + * @param ServiceManager $manager + * @param string $peering + * @return ServiceManager + */ + public function addPeeringServiceManager(ServiceManager $manager, $peering = self::SCOPE_PARENT) + { + if ($peering == self::SCOPE_PARENT) { + $this->peeringServiceManagers[] = $manager; + } + if ($peering == self::SCOPE_CHILD) { + $manager->peeringServiceManagers[] = $this; + } + return $this; + } + + /** + * Canonicalize name + * + * @param string $name + * @return string + */ + protected function canonicalizeName($name) + { + if (isset($this->canonicalNames[$name])) { + return $this->canonicalNames[$name]; + } + + // this is just for performance instead of using str_replace + return $this->canonicalNames[$name] = strtolower(strtr($name, $this->canonicalNamesReplacements)); + } + + /** + * Create service via callback + * + * @param callable $callable + * @param string $cName + * @param string $rName + * @throws Exception\ServiceNotCreatedException + * @throws Exception\ServiceNotFoundException + * @throws Exception\CircularDependencyFoundException + * @return object + */ + protected function createServiceViaCallback($callable, $cName, $rName) + { + static $circularDependencyResolver = array(); + $depKey = spl_object_hash($this) . '-' . $cName; + + if (isset($circularDependencyResolver[$depKey])) { + $circularDependencyResolver = array(); + throw new Exception\CircularDependencyFoundException('Circular dependency for LazyServiceLoader was found for instance ' . $rName); + } + + try { + $circularDependencyResolver[$depKey] = true; + $instance = call_user_func($callable, $this, $cName, $rName); + unset($circularDependencyResolver[$depKey]); + } catch (Exception\ServiceNotFoundException $e) { + unset($circularDependencyResolver[$depKey]); + throw $e; + } catch (\Exception $e) { + unset($circularDependencyResolver[$depKey]); + throw new Exception\ServiceNotCreatedException( + sprintf('An exception was raised while creating "%s"; no instance returned', $rName), + $e->getCode(), + $e + ); + } + if ($instance === null) { + throw new Exception\ServiceNotCreatedException('The factory was called but did not return an instance.'); + } + + return $instance; + } + + /** + * Retrieve a keyed list of all registered services. Handy for debugging! + * + * @return array + */ + public function getRegisteredServices() + { + return array( + 'invokableClasses' => array_keys($this->invokableClasses), + 'factories' => array_keys($this->factories), + 'aliases' => array_keys($this->aliases), + 'instances' => array_keys($this->instances), + ); + } + + /** + * Retrieve a keyed list of all canonical names. Handy for debugging! + * + * @return array + */ + public function getCanonicalNames() + { + return $this->canonicalNames; + } + + /** + * Allows to override the canonical names lookup map with predefined + * values. + * + * @param array $canonicalNames + * @return ServiceManager + */ + public function setCanonicalNames($canonicalNames) + { + $this->canonicalNames = $canonicalNames; + + return $this; + } + + /** + * Attempt to retrieve an instance via a peering manager + * + * @param string $name + * @return mixed + */ + protected function retrieveFromPeeringManager($name) + { + foreach ($this->peeringServiceManagers as $peeringServiceManager) { + if ($peeringServiceManager->has($name)) { + return $peeringServiceManager->get($name); + } + } + + $name = $this->canonicalizeName($name); + + if ($this->hasAlias($name)) { + do { + $name = $this->aliases[$name]; + } while ($this->hasAlias($name)); + } + + foreach ($this->peeringServiceManagers as $peeringServiceManager) { + if ($peeringServiceManager->has($name)) { + return $peeringServiceManager->get($name); + } + } + + return null; + } + + /** + * Attempt to create an instance via an invokable class + * + * @param string $canonicalName + * @param string $requestedName + * @return null|\stdClass + * @throws Exception\ServiceNotFoundException If resolved class does not exist + */ + protected function createFromInvokable($canonicalName, $requestedName) + { + $invokable = $this->invokableClasses[$canonicalName]; + if (!class_exists($invokable)) { + throw new Exception\ServiceNotFoundException(sprintf( + '%s: failed retrieving "%s%s" via invokable class "%s"; class does not exist', + get_class($this) . '::' . __FUNCTION__, + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : ''), + $invokable + )); + } + $instance = new $invokable; + return $instance; + } + + /** + * Attempt to create an instance via a factory + * + * @param string $canonicalName + * @param string $requestedName + * @return mixed + * @throws Exception\ServiceNotCreatedException If factory is not callable + */ + protected function createFromFactory($canonicalName, $requestedName) + { + $factory = $this->factories[$canonicalName]; + if (is_string($factory) && class_exists($factory, true)) { + $factory = new $factory; + $this->factories[$canonicalName] = $factory; + } + if ($factory instanceof FactoryInterface) { + $instance = $this->createServiceViaCallback(array($factory, 'createService'), $canonicalName, $requestedName); + } elseif (is_callable($factory)) { + $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName); + } else { + throw new Exception\ServiceNotCreatedException(sprintf( + 'While attempting to create %s%s an invalid factory was registered for this instance type.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + )); + } + return $instance; + } + + /** + * Attempt to create an instance via an abstract factory + * + * @param string $canonicalName + * @param string $requestedName + * @return object|null + * @throws Exception\ServiceNotCreatedException If abstract factory is not callable + */ + protected function createFromAbstractFactory($canonicalName, $requestedName) + { + if (isset($this->nestedContext[$canonicalName])) { + $abstractFactory = $this->nestedContext[$canonicalName]; + $pendingKey = get_class($abstractFactory).$canonicalName; + try { + $this->pendingAbstractFactoryRequests[$pendingKey] = true; + $instance = $this->createServiceViaCallback( + array($abstractFactory, 'createServiceWithName'), + $canonicalName, + $requestedName + ); + unset($this->pendingAbstractFactoryRequests[$pendingKey]); + return $instance; + } catch (\Exception $e) { + unset($this->pendingAbstractFactoryRequests[$pendingKey]); + $this->checkNestedContextStop(true); + throw new Exception\ServiceNotCreatedException( + sprintf( + 'An abstract factory could not create an instance of %s%s.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + ), + $e->getCode(), + $e + ); + } + } + return null; + } + + /** + * + * @param string $cName + * @return self + */ + protected function checkNestedContextStart($cName) + { + if ($this->nestedContextCounter === -1 || !isset($this->nestedContext[$cName])) { + $this->nestedContext[$cName] = null; + } + $this->nestedContextCounter++; + return $this; + } + + /** + * + * @param bool $force + * @return self + */ + protected function checkNestedContextStop($force = false) + { + if ($force) { + $this->nestedContextCounter = -1; + $this->nestedContext = array(); + return $this; + } + + $this->nestedContextCounter--; + if ($this->nestedContextCounter === -1) { + $this->nestedContext = array(); + } + return $this; + } + + /** + * @param $canonicalName + * @param $requestedName + * @return mixed + * @throws Exception\ServiceNotCreatedException + */ + protected function createDelegatorFromFactory($canonicalName, $requestedName) + { + $serviceManager = $this; + $delegatorsCount = count($this->delegators[$canonicalName]); + $creationCallback = function () use ($serviceManager, $requestedName, $canonicalName) { + return $serviceManager->doCreate($requestedName, $canonicalName); + }; + + for ($i = 0; $i < $delegatorsCount; $i += 1) { + + $delegatorFactory = $this->delegators[$canonicalName][$i]; + + if (is_string($delegatorFactory)) { + $delegatorFactory = !$this->has($delegatorFactory) && class_exists($delegatorFactory, true) ? + new $delegatorFactory + : $this->get($delegatorFactory); + $this->delegators[$canonicalName][$i] = $delegatorFactory; + } + + if (!$delegatorFactory instanceof DelegatorFactoryInterface && !is_callable($delegatorFactory)) { + throw new Exception\ServiceNotCreatedException(sprintf( + 'While attempting to create %s%s an invalid factory was registered for this instance type.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + )); + } + + $creationCallback = $this->createDelegatorCallback( + $delegatorFactory, + $requestedName, + $canonicalName, + $creationCallback + ); + } + + return $creationCallback($serviceManager, $canonicalName, $requestedName, $creationCallback); + } + + /** + * Checks if the object has this class as one of its parents + * + * @see https://bugs.php.net/bug.php?id=53727 + * @see https://github.com/zendframework/zf2/pull/1807 + * + * @param string $className + * @param string $type + * @return bool + * + * @deprecated this method is being deprecated as of zendframework 2.2, and may be removed in future major versions + */ + protected static function isSubclassOf($className, $type) + { + if (is_subclass_of($className, $type)) { + return true; + } + if (PHP_VERSION_ID >= 50307) { + return false; + } + if (!interface_exists($type)) { + return false; + } + $r = new ReflectionClass($className); + return $r->implementsInterface($type); + } + + /** + * Unregister a service + * + * Called when $allowOverride is true and we detect that a service being + * added to the instance already exists. This will remove the duplicate + * entry, and also any shared flags previously registered. + * + * @param string $canonical + * @return void + */ + protected function unregisterService($canonical) + { + $types = array('invokableClasses', 'factories', 'aliases'); + foreach ($types as $type) { + if (isset($this->{$type}[$canonical])) { + unset($this->{$type}[$canonical]); + break; + } + } + + if (isset($this->instances[$canonical])) { + unset($this->instances[$canonical]); + } + + if (isset($this->shared[$canonical])) { + unset($this->shared[$canonical]); + } + } +} diff --git a/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceManagerAwareInterface.php b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceManagerAwareInterface.php new file mode 100644 index 0000000000..320f6bc69e --- /dev/null +++ b/vendor/zendframework/zend-servicemanager/Zend/ServiceManager/ServiceManagerAwareInterface.php @@ -0,0 +1,20 @@ +=5.3.23" + }, + "require-dev": { + "zendframework/zend-di": "self.version" + }, + "suggest": { + "zendframework/zend-di": "Zend\\Di component" + }, + "extra": { + "branch-alias": { + "dev-master": "2.3-dev", + "dev-develop": "2.4-dev" + } + } +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/Exception/ExceptionInterface.php b/vendor/zendframework/zend-uri/Zend/Uri/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..3d29c18def --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ +query) { + return false; + } + + return parent::isValid(); + } + + /** + * User Info part is not used in file URIs + * + * @see Uri::setUserInfo() + * @param string $userInfo + * @return File + */ + public function setUserInfo($userInfo) + { + return $this; + } + + /** + * Fragment part is not used in file URIs + * + * @see Uri::setFragment() + * @param string $fragment + * @return File + */ + public function setFragment($fragment) + { + return $this; + } + + /** + * Convert a UNIX file path to a valid file:// URL + * + * @param string $path + * @return File + */ + public static function fromUnixPath($path) + { + $url = new static('file:'); + if (substr($path, 0, 1) == '/') { + $url->setHost(''); + } + + $url->setPath($path); + return $url; + } + + /** + * Convert a Windows file path to a valid file:// URL + * + * @param string $path + * @return File + */ + public static function fromWindowsPath($path) + { + $url = new static('file:'); + + // Convert directory separators + $path = str_replace(array('/', '\\'), array('%2F', '/'), $path); + + // Is this an absolute path? + if (preg_match('|^([a-zA-Z]:)?/|', $path)) { + $url->setHost(''); + } + + $url->setPath($path); + return $url; + } +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/Http.php b/vendor/zendframework/zend-uri/Zend/Uri/Http.php new file mode 100644 index 0000000000..a24851b1f3 --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/Http.php @@ -0,0 +1,194 @@ + 80, + 'https' => 443, + ); + + /** + * @see Uri::$validHostTypes + */ + protected $validHostTypes = self::HOST_DNS_OR_IPV4_OR_IPV6_OR_REGNAME; + + /** + * User name as provided in authority of URI + * @var null|string + */ + protected $user; + + /** + * Password as provided in authority of URI + * @var null|string + */ + protected $password; + + /** + * Check if the URI is a valid HTTP URI + * + * This applies additional HTTP specific validation rules beyond the ones + * required by the generic URI syntax + * + * @return bool + * @see Uri::isValid() + */ + public function isValid() + { + return parent::isValid(); + } + + /** + * Get the username part (before the ':') of the userInfo URI part + * + * @return null|string + */ + public function getUser() + { + if (null !== $this->user) { + return $this->user; + } + + $this->parseUserInfo(); + return $this->user; + } + + /** + * Get the password part (after the ':') of the userInfo URI part + * + * @return string + */ + public function getPassword() + { + if (null !== $this->password) { + return $this->password; + } + + $this->parseUserInfo(); + return $this->password; + } + + /** + * Set the username part (before the ':') of the userInfo URI part + * + * @param string $user + * @return Http + */ + public function setUser($user) + { + $this->user = $user; + return $this; + } + + /** + * Set the password part (after the ':') of the userInfo URI part + * + * @param string $password + * @return Http + */ + public function setPassword($password) + { + $this->password = $password; + return $this; + } + + /** + * Validate the host part of an HTTP URI + * + * This overrides the common URI validation method with a DNS or IP only + * default. Users may still enforce allowing other host types. + * + * @param string $host + * @param int $allowed + * @return bool + */ + public static function validateHost($host, $allowed = self::HOST_DNS_OR_IPV4_OR_IPV6) + { + return parent::validateHost($host, $allowed); + } + + /** + * Parse the user info into username and password segments + * + * Parses the user information into username and password segments, and + * then sets the appropriate values. + * + * @return void + */ + protected function parseUserInfo() + { + // No user information? we're done + if (null === $this->userInfo) { + return; + } + + // If no ':' separator, we only have a username + if (false === strpos($this->userInfo, ':')) { + $this->setUser($this->userInfo); + return; + } + + // Split on the ':', and set both user and password + list($user, $password) = explode(':', $this->userInfo, 2); + $this->setUser($user); + $this->setPassword($password); + } + + /** + * Return the URI port + * + * If no port is set, will return the default port according to the scheme + * + * @return int + * @see Zend\Uri\Uri::getPort() + */ + public function getPort() + { + if (empty($this->port)) { + if (array_key_exists($this->scheme, static::$defaultPorts)) { + return static::$defaultPorts[$this->scheme]; + } + } + return $this->port; + } + + /** + * Parse a URI string + * + * @param string $uri + * @return Http + */ + public function parse($uri) + { + parent::parse($uri); + + if (empty($this->path)) { + $this->path = '/'; + } + + return $this; + } +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/Mailto.php b/vendor/zendframework/zend-uri/Zend/Uri/Mailto.php new file mode 100644 index 0000000000..8463f995c4 --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/Mailto.php @@ -0,0 +1,109 @@ +host || $this->userInfo || $this->port) { + return false; + } + + if (empty($this->path)) { + return false; + } + + if (0 === strpos($this->path, '/')) { + return false; + } + + $validator = $this->getValidator(); + return $validator->isValid($this->path); + } + + /** + * Set the email address + * + * This is in fact equivalent to setPath() - but provides a more clear interface + * + * @param string $email + * @return Mailto + */ + public function setEmail($email) + { + return $this->setPath($email); + } + + /** + * Get the email address + * + * This is infact equivalent to getPath() - but provides a more clear interface + * + * @return string + */ + public function getEmail() + { + return $this->getPath(); + } + + /** + * Set validator to use when validating email address + * + * @param ValidatorInterface $validator + * @return Mailto + */ + public function setValidator(ValidatorInterface $validator) + { + $this->emailValidator = $validator; + return $this; + } + + /** + * Retrieve validator for use with validating email address + * + * If none is currently set, an EmailValidator instance with default options + * will be used. + * + * @return ValidatorInterface + */ + public function getValidator() + { + if (null === $this->emailValidator) { + $this->setValidator(new EmailValidator()); + } + return $this->emailValidator; + } +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/README.md b/vendor/zendframework/zend-uri/Zend/Uri/README.md new file mode 100644 index 0000000000..334047d453 --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/README.md @@ -0,0 +1,15 @@ +URI Component from ZF2 +====================== + +This is the URI component for ZF2. + +- File issues at https://github.com/zendframework/zf2/issues +- Create pull requests against https://github.com/zendframework/zf2 +- Documentation is at http://framework.zend.com/docs + +LICENSE +------- + +The files in this archive are released under the [Zend Framework +license](http://framework.zend.com/license), which is a 3-clause BSD license. + diff --git a/vendor/zendframework/zend-uri/Zend/Uri/Uri.php b/vendor/zendframework/zend-uri/Zend/Uri/Uri.php new file mode 100644 index 0000000000..cf8a1b18f5 --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/Uri.php @@ -0,0 +1,1359 @@ + | | | | + * Place 1 or 0 in the different positions for enable or disable the part. + * Finally use a hexadecimal representation. + */ + const HOST_IPV4 = 0x01; //00001 + const HOST_IPV6 = 0x02; //00010 + const HOST_IPVFUTURE = 0x04; //00100 + const HOST_IPVANY = 0x07; //00111 + const HOST_DNS = 0x08; //01000 + const HOST_DNS_OR_IPV4 = 0x09; //01001 + const HOST_DNS_OR_IPV6 = 0x0A; //01010 + const HOST_DNS_OR_IPV4_OR_IPV6 = 0x0B; //01011 + const HOST_DNS_OR_IPVANY = 0x0F; //01111 + const HOST_REGNAME = 0x10; //10000 + const HOST_DNS_OR_IPV4_OR_IPV6_OR_REGNAME = 0x13; //10011 + const HOST_ALL = 0x1F; //11111 + + /** + * URI scheme + * + * @var string + */ + protected $scheme; + + /** + * URI userInfo part (usually user:password in HTTP URLs) + * + * @var string + */ + protected $userInfo; + + /** + * URI hostname + * + * @var string + */ + protected $host; + + /** + * URI port + * + * @var int + */ + protected $port; + + /** + * URI path + * + * @var string + */ + protected $path; + + /** + * URI query string + * + * @var string + */ + protected $query; + + /** + * URI fragment + * + * @var string + */ + protected $fragment; + + /** + * Which host part types are valid for this URI? + * + * @var int + */ + protected $validHostTypes = self::HOST_ALL; + + /** + * Array of valid schemes. + * + * Subclasses of this class that only accept specific schemes may set the + * list of accepted schemes here. If not empty, when setScheme() is called + * it will only accept the schemes listed here. + * + * @var array + */ + protected static $validSchemes = array(); + + /** + * List of default ports per scheme + * + * Inheriting URI classes may set this, and the normalization methods will + * automatically remove the port if it is equal to the default port for the + * current scheme + * + * @var array + */ + protected static $defaultPorts = array(); + + /** + * @var Escaper + */ + protected static $escaper; + + /** + * Create a new URI object + * + * @param Uri|string|null $uri + * @throws Exception\InvalidArgumentException + */ + public function __construct($uri = null) + { + if (is_string($uri)) { + $this->parse($uri); + } elseif ($uri instanceof UriInterface) { + // Copy constructor + $this->setScheme($uri->getScheme()); + $this->setUserInfo($uri->getUserInfo()); + $this->setHost($uri->getHost()); + $this->setPort($uri->getPort()); + $this->setPath($uri->getPath()); + $this->setQuery($uri->getQuery()); + $this->setFragment($uri->getFragment()); + } elseif ($uri !== null) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expecting a string or a URI object, received "%s"', + (is_object($uri) ? get_class($uri) : gettype($uri)) + )); + } + } + + /** + * Set Escaper instance + * + * @param Escaper $escaper + */ + public static function setEscaper(Escaper $escaper) + { + static::$escaper = $escaper; + } + + /** + * Retrieve Escaper instance + * + * Lazy-loads one if none provided + * + * @return Escaper + */ + public static function getEscaper() + { + if (null === static::$escaper) { + static::setEscaper(new Escaper()); + } + return static::$escaper; + } + + /** + * Check if the URI is valid + * + * Note that a relative URI may still be valid + * + * @return bool + */ + public function isValid() + { + if ($this->host) { + if (strlen($this->path) > 0 && substr($this->path, 0, 1) != '/') { + return false; + } + return true; + } + + if ($this->userInfo || $this->port) { + return false; + } + + if ($this->path) { + // Check path-only (no host) URI + if (substr($this->path, 0, 2) == '//') { + return false; + } + return true; + } + + if (! ($this->query || $this->fragment)) { + // No host, path, query or fragment - this is not a valid URI + return false; + } + + return true; + } + + /** + * Check if the URI is a valid relative URI + * + * @return bool + */ + public function isValidRelative() + { + if ($this->scheme || $this->host || $this->userInfo || $this->port) { + return false; + } + + if ($this->path) { + // Check path-only (no host) URI + if (substr($this->path, 0, 2) == '//') { + return false; + } + return true; + } + + if (! ($this->query || $this->fragment)) { + // No host, path, query or fragment - this is not a valid URI + return false; + } + + return true; + } + + /** + * Check if the URI is an absolute or relative URI + * + * @return bool + */ + public function isAbsolute() + { + return ($this->scheme !== null); + } + + /** + * Reset URI parts + */ + protected function reset() + { + $this->setScheme(null); + $this->setPort(null); + $this->setUserInfo(null); + $this->setHost(null); + $this->setPath(null); + $this->setFragment(null); + $this->setQuery(null); + } + + /** + * Parse a URI string + * + * @param string $uri + * @return Uri + */ + public function parse($uri) + { + $this->reset(); + + // Capture scheme + if (($scheme = self::parseScheme($uri)) !== null) { + $this->setScheme($scheme); + $uri = substr($uri, strlen($scheme) + 1); + } + + // Capture authority part + if (preg_match('|^//([^/\?#]*)|', $uri, $match)) { + $authority = $match[1]; + $uri = substr($uri, strlen($match[0])); + + // Split authority into userInfo and host + if (strpos($authority, '@') !== false) { + // The userInfo can also contain '@' symbols; split $authority + // into segments, and set it to the last segment. + $segments = explode('@', $authority); + $authority = array_pop($segments); + $userInfo = implode('@', $segments); + unset($segments); + $this->setUserInfo($userInfo); + } + + $nMatches = preg_match('/:[\d]{1,5}$/', $authority, $matches); + if ($nMatches === 1) { + $portLength = strlen($matches[0]); + $port = substr($matches[0], 1); + + $this->setPort((int) $port); + $authority = substr($authority, 0, -$portLength); + } + + $this->setHost($authority); + } + + if (!$uri) { + return $this; + } + + // Capture the path + if (preg_match('|^[^\?#]*|', $uri, $match)) { + $this->setPath($match[0]); + $uri = substr($uri, strlen($match[0])); + } + + if (!$uri) { + return $this; + } + + // Capture the query + if (preg_match('|^\?([^#]*)|', $uri, $match)) { + $this->setQuery($match[1]); + $uri = substr($uri, strlen($match[0])); + } + if (!$uri) { + return $this; + } + + // All that's left is the fragment + if ($uri && substr($uri, 0, 1) == '#') { + $this->setFragment(substr($uri, 1)); + } + + return $this; + } + + /** + * Compose the URI into a string + * + * @return string + * @throws Exception\InvalidUriException + */ + public function toString() + { + if (!$this->isValid()) { + if ($this->isAbsolute() || !$this->isValidRelative()) { + throw new Exception\InvalidUriException( + 'URI is not valid and cannot be converted into a string' + ); + } + } + + $uri = ''; + + if ($this->scheme) { + $uri .= $this->scheme . ':'; + } + + if ($this->host !== null) { + $uri .= '//'; + if ($this->userInfo) { + $uri .= $this->userInfo . '@'; + } + $uri .= $this->host; + if ($this->port) { + $uri .= ':' . $this->port; + } + } + + if ($this->path) { + $uri .= static::encodePath($this->path); + } elseif ($this->host && ($this->query || $this->fragment)) { + $uri .= '/'; + } + + if ($this->query) { + $uri .= "?" . static::encodeQueryFragment($this->query); + } + + if ($this->fragment) { + $uri .= "#" . static::encodeQueryFragment($this->fragment); + } + + return $uri; + } + + /** + * Normalize the URI + * + * Normalizing a URI includes removing any redundant parent directory or + * current directory references from the path (e.g. foo/bar/../baz becomes + * foo/baz), normalizing the scheme case, decoding any over-encoded + * characters etc. + * + * Eventually, two normalized URLs pointing to the same resource should be + * equal even if they were originally represented by two different strings + * + * @return Uri + */ + public function normalize() + { + if ($this->scheme) { + $this->scheme = static::normalizeScheme($this->scheme); + } + + if ($this->host) { + $this->host = static::normalizeHost($this->host); + } + + if ($this->port) { + $this->port = static::normalizePort($this->port, $this->scheme); + } + + if ($this->path) { + $this->path = static::normalizePath($this->path); + } + + if ($this->query) { + $this->query = static::normalizeQuery($this->query); + } + + if ($this->fragment) { + $this->fragment = static::normalizeFragment($this->fragment); + } + + // If path is empty (and we have a host), path should be '/' + // Isn't this valid ONLY for HTTP-URI? + if ($this->host && empty($this->path)) { + $this->path = '/'; + } + + return $this; + } + + /** + * Convert a relative URI into an absolute URI using a base absolute URI as + * a reference. + * + * This is similar to merge() - only it uses the supplied URI as the + * base reference instead of using the current URI as the base reference. + * + * Merging algorithm is adapted from RFC-3986 section 5.2 + * (@link http://tools.ietf.org/html/rfc3986#section-5.2) + * + * @param Uri|string $baseUri + * @throws Exception\InvalidArgumentException + * @return Uri + */ + public function resolve($baseUri) + { + // Ignore if URI is absolute + if ($this->isAbsolute()) { + return $this; + } + + if (is_string($baseUri)) { + $baseUri = new static($baseUri); + } elseif (!$baseUri instanceof Uri) { + throw new Exception\InvalidArgumentException( + 'Provided base URI must be a string or a Uri object' + ); + } + + // Merging starts here... + if ($this->getHost()) { + $this->setPath(static::removePathDotSegments($this->getPath())); + } else { + $basePath = $baseUri->getPath(); + $relPath = $this->getPath(); + if (!$relPath) { + $this->setPath($basePath); + if (!$this->getQuery()) { + $this->setQuery($baseUri->getQuery()); + } + } else { + if (substr($relPath, 0, 1) == '/') { + $this->setPath(static::removePathDotSegments($relPath)); + } else { + if ($baseUri->getHost() && !$basePath) { + $mergedPath = '/'; + } else { + $mergedPath = substr($basePath, 0, strrpos($basePath, '/') + 1); + } + $this->setPath(static::removePathDotSegments($mergedPath . $relPath)); + } + } + + // Set the authority part + $this->setUserInfo($baseUri->getUserInfo()); + $this->setHost($baseUri->getHost()); + $this->setPort($baseUri->getPort()); + } + + $this->setScheme($baseUri->getScheme()); + return $this; + } + + + /** + * Convert the link to a relative link by substracting a base URI + * + * This is the opposite of resolving a relative link - i.e. creating a + * relative reference link from an original URI and a base URI. + * + * If the two URIs do not intersect (e.g. the original URI is not in any + * way related to the base URI) the URI will not be modified. + * + * @param Uri|string $baseUri + * @return Uri + */ + public function makeRelative($baseUri) + { + // Copy base URI, we should not modify it + $baseUri = new static($baseUri); + + $this->normalize(); + $baseUri->normalize(); + + $host = $this->getHost(); + $baseHost = $baseUri->getHost(); + if ($host && $baseHost && ($host != $baseHost)) { + // Not the same hostname + return $this; + } + + $port = $this->getPort(); + $basePort = $baseUri->getPort(); + if ($port && $basePort && ($port != $basePort)) { + // Not the same port + return $this; + } + + $scheme = $this->getScheme(); + $baseScheme = $baseUri->getScheme(); + if ($scheme && $baseScheme && ($scheme != $baseScheme)) { + // Not the same scheme (e.g. HTTP vs. HTTPS) + return $this; + } + + // Remove host, port and scheme + $this->setHost(null) + ->setPort(null) + ->setScheme(null); + + // Is path the same? + if ($this->getPath() == $baseUri->getPath()) { + $this->setPath(''); + return $this; + } + + $pathParts = preg_split('|(/)|', $this->getPath(), null, + PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + $baseParts = preg_split('|(/)|', $baseUri->getPath(), null, + PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + + // Get the intersection of existing path parts and those from the + // provided URI + $matchingParts = array_intersect_assoc($pathParts, $baseParts); + + // Loop through the matches + foreach ($matchingParts as $index => $segment) { + // If we skip an index at any point, we have parent traversal, and + // need to prepend the path accordingly + if ($index && !isset($matchingParts[$index - 1])) { + array_unshift($pathParts, '../'); + continue; + } + + // Otherwise, we simply unset the given path segment + unset($pathParts[$index]); + } + + // Reset the path by imploding path segments + $this->setPath(implode($pathParts)); + + return $this; + } + + /** + * Get the scheme part of the URI + * + * @return string|null + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * Get the User-info (usually user:password) part + * + * @return string|null + */ + public function getUserInfo() + { + return $this->userInfo; + } + + /** + * Get the URI host + * + * @return string|null + */ + public function getHost() + { + return $this->host; + } + + /** + * Get the URI port + * + * @return int|null + */ + public function getPort() + { + return $this->port; + } + + /** + * Get the URI path + * + * @return string|null + */ + public function getPath() + { + return $this->path; + } + + /** + * Get the URI query + * + * @return string|null + */ + public function getQuery() + { + return $this->query; + } + + /** + * Return the query string as an associative array of key => value pairs + * + * This is an extension to RFC-3986 but is quite useful when working with + * most common URI types + * + * @return array + */ + public function getQueryAsArray() + { + $query = array(); + if ($this->query) { + parse_str($this->query, $query); + } + + return $query; + } + + /** + * Get the URI fragment + * + * @return string|null + */ + public function getFragment() + { + return $this->fragment; + } + + /** + * Set the URI scheme + * + * If the scheme is not valid according to the generic scheme syntax or + * is not acceptable by the specific URI class (e.g. 'http' or 'https' are + * the only acceptable schemes for the Zend\Uri\Http class) an exception + * will be thrown. + * + * You can check if a scheme is valid before setting it using the + * validateScheme() method. + * + * @param string $scheme + * @throws Exception\InvalidUriPartException + * @return Uri + */ + public function setScheme($scheme) + { + if (($scheme !== null) && (!self::validateScheme($scheme))) { + throw new Exception\InvalidUriPartException(sprintf( + 'Scheme "%s" is not valid or is not accepted by %s', + $scheme, + get_class($this) + ), Exception\InvalidUriPartException::INVALID_SCHEME); + } + + $this->scheme = $scheme; + return $this; + } + + /** + * Set the URI User-info part (usually user:password) + * + * @param string $userInfo + * @return Uri + * @throws Exception\InvalidUriPartException If the schema definition + * does not have this part + */ + public function setUserInfo($userInfo) + { + $this->userInfo = $userInfo; + return $this; + } + + /** + * Set the URI host + * + * Note that the generic syntax for URIs allows using host names which + * are not necessarily IPv4 addresses or valid DNS host names. For example, + * IPv6 addresses are allowed as well, and also an abstract "registered name" + * which may be any name composed of a valid set of characters, including, + * for example, tilda (~) and underscore (_) which are not allowed in DNS + * names. + * + * Subclasses of Uri may impose more strict validation of host names - for + * example the HTTP RFC clearly states that only IPv4 and valid DNS names + * are allowed in HTTP URIs. + * + * @param string $host + * @throws Exception\InvalidUriPartException + * @return Uri + */ + public function setHost($host) + { + if (($host !== '') + && ($host !== null) + && !self::validateHost($host, $this->validHostTypes) + ) { + throw new Exception\InvalidUriPartException(sprintf( + 'Host "%s" is not valid or is not accepted by %s', + $host, + get_class($this) + ), Exception\InvalidUriPartException::INVALID_HOSTNAME); + } + + $this->host = $host; + return $this; + } + + /** + * Set the port part of the URI + * + * @param int $port + * @return Uri + */ + public function setPort($port) + { + $this->port = $port; + return $this; + } + + /** + * Set the path + * + * @param string $path + * @return Uri + */ + public function setPath($path) + { + $this->path = $path; + return $this; + } + + /** + * Set the query string + * + * If an array is provided, will encode this array of parameters into a + * query string. Array values will be represented in the query string using + * PHP's common square bracket notation. + * + * @param string|array $query + * @return Uri + */ + public function setQuery($query) + { + if (is_array($query)) { + // We replace the + used for spaces by http_build_query with the + // more standard %20. + $query = str_replace('+', '%20', http_build_query($query)); + } + + $this->query = $query; + return $this; + } + + /** + * Set the URI fragment part + * + * @param string $fragment + * @return Uri + * @throws Exception\InvalidUriPartException If the schema definition + * does not have this part + */ + public function setFragment($fragment) + { + $this->fragment = $fragment; + return $this; + } + + /** + * Magic method to convert the URI to a string + * + * @return string + */ + public function __toString() + { + try { + return $this->toString(); + } catch (\Exception $e) { + return ''; + } + } + + /** + * Encoding and Validation Methods + */ + + /** + * Check if a scheme is valid or not + * + * Will check $scheme to be valid against the generic scheme syntax defined + * in RFC-3986. If the class also defines specific acceptable schemes, will + * also check that $scheme is one of them. + * + * @param string $scheme + * @return bool + */ + public static function validateScheme($scheme) + { + if (!empty(static::$validSchemes) + && !in_array(strtolower($scheme), static::$validSchemes) + ) { + return false; + } + + return (bool) preg_match('/^[A-Za-z][A-Za-z0-9\-\.+]*$/', $scheme); + } + + /** + * Check that the userInfo part of a URI is valid + * + * @param string $userInfo + * @return bool + */ + public static function validateUserInfo($userInfo) + { + $regex = '/^(?:[' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ':]+|%[A-Fa-f0-9]{2})*$/'; + return (bool) preg_match($regex, $userInfo); + } + + /** + * Validate the host part + * + * Users may control which host types to allow by passing a second parameter + * with a bitmask of HOST_* constants which are allowed. If not specified, + * all address types will be allowed. + * + * Note that the generic URI syntax allows different host representations, + * including IPv4 addresses, IPv6 addresses and future IP address formats + * enclosed in square brackets, and registered names which may be DNS names + * or even more complex names. This is different (and is much more loose) + * from what is commonly accepted as valid HTTP URLs for example. + * + * @param string $host + * @param int $allowed bitmask of allowed host types + * @return bool + */ + public static function validateHost($host, $allowed = self::HOST_ALL) + { + /* + * "first-match-wins" algorithm (RFC 3986): + * If host matches the rule for IPv4address, then it should be + * considered an IPv4 address literal and not a reg-name + */ + if ($allowed & self::HOST_IPVANY) { + if (static::isValidIpAddress($host, $allowed)) { + return true; + } + } + + if ($allowed & self::HOST_REGNAME) { + if (static::isValidRegName($host)) { + return true; + } + } + + if ($allowed & self::HOST_DNS) { + if (static::isValidDnsHostname($host)) { + return true; + } + } + + return false; + } + + /** + * Validate the port + * + * Valid values include numbers between 1 and 65535, and empty values + * + * @param int $port + * @return bool + */ + public static function validatePort($port) + { + if ($port === 0) { + return false; + } + + if ($port) { + $port = (int) $port; + if ($port < 1 || $port > 0xffff) { + return false; + } + } + + return true; + } + + /** + * Validate the path + * + * @param string $path + * @return bool + */ + public static function validatePath($path) + { + $pchar = '(?:[' . self::CHAR_UNRESERVED . ':@&=\+\$,]+|%[A-Fa-f0-9]{2})*'; + $segment = $pchar . "(?:;{$pchar})*"; + $regex = "/^{$segment}(?:\/{$segment})*$/"; + return (bool) preg_match($regex, $path); + } + + /** + * Check if a URI query or fragment part is valid or not + * + * Query and Fragment parts are both restricted by the same syntax rules, + * so the same validation method can be used for both. + * + * You can encode a query or fragment part to ensure it is valid by passing + * it through the encodeQueryFragment() method. + * + * @param string $input + * @return bool + */ + public static function validateQueryFragment($input) + { + $regex = '/^(?:[' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ':@\/\?]+|%[A-Fa-f0-9]{2})*$/'; + return (bool) preg_match($regex, $input); + } + + /** + * URL-encode the user info part of a URI + * + * @param string $userInfo + * @return string + * @throws Exception\InvalidArgumentException + */ + public static function encodeUserInfo($userInfo) + { + if (!is_string($userInfo)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expecting a string, got %s', + (is_object($userInfo) ? get_class($userInfo) : gettype($userInfo)) + )); + } + + $regex = '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:]|%(?![A-Fa-f0-9]{2}))/'; + $escaper = static::getEscaper(); + $replace = function ($match) use ($escaper) { + return $escaper->escapeUrl($match[0]); + }; + + return preg_replace_callback($regex, $replace, $userInfo); + } + + /** + * Encode the path + * + * Will replace all characters which are not strictly allowed in the path + * part with percent-encoded representation + * + * @param string $path + * @throws Exception\InvalidArgumentException + * @return string + */ + public static function encodePath($path) + { + if (!is_string($path)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expecting a string, got %s', + (is_object($path) ? get_class($path) : gettype($path)) + )); + } + + $regex = '/(?:[^' . self::CHAR_UNRESERVED . ':@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/'; + $escaper = static::getEscaper(); + $replace = function ($match) use ($escaper) { + return $escaper->escapeUrl($match[0]); + }; + + return preg_replace_callback($regex, $replace, $path); + } + + /** + * URL-encode a query string or fragment based on RFC-3986 guidelines. + * + * Note that query and fragment encoding allows more unencoded characters + * than the usual rawurlencode() function would usually return - for example + * '/' and ':' are allowed as literals. + * + * @param string $input + * @return string + * @throws Exception\InvalidArgumentException + */ + public static function encodeQueryFragment($input) + { + if (!is_string($input)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expecting a string, got %s', + (is_object($input) ? get_class($input) : gettype($input)) + )); + } + + $regex = '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]+|%(?![A-Fa-f0-9]{2}))/'; + $escaper = static::getEscaper(); + $replace = function ($match) use ($escaper) { + return $escaper->escapeUrl($match[0]); + }; + + return preg_replace_callback($regex, $replace, $input); + } + + /** + * Extract only the scheme part out of a URI string. + * + * This is used by the parse() method, but is useful as a standalone public + * method if one wants to test a URI string for it's scheme before doing + * anything with it. + * + * Will return the scheme if found, or NULL if no scheme found (URI may + * still be valid, but not full) + * + * @param string $uriString + * @throws Exception\InvalidArgumentException + * @return string|null + */ + public static function parseScheme($uriString) + { + if (! is_string($uriString)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expecting a string, got %s', + (is_object($uriString) ? get_class($uriString) : gettype($uriString)) + )); + } + + if (preg_match('/^([A-Za-z][A-Za-z0-9\.\+\-]*):/', $uriString, $match)) { + return $match[1]; + } + + return null; + } + + /** + * Remove any extra dot segments (/../, /./) from a path + * + * Algorithm is adapted from RFC-3986 section 5.2.4 + * (@link http://tools.ietf.org/html/rfc3986#section-5.2.4) + * + * @todo consider optimizing + * + * @param string $path + * @return string + */ + public static function removePathDotSegments($path) + { + $output = ''; + + while ($path) { + if ($path == '..' || $path == '.') { + break; + } + + switch (true) { + case ($path == '/.'): + $path = '/'; + break; + case ($path == '/..'): + $path = '/'; + $output = substr($output, 0, strrpos($output, '/', -1)); + break; + case (substr($path, 0, 4) == '/../'): + $path = '/' . substr($path, 4); + $output = substr($output, 0, strrpos($output, '/', -1)); + break; + case (substr($path, 0, 3) == '/./'): + $path = substr($path, 2); + break; + case (substr($path, 0, 2) == './'): + $path = substr($path, 2); + break; + case (substr($path, 0, 3) == '../'): + $path = substr($path, 3); + break; + default: + $slash = strpos($path, '/', 1); + if ($slash === false) { + $seg = $path; + } else { + $seg = substr($path, 0, $slash); + } + + $output .= $seg; + $path = substr($path, strlen($seg)); + break; + } + } + + return $output; + } + + /** + * Merge a base URI and a relative URI into a new URI object + * + * This convenience method wraps ::resolve() to allow users to quickly + * create new absolute URLs without the need to instantiate and clone + * URI objects. + * + * If objects are passed in, none of the passed objects will be modified. + * + * @param Uri|string $baseUri + * @param Uri|string $relativeUri + * @return Uri + */ + public static function merge($baseUri, $relativeUri) + { + $uri = new static($relativeUri); + return $uri->resolve($baseUri); + } + + /** + * Check if a host name is a valid IP address, depending on allowed IP address types + * + * @param string $host + * @param int $allowed allowed address types + * @return bool + */ + protected static function isValidIpAddress($host, $allowed) + { + $validatorParams = array( + 'allowipv4' => (bool) ($allowed & self::HOST_IPV4), + 'allowipv6' => false, + 'allowipvfuture' => false, + 'allowliteral' => false, + ); + + // Test only IPv4 + $validator = new Validator\Ip($validatorParams); + $return = $validator->isValid($host); + if ($return) { + return true; + } + + // IPv6 & IPvLiteral must be in literal format + $validatorParams = array( + 'allowipv4' => false, + 'allowipv6' => (bool) ($allowed & self::HOST_IPV6), + 'allowipvfuture' => (bool) ($allowed & self::HOST_IPVFUTURE), + 'allowliteral' => true, + ); + static $regex = '/^\[.*\]$/'; + $validator->setOptions($validatorParams); + return (preg_match($regex, $host) && $validator->isValid($host)); + } + + /** + * Check if an address is a valid DNS hostname + * + * @param string $host + * @return bool + */ + protected static function isValidDnsHostname($host) + { + $validator = new Validator\Hostname(array( + 'allow' => Validator\Hostname::ALLOW_DNS | Validator\Hostname::ALLOW_LOCAL, + )); + + return $validator->isValid($host); + } + + /** + * Check if an address is a valid registered name (as defined by RFC-3986) address + * + * @param string $host + * @return bool + */ + protected static function isValidRegName($host) + { + $regex = '/^(?:[' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ':@\/\?]+|%[A-Fa-f0-9]{2})+$/'; + return (bool) preg_match($regex, $host); + } + + /** + * Part normalization methods + * + * These are called by normalize() using static::_normalize*() so they may + * be extended or overridden by extending classes to implement additional + * scheme specific normalization rules + */ + + /** + * Normalize the scheme + * + * Usually this means simply converting the scheme to lower case + * + * @param string $scheme + * @return string + */ + protected static function normalizeScheme($scheme) + { + return strtolower($scheme); + } + + /** + * Normalize the host part + * + * By default this converts host names to lower case + * + * @param string $host + * @return string + */ + protected static function normalizeHost($host) + { + return strtolower($host); + } + + /** + * Normalize the port + * + * If the class defines a default port for the current scheme, and the + * current port is default, it will be unset. + * + * @param int $port + * @param string $scheme + * @return int|null + */ + protected static function normalizePort($port, $scheme = null) + { + if ($scheme + && isset(static::$defaultPorts[$scheme]) + && ($port == static::$defaultPorts[$scheme]) + ) { + return null; + } + + return $port; + } + + /** + * Normalize the path + * + * This involves removing redundant dot segments, decoding any over-encoded + * characters and encoding everything that needs to be encoded and is not + * + * @param string $path + * @return string + */ + protected static function normalizePath($path) + { + $path = self::encodePath( + self::decodeUrlEncodedChars( + self::removePathDotSegments($path), + '/[' . self::CHAR_UNRESERVED . ':@&=\+\$,\/;%]/' + ) + ); + + return $path; + } + + /** + * Normalize the query part + * + * This involves decoding everything that doesn't need to be encoded, and + * encoding everything else + * + * @param string $query + * @return string + */ + protected static function normalizeQuery($query) + { + $query = self::encodeQueryFragment( + self::decodeUrlEncodedChars( + $query, + '/[' . self::CHAR_UNRESERVED . self::CHAR_QUERY_DELIMS . ':@\/\?]/' + ) + ); + + return $query; + } + + /** + * Normalize the fragment part + * + * Currently this is exactly the same as normalizeQuery(). + * + * @param string $fragment + * @return string + */ + protected static function normalizeFragment($fragment) + { + $fragment = self::encodeQueryFragment( + self::decodeUrlEncodedChars( + $fragment, + '/[' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]/' + ) + ); + + return $fragment; + } + + /** + * Decode all percent encoded characters which are allowed to be represented literally + * + * Will not decode any characters which are not listed in the 'allowed' list + * + * @param string $input + * @param string $allowed Pattern of allowed characters + * @return mixed + */ + protected static function decodeUrlEncodedChars($input, $allowed = '') + { + $decodeCb = function ($match) use ($allowed) { + $char = rawurldecode($match[0]); + if (preg_match($allowed, $char)) { + return $char; + } + return strtoupper($match[0]); + }; + + return preg_replace_callback('/%[A-Fa-f0-9]{2}/', $decodeCb, $input); + } +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/UriFactory.php b/vendor/zendframework/zend-uri/Zend/Uri/UriFactory.php new file mode 100644 index 0000000000..d6b65a12e5 --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/UriFactory.php @@ -0,0 +1,124 @@ + 'Zend\Uri\Http', + 'https' => 'Zend\Uri\Http', + 'mailto' => 'Zend\Uri\Mailto', + 'file' => 'Zend\Uri\File', + 'urn' => 'Zend\Uri\Uri', + 'tag' => 'Zend\Uri\Uri', + ); + + /** + * Register a scheme-specific class to be used + * + * @param string $scheme + * @param string $class + */ + public static function registerScheme($scheme, $class) + { + $scheme = strtolower($scheme); + static::$schemeClasses[$scheme] = $class; + } + + /** + * Unregister a scheme + * + * @param string $scheme + */ + public static function unregisterScheme($scheme) + { + $scheme = strtolower($scheme); + if (isset(static::$schemeClasses[$scheme])) { + unset(static::$schemeClasses[$scheme]); + } + } + + /** + * Get the class name for a registered scheme + * + * If provided scheme is not registered, will return NULL + * + * @param string $scheme + * @return string|null + */ + public static function getRegisteredSchemeClass($scheme) + { + if (isset(static::$schemeClasses[$scheme])) { + return static::$schemeClasses[$scheme]; + } else { + return null; + } + } + + /** + * Create a URI from a string + * + * @param string $uriString + * @param string $defaultScheme + * @throws Exception\InvalidArgumentException + * @return \Zend\Uri\Uri + */ + public static function factory($uriString, $defaultScheme = null) + { + if (!is_string($uriString)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expecting a string, received "%s"', + (is_object($uriString) ? get_class($uriString) : gettype($uriString)) + )); + } + + $uri = new Uri($uriString); + $scheme = strtolower($uri->getScheme()); + if (!$scheme && $defaultScheme) { + $scheme = $defaultScheme; + } + + if ($scheme && ! isset(static::$schemeClasses[$scheme])) { + throw new Exception\InvalidArgumentException(sprintf( + 'no class registered for scheme "%s"', + $scheme + )); + } + if ($scheme && isset(static::$schemeClasses[$scheme])) { + $class = static::$schemeClasses[$scheme]; + $uri = new $class($uri); + if (! $uri instanceof UriInterface) { + throw new Exception\InvalidArgumentException(sprintf( + 'class "%s" registered for scheme "%s" does not implement Zend\Uri\UriInterface', + $class, + $scheme + )); + } + } + + return $uri; + } +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/UriInterface.php b/vendor/zendframework/zend-uri/Zend/Uri/UriInterface.php new file mode 100644 index 0000000000..04ec03445c --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/UriInterface.php @@ -0,0 +1,246 @@ + value pairs + * + * This is an extension to RFC-3986 but is quite useful when working with + * most common URI types + * + * @return array + */ + public function getQueryAsArray(); + + /** + * Get the URI fragment + * + * @return string|null + */ + public function getFragment(); + + /** + * Set the URI scheme + * + * If the scheme is not valid according to the generic scheme syntax or + * is not acceptable by the specific URI class (e.g. 'http' or 'https' are + * the only acceptable schemes for the Zend\Uri\Http class) an exception + * will be thrown. + * + * You can check if a scheme is valid before setting it using the + * validateScheme() method. + * + * @param string $scheme + * @throws Exception\InvalidUriPartException + * @return Uri + */ + public function setScheme($scheme); + + /** + * Set the URI User-info part (usually user:password) + * + * @param string $userInfo + * @return Uri + * @throws Exception\InvalidUriPartException If the schema definition + * does not have this part + */ + public function setUserInfo($userInfo); + + /** + * Set the URI host + * + * Note that the generic syntax for URIs allows using host names which + * are not necessarily IPv4 addresses or valid DNS host names. For example, + * IPv6 addresses are allowed as well, and also an abstract "registered name" + * which may be any name composed of a valid set of characters, including, + * for example, tilda (~) and underscore (_) which are not allowed in DNS + * names. + * + * Subclasses of Uri may impose more strict validation of host names - for + * example the HTTP RFC clearly states that only IPv4 and valid DNS names + * are allowed in HTTP URIs. + * + * @param string $host + * @throws Exception\InvalidUriPartException + * @return Uri + */ + public function setHost($host); + + /** + * Set the port part of the URI + * + * @param int $port + * @return Uri + */ + public function setPort($port); + + /** + * Set the path + * + * @param string $path + * @return Uri + */ + public function setPath($path); + + /** + * Set the query string + * + * If an array is provided, will encode this array of parameters into a + * query string. Array values will be represented in the query string using + * PHP's common square bracket notation. + * + * @param string|array $query + * @return Uri + */ + public function setQuery($query); + + /** + * Set the URI fragment part + * + * @param string $fragment + * @return Uri + * @throws Exception\InvalidUriPartException If the schema definition + * does not have this part + */ + public function setFragment($fragment); + + /** + * Magic method to convert the URI to a string + * + * @return string + */ + public function __toString(); +} diff --git a/vendor/zendframework/zend-uri/Zend/Uri/composer.json b/vendor/zendframework/zend-uri/Zend/Uri/composer.json new file mode 100644 index 0000000000..18ebba27d1 --- /dev/null +++ b/vendor/zendframework/zend-uri/Zend/Uri/composer.json @@ -0,0 +1,26 @@ +{ + "name": "zendframework/zend-uri", + "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", + "license": "BSD-3-Clause", + "keywords": [ + "zf2", + "uri" + ], + "autoload": { + "psr-0": { + "Zend\\Uri\\": "" + } + }, + "target-dir": "Zend/Uri", + "require": { + "php": ">=5.3.23", + "zendframework/zend-escaper": "self.version", + "zendframework/zend-validator": "self.version" + }, + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/AbstractValidator.php b/vendor/zendframework/zend-validator/Zend/Validator/AbstractValidator.php new file mode 100644 index 0000000000..6c79742cc9 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/AbstractValidator.php @@ -0,0 +1,582 @@ + array(), // Array of validation failure messages + 'messageTemplates' => array(), // Array of validation failure message templates + 'messageVariables' => array(), // Array of additional variables available for validation failure messages + 'translator' => null, // Translation object to used -> Translator\TranslatorInterface + 'translatorTextDomain' => null, // Translation text domain + 'translatorEnabled' => true, // Is translation enabled? + 'valueObscured' => false, // Flag indicating whether or not value should be obfuscated + // in error messages + ); + + /** + * Abstract constructor for all validators + * A validator should accept following parameters: + * - nothing f.e. Validator() + * - one or multiple scalar values f.e. Validator($first, $second, $third) + * - an array f.e. Validator(array($first => 'first', $second => 'second', $third => 'third')) + * - an instance of Traversable f.e. Validator($config_instance) + * + * @param array|Traversable $options + */ + public function __construct($options = null) + { + // The abstract constructor allows no scalar values + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (isset($this->messageTemplates)) { + $this->abstractOptions['messageTemplates'] = $this->messageTemplates; + } + + if (isset($this->messageVariables)) { + $this->abstractOptions['messageVariables'] = $this->messageVariables; + } + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Returns an option + * + * @param string $option Option to be returned + * @return mixed Returned option + * @throws Exception\InvalidArgumentException + */ + public function getOption($option) + { + if (array_key_exists($option, $this->abstractOptions)) { + return $this->abstractOptions[$option]; + } + + if (isset($this->options) && array_key_exists($option, $this->options)) { + return $this->options[$option]; + } + + throw new Exception\InvalidArgumentException("Invalid option '$option'"); + } + + /** + * Returns all available options + * + * @return array Array with all available options + */ + public function getOptions() + { + $result = $this->abstractOptions; + if (isset($this->options)) { + $result += $this->options; + } + return $result; + } + + /** + * Sets one or multiple options + * + * @param array|Traversable $options Options to set + * @throws Exception\InvalidArgumentException If $options is not an array or Traversable + * @return AbstractValidator Provides fluid interface + */ + public function setOptions($options = array()) + { + if (!is_array($options) && !$options instanceof Traversable) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable'); + } + + foreach ($options as $name => $option) { + $fname = 'set' . ucfirst($name); + $fname2 = 'is' . ucfirst($name); + if (($name != 'setOptions') && method_exists($this, $name)) { + $this->{$name}($option); + } elseif (($fname != 'setOptions') && method_exists($this, $fname)) { + $this->{$fname}($option); + } elseif (method_exists($this, $fname2)) { + $this->{$fname2}($option); + } elseif (isset($this->options)) { + $this->options[$name] = $option; + } else { + $this->abstractOptions[$name] = $option; + } + } + + return $this; + } + + /** + * Returns array of validation failure messages + * + * @return array + */ + public function getMessages() + { + return array_unique($this->abstractOptions['messages'], SORT_REGULAR); + } + + /** + * Invoke as command + * + * @param mixed $value + * @return bool + */ + public function __invoke($value) + { + return $this->isValid($value); + } + + /** + * Returns an array of the names of variables that are used in constructing validation failure messages + * + * @return array + */ + public function getMessageVariables() + { + return array_keys($this->abstractOptions['messageVariables']); + } + + /** + * Returns the message templates from the validator + * + * @return array + */ + public function getMessageTemplates() + { + return $this->abstractOptions['messageTemplates']; + } + + /** + * Sets the validation failure message template for a particular key + * + * @param string $messageString + * @param string $messageKey OPTIONAL + * @return AbstractValidator Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setMessage($messageString, $messageKey = null) + { + if ($messageKey === null) { + $keys = array_keys($this->abstractOptions['messageTemplates']); + foreach ($keys as $key) { + $this->setMessage($messageString, $key); + } + return $this; + } + + if (!isset($this->abstractOptions['messageTemplates'][$messageKey])) { + throw new Exception\InvalidArgumentException("No message template exists for key '$messageKey'"); + } + + $this->abstractOptions['messageTemplates'][$messageKey] = $messageString; + return $this; + } + + /** + * Sets validation failure message templates given as an array, where the array keys are the message keys, + * and the array values are the message template strings. + * + * @param array $messages + * @return AbstractValidator + */ + public function setMessages(array $messages) + { + foreach ($messages as $key => $message) { + $this->setMessage($message, $key); + } + return $this; + } + + /** + * Magic function returns the value of the requested property, if and only if it is the value or a + * message variable. + * + * @param string $property + * @return mixed + * @throws Exception\InvalidArgumentException + */ + public function __get($property) + { + if ($property == 'value') { + return $this->value; + } + + if (array_key_exists($property, $this->abstractOptions['messageVariables'])) { + $result = $this->abstractOptions['messageVariables'][$property]; + if (is_array($result)) { + $result = $this->{key($result)}[current($result)]; + } else { + $result = $this->{$result}; + } + return $result; + } + + if (isset($this->messageVariables) && array_key_exists($property, $this->messageVariables)) { + $result = $this->{$this->messageVariables[$property]}; + if (is_array($result)) { + $result = $this->{key($result)}[current($result)]; + } else { + $result = $this->{$result}; + } + return $result; + } + + throw new Exception\InvalidArgumentException("No property exists by the name '$property'"); + } + + /** + * Constructs and returns a validation failure message with the given message key and value. + * + * Returns null if and only if $messageKey does not correspond to an existing template. + * + * If a translator is available and a translation exists for $messageKey, + * the translation will be used. + * + * @param string $messageKey + * @param string|array|object $value + * @return string + */ + protected function createMessage($messageKey, $value) + { + if (!isset($this->abstractOptions['messageTemplates'][$messageKey])) { + return null; + } + + $message = $this->abstractOptions['messageTemplates'][$messageKey]; + + $message = $this->translateMessage($messageKey, $message); + + if (is_object($value) && + !in_array('__toString', get_class_methods($value)) + ) { + $value = get_class($value) . ' object'; + } elseif (is_array($value)) { + $value = var_export($value, 1); + } else { + $value = (string) $value; + } + + if ($this->isValueObscured()) { + $value = str_repeat('*', strlen($value)); + } + + $message = str_replace('%value%', (string) $value, $message); + foreach ($this->abstractOptions['messageVariables'] as $ident => $property) { + if (is_array($property)) { + $value = $this->{key($property)}[current($property)]; + if (is_array($value)) { + $value = '[' . implode(', ', $value) . ']'; + } + } else { + $value = $this->$property; + } + $message = str_replace("%$ident%", (string) $value, $message); + } + + $length = self::getMessageLength(); + if (($length > -1) && (strlen($message) > $length)) { + $message = substr($message, 0, ($length - 3)) . '...'; + } + + return $message; + } + + /** + * @param string $messageKey + * @param string $value OPTIONAL + * @return void + */ + protected function error($messageKey, $value = null) + { + if ($messageKey === null) { + $keys = array_keys($this->abstractOptions['messageTemplates']); + $messageKey = current($keys); + } + + if ($value === null) { + $value = $this->value; + } + + $this->abstractOptions['messages'][$messageKey] = $this->createMessage($messageKey, $value); + } + + /** + * Returns the validation value + * + * @return mixed Value to be validated + */ + protected function getValue() + { + return $this->value; + } + + /** + * Sets the value to be validated and clears the messages and errors arrays + * + * @param mixed $value + * @return void + */ + protected function setValue($value) + { + $this->value = $value; + $this->abstractOptions['messages'] = array(); + } + + /** + * Set flag indicating whether or not value should be obfuscated in messages + * + * @param bool $flag + * @return AbstractValidator + */ + public function setValueObscured($flag) + { + $this->abstractOptions['valueObscured'] = (bool) $flag; + return $this; + } + + /** + * Retrieve flag indicating whether or not value should be obfuscated in + * messages + * + * @return bool + */ + public function isValueObscured() + { + return $this->abstractOptions['valueObscured']; + } + + /** + * Set translation object + * + * @param Translator\TranslatorInterface|null $translator + * @param string $textDomain (optional) + * @return AbstractValidator + * @throws Exception\InvalidArgumentException + */ + public function setTranslator(Translator\TranslatorInterface $translator = null, $textDomain = null) + { + $this->abstractOptions['translator'] = $translator; + if (null !== $textDomain) { + $this->setTranslatorTextDomain($textDomain); + } + return $this; + } + + /** + * Return translation object + * + * @return Translator\TranslatorInterface|null + */ + public function getTranslator() + { + if (! $this->isTranslatorEnabled()) { + return null; + } + + if (null === $this->abstractOptions['translator']) { + $this->abstractOptions['translator'] = self::getDefaultTranslator(); + } + + return $this->abstractOptions['translator']; + } + + /** + * Does this validator have its own specific translator? + * + * @return bool + */ + public function hasTranslator() + { + return (bool) $this->abstractOptions['translator']; + } + + /** + * Set translation text domain + * + * @param string $textDomain + * @return AbstractValidator + */ + public function setTranslatorTextDomain($textDomain = 'default') + { + $this->abstractOptions['translatorTextDomain'] = $textDomain; + return $this; + } + + /** + * Return the translation text domain + * + * @return string + */ + public function getTranslatorTextDomain() + { + if (null === $this->abstractOptions['translatorTextDomain']) { + $this->abstractOptions['translatorTextDomain'] = + self::getDefaultTranslatorTextDomain(); + } + return $this->abstractOptions['translatorTextDomain']; + } + + /** + * Set default translation object for all validate objects + * + * @param Translator\TranslatorInterface|null $translator + * @param string $textDomain (optional) + * @return void + * @throws Exception\InvalidArgumentException + */ + public static function setDefaultTranslator( + Translator\TranslatorInterface $translator = null, $textDomain = null + ) + { + static::$defaultTranslator = $translator; + if (null !== $textDomain) { + self::setDefaultTranslatorTextDomain($textDomain); + } + } + + /** + * Get default translation object for all validate objects + * + * @return Translator\TranslatorInterface|null + */ + public static function getDefaultTranslator() + { + return static::$defaultTranslator; + } + + /** + * Is there a default translation object set? + * + * @return bool + */ + public static function hasDefaultTranslator() + { + return (bool) static::$defaultTranslator; + } + + /** + * Set default translation text domain for all validate objects + * + * @param string $textDomain + * @return void + */ + public static function setDefaultTranslatorTextDomain($textDomain = 'default') + { + static::$defaultTranslatorTextDomain = $textDomain; + } + + /** + * Get default translation text domain for all validate objects + * + * @return string + */ + public static function getDefaultTranslatorTextDomain() + { + return static::$defaultTranslatorTextDomain; + } + + /** + * Indicate whether or not translation should be enabled + * + * @param bool $flag + * @return AbstractValidator + */ + public function setTranslatorEnabled($flag = true) + { + $this->abstractOptions['translatorEnabled'] = (bool) $flag; + return $this; + } + + /** + * Is translation enabled? + * + * @return bool + */ + public function isTranslatorEnabled() + { + return $this->abstractOptions['translatorEnabled']; + } + + /** + * Returns the maximum allowed message length + * + * @return int + */ + public static function getMessageLength() + { + return static::$messageLength; + } + + /** + * Sets the maximum allowed message length + * + * @param int $length + */ + public static function setMessageLength($length = -1) + { + static::$messageLength = $length; + } + + /** + * Translate a validation message + * + * @param string $messageKey + * @param string $message + * @return string + */ + protected function translateMessage($messageKey, $message) + { + $translator = $this->getTranslator(); + if (!$translator) { + return $message; + } + + return $translator->translate( + $message, $this->getTranslatorTextDomain() + ); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode.php new file mode 100644 index 0000000000..f86003eb83 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode.php @@ -0,0 +1,178 @@ + "The input failed checksum validation", + self::INVALID_CHARS => "The input contains invalid characters", + self::INVALID_LENGTH => "The input should have a length of %length% characters", + self::INVALID => "Invalid type given. String expected", + ); + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = array( + 'length' => array('options' => 'length'), + ); + + protected $options = array( + 'adapter' => null, // Barcode adapter Zend\Validator\Barcode\AbstractAdapter + 'options' => null, // Options for this adapter + 'length' => null, + 'useChecksum' => null, + ); + + /** + * Constructor for barcodes + * + * @param array|string $options Options to use + */ + public function __construct($options = null) + { + if (!is_array($options) && !($options instanceof Traversable)) { + $options = array('adapter' => $options); + } + + if (array_key_exists('options', $options)) { + $options['options'] = array('options' => $options['options']); + } + + parent::__construct($options); + } + + /** + * Returns the set adapter + * + * @return Barcode\AbstractAdapter + */ + public function getAdapter() + { + if (!($this->options['adapter'] instanceof Barcode\AdapterInterface)) { + $this->setAdapter('Ean13'); + } + + return $this->options['adapter']; + } + + /** + * Sets a new barcode adapter + * + * @param string|Barcode\AbstractAdapter $adapter Barcode adapter to use + * @param array $options Options for this adapter + * @return Barcode + * @throws Exception\InvalidArgumentException + */ + public function setAdapter($adapter, $options = null) + { + if (is_string($adapter)) { + $adapter = ucfirst(strtolower($adapter)); + $adapter = 'Zend\\Validator\\Barcode\\' . $adapter; + + if (!class_exists($adapter)) { + throw new Exception\InvalidArgumentException('Barcode adapter matching "' . $adapter . '" not found'); + } + + $this->options['adapter'] = new $adapter($options); + } + + if (!$this->options['adapter'] instanceof Barcode\AdapterInterface) { + throw new Exception\InvalidArgumentException( + "Adapter $adapter does not implement Zend\\Validate\\Barcode\\AdapterInterface" + ); + } + + return $this; + } + + /** + * Returns the checksum option + * + * @return string + */ + public function getChecksum() + { + return $this->getAdapter()->getChecksum(); + } + + /** + * Sets if checksum should be validated, if no value is given the actual setting is returned + * + * @param bool $checksum + * @return bool + */ + public function useChecksum($checksum = null) + { + return $this->getAdapter()->useChecksum($checksum); + } + + /** + * Defined by Zend\Validator\ValidatorInterface + * + * Returns true if and only if $value contains a valid barcode + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + $adapter = $this->getAdapter(); + $this->options['length'] = $adapter->getLength(); + $result = $adapter->hasValidLength($value); + if (!$result) { + if (is_array($this->options['length'])) { + $temp = $this->options['length']; + $this->options['length'] = ""; + foreach ($temp as $length) { + $this->options['length'] .= "/"; + $this->options['length'] .= $length; + } + + $this->options['length'] = substr($this->options['length'], 1); + } + + $this->error(self::INVALID_LENGTH); + return false; + } + + $result = $adapter->hasValidCharacters($value); + if (!$result) { + $this->error(self::INVALID_CHARS); + return false; + } + + if ($this->useChecksum(null)) { + $result = $adapter->hasValidChecksum($value); + if (!$result) { + $this->error(self::FAILED); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/AbstractAdapter.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/AbstractAdapter.php new file mode 100644 index 0000000000..1222d87ed8 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/AbstractAdapter.php @@ -0,0 +1,310 @@ + null, // Allowed barcode lengths, integer, array, string + 'characters' => null, // Allowed barcode characters + 'checksum' => null, // Callback to checksum function + 'useChecksum' => true, // Is a checksum value included?, boolean + ); + + /** + * Checks the length of a barcode + * + * @param string $value The barcode to check for proper length + * @return bool + */ + public function hasValidLength($value) + { + if (!is_string($value)) { + return false; + } + + $fixum = strlen($value); + $found = false; + $length = $this->getLength(); + if (is_array($length)) { + foreach ($length as $value) { + if ($fixum == $value) { + $found = true; + } + + if ($value == -1) { + $found = true; + } + } + } elseif ($fixum == $length) { + $found = true; + } elseif ($length == -1) { + $found = true; + } elseif ($length == 'even') { + $count = $fixum % 2; + $found = ($count == 0) ? true : false; + } elseif ($length == 'odd') { + $count = $fixum % 2; + $found = ($count == 1) ? true : false; + } + + return $found; + } + + /** + * Checks for allowed characters within the barcode + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if (!is_string($value)) { + return false; + } + + $characters = $this->getCharacters(); + if ($characters == 128) { + for ($x = 0; $x < 128; ++$x) { + $value = str_replace(chr($x), '', $value); + } + } else { + $chars = str_split($characters); + foreach ($chars as $char) { + $value = str_replace($char, '', $value); + } + } + + if (strlen($value) > 0) { + return false; + } + + return true; + } + + /** + * Validates the checksum + * + * @param string $value The barcode to check the checksum for + * @return bool + */ + public function hasValidChecksum($value) + { + $checksum = $this->getChecksum(); + if (!empty($checksum)) { + if (method_exists($this, $checksum)) { + return $this->$checksum($value); + } + } + + return false; + } + + /** + * Returns the allowed barcode length + * + * @return int|array + */ + public function getLength() + { + return $this->options['length']; + } + + /** + * Returns the allowed characters + * + * @return int|string|array + */ + public function getCharacters() + { + return $this->options['characters']; + } + + /** + * Returns the checksum function name + * + */ + public function getChecksum() + { + return $this->options['checksum']; + } + + /** + * Sets the checksum validation method + * + * @param callable $checksum Checksum method to call + * @return AbstractAdapter + */ + protected function setChecksum($checksum) + { + $this->options['checksum'] = $checksum; + return $this; + } + + /** + * Sets the checksum validation, if no value is given, the actual setting is returned + * + * @param bool $check + * @return AbstractAdapter|bool + */ + public function useChecksum($check = null) + { + if ($check === null) { + return $this->options['useChecksum']; + } + + $this->options['useChecksum'] = (bool) $check; + return $this; + } + + /** + * Sets the length of this barcode + * + * @param int|array $length + * @return AbstractAdapter + */ + protected function setLength($length) + { + $this->options['length'] = $length; + return $this; + } + + /** + * Sets the allowed characters of this barcode + * + * @param int $characters + * @return AbstractAdapter + */ + protected function setCharacters($characters) + { + $this->options['characters'] = $characters; + return $this; + } + + /** + * Validates the checksum (Modulo 10) + * GTIN implementation factor 3 + * + * @param string $value The barcode to validate + * @return bool + */ + protected function gtin($value) + { + $barcode = substr($value, 0, -1); + $sum = 0; + $length = strlen($barcode) - 1; + + for ($i = 0; $i <= $length; $i++) { + if (($i % 2) === 0) { + $sum += $barcode[$length - $i] * 3; + } else { + $sum += $barcode[$length - $i]; + } + } + + $calc = $sum % 10; + $checksum = ($calc === 0) ? 0 : (10 - $calc); + if ($value[$length + 1] != $checksum) { + return false; + } + + return true; + } + + /** + * Validates the checksum (Modulo 10) + * IDENTCODE implementation factors 9 and 4 + * + * @param string $value The barcode to validate + * @return bool + */ + protected function identcode($value) + { + $barcode = substr($value, 0, -1); + $sum = 0; + $length = strlen($value) - 2; + + for ($i = 0; $i <= $length; $i++) { + if (($i % 2) === 0) { + $sum += $barcode[$length - $i] * 4; + } else { + $sum += $barcode[$length - $i] * 9; + } + } + + $calc = $sum % 10; + $checksum = ($calc === 0) ? 0 : (10 - $calc); + if ($value[$length + 1] != $checksum) { + return false; + } + + return true; + } + + /** + * Validates the checksum (Modulo 10) + * CODE25 implementation factor 3 + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code25($value) + { + $barcode = substr($value, 0, -1); + $sum = 0; + $length = strlen($barcode) - 1; + + for ($i = 0; $i <= $length; $i++) { + if (($i % 2) === 0) { + $sum += $barcode[$i] * 3; + } else { + $sum += $barcode[$i]; + } + } + + $calc = $sum % 10; + $checksum = ($calc === 0) ? 0 : (10 - $calc); + if ($value[$length + 1] != $checksum) { + return false; + } + + return true; + } + + /** + * Validates the checksum () + * POSTNET implementation + * + * @param string $value The barcode to validate + * @return bool + */ + protected function postnet($value) + { + $checksum = substr($value, -1, 1); + $values = str_split(substr($value, 0, -1)); + + $check = 0; + foreach ($values as $row) { + $check += $row; + } + + $check %= 10; + $check = 10 - $check; + if ($check == $checksum) { + return true; + } + + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/AdapterInterface.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/AdapterInterface.php new file mode 100644 index 0000000000..33d2449603 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/AdapterInterface.php @@ -0,0 +1,66 @@ +setLength(-1); + $this->setCharacters('0123456789-$:/.+ABCDTN*E'); + $this->useChecksum(false); + } + + /** + * Checks for allowed characters + * @see Zend\Validator\Barcode.AbstractAdapter::checkChars() + */ + public function hasValidCharacters($value) + { + if (strpbrk($value, 'ABCD')) { + $first = $value[0]; + if (!strpbrk($first, 'ABCD')) { + // Missing start char + return false; + } + + $last = substr($value, -1, 1); + if (!strpbrk($last, 'ABCD')) { + // Missing stop char + return false; + } + + $value = substr($value, 1, -1); + } elseif (strpbrk($value, 'TN*E')) { + $first = $value[0]; + if (!strpbrk($first, 'TN*E')) { + // Missing start char + return false; + } + + $last = substr($value, -1, 1); + if (!strpbrk($last, 'TN*E')) { + // Missing stop char + return false; + } + + $value = substr($value, 1, -1); + } + + $chars = $this->getCharacters(); + $this->setCharacters('0123456789-$:/.+'); + $result = parent::hasValidCharacters($value); + $this->setCharacters($chars); + return $result; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code128.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code128.php new file mode 100644 index 0000000000..2e95551dc9 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code128.php @@ -0,0 +1,449 @@ +setLength(-1); + $this->setCharacters(array( + 'A' => array( + 0 => ' ', 1 => '!', 2 => '"', 3 => '#', 4 => '$', 5 => '%', 6 => '&', 7 => "'", + 8 => '(', 9 => ')', 10 => '*', 11 => '+', 12 => ',', 13 => '-', 14 => '.', 15 => '/', + 16 => '0', 17 => '1', 18 => '2', 19 => '3', 20 => '4', 21 => '5', 22 => '6', 23 => '7', + 24 => '8', 25 => '9', 26 => ':', 27 => ';', 28 => '<', 29 => '=', 30 => '>', 31 => '?', + 32 => '@', 33 => 'A', 34 => 'B', 35 => 'C', 36 => 'D', 37 => 'E', 38 => 'F', 39 => 'G', + 40 => 'H', 41 => 'I', 42 => 'J', 43 => 'K', 44 => 'L', 45 => 'M', 46 => 'N', 47 => 'O', + 48 => 'P', 49 => 'Q', 50 => 'R', 51 => 'S', 52 => 'T', 53 => 'U', 54 => 'V', 55 => 'W', + 56 => 'X', 57 => 'Y', 58 => 'Z', 59 => '[', 60 => '\\',61 => ']', 62 => '^', 63 => '_', + 64 =>0x00, 65 =>0x01, 66 =>0x02, 67 =>0x03, 68 =>0x04, 69 =>0x05, 70 =>0x06, 71 =>0x07, + 72 =>0x08, 73 =>0x09, 74 =>0x0A, 75 =>0x0B, 76 =>0x0C, 77 =>0x0D, 78 =>0x0E, 79 =>0x0F, + 80 =>0x10, 81 =>0x11, 82 =>0x12, 83 =>0x13, 84 =>0x14, 85 =>0x15, 86 =>0x16, 87 =>0x17, + 88 =>0x18, 89 =>0x19, 90 =>0x1A, 91 =>0x1B, 92 =>0x1C, 93 =>0x1D, 94 =>0x1E, 95 =>0x1F, + 96 => 'Ç', 97 => 'ü', 98 => 'é', 99 => 'â',100 => 'ä',101 => 'à',102 => 'Ã¥',103 => '‡', + 104 => 'ˆ',105 => '‰',106 => 'Å '), + 'B' => array( + 0 => ' ', 1 => '!', 2 => '"', 3 => '#', 4 => '$', 5 => '%', 6 => '&', 7 => "'", + 8 => '(', 9 => ')', 10 => '*', 11 => '+', 12 => ',', 13 => '-', 14 => '.', 15 => '/', + 16 => '0', 17 => '1', 18 => '2', 19 => '3', 20 => '4', 21 => '5', 22 => '6', 23 => '7', + 24 => '8', 25 => '9', 26 => ':', 27 => ';', 28 => '<', 29 => '=', 30 => '>', 31 => '?', + 32 => '@', 33 => 'A', 34 => 'B', 35 => 'C', 36 => 'D', 37 => 'E', 38 => 'F', 39 => 'G', + 40 => 'H', 41 => 'I', 42 => 'J', 43 => 'K', 44 => 'L', 45 => 'M', 46 => 'N', 47 => 'O', + 48 => 'P', 49 => 'Q', 50 => 'R', 51 => 'S', 52 => 'T', 53 => 'U', 54 => 'V', 55 => 'W', + 56 => 'X', 57 => 'Y', 58 => 'Z', 59 => '[', 60 => '\\',61 => ']', 62 => '^', 63 => '_', + 64 => '`', 65 => 'a', 66 => 'b', 67 => 'c', 68 => 'd', 69 => 'e', 70 => 'f', 71 => 'g', + 72 => 'h', 73 => 'i', 74 => 'j', 75 => 'k', 76 => 'l', 77 => 'm', 78 => 'n', 79 => 'o', + 80 => 'p', 81 => 'q', 82 => 'r', 83 => 's', 84 => 't', 85 => 'u', 86 => 'v', 87 => 'w', + 88 => 'x', 89 => 'y', 90 => 'z', 91 => '{', 92 => '|', 93 => '}', 94 => '~', 95 =>0x7F, + 96 => 'Ç', 97 => 'ü', 98 => 'é', 99 => 'â',100 => 'ä',101 => 'à',102 => 'Ã¥',103 => '‡', + 104 => 'ˆ',105 => '‰',106 => 'Å '), + 'C' => array( + 0 => '00', 1 => '01', 2 => '02', 3 => '03', 4 => '04', 5 => '05', 6 => '06', 7 => '07', + 8 => '08', 9 => '09', 10 => '10', 11 => '11', 12 => '12', 13 => '13', 14 => '14', 15 => '15', + 16 => '16', 17 => '17', 18 => '18', 19 => '19', 20 => '20', 21 => '21', 22 => '22', 23 => '23', + 24 => '24', 25 => '25', 26 => '26', 27 => '27', 28 => '28', 29 => '29', 30 => '30', 31 => '31', + 32 => '32', 33 => '33', 34 => '34', 35 => '35', 36 => '36', 37 => '37', 38 => '38', 39 => '39', + 40 => '40', 41 => '41', 42 => '42', 43 => '43', 44 => '44', 45 => '45', 46 => '46', 47 => '47', + 48 => '48', 49 => '49', 50 => '50', 51 => '51', 52 => '52', 53 => '53', 54 => '54', 55 => '55', + 56 => '56', 57 => '57', 58 => '58', 59 => '59', 60 => '60', 61 => '61', 62 => '62', 63 => '63', + 64 => '64', 65 => '65', 66 => '66', 67 => '67', 68 => '68', 69 => '69', 70 => '70', 71 => '71', + 72 => '72', 73 => '73', 74 => '74', 75 => '75', 76 => '76', 77 => '77', 78 => '78', 79 => '79', + 80 => '80', 81 => '81', 82 => '82', 83 => '83', 84 => '84', 85 => '85', 86 => '86', 87 => '87', + 88 => '88', 89 => '89', 90 => '90', 91 => '91', 92 => '92', 93 => '93', 94 => '94', 95 => '95', + 96 => '96', 97 => '97', 98 => '98', 99 => '99',100 => 'ä', 101 => 'à', 102 => 'Ã¥', 103 => '‡', + 104 => 'ˆ', 105 => '‰', 106 => 'Å '))); + $this->setChecksum('code128'); + + } + + public function setUtf8StringWrapper(StringWrapperInterface $utf8StringWrapper) + { + if (!$utf8StringWrapper->isSupported('UTF-8')) { + throw new Exception\InvalidArgumentException( + "The string wrapper needs to support UTF-8 character encoding" + ); + } + $this->utf8StringWrapper = $utf8StringWrapper; + } + + /** + * Get the string wrapper supporting UTF-8 character encoding + * + * @return StringWrapperInterface + */ + public function getUtf8StringWrapper() + { + if (!$this->utf8StringWrapper) { + $this->utf8StringWrapper = StringUtils::getWrapper('UTF-8'); + } + return $this->utf8StringWrapper; + } + + /** + * Checks for allowed characters within the barcode + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if (!is_string($value)) { + return false; + } + + // get used string wrapper for UTF-8 character encoding + $strWrapper = $this->getUtf8StringWrapper(); + + // detect starting charset + $set = $this->getCodingSet($value); + $read = $set; + if ($set != '') { + $value = $strWrapper->substr($value, 1, null); + } + + // process barcode + while ($value != '') { + $char = $strWrapper->substr($value, 0, 1); + + switch ($char) { + // Function definition + case 'Ç' : + case 'ü' : + case 'Ã¥' : + break; + + // Switch 1 char between A and B + case 'é' : + if ($set == 'A') { + $read = 'B'; + } elseif ($set == 'B') { + $read = 'A'; + } + break; + + // Switch to C + case 'â' : + $set = 'C'; + $read = 'C'; + break; + + // Switch to B + case 'ä' : + $set = 'B'; + $read = 'B'; + break; + + // Switch to A + case 'à' : + $set = 'A'; + $read = 'A'; + break; + + // Doubled start character + case '‡' : + case 'ˆ' : + case '‰' : + return false; + break; + + // Chars after the stop character + case 'Å ' : + break 2; + + default: + // Does the char exist within the charset to read? + if ($this->ord128($char, $read) == -1) { + return false; + } + + break; + } + + $value = $strWrapper->substr($value, 1, null); + $read = $set; + } + + if (($value != '') && ($strWrapper->strlen($value) != 1)) { + return false; + } + + return true; + } + + /** + * Validates the checksum () + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code128($value) + { + $sum = 0; + $pos = 1; + $set = $this->getCodingSet($value); + $read = $set; + $usecheck = $this->useChecksum(null); + $strWrapper = $this->getUtf8StringWrapper(); + $char = $strWrapper->substr($value, 0, 1); + if ($char == '‡') { + $sum = 103; + } elseif ($char == 'ˆ') { + $sum = 104; + } elseif ($char == '‰') { + $sum = 105; + } elseif ($usecheck == true) { + // no start value, unable to detect a proper checksum + return false; + } + + $value = $strWrapper->substr($value, 1, null); + while ($strWrapper->strpos($value, 'Å ') || ($value != '')) { + $char = $strWrapper->substr($value, 0, 1); + if ($read == 'C') { + $char = $strWrapper->substr($value, 0, 2); + } + + switch ($char) { + // Function definition + case 'Ç' : + case 'ü' : + case 'Ã¥' : + $sum += ($pos * $this->ord128($char, $set)); + break; + + case 'é' : + $sum += ($pos * $this->ord128($char, $set)); + if ($set == 'A') { + $read = 'B'; + } elseif ($set == 'B') { + $read = 'A'; + } + break; + + // Switch to C + case 'â' : + $sum += ($pos * $this->ord128($char, $set)); + $set = 'C'; + $read = 'C'; + break; + + // Switch to B + case 'ä' : + $sum += ($pos * $this->ord128($char, $set)); + $set = 'B'; + $read = 'B'; + break; + + // Switch to A + case 'à' : + $sum += ($pos * $this->ord128($char, $set)); + $set = 'A'; + $read = 'A'; + break; + + case '‡' : + case 'ˆ' : + case '‰' : + return false; + break; + + default: + // Does the char exist within the charset to read? + if ($this->ord128($char, $read) == -1) { + return false; + } + + $sum += ($pos * $this->ord128($char, $set)); + break; + } + + $value = $strWrapper->substr($value, 1); + ++$pos; + if (($strWrapper->strpos($value, 'Å ') == 1) && ($strWrapper->strlen($value) == 2)) { + // break by stop and checksum char + break; + } + $read = $set; + } + + if (($strWrapper->strpos($value, 'Å ') != 1) || ($strWrapper->strlen($value) != 2)) { + // return false if checksum is not readable and true if no startvalue is detected + return (!$usecheck); + } + + $mod = $sum % 103; + if ($strWrapper->substr($value, 0, 1) == $this->chr128($mod, $set)) { + return true; + } + + return false; + } + + /** + * Returns the coding set for a barcode + * + * @param string $value Barcode + * @return string + */ + protected function getCodingSet($value) + { + $value = $this->getUtf8StringWrapper()->substr($value, 0, 1); + switch ($value) { + case '‡' : + return 'A'; + break; + case 'ˆ' : + return 'B'; + break; + case '‰' : + return 'C'; + break; + } + + return ''; + } + + /** + * Internal method to return the code128 integer from an ascii value + * + * Table A + * ASCII CODE128 + * 32 to 95 == 0 to 63 + * 0 to 31 == 64 to 95 + * 128 to 138 == 96 to 106 + * + * Table B + * ASCII CODE128 + * 32 to 138 == 0 to 106 + * + * Table C + * ASCII CODE128 + * "00" to "99" == 0 to 99 + * 132 to 138 == 100 to 106 + * + * @param string $value + * @param string $set + * @return int + */ + protected function ord128($value, $set) + { + $ord = ord($value); + if ($set == 'A') { + if ($ord < 32) { + return ($ord + 64); + } elseif ($ord < 96) { + return ($ord - 32); + } elseif ($ord > 138) { + return -1; + } else { + return ($ord - 32); + } + } elseif ($set == 'B') { + if ($ord < 32) { + return -1; + } elseif ($ord <= 138) { + return ($ord - 32); + } else { + return -1; + } + } elseif ($set == 'C') { + $val = (int) $value; + if (($val >= 0) && ($val <= 99)) { + return $val; + } elseif (($ord >= 132) && ($ord <= 138)) { + return ($ord - 32); + } else { + return -1; + } + } else { + if ($ord < 32) { + return ($ord +64); + } elseif ($ord <= 138) { + return ($ord - 32); + } else { + return -1; + } + } + } + + /** + * Internal Method to return the ascii value from a code128 integer + * + * Table A + * ASCII CODE128 + * 32 to 95 == 0 to 63 + * 0 to 31 == 64 to 95 + * 128 to 138 == 96 to 106 + * + * Table B + * ASCII CODE128 + * 32 to 138 == 0 to 106 + * + * Table C + * ASCII CODE128 + * "00" to "99" == 0 to 99 + * 132 to 138 == 100 to 106 + * + * @param int $value + * @param string $set + * @return string + */ + protected function chr128($value, $set) + { + if ($set == 'A') { + if ($value < 64) { + return chr($value + 32); + } elseif ($value < 96) { + return chr($value - 64); + } elseif ($value > 106) { + return -1; + } else { + return chr($value + 32); + } + } elseif ($set == 'B') { + if ($value > 106) { + return -1; + } else { + return chr($value + 32); + } + } elseif ($set == 'C') { + if (($value >= 0) && ($value <= 9)) { + return "0" . (string) $value; + } elseif ($value <= 99) { + return (string) $value; + } elseif ($value <= 106) { + return chr($value + 32); + } else { + return -1; + } + } else { + if ($value <= 106) { + return ($value + 32); + } else { + return -1; + } + } + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code25.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code25.php new file mode 100644 index 0000000000..3619f528c3 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code25.php @@ -0,0 +1,24 @@ +setLength(-1); + $this->setCharacters('0123456789'); + $this->setChecksum('code25'); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code25interleaved.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code25interleaved.php new file mode 100644 index 0000000000..77bc027d97 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code25interleaved.php @@ -0,0 +1,26 @@ +setLength('even'); + $this->setCharacters('0123456789'); + $this->setChecksum('code25'); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code39.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code39.php new file mode 100644 index 0000000000..9a368c5d40 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code39.php @@ -0,0 +1,60 @@ + 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, + '7' => 7, '8' => 8, '9' => 9, 'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, + 'E' => 14, 'F' => 15, 'G' => 16, 'H' => 17, 'I' => 18, 'J' => 19, 'K' => 20, + 'L' => 21, 'M' => 22, 'N' => 23, 'O' => 24, 'P' => 25, 'Q' => 26, 'R' => 27, + 'S' => 28, 'T' => 29, 'U' => 30, 'V' => 31, 'W' => 32, 'X' => 33, 'Y' => 34, + 'Z' => 35, '-' => 36, '.' => 37, ' ' => 38, '$' => 39, '/' => 40, '+' => 41, + '%' => 42, + ); + + /** + * Constructor for this barcode adapter + */ + public function __construct() + { + $this->setLength(-1); + $this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -.$/+%'); + $this->setChecksum('code39'); + $this->useChecksum(false); + } + + /** + * Validates the checksum (Modulo 43) + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code39($value) + { + $checksum = substr($value, -1, 1); + $value = str_split(substr($value, 0, -1)); + $count = 0; + foreach ($value as $char) { + $count += $this->check[$char]; + } + + $mod = $count % 43; + if ($mod == $this->check[$checksum]) { + return true; + } + + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code39ext.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code39ext.php new file mode 100644 index 0000000000..b9b14a59c7 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code39ext.php @@ -0,0 +1,23 @@ +setLength(-1); + $this->setCharacters(128); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code93.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code93.php new file mode 100644 index 0000000000..35739a1103 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code93.php @@ -0,0 +1,80 @@ + 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, + '7' => 7, '8' => 8, '9' => 9, 'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, + 'E' => 14, 'F' => 15, 'G' => 16, 'H' => 17, 'I' => 18, 'J' => 19, 'K' => 20, + 'L' => 21, 'M' => 22, 'N' => 23, 'O' => 24, 'P' => 25, 'Q' => 26, 'R' => 27, + 'S' => 28, 'T' => 29, 'U' => 30, 'V' => 31, 'W' => 32, 'X' => 33, 'Y' => 34, + 'Z' => 35, '-' => 36, '.' => 37, ' ' => 38, '$' => 39, '/' => 40, '+' => 41, + '%' => 42, '!' => 43, '"' => 44, '§' => 45, '&' => 46, + ); + + /** + * Constructor for this barcode adapter + */ + public function __construct() + { + $this->setLength(-1); + $this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -.$/+%'); + $this->setChecksum('code93'); + $this->useChecksum(false); + } + + /** + * Validates the checksum (Modulo CK) + * + * @param string $value The barcode to validate + * @return bool + */ + protected function code93($value) + { + $checksum = substr($value, -2, 2); + $value = str_split(substr($value, 0, -2)); + $count = 0; + $length = count($value) % 20; + foreach ($value as $char) { + if ($length == 0) { + $length = 20; + } + + $count += $this->check[$char] * $length; + --$length; + } + + $check = array_search(($count % 47), $this->check); + $value[] = $check; + $count = 0; + $length = count($value) % 15; + foreach ($value as $char) { + if ($length == 0) { + $length = 15; + } + + $count += $this->check[$char] * $length; + --$length; + } + $check .= array_search(($count % 47), $this->check); + + if ($check == $checksum) { + return true; + } + + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code93ext.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code93ext.php new file mode 100644 index 0000000000..aa8fc07b92 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Code93ext.php @@ -0,0 +1,23 @@ +setLength(-1); + $this->setCharacters(128); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean12.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean12.php new file mode 100644 index 0000000000..ee45ebb6ba --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean12.php @@ -0,0 +1,23 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean13.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean13.php new file mode 100644 index 0000000000..b1dc05e145 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean13.php @@ -0,0 +1,23 @@ +setLength(13); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean14.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean14.php new file mode 100644 index 0000000000..fe20366ac8 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean14.php @@ -0,0 +1,23 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean18.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean18.php new file mode 100644 index 0000000000..774df712ac --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean18.php @@ -0,0 +1,23 @@ +setLength(18); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean2.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean2.php new file mode 100644 index 0000000000..9d8a527a09 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean2.php @@ -0,0 +1,23 @@ +setLength(2); + $this->setCharacters('0123456789'); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean5.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean5.php new file mode 100644 index 0000000000..01f597d15e --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean5.php @@ -0,0 +1,25 @@ +setLength(5); + $this->setCharacters('0123456789'); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean8.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean8.php new file mode 100644 index 0000000000..6af4cccf9f --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Ean8.php @@ -0,0 +1,40 @@ +setLength(array(7, 8)); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } + + /** + * Overrides parent checkLength + * + * @param string $value Value + * @return bool + */ + public function hasValidLength($value) + { + if (strlen($value) == 7) { + $this->useChecksum(false); + } else { + $this->useChecksum(true); + } + + return parent::hasValidLength($value); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin12.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin12.php new file mode 100644 index 0000000000..b3c97d3df7 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin12.php @@ -0,0 +1,23 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin13.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin13.php new file mode 100644 index 0000000000..049849792e --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin13.php @@ -0,0 +1,23 @@ +setLength(13); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin14.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin14.php new file mode 100644 index 0000000000..70e3cc5b5c --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Gtin14.php @@ -0,0 +1,23 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Identcode.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Identcode.php new file mode 100644 index 0000000000..08c398dd6d --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Identcode.php @@ -0,0 +1,41 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('identcode'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Intelligentmail.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Intelligentmail.php new file mode 100644 index 0000000000..665d2035a4 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Intelligentmail.php @@ -0,0 +1,25 @@ +setLength(array(20, 25, 29, 31)); + $this->setCharacters('0123456789'); + $this->useChecksum(false); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Issn.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Issn.php new file mode 100644 index 0000000000..52434ed1ba --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Issn.php @@ -0,0 +1,90 @@ +setLength(array(8, 13)); + $this->setCharacters('0123456789X'); + $this->setChecksum('gtin'); + } + + /** + * Allows X on length of 8 chars + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if (strlen($value) != 8) { + if (strpos($value, 'X') !== false) { + return false; + } + } + + return parent::hasValidCharacters($value); + } + + /** + * Validates the checksum + * + * @param string $value The barcode to check the checksum for + * @return bool + */ + public function hasValidChecksum($value) + { + if (strlen($value) == 8) { + $this->setChecksum('issn'); + } else { + $this->setChecksum('gtin'); + } + + return parent::hasValidChecksum($value); + } + + /** + * Validates the checksum () + * ISSN implementation (reversed mod11) + * + * @param string $value The barcode to validate + * @return bool + */ + protected function issn($value) + { + $checksum = substr($value, -1, 1); + $values = str_split(substr($value, 0, -1)); + $check = 0; + $multi = 8; + foreach ($values as $token) { + if ($token == 'X') { + $token = 10; + } + + $check += ($token * $multi); + --$multi; + } + + $check %= 11; + $check = ($check === 0 ? 0 : (11 - $check)); + if ($check == $checksum) { + return true; + } elseif (($check == 10) && ($checksum == 'X')) { + return true; + } + + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Itf14.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Itf14.php new file mode 100644 index 0000000000..195d84dd2d --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Itf14.php @@ -0,0 +1,23 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Leitcode.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Leitcode.php new file mode 100644 index 0000000000..29503a92aa --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Leitcode.php @@ -0,0 +1,23 @@ +setLength(14); + $this->setCharacters('0123456789'); + $this->setChecksum('identcode'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Planet.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Planet.php new file mode 100644 index 0000000000..ecdff2db29 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Planet.php @@ -0,0 +1,23 @@ +setLength(array(12, 14)); + $this->setCharacters('0123456789'); + $this->setChecksum('postnet'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Postnet.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Postnet.php new file mode 100644 index 0000000000..acc84da599 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Postnet.php @@ -0,0 +1,23 @@ +setLength(array(6, 7, 10, 12)); + $this->setCharacters('0123456789'); + $this->setChecksum('postnet'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Royalmail.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Royalmail.php new file mode 100644 index 0000000000..538efa6106 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Royalmail.php @@ -0,0 +1,93 @@ + 1, '1' => 1, '2' => 1, '3' => 1, '4' => 1, '5' => 1, + '6' => 2, '7' => 2, '8' => 2, '9' => 2, 'A' => 2, 'B' => 2, + 'C' => 3, 'D' => 3, 'E' => 3, 'F' => 3, 'G' => 3, 'H' => 3, + 'I' => 4, 'J' => 4, 'K' => 4, 'L' => 4, 'M' => 4, 'N' => 4, + 'O' => 5, 'P' => 5, 'Q' => 5, 'R' => 5, 'S' => 5, 'T' => 5, + 'U' => 0, 'V' => 0, 'W' => 0, 'X' => 0, 'Y' => 0, 'Z' => 0, + ); + + protected $columns = array( + '0' => 1, '1' => 2, '2' => 3, '3' => 4, '4' => 5, '5' => 0, + '6' => 1, '7' => 2, '8' => 3, '9' => 4, 'A' => 5, 'B' => 0, + 'C' => 1, 'D' => 2, 'E' => 3, 'F' => 4, 'G' => 5, 'H' => 0, + 'I' => 1, 'J' => 2, 'K' => 3, 'L' => 4, 'M' => 5, 'N' => 0, + 'O' => 1, 'P' => 2, 'Q' => 3, 'R' => 4, 'S' => 5, 'T' => 0, + 'U' => 1, 'V' => 2, 'W' => 3, 'X' => 4, 'Y' => 5, 'Z' => 0, + ); + + /** + * Constructor for this barcode adapter + */ + public function __construct() + { + $this->setLength(-1); + $this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); + $this->setChecksum('royalmail'); + } + + /** + * Validates the checksum () + * + * @param string $value The barcode to validate + * @return bool + */ + protected function royalmail($value) + { + $checksum = substr($value, -1, 1); + $values = str_split(substr($value, 0, -1)); + $rowvalue = 0; + $colvalue = 0; + foreach ($values as $row) { + $rowvalue += $this->rows[$row]; + $colvalue += $this->columns[$row]; + } + + $rowvalue %= 6; + $colvalue %= 6; + + $rowchkvalue = array_keys($this->rows, $rowvalue); + $colchkvalue = array_keys($this->columns, $colvalue); + $intersect = array_intersect($rowchkvalue, $colchkvalue); + $chkvalue = current($intersect); + if ($chkvalue == $checksum) { + return true; + } + + return false; + } + + /** + * Allows start and stop tag within checked chars + * + * @param string $value The barcode to check for allowed characters + * @return bool + */ + public function hasValidCharacters($value) + { + if ($value[0] == '(') { + $value = substr($value, 1); + + if ($value[strlen($value) - 1] == ')') { + $value = substr($value, 0, -1); + } else { + return false; + } + } + + return parent::hasValidCharacters($value); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Sscc.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Sscc.php new file mode 100644 index 0000000000..d3b33637b8 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Sscc.php @@ -0,0 +1,23 @@ +setLength(18); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Upca.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Upca.php new file mode 100644 index 0000000000..4c5f623f14 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Upca.php @@ -0,0 +1,23 @@ +setLength(12); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Upce.php b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Upce.php new file mode 100644 index 0000000000..646c739a70 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Barcode/Upce.php @@ -0,0 +1,40 @@ +setLength(array(6, 7, 8)); + $this->setCharacters('0123456789'); + $this->setChecksum('gtin'); + } + + /** + * Overrides parent checkLength + * + * @param string $value Value + * @return bool + */ + public function hasValidLength($value) + { + if (strlen($value) != 8) { + $this->useChecksum(false); + } else { + $this->useChecksum(true); + } + + return parent::hasValidLength($value); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Between.php b/vendor/zendframework/zend-validator/Zend/Validator/Between.php new file mode 100644 index 0000000000..8b92cfe200 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Between.php @@ -0,0 +1,177 @@ + "The input is not between '%min%' and '%max%', inclusively", + self::NOT_BETWEEN_STRICT => "The input is not strictly between '%min%' and '%max%'" + ); + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = array( + 'min' => array('options' => 'min'), + 'max' => array('options' => 'max'), + ); + + /** + * Options for the between validator + * + * @var array + */ + protected $options = array( + 'inclusive' => true, // Whether to do inclusive comparisons, allowing equivalence to min and/or max + 'min' => 0, + 'max' => PHP_INT_MAX, + ); + + /** + * Sets validator options + * Accepts the following option keys: + * 'min' => scalar, minimum border + * 'max' => scalar, maximum border + * 'inclusive' => boolean, inclusive border values + * + * @param array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (!is_array($options)) { + $options = func_get_args(); + $temp['min'] = array_shift($options); + if (!empty($options)) { + $temp['max'] = array_shift($options); + } + + if (!empty($options)) { + $temp['inclusive'] = array_shift($options); + } + + $options = $temp; + } + + if (!array_key_exists('min', $options) || !array_key_exists('max', $options)) { +// throw new Exception\InvalidArgumentException("Missing option. 'min' and 'max' has to be given"); + } + + parent::__construct($options); + } + + /** + * Returns the min option + * + * @return mixed + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the min option + * + * @param mixed $min + * @return Between Provides a fluent interface + */ + public function setMin($min) + { + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the max option + * + * @return mixed + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the max option + * + * @param mixed $max + * @return Between Provides a fluent interface + */ + public function setMax($max) + { + $this->options['max'] = $max; + return $this; + } + + /** + * Returns the inclusive option + * + * @return bool + */ + public function getInclusive() + { + return $this->options['inclusive']; + } + + /** + * Sets the inclusive option + * + * @param bool $inclusive + * @return Between Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->options['inclusive'] = $inclusive; + return $this; + } + + /** + * Returns true if and only if $value is between min and max options, inclusively + * if inclusive option is true. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if ($this->getInclusive()) { + if ($this->getMin() > $value || $value > $this->getMax()) { + $this->error(self::NOT_BETWEEN); + return false; + } + } else { + if ($this->getMin() >= $value || $value >= $this->getMax()) { + $this->error(self::NOT_BETWEEN_STRICT); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Bitwise.php b/vendor/zendframework/zend-validator/Zend/Validator/Bitwise.php new file mode 100644 index 0000000000..8abbffb3d6 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Bitwise.php @@ -0,0 +1,192 @@ + "The input has no common bit set with '%control%'", + self::NOT_AND_STRICT => "The input doesn't have the same bits set as '%control%'", + self::NOT_XOR => "The input has common bit set with '%control%'", + ); + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = array( + 'control' => 'control', + ); + + /** + * @var integer + */ + protected $operator; + + /** + * @var boolean + */ + protected $strict = false; + + /** + * Sets validator options + * Accepts the following option keys: + * 'control' => integer + * 'operator' => + * 'strict' => boolean + * + * @param array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } + + if (!is_array($options)) { + $options = func_get_args(); + + $temp['control'] = array_shift($options); + + if (!empty($options)) { + $temp['operator'] = array_shift($options); + } + + if (!empty($options)) { + $temp['strict'] = array_shift($options); + } + + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Returns the control parameter. + * + * @return integer + */ + public function getControl() + { + return $this->control; + } + + /** + * Returns the operator parameter. + * + * @return string + */ + public function getOperator() + { + return $this->operator; + } + + /** + * Returns the strict parameter. + * + * @return boolean + */ + public function getStrict() + { + return $this->strict; + } + + /** + * Returns true if and only if $value is between min and max options, inclusively + * if inclusive option is true. + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if (self::OP_AND === $this->operator) { + if ($this->strict) { + // All the bits set in value must be set in control + $this->error(self::NOT_AND_STRICT); + + return (bool) (($this->control & $value) == $value); + } else { + // At least one of the bits must be common between value and control + $this->error(self::NOT_AND); + + return (bool) ($this->control & $value); + } + } elseif (self::OP_XOR === $this->operator) { + $this->error(self::NOT_XOR); + + return (bool) (($this->control ^ $value) === ($this->control | $value)); + } + + return false; + } + + /** + * Sets the control parameter. + * + * @param integer $control + * @return Bitwise + */ + public function setControl($control) + { + $this->control = (int) $control; + + return $this; + } + + /** + * Sets the operator parameter. + * + * @param string $operator + * @return Bitwise + */ + public function setOperator($operator) + { + $this->operator = $operator; + + return $this; + } + + /** + * Sets the strict parameter. + * + * @param boolean $strict + * @return Bitwise + */ + public function setStrict($strict) + { + $this->strict = (bool) $strict; + + return $this; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Callback.php b/vendor/zendframework/zend-validator/Zend/Validator/Callback.php new file mode 100644 index 0000000000..e4b389de76 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Callback.php @@ -0,0 +1,150 @@ + "The input is not valid", + self::INVALID_CALLBACK => "An exception has been raised within the callback", + ); + + /** + * Default options to set for the validator + * + * @var mixed + */ + protected $options = array( + 'callback' => null, // Callback in a call_user_func format, string || array + 'callbackOptions' => array(), // Options for the callback + ); + + /** + * Constructor + * + * @param array|callable $options + */ + public function __construct($options = null) + { + if (is_callable($options)) { + $options = array('callback' => $options); + } + + parent::__construct($options); + } + + /** + * Returns the set callback + * + * @return mixed + */ + public function getCallback() + { + return $this->options['callback']; + } + + /** + * Sets the callback + * + * @param string|array|callable $callback + * @return Callback Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setCallback($callback) + { + if (!is_callable($callback)) { + throw new Exception\InvalidArgumentException('Invalid callback given'); + } + + $this->options['callback'] = $callback; + return $this; + } + + /** + * Returns the set options for the callback + * + * @return mixed + */ + public function getCallbackOptions() + { + return $this->options['callbackOptions']; + } + + /** + * Sets options for the callback + * + * @param mixed $options + * @return Callback Provides a fluent interface + */ + public function setCallbackOptions($options) + { + $this->options['callbackOptions'] = (array) $options; + return $this; + } + + /** + * Returns true if and only if the set callback returns + * for the provided $value + * + * @param mixed $value + * @param mixed $context Additional context to provide to the callback + * @return bool + * @throws Exception\InvalidArgumentException + */ + public function isValid($value, $context = null) + { + $this->setValue($value); + + $options = $this->getCallbackOptions(); + $callback = $this->getCallback(); + if (empty($callback)) { + throw new Exception\InvalidArgumentException('No callback given'); + } + + $args = array($value); + if (empty($options) && !empty($context)) { + $args[] = $context; + } + if (!empty($options) && empty($context)) { + $args = array_merge($args, $options); + } + if (!empty($options) && !empty($context)) { + $args[] = $context; + $args = array_merge($args, $options); + } + + try { + if (!call_user_func_array($callback, $args)) { + $this->error(self::INVALID_VALUE); + return false; + } + } catch (\Exception $e) { + $this->error(self::INVALID_CALLBACK); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/CreditCard.php b/vendor/zendframework/zend-validator/Zend/Validator/CreditCard.php new file mode 100644 index 0000000000..e54a17c2e4 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/CreditCard.php @@ -0,0 +1,319 @@ + "The input seems to contain an invalid checksum", + self::CONTENT => "The input must contain only digits", + self::INVALID => "Invalid type given. String expected", + self::LENGTH => "The input contains an invalid amount of digits", + self::PREFIX => "The input is not from an allowed institute", + self::SERVICE => "The input seems to be an invalid credit card number", + self::SERVICEFAILURE => "An exception has been raised while validating the input", + ); + + /** + * List of CCV names + * + * @var array + */ + protected $cardName = array( + 0 => self::AMERICAN_EXPRESS, + 1 => self::DINERS_CLUB, + 2 => self::DINERS_CLUB_US, + 3 => self::DISCOVER, + 4 => self::JCB, + 5 => self::LASER, + 6 => self::MAESTRO, + 7 => self::MASTERCARD, + 8 => self::SOLO, + 9 => self::UNIONPAY, + 10 => self::VISA, + ); + + /** + * List of allowed CCV lengths + * + * @var array + */ + protected $cardLength = array( + self::AMERICAN_EXPRESS => array(15), + self::DINERS_CLUB => array(14), + self::DINERS_CLUB_US => array(16), + self::DISCOVER => array(16), + self::JCB => array(16), + self::LASER => array(16, 17, 18, 19), + self::MAESTRO => array(12, 13, 14, 15, 16, 17, 18, 19), + self::MASTERCARD => array(16), + self::SOLO => array(16, 18, 19), + self::UNIONPAY => array(16, 17, 18, 19), + self::VISA => array(16), + ); + + /** + * List of accepted CCV provider tags + * + * @var array + */ + protected $cardType = array( + self::AMERICAN_EXPRESS => array('34', '37'), + self::DINERS_CLUB => array('300', '301', '302', '303', '304', '305', '36'), + self::DINERS_CLUB_US => array('54', '55'), + self::DISCOVER => array('6011', '622126', '622127', '622128', '622129', '62213', + '62214', '62215', '62216', '62217', '62218', '62219', + '6222', '6223', '6224', '6225', '6226', '6227', '6228', + '62290', '62291', '622920', '622921', '622922', '622923', + '622924', '622925', '644', '645', '646', '647', '648', + '649', '65'), + self::JCB => array('3528', '3529', '353', '354', '355', '356', '357', '358'), + self::LASER => array('6304', '6706', '6771', '6709'), + self::MAESTRO => array('5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', + '6764', '6765', '6766'), + self::MASTERCARD => array('51', '52', '53', '54', '55'), + self::SOLO => array('6334', '6767'), + self::UNIONPAY => array('622126', '622127', '622128', '622129', '62213', '62214', + '62215', '62216', '62217', '62218', '62219', '6222', '6223', + '6224', '6225', '6226', '6227', '6228', '62290', '62291', + '622920', '622921', '622922', '622923', '622924', '622925'), + self::VISA => array('4'), + ); + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'service' => null, // Service callback for additional validation + 'type' => array(), // CCIs which are accepted by validation + ); + + /** + * Constructor + * + * @param string|array|Traversable $options OPTIONAL Type of CCI to allow + */ + public function __construct($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + $options = func_get_args(); + $temp['type'] = array_shift($options); + if (!empty($options)) { + $temp['service'] = array_shift($options); + } + + $options = $temp; + } + + if (!array_key_exists('type', $options)) { + $options['type'] = self::ALL; + } + + $this->setType($options['type']); + unset($options['type']); + + if (array_key_exists('service', $options)) { + $this->setService($options['service']); + unset($options['service']); + } + + parent::__construct($options); + } + + /** + * Returns a list of accepted CCIs + * + * @return array + */ + public function getType() + { + return $this->options['type']; + } + + /** + * Sets CCIs which are accepted by validation + * + * @param string|array $type Type to allow for validation + * @return CreditCard Provides a fluid interface + */ + public function setType($type) + { + $this->options['type'] = array(); + return $this->addType($type); + } + + /** + * Adds a CCI to be accepted by validation + * + * @param string|array $type Type to allow for validation + * @return CreditCard Provides a fluid interface + */ + public function addType($type) + { + if (is_string($type)) { + $type = array($type); + } + + foreach ($type as $typ) { + if (defined('self::' . strtoupper($typ)) && !in_array($typ, $this->options['type'])) { + $this->options['type'][] = $typ; + } + + if (($typ == self::ALL)) { + $this->options['type'] = array_keys($this->cardLength); + } + } + + return $this; + } + + /** + * Returns the actual set service + * + * @return callable + */ + public function getService() + { + return $this->options['service']; + } + + /** + * Sets a new callback for service validation + * + * @param callable $service + * @return CreditCard + * @throws Exception\InvalidArgumentException on invalid service callback + */ + public function setService($service) + { + if (!is_callable($service)) { + throw new Exception\InvalidArgumentException('Invalid callback given'); + } + + $this->options['service'] = $service; + return $this; + } + + /** + * Returns true if and only if $value follows the Luhn algorithm (mod-10 checksum) + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if (!is_string($value)) { + $this->error(self::INVALID, $value); + return false; + } + + if (!ctype_digit($value)) { + $this->error(self::CONTENT, $value); + return false; + } + + $length = strlen($value); + $types = $this->getType(); + $foundp = false; + $foundl = false; + foreach ($types as $type) { + foreach ($this->cardType[$type] as $prefix) { + if (substr($value, 0, strlen($prefix)) == $prefix) { + $foundp = true; + if (in_array($length, $this->cardLength[$type])) { + $foundl = true; + break 2; + } + } + } + } + + if ($foundp == false) { + $this->error(self::PREFIX, $value); + return false; + } + + if ($foundl == false) { + $this->error(self::LENGTH, $value); + return false; + } + + $sum = 0; + $weight = 2; + + for ($i = $length - 2; $i >= 0; $i--) { + $digit = $weight * $value[$i]; + $sum += floor($digit / 10) + $digit % 10; + $weight = $weight % 2 + 1; + } + + if ((10 - $sum % 10) % 10 != $value[$length - 1]) { + $this->error(self::CHECKSUM, $value); + return false; + } + + $service = $this->getService(); + if (!empty($service)) { + try { + $callback = new Callback($service); + $callback->setOptions($this->getType()); + if (!$callback->isValid($value)) { + $this->error(self::SERVICE, $value); + return false; + } + } catch (\Exception $e) { + $this->error(self::SERVICEFAILURE, $value); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Csrf.php b/vendor/zendframework/zend-validator/Zend/Validator/Csrf.php new file mode 100644 index 0000000000..6272c0be77 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Csrf.php @@ -0,0 +1,371 @@ + "The form submitted did not originate from the expected site", + ); + + /** + * Actual hash used. + * + * @var mixed + */ + protected $hash; + + /** + * Static cache of the session names to generated hashes + * @todo unused, left here to avoid BC breaks + * + * @var array + */ + protected static $hashCache; + + /** + * Name of CSRF element (used to create non-colliding hashes) + * + * @var string + */ + protected $name = 'csrf'; + + /** + * Salt for CSRF token + * @var string + */ + protected $salt = 'salt'; + + /** + * @var SessionContainer + */ + protected $session; + + /** + * TTL for CSRF token + * @var int|null + */ + protected $timeout = 300; + + /** + * Constructor + * + * @param array|Traversable $options + */ + public function __construct($options = array()) + { + parent::__construct($options); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (!is_array($options)) { + $options = (array) $options; + } + + foreach ($options as $key => $value) { + switch (strtolower($key)) { + case 'name': + $this->setName($value); + break; + case 'salt': + $this->setSalt($value); + break; + case 'session': + $this->setSession($value); + break; + case 'timeout': + $this->setTimeout($value); + break; + default: + // ignore unknown options + break; + } + } + } + + /** + * Does the provided token match the one generated? + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + $this->setValue((string) $value); + + $tokenId = $this->getTokenIdFromHash($value); + $hash = $this->getValidationToken($tokenId); + + if ($this->getTokenFromHash($value) !== $this->getTokenFromHash($hash)) { + $this->error(self::NOT_SAME); + return false; + } + + return true; + } + + /** + * Set CSRF name + * + * @param string $name + * @return Csrf + */ + public function setName($name) + { + $this->name = (string) $name; + return $this; + } + + /** + * Get CSRF name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set session container + * + * @param SessionContainer $session + * @return Csrf + */ + public function setSession(SessionContainer $session) + { + $this->session = $session; + if ($this->hash) { + $this->initCsrfToken(); + } + return $this; + } + + /** + * Get session container + * + * Instantiate session container if none currently exists + * + * @return SessionContainer + */ + public function getSession() + { + if (null === $this->session) { + // Using fully qualified name, to ensure polyfill class alias is used + $this->session = new SessionContainer($this->getSessionName()); + } + return $this->session; + } + + /** + * Salt for CSRF token + * + * @param string $salt + * @return Csrf + */ + public function setSalt($salt) + { + $this->salt = (string) $salt; + return $this; + } + + /** + * Retrieve salt for CSRF token + * + * @return string + */ + public function getSalt() + { + return $this->salt; + } + + /** + * Retrieve CSRF token + * + * If no CSRF token currently exists, or should be regenerated, + * generates one. + * + * @param bool $regenerate default false + * @return string + */ + public function getHash($regenerate = false) + { + if ((null === $this->hash) || $regenerate) { + $this->generateHash(); + } + return $this->hash; + } + + /** + * Get session namespace for CSRF token + * + * Generates a session namespace based on salt, element name, and class. + * + * @return string + */ + public function getSessionName() + { + return str_replace('\\', '_', __CLASS__) . '_' + . $this->getSalt() . '_' + . strtr($this->getName(), array('[' => '_', ']' => '')); + } + + /** + * Set timeout for CSRF session token + * + * @param int|null $ttl + * @return Csrf + */ + public function setTimeout($ttl) + { + $this->timeout = ($ttl !== null) ? (int) $ttl : null; + return $this; + } + + /** + * Get CSRF session token timeout + * + * @return int + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * Initialize CSRF token in session + * + * @return void + */ + protected function initCsrfToken() + { + $session = $this->getSession(); + $timeout = $this->getTimeout(); + if (null !== $timeout) { + $session->setExpirationSeconds($timeout); + } + + $hash = $this->getHash(); + $token = $this->getTokenFromHash($hash); + $tokenId = $this->getTokenIdFromHash($hash); + + if (! $session->tokenList) { + $session->tokenList = array(); + } + $session->tokenList[$tokenId] = $token; + $session->hash = $hash; // @todo remove this, left for BC + } + + /** + * Generate CSRF token + * + * Generates CSRF token and stores both in {@link $hash} and element + * value. + * + * @return void + */ + protected function generateHash() + { + $token = md5($this->getSalt() . Rand::getBytes(32) . $this->getName()); + + $this->hash = $this->formatHash($token, $this->generateTokenId()); + + $this->setValue($this->hash); + $this->initCsrfToken(); + } + + /** + * @return string + */ + protected function generateTokenId() + { + return md5(Rand::getBytes(32)); + } + + /** + * Get validation token + * + * Retrieve token from session, if it exists. + * + * @param string $tokenId + * @return null|string + */ + protected function getValidationToken($tokenId = null) + { + $session = $this->getSession(); + + /** + * if no tokenId is passed we revert to the old behaviour + * @todo remove, here for BC + */ + if (! $tokenId && isset($session->hash)) { + return $session->hash; + } + + if ($tokenId && isset($session->tokenList[$tokenId])) { + return $this->formatHash($session->tokenList[$tokenId], $tokenId); + } + + return null; + } + + /** + * @param $token + * @param $tokenId + * @return string + */ + protected function formatHash($token, $tokenId) + { + return sprintf('%s-%s', $token, $tokenId); + } + + /** + * @param $hash + * @return string + */ + protected function getTokenFromHash($hash) + { + $data = explode('-', $hash); + return $data[0] ?: null; + } + + /** + * @param $hash + * @return string + */ + protected function getTokenIdFromHash($hash) + { + $data = explode('-', $hash); + + if (! isset($data[1])) { + return null; + } + + return $data[1]; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Date.php b/vendor/zendframework/zend-validator/Zend/Validator/Date.php new file mode 100644 index 0000000000..044a6ce34d --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Date.php @@ -0,0 +1,193 @@ + "Invalid type given. String, integer, array or DateTime expected", + self::INVALID_DATE => "The input does not appear to be a valid date", + self::FALSEFORMAT => "The input does not fit the date format '%format%'", + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'format' => 'format', + ); + + /** + * @var string + */ + protected $format = self::FORMAT_DEFAULT; + + + /** + * Sets validator options + * + * @param string|array|Traversable $options OPTIONAL + */ + public function __construct($options = array()) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } elseif (!is_array($options)) { + $options = func_get_args(); + $temp['format'] = array_shift($options); + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Returns the format option + * + * @return string|null + */ + public function getFormat() + { + return $this->format; + } + + /** + * Sets the format option + * + * Format cannot be null. It will always default to 'Y-m-d', even + * if null is provided. + * + * @param string $format + * @return Date provides a fluent interface + * @todo validate the format + */ + public function setFormat($format = self::FORMAT_DEFAULT) + { + $this->format = (empty($format)) ? self::FORMAT_DEFAULT : $format; + return $this; + } + + /** + * Returns true if $value is a DateTime instance or can be converted into one. + * + * @param string|array|int|DateTime $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if (!$this->convertToDateTime($value)) { + $this->error(self::INVALID_DATE); + return false; + } + + return true; + } + + /** + * Attempts to convert an int, string, or array to a DateTime object + * + * @param string|int|array $param + * @param bool $addErrors + * @return bool|DateTime + */ + protected function convertToDateTime($param, $addErrors = true) + { + if ($param instanceof DateTime) { + return $param; + } + + $type = gettype($param); + if (!in_array($type, array('string', 'integer', 'array'))) { + if ($addErrors) { + $this->error(self::INVALID); + } + return false; + } + + $convertMethod = 'convert' . ucfirst($type); + return $this->{$convertMethod}($param, $addErrors); + } + + /** + * Attempts to convert an integer into a DateTime object + * + * @param integer $value + * @return bool|DateTime + */ + protected function convertInteger($value) + { + return date_create("@$value"); + } + + /** + * Attempts to convert a string into a DateTime object + * + * @param string $value + * @param bool $addErrors + * @return bool|DateTime + */ + protected function convertString($value, $addErrors = true) + { + $date = DateTime::createFromFormat($this->format, $value); + + // Invalid dates can show up as warnings (ie. "2007-02-99") + // and still return a DateTime object. + $errors = DateTime::getLastErrors(); + if ($errors['warning_count'] > 0) { + if ($addErrors) { + $this->error(self::FALSEFORMAT); + } + return false; + } + + return $date; + } + + /** + * Implodes the array into a string and proxies to {@link convertString()}. + * + * @param array $value + * @param bool $addErrors + * @return bool|DateTime + * @todo enhance the implosion + */ + protected function convertArray(array $value, $addErrors = true) + { + return $this->convertString(implode('-', $value), $addErrors); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/DateStep.php b/vendor/zendframework/zend-validator/Zend/Validator/DateStep.php new file mode 100644 index 0000000000..701be0bd16 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/DateStep.php @@ -0,0 +1,345 @@ + "Invalid type given. String, integer, array or DateTime expected", + self::INVALID_DATE => "The input does not appear to be a valid date", + self::FALSEFORMAT => "The input does not fit the date format '%format%'", + self::NOT_STEP => "The input is not a valid step", + ); + + /** + * Optional base date value + * + * @var string|int|\DateTime + */ + protected $baseValue = '1970-01-01T00:00:00Z'; + + /** + * Date step interval (defaults to 1 day). + * Uses the DateInterval specification. + * + * @var DateInterval + */ + protected $step; + + /** + * Optional timezone to be used when the baseValue + * and validation values do not contain timezone info + * + * @var DateTimeZone + */ + protected $timezone; + + /** + * Set default options for this instance + * + * @param array $options + */ + public function __construct($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + $options = func_get_args(); + $temp['baseValue'] = array_shift($options); + if (!empty($options)) { + $temp['step'] = array_shift($options); + } + if (!empty($options)) { + $temp['format'] = array_shift($options); + } + if (!empty($options)) { + $temp['timezone'] = array_shift($options); + } + + $options = $temp; + } + + if (!isset($options['step'])) { + $options['step'] = new DateInterval('P1D'); + } + if (!isset($options['timezone'])) { + $options['timezone'] = new DateTimeZone(date_default_timezone_get()); + } + + parent::__construct($options); + } + + /** + * Sets the base value from which the step should be computed + * + * @param string|int|\DateTime $baseValue + * @return DateStep + */ + public function setBaseValue($baseValue) + { + $this->baseValue = $baseValue; + return $this; + } + + /** + * Returns the base value from which the step should be computed + * + * @return string|int|\DateTime + */ + public function getBaseValue() + { + return $this->baseValue; + } + + /** + * Sets the step date interval + * + * @param DateInterval $step + * @return DateStep + */ + public function setStep(DateInterval $step) + { + $this->step = $step; + return $this; + } + + /** + * Returns the step date interval + * + * @return DateInterval + */ + public function getStep() + { + return $this->step; + } + + /** + * Returns the timezone option + * + * @return DateTimeZone + */ + public function getTimezone() + { + return $this->timezone; + } + + /** + * Sets the timezone option + * + * @param DateTimeZone $timezone + * @return DateStep + */ + public function setTimezone(DateTimeZone $timezone) + { + $this->timezone = $timezone; + return $this; + } + + /** + * Supports formats with ISO week (W) definitions + * + * @see Date::convertString() + */ + protected function convertString($value, $addErrors = true) + { + // Custom week format support + if (strpos($this->format, 'Y-\WW') === 0 + && preg_match('/^([0-9]{4})\-W([0-9]{2})/', $value, $matches) + ) { + $date = new DateTime; + $date->setISODate($matches[1], $matches[2]); + } else { + $date = DateTime::createFromFormat($this->format, $value, $this->timezone); + } + + // Invalid dates can show up as warnings (ie. "2007-02-99") + // and still return a DateTime object. + $errors = DateTime::getLastErrors(); + if ($errors['warning_count'] > 0) { + if ($addErrors) { + $this->error(self::FALSEFORMAT); + } + return false; + } + + return $date; + } + + /** + * Returns true if a date is within a valid step + * + * @param string|int|\DateTime $value + * @return bool + * @throws Exception\InvalidArgumentException + */ + public function isValid($value) + { + if (!parent::isValid($value)) { + return false; + } + + $valueDate = $this->convertToDateTime($value, false); // avoid duplicate errors + $baseDate = $this->convertToDateTime($this->baseValue, false); + $step = $this->getStep(); + + // Same date? + if ($valueDate == $baseDate) { + return true; + } + + // Optimization for simple intervals. + // Handle intervals of just one date or time unit. + $intervalParts = explode('|', $step->format('%y|%m|%d|%h|%i|%s')); + $partCounts = array_count_values($intervalParts); + if (5 === $partCounts["0"]) { + // Find the unit with the non-zero interval + $unitKeys = array('years', 'months', 'days', 'hours', 'minutes', 'seconds'); + $intervalParts = array_combine($unitKeys, $intervalParts); + + $intervalUnit = null; + $stepValue = null; + foreach ($intervalParts as $key => $value) { + if (0 != $value) { + $intervalUnit = $key; + $stepValue = (int) $value; + break; + } + } + + // Get absolute time difference + $timeDiff = $valueDate->diff($baseDate, true); + $diffParts = explode('|', $timeDiff->format('%y|%m|%d|%h|%i|%s')); + $diffParts = array_combine($unitKeys, $diffParts); + + // Check date units + if (in_array($intervalUnit, array('years', 'months', 'days'))) { + switch ($intervalUnit) { + case 'years': + if ( 0 == $diffParts['months'] && 0 == $diffParts['days'] + && 0 == $diffParts['hours'] && 0 == $diffParts['minutes'] + && 0 == $diffParts['seconds'] + ) { + if (($diffParts['years'] % $stepValue) === 0) { + return true; + } + } + break; + case 'months': + if ( 0 == $diffParts['days'] && 0 == $diffParts['hours'] + && 0 == $diffParts['minutes'] && 0 == $diffParts['seconds'] + ) { + $months = ($diffParts['years'] * 12) + $diffParts['months']; + if (($months % $stepValue) === 0) { + return true; + } + } + break; + case 'days': + if ( 0 == $diffParts['hours'] && 0 == $diffParts['minutes'] + && 0 == $diffParts['seconds'] + ) { + $days = $timeDiff->format('%a'); // Total days + if (($days % $stepValue) === 0) { + return true; + } + } + break; + } + $this->error(self::NOT_STEP); + return false; + } + + // Check time units + if (in_array($intervalUnit, array('hours', 'minutes', 'seconds'))) { + + // Simple test if $stepValue is 1. + if (1 == $stepValue) { + if ('hours' === $intervalUnit + && 0 == $diffParts['minutes'] && 0 == $diffParts['seconds'] + ) { + return true; + } elseif ('minutes' === $intervalUnit && 0 == $diffParts['seconds']) { + return true; + } elseif ('seconds' === $intervalUnit) { + return true; + } + } + + // Simple test for same day, when using default baseDate + if ($baseDate->format('Y-m-d') == $valueDate->format('Y-m-d') + && $baseDate->format('Y-m-d') == '1970-01-01' + ) { + switch ($intervalUnit) { + case 'hours': + if (0 == $diffParts['minutes'] && 0 == $diffParts['seconds']) { + if (($diffParts['hours'] % $stepValue) === 0) { + return true; + } + } + break; + case 'minutes': + if (0 == $diffParts['seconds']) { + $minutes = ($diffParts['hours'] * 60) + $diffParts['minutes']; + if (($minutes % $stepValue) === 0) { + return true; + } + } + break; + case 'seconds': + $seconds = ($diffParts['hours'] * 60) + + ($diffParts['minutes'] * 60) + + $diffParts['seconds']; + if (($seconds % $stepValue) === 0) { + return true; + } + break; + } + $this->error(self::NOT_STEP); + return false; + } + } + } + + // Fall back to slower (but accurate) method for complex intervals. + // Keep adding steps to the base date until a match is found + // or until the value is exceeded. + if ($baseDate < $valueDate) { + while ($baseDate < $valueDate) { + $baseDate->add($step); + if ($baseDate == $valueDate) { + return true; + } + } + } else { + while ($baseDate > $valueDate) { + $baseDate->sub($step); + if ($baseDate == $valueDate) { + return true; + } + } + } + + $this->error(self::NOT_STEP); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Db/AbstractDb.php b/vendor/zendframework/zend-validator/Zend/Validator/Db/AbstractDb.php new file mode 100644 index 0000000000..6270fc6ab0 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Db/AbstractDb.php @@ -0,0 +1,326 @@ + "No record matching the input was found", + self::ERROR_RECORD_FOUND => "A record matching the input was found", + ); + + /** + * Select object to use. can be set, or will be auto-generated + * + * @var Select + */ + protected $select; + + /** + * @var string + */ + protected $schema = null; + + /** + * @var string + */ + protected $table = ''; + + /** + * @var string + */ + protected $field = ''; + + /** + * @var mixed + */ + protected $exclude = null; + + /** + * Database adapter to use. If null isValid() will throw an exception + * + * @var \Zend\Db\Adapter\Adapter + */ + protected $adapter = null; + + /** + * Provides basic configuration for use with Zend\Validator\Db Validators + * Setting $exclude allows a single record to be excluded from matching. + * Exclude can either be a String containing a where clause, or an array with `field` and `value` keys + * to define the where clause added to the sql. + * A database adapter may optionally be supplied to avoid using the registered default adapter. + * + * The following option keys are supported: + * 'table' => The database table to validate against + * 'schema' => The schema keys + * 'field' => The field to check for a match + * 'exclude' => An optional where clause or field/value pair to exclude from the query + * 'adapter' => An optional database adapter to use + * + * @param array|Traversable|Select $options Options to use for this validator + * @throws \Zend\Validator\Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + parent::__construct($options); + + if ($options instanceof Select) { + $this->setSelect($options); + return; + } + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (func_num_args() > 1) { + $options = func_get_args(); + $firstArgument = array_shift($options); + if (is_array($firstArgument)) { + $temp = ArrayUtils::iteratorToArray($firstArgument); + } else { + $temp['table'] = $firstArgument; + } + + $temp['field'] = array_shift($options); + + if (!empty($options)) { + $temp['exclude'] = array_shift($options); + } + + if (!empty($options)) { + $temp['adapter'] = array_shift($options); + } + + $options = $temp; + } + + if (!array_key_exists('table', $options) && !array_key_exists('schema', $options)) { + throw new Exception\InvalidArgumentException('Table or Schema option missing!'); + } + + if (!array_key_exists('field', $options)) { + throw new Exception\InvalidArgumentException('Field option missing!'); + } + + if (array_key_exists('adapter', $options)) { + $this->setAdapter($options['adapter']); + } + + if (array_key_exists('exclude', $options)) { + $this->setExclude($options['exclude']); + } + + $this->setField($options['field']); + if (array_key_exists('table', $options)) { + $this->setTable($options['table']); + } + + if (array_key_exists('schema', $options)) { + $this->setSchema($options['schema']); + } + } + + /** + * Returns the set adapter + * + * @throws \Zend\Validator\Exception\RuntimeException When no database adapter is defined + * @return DbAdapter + */ + public function getAdapter() + { + return $this->adapter; + } + + /** + * Sets a new database adapter + * + * @param DbAdapter $adapter + * @return self Provides a fluent interface + */ + public function setAdapter(DbAdapter $adapter) + { + $this->adapter = $adapter; + return $this; + } + + /** + * Returns the set exclude clause + * + * @return string|array + */ + public function getExclude() + { + return $this->exclude; + } + + /** + * Sets a new exclude clause + * + * @param string|array $exclude + * @return self Provides a fluent interface + */ + public function setExclude($exclude) + { + $this->exclude = $exclude; + return $this; + } + + /** + * Returns the set field + * + * @return string|array + */ + public function getField() + { + return $this->field; + } + + /** + * Sets a new field + * + * @param string $field + * @return AbstractDb + */ + public function setField($field) + { + $this->field = (string) $field; + return $this; + } + + /** + * Returns the set table + * + * @return string + */ + public function getTable() + { + return $this->table; + } + + /** + * Sets a new table + * + * @param string $table + * @return self Provides a fluent interface + */ + public function setTable($table) + { + $this->table = (string) $table; + return $this; + } + + /** + * Returns the set schema + * + * @return string + */ + public function getSchema() + { + return $this->schema; + } + + /** + * Sets a new schema + * + * @param string $schema + * @return self Provides a fluent interface + */ + public function setSchema($schema) + { + $this->schema = $schema; + return $this; + } + + /** + * Sets the select object to be used by the validator + * + * @param Select $select + * @return self Provides a fluent interface + */ + public function setSelect(Select $select) + { + $this->select = $select; + return $this; + } + + /** + * Gets the select object to be used by the validator. + * If no select object was supplied to the constructor, + * then it will auto-generate one from the given table, + * schema, field, and adapter options. + * + * @return Select The Select object which will be used + */ + public function getSelect() + { + if ($this->select instanceof Select) { + return $this->select; + } + + // Build select object + $select = new Select(); + $tableIdentifier = new TableIdentifier($this->table, $this->schema); + $select->from($tableIdentifier)->columns(array($this->field)); + $select->where->equalTo($this->field, null); + + if ($this->exclude !== null) { + if (is_array($this->exclude)) { + $select->where->notEqualTo( + $this->exclude['field'], + $this->exclude['value'] + ); + } else { + $select->where($this->exclude); + } + } + + $this->select = $select; + + return $this->select; + } + + /** + * Run query and returns matches, or null if no matches are found. + * + * @param string $value + * @return array when matches are found. + */ + protected function query($value) + { + $sql = new Sql($this->getAdapter()); + $select = $this->getSelect(); + $statement = $sql->prepareStatementForSqlObject($select); + $parameters = $statement->getParameterContainer(); + $parameters['where1'] = $value; + $result = $statement->execute(); + + return $result->current(); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Db/NoRecordExists.php b/vendor/zendframework/zend-validator/Zend/Validator/Db/NoRecordExists.php new file mode 100644 index 0000000000..8a5dd727fb --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Db/NoRecordExists.php @@ -0,0 +1,39 @@ +adapter) { + throw new Exception\RuntimeException('No database adapter present'); + } + + $valid = true; + $this->setValue($value); + + $result = $this->query($value); + if ($result) { + $valid = false; + $this->error(self::ERROR_RECORD_FOUND); + } + + return $valid; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Db/RecordExists.php b/vendor/zendframework/zend-validator/Zend/Validator/Db/RecordExists.php new file mode 100644 index 0000000000..dfae6b2d16 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Db/RecordExists.php @@ -0,0 +1,39 @@ +adapter) { + throw new Exception\RuntimeException('No database adapter present'); + } + + $valid = true; + $this->setValue($value); + + $result = $this->query($value); + if (!$result) { + $valid = false; + $this->error(self::ERROR_NO_RECORD_FOUND); + } + + return $valid; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Digits.php b/vendor/zendframework/zend-validator/Zend/Validator/Digits.php new file mode 100644 index 0000000000..a4afe833fc --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Digits.php @@ -0,0 +1,69 @@ + "The input must contain only digits", + self::STRING_EMPTY => "The input is an empty string", + self::INVALID => "Invalid type given. String, integer or float expected", + ); + + /** + * Returns true if and only if $value only contains digit characters + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue((string) $value); + + if ('' === $this->getValue()) { + $this->error(self::STRING_EMPTY); + return false; + } + + if (null === static::$filter) { + static::$filter = new DigitsFilter(); + } + + if ($this->getValue() !== static::$filter->filter($this->getValue())) { + $this->error(self::NOT_DIGITS); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/EmailAddress.php b/vendor/zendframework/zend-validator/Zend/Validator/EmailAddress.php new file mode 100644 index 0000000000..5fa52bc02d --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/EmailAddress.php @@ -0,0 +1,520 @@ + "Invalid type given. String expected", + self::INVALID_FORMAT => "The input is not a valid email address. Use the basic format local-part@hostname", + self::INVALID_HOSTNAME => "'%hostname%' is not a valid hostname for the email address", + self::INVALID_MX_RECORD => "'%hostname%' does not appear to have any valid MX or A records for the email address", + self::INVALID_SEGMENT => "'%hostname%' is not in a routable network segment. The email address should not be resolved from public network", + self::DOT_ATOM => "'%localPart%' can not be matched against dot-atom format", + self::QUOTED_STRING => "'%localPart%' can not be matched against quoted-string format", + self::INVALID_LOCAL_PART => "'%localPart%' is not a valid local part for the email address", + self::LENGTH_EXCEEDED => "The input exceeds the allowed length", + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'hostname' => 'hostname', + 'localPart' => 'localPart' + ); + + /** + * @var string + */ + protected $hostname; + + /** + * @var string + */ + protected $localPart; + + /** + * Returns the found mx record informations + * + * @var array + */ + protected $mxRecord; + + /** + * Internal options array + */ + protected $options = array( + 'useMxCheck' => false, + 'useDeepMxCheck' => false, + 'useDomainCheck' => true, + 'allow' => Hostname::ALLOW_DNS, + 'hostnameValidator' => null, + ); + + /** + * Instantiates hostname validator for local use + * + * The following additional option keys are supported: + * 'hostnameValidator' => A hostname validator, see Zend\Validator\Hostname + * 'allow' => Options for the hostname validator, see Zend\Validator\Hostname::ALLOW_* + * 'useMxCheck' => If MX check should be enabled, boolean + * 'useDeepMxCheck' => If a deep MX check should be done, boolean + * + * @param array|\Traversable $options OPTIONAL + */ + public function __construct($options = array()) + { + if (!is_array($options)) { + $options = func_get_args(); + $temp['allow'] = array_shift($options); + if (!empty($options)) { + $temp['useMxCheck'] = array_shift($options); + } + + if (!empty($options)) { + $temp['hostnameValidator'] = array_shift($options); + } + + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Sets the validation failure message template for a particular key + * Adds the ability to set messages to the attached hostname validator + * + * @param string $messageString + * @param string $messageKey OPTIONAL + * @return AbstractValidator Provides a fluent interface + */ + public function setMessage($messageString, $messageKey = null) + { + if ($messageKey === null) { + $this->getHostnameValidator()->setMessage($messageString); + parent::setMessage($messageString); + return $this; + } + + if (!isset($this->messageTemplates[$messageKey])) { + $this->getHostnameValidator()->setMessage($messageString, $messageKey); + } else { + parent::setMessage($messageString, $messageKey); + } + + return $this; + } + + /** + * Returns the set hostname validator + * + * If was not previously set then lazy load a new one + * + * @return Hostname + */ + public function getHostnameValidator() + { + if (!isset($this->options['hostnameValidator'])) { + $this->options['hostnameValidator'] = new Hostname($this->getAllow()); + } + + return $this->options['hostnameValidator']; + } + + /** + * @param Hostname $hostnameValidator OPTIONAL + * @return EmailAddress Provides a fluent interface + */ + public function setHostnameValidator(Hostname $hostnameValidator = null) + { + $this->options['hostnameValidator'] = $hostnameValidator; + + return $this; + } + + /** + * Returns the allow option of the attached hostname validator + * + * @return int + */ + public function getAllow() + { + return $this->options['allow']; + } + + /** + * Sets the allow option of the hostname validator to use + * + * @param int $allow + * @return EmailAddress Provides a fluent interface + */ + public function setAllow($allow) + { + $this->options['allow'] = $allow; + if (isset($this->options['hostnameValidator'])) { + $this->options['hostnameValidator']->setAllow($allow); + } + + return $this; + } + + /** + * Whether MX checking via getmxrr is supported or not + * + * @return bool + */ + public function isMxSupported() + { + return function_exists('getmxrr'); + } + + /** + * Returns the set validateMx option + * + * @return bool + */ + public function getMxCheck() + { + return $this->options['useMxCheck']; + } + + /** + * Set whether we check for a valid MX record via DNS + * + * This only applies when DNS hostnames are validated + * + * @param bool $mx Set allowed to true to validate for MX records, and false to not validate them + * @return EmailAddress Fluid Interface + */ + public function useMxCheck($mx) + { + $this->options['useMxCheck'] = (bool) $mx; + return $this; + } + + /** + * Returns the set deepMxCheck option + * + * @return bool + */ + public function getDeepMxCheck() + { + return $this->options['useDeepMxCheck']; + } + + /** + * Use deep validation for MX records + * + * @param bool $deep Set deep to true to perform a deep validation process for MX records + * @return EmailAddress Fluid Interface + */ + public function useDeepMxCheck($deep) + { + $this->options['useDeepMxCheck'] = (bool) $deep; + return $this; + } + + /** + * Returns the set domainCheck option + * + * @return bool + */ + public function getDomainCheck() + { + return $this->options['useDomainCheck']; + } + + /** + * Sets if the domain should also be checked + * or only the local part of the email address + * + * @param bool $domain + * @return EmailAddress Fluid Interface + */ + public function useDomainCheck($domain = true) + { + $this->options['useDomainCheck'] = (bool) $domain; + return $this; + } + + /** + * Returns if the given host is reserved + * + * The following addresses are seen as reserved + * '0.0.0.0/8', '10.0.0.0/8', '127.0.0.0/8' + * '100.64.0.0/10' + * '172.16.0.0/12' + * '198.18.0.0/15' + * '169.254.0.0/16', '192.168.0.0/16' + * '192.0.2.0/24', '192.88.99.0/24', '198.51.100.0/24', '203.0.113.0/24' + * '224.0.0.0/4', '240.0.0.0/4' + * @see http://en.wikipedia.org/wiki/Reserved_IP_addresses + * + * As of RFC5753 (JAN 2010), the following blocks are no longer reserved: + * - 128.0.0.0/16 + * - 191.255.0.0/16 + * - 223.255.255.0/24 + * @see http://tools.ietf.org/html/rfc5735#page-6 + * + * As of RFC6598 (APR 2012), the following blocks are now reserved: + * - 100.64.0.0/10 + * @see http://tools.ietf.org/html/rfc6598#section-7 + * + * @param string $host + * @return bool Returns false when minimal one of the given addresses is not reserved + */ + protected function isReserved($host) + { + if (!preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $host)) { + $host = gethostbynamel($host); + } else { + $host = array($host); + } + + if (empty($host)) { + return false; + } + + foreach ($host as $server) { + // Search for 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8 + if (!preg_match('/^(0|10|127)(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){3}$/', $server) && + // Search for 100.64.0.0/10 + !preg_match('/^100\.(6[0-4]|[7-9][0-9]|1[0-1][0-9]|12[0-7])(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) && + // Search for 172.16.0.0/12 + !preg_match('/^172\.(1[6-9]|2[0-9]|3[0-1])(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) && + // Search for 198.18.0.0/15 + !preg_match('/^198\.(1[8-9])(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) && + // Search for 169.254.0.0/16, 192.168.0.0/16 + !preg_match('/^(169\.254|192\.168)(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){2}$/', $server) && + // Search for 192.0.2.0/24, 192.88.99.0/24, 198.51.100.0/24, 203.0.113.0/24 + !preg_match('/^(192\.0\.2|192\.88\.99|198\.51\.100|203\.0\.113)\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$/', $server) && + // Search for 224.0.0.0/4, 240.0.0.0/4 + !preg_match('/^(2(2[4-9]|[3-4][0-9]|5[0-5]))(\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))){3}$/', $server) + ) { + return false; + } + } + + return true; + } + + /** + * Internal method to validate the local part of the email address + * + * @return bool + */ + protected function validateLocalPart() + { + // First try to match the local part on the common dot-atom format + $result = false; + + // Dot-atom characters are: 1*atext *("." 1*atext) + // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*", + // "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~" + $atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d\x7e'; + if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->localPart)) { + $result = true; + } else { + // Try quoted string format (RFC 5321 Chapter 4.1.2) + + // Quoted-string characters are: DQUOTE *(qtext/quoted-pair) DQUOTE + $qtext = '\x20-\x21\x23-\x5b\x5d-\x7e'; // %d32-33 / %d35-91 / %d93-126 + $quotedPair = '\x20-\x7e'; // %d92 %d32-126 + if (preg_match('/^"(['. $qtext .']|\x5c[' . $quotedPair . '])*"$/', $this->localPart)) { + $result = true; + } else { + $this->error(self::DOT_ATOM); + $this->error(self::QUOTED_STRING); + $this->error(self::INVALID_LOCAL_PART); + } + } + + return $result; + } + + /** + * Returns the found MX Record information after validation including weight for further processing + * + * @return array + */ + public function getMXRecord() + { + return $this->mxRecord; + } + + /** + * Internal method to validate the servers MX records + * + * @return bool + */ + protected function validateMXRecords() + { + $mxHosts = array(); + $weight = array(); + $result = getmxrr($this->hostname, $mxHosts, $weight); + if (!empty($mxHosts) && !empty($weight)) { + $this->mxRecord = array_combine($mxHosts, $weight); + } else { + $this->mxRecord = $mxHosts; + } + + arsort($this->mxRecord); + + // Fallback to IPv4 hosts if no MX record found (RFC 2821 SS 5). + if (!$result) { + $result = gethostbynamel($this->hostname); + if (is_array($result)) { + $this->mxRecord = array_flip($result); + } + } + + if (!$result) { + $this->error(self::INVALID_MX_RECORD); + return $result; + } + + if (!$this->options['useDeepMxCheck']) { + return $result; + } + + $validAddress = false; + $reserved = true; + foreach ($this->mxRecord as $hostname => $weight) { + $res = $this->isReserved($hostname); + if (!$res) { + $reserved = false; + } + + if (!$res + && (checkdnsrr($hostname, "A") + || checkdnsrr($hostname, "AAAA") + || checkdnsrr($hostname, "A6")) + ) { + $validAddress = true; + break; + } + } + + if (!$validAddress) { + $result = false; + $error = ($reserved) ? self::INVALID_SEGMENT : self::INVALID_MX_RECORD; + $this->error($error); + } + + return $result; + } + + /** + * Internal method to validate the hostname part of the email address + * + * @return bool + */ + protected function validateHostnamePart() + { + $hostname = $this->getHostnameValidator()->setTranslator($this->getTranslator()) + ->isValid($this->hostname); + if (!$hostname) { + $this->error(self::INVALID_HOSTNAME); + // Get messages and errors from hostnameValidator + foreach ($this->getHostnameValidator()->getMessages() as $code => $message) { + $this->abstractOptions['messages'][$code] = $message; + } + } elseif ($this->options['useMxCheck']) { + // MX check on hostname + $hostname = $this->validateMXRecords(); + } + + return $hostname; + } + + /** + * Splits the given value in hostname and local part of the email address + * + * @param string $value Email address to be split + * @return bool Returns false when the email can not be split + */ + protected function splitEmailParts($value) + { + // Split email address up and disallow '..' + if ((strpos($value, '..') !== false) or + (!preg_match('/^(.+)@([^@]+)$/', $value, $matches))) { + return false; + } + + $this->localPart = $matches[1]; + $this->hostname = $matches[2]; + + return true; + } + + /** + * Defined by Zend\Validator\ValidatorInterface + * + * Returns true if and only if $value is a valid email address + * according to RFC2822 + * + * @link http://www.ietf.org/rfc/rfc2822.txt RFC2822 + * @link http://www.columbia.edu/kermit/ascii.html US-ASCII characters + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $length = true; + $this->setValue($value); + + // Split email address up and disallow '..' + if (!$this->splitEmailParts($value)) { + $this->error(self::INVALID_FORMAT); + return false; + } + + if ((strlen($this->localPart) > 64) || (strlen($this->hostname) > 255)) { + $length = false; + $this->error(self::LENGTH_EXCEEDED); + } + + // Match hostname part + if ($this->options['useDomainCheck']) { + $hostname = $this->validateHostnamePart(); + } + + $local = $this->validateLocalPart(); + + // If both parts valid, return true + if ($local && $length) { + if (($this->options['useDomainCheck'] && $hostname) || !$this->options['useDomainCheck']) { + return true; + } + } + + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Exception/BadMethodCallException.php b/vendor/zendframework/zend-validator/Zend/Validator/Exception/BadMethodCallException.php new file mode 100644 index 0000000000..0e36e037e0 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Exception/BadMethodCallException.php @@ -0,0 +1,14 @@ + "Invalid type given", + ); + + /** + * @var array + */ + protected $messageVariables = array(); + + /** + * @var string + */ + protected $valueDelimiter = ','; + + /** + * @var ValidatorInterface + */ + protected $validator; + + /** + * @var bool + */ + protected $breakOnFirstFailure = false; + + /** + * Sets the delimiter string that the values will be split upon + * + * @param string $delimiter + * @return Explode + */ + public function setValueDelimiter($delimiter) + { + $this->valueDelimiter = $delimiter; + return $this; + } + + /** + * Returns the delimiter string that the values will be split upon + * + * @return string + */ + public function getValueDelimiter() + { + return $this->valueDelimiter; + } + + /** + * Set validator plugin manager + * + * @param ValidatorPluginManager $pluginManager + */ + public function setValidatorPluginManager(ValidatorPluginManager $pluginManager) + { + $this->pluginManager = $pluginManager; + } + + /** + * Get validator plugin manager + * + * @return ValidatorPluginManager + */ + public function getValidatorPluginManager() + { + if (!$this->pluginManager) { + $this->setValidatorPluginManager(new ValidatorPluginManager()); + } + + return $this->pluginManager; + } + + /** + * Sets the Validator for validating each value + * + * @param ValidatorInterface|array $validator + * @throws Exception\RuntimeException + * @return Explode + */ + public function setValidator($validator) + { + if (is_array($validator)) { + if (!isset($validator['name'])) { + throw new Exception\RuntimeException( + 'Invalid validator specification provided; does not include "name" key' + ); + } + $name = $validator['name']; + $options = isset($validator['options']) ? $validator['options'] : array(); + $validator = $this->getValidatorPluginManager()->get($name, $options); + } + + if (!$validator instanceof ValidatorInterface) { + throw new Exception\RuntimeException( + 'Invalid validator given' + ); + } + + $this->validator = $validator; + return $this; + } + + /** + * Gets the Validator for validating each value + * + * @return ValidatorInterface + */ + public function getValidator() + { + return $this->validator; + } + + /** + * Set break on first failure setting + * + * @param bool $break + * @return Explode + */ + public function setBreakOnFirstFailure($break) + { + $this->breakOnFirstFailure = (bool) $break; + return $this; + } + + /** + * Get break on first failure setting + * + * @return bool + */ + public function isBreakOnFirstFailure() + { + return $this->breakOnFirstFailure; + } + + /** + * Defined by Zend\Validator\ValidatorInterface + * + * Returns true if all values validate true + * + * @param mixed $value + * @return bool + * @throws Exception\RuntimeException + */ + public function isValid($value) + { + $this->setValue($value); + + if ($value instanceof Traversable) { + $value = ArrayUtils::iteratorToArray($value); + } + + if (is_array($value)) { + $values = $value; + } elseif (is_string($value)) { + $delimiter = $this->getValueDelimiter(); + // Skip explode if delimiter is null, + // used when value is expected to be either an + // array when multiple values and a string for + // single values (ie. MultiCheckbox form behavior) + $values = (null !== $delimiter) + ? explode($this->valueDelimiter, $value) + : array($value); + } else { + $values = array($value); + } + + $retval = true; + $messages = array(); + $validator = $this->getValidator(); + + if (!$validator) { + throw new Exception\RuntimeException(sprintf( + '%s expects a validator to be set; none given', + __METHOD__ + )); + } + + foreach ($values as $value) { + if (!$validator->isValid($value)) { + $messages[] = $validator->getMessages(); + $retval = false; + + if ($this->isBreakOnFirstFailure()) { + break; + } + } + } + + $this->abstractOptions['messages'] = $messages; + + return $retval; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Count.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Count.php new file mode 100644 index 0000000000..0bbf6be6f1 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Count.php @@ -0,0 +1,249 @@ + "Too many files, maximum '%max%' are allowed but '%count%' are given", + self::TOO_FEW => "Too few files, minimum '%min%' are expected but '%count%' are given", + ); + + /** + * @var array Error message template variables + */ + protected $messageVariables = array( + 'min' => array('options' => 'min'), + 'max' => array('options' => 'max'), + 'count' => 'count' + ); + + /** + * Actual filecount + * + * @var int + */ + protected $count; + + /** + * Internal file array + * @var array + */ + protected $files; + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'min' => null, // Minimum file count, if null there is no minimum file count + 'max' => null, // Maximum file count, if null there is no maximum file count + ); + + /** + * Sets validator options + * + * Min limits the file count, when used with max=null it is the maximum file count + * It also accepts an array with the keys 'min' and 'max' + * + * If $options is an integer, it will be used as maximum file count + * As Array is accepts the following keys: + * 'min': Minimum filecount + * 'max': Maximum filecount + * + * @param int|array|\Traversable $options Options for the adapter + */ + public function __construct($options = null) + { + if (is_string($options) || is_numeric($options)) { + $options = array('max' => $options); + } + + if (1 < func_num_args()) { + $options['min'] = func_get_arg(0); + $options['max'] = func_get_arg(1); + } + + parent::__construct($options); + } + + /** + * Returns the minimum file count + * + * @return int + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the minimum file count + * + * @param int|array $min The minimum file count + * @return Count Provides a fluent interface + * @throws Exception\InvalidArgumentException When min is greater than max + */ + public function setMin($min) + { + if (is_array($min) and isset($min['min'])) { + $min = $min['min']; + } + + if (!is_string($min) and !is_numeric($min)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $min = (int) $min; + if (($this->getMax() !== null) && ($min > $this->getMax())) { + throw new Exception\InvalidArgumentException("The minimum must be less than or equal to the maximum file count, but $min >" + . " {$this->getMax()}"); + } + + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the maximum file count + * + * @return int + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the maximum file count + * + * @param int|array $max The maximum file count + * @return Count Provides a fluent interface + * @throws Exception\InvalidArgumentException When max is smaller than min + */ + public function setMax($max) + { + if (is_array($max) and isset($max['max'])) { + $max = $max['max']; + } + + if (!is_string($max) and !is_numeric($max)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $max = (int) $max; + if (($this->getMin() !== null) && ($max < $this->getMin())) { + throw new Exception\InvalidArgumentException("The maximum must be greater than or equal to the minimum file count, but " + . "$max < {$this->getMin()}"); + } + + $this->options['max'] = $max; + return $this; + } + + /** + * Adds a file for validation + * + * @param string|array $file + * @return Count + */ + public function addFile($file) + { + if (is_string($file)) { + $file = array($file); + } + + if (is_array($file)) { + foreach ($file as $name) { + if (!isset($this->files[$name]) && !empty($name)) { + $this->files[$name] = $name; + } + } + } + + return $this; + } + + /** + * Returns true if and only if the file count of all checked files is at least min and + * not bigger than max (when max is not null). Attention: When checking with set min you + * must give all files with the first call, otherwise you will get a false. + * + * @param string|array $value Filenames to check for count + * @param array $file File data from \Zend\File\Transfer\Transfer + * @return bool + */ + public function isValid($value, $file = null) + { + if (($file !== null) && !array_key_exists('destination', $file)) { + $file['destination'] = dirname($value); + } + + if (($file !== null) && array_key_exists('tmp_name', $file)) { + $value = $file['destination'] . DIRECTORY_SEPARATOR . $file['name']; + } + + if (($file === null) || !empty($file['tmp_name'])) { + $this->addFile($value); + } + + $this->count = count($this->files); + if (($this->getMax() !== null) && ($this->count > $this->getMax())) { + return $this->throwError($file, self::TOO_MANY); + } + + if (($this->getMin() !== null) && ($this->count < $this->getMin())) { + return $this->throwError($file, self::TOO_FEW); + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function throwError($file, $errorType) + { + if ($file !== null) { + if (is_array($file)) { + if (array_key_exists('name', $file)) { + $this->value = $file['name']; + } + } elseif (is_string($file)) { + $this->value = $file; + } + } + + $this->error($errorType); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Crc32.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Crc32.php new file mode 100644 index 0000000000..737521c22e --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Crc32.php @@ -0,0 +1,128 @@ + "File does not match the given crc32 hashes", + self::NOT_DETECTED => "A crc32 hash could not be evaluated for the given file", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * Options for this validator + * + * @var string + */ + protected $options = array( + 'algorithm' => 'crc32', + 'hash' => null, + ); + + /** + * Returns all set crc32 hashes + * + * @return array + */ + public function getCrc32() + { + return $this->getHash(); + } + + /** + * Sets the crc32 hash for one or multiple files + * + * @param string|array $options + * @return Crc32 Provides a fluent interface + */ + public function setCrc32($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the crc32 hash for one or multiple files + * + * @param string|array $options + * @return Crc32 Provides a fluent interface + */ + public function addCrc32($options) + { + $this->addHash($options); + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string|array $value Filename to check for hash + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $hashes = array_unique(array_keys($this->getHash())); + $filehash = hash_file('crc32', $file); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/ExcludeExtension.php b/vendor/zendframework/zend-validator/Zend/Validator/File/ExcludeExtension.php new file mode 100644 index 0000000000..0d24b1857e --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/ExcludeExtension.php @@ -0,0 +1,86 @@ + "File has an incorrect extension", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * Returns true if and only if the file extension of $value is not included in the + * set extension list + * + * @param string|array $value Real file to check for extension + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $extension = substr($filename, strrpos($filename, '.') + 1); + $extensions = $this->getExtension(); + + if ($this->getCase() && (!in_array($extension, $extensions))) { + return true; + } elseif (!$this->getCase()) { + foreach ($extensions as $ext) { + if (strtolower($ext) == strtolower($extension)) { + $this->error(self::FALSE_EXTENSION); + return false; + } + } + + return true; + } + + $this->error(self::FALSE_EXTENSION); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/ExcludeMimeType.php b/vendor/zendframework/zend-validator/Zend/Validator/File/ExcludeMimeType.php new file mode 100644 index 0000000000..dedcee9fcc --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/ExcludeMimeType.php @@ -0,0 +1,105 @@ +setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_READABLE); + return false; + } + + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + if (!$this->isMagicFileDisabled() && (!empty($mimefile) && empty($this->finfo))) { + $this->finfo = finfo_open(FILEINFO_MIME_TYPE, $mimefile); + } + + if (empty($this->finfo)) { + $this->finfo = finfo_open(FILEINFO_MIME_TYPE); + } + + $this->type = null; + if (!empty($this->finfo)) { + $this->type = finfo_file($this->finfo, $file); + } + } + + if (empty($this->type) && $this->getHeaderCheck()) { + $this->type = $filetype; + } + + if (empty($this->type)) { + $this->error(self::NOT_DETECTED); + return false; + } + + $mimetype = $this->getMimeType(true); + if (in_array($this->type, $mimetype)) { + $this->error(self::FALSE_TYPE); + return false; + } + + $types = explode('/', $this->type); + $types = array_merge($types, explode('-', $this->type)); + $types = array_merge($types, explode(';', $this->type)); + foreach ($mimetype as $mime) { + if (in_array($mime, $types)) { + $this->error(self::FALSE_TYPE); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Exists.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Exists.php new file mode 100644 index 0000000000..c868aefc93 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Exists.php @@ -0,0 +1,196 @@ + "File does not exist", + ); + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'directory' => null, // internal list of directories + ); + + /** + * @var array Error message template variables + */ + protected $messageVariables = array( + 'directory' => array('options' => 'directory'), + ); + + /** + * Sets validator options + * + * @param string|array|\Traversable $options + */ + public function __construct($options = null) + { + if (is_string($options)) { + $options = explode(',', $options); + } + + if (is_array($options) && !array_key_exists('directory', $options)) { + $options = array('directory' => $options); + } + + parent::__construct($options); + } + + /** + * Returns the set file directories which are checked + * + * @param bool $asArray Returns the values as array; when false, a concatenated string is returned + * @return string|null + */ + public function getDirectory($asArray = false) + { + $asArray = (bool) $asArray; + $directory = $this->options['directory']; + if ($asArray && isset($directory)) { + $directory = explode(',', (string) $directory); + } + + return $directory; + } + + /** + * Sets the file directory which will be checked + * + * @param string|array $directory The directories to validate + * @return Extension Provides a fluent interface + */ + public function setDirectory($directory) + { + $this->options['directory'] = null; + $this->addDirectory($directory); + return $this; + } + + /** + * Adds the file directory which will be checked + * + * @param string|array $directory The directory to add for validation + * @return Extension Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function addDirectory($directory) + { + $directories = $this->getDirectory(true); + if (!isset($directories)) { + $directories = array(); + } + + if (is_string($directory)) { + $directory = explode(',', $directory); + } elseif (!is_array($directory)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + foreach ($directory as $content) { + if (empty($content) || !is_string($content)) { + continue; + } + + $directories[] = trim($content); + } + $directories = array_unique($directories); + + // Sanity check to ensure no empty values + foreach ($directories as $key => $dir) { + if (empty($dir)) { + unset($directories[$key]); + } + } + + $this->options['directory'] = (!empty($directory)) + ? implode(',', $directories) : null; + + return $this; + } + + /** + * Returns true if and only if the file already exists in the set directories + * + * @param string|array $value Real file to check for existence + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + $this->setValue($filename); + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = basename($file); + $this->setValue($value['name']); + } else { + $file = $value; + $filename = basename($file); + $this->setValue($filename); + } + + $check = false; + $directories = $this->getDirectory(true); + if (!isset($directories)) { + $check = true; + if (!file_exists($file)) { + $this->error(self::DOES_NOT_EXIST); + return false; + } + } else { + foreach ($directories as $directory) { + if (!isset($directory) || '' === $directory) { + continue; + } + + $check = true; + if (!file_exists($directory . DIRECTORY_SEPARATOR . $filename)) { + $this->error(self::DOES_NOT_EXIST); + return false; + } + } + } + + if (!$check) { + $this->error(self::DOES_NOT_EXIST); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Extension.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Extension.php new file mode 100644 index 0000000000..2ceeebc736 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Extension.php @@ -0,0 +1,219 @@ + "File has an incorrect extension", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'case' => false, // Validate case sensitive + 'extension' => '', // List of extensions + ); + + /** + * @var array Error message template variables + */ + protected $messageVariables = array( + 'extension' => array('options' => 'extension'), + ); + + /** + * Sets validator options + * + * @param string|array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + $case = null; + if (1 < func_num_args()) { + $case = func_get_arg(1); + } + + if (is_array($options)) { + if (isset($options['case'])) { + $case = $options['case']; + unset($options['case']); + } + + if (!array_key_exists('extension', $options)) { + $options = array('extension' => $options); + } + } else { + $options = array('extension' => $options); + } + + if ($case !== null) { + $options['case'] = $case; + } + + parent::__construct($options); + } + + /** + * Returns the case option + * + * @return bool + */ + public function getCase() + { + return $this->options['case']; + } + + /** + * Sets the case to use + * + * @param bool $case + * @return Extension Provides a fluent interface + */ + public function setCase($case) + { + $this->options['case'] = (bool) $case; + return $this; + } + + /** + * Returns the set file extension + * + * @return array + */ + public function getExtension() + { + $extension = explode(',', $this->options['extension']); + + return $extension; + } + + /** + * Sets the file extensions + * + * @param string|array $extension The extensions to validate + * @return Extension Provides a fluent interface + */ + public function setExtension($extension) + { + $this->options['extension'] = null; + $this->addExtension($extension); + return $this; + } + + /** + * Adds the file extensions + * + * @param string|array $extension The extensions to add for validation + * @return Extension Provides a fluent interface + */ + public function addExtension($extension) + { + $extensions = $this->getExtension(); + if (is_string($extension)) { + $extension = explode(',', $extension); + } + + foreach ($extension as $content) { + if (empty($content) || !is_string($content)) { + continue; + } + + $extensions[] = trim($content); + } + + $extensions = array_unique($extensions); + + // Sanity check to ensure no empty values + foreach ($extensions as $key => $ext) { + if (empty($ext)) { + unset($extensions[$key]); + } + } + + $this->options['extension'] = implode(',', $extensions); + return $this; + } + + /** + * Returns true if and only if the file extension of $value is included in the + * set extension list + * + * @param string|array $value Real file to check for extension + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $extension = substr($filename, strrpos($filename, '.') + 1); + $extensions = $this->getExtension(); + + if ($this->getCase() && (in_array($extension, $extensions))) { + return true; + } elseif (!$this->getCase()) { + foreach ($extensions as $ext) { + if (strtolower($ext) == strtolower($extension)) { + return true; + } + } + } + + $this->error(self::FALSE_EXTENSION); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/FilesSize.php b/vendor/zendframework/zend-validator/Zend/Validator/File/FilesSize.php new file mode 100644 index 0000000000..f2d2afd0db --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/FilesSize.php @@ -0,0 +1,171 @@ + "All files in sum should have a maximum size of '%max%' but '%size%' were detected", + self::TOO_SMALL => "All files in sum should have a minimum size of '%min%' but '%size%' were detected", + self::NOT_READABLE => "One or more files can not be read", + ); + + /** + * Internal file array + * + * @var array + */ + protected $files; + + /** + * Sets validator options + * + * Min limits the used disk space for all files, when used with max=null it is the maximum file size + * It also accepts an array with the keys 'min' and 'max' + * + * @param int|array|Traversable $options Options for this validator + * @throws \Zend\Validator\Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + $this->files = array(); + $this->setSize(0); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (is_scalar($options)) { + $options = array('max' => $options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + if (1 < func_num_args()) { + $argv = func_get_args(); + array_shift($argv); + $options['max'] = array_shift($argv); + if (!empty($argv)) { + $options['useByteString'] = array_shift($argv); + } + } + + parent::__construct($options); + } + + /** + * Returns true if and only if the disk usage of all files is at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value Real file to check for size + * @param array $file File data from \Zend\File\Transfer\Transfer + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value)) { + $value = array($value); + } + + $min = $this->getMin(true); + $max = $this->getMax(true); + $size = $this->getSize(); + foreach ($value as $files) { + // Is file readable ? + if (empty($files) || false === stream_resolve_include_path($files)) { + $this->throwError($file, self::NOT_READABLE); + continue; + } + + if (!isset($this->files[$files])) { + $this->files[$files] = $files; + } else { + // file already counted... do not count twice + continue; + } + + // limited to 2GB files + ErrorHandler::start(); + $size += filesize($files); + ErrorHandler::stop(); + $this->size = $size; + if (($max !== null) && ($max < $size)) { + if ($this->getByteString()) { + $this->options['max'] = $this->toByteString($max); + $this->size = $this->toByteString($size); + $this->throwError($file, self::TOO_BIG); + $this->options['max'] = $max; + $this->size = $size; + } else { + $this->throwError($file, self::TOO_BIG); + } + } + } + + // Check that aggregate files are >= minimum size + if (($min !== null) && ($size < $min)) { + if ($this->getByteString()) { + $this->options['min'] = $this->toByteString($min); + $this->size = $this->toByteString($size); + $this->throwError($file, self::TOO_SMALL); + $this->options['min'] = $min; + $this->size = $size; + } else { + $this->throwError($file, self::TOO_SMALL); + } + } + + if (count($this->getMessages()) > 0) { + return false; + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function throwError($file, $errorType) + { + if ($file !== null) { + if (is_array($file)) { + if (array_key_exists('name', $file)) { + $this->value = $file['name']; + } + } elseif (is_string($file)) { + $this->value = $file; + } + } + + $this->error($errorType); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Hash.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Hash.php new file mode 100644 index 0000000000..b77b1e19f4 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Hash.php @@ -0,0 +1,175 @@ + "File does not match the given hashes", + self::NOT_DETECTED => "A hash could not be evaluated for the given file", + self::NOT_FOUND => "File is not readable or does not exist" + ); + + /** + * Options for this validator + * + * @var string + */ + protected $options = array( + 'algorithm' => 'crc32', + 'hash' => null, + ); + + /** + * Sets validator options + * + * @param string|array $options + */ + public function __construct($options = null) + { + if (is_scalar($options) || + (is_array($options) && !array_key_exists('hash', $options))) { + $options = array('hash' => $options); + } + + if (1 < func_num_args()) { + $options['algorithm'] = func_get_arg(1); + } + + parent::__construct($options); + } + + /** + * Returns the set hash values as array, the hash as key and the algorithm the value + * + * @return array + */ + public function getHash() + { + return $this->options['hash']; + } + + /** + * Sets the hash for one or multiple files + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function setHash($options) + { + $this->options['hash'] = null; + $this->addHash($options); + + return $this; + } + + /** + * Adds the hash for one or multiple files + * + * @param string|array $options + * @return Hash Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function addHash($options) + { + if (is_string($options)) { + $options = array($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException("False parameter given"); + } + + $known = hash_algos(); + if (!isset($options['algorithm'])) { + $algorithm = $this->options['algorithm']; + } else { + $algorithm = $options['algorithm']; + unset($options['algorithm']); + } + + if (!in_array($algorithm, $known)) { + throw new Exception\InvalidArgumentException("Unknown algorithm '{$algorithm}'"); + } + + foreach ($options as $value) { + $this->options['hash'][$value] = $algorithm; + } + + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string|array $value File to check for hash + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $algos = array_unique(array_values($this->getHash())); + $hashes = array_unique(array_keys($this->getHash())); + foreach ($algos as $algorithm) { + $filehash = hash_file($algorithm, $file); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/ImageSize.php b/vendor/zendframework/zend-validator/Zend/Validator/File/ImageSize.php new file mode 100644 index 0000000000..921abfb1fd --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/ImageSize.php @@ -0,0 +1,384 @@ + "Maximum allowed width for image should be '%maxwidth%' but '%width%' detected", + self::WIDTH_TOO_SMALL => "Minimum expected width for image should be '%minwidth%' but '%width%' detected", + self::HEIGHT_TOO_BIG => "Maximum allowed height for image should be '%maxheight%' but '%height%' detected", + self::HEIGHT_TOO_SMALL => "Minimum expected height for image should be '%minheight%' but '%height%' detected", + self::NOT_DETECTED => "The size of image could not be detected", + self::NOT_READABLE => "File is not readable or does not exist", + ); + + /** + * @var array Error message template variables + */ + protected $messageVariables = array( + 'minwidth' => array('options' => 'minWidth'), + 'maxwidth' => array('options' => 'maxWidth'), + 'minheight' => array('options' => 'minHeight'), + 'maxheight' => array('options' => 'maxHeight'), + 'width' => 'width', + 'height' => 'height' + ); + + /** + * Detected width + * + * @var int + */ + protected $width; + + /** + * Detected height + * + * @var int + */ + protected $height; + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'minWidth' => null, // Minimum image width + 'maxWidth' => null, // Maximum image width + 'minHeight' => null, // Minimum image height + 'maxHeight' => null, // Maximum image height + ); + + /** + * Sets validator options + * + * Accepts the following option keys: + * - minheight + * - minwidth + * - maxheight + * - maxwidth + * + * @param array|\Traversable $options + */ + public function __construct($options = null) + { + if (1 < func_num_args()) { + if (!is_array($options)) { + $options = array('minWidth' => $options); + } + + $argv = func_get_args(); + array_shift($argv); + $options['minHeight'] = array_shift($argv); + if (!empty($argv)) { + $options['maxWidth'] = array_shift($argv); + if (!empty($argv)) { + $options['maxHeight'] = array_shift($argv); + } + } + } + + parent::__construct($options); + } + + /** + * Returns the minimum allowed width + * + * @return int + */ + public function getMinWidth() + { + return $this->options['minWidth']; + } + + /** + * Sets the minimum allowed width + * + * @param int $minWidth + * @return ImageSize Provides a fluid interface + * @throws Exception\InvalidArgumentException When minwidth is greater than maxwidth + */ + public function setMinWidth($minWidth) + { + if (($this->getMaxWidth() !== null) && ($minWidth > $this->getMaxWidth())) { + throw new Exception\InvalidArgumentException("The minimum image width must be less than or equal to the " + . " maximum image width, but {$minWidth} > {$this->getMaxWidth()}"); + } + + $this->options['minWidth'] = (int) $minWidth; + return $this; + } + + /** + * Returns the maximum allowed width + * + * @return int + */ + public function getMaxWidth() + { + return $this->options['maxWidth']; + } + + /** + * Sets the maximum allowed width + * + * @param int $maxWidth + * @return ImageSize Provides a fluid interface + * @throws Exception\InvalidArgumentException When maxwidth is less than minwidth + */ + public function setMaxWidth($maxWidth) + { + if (($this->getMinWidth() !== null) && ($maxWidth < $this->getMinWidth())) { + throw new Exception\InvalidArgumentException("The maximum image width must be greater than or equal to the " + . "minimum image width, but {$maxWidth} < {$this->getMinWidth()}"); + } + + $this->options['maxWidth'] = (int) $maxWidth; + return $this; + } + + /** + * Returns the minimum allowed height + * + * @return int + */ + public function getMinHeight() + { + return $this->options['minHeight']; + } + + /** + * Sets the minimum allowed height + * + * @param int $minHeight + * @return ImageSize Provides a fluid interface + * @throws Exception\InvalidArgumentException When minheight is greater than maxheight + */ + public function setMinHeight($minHeight) + { + if (($this->getMaxHeight() !== null) && ($minHeight > $this->getMaxHeight())) { + throw new Exception\InvalidArgumentException("The minimum image height must be less than or equal to the " + . " maximum image height, but {$minHeight} > {$this->getMaxHeight()}"); + } + + $this->options['minHeight'] = (int) $minHeight; + return $this; + } + + /** + * Returns the maximum allowed height + * + * @return int + */ + public function getMaxHeight() + { + return $this->options['maxHeight']; + } + + /** + * Sets the maximum allowed height + * + * @param int $maxHeight + * @return ImageSize Provides a fluid interface + * @throws Exception\InvalidArgumentException When maxheight is less than minheight + */ + public function setMaxHeight($maxHeight) + { + if (($this->getMinHeight() !== null) && ($maxHeight < $this->getMinHeight())) { + throw new Exception\InvalidArgumentException("The maximum image height must be greater than or equal to the " + . "minimum image height, but {$maxHeight} < {$this->getMinHeight()}"); + } + + $this->options['maxHeight'] = (int) $maxHeight; + return $this; + } + + /** + * Returns the set minimum image sizes + * + * @return array + */ + public function getImageMin() + { + return array('minWidth' => $this->getMinWidth(), 'minHeight' => $this->getMinHeight()); + } + + /** + * Returns the set maximum image sizes + * + * @return array + */ + public function getImageMax() + { + return array('maxWidth' => $this->getMaxWidth(), 'maxHeight' => $this->getMaxHeight()); + } + + /** + * Returns the set image width sizes + * + * @return array + */ + public function getImageWidth() + { + return array('minWidth' => $this->getMinWidth(), 'maxWidth' => $this->getMaxWidth()); + } + + /** + * Returns the set image height sizes + * + * @return array + */ + public function getImageHeight() + { + return array('minHeight' => $this->getMinHeight(), 'maxHeight' => $this->getMaxHeight()); + } + + /** + * Sets the minimum image size + * + * @param array $options The minimum image dimensions + * @return ImageSize Provides a fluent interface + */ + public function setImageMin($options) + { + $this->setOptions($options); + return $this; + } + + /** + * Sets the maximum image size + * + * @param array|\Traversable $options The maximum image dimensions + * @return ImageSize Provides a fluent interface + */ + public function setImageMax($options) + { + $this->setOptions($options); + return $this; + } + + /** + * Sets the minimum and maximum image width + * + * @param array $options The image width dimensions + * @return ImageSize Provides a fluent interface + */ + public function setImageWidth($options) + { + $this->setImageMin($options); + $this->setImageMax($options); + + return $this; + } + + /** + * Sets the minimum and maximum image height + * + * @param array $options The image height dimensions + * @return ImageSize Provides a fluent interface + */ + public function setImageHeight($options) + { + $this->setImageMin($options); + $this->setImageMax($options); + + return $this; + } + + /** + * Returns true if and only if the image size of $value is at least min and + * not bigger than max + * + * @param string|array $value Real file to check for image size + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_READABLE); + return false; + } + + ErrorHandler::start(); + $size = getimagesize($file); + ErrorHandler::stop(); + + if (empty($size) || ($size[0] === 0) || ($size[1] === 0)) { + $this->error(self::NOT_DETECTED); + return false; + } + + $this->width = $size[0]; + $this->height = $size[1]; + if ($this->width < $this->getMinWidth()) { + $this->error(self::WIDTH_TOO_SMALL); + } + + if (($this->getMaxWidth() !== null) && ($this->getMaxWidth() < $this->width)) { + $this->error(self::WIDTH_TOO_BIG); + } + + if ($this->height < $this->getMinHeight()) { + $this->error(self::HEIGHT_TOO_SMALL); + } + + if (($this->getMaxHeight() !== null) && ($this->getMaxHeight() < $this->height)) { + $this->error(self::HEIGHT_TOO_BIG); + } + + if (count($this->getMessages()) > 0) { + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/IsCompressed.php b/vendor/zendframework/zend-validator/Zend/Validator/File/IsCompressed.php new file mode 100644 index 0000000000..ccb2ae4744 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/IsCompressed.php @@ -0,0 +1,93 @@ + "File is not compressed, '%type%' detected", + self::NOT_DETECTED => "The mimetype could not be detected from the file", + self::NOT_READABLE => "File is not readable or does not exist", + ); + + /** + * Sets validator options + * + * @param string|array|Traversable $options + */ + public function __construct($options = array()) + { + // http://de.wikipedia.org/wiki/Liste_von_Dateiendungen + $default = array( + 'application/arj', + 'application/gnutar', + 'application/lha', + 'application/lzx', + 'application/vnd.ms-cab-compressed', + 'application/x-ace-compressed', + 'application/x-arc', + 'application/x-archive', + 'application/x-arj', + 'application/x-bzip', + 'application/x-bzip2', + 'application/x-cab-compressed', + 'application/x-compress', + 'application/x-compressed', + 'application/x-cpio', + 'application/x-debian-package', + 'application/x-eet', + 'application/x-gzip', + 'application/x-java-pack200', + 'application/x-lha', + 'application/x-lharc', + 'application/x-lzh', + 'application/x-lzma', + 'application/x-lzx', + 'application/x-rar', + 'application/x-sit', + 'application/x-stuffit', + 'application/x-tar', + 'application/zip', + 'application/x-zip', + 'application/zoo', + 'multipart/x-gzip', + ); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if ($options === null) { + $options = array(); + } + + parent::__construct($options); + + if (!$this->getMimeType()) { + $this->setMimeType($default); + } + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/IsImage.php b/vendor/zendframework/zend-validator/Zend/Validator/File/IsImage.php new file mode 100644 index 0000000000..71be7f3376 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/IsImage.php @@ -0,0 +1,117 @@ + "File is no image, '%type%' detected", + self::NOT_DETECTED => "The mimetype could not be detected from the file", + self::NOT_READABLE => "File is not readable or does not exist", + ); + + /** + * Sets validator options + * + * @param array|Traversable|string $options + */ + public function __construct($options = array()) + { + // http://de.wikipedia.org/wiki/Liste_von_Dateiendungen + // http://www.iana.org/assignments/media-types/image/ + $default = array( + 'application/cdf', + 'application/dicom', + 'application/fractals', + 'application/postscript', + 'application/vnd.hp-hpgl', + 'application/vnd.oasis.opendocument.graphics', + 'application/x-cdf', + 'application/x-cmu-raster', + 'application/x-ima', + 'application/x-inventor', + 'application/x-koan', + 'application/x-portable-anymap', + 'application/x-world-x-3dmf', + 'image/bmp', + 'image/c', + 'image/cgm', + 'image/fif', + 'image/gif', + 'image/jpeg', + 'image/jpm', + 'image/jpx', + 'image/jp2', + 'image/naplps', + 'image/pjpeg', + 'image/png', + 'image/svg', + 'image/svg+xml', + 'image/tiff', + 'image/vnd.adobe.photoshop', + 'image/vnd.djvu', + 'image/vnd.fpx', + 'image/vnd.net-fpx', + 'image/x-cmu-raster', + 'image/x-cmx', + 'image/x-coreldraw', + 'image/x-cpi', + 'image/x-emf', + 'image/x-ico', + 'image/x-icon', + 'image/x-jg', + 'image/x-ms-bmp', + 'image/x-niff', + 'image/x-pict', + 'image/x-pcx', + 'image/x-png', + 'image/x-portable-anymap', + 'image/x-portable-bitmap', + 'image/x-portable-greymap', + 'image/x-portable-pixmap', + 'image/x-quicktime', + 'image/x-rgb', + 'image/x-tiff', + 'image/x-unknown', + 'image/x-windows-bmp', + 'image/x-xpmi', + ); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if ($options === null) { + $options = array(); + } + + parent::__construct($options); + + if (!$this->getMimeType()) { + $this->setMimeType($default); + } + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Md5.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Md5.php new file mode 100644 index 0000000000..5d9fc34b44 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Md5.php @@ -0,0 +1,128 @@ + "File does not match the given md5 hashes", + self::NOT_DETECTED => "An md5 hash could not be evaluated for the given file", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * Options for this validator + * + * @var string + */ + protected $options = array( + 'algorithm' => 'md5', + 'hash' => null, + ); + + /** + * Returns all set md5 hashes + * + * @return array + */ + public function getMd5() + { + return $this->getHash(); + } + + /** + * Sets the md5 hash for one or multiple files + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function setMd5($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the md5 hash for one or multiple files + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function addMd5($options) + { + $this->addHash($options); + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string|array $value Filename to check for hash + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $hashes = array_unique(array_keys($this->getHash())); + $filehash = hash_file('md5', $file); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/MimeType.php b/vendor/zendframework/zend-validator/Zend/Validator/File/MimeType.php new file mode 100644 index 0000000000..53fb948dd4 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/MimeType.php @@ -0,0 +1,422 @@ + "File has an incorrect mimetype of '%type%'", + self::NOT_DETECTED => "The mimetype could not be detected from the file", + self::NOT_READABLE => "File is not readable or does not exist", + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'type' => 'type' + ); + + /** + * @var string + */ + protected $type; + + /** + * Finfo object to use + * + * @var resource + */ + protected $finfo; + + /** + * If no environment variable 'MAGIC' is set, try and autodiscover it based on common locations + * @var array + */ + protected $magicFiles = array( + '/usr/share/misc/magic', + '/usr/share/misc/magic.mime', + '/usr/share/misc/magic.mgc', + '/usr/share/mime/magic', + '/usr/share/mime/magic.mime', + '/usr/share/mime/magic.mgc', + '/usr/share/file/magic', + '/usr/share/file/magic.mime', + '/usr/share/file/magic.mgc', + ); + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'enableHeaderCheck' => false, // Allow header check + 'disableMagicFile' => false, // Disable usage of magicfile + 'magicFile' => null, // Magicfile to use + 'mimeType' => null, // Mimetype to allow + ); + + /** + * Sets validator options + * + * Mimetype to accept + * - NULL means default PHP usage by using the environment variable 'magic' + * - FALSE means disabling searching for mimetype, should be used for PHP 5.3 + * - A string is the mimetype file to use + * + * @param string|array|Traversable $options + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (is_string($options)) { + $this->setMimeType($options); + $options = array(); + } elseif (is_array($options)) { + if (isset($options['magicFile'])) { + $this->setMagicFile($options['magicFile']); + unset($options['magicFile']); + } + + if (isset($options['enableHeaderCheck'])) { + $this->enableHeaderCheck($options['enableHeaderCheck']); + unset($options['enableHeaderCheck']); + } + + if (array_key_exists('mimeType', $options)) { + $this->setMimeType($options['mimeType']); + unset($options['mimeType']); + } + + // Handle cases where mimetypes are interspersed with options, or + // options are simply an array of mime types + foreach (array_keys($options) as $key) { + if (!is_int($key)) { + continue; + } + $this->addMimeType($options[$key]); + unset($options[$key]); + } + } + + parent::__construct($options); + } + + /** + * Returns the actual set magicfile + * + * @return string + */ + public function getMagicFile() + { + if (null === $this->options['magicFile']) { + $magic = getenv('magic'); + if (!empty($magic)) { + $this->setMagicFile($magic); + if ($this->options['magicFile'] === null) { + $this->options['magicFile'] = false; + } + return $this->options['magicFile']; + } + + ErrorHandler::start(); + $safeMode = ini_get('safe_mode'); + ErrorHandler::stop(); + + if (!($safeMode == 'On' || $safeMode === 1)) { + foreach ($this->magicFiles as $file) { + // suppressing errors which are thrown due to openbase_dir restrictions + try { + $this->setMagicFile($file); + if ($this->options['magicFile'] !== null) { + break; + } + } catch (Exception\ExceptionInterface $e) { + // Intentionally, catch and fall through + } + } + } + + if ($this->options['magicFile'] === null) { + $this->options['magicFile'] = false; + } + } + + return $this->options['magicFile']; + } + + /** + * Sets the magicfile to use + * if null, the MAGIC constant from php is used + * if the MAGIC file is erroneous, no file will be set + * if false, the default MAGIC file from PHP will be used + * + * @param string $file + * @return MimeType Provides fluid interface + * @throws Exception\RuntimeException When finfo can not read the magicfile + * @throws Exception\InvalidArgumentException + * @throws Exception\InvalidMagicMimeFileException + */ + public function setMagicFile($file) + { + if ($file === false) { + $this->options['magicFile'] = false; + } elseif (empty($file)) { + $this->options['magicFile'] = null; + } elseif (!(class_exists('finfo', false))) { + $this->options['magicFile'] = null; + throw new Exception\RuntimeException('Magicfile can not be set; there is no finfo extension installed'); + } elseif (!is_file($file) || !is_readable($file)) { + throw new Exception\InvalidArgumentException(sprintf( + 'The given magicfile ("%s") could not be read', + $file + )); + } else { + ErrorHandler::start(E_NOTICE|E_WARNING); + $this->finfo = finfo_open(FILEINFO_MIME_TYPE, $file); + $error = ErrorHandler::stop(); + if (empty($this->finfo)) { + $this->finfo = null; + throw new Exception\InvalidMagicMimeFileException(sprintf( + 'The given magicfile ("%s") could not be used by ext/finfo', + $file + ), 0, $error); + } + $this->options['magicFile'] = $file; + } + + return $this; + } + + /** + * Disables usage of MagicFile + * + * @param $disable boolean False disables usage of magic file + * @return MimeType Provides fluid interface + */ + public function disableMagicFile($disable) + { + $this->options['disableMagicFile'] = (bool) $disable; + return $this; + } + + /** + * Is usage of MagicFile disabled? + * + * @return bool + */ + public function isMagicFileDisabled() + { + return $this->options['disableMagicFile']; + } + + /** + * Returns the Header Check option + * + * @return bool + */ + public function getHeaderCheck() + { + return $this->options['enableHeaderCheck']; + } + + /** + * Defines if the http header should be used + * Note that this is unsafe and therefor the default value is false + * + * @param bool $headerCheck + * @return MimeType Provides fluid interface + */ + public function enableHeaderCheck($headerCheck = true) + { + $this->options['enableHeaderCheck'] = (bool) $headerCheck; + return $this; + } + + /** + * Returns the set mimetypes + * + * @param bool $asArray Returns the values as array, when false a concatenated string is returned + * @return string|array + */ + public function getMimeType($asArray = false) + { + $asArray = (bool) $asArray; + $mimetype = (string) $this->options['mimeType']; + if ($asArray) { + $mimetype = explode(',', $mimetype); + } + + return $mimetype; + } + + /** + * Sets the mimetypes + * + * @param string|array $mimetype The mimetypes to validate + * @return MimeType Provides a fluent interface + */ + public function setMimeType($mimetype) + { + $this->options['mimeType'] = null; + $this->addMimeType($mimetype); + return $this; + } + + /** + * Adds the mimetypes + * + * @param string|array $mimetype The mimetypes to add for validation + * @return MimeType Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function addMimeType($mimetype) + { + $mimetypes = $this->getMimeType(true); + + if (is_string($mimetype)) { + $mimetype = explode(',', $mimetype); + } elseif (!is_array($mimetype)) { + throw new Exception\InvalidArgumentException("Invalid options to validator provided"); + } + + if (isset($mimetype['magicFile'])) { + unset($mimetype['magicFile']); + } + + foreach ($mimetype as $content) { + if (empty($content) || !is_string($content)) { + continue; + } + $mimetypes[] = trim($content); + } + $mimetypes = array_unique($mimetypes); + + // Sanity check to ensure no empty values + foreach ($mimetypes as $key => $mt) { + if (empty($mt)) { + unset($mimetypes[$key]); + } + } + + $this->options['mimeType'] = implode(',', $mimetypes); + + return $this; + } + + /** + * Defined by Zend\Validator\ValidatorInterface + * + * Returns true if the mimetype of the file matches the given ones. Also parts + * of mimetypes can be checked. If you give for example "image" all image + * mime types will be accepted like "image/gif", "image/jpeg" and so on. + * + * @param string|array $value Real file to check for mimetype + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $filetype = $file['type']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name']) || !isset($value['type'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + $filetype = $value['type']; + } else { + $file = $value; + $filename = basename($file); + $filetype = null; + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(static::NOT_READABLE); + return false; + } + + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + if (!$this->isMagicFileDisabled() && (!empty($mimefile) && empty($this->finfo))) { + ErrorHandler::start(E_NOTICE|E_WARNING); + $this->finfo = finfo_open(FILEINFO_MIME_TYPE, $mimefile); + ErrorHandler::stop(); + } + + if (empty($this->finfo)) { + ErrorHandler::start(E_NOTICE|E_WARNING); + $this->finfo = finfo_open(FILEINFO_MIME_TYPE); + ErrorHandler::stop(); + } + + $this->type = null; + if (!empty($this->finfo)) { + $this->type = finfo_file($this->finfo, $file); + } + } + + if (empty($this->type) && $this->getHeaderCheck()) { + $this->type = $filetype; + } + + if (empty($this->type)) { + $this->error(static::NOT_DETECTED); + return false; + } + + $mimetype = $this->getMimeType(true); + if (in_array($this->type, $mimetype)) { + return true; + } + + $types = explode('/', $this->type); + $types = array_merge($types, explode('-', $this->type)); + $types = array_merge($types, explode(';', $this->type)); + foreach ($mimetype as $mime) { + if (in_array($mime, $types)) { + return true; + } + } + + $this->error(static::FALSE_TYPE); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/NotExists.php b/vendor/zendframework/zend-validator/Zend/Validator/File/NotExists.php new file mode 100644 index 0000000000..17aa7da749 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/NotExists.php @@ -0,0 +1,89 @@ + "File exists", + ); + + /** + * Returns true if and only if the file does not exist in the set destinations + * + * @param string|array $value Real file to check for existence + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + $this->setValue($filename); + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = basename($file); + $this->setValue($value['name']); + } else { + $file = $value; + $filename = basename($file); + $this->setValue($filename); + } + + $check = false; + $directories = $this->getDirectory(true); + if (!isset($directories)) { + $check = true; + if (file_exists($file)) { + $this->error(self::DOES_EXIST); + return false; + } + } else { + foreach ($directories as $directory) { + if (!isset($directory) || '' === $directory) { + continue; + } + + $check = true; + if (file_exists($directory . DIRECTORY_SEPARATOR . $filename)) { + $this->error(self::DOES_EXIST); + return false; + } + } + } + + if (!$check) { + $this->error(self::DOES_EXIST); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Sha1.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Sha1.php new file mode 100644 index 0000000000..9841394500 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Sha1.php @@ -0,0 +1,128 @@ + "File does not match the given sha1 hashes", + self::NOT_DETECTED => "A sha1 hash could not be evaluated for the given file", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * Options for this validator + * + * @var string + */ + protected $options = array( + 'algorithm' => 'sha1', + 'hash' => null, + ); + + /** + * Returns all set sha1 hashes + * + * @return array + */ + public function getSha1() + { + return $this->getHash(); + } + + /** + * Sets the sha1 hash for one or multiple files + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function setSha1($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the sha1 hash for one or multiple files + * + * @param string|array $options + * @return Hash Provides a fluent interface + */ + public function addSha1($options) + { + $this->addHash($options); + return $this; + } + + /** + * Returns true if and only if the given file confirms the set hash + * + * @param string $value|array Filename to check for hash + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $hashes = array_unique(array_keys($this->getHash())); + $filehash = hash_file('sha1', $file); + if ($filehash === false) { + $this->error(self::NOT_DETECTED); + return false; + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + $this->error(self::DOES_NOT_MATCH); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Size.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Size.php new file mode 100644 index 0000000000..d5cfd9bde7 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Size.php @@ -0,0 +1,370 @@ + "Maximum allowed size for file is '%max%' but '%size%' detected", + self::TOO_SMALL => "Minimum expected size for file is '%min%' but '%size%' detected", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * @var array Error message template variables + */ + protected $messageVariables = array( + 'min' => array('options' => 'min'), + 'max' => array('options' => 'max'), + 'size' => 'size', + ); + + /** + * Detected size + * + * @var int + */ + protected $size; + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'min' => null, // Minimum file size, if null there is no minimum + 'max' => null, // Maximum file size, if null there is no maximum + 'useByteString' => true, // Use byte string? + ); + + /** + * Sets validator options + * + * If $options is an integer, it will be used as maximum file size + * As Array is accepts the following keys: + * 'min': Minimum file size + * 'max': Maximum file size + * 'useByteString': Use bytestring or real size for messages + * + * @param int|array|\Traversable $options Options for the adapter + */ + public function __construct($options = null) + { + if (is_string($options) || is_numeric($options)) { + $options = array('max' => $options); + } + + if (1 < func_num_args()) { + $argv = func_get_args(); + array_shift($argv); + $options['max'] = array_shift($argv); + if (!empty($argv)) { + $options['useByteString'] = array_shift($argv); + } + } + + parent::__construct($options); + } + + /** + * Should messages return bytes as integer or as string in SI notation + * + * @param bool $byteString Use bytestring ? + * @return int + */ + public function useByteString($byteString = true) + { + $this->options['useByteString'] = (bool) $byteString; + return $this; + } + + /** + * Will bytestring be used? + * + * @return bool + */ + public function getByteString() + { + return $this->options['useByteString']; + } + + /** + * Returns the minimum file size + * + * @param bool $raw Whether or not to force return of the raw value (defaults off) + * @return int|string + */ + public function getMin($raw = false) + { + $min = $this->options['min']; + if (!$raw && $this->getByteString()) { + $min = $this->toByteString($min); + } + + return $min; + } + + /** + * Sets the minimum file size + * + * File size can be an integer or a byte string + * This includes 'B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' + * For example: 2000, 2MB, 0.2GB + * + * @param int|string $min The minimum file size + * @return Size Provides a fluent interface + * @throws Exception\InvalidArgumentException When min is greater than max + */ + public function setMin($min) + { + if (!is_string($min) and !is_numeric($min)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $min = (int) $this->fromByteString($min); + $max = $this->getMax(true); + if (($max !== null) && ($min > $max)) { + throw new Exception\InvalidArgumentException( + 'The minimum must be less than or equal to the maximum file' + ." size, but $min > $max"); + } + + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the maximum file size + * + * @param bool $raw Whether or not to force return of the raw value (defaults off) + * @return int|string + */ + public function getMax($raw = false) + { + $max = $this->options['max']; + if (!$raw && $this->getByteString()) { + $max = $this->toByteString($max); + } + + return $max; + } + + /** + * Sets the maximum file size + * + * File size can be an integer or a byte string + * This includes 'B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' + * For example: 2000, 2MB, 0.2GB + * + * @param int|string $max The maximum file size + * @return Size Provides a fluent interface + * @throws Exception\InvalidArgumentException When max is smaller than min + */ + public function setMax($max) + { + if (!is_string($max) && !is_numeric($max)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $max = (int) $this->fromByteString($max); + $min = $this->getMin(true); + if (($min !== null) && ($max < $min)) { + throw new Exception\InvalidArgumentException( + 'The maximum must be greater than or equal to the minimum file' + ." size, but $max < $min"); + } + + $this->options['max'] = $max; + return $this; + } + + /** + * Retrieve current detected file size + * + * @return int + */ + protected function getSize() + { + return $this->size; + } + + /** + * Set current size + * + * @param int $size + * @return Size + */ + protected function setSize($size) + { + $this->size = $size; + return $this; + } + + /** + * Returns true if and only if the file size of $value is at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value File to check for size + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + // limited to 4GB files + ErrorHandler::start(); + $size = sprintf("%u", filesize($file)); + ErrorHandler::stop(); + $this->size = $size; + + // Check to see if it's smaller than min size + $min = $this->getMin(true); + $max = $this->getMax(true); + if (($min !== null) && ($size < $min)) { + if ($this->getByteString()) { + $this->options['min'] = $this->toByteString($min); + $this->size = $this->toByteString($size); + $this->error(self::TOO_SMALL); + $this->options['min'] = $min; + $this->size = $size; + } else { + $this->error(self::TOO_SMALL); + } + } + + // Check to see if it's larger than max size + if (($max !== null) && ($max < $size)) { + if ($this->getByteString()) { + $this->options['max'] = $this->toByteString($max); + $this->size = $this->toByteString($size); + $this->error(self::TOO_BIG); + $this->options['max'] = $max; + $this->size = $size; + } else { + $this->error(self::TOO_BIG); + } + } + + if (count($this->getMessages()) > 0) { + return false; + } + + return true; + } + + /** + * Returns the formatted size + * + * @param int $size + * @return string + */ + protected function toByteString($size) + { + $sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); + for ($i=0; $size >= 1024 && $i < 9; $i++) { + $size /= 1024; + } + + return round($size, 2) . $sizes[$i]; + } + + /** + * Returns the unformatted size + * + * @param string $size + * @return int + */ + protected function fromByteString($size) + { + if (is_numeric($size)) { + return (int) $size; + } + + $type = trim(substr($size, -2, 1)); + + $value = substr($size, 0, -1); + if (!is_numeric($value)) { + $value = substr($value, 0, -1); + } + + switch (strtoupper($type)) { + case 'Y': + $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'Z': + $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'E': + $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'P': + $value *= (1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'T': + $value *= (1024 * 1024 * 1024 * 1024); + break; + case 'G': + $value *= (1024 * 1024 * 1024); + break; + case 'M': + $value *= (1024 * 1024); + break; + case 'K': + $value *= 1024; + break; + default: + break; + } + + return $value; + } + + +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/Upload.php b/vendor/zendframework/zend-validator/Zend/Validator/File/Upload.php new file mode 100644 index 0000000000..748b482ee5 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/Upload.php @@ -0,0 +1,233 @@ + "File '%value%' exceeds the defined ini size", + self::FORM_SIZE => "File '%value%' exceeds the defined form size", + self::PARTIAL => "File '%value%' was only partially uploaded", + self::NO_FILE => "File '%value%' was not uploaded", + self::NO_TMP_DIR => "No temporary directory was found for file '%value%'", + self::CANT_WRITE => "File '%value%' can't be written", + self::EXTENSION => "A PHP extension returned an error while uploading the file '%value%'", + self::ATTACK => "File '%value%' was illegally uploaded. This could be a possible attack", + self::FILE_NOT_FOUND => "File '%value%' was not found", + self::UNKNOWN => "Unknown error while uploading file '%value%'" + ); + + protected $options = array( + 'files' => array(), + ); + + /** + * Sets validator options + * + * The array $files must be given in syntax of Zend\File\Transfer\Transfer to be checked + * If no files are given the $_FILES array will be used automatically. + * NOTE: This validator will only work with HTTP POST uploads! + * + * @param array|\Traversable $options Array of files in syntax of \Zend\File\Transfer\Transfer + */ + public function __construct($options = array()) + { + if (is_array($options) && !array_key_exists('files', $options)) { + $options = array('files' => $options); + } + + parent::__construct($options); + } + + /** + * Returns the array of set files + * + * @param string $file (Optional) The file to return in detail + * @return array + * @throws Exception\InvalidArgumentException If file is not found + */ + public function getFiles($file = null) + { + if ($file !== null) { + $return = array(); + foreach ($this->options['files'] as $name => $content) { + if ($name === $file) { + $return[$file] = $this->options['files'][$name]; + } + + if ($content['name'] === $file) { + $return[$name] = $this->options['files'][$name]; + } + } + + if (count($return) === 0) { + throw new Exception\InvalidArgumentException("The file '$file' was not found"); + } + + return $return; + } + + return $this->options['files']; + } + + /** + * Sets the files to be checked + * + * @param array $files The files to check in syntax of \Zend\File\Transfer\Transfer + * @return Upload Provides a fluent interface + */ + public function setFiles($files = array()) + { + if (count($files) === 0) { + $this->options['files'] = $_FILES; + } else { + $this->options['files'] = $files; + } + + if ($this->options['files'] === NULL) { + $this->options['files'] = array(); + } + + foreach ($this->options['files'] as $file => $content) { + if (!isset($content['error'])) { + unset($this->options['files'][$file]); + } + } + + return $this; + } + + /** + * Returns true if and only if the file was uploaded without errors + * + * @param string $value Single file to check for upload errors, when giving null the $_FILES array + * from initialization will be used + * @param mixed $file + * @return bool + */ + public function isValid($value, $file = null) + { + $files = array(); + $this->setValue($value); + if (array_key_exists($value, $this->getFiles())) { + $files = array_merge($files, $this->getFiles($value)); + } else { + foreach ($this->getFiles() as $file => $content) { + if (isset($content['name']) && ($content['name'] === $value)) { + $files = array_merge($files, $this->getFiles($file)); + } + + if (isset($content['tmp_name']) && ($content['tmp_name'] === $value)) { + $files = array_merge($files, $this->getFiles($file)); + } + } + } + + if (empty($files)) { + return $this->throwError($file, self::FILE_NOT_FOUND); + } + + foreach ($files as $file => $content) { + $this->value = $file; + switch ($content['error']) { + case 0: + if (!is_uploaded_file($content['tmp_name'])) { + $this->throwError($content, self::ATTACK); + } + break; + + case 1: + $this->throwError($content, self::INI_SIZE); + break; + + case 2: + $this->throwError($content, self::FORM_SIZE); + break; + + case 3: + $this->throwError($content, self::PARTIAL); + break; + + case 4: + $this->throwError($content, self::NO_FILE); + break; + + case 6: + $this->throwError($content, self::NO_TMP_DIR); + break; + + case 7: + $this->throwError($content, self::CANT_WRITE); + break; + + case 8: + $this->throwError($content, self::EXTENSION); + break; + + default: + $this->throwError($content, self::UNKNOWN); + break; + } + } + + if (count($this->getMessages()) > 0) { + return false; + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function throwError($file, $errorType) + { + if ($file !== null) { + if (is_array($file)) { + if (array_key_exists('name', $file)) { + $this->value = $file['name']; + } + } elseif (is_string($file)) { + $this->value = $file; + } + } + + $this->error($errorType); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/UploadFile.php b/vendor/zendframework/zend-validator/Zend/Validator/File/UploadFile.php new file mode 100644 index 0000000000..90f4d75df0 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/UploadFile.php @@ -0,0 +1,126 @@ + "File exceeds the defined ini size", + self::FORM_SIZE => "File exceeds the defined form size", + self::PARTIAL => "File was only partially uploaded", + self::NO_FILE => "File was not uploaded", + self::NO_TMP_DIR => "No temporary directory was found for file", + self::CANT_WRITE => "File can't be written", + self::EXTENSION => "A PHP extension returned an error while uploading the file", + self::ATTACK => "File was illegally uploaded. This could be a possible attack", + self::FILE_NOT_FOUND => "File was not found", + self::UNKNOWN => "Unknown error while uploading file", + ); + + /** + * Returns true if and only if the file was uploaded without errors + * + * @param string $value File to check for upload errors + * @return bool + * @throws Exception\InvalidArgumentException + */ + public function isValid($value) + { + if (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name']) || !isset($value['error'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + $error = $value['error']; + } else { + $file = $value; + $filename = basename($file); + $error = 0; + } + $this->setValue($filename); + + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::FILE_NOT_FOUND); + return false; + } + + switch ($error) { + case UPLOAD_ERR_OK: + if (!is_uploaded_file($file)) { + $this->error(self::ATTACK); + } + break; + + case UPLOAD_ERR_INI_SIZE: + $this->error(self::INI_SIZE); + break; + + case UPLOAD_ERR_FORM_SIZE: + $this->error(self::FORM_SIZE); + break; + + case UPLOAD_ERR_PARTIAL: + $this->error(self::PARTIAL); + break; + + case UPLOAD_ERR_NO_FILE: + $this->error(self::NO_FILE); + break; + + case UPLOAD_ERR_NO_TMP_DIR: + $this->error(self::NO_TMP_DIR); + break; + + case UPLOAD_ERR_CANT_WRITE: + $this->error(self::CANT_WRITE); + break; + + case UPLOAD_ERR_EXTENSION: + $this->error(self::EXTENSION); + break; + + default: + $this->error(self::UNKNOWN); + break; + } + + if (count($this->getMessages()) > 0) { + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/File/WordCount.php b/vendor/zendframework/zend-validator/Zend/Validator/File/WordCount.php new file mode 100644 index 0000000000..f3d58016dd --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/File/WordCount.php @@ -0,0 +1,213 @@ + "Too many words, maximum '%max%' are allowed but '%count%' were counted", + self::TOO_LESS => "Too few words, minimum '%min%' are expected but '%count%' were counted", + self::NOT_FOUND => "File is not readable or does not exist", + ); + + /** + * @var array Error message template variables + */ + protected $messageVariables = array( + 'min' => array('options' => 'min'), + 'max' => array('options' => 'max'), + 'count' => 'count' + ); + + /** + * Word count + * + * @var int + */ + protected $count; + + /** + * Options for this validator + * + * @var array + */ + protected $options = array( + 'min' => null, // Minimum word count, if null there is no minimum word count + 'max' => null, // Maximum word count, if null there is no maximum word count + ); + + /** + * Sets validator options + * + * Min limits the word count, when used with max=null it is the maximum word count + * It also accepts an array with the keys 'min' and 'max' + * + * If $options is an integer, it will be used as maximum word count + * As Array is accepts the following keys: + * 'min': Minimum word count + * 'max': Maximum word count + * + * @param int|array|\Traversable $options Options for the adapter + */ + public function __construct($options = null) + { + if (is_string($options) || is_numeric($options)) { + $options = array('max' => $options); + } + + if (1 < func_num_args()) { + $options['min'] = func_get_arg(0); + $options['max'] = func_get_arg(1); + } + + parent::__construct($options); + } + + /** + * Returns the minimum word count + * + * @return int + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the minimum word count + * + * @param int|array $min The minimum word count + * @return WordCount Provides a fluent interface + * @throws Exception\InvalidArgumentException When min is greater than max + */ + public function setMin($min) + { + if (is_array($min) and isset($min['min'])) { + $min = $min['min']; + } + + if (!is_string($min) and !is_numeric($min)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $min = (int) $min; + if (($this->getMax() !== null) && ($min > $this->getMax())) { + throw new Exception\InvalidArgumentException( + "The minimum must be less than or equal to the maximum word count, but $min >" + . " {$this->getMax()}"); + } + + $this->options['min'] = $min; + return $this; + } + + /** + * Returns the maximum word count + * + * @return int + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the maximum file count + * + * @param int|array $max The maximum word count + * @return WordCount Provides a fluent interface + * @throws Exception\InvalidArgumentException When max is smaller than min + */ + public function setMax($max) + { + if (is_array($max) and isset($max['max'])) { + $max = $max['max']; + } + + if (!is_string($max) and !is_numeric($max)) { + throw new Exception\InvalidArgumentException('Invalid options to validator provided'); + } + + $max = (int) $max; + if (($this->getMin() !== null) && ($max < $this->getMin())) { + throw new Exception\InvalidArgumentException( + "The maximum must be greater than or equal to the minimum word count, but " + . "$max < {$this->getMin()}"); + } + + $this->options['max'] = $max; + return $this; + } + + /** + * Returns true if and only if the counted words are at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value Filename to check for word count + * @param array $file File data from \Zend\File\Transfer\Transfer (optional) + * @return bool + */ + public function isValid($value, $file = null) + { + if (is_string($value) && is_array($file)) { + // Legacy Zend\Transfer API support + $filename = $file['name']; + $file = $file['tmp_name']; + } elseif (is_array($value)) { + if (!isset($value['tmp_name']) || !isset($value['name'])) { + throw new Exception\InvalidArgumentException( + 'Value array must be in $_FILES format' + ); + } + $file = $value['tmp_name']; + $filename = $value['name']; + } else { + $file = $value; + $filename = basename($file); + } + $this->setValue($filename); + + // Is file readable ? + if (empty($file) || false === stream_resolve_include_path($file)) { + $this->error(self::NOT_FOUND); + return false; + } + + $content = file_get_contents($file); + $this->count = str_word_count($content); + if (($this->getMax() !== null) && ($this->count > $this->getMax())) { + $this->error(self::TOO_MUCH); + return false; + } + + if (($this->getMin() !== null) && ($this->count < $this->getMin())) { + $this->error(self::TOO_LESS); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/GreaterThan.php b/vendor/zendframework/zend-validator/Zend/Validator/GreaterThan.php new file mode 100644 index 0000000000..6a06ae8d25 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/GreaterThan.php @@ -0,0 +1,158 @@ + "The input is not greater than '%min%'", + self::NOT_GREATER_INCLUSIVE => "The input is not greater or equal than '%min%'" + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'min' => 'min' + ); + + /** + * Minimum value + * + * @var mixed + */ + protected $min; + + /** + * Whether to do inclusive comparisons, allowing equivalence to max + * + * If false, then strict comparisons are done, and the value may equal + * the min option + * + * @var bool + */ + protected $inclusive; + + /** + * Sets validator options + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (!is_array($options)) { + $options = func_get_args(); + $temp['min'] = array_shift($options); + + if (!empty($options)) { + $temp['inclusive'] = array_shift($options); + } + + $options = $temp; + } + + if (!array_key_exists('min', $options)) { + throw new Exception\InvalidArgumentException("Missing option 'min'"); + } + + if (!array_key_exists('inclusive', $options)) { + $options['inclusive'] = false; + } + + $this->setMin($options['min']) + ->setInclusive($options['inclusive']); + + parent::__construct($options); + } + + /** + * Returns the min option + * + * @return mixed + */ + public function getMin() + { + return $this->min; + } + + /** + * Sets the min option + * + * @param mixed $min + * @return GreaterThan Provides a fluent interface + */ + public function setMin($min) + { + $this->min = $min; + return $this; + } + + /** + * Returns the inclusive option + * + * @return bool + */ + public function getInclusive() + { + return $this->inclusive; + } + + /** + * Sets the inclusive option + * + * @param bool $inclusive + * @return GreaterThan Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->inclusive = $inclusive; + return $this; + } + + /** + * Returns true if and only if $value is greater than min option + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if ($this->inclusive) { + if ($this->min > $value) { + $this->error(self::NOT_GREATER_INCLUSIVE); + return false; + } + } else { + if ($this->min >= $value) { + $this->error(self::NOT_GREATER); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Hex.php b/vendor/zendframework/zend-validator/Zend/Validator/Hex.php new file mode 100644 index 0000000000..e7b591c8b8 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Hex.php @@ -0,0 +1,48 @@ + "Invalid type given. String expected", + self::NOT_HEX => "The input contains non-hexadecimal characters", + ); + + /** + * Returns true if and only if $value contains only hexadecimal digit characters + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + if (!ctype_xdigit((string) $value)) { + $this->error(self::NOT_HEX); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Hostname.php b/vendor/zendframework/zend-validator/Zend/Validator/Hostname.php new file mode 100644 index 0000000000..1536541f4a --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Hostname.php @@ -0,0 +1,761 @@ + "The input appears to be a DNS hostname but the given punycode notation cannot be decoded", + self::INVALID => "Invalid type given. String expected", + self::INVALID_DASH => "The input appears to be a DNS hostname but contains a dash in an invalid position", + self::INVALID_HOSTNAME => "The input does not match the expected structure for a DNS hostname", + self::INVALID_HOSTNAME_SCHEMA => "The input appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'", + self::INVALID_LOCAL_NAME => "The input does not appear to be a valid local network name", + self::INVALID_URI => "The input does not appear to be a valid URI hostname", + self::IP_ADDRESS_NOT_ALLOWED => "The input appears to be an IP address, but IP addresses are not allowed", + self::LOCAL_NAME_NOT_ALLOWED => "The input appears to be a local network name but local network names are not allowed", + self::UNDECIPHERABLE_TLD => "The input appears to be a DNS hostname but cannot extract TLD part", + self::UNKNOWN_TLD => "The input appears to be a DNS hostname but cannot match TLD against known list", + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'tld' => 'tld', + ); + + const ALLOW_DNS = 1; // Allows Internet domain names (e.g., example.com) + const ALLOW_IP = 2; // Allows IP addresses + const ALLOW_LOCAL = 4; // Allows local network names (e.g., localhost, www.localdomain) + const ALLOW_URI = 8; // Allows URI hostnames + const ALLOW_ALL = 15; // Allows all types of hostnames + + /** + * Array of valid top-level-domains + * + * @see ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt List of all TLDs by domain + * @see http://www.iana.org/domains/root/db/ Official list of supported TLDs + * @var array + */ + protected $validTlds = array( + 'ac', 'academy', 'actor', 'ad', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', + 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bar', 'bargains', 'bb', 'bd', 'be', 'berlin', 'best', + 'bf', 'bg', 'bh', 'bi', 'bike', 'biz', 'bj', 'bl', 'blue', 'bm', 'bn', 'bo', 'boutique', 'bq', 'br', 'bs', 'bt', + 'build', 'builders', 'buzz', 'bv', 'bw', 'by', 'bz', 'ca', 'cab', 'camera', 'camp', 'cards', 'careers', 'cat', + 'catering', 'cc', 'cd', 'center', 'ceo', 'cf', 'cg', 'ch', 'cheap', 'christmas', 'ci', 'ck', 'cl', 'cleaning', + 'clothing', 'club', 'cm', 'cn', 'co', 'codes', 'coffee', 'com', 'community', 'company', 'computer', + 'construction', 'contractors', 'cool', 'coop', 'cr', 'cruises', 'cu', 'cv', 'cw', 'cx', 'cy', 'cz', 'dance', + 'dating', 'de', 'democrat', 'diamonds', 'directory', 'dj', 'dk', 'dm', 'do', 'domains', 'dz', 'ec', 'edu', + 'education', 'ee', 'eg', 'eh', 'email', 'enterprises', 'equipment', 'er', 'es', 'estate', 'et', 'eu', 'events', + 'expert', 'exposed', 'farm', 'fi', 'fish', 'fj', 'fk', 'flights', 'florist', 'fm', 'fo', 'foundation', 'fr', + 'futbol', 'ga', 'gallery', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gift', 'gl', 'glass', 'gm', 'gn', 'gov', + 'gp', 'gq', 'gr', 'graphics', 'gs', 'gt', 'gu', 'guitars', 'guru', 'gw', 'gy', 'hk', 'hm', 'hn', 'holdings', + 'holiday', 'house', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'immobilien', 'in', 'industries', 'info', + 'institute', 'int', 'international', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp', 'kaufen', + 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'kp', 'kr', 'kred', 'kw', 'ky', 'kz', 'la', + 'land', 'lb', 'lc', 'li', 'lighting', 'limo', 'link', 'lk', 'lr', 'ls', 'lt', 'lu', 'luxury', 'lv', 'ly', 'ma', + 'management', 'mango', 'marketing', 'mc', 'md', 'me', 'menu', 'mf', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', 'mn', + 'mo', 'mobi', 'moda', 'monash', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', + 'na', 'nagoya', 'name', 'nc', 'ne', 'net', 'neustar', 'nf', 'ng', 'ni', 'ninja', 'nl', 'no', 'np', 'nr', 'nu', + 'nz', 'om', 'onl', 'org', 'pa', 'partners', 'parts', 'pe', 'pf', 'pg', 'ph', 'photo', 'photography', 'photos', + 'pics', 'pink', 'pk', 'pl', 'plumbing', 'pm', 'pn', 'post', 'pr', 'pro', 'productions', 'properties', 'ps', + 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 're', 'recipes', 'red', 'rentals', 'repair', 'report', 'reviews', 'rich', + 'ro', 'rs', 'ru', 'ruhr', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'si', + 'singles', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'social', 'solar', 'solutions', 'sr', 'ss', 'st', 'su', + 'supplies', 'supply', 'support', 'sv', 'sx', 'sy', 'systems', 'sz', 'tattoo', 'tc', 'td', 'technology', 'tel', + 'tf', 'tg', 'th', 'tienda', 'tips', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'tp', 'tr', + 'training', 'travel', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'um', 'uno', 'us', 'uy', 'uz', 'va', + 'vacations', 'vc', 've', 'ventures', 'vg', 'vi', 'viajes', 'villas', 'vision', 'vn', 'voting', 'voyage', 'vu', + 'wang', 'watch', 'wed', 'wf', 'wien', 'wiki', 'works', 'ws', '测试', 'परीकà¥à¤·à¤¾', '集团', '在线', '한국', 'ভারত', + 'বাংলা', '公益', 'å…¬å¸', '移动', '我爱你', 'иÑпытание', 'қаз', 'онлайн', 'Ñайт', 'Ñрб', '테스트', '삼성', + 'சிஙà¯à®•பà¯à®ªà¯‚à®°à¯', 'дети', 'טעסט', '中文网', '中信', '中国', '中國', 'భారతà±', 'ලංකà·', '測試', 'ભારત', 'भारत', + 'آزمایشی', 'பரிடà¯à®šà¯ˆ', '网络', 'укр', '香港', 'δοκιμή', 'إختبار', 'å°æ¹¾', 'å°ç£', 'мон', + 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'پاکستان', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'سودان', 'مليسيا', 'شبكة', 'გე', + 'ไทย', 'سورية', 'рф', 'تونس', 'ã¿ã‚“ãª', 'ਭਾਰਤ', '游æˆ', 'مصر', 'قطر', 'இலஙà¯à®•ை', 'இநà¯à®¤à®¿à®¯à®¾', '新加å¡', 'Ùلسطين', + 'テスト', '政务', 'xxx', 'xyz', 'ye', 'yt', 'za', 'zm', 'zone', 'zw' + ); + + /** + * Array for valid Idns + * @see http://www.iana.org/domains/idn-tables/ Official list of supported IDN Chars + * (.AC) Ascension Island http://www.nic.ac/pdf/AC-IDN-Policy.pdf + * (.AR) Argentina http://www.nic.ar/faqidn.html + * (.AS) American Samoa http://www.nic.as/idn/chars.cfm + * (.AT) Austria http://www.nic.at/en/service/technical_information/idn/charset_converter/ + * (.BIZ) International http://www.iana.org/domains/idn-tables/ + * (.BR) Brazil http://registro.br/faq/faq6.html + * (.BV) Bouvett Island http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.CAT) Catalan http://www.iana.org/domains/idn-tables/tables/cat_ca_1.0.html + * (.CH) Switzerland https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 + * (.CL) Chile http://www.iana.org/domains/idn-tables/tables/cl_latn_1.0.html + * (.COM) International http://www.verisign.com/information-services/naming-services/internationalized-domain-names/index.html + * (.DE) Germany http://www.denic.de/en/domains/idns/liste.html + * (.DK) Danmark http://www.dk-hostmaster.dk/index.php?id=151 + * (.ES) Spain https://www.nic.es/media/2008-05/1210147705287.pdf + * (.FI) Finland http://www.ficora.fi/en/index/palvelut/fiverkkotunnukset/aakkostenkaytto.html + * (.GR) Greece https://grweb.ics.forth.gr/CharacterTable1_en.jsp + * (.HU) Hungary http://www.domain.hu/domain/English/szabalyzat/szabalyzat.html + * (.IL) Israel http://www.isoc.org.il/domains/il-domain-rules.html + * (.INFO) International http://www.nic.info/info/idn + * (.IO) British Indian Ocean Territory http://www.nic.io/IO-IDN-Policy.pdf + * (.IR) Iran http://www.nic.ir/Allowable_Characters_dot-iran + * (.IS) Iceland http://www.isnic.is/domain/rules.php + * (.KR) Korea http://www.iana.org/domains/idn-tables/tables/kr_ko-kr_1.0.html + * (.LI) Liechtenstein https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 + * (.LT) Lithuania http://www.domreg.lt/static/doc/public/idn_symbols-en.pdf + * (.MD) Moldova http://www.register.md/ + * (.MUSEUM) International http://www.iana.org/domains/idn-tables/tables/museum_latn_1.0.html + * (.NET) International http://www.verisign.com/information-services/naming-services/internationalized-domain-names/index.html + * (.NO) Norway http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.NU) Niue http://www.worldnames.net/ + * (.ORG) International http://www.pir.org/index.php?db=content/FAQs&tbl=FAQs_Registrant&id=2 + * (.PE) Peru https://www.nic.pe/nuevas_politicas_faq_2.php + * (.PL) Poland http://www.dns.pl/IDN/allowed_character_sets.pdf + * (.PR) Puerto Rico http://www.nic.pr/idn_rules.asp + * (.PT) Portugal https://online.dns.pt/dns_2008/do?com=DS;8216320233;111;+PAGE(4000058)+K-CAT-CODIGO(C.125)+RCNT(100); + * (.RU) Russia http://www.iana.org/domains/idn-tables/tables/ru_ru-ru_1.0.html + * (.SA) Saudi Arabia http://www.iana.org/domains/idn-tables/tables/sa_ar_1.0.html + * (.SE) Sweden http://www.iis.se/english/IDN_campaignsite.shtml?lang=en + * (.SH) Saint Helena http://www.nic.sh/SH-IDN-Policy.pdf + * (.SJ) Svalbard and Jan Mayen http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.TH) Thailand http://www.iana.org/domains/idn-tables/tables/th_th-th_1.0.html + * (.TM) Turkmenistan http://www.nic.tm/TM-IDN-Policy.pdf + * (.TR) Turkey https://www.nic.tr/index.php + * (.UA) Ukraine http://www.iana.org/domains/idn-tables/tables/ua_cyrl_1.2.html + * (.VE) Venice http://www.iana.org/domains/idn-tables/tables/ve_es_1.0.html + * (.VN) Vietnam http://www.vnnic.vn/english/5-6-300-2-2-04-20071115.htm#1.%20Introduction + * + * @var array + */ + protected $validIdns = array( + 'AC' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿÄăąćĉċÄÄđēėęěÄġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśÅşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'), + 'AR' => array(1 => '/^[\x{002d}0-9a-zà-ãç-êìíñ-õü]{1,63}$/iu'), + 'AS' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıĵķĸĺļľłńņňŋÅÅőœŕŗřśÅşšţťŧũūŭůűųŵŷźż]{1,63}$/iu'), + 'AT' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿœšž]{1,63}$/iu'), + 'BIZ' => 'Hostname/Biz.php', + 'BR' => array(1 => '/^[\x{002d}0-9a-zà-ãçéíó-õúü]{1,63}$/iu'), + 'BV' => array(1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüÄđńŋšŧž]{1,63}$/iu'), + 'CAT' => array(1 => '/^[\x{002d}0-9a-z·àç-éíïòóúü]{1,63}$/iu'), + 'CH' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'), + 'CL' => array(1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'), + 'CN' => 'Hostname/Cn.php', + 'COM' => 'Hostname/Com.php', + 'DE' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿăąÄćĉÄÄ‹ÄđĕěėęēğÄġģĥħĭĩįīıĵķĺľļłńňņŋÅőŜĸŕřŗśÅšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'), + 'DK' => array(1 => '/^[\x{002d}0-9a-zäéöü]{1,63}$/iu'), + 'ES' => array(1 => '/^[\x{002d}0-9a-zàáçèéíïñòóúü·]{1,63}$/iu'), + 'EU' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋÅÅőœŕŗřśÅšťŧũūŭůűųŵŷźżž]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zșț]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-zÎάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏÏŽ]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-zабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-zá¼€-ἇá¼-ἕἠ-á¼§á¼°-á¼·á½€-á½…á½-á½—á½ -á½§á½°-ὼώᾀ-ᾇá¾-á¾—á¾ -á¾§á¾°-ᾴᾶᾷῂῃῄῆῇá¿-á¿’Îá¿–á¿—á¿ -ῧῲῳῴῶῷ]{1,63}$/iu'), + 'FI' => array(1 => '/^[\x{002d}0-9a-zäåö]{1,63}$/iu'), + 'GR' => array(1 => '/^[\x{002d}0-9a-zΆΈΉΊΌΎ-ΡΣ-ÏŽá¼€-ἕἘ-á¼á¼ -ὅὈ-á½á½-ὗὙὛá½á½Ÿ-ώᾀ-á¾´á¾¶-ᾼῂῃῄῆ-ῌá¿-á¿“á¿–-Ίῠ-Ῥῲῳῴῶ-ῼ]{1,63}$/iu'), + 'HK' => 'Hostname/Cn.php', + 'HU' => array(1 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu'), + 'IL' => array(1 => '/^[\x{002d}0-9\x{05D0}-\x{05EA}]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-z]{1,63}$/i'), + 'INFO'=> array(1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu', + 4 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 5 => '/^[\x{002d}0-9a-zÄÄēģīķļņÅŗšūž]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-zÄ…Äėęįšūųž]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'), + 'IO' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿăąÄćĉÄÄ‹ÄđĕěėęēğÄġģĥħĭĩįīıĵķĺľļłńňņŋÅőŜĸŕřŗśÅšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'), + 'IS' => array(1 => '/^[\x{002d}0-9a-záéýúíóþæöð]{1,63}$/iu'), + 'IT' => array(1 => '/^[\x{002d}0-9a-zàâäèéêëìîïòôöùûüæœçÿß-]{1,63}$/iu'), + 'JP' => 'Hostname/Jp.php', + 'KR' => array(1 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu'), + 'LI' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'), + 'LT' => array(1 => '/^[\x{002d}0-9Ä…Äęėįšųūž]{1,63}$/iu'), + 'MD' => array(1 => '/^[\x{002d}0-9ăâîşţ]{1,63}$/iu'), + 'MUSEUM' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿÄăąćċÄÄđēėęěğġģħīįıķĺļľłńņňŋÅőœŕŗřśşšţťŧūůűųŵŷźżžǎÇÇ’Ç”\x{01E5}\x{01E7}\x{01E9}\x{01EF}É™\x{0292}áºáºƒáº…ỳ]{1,63}$/iu'), + 'NET' => 'Hostname/Com.php', + 'NO' => array(1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüÄđńŋšŧž]{1,63}$/iu'), + 'NU' => 'Hostname/Com.php', + 'ORG' => array(1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-zÄ…Äėęįšūųž]{1,63}$/iu', + 6 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 7 => '/^[\x{002d}0-9a-zÄÄēģīķļņÅŗšūž]{1,63}$/iu'), + 'PE' => array(1 => '/^[\x{002d}0-9a-zñáéíóúü]{1,63}$/iu'), + 'PL' => array(1 => '/^[\x{002d}0-9a-zÄÄēģīķļņÅŗšūž]{1,63}$/iu', + 2 => '/^[\x{002d}а-ик-ш\x{0450}ѓѕјљњќџ]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu', + 4 => '/^[\x{002d}0-9а-ÑÑ‘\x{04C2}]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-zàáâèéêìíîòóôùúûċġħż]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-zàäåæéêòóôöøü]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-zàáâãçéêíòóôõúü]{1,63}$/iu', + 9 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu', + 10=> '/^[\x{002d}0-9a-záäéíóôúýÄÄĺľňŕšťž]{1,63}$/iu', + 11=> '/^[\x{002d}0-9a-zçë]{1,63}$/iu', + 12=> '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu', + 13=> '/^[\x{002d}0-9a-zćÄđšž]{1,63}$/iu', + 14=> '/^[\x{002d}0-9a-zâçöûüğış]{1,63}$/iu', + 15=> '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 16=> '/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu', + 17=> '/^[\x{002d}0-9a-zĉÄĥĵÅÅ­]{1,63}$/iu', + 18=> '/^[\x{002d}0-9a-zâäéëîô]{1,63}$/iu', + 19=> '/^[\x{002d}0-9a-zàáâäåæçèéêëìíîïðñòôöøùúûüýćÄłńřśš]{1,63}$/iu', + 20=> '/^[\x{002d}0-9a-zäåæõöøüšž]{1,63}$/iu', + 21=> '/^[\x{002d}0-9a-zàáçèéìíòóùú]{1,63}$/iu', + 22=> '/^[\x{002d}0-9a-zàáéíóöúüőű]{1,63}$/iu', + 23=> '/^[\x{002d}0-9Îά-ÏŽ]{1,63}$/iu', + 24=> '/^[\x{002d}0-9a-zàáâåæçèéêëðóôöøüþœ]{1,63}$/iu', + 25=> '/^[\x{002d}0-9a-záäéíóöúüýÄÄěňřšťůž]{1,63}$/iu', + 26=> '/^[\x{002d}0-9a-z·àçèéíïòóúü]{1,63}$/iu', + 27=> '/^[\x{002d}0-9а-ъьюÑ\x{0450}\x{045D}]{1,63}$/iu', + 28=> '/^[\x{002d}0-9а-Ñёіў]{1,63}$/iu', + 29=> '/^[\x{002d}0-9a-zÄ…Äėęįšūųž]{1,63}$/iu', + 30=> '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu', + 31=> '/^[\x{002d}0-9a-zàâæçèéêëîïñôùûüÿœ]{1,63}$/iu', + 32=> '/^[\x{002d}0-9а-щъыьÑÑŽÑёєіїґ]{1,63}$/iu', + 33=> '/^[\x{002d}0-9×-ת]{1,63}$/iu'), + 'PR' => array(1 => '/^[\x{002d}0-9a-záéíóúñäëïüöâêîôûàèùæçœãõ]{1,63}$/iu'), + 'PT' => array(1 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu'), + 'RU' => array(1 => '/^[\x{002d}0-9а-ÑÑ‘]{1,63}$/iu'), + 'SA' => array(1 => '/^[\x{002d}.0-9\x{0621}-\x{063A}\x{0641}-\x{064A}\x{0660}-\x{0669}]{1,63}$/iu'), + 'SE' => array(1 => '/^[\x{002d}0-9a-zäåéöü]{1,63}$/iu'), + 'SH' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿăąÄćĉÄÄ‹ÄđĕěėęēğÄġģĥħĭĩįīıĵķĺľļłńňņŋÅőŜĸŕřŗśÅšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'), + 'SI' => array( + 1 => '/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋÅÅőœŕŗřśÅšťŧũūŭůűųŵŷźżž]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zșț]{1,63}$/iu'), + 'SJ' => array(1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüÄđńŋšŧž]{1,63}$/iu'), + 'TH' => array(1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'), + 'TM' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿÄăąćĉċÄÄđēėęěÄġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśÅşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'), + 'TW' => 'Hostname/Cn.php', + 'TR' => array(1 => '/^[\x{002d}0-9a-zğıüşöç]{1,63}$/iu'), + 'UA' => array(1 => '/^[\x{002d}0-9a-zабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑёђѓєѕіїјљњћќÑўџґӂʼ]{1,63}$/iu'), + 'VE' => array(1 => '/^[\x{002d}0-9a-záéíóúüñ]{1,63}$/iu'), + 'VN' => array(1 => '/^[ÀÃÂÃÈÉÊÌÃÒÓÔÕÙÚÃàáâãèéêìíòóôõùúýĂăÄđĨĩŨũƠơƯư\x{1EA0}-\x{1EF9}]{1,63}$/iu'), + 'мон' => array(1 => '/^[\x{002d}0-9\x{0430}-\x{044F}]{1,63}$/iu'), + 'Ñрб' => array(1 => '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu'), + 'Ñайт' => array(1 => '/^[\x{002d}0-9а-ÑёіїÑйўґг]{1,63}$/iu'), + 'онлайн' => array(1 => '/^[\x{002d}0-9а-ÑёіїÑйўґг]{1,63}$/iu'), + '中国' => 'Hostname/Cn.php', + '中國' => 'Hostname/Cn.php', + 'ලංකà·' => array(1 => '/^[\x{0d80}-\x{0dff}]{1,63}$/iu'), + '香港' => 'Hostname/Cn.php', + 'å°æ¹¾' => 'Hostname/Cn.php', + 'å°ç£' => 'Hostname/Cn.php', + 'امارات' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + 'الاردن' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + 'السعودية' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + 'ไทย' => array(1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'), + 'рф' => array(1 => '/^[\x{002d}0-9а-ÑÑ‘]{1,63}$/iu'), + 'تونس' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + 'مصر' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + 'இலஙà¯à®•ை' => array(1 => '/^[\x{0b80}-\x{0bff}]{1,63}$/iu'), + 'Ùلسطين' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + 'شبكة' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + ); + + protected $idnLength = array( + 'BIZ' => array(5 => 17, 11 => 15, 12 => 20), + 'CN' => array(1 => 20), + 'COM' => array(3 => 17, 5 => 20), + 'HK' => array(1 => 15), + 'INFO'=> array(4 => 17), + 'KR' => array(1 => 17), + 'NET' => array(3 => 17, 5 => 20), + 'ORG' => array(6 => 17), + 'TW' => array(1 => 20), + 'امارات' => array(1 => 30), + 'الاردن' => array(1 => 30), + 'السعودية' => array(1 => 30), + 'تونس' => array(1 => 30), + 'مصر' => array(1 => 30), + 'Ùلسطين' => array(1 => 30), + 'شبكة' => array(1 => 30), + '中国' => array(1 => 20), + '中國' => array(1 => 20), + '香港' => array(1 => 20), + 'å°æ¹¾' => array(1 => 20), + 'å°ç£' => array(1 => 20), + ); + + protected $tld; + + /** + * Options for the hostname validator + * + * @var array + */ + protected $options = array( + 'allow' => self::ALLOW_DNS, // Allow these hostnames + 'useIdnCheck' => true, // Check IDN domains + 'useTldCheck' => true, // Check TLD elements + 'ipValidator' => null, // IP validator to use + ); + + /** + * Sets validator options. + * + * @param int $allow OPTIONAL Set what types of hostname to allow (default ALLOW_DNS) + * @param bool $useIdnCheck OPTIONAL Set whether IDN domains are validated (default true) + * @param bool $useTldCheck Set whether the TLD element of a hostname is validated (default true) + * @param Ip $ipValidator OPTIONAL + * @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm Technical Specifications for ccTLDs + */ + public function __construct($options = array()) + { + if (!is_array($options)) { + $options = func_get_args(); + $temp['allow'] = array_shift($options); + if (!empty($options)) { + $temp['useIdnCheck'] = array_shift($options); + } + + if (!empty($options)) { + $temp['useTldCheck'] = array_shift($options); + } + + if (!empty($options)) { + $temp['ipValidator'] = array_shift($options); + } + + $options = $temp; + } + + if (!array_key_exists('ipValidator', $options)) { + $options['ipValidator'] = null; + } + + parent::__construct($options); + } + + /** + * Returns the set ip validator + * + * @return Ip + */ + public function getIpValidator() + { + return $this->options['ipValidator']; + } + + /** + * + * @param Ip $ipValidator OPTIONAL + * @return Hostname; + */ + public function setIpValidator(Ip $ipValidator = null) + { + if ($ipValidator === null) { + $ipValidator = new Ip(); + } + + $this->options['ipValidator'] = $ipValidator; + return $this; + } + + /** + * Returns the allow option + * + * @return int + */ + public function getAllow() + { + return $this->options['allow']; + } + + /** + * Sets the allow option + * + * @param int $allow + * @return Hostname Provides a fluent interface + */ + public function setAllow($allow) + { + $this->options['allow'] = $allow; + return $this; + } + + /** + * Returns the set idn option + * + * @return bool + */ + public function getIdnCheck() + { + return $this->options['useIdnCheck']; + } + + /** + * Set whether IDN domains are validated + * + * This only applies when DNS hostnames are validated + * + * @param bool $useIdnCheck Set to true to validate IDN domains + * @return Hostname + */ + public function useIdnCheck($useIdnCheck) + { + $this->options['useIdnCheck'] = (bool) $useIdnCheck; + return $this; + } + + /** + * Returns the set tld option + * + * @return bool + */ + public function getTldCheck() + { + return $this->options['useTldCheck']; + } + + /** + * Set whether the TLD element of a hostname is validated + * + * This only applies when DNS hostnames are validated + * + * @param bool $useTldCheck Set to true to validate TLD elements + * @return Hostname + */ + public function useTldCheck($useTldCheck) + { + $this->options['useTldCheck'] = (bool) $useTldCheck; + return $this; + } + + /** + * Defined by Interface + * + * Returns true if and only if the $value is a valid hostname with respect to the current allow option + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + // Check input against IP address schema + if (preg_match('/^[0-9a-f:.]*$/i', $value) && $this->getIpValidator() + ->setTranslator($this->getTranslator()) + ->isValid($value)) { + if (!($this->getAllow() & self::ALLOW_IP)) { + $this->error(self::IP_ADDRESS_NOT_ALLOWED); + return false; + } else { + return true; + } + } + + // Local hostnames are allowed to be partial (ending '.') + if ($this->getAllow() & self::ALLOW_LOCAL) { + if (substr($value, -1) === '.') { + $value = substr($value, 0, -1); + if (substr($value, -1) === '.') { + // Empty hostnames (ending '..') are not allowed + $this->error(self::INVALID_LOCAL_NAME); + return false; + } + } + } + + $domainParts = explode('.', $value); + + // Prevent partial IP V4 addresses (ending '.') + if ((count($domainParts) == 4) && preg_match('/^[0-9.a-e:.]*$/i', $value) && $this->getIpValidator() + ->setTranslator($this->getTranslator()) + ->isValid($value)) { + $this->error(self::INVALID_LOCAL_NAME); + } + + $utf8StrWrapper = StringUtils::getWrapper('UTF-8'); + + // Check input against DNS hostname schema + if ((count($domainParts) > 1) + && ($utf8StrWrapper->strlen($value) >= 4) + && ($utf8StrWrapper->strlen($value) <= 254)) + { + $status = false; + + do { + // First check TLD + $matches = array(); + if (preg_match('/([^.]{2,10})$/iu', end($domainParts), $matches) + || (array_key_exists(end($domainParts), $this->validIdns))) { + reset($domainParts); + + // Hostname characters are: *(label dot)(label dot label); max 254 chars + // label: id-prefix [*ldh{61} id-prefix]; max 63 chars + // id-prefix: alpha / digit + // ldh: alpha / digit / dash + + // Match TLD against known list + $this->tld = strtoupper($matches[1]); + if ($this->getTldCheck()) { + if (!in_array(strtolower($this->tld), $this->validTlds) + && !in_array($this->tld, $this->validTlds)) { + $this->error(self::UNKNOWN_TLD); + $status = false; + break; + } + // We have already validated that the TLD is fine. We don't want it to go through the below + // checks as new UTF-8 TLDs will incorrectly fail if there is no IDN regex for it. + array_pop($domainParts); + } + + /** + * Match against IDN hostnames + * Note: Keep label regex short to avoid issues with long patterns when matching IDN hostnames + * + * @see Hostname\Interface + */ + $regexChars = array(0 => '/^[a-z0-9\x2d]{1,63}$/i'); + if ($this->getIdnCheck() && isset($this->validIdns[$this->tld])) { + if (is_string($this->validIdns[$this->tld])) { + $regexChars += include __DIR__ . '/' . $this->validIdns[$this->tld]; + } else { + $regexChars += $this->validIdns[$this->tld]; + } + } + + // Check each hostname part + $check = 0; + foreach ($domainParts as $domainPart) { + // Decode Punycode domain names to IDN + if (strpos($domainPart, 'xn--') === 0) { + $domainPart = $this->decodePunycode(substr($domainPart, 4)); + if ($domainPart === false) { + return false; + } + } + + // Check dash (-) does not start, end or appear in 3rd and 4th positions + if (($utf8StrWrapper->strpos($domainPart, '-') === 0) + || (($utf8StrWrapper->strlen($domainPart) > 2) && ($utf8StrWrapper->strpos($domainPart, '-', 2) == 2) && ($utf8StrWrapper->strpos($domainPart, '-', 3) == 3)) + || ($utf8StrWrapper->strpos($domainPart, '-') === ($utf8StrWrapper->strlen($domainPart) - 1))) { + $this->error(self::INVALID_DASH); + $status = false; + break 2; + } + + // Check each domain part + $checked = false; + foreach ($regexChars as $regexKey => $regexChar) { + ErrorHandler::start(); + $status = preg_match($regexChar, $domainPart); + ErrorHandler::stop(); + if ($status > 0) { + $length = 63; + if (array_key_exists($this->tld, $this->idnLength) + && (array_key_exists($regexKey, $this->idnLength[$this->tld]))) { + $length = $this->idnLength[$this->tld]; + } + + if ($utf8StrWrapper->strlen($domainPart) > $length) { + $this->error(self::INVALID_HOSTNAME); + $status = false; + } else { + $checked = true; + break; + } + } + } + + if ($checked) { + ++$check; + } + } + + // If one of the labels doesn't match, the hostname is invalid + if ($check !== count($domainParts)) { + $this->error(self::INVALID_HOSTNAME_SCHEMA); + $status = false; + } + } else { + // Hostname not long enough + $this->error(self::UNDECIPHERABLE_TLD); + $status = false; + } + } while (false); + + // If the input passes as an Internet domain name, and domain names are allowed, then the hostname + // passes validation + if ($status && ($this->getAllow() & self::ALLOW_DNS)) { + return true; + } + } elseif ($this->getAllow() & self::ALLOW_DNS) { + $this->error(self::INVALID_HOSTNAME); + $status = false; + } + + // Check for URI Syntax (RFC3986) + if ($this->getAllow() & self::ALLOW_URI) { + if (preg_match("/^([a-zA-Z0-9-._~!$&\'()*+,;=]|%[[:xdigit:]]{2}){1,254}$/i", $value)) { + return true; + } else { + $this->error(self::INVALID_URI); + } + } + + // Check input against local network name schema; last chance to pass validation + ErrorHandler::start(); + $regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}[\x2e]{0,1}){1,254}$/'; + $status = preg_match($regexLocal, $value); + ErrorHandler::stop(); + + // If the input passes as a local network name, and local network names are allowed, then the + // hostname passes validation + $allowLocal = $this->getAllow() & self::ALLOW_LOCAL; + if ($status && $allowLocal) { + return true; + } + + // If the input does not pass as a local network name, add a message + if (!$status) { + $this->error(self::INVALID_LOCAL_NAME); + } + + // If local network names are not allowed, add a message + if ($status && !$allowLocal) { + $this->error(self::LOCAL_NAME_NOT_ALLOWED); + } + + return false; + } + + /** + * Decodes a punycode encoded string to it's original utf8 string + * Returns false in case of a decoding failure. + * + * @param string $encoded Punycode encoded string to decode + * @return string|false + */ + protected function decodePunycode($encoded) + { + if (!preg_match('/^[a-z0-9-]+$/i', $encoded)) { + // no punycode encoded string + $this->error(self::CANNOT_DECODE_PUNYCODE); + return false; + } + + $decoded = array(); + $separator = strrpos($encoded, '-'); + if ($separator > 0) { + for ($x = 0; $x < $separator; ++$x) { + // prepare decoding matrix + $decoded[] = ord($encoded[$x]); + } + } + + $lengthd = count($decoded); + $lengthe = strlen($encoded); + + // decoding + $init = true; + $base = 72; + $index = 0; + $char = 0x80; + + for ($indexe = ($separator) ? ($separator + 1) : 0; $indexe < $lengthe; ++$lengthd) { + for ($oldIndex = $index, $pos = 1, $key = 36; 1; $key += 36) { + $hex = ord($encoded[$indexe++]); + $digit = ($hex - 48 < 10) ? $hex - 22 + : (($hex - 65 < 26) ? $hex - 65 + : (($hex - 97 < 26) ? $hex - 97 + : 36)); + + $index += $digit * $pos; + $tag = ($key <= $base) ? 1 : (($key >= $base + 26) ? 26 : ($key - $base)); + if ($digit < $tag) { + break; + } + + $pos = (int) ($pos * (36 - $tag)); + } + + $delta = intval($init ? (($index - $oldIndex) / 700) : (($index - $oldIndex) / 2)); + $delta += intval($delta / ($lengthd + 1)); + for ($key = 0; $delta > 910 / 2; $key += 36) { + $delta = intval($delta / 35); + } + + $base = intval($key + 36 * $delta / ($delta + 38)); + $init = false; + $char += (int) ($index / ($lengthd + 1)); + $index %= ($lengthd + 1); + if ($lengthd > 0) { + for ($i = $lengthd; $i > $index; $i--) { + $decoded[$i] = $decoded[($i - 1)]; + } + } + + $decoded[$index++] = $char; + } + + // convert decoded ucs4 to utf8 string + foreach ($decoded as $key => $value) { + if ($value < 128) { + $decoded[$key] = chr($value); + } elseif ($value < (1 << 11)) { + $decoded[$key] = chr(192 + ($value >> 6)); + $decoded[$key] .= chr(128 + ($value & 63)); + } elseif ($value < (1 << 16)) { + $decoded[$key] = chr(224 + ($value >> 12)); + $decoded[$key] .= chr(128 + (($value >> 6) & 63)); + $decoded[$key] .= chr(128 + ($value & 63)); + } elseif ($value < (1 << 21)) { + $decoded[$key] = chr(240 + ($value >> 18)); + $decoded[$key] .= chr(128 + (($value >> 12) & 63)); + $decoded[$key] .= chr(128 + (($value >> 6) & 63)); + $decoded[$key] .= chr(128 + ($value & 63)); + } else { + $this->error(self::CANNOT_DECODE_PUNYCODE); + return false; + } + } + + return implode($decoded); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Biz.php b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Biz.php new file mode 100644 index 0000000000..cadf8e3f7b --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Biz.php @@ -0,0 +1,2903 @@ + '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu', + 5 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 6 => '/^[\x{002d}0-9a-zÄ…Äėęįšūųž]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zÄÄēģīķļņÅŗšūž]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüÄđńŋšŧž]{1,63}$/iu', + 9 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 10 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu', + 11 => '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}\x{30A1}-\x{30F6}\x{30FC}' . + '\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . + '\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}' . + '\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}' . + '\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}' . + '\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}' . + '\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}' . + '\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}' . + '\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}' . + '\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}' . + '\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}' . + '\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}' . + '\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}' . + '\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}' . + '\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}' . + '\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}' . + '\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}' . + '\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}' . + '\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}' . + '\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}' . + '\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}' . + '\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}' . + '\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}' . + '\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}' . + '\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}' . + '\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}' . + '\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}' . + '\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}' . + '\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}' . + '\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}' . + '\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}' . + '\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}' . + '\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}' . + '\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}' . + '\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}' . + '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . + '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}' . + '\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}' . + '\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}' . + '\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}' . + '\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}' . + '\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}' . + '\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}' . + '\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}' . + '\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}' . + '\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}' . + '\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}' . + '\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}' . + '\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}' . + '\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}' . + '\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}' . + '\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}' . + '\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}' . + '\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}' . + '\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}' . + '\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}' . + '\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}' . + '\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}' . + '\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}' . + '\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}' . + '\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}' . + '\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}' . + '\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}' . + '\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}' . + '\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}' . + '\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}' . + '\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}' . + '\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}' . + '\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}' . + '\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}' . + '\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}' . + '\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}' . + '\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}' . + '\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}' . + '\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}' . + '\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}' . + '\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}' . + '\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}' . + '\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}' . + '\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}' . + '\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}' . + '\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}' . + '\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}' . + '\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}' . + '\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}' . + '\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}' . + '\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}' . + '\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}' . + '\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}' . + '\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}' . + '\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}' . + '\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}' . + '\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}' . + '\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}' . + '\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}' . + '\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}' . + '\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}' . + '\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}' . + '\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}' . + '\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}' . + '\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}' . + '\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}' . + '\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}' . + '\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}' . + '\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}' . + '\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}' . + '\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}' . + '\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}' . + '\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}' . + '\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}' . + '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}' . + '\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}' . + '\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}' . + '\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}' . + '\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}' . + '\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}' . + '\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}' . + '\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}' . + '\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}' . + '\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}' . + '\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}' . + '\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}' . + '\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}' . + '\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}' . + '\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}' . + '\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}' . + '\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}' . + '\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}' . + '\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}' . + '\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}' . + '\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}' . + '\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}' . + '\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}' . + '\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}' . + '\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}' . + '\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}' . + '\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}' . + '\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}' . + '\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}' . + '\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}' . + '\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}' . + '\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}' . + '\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}' . + '\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}' . + '\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}' . + '\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}' . + '\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}' . + '\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}' . + '\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}' . + '\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}' . + '\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}' . + '\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}' . + '\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}' . + '\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}' . + '\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}' . + '\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}' . + '\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}' . + '\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}' . + '\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}' . + '\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}' . + '\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}' . + '\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}' . + '\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}' . + '\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}' . + '\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}' . + '\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}' . + '\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}' . + '\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}' . + '\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}' . + '\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}' . + '\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}' . + '\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}' . + '\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}' . + '\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}' . + '\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}' . + '\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}' . + '\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}' . + '\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}' . + '\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}' . + '\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}' . + '\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}' . + '\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}' . + '\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}' . + '\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}' . + '\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}' . + '\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}' . + '\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}' . + '\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}' . + '\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}' . + '\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}' . + '\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}' . + '\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}' . + '\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}' . + '\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}' . + '\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}' . + '\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}' . + '\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}' . + '\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . + '\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}' . + '\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}' . + '\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}' . + '\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}' . + '\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}' . + '\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}' . + '\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}' . + '\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}' . + '\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}' . + '\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}' . + '\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}' . + '\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}' . + '\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}' . + '\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}' . + '\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}' . + '\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}' . + '\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}' . + '\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}' . + '\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}' . + '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}' . + '\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}' . + '\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}' . + '\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}' . + '\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}' . + '\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}' . + '\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}' . + '\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}' . + '\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}' . + '\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}' . + '\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}' . + '\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}' . + '\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}' . + '\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}' . + '\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}' . + '\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}' . + '\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}' . + '\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}' . + '\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}' . + '\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}' . + '\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}' . + '\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}' . + '\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}' . + '\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}' . + '\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}' . + '\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}' . + '\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}' . + '\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}' . + '\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}' . + '\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}' . + '\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}' . + '\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}' . + '\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}' . + '\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}' . + '\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}' . + '\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}' . + '\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . + '\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}' . + '\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}' . + '\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}' . + '\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}' . + '\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}' . + '\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}' . + '\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}' . + '\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}' . + '\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}' . + '\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}' . + '\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}' . + '\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}' . + '\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}' . + '\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}' . + '\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}' . + '\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}' . + '\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}' . + '\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}' . + '\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}' . + '\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}' . + '\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}' . + '\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}' . + '\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}' . + '\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}' . + '\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}' . + '\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}' . + '\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}' . + '\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}' . + '\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}' . + '\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}' . + '\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}' . + '\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}' . + '\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}' . + '\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}' . + '\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}' . + '\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}' . + '\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}' . + '\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}' . + '\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}' . + '\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}' . + '\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}' . + '\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}' . + '\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}' . + '\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}' . + '\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}' . + '\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}' . + '\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}' . + '\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}' . + '\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}' . + '\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}' . + '\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}' . + '\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}' . + '\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}' . + '\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}' . + '\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}' . + '\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}' . + '\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}' . + '\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}' . + '\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}' . + '\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}' . + '\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}' . + '\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}' . + '\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}' . + '\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}' . + '\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}' . + '\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}' . + '\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}' . + '\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}' . + '\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}' . + '\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}' . + '\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}' . + '\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}' . + '\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}' . + '\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}' . + '\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}' . + '\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}' . + '\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}' . + '\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}' . + '\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}' . + '\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}' . + '\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}' . + '\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}' . + '\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}' . + '\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}' . + '\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}' . + '\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}' . + '\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}' . + '\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}' . + '\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}' . + '\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}' . + '\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}' . + '\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}' . + '\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}' . + '\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}' . + '\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}' . + '\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}' . + '\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}' . + '\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}' . + '\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}' . + '\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}' . + '\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}' . + '\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}' . + '\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}' . + '\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}' . + '\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}' . + '\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}' . + '\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}' . + '\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}' . + '\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}' . + '\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}' . + '\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}' . + '\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}' . + '\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}' . + '\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}' . + '\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}' . + '\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}' . + '\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}' . + '\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}' . + '\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}' . + '\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}' . + '\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}' . + '\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}' . + '\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}' . + '\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}' . + '\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}' . + '\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}' . + '\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}' . + '\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}' . + '\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}' . + '\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}' . + '\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}' . + '\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}' . + '\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}' . + '\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}' . + '\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}' . + '\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}' . + '\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}' . + '\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}' . + '\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}' . + '\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}' . + '\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}' . + '\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}' . + '\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}' . + '\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}' . + '\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}' . + '\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}' . + '\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}' . + '\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}' . + '\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}' . + '\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}' . + '\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}' . + '\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}' . + '\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}' . + '\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}' . + '\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}' . + '\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}' . + '\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}' . + '\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . + '\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}' . + '\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}' . + '\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}' . + '\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}' . + '\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}' . + '\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}' . + '\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}' . + '\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}' . + '\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}' . + '\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}' . + '\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}' . + '\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}' . + '\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}' . + '\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}' . + '\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}' . + '\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}' . + '\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}' . + '\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}' . + '\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}' . + '\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}' . + '\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}' . + '\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}' . + '\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}' . + '\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}' . + '\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}' . + '\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}' . + '\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}' . + '\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}' . + '\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}' . + '\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}' . + '\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}' . + '\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}' . + '\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}' . + '\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}' . + '\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}' . + '\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}' . + '\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}' . + '\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}' . + '\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}' . + '\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}' . + '\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}' . + '\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}' . + '\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}' . + '\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}' . + '\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}' . + '\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}' . + '\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}' . + '\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}' . + '\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}' . + '\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}' . + '\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}' . + '\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}' . + '\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}' . + '\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}' . + '\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}' . + '\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}' . + '\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}' . + '\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}' . + '\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}' . + '\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}' . + '\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}' . + '\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}' . + '\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}' . + '\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}' . + '\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}' . + '\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}' . + '\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}' . + '\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}' . + '\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}' . + '\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}' . + '\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}' . + '\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}' . + '\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}' . + '\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}' . + '\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}' . + '\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}' . + '\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}' . + '\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}' . + '\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}' . + '\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}' . + '\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}' . + '\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}' . + '\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}' . + '\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}' . + '\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}' . + '\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}' . + '\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}' . + '\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}' . + '\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}' . + '\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}' . + '\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}' . + '\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}' . + '\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}' . + '\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}' . + '\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}' . + '\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}' . + '\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}' . + '\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}' . + '\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}' . + '\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}' . + '\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}' . + '\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}' . + '\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}' . + '\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}' . + '\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}' . + '\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}' . + '\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}' . + '\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}' . + '\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}' . + '\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}' . + '\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}' . + '\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}' . + '\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}' . + '\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}' . + '\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}' . + '\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}' . + '\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}' . + '\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}' . + '\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}' . + '\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}' . + '\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}' . + '\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}' . + '\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}' . + '\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}' . + '\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}' . + '\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}' . + '\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}' . + '\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}' . + '\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}' . + '\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}' . + '\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}' . + '\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}' . + '\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}' . + '\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}' . + '\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}' . + '\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}' . + '\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}' . + '\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}' . + '\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}' . + '\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}' . + '\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}' . + '\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}' . + '\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}' . + '\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}' . + '\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}' . + '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}' . + '\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}' . + '\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}' . + '\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}' . + '\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}' . + '\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}' . + '\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}' . + '\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}' . + '\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}' . + '\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}' . + '\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}' . + '\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}' . + '\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}' . + '\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}' . + '\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}' . + '\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}' . + '\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}' . + '\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}' . + '\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}' . + '\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}' . + '\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}' . + '\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}' . + '\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}' . + '\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}' . + '\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}' . + '\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}' . + '\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}' . + '\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}' . + '\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}' . + '\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}' . + '\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}' . + '\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}' . + '\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}' . + '\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}' . + '\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}' . + '\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}' . + '\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}' . + '\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}' . + '\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}' . + '\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}' . + '\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}' . + '\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}' . + '\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}' . + '\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}' . + '\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}' . + '\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}' . + '\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}' . + '\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}' . + '\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}' . + '\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}' . + '\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}' . + '\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}' . + '\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}' . + '\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}' . + '\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}' . + '\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}' . + '\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}' . + '\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}' . + '\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}' . + '\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}' . + '\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}' . + '\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}' . + '\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}' . + '\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}' . + '\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}' . + '\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}' . + '\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}' . + '\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}' . + '\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}' . + '\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}' . + '\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}' . + '\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}' . + '\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}' . + '\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}' . + '\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}' . + '\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}' . + '\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}' . + '\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}' . + '\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}' . + '\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}' . + '\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}' . + '\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}' . + '\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}' . + '\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}' . + '\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}' . + '\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}' . + '\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}' . + '\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}' . + '\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}' . + '\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}' . + '\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}' . + '\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}' . + '\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}' . + '\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}' . + '\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}' . + '\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}' . + '\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}' . + '\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}' . + '\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}' . + '\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}' . + '\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}' . + '\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}' . + '\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}' . + '\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}' . + '\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}' . + '\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}' . + '\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}' . + '\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}' . + '\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}' . + '\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}' . + '\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}' . + '\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}' . + '\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}' . + '\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}' . + '\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}' . + '\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}' . + '\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}' . + '\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}' . + '\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}' . + '\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}' . + '\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}' . + '\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}' . + '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}' . + '\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}' . + '\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}' . + '\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}' . + '\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}' . + '\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}' . + '\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}' . + '\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}' . + '\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}' . + '\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}' . + '\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}' . + '\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . + '\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}' . + '\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}' . + '\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}' . + '\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}' . + '\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}' . + '\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}' . + '\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}' . + '\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}' . + '\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}' . + '\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}' . + '\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}' . + '\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}' . + '\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}' . + '\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}' . + '\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}' . + '\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}' . + '\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu', + 12 => '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' . + '\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}' . + '\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}' . + '\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}' . + '\x{49B6}\x{49B7}\x{4C77}\x{4C9F}\x{4CA0}\x{4CA1}\x{4CA2}\x{4CA3}\x{4D13}' . + '\x{4D14}\x{4D15}\x{4D16}\x{4D17}\x{4D18}\x{4D19}\x{4DAE}\x{4E00}\x{4E01}' . + '\x{4E02}\x{4E03}\x{4E04}\x{4E05}\x{4E06}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . + '\x{4E0B}\x{4E0C}\x{4E0D}\x{4E0E}\x{4E0F}\x{4E10}\x{4E11}\x{4E13}\x{4E14}' . + '\x{4E15}\x{4E16}\x{4E17}\x{4E18}\x{4E19}\x{4E1A}\x{4E1B}\x{4E1C}\x{4E1D}' . + '\x{4E1E}\x{4E1F}\x{4E20}\x{4E21}\x{4E22}\x{4E23}\x{4E24}\x{4E25}\x{4E26}' . + '\x{4E27}\x{4E28}\x{4E2A}\x{4E2B}\x{4E2C}\x{4E2D}\x{4E2E}\x{4E2F}\x{4E30}' . + '\x{4E31}\x{4E32}\x{4E33}\x{4E34}\x{4E35}\x{4E36}\x{4E37}\x{4E38}\x{4E39}' . + '\x{4E3A}\x{4E3B}\x{4E3C}\x{4E3D}\x{4E3E}\x{4E3F}\x{4E40}\x{4E41}\x{4E42}' . + '\x{4E43}\x{4E44}\x{4E45}\x{4E46}\x{4E47}\x{4E48}\x{4E49}\x{4E4A}\x{4E4B}' . + '\x{4E4C}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E50}\x{4E51}\x{4E52}\x{4E53}\x{4E54}' . + '\x{4E56}\x{4E57}\x{4E58}\x{4E59}\x{4E5A}\x{4E5B}\x{4E5C}\x{4E5D}\x{4E5E}' . + '\x{4E5F}\x{4E60}\x{4E61}\x{4E62}\x{4E63}\x{4E64}\x{4E65}\x{4E66}\x{4E67}' . + '\x{4E69}\x{4E6A}\x{4E6B}\x{4E6C}\x{4E6D}\x{4E6E}\x{4E6F}\x{4E70}\x{4E71}' . + '\x{4E72}\x{4E73}\x{4E74}\x{4E75}\x{4E76}\x{4E77}\x{4E78}\x{4E7A}\x{4E7B}' . + '\x{4E7C}\x{4E7D}\x{4E7E}\x{4E7F}\x{4E80}\x{4E81}\x{4E82}\x{4E83}\x{4E84}' . + '\x{4E85}\x{4E86}\x{4E87}\x{4E88}\x{4E89}\x{4E8B}\x{4E8C}\x{4E8D}\x{4E8E}' . + '\x{4E8F}\x{4E90}\x{4E91}\x{4E92}\x{4E93}\x{4E94}\x{4E95}\x{4E97}\x{4E98}' . + '\x{4E99}\x{4E9A}\x{4E9B}\x{4E9C}\x{4E9D}\x{4E9E}\x{4E9F}\x{4EA0}\x{4EA1}' . + '\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA7}\x{4EA8}\x{4EA9}\x{4EAA}\x{4EAB}' . + '\x{4EAC}\x{4EAD}\x{4EAE}\x{4EAF}\x{4EB0}\x{4EB1}\x{4EB2}\x{4EB3}\x{4EB4}' . + '\x{4EB5}\x{4EB6}\x{4EB7}\x{4EB8}\x{4EB9}\x{4EBA}\x{4EBB}\x{4EBD}\x{4EBE}' . + '\x{4EBF}\x{4EC0}\x{4EC1}\x{4EC2}\x{4EC3}\x{4EC4}\x{4EC5}\x{4EC6}\x{4EC7}' . + '\x{4EC8}\x{4EC9}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED0}\x{4ED1}' . + '\x{4ED2}\x{4ED3}\x{4ED4}\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDA}' . + '\x{4EDB}\x{4EDC}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE0}\x{4EE1}\x{4EE2}\x{4EE3}' . + '\x{4EE4}\x{4EE5}\x{4EE6}\x{4EE8}\x{4EE9}\x{4EEA}\x{4EEB}\x{4EEC}\x{4EEF}' . + '\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EFB}' . + '\x{4EFD}\x{4EFF}\x{4F00}\x{4F01}\x{4F02}\x{4F03}\x{4F04}\x{4F05}\x{4F06}' . + '\x{4F08}\x{4F09}\x{4F0A}\x{4F0B}\x{4F0C}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}' . + '\x{4F11}\x{4F12}\x{4F13}\x{4F14}\x{4F15}\x{4F17}\x{4F18}\x{4F19}\x{4F1A}' . + '\x{4F1B}\x{4F1C}\x{4F1D}\x{4F1E}\x{4F1F}\x{4F20}\x{4F21}\x{4F22}\x{4F23}' . + '\x{4F24}\x{4F25}\x{4F26}\x{4F27}\x{4F29}\x{4F2A}\x{4F2B}\x{4F2C}\x{4F2D}' . + '\x{4F2E}\x{4F2F}\x{4F30}\x{4F32}\x{4F33}\x{4F34}\x{4F36}\x{4F38}\x{4F39}' . + '\x{4F3A}\x{4F3B}\x{4F3C}\x{4F3D}\x{4F3E}\x{4F3F}\x{4F41}\x{4F42}\x{4F43}' . + '\x{4F45}\x{4F46}\x{4F47}\x{4F48}\x{4F49}\x{4F4A}\x{4F4B}\x{4F4C}\x{4F4D}' . + '\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}\x{4F52}\x{4F53}\x{4F54}\x{4F55}\x{4F56}' . + '\x{4F57}\x{4F58}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}\x{4F5F}' . + '\x{4F60}\x{4F61}\x{4F62}\x{4F63}\x{4F64}\x{4F65}\x{4F66}\x{4F67}\x{4F68}' . + '\x{4F69}\x{4F6A}\x{4F6B}\x{4F6C}\x{4F6D}\x{4F6E}\x{4F6F}\x{4F70}\x{4F72}' . + '\x{4F73}\x{4F74}\x{4F75}\x{4F76}\x{4F77}\x{4F78}\x{4F79}\x{4F7A}\x{4F7B}' . + '\x{4F7C}\x{4F7D}\x{4F7E}\x{4F7F}\x{4F80}\x{4F81}\x{4F82}\x{4F83}\x{4F84}' . + '\x{4F85}\x{4F86}\x{4F87}\x{4F88}\x{4F89}\x{4F8A}\x{4F8B}\x{4F8D}\x{4F8F}' . + '\x{4F90}\x{4F91}\x{4F92}\x{4F93}\x{4F94}\x{4F95}\x{4F96}\x{4F97}\x{4F98}' . + '\x{4F99}\x{4F9A}\x{4F9B}\x{4F9C}\x{4F9D}\x{4F9E}\x{4F9F}\x{4FA0}\x{4FA1}' . + '\x{4FA3}\x{4FA4}\x{4FA5}\x{4FA6}\x{4FA7}\x{4FA8}\x{4FA9}\x{4FAA}\x{4FAB}' . + '\x{4FAC}\x{4FAE}\x{4FAF}\x{4FB0}\x{4FB1}\x{4FB2}\x{4FB3}\x{4FB4}\x{4FB5}' . + '\x{4FB6}\x{4FB7}\x{4FB8}\x{4FB9}\x{4FBA}\x{4FBB}\x{4FBC}\x{4FBE}\x{4FBF}' . + '\x{4FC0}\x{4FC1}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FC5}\x{4FC7}\x{4FC9}\x{4FCA}' . + '\x{4FCB}\x{4FCD}\x{4FCE}\x{4FCF}\x{4FD0}\x{4FD1}\x{4FD2}\x{4FD3}\x{4FD4}' . + '\x{4FD5}\x{4FD6}\x{4FD7}\x{4FD8}\x{4FD9}\x{4FDA}\x{4FDB}\x{4FDC}\x{4FDD}' . + '\x{4FDE}\x{4FDF}\x{4FE0}\x{4FE1}\x{4FE3}\x{4FE4}\x{4FE5}\x{4FE6}\x{4FE7}' . + '\x{4FE8}\x{4FE9}\x{4FEA}\x{4FEB}\x{4FEC}\x{4FED}\x{4FEE}\x{4FEF}\x{4FF0}' . + '\x{4FF1}\x{4FF2}\x{4FF3}\x{4FF4}\x{4FF5}\x{4FF6}\x{4FF7}\x{4FF8}\x{4FF9}' . + '\x{4FFA}\x{4FFB}\x{4FFE}\x{4FFF}\x{5000}\x{5001}\x{5002}\x{5003}\x{5004}' . + '\x{5005}\x{5006}\x{5007}\x{5008}\x{5009}\x{500A}\x{500B}\x{500C}\x{500D}' . + '\x{500E}\x{500F}\x{5011}\x{5012}\x{5013}\x{5014}\x{5015}\x{5016}\x{5017}' . + '\x{5018}\x{5019}\x{501A}\x{501B}\x{501C}\x{501D}\x{501E}\x{501F}\x{5020}' . + '\x{5021}\x{5022}\x{5023}\x{5024}\x{5025}\x{5026}\x{5027}\x{5028}\x{5029}' . + '\x{502A}\x{502B}\x{502C}\x{502D}\x{502E}\x{502F}\x{5030}\x{5031}\x{5032}' . + '\x{5033}\x{5035}\x{5036}\x{5037}\x{5039}\x{503A}\x{503B}\x{503C}\x{503E}' . + '\x{503F}\x{5040}\x{5041}\x{5043}\x{5044}\x{5045}\x{5046}\x{5047}\x{5048}' . + '\x{5049}\x{504A}\x{504B}\x{504C}\x{504D}\x{504E}\x{504F}\x{5051}\x{5053}' . + '\x{5054}\x{5055}\x{5056}\x{5057}\x{5059}\x{505A}\x{505B}\x{505C}\x{505D}' . + '\x{505E}\x{505F}\x{5060}\x{5061}\x{5062}\x{5063}\x{5064}\x{5065}\x{5066}' . + '\x{5067}\x{5068}\x{5069}\x{506A}\x{506B}\x{506C}\x{506D}\x{506E}\x{506F}' . + '\x{5070}\x{5071}\x{5072}\x{5073}\x{5074}\x{5075}\x{5076}\x{5077}\x{5078}' . + '\x{5079}\x{507A}\x{507B}\x{507D}\x{507E}\x{507F}\x{5080}\x{5082}\x{5083}' . + '\x{5084}\x{5085}\x{5086}\x{5087}\x{5088}\x{5089}\x{508A}\x{508B}\x{508C}' . + '\x{508D}\x{508E}\x{508F}\x{5090}\x{5091}\x{5092}\x{5094}\x{5095}\x{5096}' . + '\x{5098}\x{5099}\x{509A}\x{509B}\x{509C}\x{509D}\x{509E}\x{50A2}\x{50A3}' . + '\x{50A4}\x{50A5}\x{50A6}\x{50A7}\x{50A8}\x{50A9}\x{50AA}\x{50AB}\x{50AC}' . + '\x{50AD}\x{50AE}\x{50AF}\x{50B0}\x{50B1}\x{50B2}\x{50B3}\x{50B4}\x{50B5}' . + '\x{50B6}\x{50B7}\x{50B8}\x{50BA}\x{50BB}\x{50BC}\x{50BD}\x{50BE}\x{50BF}' . + '\x{50C0}\x{50C1}\x{50C2}\x{50C4}\x{50C5}\x{50C6}\x{50C7}\x{50C8}\x{50C9}' . + '\x{50CA}\x{50CB}\x{50CC}\x{50CD}\x{50CE}\x{50CF}\x{50D0}\x{50D1}\x{50D2}' . + '\x{50D3}\x{50D4}\x{50D5}\x{50D6}\x{50D7}\x{50D9}\x{50DA}\x{50DB}\x{50DC}' . + '\x{50DD}\x{50DE}\x{50E0}\x{50E3}\x{50E4}\x{50E5}\x{50E6}\x{50E7}\x{50E8}' . + '\x{50E9}\x{50EA}\x{50EC}\x{50ED}\x{50EE}\x{50EF}\x{50F0}\x{50F1}\x{50F2}' . + '\x{50F3}\x{50F5}\x{50F6}\x{50F8}\x{50F9}\x{50FA}\x{50FB}\x{50FC}\x{50FD}' . + '\x{50FE}\x{50FF}\x{5100}\x{5101}\x{5102}\x{5103}\x{5104}\x{5105}\x{5106}' . + '\x{5107}\x{5108}\x{5109}\x{510A}\x{510B}\x{510C}\x{510D}\x{510E}\x{510F}' . + '\x{5110}\x{5111}\x{5112}\x{5113}\x{5114}\x{5115}\x{5116}\x{5117}\x{5118}' . + '\x{5119}\x{511A}\x{511C}\x{511D}\x{511E}\x{511F}\x{5120}\x{5121}\x{5122}' . + '\x{5123}\x{5124}\x{5125}\x{5126}\x{5127}\x{5129}\x{512A}\x{512C}\x{512D}' . + '\x{512E}\x{512F}\x{5130}\x{5131}\x{5132}\x{5133}\x{5134}\x{5135}\x{5136}' . + '\x{5137}\x{5138}\x{5139}\x{513A}\x{513B}\x{513C}\x{513D}\x{513E}\x{513F}' . + '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . + '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5151}\x{5152}\x{5154}\x{5155}' . + '\x{5156}\x{5157}\x{5159}\x{515A}\x{515B}\x{515C}\x{515D}\x{515E}\x{515F}' . + '\x{5161}\x{5162}\x{5163}\x{5165}\x{5166}\x{5167}\x{5168}\x{5169}\x{516A}' . + '\x{516B}\x{516C}\x{516D}\x{516E}\x{516F}\x{5170}\x{5171}\x{5173}\x{5174}' . + '\x{5175}\x{5176}\x{5177}\x{5178}\x{5179}\x{517A}\x{517B}\x{517C}\x{517D}' . + '\x{517F}\x{5180}\x{5181}\x{5182}\x{5185}\x{5186}\x{5187}\x{5188}\x{5189}' . + '\x{518A}\x{518B}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}\x{5193}' . + '\x{5194}\x{5195}\x{5196}\x{5197}\x{5198}\x{5199}\x{519A}\x{519B}\x{519C}' . + '\x{519D}\x{519E}\x{519F}\x{51A0}\x{51A2}\x{51A4}\x{51A5}\x{51A6}\x{51A7}' . + '\x{51A8}\x{51AA}\x{51AB}\x{51AC}\x{51AE}\x{51AF}\x{51B0}\x{51B1}\x{51B2}' . + '\x{51B3}\x{51B5}\x{51B6}\x{51B7}\x{51B9}\x{51BB}\x{51BC}\x{51BD}\x{51BE}' . + '\x{51BF}\x{51C0}\x{51C1}\x{51C3}\x{51C4}\x{51C5}\x{51C6}\x{51C7}\x{51C8}' . + '\x{51C9}\x{51CA}\x{51CB}\x{51CC}\x{51CD}\x{51CE}\x{51CF}\x{51D0}\x{51D1}' . + '\x{51D4}\x{51D5}\x{51D6}\x{51D7}\x{51D8}\x{51D9}\x{51DA}\x{51DB}\x{51DC}' . + '\x{51DD}\x{51DE}\x{51E0}\x{51E1}\x{51E2}\x{51E3}\x{51E4}\x{51E5}\x{51E7}' . + '\x{51E8}\x{51E9}\x{51EA}\x{51EB}\x{51ED}\x{51EF}\x{51F0}\x{51F1}\x{51F3}' . + '\x{51F4}\x{51F5}\x{51F6}\x{51F7}\x{51F8}\x{51F9}\x{51FA}\x{51FB}\x{51FC}' . + '\x{51FD}\x{51FE}\x{51FF}\x{5200}\x{5201}\x{5202}\x{5203}\x{5204}\x{5205}' . + '\x{5206}\x{5207}\x{5208}\x{5209}\x{520A}\x{520B}\x{520C}\x{520D}\x{520E}' . + '\x{520F}\x{5210}\x{5211}\x{5212}\x{5213}\x{5214}\x{5215}\x{5216}\x{5217}' . + '\x{5218}\x{5219}\x{521A}\x{521B}\x{521C}\x{521D}\x{521E}\x{521F}\x{5220}' . + '\x{5221}\x{5222}\x{5223}\x{5224}\x{5225}\x{5226}\x{5228}\x{5229}\x{522A}' . + '\x{522B}\x{522C}\x{522D}\x{522E}\x{522F}\x{5230}\x{5231}\x{5232}\x{5233}' . + '\x{5234}\x{5235}\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{523C}' . + '\x{523D}\x{523E}\x{523F}\x{5240}\x{5241}\x{5242}\x{5243}\x{5244}\x{5245}' . + '\x{5246}\x{5247}\x{5248}\x{5249}\x{524A}\x{524B}\x{524C}\x{524D}\x{524E}' . + '\x{5250}\x{5251}\x{5252}\x{5254}\x{5255}\x{5256}\x{5257}\x{5258}\x{5259}' . + '\x{525A}\x{525B}\x{525C}\x{525D}\x{525E}\x{525F}\x{5260}\x{5261}\x{5262}' . + '\x{5263}\x{5264}\x{5265}\x{5267}\x{5268}\x{5269}\x{526A}\x{526B}\x{526C}' . + '\x{526D}\x{526E}\x{526F}\x{5270}\x{5272}\x{5273}\x{5274}\x{5275}\x{5276}' . + '\x{5277}\x{5278}\x{527A}\x{527B}\x{527C}\x{527D}\x{527E}\x{527F}\x{5280}' . + '\x{5281}\x{5282}\x{5283}\x{5284}\x{5286}\x{5287}\x{5288}\x{5289}\x{528A}' . + '\x{528B}\x{528C}\x{528D}\x{528F}\x{5290}\x{5291}\x{5292}\x{5293}\x{5294}' . + '\x{5295}\x{5296}\x{5297}\x{5298}\x{5299}\x{529A}\x{529B}\x{529C}\x{529D}' . + '\x{529E}\x{529F}\x{52A0}\x{52A1}\x{52A2}\x{52A3}\x{52A5}\x{52A6}\x{52A7}' . + '\x{52A8}\x{52A9}\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52AE}\x{52AF}\x{52B0}' . + '\x{52B1}\x{52B2}\x{52B3}\x{52B4}\x{52B5}\x{52B6}\x{52B7}\x{52B8}\x{52B9}' . + '\x{52BA}\x{52BB}\x{52BC}\x{52BD}\x{52BE}\x{52BF}\x{52C0}\x{52C1}\x{52C2}' . + '\x{52C3}\x{52C6}\x{52C7}\x{52C9}\x{52CA}\x{52CB}\x{52CD}\x{52CF}\x{52D0}' . + '\x{52D2}\x{52D3}\x{52D5}\x{52D6}\x{52D7}\x{52D8}\x{52D9}\x{52DA}\x{52DB}' . + '\x{52DC}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}\x{52E4}\x{52E6}' . + '\x{52E7}\x{52E8}\x{52E9}\x{52EA}\x{52EB}\x{52EC}\x{52ED}\x{52EF}\x{52F0}' . + '\x{52F1}\x{52F2}\x{52F3}\x{52F4}\x{52F5}\x{52F6}\x{52F7}\x{52F8}\x{52F9}' . + '\x{52FA}\x{52FB}\x{52FC}\x{52FD}\x{52FE}\x{52FF}\x{5300}\x{5301}\x{5302}' . + '\x{5305}\x{5306}\x{5307}\x{5308}\x{5309}\x{530A}\x{530B}\x{530C}\x{530D}' . + '\x{530E}\x{530F}\x{5310}\x{5311}\x{5312}\x{5313}\x{5314}\x{5315}\x{5316}' . + '\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}\x{5320}\x{5321}\x{5322}' . + '\x{5323}\x{5324}\x{5325}\x{5326}\x{5328}\x{532A}\x{532B}\x{532C}\x{532D}' . + '\x{532E}\x{532F}\x{5330}\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}\x{533A}' . + '\x{533B}\x{533C}\x{533D}\x{533E}\x{533F}\x{5340}\x{5341}\x{5343}\x{5344}' . + '\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}\x{534A}\x{534B}\x{534C}\x{534D}' . + '\x{534E}\x{534F}\x{5350}\x{5351}\x{5352}\x{5353}\x{5354}\x{5355}\x{5356}' . + '\x{5357}\x{5358}\x{5359}\x{535A}\x{535C}\x{535E}\x{535F}\x{5360}\x{5361}' . + '\x{5362}\x{5363}\x{5364}\x{5365}\x{5366}\x{5367}\x{5369}\x{536B}\x{536C}' . + '\x{536E}\x{536F}\x{5370}\x{5371}\x{5372}\x{5373}\x{5374}\x{5375}\x{5376}' . + '\x{5377}\x{5378}\x{5379}\x{537A}\x{537B}\x{537C}\x{537D}\x{537E}\x{537F}' . + '\x{5381}\x{5382}\x{5383}\x{5384}\x{5385}\x{5386}\x{5387}\x{5388}\x{5389}' . + '\x{538A}\x{538B}\x{538C}\x{538D}\x{538E}\x{538F}\x{5390}\x{5391}\x{5392}' . + '\x{5393}\x{5394}\x{5395}\x{5396}\x{5397}\x{5398}\x{5399}\x{539A}\x{539B}' . + '\x{539C}\x{539D}\x{539E}\x{539F}\x{53A0}\x{53A2}\x{53A3}\x{53A4}\x{53A5}' . + '\x{53A6}\x{53A7}\x{53A8}\x{53A9}\x{53AC}\x{53AD}\x{53AE}\x{53B0}\x{53B1}' . + '\x{53B2}\x{53B3}\x{53B4}\x{53B5}\x{53B6}\x{53B7}\x{53B8}\x{53B9}\x{53BB}' . + '\x{53BC}\x{53BD}\x{53BE}\x{53BF}\x{53C0}\x{53C1}\x{53C2}\x{53C3}\x{53C4}' . + '\x{53C6}\x{53C7}\x{53C8}\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}' . + '\x{53D0}\x{53D1}\x{53D2}\x{53D3}\x{53D4}\x{53D5}\x{53D6}\x{53D7}\x{53D8}' . + '\x{53D9}\x{53DB}\x{53DC}\x{53DF}\x{53E0}\x{53E1}\x{53E2}\x{53E3}\x{53E4}' . + '\x{53E5}\x{53E6}\x{53E8}\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}' . + '\x{53EF}\x{53F0}\x{53F1}\x{53F2}\x{53F3}\x{53F4}\x{53F5}\x{53F6}\x{53F7}' . + '\x{53F8}\x{53F9}\x{53FA}\x{53FB}\x{53FC}\x{53FD}\x{53FE}\x{5401}\x{5402}' . + '\x{5403}\x{5404}\x{5405}\x{5406}\x{5407}\x{5408}\x{5409}\x{540A}\x{540B}' . + '\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}\x{5411}\x{5412}\x{5413}\x{5414}' . + '\x{5415}\x{5416}\x{5417}\x{5418}\x{5419}\x{541B}\x{541C}\x{541D}\x{541E}' . + '\x{541F}\x{5420}\x{5421}\x{5423}\x{5424}\x{5425}\x{5426}\x{5427}\x{5428}' . + '\x{5429}\x{542A}\x{542B}\x{542C}\x{542D}\x{542E}\x{542F}\x{5430}\x{5431}' . + '\x{5432}\x{5433}\x{5434}\x{5435}\x{5436}\x{5437}\x{5438}\x{5439}\x{543A}' . + '\x{543B}\x{543C}\x{543D}\x{543E}\x{543F}\x{5440}\x{5441}\x{5442}\x{5443}' . + '\x{5444}\x{5445}\x{5446}\x{5447}\x{5448}\x{5449}\x{544A}\x{544B}\x{544D}' . + '\x{544E}\x{544F}\x{5450}\x{5451}\x{5452}\x{5453}\x{5454}\x{5455}\x{5456}' . + '\x{5457}\x{5458}\x{5459}\x{545A}\x{545B}\x{545C}\x{545E}\x{545F}\x{5460}' . + '\x{5461}\x{5462}\x{5463}\x{5464}\x{5465}\x{5466}\x{5467}\x{5468}\x{546A}' . + '\x{546B}\x{546C}\x{546D}\x{546E}\x{546F}\x{5470}\x{5471}\x{5472}\x{5473}' . + '\x{5474}\x{5475}\x{5476}\x{5477}\x{5478}\x{5479}\x{547A}\x{547B}\x{547C}' . + '\x{547D}\x{547E}\x{547F}\x{5480}\x{5481}\x{5482}\x{5483}\x{5484}\x{5485}' . + '\x{5486}\x{5487}\x{5488}\x{5489}\x{548B}\x{548C}\x{548D}\x{548E}\x{548F}' . + '\x{5490}\x{5491}\x{5492}\x{5493}\x{5494}\x{5495}\x{5496}\x{5497}\x{5498}' . + '\x{5499}\x{549A}\x{549B}\x{549C}\x{549D}\x{549E}\x{549F}\x{54A0}\x{54A1}' . + '\x{54A2}\x{54A3}\x{54A4}\x{54A5}\x{54A6}\x{54A7}\x{54A8}\x{54A9}\x{54AA}' . + '\x{54AB}\x{54AC}\x{54AD}\x{54AE}\x{54AF}\x{54B0}\x{54B1}\x{54B2}\x{54B3}' . + '\x{54B4}\x{54B6}\x{54B7}\x{54B8}\x{54B9}\x{54BA}\x{54BB}\x{54BC}\x{54BD}' . + '\x{54BE}\x{54BF}\x{54C0}\x{54C1}\x{54C2}\x{54C3}\x{54C4}\x{54C5}\x{54C6}' . + '\x{54C7}\x{54C8}\x{54C9}\x{54CA}\x{54CB}\x{54CC}\x{54CD}\x{54CE}\x{54CF}' . + '\x{54D0}\x{54D1}\x{54D2}\x{54D3}\x{54D4}\x{54D5}\x{54D6}\x{54D7}\x{54D8}' . + '\x{54D9}\x{54DA}\x{54DB}\x{54DC}\x{54DD}\x{54DE}\x{54DF}\x{54E0}\x{54E1}' . + '\x{54E2}\x{54E3}\x{54E4}\x{54E5}\x{54E6}\x{54E7}\x{54E8}\x{54E9}\x{54EA}' . + '\x{54EB}\x{54EC}\x{54ED}\x{54EE}\x{54EF}\x{54F0}\x{54F1}\x{54F2}\x{54F3}' . + '\x{54F4}\x{54F5}\x{54F7}\x{54F8}\x{54F9}\x{54FA}\x{54FB}\x{54FC}\x{54FD}' . + '\x{54FE}\x{54FF}\x{5500}\x{5501}\x{5502}\x{5503}\x{5504}\x{5505}\x{5506}' . + '\x{5507}\x{5508}\x{5509}\x{550A}\x{550B}\x{550C}\x{550D}\x{550E}\x{550F}' . + '\x{5510}\x{5511}\x{5512}\x{5513}\x{5514}\x{5516}\x{5517}\x{551A}\x{551B}' . + '\x{551C}\x{551D}\x{551E}\x{551F}\x{5520}\x{5521}\x{5522}\x{5523}\x{5524}' . + '\x{5525}\x{5526}\x{5527}\x{5528}\x{5529}\x{552A}\x{552B}\x{552C}\x{552D}' . + '\x{552E}\x{552F}\x{5530}\x{5531}\x{5532}\x{5533}\x{5534}\x{5535}\x{5536}' . + '\x{5537}\x{5538}\x{5539}\x{553A}\x{553B}\x{553C}\x{553D}\x{553E}\x{553F}' . + '\x{5540}\x{5541}\x{5542}\x{5543}\x{5544}\x{5545}\x{5546}\x{5548}\x{5549}' . + '\x{554A}\x{554B}\x{554C}\x{554D}\x{554E}\x{554F}\x{5550}\x{5551}\x{5552}' . + '\x{5553}\x{5554}\x{5555}\x{5556}\x{5557}\x{5558}\x{5559}\x{555A}\x{555B}' . + '\x{555C}\x{555D}\x{555E}\x{555F}\x{5561}\x{5562}\x{5563}\x{5564}\x{5565}' . + '\x{5566}\x{5567}\x{5568}\x{5569}\x{556A}\x{556B}\x{556C}\x{556D}\x{556E}' . + '\x{556F}\x{5570}\x{5571}\x{5572}\x{5573}\x{5574}\x{5575}\x{5576}\x{5577}' . + '\x{5578}\x{5579}\x{557B}\x{557C}\x{557D}\x{557E}\x{557F}\x{5580}\x{5581}' . + '\x{5582}\x{5583}\x{5584}\x{5585}\x{5586}\x{5587}\x{5588}\x{5589}\x{558A}' . + '\x{558B}\x{558C}\x{558D}\x{558E}\x{558F}\x{5590}\x{5591}\x{5592}\x{5593}' . + '\x{5594}\x{5595}\x{5596}\x{5597}\x{5598}\x{5599}\x{559A}\x{559B}\x{559C}' . + '\x{559D}\x{559E}\x{559F}\x{55A0}\x{55A1}\x{55A2}\x{55A3}\x{55A4}\x{55A5}' . + '\x{55A6}\x{55A7}\x{55A8}\x{55A9}\x{55AA}\x{55AB}\x{55AC}\x{55AD}\x{55AE}' . + '\x{55AF}\x{55B0}\x{55B1}\x{55B2}\x{55B3}\x{55B4}\x{55B5}\x{55B6}\x{55B7}' . + '\x{55B8}\x{55B9}\x{55BA}\x{55BB}\x{55BC}\x{55BD}\x{55BE}\x{55BF}\x{55C0}' . + '\x{55C1}\x{55C2}\x{55C3}\x{55C4}\x{55C5}\x{55C6}\x{55C7}\x{55C8}\x{55C9}' . + '\x{55CA}\x{55CB}\x{55CC}\x{55CD}\x{55CE}\x{55CF}\x{55D0}\x{55D1}\x{55D2}' . + '\x{55D3}\x{55D4}\x{55D5}\x{55D6}\x{55D7}\x{55D8}\x{55D9}\x{55DA}\x{55DB}' . + '\x{55DC}\x{55DD}\x{55DE}\x{55DF}\x{55E1}\x{55E2}\x{55E3}\x{55E4}\x{55E5}' . + '\x{55E6}\x{55E7}\x{55E8}\x{55E9}\x{55EA}\x{55EB}\x{55EC}\x{55ED}\x{55EE}' . + '\x{55EF}\x{55F0}\x{55F1}\x{55F2}\x{55F3}\x{55F4}\x{55F5}\x{55F6}\x{55F7}' . + '\x{55F9}\x{55FA}\x{55FB}\x{55FC}\x{55FD}\x{55FE}\x{55FF}\x{5600}\x{5601}' . + '\x{5602}\x{5603}\x{5604}\x{5606}\x{5607}\x{5608}\x{5609}\x{560C}\x{560D}' . + '\x{560E}\x{560F}\x{5610}\x{5611}\x{5612}\x{5613}\x{5614}\x{5615}\x{5616}' . + '\x{5617}\x{5618}\x{5619}\x{561A}\x{561B}\x{561C}\x{561D}\x{561E}\x{561F}' . + '\x{5621}\x{5622}\x{5623}\x{5624}\x{5625}\x{5626}\x{5627}\x{5628}\x{5629}' . + '\x{562A}\x{562C}\x{562D}\x{562E}\x{562F}\x{5630}\x{5631}\x{5632}\x{5633}' . + '\x{5634}\x{5635}\x{5636}\x{5638}\x{5639}\x{563A}\x{563B}\x{563D}\x{563E}' . + '\x{563F}\x{5640}\x{5641}\x{5642}\x{5643}\x{5645}\x{5646}\x{5647}\x{5648}' . + '\x{5649}\x{564A}\x{564C}\x{564D}\x{564E}\x{564F}\x{5650}\x{5652}\x{5653}' . + '\x{5654}\x{5655}\x{5657}\x{5658}\x{5659}\x{565A}\x{565B}\x{565C}\x{565D}' . + '\x{565E}\x{5660}\x{5662}\x{5663}\x{5664}\x{5665}\x{5666}\x{5667}\x{5668}' . + '\x{5669}\x{566A}\x{566B}\x{566C}\x{566D}\x{566E}\x{566F}\x{5670}\x{5671}' . + '\x{5672}\x{5673}\x{5674}\x{5676}\x{5677}\x{5678}\x{5679}\x{567A}\x{567B}' . + '\x{567C}\x{567E}\x{567F}\x{5680}\x{5681}\x{5682}\x{5683}\x{5684}\x{5685}' . + '\x{5686}\x{5687}\x{568A}\x{568C}\x{568D}\x{568E}\x{568F}\x{5690}\x{5691}' . + '\x{5692}\x{5693}\x{5694}\x{5695}\x{5697}\x{5698}\x{5699}\x{569A}\x{569B}' . + '\x{569C}\x{569D}\x{569F}\x{56A0}\x{56A1}\x{56A3}\x{56A4}\x{56A5}\x{56A6}' . + '\x{56A7}\x{56A8}\x{56A9}\x{56AA}\x{56AB}\x{56AC}\x{56AD}\x{56AE}\x{56AF}' . + '\x{56B0}\x{56B1}\x{56B2}\x{56B3}\x{56B4}\x{56B5}\x{56B6}\x{56B7}\x{56B8}' . + '\x{56B9}\x{56BB}\x{56BC}\x{56BD}\x{56BE}\x{56BF}\x{56C0}\x{56C1}\x{56C2}' . + '\x{56C3}\x{56C4}\x{56C5}\x{56C6}\x{56C7}\x{56C8}\x{56C9}\x{56CA}\x{56CB}' . + '\x{56CC}\x{56CD}\x{56CE}\x{56D0}\x{56D1}\x{56D2}\x{56D3}\x{56D4}\x{56D5}' . + '\x{56D6}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DC}\x{56DD}\x{56DE}\x{56DF}' . + '\x{56E0}\x{56E1}\x{56E2}\x{56E3}\x{56E4}\x{56E5}\x{56E7}\x{56E8}\x{56E9}' . + '\x{56EA}\x{56EB}\x{56EC}\x{56ED}\x{56EE}\x{56EF}\x{56F0}\x{56F1}\x{56F2}' . + '\x{56F3}\x{56F4}\x{56F5}\x{56F7}\x{56F9}\x{56FA}\x{56FD}\x{56FE}\x{56FF}' . + '\x{5700}\x{5701}\x{5702}\x{5703}\x{5704}\x{5706}\x{5707}\x{5708}\x{5709}' . + '\x{570A}\x{570B}\x{570C}\x{570D}\x{570E}\x{570F}\x{5710}\x{5712}\x{5713}' . + '\x{5714}\x{5715}\x{5716}\x{5718}\x{5719}\x{571A}\x{571B}\x{571C}\x{571D}' . + '\x{571E}\x{571F}\x{5720}\x{5722}\x{5723}\x{5725}\x{5726}\x{5727}\x{5728}' . + '\x{5729}\x{572A}\x{572B}\x{572C}\x{572D}\x{572E}\x{572F}\x{5730}\x{5731}' . + '\x{5732}\x{5733}\x{5734}\x{5735}\x{5736}\x{5737}\x{5738}\x{5739}\x{573A}' . + '\x{573B}\x{573C}\x{573E}\x{573F}\x{5740}\x{5741}\x{5742}\x{5744}\x{5745}' . + '\x{5746}\x{5747}\x{5749}\x{574A}\x{574B}\x{574C}\x{574D}\x{574E}\x{574F}' . + '\x{5750}\x{5751}\x{5752}\x{5753}\x{5754}\x{5757}\x{5759}\x{575A}\x{575B}' . + '\x{575C}\x{575D}\x{575E}\x{575F}\x{5760}\x{5761}\x{5762}\x{5764}\x{5765}' . + '\x{5766}\x{5767}\x{5768}\x{5769}\x{576A}\x{576B}\x{576C}\x{576D}\x{576F}' . + '\x{5770}\x{5771}\x{5772}\x{5773}\x{5774}\x{5775}\x{5776}\x{5777}\x{5779}' . + '\x{577A}\x{577B}\x{577C}\x{577D}\x{577E}\x{577F}\x{5780}\x{5782}\x{5783}' . + '\x{5784}\x{5785}\x{5786}\x{5788}\x{5789}\x{578A}\x{578B}\x{578C}\x{578D}' . + '\x{578E}\x{578F}\x{5790}\x{5791}\x{5792}\x{5793}\x{5794}\x{5795}\x{5797}' . + '\x{5798}\x{5799}\x{579A}\x{579B}\x{579C}\x{579D}\x{579E}\x{579F}\x{57A0}' . + '\x{57A1}\x{57A2}\x{57A3}\x{57A4}\x{57A5}\x{57A6}\x{57A7}\x{57A9}\x{57AA}' . + '\x{57AB}\x{57AC}\x{57AD}\x{57AE}\x{57AF}\x{57B0}\x{57B1}\x{57B2}\x{57B3}' . + '\x{57B4}\x{57B5}\x{57B6}\x{57B7}\x{57B8}\x{57B9}\x{57BA}\x{57BB}\x{57BC}' . + '\x{57BD}\x{57BE}\x{57BF}\x{57C0}\x{57C1}\x{57C2}\x{57C3}\x{57C4}\x{57C5}' . + '\x{57C6}\x{57C7}\x{57C8}\x{57C9}\x{57CB}\x{57CC}\x{57CD}\x{57CE}\x{57CF}' . + '\x{57D0}\x{57D2}\x{57D3}\x{57D4}\x{57D5}\x{57D6}\x{57D8}\x{57D9}\x{57DA}' . + '\x{57DC}\x{57DD}\x{57DF}\x{57E0}\x{57E1}\x{57E2}\x{57E3}\x{57E4}\x{57E5}' . + '\x{57E6}\x{57E7}\x{57E8}\x{57E9}\x{57EA}\x{57EB}\x{57EC}\x{57ED}\x{57EE}' . + '\x{57EF}\x{57F0}\x{57F1}\x{57F2}\x{57F3}\x{57F4}\x{57F5}\x{57F6}\x{57F7}' . + '\x{57F8}\x{57F9}\x{57FA}\x{57FB}\x{57FC}\x{57FD}\x{57FE}\x{57FF}\x{5800}' . + '\x{5801}\x{5802}\x{5803}\x{5804}\x{5805}\x{5806}\x{5807}\x{5808}\x{5809}' . + '\x{580A}\x{580B}\x{580C}\x{580D}\x{580E}\x{580F}\x{5810}\x{5811}\x{5812}' . + '\x{5813}\x{5814}\x{5815}\x{5816}\x{5819}\x{581A}\x{581B}\x{581C}\x{581D}' . + '\x{581E}\x{581F}\x{5820}\x{5821}\x{5822}\x{5823}\x{5824}\x{5825}\x{5826}' . + '\x{5827}\x{5828}\x{5829}\x{582A}\x{582B}\x{582C}\x{582D}\x{582E}\x{582F}' . + '\x{5830}\x{5831}\x{5832}\x{5833}\x{5834}\x{5835}\x{5836}\x{5837}\x{5838}' . + '\x{5839}\x{583A}\x{583B}\x{583C}\x{583D}\x{583E}\x{583F}\x{5840}\x{5842}' . + '\x{5843}\x{5844}\x{5845}\x{5846}\x{5847}\x{5848}\x{5849}\x{584A}\x{584B}' . + '\x{584C}\x{584D}\x{584E}\x{584F}\x{5851}\x{5852}\x{5853}\x{5854}\x{5855}' . + '\x{5857}\x{5858}\x{5859}\x{585A}\x{585B}\x{585C}\x{585D}\x{585E}\x{585F}' . + '\x{5861}\x{5862}\x{5863}\x{5864}\x{5865}\x{5868}\x{5869}\x{586A}\x{586B}' . + '\x{586C}\x{586D}\x{586E}\x{586F}\x{5870}\x{5871}\x{5872}\x{5873}\x{5874}' . + '\x{5875}\x{5876}\x{5878}\x{5879}\x{587A}\x{587B}\x{587C}\x{587D}\x{587E}' . + '\x{587F}\x{5880}\x{5881}\x{5882}\x{5883}\x{5884}\x{5885}\x{5886}\x{5887}' . + '\x{5888}\x{5889}\x{588A}\x{588B}\x{588C}\x{588D}\x{588E}\x{588F}\x{5890}' . + '\x{5891}\x{5892}\x{5893}\x{5894}\x{5896}\x{5897}\x{5898}\x{5899}\x{589A}' . + '\x{589B}\x{589C}\x{589D}\x{589E}\x{589F}\x{58A0}\x{58A1}\x{58A2}\x{58A3}' . + '\x{58A4}\x{58A5}\x{58A6}\x{58A7}\x{58A8}\x{58A9}\x{58AB}\x{58AC}\x{58AD}' . + '\x{58AE}\x{58AF}\x{58B0}\x{58B1}\x{58B2}\x{58B3}\x{58B4}\x{58B7}\x{58B8}' . + '\x{58B9}\x{58BA}\x{58BB}\x{58BC}\x{58BD}\x{58BE}\x{58BF}\x{58C1}\x{58C2}' . + '\x{58C5}\x{58C6}\x{58C7}\x{58C8}\x{58C9}\x{58CA}\x{58CB}\x{58CE}\x{58CF}' . + '\x{58D1}\x{58D2}\x{58D3}\x{58D4}\x{58D5}\x{58D6}\x{58D7}\x{58D8}\x{58D9}' . + '\x{58DA}\x{58DB}\x{58DD}\x{58DE}\x{58DF}\x{58E0}\x{58E2}\x{58E3}\x{58E4}' . + '\x{58E5}\x{58E7}\x{58E8}\x{58E9}\x{58EA}\x{58EB}\x{58EC}\x{58ED}\x{58EE}' . + '\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F3}\x{58F4}\x{58F6}\x{58F7}\x{58F8}' . + '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{58FE}\x{58FF}\x{5900}\x{5902}' . + '\x{5903}\x{5904}\x{5906}\x{5907}\x{5909}\x{590A}\x{590B}\x{590C}\x{590D}' . + '\x{590E}\x{590F}\x{5910}\x{5912}\x{5914}\x{5915}\x{5916}\x{5917}\x{5918}' . + '\x{5919}\x{591A}\x{591B}\x{591C}\x{591D}\x{591E}\x{591F}\x{5920}\x{5921}' . + '\x{5922}\x{5924}\x{5925}\x{5926}\x{5927}\x{5928}\x{5929}\x{592A}\x{592B}' . + '\x{592C}\x{592D}\x{592E}\x{592F}\x{5930}\x{5931}\x{5932}\x{5934}\x{5935}' . + '\x{5937}\x{5938}\x{5939}\x{593A}\x{593B}\x{593C}\x{593D}\x{593E}\x{593F}' . + '\x{5940}\x{5941}\x{5942}\x{5943}\x{5944}\x{5945}\x{5946}\x{5947}\x{5948}' . + '\x{5949}\x{594A}\x{594B}\x{594C}\x{594D}\x{594E}\x{594F}\x{5950}\x{5951}' . + '\x{5952}\x{5953}\x{5954}\x{5955}\x{5956}\x{5957}\x{5958}\x{595A}\x{595C}' . + '\x{595D}\x{595E}\x{595F}\x{5960}\x{5961}\x{5962}\x{5963}\x{5964}\x{5965}' . + '\x{5966}\x{5967}\x{5968}\x{5969}\x{596A}\x{596B}\x{596C}\x{596D}\x{596E}' . + '\x{596F}\x{5970}\x{5971}\x{5972}\x{5973}\x{5974}\x{5975}\x{5976}\x{5977}' . + '\x{5978}\x{5979}\x{597A}\x{597B}\x{597C}\x{597D}\x{597E}\x{597F}\x{5980}' . + '\x{5981}\x{5982}\x{5983}\x{5984}\x{5985}\x{5986}\x{5987}\x{5988}\x{5989}' . + '\x{598A}\x{598B}\x{598C}\x{598D}\x{598E}\x{598F}\x{5990}\x{5991}\x{5992}' . + '\x{5993}\x{5994}\x{5995}\x{5996}\x{5997}\x{5998}\x{5999}\x{599A}\x{599C}' . + '\x{599D}\x{599E}\x{599F}\x{59A0}\x{59A1}\x{59A2}\x{59A3}\x{59A4}\x{59A5}' . + '\x{59A6}\x{59A7}\x{59A8}\x{59A9}\x{59AA}\x{59AB}\x{59AC}\x{59AD}\x{59AE}' . + '\x{59AF}\x{59B0}\x{59B1}\x{59B2}\x{59B3}\x{59B4}\x{59B5}\x{59B6}\x{59B8}' . + '\x{59B9}\x{59BA}\x{59BB}\x{59BC}\x{59BD}\x{59BE}\x{59BF}\x{59C0}\x{59C1}' . + '\x{59C2}\x{59C3}\x{59C4}\x{59C5}\x{59C6}\x{59C7}\x{59C8}\x{59C9}\x{59CA}' . + '\x{59CB}\x{59CC}\x{59CD}\x{59CE}\x{59CF}\x{59D0}\x{59D1}\x{59D2}\x{59D3}' . + '\x{59D4}\x{59D5}\x{59D6}\x{59D7}\x{59D8}\x{59D9}\x{59DA}\x{59DB}\x{59DC}' . + '\x{59DD}\x{59DE}\x{59DF}\x{59E0}\x{59E1}\x{59E2}\x{59E3}\x{59E4}\x{59E5}' . + '\x{59E6}\x{59E8}\x{59E9}\x{59EA}\x{59EB}\x{59EC}\x{59ED}\x{59EE}\x{59EF}' . + '\x{59F0}\x{59F1}\x{59F2}\x{59F3}\x{59F4}\x{59F5}\x{59F6}\x{59F7}\x{59F8}' . + '\x{59F9}\x{59FA}\x{59FB}\x{59FC}\x{59FD}\x{59FE}\x{59FF}\x{5A00}\x{5A01}' . + '\x{5A02}\x{5A03}\x{5A04}\x{5A05}\x{5A06}\x{5A07}\x{5A08}\x{5A09}\x{5A0A}' . + '\x{5A0B}\x{5A0C}\x{5A0D}\x{5A0E}\x{5A0F}\x{5A10}\x{5A11}\x{5A12}\x{5A13}' . + '\x{5A14}\x{5A15}\x{5A16}\x{5A17}\x{5A18}\x{5A19}\x{5A1A}\x{5A1B}\x{5A1C}' . + '\x{5A1D}\x{5A1E}\x{5A1F}\x{5A20}\x{5A21}\x{5A22}\x{5A23}\x{5A25}\x{5A27}' . + '\x{5A28}\x{5A29}\x{5A2A}\x{5A2B}\x{5A2D}\x{5A2E}\x{5A2F}\x{5A31}\x{5A32}' . + '\x{5A33}\x{5A34}\x{5A35}\x{5A36}\x{5A37}\x{5A38}\x{5A39}\x{5A3A}\x{5A3B}' . + '\x{5A3C}\x{5A3D}\x{5A3E}\x{5A3F}\x{5A40}\x{5A41}\x{5A42}\x{5A43}\x{5A44}' . + '\x{5A45}\x{5A46}\x{5A47}\x{5A48}\x{5A49}\x{5A4A}\x{5A4B}\x{5A4C}\x{5A4D}' . + '\x{5A4E}\x{5A4F}\x{5A50}\x{5A51}\x{5A52}\x{5A53}\x{5A55}\x{5A56}\x{5A57}' . + '\x{5A58}\x{5A5A}\x{5A5B}\x{5A5C}\x{5A5D}\x{5A5E}\x{5A5F}\x{5A60}\x{5A61}' . + '\x{5A62}\x{5A63}\x{5A64}\x{5A65}\x{5A66}\x{5A67}\x{5A68}\x{5A69}\x{5A6A}' . + '\x{5A6B}\x{5A6C}\x{5A6D}\x{5A6E}\x{5A70}\x{5A72}\x{5A73}\x{5A74}\x{5A75}' . + '\x{5A76}\x{5A77}\x{5A78}\x{5A79}\x{5A7A}\x{5A7B}\x{5A7C}\x{5A7D}\x{5A7E}' . + '\x{5A7F}\x{5A80}\x{5A81}\x{5A82}\x{5A83}\x{5A84}\x{5A85}\x{5A86}\x{5A88}' . + '\x{5A89}\x{5A8A}\x{5A8B}\x{5A8C}\x{5A8E}\x{5A8F}\x{5A90}\x{5A91}\x{5A92}' . + '\x{5A93}\x{5A94}\x{5A95}\x{5A96}\x{5A97}\x{5A98}\x{5A99}\x{5A9A}\x{5A9B}' . + '\x{5A9C}\x{5A9D}\x{5A9E}\x{5A9F}\x{5AA0}\x{5AA1}\x{5AA2}\x{5AA3}\x{5AA4}' . + '\x{5AA5}\x{5AA6}\x{5AA7}\x{5AA8}\x{5AA9}\x{5AAA}\x{5AAC}\x{5AAD}\x{5AAE}' . + '\x{5AAF}\x{5AB0}\x{5AB1}\x{5AB2}\x{5AB3}\x{5AB4}\x{5AB5}\x{5AB6}\x{5AB7}' . + '\x{5AB8}\x{5AB9}\x{5ABA}\x{5ABB}\x{5ABC}\x{5ABD}\x{5ABE}\x{5ABF}\x{5AC0}' . + '\x{5AC1}\x{5AC2}\x{5AC3}\x{5AC4}\x{5AC5}\x{5AC6}\x{5AC7}\x{5AC8}\x{5AC9}' . + '\x{5ACA}\x{5ACB}\x{5ACC}\x{5ACD}\x{5ACE}\x{5ACF}\x{5AD1}\x{5AD2}\x{5AD4}' . + '\x{5AD5}\x{5AD6}\x{5AD7}\x{5AD8}\x{5AD9}\x{5ADA}\x{5ADB}\x{5ADC}\x{5ADD}' . + '\x{5ADE}\x{5ADF}\x{5AE0}\x{5AE1}\x{5AE2}\x{5AE3}\x{5AE4}\x{5AE5}\x{5AE6}' . + '\x{5AE7}\x{5AE8}\x{5AE9}\x{5AEA}\x{5AEB}\x{5AEC}\x{5AED}\x{5AEE}\x{5AF1}' . + '\x{5AF2}\x{5AF3}\x{5AF4}\x{5AF5}\x{5AF6}\x{5AF7}\x{5AF8}\x{5AF9}\x{5AFA}' . + '\x{5AFB}\x{5AFC}\x{5AFD}\x{5AFE}\x{5AFF}\x{5B00}\x{5B01}\x{5B02}\x{5B03}' . + '\x{5B04}\x{5B05}\x{5B06}\x{5B07}\x{5B08}\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}' . + '\x{5B0F}\x{5B10}\x{5B11}\x{5B12}\x{5B13}\x{5B14}\x{5B15}\x{5B16}\x{5B17}' . + '\x{5B18}\x{5B19}\x{5B1A}\x{5B1B}\x{5B1C}\x{5B1D}\x{5B1E}\x{5B1F}\x{5B20}' . + '\x{5B21}\x{5B22}\x{5B23}\x{5B24}\x{5B25}\x{5B26}\x{5B27}\x{5B28}\x{5B29}' . + '\x{5B2A}\x{5B2B}\x{5B2C}\x{5B2D}\x{5B2E}\x{5B2F}\x{5B30}\x{5B31}\x{5B32}' . + '\x{5B33}\x{5B34}\x{5B35}\x{5B36}\x{5B37}\x{5B38}\x{5B3A}\x{5B3B}\x{5B3C}' . + '\x{5B3D}\x{5B3E}\x{5B3F}\x{5B40}\x{5B41}\x{5B42}\x{5B43}\x{5B44}\x{5B45}' . + '\x{5B47}\x{5B48}\x{5B49}\x{5B4A}\x{5B4B}\x{5B4C}\x{5B4D}\x{5B4E}\x{5B50}' . + '\x{5B51}\x{5B53}\x{5B54}\x{5B55}\x{5B56}\x{5B57}\x{5B58}\x{5B59}\x{5B5A}' . + '\x{5B5B}\x{5B5C}\x{5B5D}\x{5B5E}\x{5B5F}\x{5B62}\x{5B63}\x{5B64}\x{5B65}' . + '\x{5B66}\x{5B67}\x{5B68}\x{5B69}\x{5B6A}\x{5B6B}\x{5B6C}\x{5B6D}\x{5B6E}' . + '\x{5B70}\x{5B71}\x{5B72}\x{5B73}\x{5B74}\x{5B75}\x{5B76}\x{5B77}\x{5B78}' . + '\x{5B7A}\x{5B7B}\x{5B7C}\x{5B7D}\x{5B7F}\x{5B80}\x{5B81}\x{5B82}\x{5B83}' . + '\x{5B84}\x{5B85}\x{5B87}\x{5B88}\x{5B89}\x{5B8A}\x{5B8B}\x{5B8C}\x{5B8D}' . + '\x{5B8E}\x{5B8F}\x{5B91}\x{5B92}\x{5B93}\x{5B94}\x{5B95}\x{5B96}\x{5B97}' . + '\x{5B98}\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9E}\x{5B9F}\x{5BA0}' . + '\x{5BA1}\x{5BA2}\x{5BA3}\x{5BA4}\x{5BA5}\x{5BA6}\x{5BA7}\x{5BA8}\x{5BAA}' . + '\x{5BAB}\x{5BAC}\x{5BAD}\x{5BAE}\x{5BAF}\x{5BB0}\x{5BB1}\x{5BB3}\x{5BB4}' . + '\x{5BB5}\x{5BB6}\x{5BB8}\x{5BB9}\x{5BBA}\x{5BBB}\x{5BBD}\x{5BBE}\x{5BBF}' . + '\x{5BC0}\x{5BC1}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BCA}' . + '\x{5BCB}\x{5BCC}\x{5BCD}\x{5BCE}\x{5BCF}\x{5BD0}\x{5BD1}\x{5BD2}\x{5BD3}' . + '\x{5BD4}\x{5BD5}\x{5BD6}\x{5BD8}\x{5BD9}\x{5BDB}\x{5BDC}\x{5BDD}\x{5BDE}' . + '\x{5BDF}\x{5BE0}\x{5BE1}\x{5BE2}\x{5BE3}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}' . + '\x{5BE8}\x{5BE9}\x{5BEA}\x{5BEB}\x{5BEC}\x{5BED}\x{5BEE}\x{5BEF}\x{5BF0}' . + '\x{5BF1}\x{5BF2}\x{5BF3}\x{5BF4}\x{5BF5}\x{5BF6}\x{5BF7}\x{5BF8}\x{5BF9}' . + '\x{5BFA}\x{5BFB}\x{5BFC}\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}\x{5C04}\x{5C05}' . + '\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}\x{5C0B}\x{5C0C}\x{5C0D}\x{5C0E}' . + '\x{5C0F}\x{5C10}\x{5C11}\x{5C12}\x{5C13}\x{5C14}\x{5C15}\x{5C16}\x{5C17}' . + '\x{5C18}\x{5C19}\x{5C1A}\x{5C1C}\x{5C1D}\x{5C1E}\x{5C1F}\x{5C20}\x{5C21}' . + '\x{5C22}\x{5C24}\x{5C25}\x{5C27}\x{5C28}\x{5C2A}\x{5C2B}\x{5C2C}\x{5C2D}' . + '\x{5C2E}\x{5C2F}\x{5C30}\x{5C31}\x{5C32}\x{5C33}\x{5C34}\x{5C35}\x{5C37}' . + '\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}' . + '\x{5C41}\x{5C42}\x{5C43}\x{5C44}\x{5C45}\x{5C46}\x{5C47}\x{5C48}\x{5C49}' . + '\x{5C4A}\x{5C4B}\x{5C4C}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C52}' . + '\x{5C53}\x{5C54}\x{5C55}\x{5C56}\x{5C57}\x{5C58}\x{5C59}\x{5C5B}\x{5C5C}' . + '\x{5C5D}\x{5C5E}\x{5C5F}\x{5C60}\x{5C61}\x{5C62}\x{5C63}\x{5C64}\x{5C65}' . + '\x{5C66}\x{5C67}\x{5C68}\x{5C69}\x{5C6A}\x{5C6B}\x{5C6C}\x{5C6D}\x{5C6E}' . + '\x{5C6F}\x{5C70}\x{5C71}\x{5C72}\x{5C73}\x{5C74}\x{5C75}\x{5C76}\x{5C77}' . + '\x{5C78}\x{5C79}\x{5C7A}\x{5C7B}\x{5C7C}\x{5C7D}\x{5C7E}\x{5C7F}\x{5C80}' . + '\x{5C81}\x{5C82}\x{5C83}\x{5C84}\x{5C86}\x{5C87}\x{5C88}\x{5C89}\x{5C8A}' . + '\x{5C8B}\x{5C8C}\x{5C8D}\x{5C8E}\x{5C8F}\x{5C90}\x{5C91}\x{5C92}\x{5C93}' . + '\x{5C94}\x{5C95}\x{5C96}\x{5C97}\x{5C98}\x{5C99}\x{5C9A}\x{5C9B}\x{5C9C}' . + '\x{5C9D}\x{5C9E}\x{5C9F}\x{5CA0}\x{5CA1}\x{5CA2}\x{5CA3}\x{5CA4}\x{5CA5}' . + '\x{5CA6}\x{5CA7}\x{5CA8}\x{5CA9}\x{5CAA}\x{5CAB}\x{5CAC}\x{5CAD}\x{5CAE}' . + '\x{5CAF}\x{5CB0}\x{5CB1}\x{5CB2}\x{5CB3}\x{5CB5}\x{5CB6}\x{5CB7}\x{5CB8}' . + '\x{5CBA}\x{5CBB}\x{5CBC}\x{5CBD}\x{5CBE}\x{5CBF}\x{5CC1}\x{5CC2}\x{5CC3}' . + '\x{5CC4}\x{5CC5}\x{5CC6}\x{5CC7}\x{5CC8}\x{5CC9}\x{5CCA}\x{5CCB}\x{5CCC}' . + '\x{5CCD}\x{5CCE}\x{5CCF}\x{5CD0}\x{5CD1}\x{5CD2}\x{5CD3}\x{5CD4}\x{5CD6}' . + '\x{5CD7}\x{5CD8}\x{5CD9}\x{5CDA}\x{5CDB}\x{5CDC}\x{5CDE}\x{5CDF}\x{5CE0}' . + '\x{5CE1}\x{5CE2}\x{5CE3}\x{5CE4}\x{5CE5}\x{5CE6}\x{5CE7}\x{5CE8}\x{5CE9}' . + '\x{5CEA}\x{5CEB}\x{5CEC}\x{5CED}\x{5CEE}\x{5CEF}\x{5CF0}\x{5CF1}\x{5CF2}' . + '\x{5CF3}\x{5CF4}\x{5CF6}\x{5CF7}\x{5CF8}\x{5CF9}\x{5CFA}\x{5CFB}\x{5CFC}' . + '\x{5CFD}\x{5CFE}\x{5CFF}\x{5D00}\x{5D01}\x{5D02}\x{5D03}\x{5D04}\x{5D05}' . + '\x{5D06}\x{5D07}\x{5D08}\x{5D09}\x{5D0A}\x{5D0B}\x{5D0C}\x{5D0D}\x{5D0E}' . + '\x{5D0F}\x{5D10}\x{5D11}\x{5D12}\x{5D13}\x{5D14}\x{5D15}\x{5D16}\x{5D17}' . + '\x{5D18}\x{5D19}\x{5D1A}\x{5D1B}\x{5D1C}\x{5D1D}\x{5D1E}\x{5D1F}\x{5D20}' . + '\x{5D21}\x{5D22}\x{5D23}\x{5D24}\x{5D25}\x{5D26}\x{5D27}\x{5D28}\x{5D29}' . + '\x{5D2A}\x{5D2C}\x{5D2D}\x{5D2E}\x{5D30}\x{5D31}\x{5D32}\x{5D33}\x{5D34}' . + '\x{5D35}\x{5D36}\x{5D37}\x{5D38}\x{5D39}\x{5D3A}\x{5D3C}\x{5D3D}\x{5D3E}' . + '\x{5D3F}\x{5D40}\x{5D41}\x{5D42}\x{5D43}\x{5D44}\x{5D45}\x{5D46}\x{5D47}' . + '\x{5D48}\x{5D49}\x{5D4A}\x{5D4B}\x{5D4C}\x{5D4D}\x{5D4E}\x{5D4F}\x{5D50}' . + '\x{5D51}\x{5D52}\x{5D54}\x{5D55}\x{5D56}\x{5D58}\x{5D59}\x{5D5A}\x{5D5B}' . + '\x{5D5D}\x{5D5E}\x{5D5F}\x{5D61}\x{5D62}\x{5D63}\x{5D64}\x{5D65}\x{5D66}' . + '\x{5D67}\x{5D68}\x{5D69}\x{5D6A}\x{5D6B}\x{5D6C}\x{5D6D}\x{5D6E}\x{5D6F}' . + '\x{5D70}\x{5D71}\x{5D72}\x{5D73}\x{5D74}\x{5D75}\x{5D76}\x{5D77}\x{5D78}' . + '\x{5D79}\x{5D7A}\x{5D7B}\x{5D7C}\x{5D7D}\x{5D7E}\x{5D7F}\x{5D80}\x{5D81}' . + '\x{5D82}\x{5D84}\x{5D85}\x{5D86}\x{5D87}\x{5D88}\x{5D89}\x{5D8A}\x{5D8B}' . + '\x{5D8C}\x{5D8D}\x{5D8E}\x{5D8F}\x{5D90}\x{5D91}\x{5D92}\x{5D93}\x{5D94}' . + '\x{5D95}\x{5D97}\x{5D98}\x{5D99}\x{5D9A}\x{5D9B}\x{5D9C}\x{5D9D}\x{5D9E}' . + '\x{5D9F}\x{5DA0}\x{5DA1}\x{5DA2}\x{5DA5}\x{5DA6}\x{5DA7}\x{5DA8}\x{5DA9}' . + '\x{5DAA}\x{5DAC}\x{5DAD}\x{5DAE}\x{5DAF}\x{5DB0}\x{5DB1}\x{5DB2}\x{5DB4}' . + '\x{5DB5}\x{5DB6}\x{5DB7}\x{5DB8}\x{5DBA}\x{5DBB}\x{5DBC}\x{5DBD}\x{5DBE}' . + '\x{5DBF}\x{5DC0}\x{5DC1}\x{5DC2}\x{5DC3}\x{5DC5}\x{5DC6}\x{5DC7}\x{5DC8}' . + '\x{5DC9}\x{5DCA}\x{5DCB}\x{5DCC}\x{5DCD}\x{5DCE}\x{5DCF}\x{5DD0}\x{5DD1}' . + '\x{5DD2}\x{5DD3}\x{5DD4}\x{5DD5}\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}' . + '\x{5DDE}\x{5DDF}\x{5DE0}\x{5DE1}\x{5DE2}\x{5DE3}\x{5DE4}\x{5DE5}\x{5DE6}' . + '\x{5DE7}\x{5DE8}\x{5DE9}\x{5DEA}\x{5DEB}\x{5DEC}\x{5DED}\x{5DEE}\x{5DEF}' . + '\x{5DF0}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DF8}\x{5DF9}' . + '\x{5DFA}\x{5DFB}\x{5DFC}\x{5DFD}\x{5DFE}\x{5DFF}\x{5E00}\x{5E01}\x{5E02}' . + '\x{5E03}\x{5E04}\x{5E05}\x{5E06}\x{5E07}\x{5E08}\x{5E09}\x{5E0A}\x{5E0B}' . + '\x{5E0C}\x{5E0D}\x{5E0E}\x{5E0F}\x{5E10}\x{5E11}\x{5E13}\x{5E14}\x{5E15}' . + '\x{5E16}\x{5E17}\x{5E18}\x{5E19}\x{5E1A}\x{5E1B}\x{5E1C}\x{5E1D}\x{5E1E}' . + '\x{5E1F}\x{5E20}\x{5E21}\x{5E22}\x{5E23}\x{5E24}\x{5E25}\x{5E26}\x{5E27}' . + '\x{5E28}\x{5E29}\x{5E2A}\x{5E2B}\x{5E2C}\x{5E2D}\x{5E2E}\x{5E2F}\x{5E30}' . + '\x{5E31}\x{5E32}\x{5E33}\x{5E34}\x{5E35}\x{5E36}\x{5E37}\x{5E38}\x{5E39}' . + '\x{5E3A}\x{5E3B}\x{5E3C}\x{5E3D}\x{5E3E}\x{5E40}\x{5E41}\x{5E42}\x{5E43}' . + '\x{5E44}\x{5E45}\x{5E46}\x{5E47}\x{5E49}\x{5E4A}\x{5E4B}\x{5E4C}\x{5E4D}' . + '\x{5E4E}\x{5E4F}\x{5E50}\x{5E52}\x{5E53}\x{5E54}\x{5E55}\x{5E56}\x{5E57}' . + '\x{5E58}\x{5E59}\x{5E5A}\x{5E5B}\x{5E5C}\x{5E5D}\x{5E5E}\x{5E5F}\x{5E60}' . + '\x{5E61}\x{5E62}\x{5E63}\x{5E64}\x{5E65}\x{5E66}\x{5E67}\x{5E68}\x{5E69}' . + '\x{5E6A}\x{5E6B}\x{5E6C}\x{5E6D}\x{5E6E}\x{5E6F}\x{5E70}\x{5E71}\x{5E72}' . + '\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E77}\x{5E78}\x{5E79}\x{5E7A}\x{5E7B}' . + '\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E80}\x{5E81}\x{5E82}\x{5E83}\x{5E84}' . + '\x{5E85}\x{5E86}\x{5E87}\x{5E88}\x{5E89}\x{5E8A}\x{5E8B}\x{5E8C}\x{5E8D}' . + '\x{5E8E}\x{5E8F}\x{5E90}\x{5E91}\x{5E93}\x{5E94}\x{5E95}\x{5E96}\x{5E97}' . + '\x{5E98}\x{5E99}\x{5E9A}\x{5E9B}\x{5E9C}\x{5E9D}\x{5E9E}\x{5E9F}\x{5EA0}' . + '\x{5EA1}\x{5EA2}\x{5EA3}\x{5EA4}\x{5EA5}\x{5EA6}\x{5EA7}\x{5EA8}\x{5EA9}' . + '\x{5EAA}\x{5EAB}\x{5EAC}\x{5EAD}\x{5EAE}\x{5EAF}\x{5EB0}\x{5EB1}\x{5EB2}' . + '\x{5EB3}\x{5EB4}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EB9}\x{5EBB}\x{5EBC}' . + '\x{5EBD}\x{5EBE}\x{5EBF}\x{5EC1}\x{5EC2}\x{5EC3}\x{5EC4}\x{5EC5}\x{5EC6}' . + '\x{5EC7}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECB}\x{5ECC}\x{5ECD}\x{5ECE}\x{5ECF}' . + '\x{5ED0}\x{5ED1}\x{5ED2}\x{5ED3}\x{5ED4}\x{5ED5}\x{5ED6}\x{5ED7}\x{5ED8}' . + '\x{5ED9}\x{5EDA}\x{5EDB}\x{5EDC}\x{5EDD}\x{5EDE}\x{5EDF}\x{5EE0}\x{5EE1}' . + '\x{5EE2}\x{5EE3}\x{5EE4}\x{5EE5}\x{5EE6}\x{5EE7}\x{5EE8}\x{5EE9}\x{5EEA}' . + '\x{5EEC}\x{5EED}\x{5EEE}\x{5EEF}\x{5EF0}\x{5EF1}\x{5EF2}\x{5EF3}\x{5EF4}' . + '\x{5EF5}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}\x{5EFB}\x{5EFC}\x{5EFD}\x{5EFE}' . + '\x{5EFF}\x{5F00}\x{5F01}\x{5F02}\x{5F03}\x{5F04}\x{5F05}\x{5F06}\x{5F07}' . + '\x{5F08}\x{5F0A}\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F11}\x{5F12}\x{5F13}' . + '\x{5F14}\x{5F15}\x{5F16}\x{5F17}\x{5F18}\x{5F19}\x{5F1A}\x{5F1B}\x{5F1C}' . + '\x{5F1D}\x{5F1E}\x{5F1F}\x{5F20}\x{5F21}\x{5F22}\x{5F23}\x{5F24}\x{5F25}' . + '\x{5F26}\x{5F27}\x{5F28}\x{5F29}\x{5F2A}\x{5F2B}\x{5F2C}\x{5F2D}\x{5F2E}' . + '\x{5F2F}\x{5F30}\x{5F31}\x{5F32}\x{5F33}\x{5F34}\x{5F35}\x{5F36}\x{5F37}' . + '\x{5F38}\x{5F39}\x{5F3A}\x{5F3C}\x{5F3E}\x{5F3F}\x{5F40}\x{5F41}\x{5F42}' . + '\x{5F43}\x{5F44}\x{5F45}\x{5F46}\x{5F47}\x{5F48}\x{5F49}\x{5F4A}\x{5F4B}' . + '\x{5F4C}\x{5F4D}\x{5F4E}\x{5F4F}\x{5F50}\x{5F51}\x{5F52}\x{5F53}\x{5F54}' . + '\x{5F55}\x{5F56}\x{5F57}\x{5F58}\x{5F59}\x{5F5A}\x{5F5B}\x{5F5C}\x{5F5D}' . + '\x{5F5E}\x{5F5F}\x{5F60}\x{5F61}\x{5F62}\x{5F63}\x{5F64}\x{5F65}\x{5F66}' . + '\x{5F67}\x{5F68}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}\x{5F6D}\x{5F6E}\x{5F6F}' . + '\x{5F70}\x{5F71}\x{5F72}\x{5F73}\x{5F74}\x{5F75}\x{5F76}\x{5F77}\x{5F78}' . + '\x{5F79}\x{5F7A}\x{5F7B}\x{5F7C}\x{5F7D}\x{5F7E}\x{5F7F}\x{5F80}\x{5F81}' . + '\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F86}\x{5F87}\x{5F88}\x{5F89}\x{5F8A}' . + '\x{5F8B}\x{5F8C}\x{5F8D}\x{5F8E}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F94}' . + '\x{5F95}\x{5F96}\x{5F97}\x{5F98}\x{5F99}\x{5F9B}\x{5F9C}\x{5F9D}\x{5F9E}' . + '\x{5F9F}\x{5FA0}\x{5FA1}\x{5FA2}\x{5FA5}\x{5FA6}\x{5FA7}\x{5FA8}\x{5FA9}' . + '\x{5FAA}\x{5FAB}\x{5FAC}\x{5FAD}\x{5FAE}\x{5FAF}\x{5FB1}\x{5FB2}\x{5FB3}' . + '\x{5FB4}\x{5FB5}\x{5FB6}\x{5FB7}\x{5FB8}\x{5FB9}\x{5FBA}\x{5FBB}\x{5FBC}' . + '\x{5FBD}\x{5FBE}\x{5FBF}\x{5FC0}\x{5FC1}\x{5FC3}\x{5FC4}\x{5FC5}\x{5FC6}' . + '\x{5FC7}\x{5FC8}\x{5FC9}\x{5FCA}\x{5FCB}\x{5FCC}\x{5FCD}\x{5FCF}\x{5FD0}' . + '\x{5FD1}\x{5FD2}\x{5FD3}\x{5FD4}\x{5FD5}\x{5FD6}\x{5FD7}\x{5FD8}\x{5FD9}' . + '\x{5FDA}\x{5FDC}\x{5FDD}\x{5FDE}\x{5FE0}\x{5FE1}\x{5FE3}\x{5FE4}\x{5FE5}' . + '\x{5FE6}\x{5FE7}\x{5FE8}\x{5FE9}\x{5FEA}\x{5FEB}\x{5FED}\x{5FEE}\x{5FEF}' . + '\x{5FF0}\x{5FF1}\x{5FF2}\x{5FF3}\x{5FF4}\x{5FF5}\x{5FF6}\x{5FF7}\x{5FF8}' . + '\x{5FF9}\x{5FFA}\x{5FFB}\x{5FFD}\x{5FFE}\x{5FFF}\x{6000}\x{6001}\x{6002}' . + '\x{6003}\x{6004}\x{6005}\x{6006}\x{6007}\x{6008}\x{6009}\x{600A}\x{600B}' . + '\x{600C}\x{600D}\x{600E}\x{600F}\x{6010}\x{6011}\x{6012}\x{6013}\x{6014}' . + '\x{6015}\x{6016}\x{6017}\x{6018}\x{6019}\x{601A}\x{601B}\x{601C}\x{601D}' . + '\x{601E}\x{601F}\x{6020}\x{6021}\x{6022}\x{6024}\x{6025}\x{6026}\x{6027}' . + '\x{6028}\x{6029}\x{602A}\x{602B}\x{602C}\x{602D}\x{602E}\x{602F}\x{6030}' . + '\x{6031}\x{6032}\x{6033}\x{6034}\x{6035}\x{6036}\x{6037}\x{6038}\x{6039}' . + '\x{603A}\x{603B}\x{603C}\x{603D}\x{603E}\x{603F}\x{6040}\x{6041}\x{6042}' . + '\x{6043}\x{6044}\x{6045}\x{6046}\x{6047}\x{6048}\x{6049}\x{604A}\x{604B}' . + '\x{604C}\x{604D}\x{604E}\x{604F}\x{6050}\x{6051}\x{6052}\x{6053}\x{6054}' . + '\x{6055}\x{6057}\x{6058}\x{6059}\x{605A}\x{605B}\x{605C}\x{605D}\x{605E}' . + '\x{605F}\x{6062}\x{6063}\x{6064}\x{6065}\x{6066}\x{6067}\x{6068}\x{6069}' . + '\x{606A}\x{606B}\x{606C}\x{606D}\x{606E}\x{606F}\x{6070}\x{6072}\x{6073}' . + '\x{6075}\x{6076}\x{6077}\x{6078}\x{6079}\x{607A}\x{607B}\x{607C}\x{607D}' . + '\x{607E}\x{607F}\x{6080}\x{6081}\x{6082}\x{6083}\x{6084}\x{6085}\x{6086}' . + '\x{6087}\x{6088}\x{6089}\x{608A}\x{608B}\x{608C}\x{608D}\x{608E}\x{608F}' . + '\x{6090}\x{6092}\x{6094}\x{6095}\x{6096}\x{6097}\x{6098}\x{6099}\x{609A}' . + '\x{609B}\x{609C}\x{609D}\x{609E}\x{609F}\x{60A0}\x{60A1}\x{60A2}\x{60A3}' . + '\x{60A4}\x{60A6}\x{60A7}\x{60A8}\x{60AA}\x{60AB}\x{60AC}\x{60AD}\x{60AE}' . + '\x{60AF}\x{60B0}\x{60B1}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B7}' . + '\x{60B8}\x{60B9}\x{60BA}\x{60BB}\x{60BC}\x{60BD}\x{60BE}\x{60BF}\x{60C0}' . + '\x{60C1}\x{60C2}\x{60C3}\x{60C4}\x{60C5}\x{60C6}\x{60C7}\x{60C8}\x{60C9}' . + '\x{60CA}\x{60CB}\x{60CC}\x{60CD}\x{60CE}\x{60CF}\x{60D0}\x{60D1}\x{60D3}' . + '\x{60D4}\x{60D5}\x{60D7}\x{60D8}\x{60D9}\x{60DA}\x{60DB}\x{60DC}\x{60DD}' . + '\x{60DF}\x{60E0}\x{60E1}\x{60E2}\x{60E4}\x{60E6}\x{60E7}\x{60E8}\x{60E9}' . + '\x{60EA}\x{60EB}\x{60EC}\x{60ED}\x{60EE}\x{60EF}\x{60F0}\x{60F1}\x{60F2}' . + '\x{60F3}\x{60F4}\x{60F5}\x{60F6}\x{60F7}\x{60F8}\x{60F9}\x{60FA}\x{60FB}' . + '\x{60FC}\x{60FE}\x{60FF}\x{6100}\x{6101}\x{6103}\x{6104}\x{6105}\x{6106}' . + '\x{6108}\x{6109}\x{610A}\x{610B}\x{610C}\x{610D}\x{610E}\x{610F}\x{6110}' . + '\x{6112}\x{6113}\x{6114}\x{6115}\x{6116}\x{6117}\x{6118}\x{6119}\x{611A}' . + '\x{611B}\x{611C}\x{611D}\x{611F}\x{6120}\x{6122}\x{6123}\x{6124}\x{6125}' . + '\x{6126}\x{6127}\x{6128}\x{6129}\x{612A}\x{612B}\x{612C}\x{612D}\x{612E}' . + '\x{612F}\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}\x{613B}\x{613C}' . + '\x{613D}\x{613E}\x{613F}\x{6140}\x{6141}\x{6142}\x{6143}\x{6144}\x{6145}' . + '\x{6146}\x{6147}\x{6148}\x{6149}\x{614A}\x{614B}\x{614C}\x{614D}\x{614E}' . + '\x{614F}\x{6150}\x{6151}\x{6152}\x{6153}\x{6154}\x{6155}\x{6156}\x{6157}' . + '\x{6158}\x{6159}\x{615A}\x{615B}\x{615C}\x{615D}\x{615E}\x{615F}\x{6161}' . + '\x{6162}\x{6163}\x{6164}\x{6165}\x{6166}\x{6167}\x{6168}\x{6169}\x{616A}' . + '\x{616B}\x{616C}\x{616D}\x{616E}\x{6170}\x{6171}\x{6172}\x{6173}\x{6174}' . + '\x{6175}\x{6176}\x{6177}\x{6178}\x{6179}\x{617A}\x{617C}\x{617E}\x{6180}' . + '\x{6181}\x{6182}\x{6183}\x{6184}\x{6185}\x{6187}\x{6188}\x{6189}\x{618A}' . + '\x{618B}\x{618C}\x{618D}\x{618E}\x{618F}\x{6190}\x{6191}\x{6192}\x{6193}' . + '\x{6194}\x{6195}\x{6196}\x{6198}\x{6199}\x{619A}\x{619B}\x{619D}\x{619E}' . + '\x{619F}\x{61A0}\x{61A1}\x{61A2}\x{61A3}\x{61A4}\x{61A5}\x{61A6}\x{61A7}' . + '\x{61A8}\x{61A9}\x{61AA}\x{61AB}\x{61AC}\x{61AD}\x{61AE}\x{61AF}\x{61B0}' . + '\x{61B1}\x{61B2}\x{61B3}\x{61B4}\x{61B5}\x{61B6}\x{61B7}\x{61B8}\x{61BA}' . + '\x{61BC}\x{61BD}\x{61BE}\x{61BF}\x{61C0}\x{61C1}\x{61C2}\x{61C3}\x{61C4}' . + '\x{61C5}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . + '\x{61CE}\x{61CF}\x{61D0}\x{61D1}\x{61D2}\x{61D4}\x{61D6}\x{61D7}\x{61D8}' . + '\x{61D9}\x{61DA}\x{61DB}\x{61DC}\x{61DD}\x{61DE}\x{61DF}\x{61E0}\x{61E1}' . + '\x{61E2}\x{61E3}\x{61E4}\x{61E5}\x{61E6}\x{61E7}\x{61E8}\x{61E9}\x{61EA}' . + '\x{61EB}\x{61ED}\x{61EE}\x{61F0}\x{61F1}\x{61F2}\x{61F3}\x{61F5}\x{61F6}' . + '\x{61F7}\x{61F8}\x{61F9}\x{61FA}\x{61FB}\x{61FC}\x{61FD}\x{61FE}\x{61FF}' . + '\x{6200}\x{6201}\x{6202}\x{6203}\x{6204}\x{6206}\x{6207}\x{6208}\x{6209}' . + '\x{620A}\x{620B}\x{620C}\x{620D}\x{620E}\x{620F}\x{6210}\x{6211}\x{6212}' . + '\x{6213}\x{6214}\x{6215}\x{6216}\x{6217}\x{6218}\x{6219}\x{621A}\x{621B}' . + '\x{621C}\x{621D}\x{621E}\x{621F}\x{6220}\x{6221}\x{6222}\x{6223}\x{6224}' . + '\x{6225}\x{6226}\x{6227}\x{6228}\x{6229}\x{622A}\x{622B}\x{622C}\x{622D}' . + '\x{622E}\x{622F}\x{6230}\x{6231}\x{6232}\x{6233}\x{6234}\x{6236}\x{6237}' . + '\x{6238}\x{623A}\x{623B}\x{623C}\x{623D}\x{623E}\x{623F}\x{6240}\x{6241}' . + '\x{6242}\x{6243}\x{6244}\x{6245}\x{6246}\x{6247}\x{6248}\x{6249}\x{624A}' . + '\x{624B}\x{624C}\x{624D}\x{624E}\x{624F}\x{6250}\x{6251}\x{6252}\x{6253}' . + '\x{6254}\x{6255}\x{6256}\x{6258}\x{6259}\x{625A}\x{625B}\x{625C}\x{625D}' . + '\x{625E}\x{625F}\x{6260}\x{6261}\x{6262}\x{6263}\x{6264}\x{6265}\x{6266}' . + '\x{6267}\x{6268}\x{6269}\x{626A}\x{626B}\x{626C}\x{626D}\x{626E}\x{626F}' . + '\x{6270}\x{6271}\x{6272}\x{6273}\x{6274}\x{6275}\x{6276}\x{6277}\x{6278}' . + '\x{6279}\x{627A}\x{627B}\x{627C}\x{627D}\x{627E}\x{627F}\x{6280}\x{6281}' . + '\x{6283}\x{6284}\x{6285}\x{6286}\x{6287}\x{6288}\x{6289}\x{628A}\x{628B}' . + '\x{628C}\x{628E}\x{628F}\x{6290}\x{6291}\x{6292}\x{6293}\x{6294}\x{6295}' . + '\x{6296}\x{6297}\x{6298}\x{6299}\x{629A}\x{629B}\x{629C}\x{629E}\x{629F}' . + '\x{62A0}\x{62A1}\x{62A2}\x{62A3}\x{62A4}\x{62A5}\x{62A7}\x{62A8}\x{62A9}' . + '\x{62AA}\x{62AB}\x{62AC}\x{62AD}\x{62AE}\x{62AF}\x{62B0}\x{62B1}\x{62B2}' . + '\x{62B3}\x{62B4}\x{62B5}\x{62B6}\x{62B7}\x{62B8}\x{62B9}\x{62BA}\x{62BB}' . + '\x{62BC}\x{62BD}\x{62BE}\x{62BF}\x{62C0}\x{62C1}\x{62C2}\x{62C3}\x{62C4}' . + '\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CB}\x{62CC}\x{62CD}' . + '\x{62CE}\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D5}\x{62D6}' . + '\x{62D7}\x{62D8}\x{62D9}\x{62DA}\x{62DB}\x{62DC}\x{62DD}\x{62DF}\x{62E0}' . + '\x{62E1}\x{62E2}\x{62E3}\x{62E4}\x{62E5}\x{62E6}\x{62E7}\x{62E8}\x{62E9}' . + '\x{62EB}\x{62EC}\x{62ED}\x{62EE}\x{62EF}\x{62F0}\x{62F1}\x{62F2}\x{62F3}' . + '\x{62F4}\x{62F5}\x{62F6}\x{62F7}\x{62F8}\x{62F9}\x{62FA}\x{62FB}\x{62FC}' . + '\x{62FD}\x{62FE}\x{62FF}\x{6300}\x{6301}\x{6302}\x{6303}\x{6304}\x{6305}' . + '\x{6306}\x{6307}\x{6308}\x{6309}\x{630B}\x{630C}\x{630D}\x{630E}\x{630F}' . + '\x{6310}\x{6311}\x{6312}\x{6313}\x{6314}\x{6315}\x{6316}\x{6318}\x{6319}' . + '\x{631A}\x{631B}\x{631C}\x{631D}\x{631E}\x{631F}\x{6320}\x{6321}\x{6322}' . + '\x{6323}\x{6324}\x{6325}\x{6326}\x{6327}\x{6328}\x{6329}\x{632A}\x{632B}' . + '\x{632C}\x{632D}\x{632E}\x{632F}\x{6330}\x{6332}\x{6333}\x{6334}\x{6336}' . + '\x{6338}\x{6339}\x{633A}\x{633B}\x{633C}\x{633D}\x{633E}\x{6340}\x{6341}' . + '\x{6342}\x{6343}\x{6344}\x{6345}\x{6346}\x{6347}\x{6348}\x{6349}\x{634A}' . + '\x{634B}\x{634C}\x{634D}\x{634E}\x{634F}\x{6350}\x{6351}\x{6352}\x{6353}' . + '\x{6354}\x{6355}\x{6356}\x{6357}\x{6358}\x{6359}\x{635A}\x{635C}\x{635D}' . + '\x{635E}\x{635F}\x{6360}\x{6361}\x{6362}\x{6363}\x{6364}\x{6365}\x{6366}' . + '\x{6367}\x{6368}\x{6369}\x{636A}\x{636B}\x{636C}\x{636D}\x{636E}\x{636F}' . + '\x{6370}\x{6371}\x{6372}\x{6373}\x{6374}\x{6375}\x{6376}\x{6377}\x{6378}' . + '\x{6379}\x{637A}\x{637B}\x{637C}\x{637D}\x{637E}\x{6380}\x{6381}\x{6382}' . + '\x{6383}\x{6384}\x{6385}\x{6386}\x{6387}\x{6388}\x{6389}\x{638A}\x{638C}' . + '\x{638D}\x{638E}\x{638F}\x{6390}\x{6391}\x{6392}\x{6394}\x{6395}\x{6396}' . + '\x{6397}\x{6398}\x{6399}\x{639A}\x{639B}\x{639C}\x{639D}\x{639E}\x{639F}' . + '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A4}\x{63A5}\x{63A6}\x{63A7}\x{63A8}' . + '\x{63A9}\x{63AA}\x{63AB}\x{63AC}\x{63AD}\x{63AE}\x{63AF}\x{63B0}\x{63B1}' . + '\x{63B2}\x{63B3}\x{63B4}\x{63B5}\x{63B6}\x{63B7}\x{63B8}\x{63B9}\x{63BA}' . + '\x{63BC}\x{63BD}\x{63BE}\x{63BF}\x{63C0}\x{63C1}\x{63C2}\x{63C3}\x{63C4}' . + '\x{63C5}\x{63C6}\x{63C7}\x{63C8}\x{63C9}\x{63CA}\x{63CB}\x{63CC}\x{63CD}' . + '\x{63CE}\x{63CF}\x{63D0}\x{63D2}\x{63D3}\x{63D4}\x{63D5}\x{63D6}\x{63D7}' . + '\x{63D8}\x{63D9}\x{63DA}\x{63DB}\x{63DC}\x{63DD}\x{63DE}\x{63DF}\x{63E0}' . + '\x{63E1}\x{63E2}\x{63E3}\x{63E4}\x{63E5}\x{63E6}\x{63E7}\x{63E8}\x{63E9}' . + '\x{63EA}\x{63EB}\x{63EC}\x{63ED}\x{63EE}\x{63EF}\x{63F0}\x{63F1}\x{63F2}' . + '\x{63F3}\x{63F4}\x{63F5}\x{63F6}\x{63F7}\x{63F8}\x{63F9}\x{63FA}\x{63FB}' . + '\x{63FC}\x{63FD}\x{63FE}\x{63FF}\x{6400}\x{6401}\x{6402}\x{6403}\x{6404}' . + '\x{6405}\x{6406}\x{6408}\x{6409}\x{640A}\x{640B}\x{640C}\x{640D}\x{640E}' . + '\x{640F}\x{6410}\x{6411}\x{6412}\x{6413}\x{6414}\x{6415}\x{6416}\x{6417}' . + '\x{6418}\x{6419}\x{641A}\x{641B}\x{641C}\x{641D}\x{641E}\x{641F}\x{6420}' . + '\x{6421}\x{6422}\x{6423}\x{6424}\x{6425}\x{6426}\x{6427}\x{6428}\x{6429}' . + '\x{642A}\x{642B}\x{642C}\x{642D}\x{642E}\x{642F}\x{6430}\x{6431}\x{6432}' . + '\x{6433}\x{6434}\x{6435}\x{6436}\x{6437}\x{6438}\x{6439}\x{643A}\x{643D}' . + '\x{643E}\x{643F}\x{6440}\x{6441}\x{6443}\x{6444}\x{6445}\x{6446}\x{6447}' . + '\x{6448}\x{644A}\x{644B}\x{644C}\x{644D}\x{644E}\x{644F}\x{6450}\x{6451}' . + '\x{6452}\x{6453}\x{6454}\x{6455}\x{6456}\x{6457}\x{6458}\x{6459}\x{645B}' . + '\x{645C}\x{645D}\x{645E}\x{645F}\x{6460}\x{6461}\x{6462}\x{6463}\x{6464}' . + '\x{6465}\x{6466}\x{6467}\x{6468}\x{6469}\x{646A}\x{646B}\x{646C}\x{646D}' . + '\x{646E}\x{646F}\x{6470}\x{6471}\x{6472}\x{6473}\x{6474}\x{6475}\x{6476}' . + '\x{6477}\x{6478}\x{6479}\x{647A}\x{647B}\x{647C}\x{647D}\x{647F}\x{6480}' . + '\x{6481}\x{6482}\x{6483}\x{6484}\x{6485}\x{6487}\x{6488}\x{6489}\x{648A}' . + '\x{648B}\x{648C}\x{648D}\x{648E}\x{648F}\x{6490}\x{6491}\x{6492}\x{6493}' . + '\x{6494}\x{6495}\x{6496}\x{6497}\x{6498}\x{6499}\x{649A}\x{649B}\x{649C}' . + '\x{649D}\x{649E}\x{649F}\x{64A0}\x{64A2}\x{64A3}\x{64A4}\x{64A5}\x{64A6}' . + '\x{64A7}\x{64A8}\x{64A9}\x{64AA}\x{64AB}\x{64AC}\x{64AD}\x{64AE}\x{64B0}' . + '\x{64B1}\x{64B2}\x{64B3}\x{64B4}\x{64B5}\x{64B7}\x{64B8}\x{64B9}\x{64BA}' . + '\x{64BB}\x{64BC}\x{64BD}\x{64BE}\x{64BF}\x{64C0}\x{64C1}\x{64C2}\x{64C3}' . + '\x{64C4}\x{64C5}\x{64C6}\x{64C7}\x{64C9}\x{64CA}\x{64CB}\x{64CC}\x{64CD}' . + '\x{64CE}\x{64CF}\x{64D0}\x{64D1}\x{64D2}\x{64D3}\x{64D4}\x{64D6}\x{64D7}' . + '\x{64D8}\x{64D9}\x{64DA}\x{64DB}\x{64DC}\x{64DD}\x{64DE}\x{64DF}\x{64E0}' . + '\x{64E2}\x{64E3}\x{64E4}\x{64E6}\x{64E7}\x{64E8}\x{64E9}\x{64EA}\x{64EB}' . + '\x{64EC}\x{64ED}\x{64EF}\x{64F0}\x{64F1}\x{64F2}\x{64F3}\x{64F4}\x{64F6}' . + '\x{64F7}\x{64F8}\x{64FA}\x{64FB}\x{64FC}\x{64FD}\x{64FE}\x{64FF}\x{6500}' . + '\x{6501}\x{6503}\x{6504}\x{6505}\x{6506}\x{6507}\x{6508}\x{6509}\x{650B}' . + '\x{650C}\x{650D}\x{650E}\x{650F}\x{6510}\x{6511}\x{6512}\x{6513}\x{6514}' . + '\x{6515}\x{6516}\x{6517}\x{6518}\x{6519}\x{651A}\x{651B}\x{651C}\x{651D}' . + '\x{651E}\x{6520}\x{6521}\x{6522}\x{6523}\x{6524}\x{6525}\x{6526}\x{6527}' . + '\x{6529}\x{652A}\x{652B}\x{652C}\x{652D}\x{652E}\x{652F}\x{6530}\x{6531}' . + '\x{6532}\x{6533}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}\x{653A}' . + '\x{653B}\x{653C}\x{653D}\x{653E}\x{653F}\x{6541}\x{6543}\x{6544}\x{6545}' . + '\x{6546}\x{6547}\x{6548}\x{6549}\x{654A}\x{654B}\x{654C}\x{654D}\x{654E}' . + '\x{654F}\x{6550}\x{6551}\x{6552}\x{6553}\x{6554}\x{6555}\x{6556}\x{6557}' . + '\x{6558}\x{6559}\x{655B}\x{655C}\x{655D}\x{655E}\x{6560}\x{6561}\x{6562}' . + '\x{6563}\x{6564}\x{6565}\x{6566}\x{6567}\x{6568}\x{6569}\x{656A}\x{656B}' . + '\x{656C}\x{656E}\x{656F}\x{6570}\x{6571}\x{6572}\x{6573}\x{6574}\x{6575}' . + '\x{6576}\x{6577}\x{6578}\x{6579}\x{657A}\x{657B}\x{657C}\x{657E}\x{657F}' . + '\x{6580}\x{6581}\x{6582}\x{6583}\x{6584}\x{6585}\x{6586}\x{6587}\x{6588}' . + '\x{6589}\x{658B}\x{658C}\x{658D}\x{658E}\x{658F}\x{6590}\x{6591}\x{6592}' . + '\x{6593}\x{6594}\x{6595}\x{6596}\x{6597}\x{6598}\x{6599}\x{659B}\x{659C}' . + '\x{659D}\x{659E}\x{659F}\x{65A0}\x{65A1}\x{65A2}\x{65A3}\x{65A4}\x{65A5}' . + '\x{65A6}\x{65A7}\x{65A8}\x{65A9}\x{65AA}\x{65AB}\x{65AC}\x{65AD}\x{65AE}' . + '\x{65AF}\x{65B0}\x{65B1}\x{65B2}\x{65B3}\x{65B4}\x{65B6}\x{65B7}\x{65B8}' . + '\x{65B9}\x{65BA}\x{65BB}\x{65BC}\x{65BD}\x{65BF}\x{65C0}\x{65C1}\x{65C2}' . + '\x{65C3}\x{65C4}\x{65C5}\x{65C6}\x{65C7}\x{65CA}\x{65CB}\x{65CC}\x{65CD}' . + '\x{65CE}\x{65CF}\x{65D0}\x{65D2}\x{65D3}\x{65D4}\x{65D5}\x{65D6}\x{65D7}' . + '\x{65DA}\x{65DB}\x{65DD}\x{65DE}\x{65DF}\x{65E0}\x{65E1}\x{65E2}\x{65E3}' . + '\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}\x{65EB}\x{65EC}\x{65ED}\x{65EE}' . + '\x{65EF}\x{65F0}\x{65F1}\x{65F2}\x{65F3}\x{65F4}\x{65F5}\x{65F6}\x{65F7}' . + '\x{65F8}\x{65FA}\x{65FB}\x{65FC}\x{65FD}\x{6600}\x{6601}\x{6602}\x{6603}' . + '\x{6604}\x{6605}\x{6606}\x{6607}\x{6608}\x{6609}\x{660A}\x{660B}\x{660C}' . + '\x{660D}\x{660E}\x{660F}\x{6610}\x{6611}\x{6612}\x{6613}\x{6614}\x{6615}' . + '\x{6616}\x{6618}\x{6619}\x{661A}\x{661B}\x{661C}\x{661D}\x{661F}\x{6620}' . + '\x{6621}\x{6622}\x{6623}\x{6624}\x{6625}\x{6626}\x{6627}\x{6628}\x{6629}' . + '\x{662A}\x{662B}\x{662D}\x{662E}\x{662F}\x{6630}\x{6631}\x{6632}\x{6633}' . + '\x{6634}\x{6635}\x{6636}\x{6639}\x{663A}\x{663C}\x{663D}\x{663E}\x{6640}' . + '\x{6641}\x{6642}\x{6643}\x{6644}\x{6645}\x{6646}\x{6647}\x{6649}\x{664A}' . + '\x{664B}\x{664C}\x{664E}\x{664F}\x{6650}\x{6651}\x{6652}\x{6653}\x{6654}' . + '\x{6655}\x{6656}\x{6657}\x{6658}\x{6659}\x{665A}\x{665B}\x{665C}\x{665D}' . + '\x{665E}\x{665F}\x{6661}\x{6662}\x{6664}\x{6665}\x{6666}\x{6668}\x{6669}' . + '\x{666A}\x{666B}\x{666C}\x{666D}\x{666E}\x{666F}\x{6670}\x{6671}\x{6672}' . + '\x{6673}\x{6674}\x{6675}\x{6676}\x{6677}\x{6678}\x{6679}\x{667A}\x{667B}' . + '\x{667C}\x{667D}\x{667E}\x{667F}\x{6680}\x{6681}\x{6682}\x{6683}\x{6684}' . + '\x{6685}\x{6686}\x{6687}\x{6688}\x{6689}\x{668A}\x{668B}\x{668C}\x{668D}' . + '\x{668E}\x{668F}\x{6690}\x{6691}\x{6693}\x{6694}\x{6695}\x{6696}\x{6697}' . + '\x{6698}\x{6699}\x{669A}\x{669B}\x{669D}\x{669F}\x{66A0}\x{66A1}\x{66A2}' . + '\x{66A3}\x{66A4}\x{66A5}\x{66A6}\x{66A7}\x{66A8}\x{66A9}\x{66AA}\x{66AB}' . + '\x{66AE}\x{66AF}\x{66B0}\x{66B1}\x{66B2}\x{66B3}\x{66B4}\x{66B5}\x{66B6}' . + '\x{66B7}\x{66B8}\x{66B9}\x{66BA}\x{66BB}\x{66BC}\x{66BD}\x{66BE}\x{66BF}' . + '\x{66C0}\x{66C1}\x{66C2}\x{66C3}\x{66C4}\x{66C5}\x{66C6}\x{66C7}\x{66C8}' . + '\x{66C9}\x{66CA}\x{66CB}\x{66CC}\x{66CD}\x{66CE}\x{66CF}\x{66D1}\x{66D2}' . + '\x{66D4}\x{66D5}\x{66D6}\x{66D8}\x{66D9}\x{66DA}\x{66DB}\x{66DC}\x{66DD}' . + '\x{66DE}\x{66E0}\x{66E1}\x{66E2}\x{66E3}\x{66E4}\x{66E5}\x{66E6}\x{66E7}' . + '\x{66E8}\x{66E9}\x{66EA}\x{66EB}\x{66EC}\x{66ED}\x{66EE}\x{66F0}\x{66F1}' . + '\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F6}\x{66F7}\x{66F8}\x{66F9}\x{66FA}' . + '\x{66FB}\x{66FC}\x{66FE}\x{66FF}\x{6700}\x{6701}\x{6703}\x{6704}\x{6705}' . + '\x{6706}\x{6708}\x{6709}\x{670A}\x{670B}\x{670C}\x{670D}\x{670E}\x{670F}' . + '\x{6710}\x{6711}\x{6712}\x{6713}\x{6714}\x{6715}\x{6716}\x{6717}\x{6718}' . + '\x{671A}\x{671B}\x{671C}\x{671D}\x{671E}\x{671F}\x{6720}\x{6721}\x{6722}' . + '\x{6723}\x{6725}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}\x{672D}' . + '\x{672E}\x{672F}\x{6730}\x{6731}\x{6732}\x{6733}\x{6734}\x{6735}\x{6736}' . + '\x{6737}\x{6738}\x{6739}\x{673A}\x{673B}\x{673C}\x{673D}\x{673E}\x{673F}' . + '\x{6740}\x{6741}\x{6742}\x{6743}\x{6744}\x{6745}\x{6746}\x{6747}\x{6748}' . + '\x{6749}\x{674A}\x{674B}\x{674C}\x{674D}\x{674E}\x{674F}\x{6750}\x{6751}' . + '\x{6752}\x{6753}\x{6754}\x{6755}\x{6756}\x{6757}\x{6758}\x{6759}\x{675A}' . + '\x{675B}\x{675C}\x{675D}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . + '\x{6764}\x{6765}\x{6766}\x{6768}\x{6769}\x{676A}\x{676B}\x{676C}\x{676D}' . + '\x{676E}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}\x{6774}\x{6775}\x{6776}' . + '\x{6777}\x{6778}\x{6779}\x{677A}\x{677B}\x{677C}\x{677D}\x{677E}\x{677F}' . + '\x{6780}\x{6781}\x{6782}\x{6783}\x{6784}\x{6785}\x{6786}\x{6787}\x{6789}' . + '\x{678A}\x{678B}\x{678C}\x{678D}\x{678E}\x{678F}\x{6790}\x{6791}\x{6792}' . + '\x{6793}\x{6794}\x{6795}\x{6797}\x{6798}\x{6799}\x{679A}\x{679B}\x{679C}' . + '\x{679D}\x{679E}\x{679F}\x{67A0}\x{67A1}\x{67A2}\x{67A3}\x{67A4}\x{67A5}' . + '\x{67A6}\x{67A7}\x{67A8}\x{67AA}\x{67AB}\x{67AC}\x{67AD}\x{67AE}\x{67AF}' . + '\x{67B0}\x{67B1}\x{67B2}\x{67B3}\x{67B4}\x{67B5}\x{67B6}\x{67B7}\x{67B8}' . + '\x{67B9}\x{67BA}\x{67BB}\x{67BC}\x{67BE}\x{67C0}\x{67C1}\x{67C2}\x{67C3}' . + '\x{67C4}\x{67C5}\x{67C6}\x{67C7}\x{67C8}\x{67C9}\x{67CA}\x{67CB}\x{67CC}' . + '\x{67CD}\x{67CE}\x{67CF}\x{67D0}\x{67D1}\x{67D2}\x{67D3}\x{67D4}\x{67D6}' . + '\x{67D8}\x{67D9}\x{67DA}\x{67DB}\x{67DC}\x{67DD}\x{67DE}\x{67DF}\x{67E0}' . + '\x{67E1}\x{67E2}\x{67E3}\x{67E4}\x{67E5}\x{67E6}\x{67E7}\x{67E8}\x{67E9}' . + '\x{67EA}\x{67EB}\x{67EC}\x{67ED}\x{67EE}\x{67EF}\x{67F0}\x{67F1}\x{67F2}' . + '\x{67F3}\x{67F4}\x{67F5}\x{67F6}\x{67F7}\x{67F8}\x{67FA}\x{67FB}\x{67FC}' . + '\x{67FD}\x{67FE}\x{67FF}\x{6800}\x{6802}\x{6803}\x{6804}\x{6805}\x{6806}' . + '\x{6807}\x{6808}\x{6809}\x{680A}\x{680B}\x{680C}\x{680D}\x{680E}\x{680F}' . + '\x{6810}\x{6811}\x{6812}\x{6813}\x{6814}\x{6816}\x{6817}\x{6818}\x{6819}' . + '\x{681A}\x{681B}\x{681C}\x{681D}\x{681F}\x{6820}\x{6821}\x{6822}\x{6823}' . + '\x{6824}\x{6825}\x{6826}\x{6828}\x{6829}\x{682A}\x{682B}\x{682C}\x{682D}' . + '\x{682E}\x{682F}\x{6831}\x{6832}\x{6833}\x{6834}\x{6835}\x{6836}\x{6837}' . + '\x{6838}\x{6839}\x{683A}\x{683B}\x{683C}\x{683D}\x{683E}\x{683F}\x{6840}' . + '\x{6841}\x{6842}\x{6843}\x{6844}\x{6845}\x{6846}\x{6847}\x{6848}\x{6849}' . + '\x{684A}\x{684B}\x{684C}\x{684D}\x{684E}\x{684F}\x{6850}\x{6851}\x{6852}' . + '\x{6853}\x{6854}\x{6855}\x{6856}\x{6857}\x{685B}\x{685D}\x{6860}\x{6861}' . + '\x{6862}\x{6863}\x{6864}\x{6865}\x{6866}\x{6867}\x{6868}\x{6869}\x{686A}' . + '\x{686B}\x{686C}\x{686D}\x{686E}\x{686F}\x{6870}\x{6871}\x{6872}\x{6873}' . + '\x{6874}\x{6875}\x{6876}\x{6877}\x{6878}\x{6879}\x{687B}\x{687C}\x{687D}' . + '\x{687E}\x{687F}\x{6880}\x{6881}\x{6882}\x{6883}\x{6884}\x{6885}\x{6886}' . + '\x{6887}\x{6888}\x{6889}\x{688A}\x{688B}\x{688C}\x{688D}\x{688E}\x{688F}' . + '\x{6890}\x{6891}\x{6892}\x{6893}\x{6894}\x{6896}\x{6897}\x{6898}\x{689A}' . + '\x{689B}\x{689C}\x{689D}\x{689E}\x{689F}\x{68A0}\x{68A1}\x{68A2}\x{68A3}' . + '\x{68A4}\x{68A6}\x{68A7}\x{68A8}\x{68A9}\x{68AA}\x{68AB}\x{68AC}\x{68AD}' . + '\x{68AE}\x{68AF}\x{68B0}\x{68B1}\x{68B2}\x{68B3}\x{68B4}\x{68B5}\x{68B6}' . + '\x{68B7}\x{68B9}\x{68BB}\x{68BC}\x{68BD}\x{68BE}\x{68BF}\x{68C0}\x{68C1}' . + '\x{68C2}\x{68C4}\x{68C6}\x{68C7}\x{68C8}\x{68C9}\x{68CA}\x{68CB}\x{68CC}' . + '\x{68CD}\x{68CE}\x{68CF}\x{68D0}\x{68D1}\x{68D2}\x{68D3}\x{68D4}\x{68D5}' . + '\x{68D6}\x{68D7}\x{68D8}\x{68DA}\x{68DB}\x{68DC}\x{68DD}\x{68DE}\x{68DF}' . + '\x{68E0}\x{68E1}\x{68E3}\x{68E4}\x{68E6}\x{68E7}\x{68E8}\x{68E9}\x{68EA}' . + '\x{68EB}\x{68EC}\x{68ED}\x{68EE}\x{68EF}\x{68F0}\x{68F1}\x{68F2}\x{68F3}' . + '\x{68F4}\x{68F5}\x{68F6}\x{68F7}\x{68F8}\x{68F9}\x{68FA}\x{68FB}\x{68FC}' . + '\x{68FD}\x{68FE}\x{68FF}\x{6901}\x{6902}\x{6903}\x{6904}\x{6905}\x{6906}' . + '\x{6907}\x{6908}\x{690A}\x{690B}\x{690C}\x{690D}\x{690E}\x{690F}\x{6910}' . + '\x{6911}\x{6912}\x{6913}\x{6914}\x{6915}\x{6916}\x{6917}\x{6918}\x{6919}' . + '\x{691A}\x{691B}\x{691C}\x{691D}\x{691E}\x{691F}\x{6920}\x{6921}\x{6922}' . + '\x{6923}\x{6924}\x{6925}\x{6926}\x{6927}\x{6928}\x{6929}\x{692A}\x{692B}' . + '\x{692C}\x{692D}\x{692E}\x{692F}\x{6930}\x{6931}\x{6932}\x{6933}\x{6934}' . + '\x{6935}\x{6936}\x{6937}\x{6938}\x{6939}\x{693A}\x{693B}\x{693C}\x{693D}' . + '\x{693F}\x{6940}\x{6941}\x{6942}\x{6943}\x{6944}\x{6945}\x{6946}\x{6947}' . + '\x{6948}\x{6949}\x{694A}\x{694B}\x{694C}\x{694E}\x{694F}\x{6950}\x{6951}' . + '\x{6952}\x{6953}\x{6954}\x{6955}\x{6956}\x{6957}\x{6958}\x{6959}\x{695A}' . + '\x{695B}\x{695C}\x{695D}\x{695E}\x{695F}\x{6960}\x{6961}\x{6962}\x{6963}' . + '\x{6964}\x{6965}\x{6966}\x{6967}\x{6968}\x{6969}\x{696A}\x{696B}\x{696C}' . + '\x{696D}\x{696E}\x{696F}\x{6970}\x{6971}\x{6972}\x{6973}\x{6974}\x{6975}' . + '\x{6976}\x{6977}\x{6978}\x{6979}\x{697A}\x{697B}\x{697C}\x{697D}\x{697E}' . + '\x{697F}\x{6980}\x{6981}\x{6982}\x{6983}\x{6984}\x{6985}\x{6986}\x{6987}' . + '\x{6988}\x{6989}\x{698A}\x{698B}\x{698C}\x{698D}\x{698E}\x{698F}\x{6990}' . + '\x{6991}\x{6992}\x{6993}\x{6994}\x{6995}\x{6996}\x{6997}\x{6998}\x{6999}' . + '\x{699A}\x{699B}\x{699C}\x{699D}\x{699E}\x{69A0}\x{69A1}\x{69A3}\x{69A4}' . + '\x{69A5}\x{69A6}\x{69A7}\x{69A8}\x{69A9}\x{69AA}\x{69AB}\x{69AC}\x{69AD}' . + '\x{69AE}\x{69AF}\x{69B0}\x{69B1}\x{69B2}\x{69B3}\x{69B4}\x{69B5}\x{69B6}' . + '\x{69B7}\x{69B8}\x{69B9}\x{69BA}\x{69BB}\x{69BC}\x{69BD}\x{69BE}\x{69BF}' . + '\x{69C1}\x{69C2}\x{69C3}\x{69C4}\x{69C5}\x{69C6}\x{69C7}\x{69C8}\x{69C9}' . + '\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}\x{69CF}\x{69D0}\x{69D3}\x{69D4}' . + '\x{69D8}\x{69D9}\x{69DA}\x{69DB}\x{69DC}\x{69DD}\x{69DE}\x{69DF}\x{69E0}' . + '\x{69E1}\x{69E2}\x{69E3}\x{69E4}\x{69E5}\x{69E6}\x{69E7}\x{69E8}\x{69E9}' . + '\x{69EA}\x{69EB}\x{69EC}\x{69ED}\x{69EE}\x{69EF}\x{69F0}\x{69F1}\x{69F2}' . + '\x{69F3}\x{69F4}\x{69F5}\x{69F6}\x{69F7}\x{69F8}\x{69FA}\x{69FB}\x{69FC}' . + '\x{69FD}\x{69FE}\x{69FF}\x{6A00}\x{6A01}\x{6A02}\x{6A04}\x{6A05}\x{6A06}' . + '\x{6A07}\x{6A08}\x{6A09}\x{6A0A}\x{6A0B}\x{6A0D}\x{6A0E}\x{6A0F}\x{6A10}' . + '\x{6A11}\x{6A12}\x{6A13}\x{6A14}\x{6A15}\x{6A16}\x{6A17}\x{6A18}\x{6A19}' . + '\x{6A1A}\x{6A1B}\x{6A1D}\x{6A1E}\x{6A1F}\x{6A20}\x{6A21}\x{6A22}\x{6A23}' . + '\x{6A25}\x{6A26}\x{6A27}\x{6A28}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2C}\x{6A2D}' . + '\x{6A2E}\x{6A2F}\x{6A30}\x{6A31}\x{6A32}\x{6A33}\x{6A34}\x{6A35}\x{6A36}' . + '\x{6A38}\x{6A39}\x{6A3A}\x{6A3B}\x{6A3C}\x{6A3D}\x{6A3E}\x{6A3F}\x{6A40}' . + '\x{6A41}\x{6A42}\x{6A43}\x{6A44}\x{6A45}\x{6A46}\x{6A47}\x{6A48}\x{6A49}' . + '\x{6A4B}\x{6A4C}\x{6A4D}\x{6A4E}\x{6A4F}\x{6A50}\x{6A51}\x{6A52}\x{6A54}' . + '\x{6A55}\x{6A56}\x{6A57}\x{6A58}\x{6A59}\x{6A5A}\x{6A5B}\x{6A5D}\x{6A5E}' . + '\x{6A5F}\x{6A60}\x{6A61}\x{6A62}\x{6A63}\x{6A64}\x{6A65}\x{6A66}\x{6A67}' . + '\x{6A68}\x{6A69}\x{6A6A}\x{6A6B}\x{6A6C}\x{6A6D}\x{6A6F}\x{6A71}\x{6A72}' . + '\x{6A73}\x{6A74}\x{6A75}\x{6A76}\x{6A77}\x{6A78}\x{6A79}\x{6A7A}\x{6A7B}' . + '\x{6A7C}\x{6A7D}\x{6A7E}\x{6A7F}\x{6A80}\x{6A81}\x{6A82}\x{6A83}\x{6A84}' . + '\x{6A85}\x{6A87}\x{6A88}\x{6A89}\x{6A8B}\x{6A8C}\x{6A8D}\x{6A8E}\x{6A90}' . + '\x{6A91}\x{6A92}\x{6A93}\x{6A94}\x{6A95}\x{6A96}\x{6A97}\x{6A98}\x{6A9A}' . + '\x{6A9B}\x{6A9C}\x{6A9E}\x{6A9F}\x{6AA0}\x{6AA1}\x{6AA2}\x{6AA3}\x{6AA4}' . + '\x{6AA5}\x{6AA6}\x{6AA7}\x{6AA8}\x{6AA9}\x{6AAB}\x{6AAC}\x{6AAD}\x{6AAE}' . + '\x{6AAF}\x{6AB0}\x{6AB2}\x{6AB3}\x{6AB4}\x{6AB5}\x{6AB6}\x{6AB7}\x{6AB8}' . + '\x{6AB9}\x{6ABA}\x{6ABB}\x{6ABC}\x{6ABD}\x{6ABF}\x{6AC1}\x{6AC2}\x{6AC3}' . + '\x{6AC5}\x{6AC6}\x{6AC7}\x{6ACA}\x{6ACB}\x{6ACC}\x{6ACD}\x{6ACE}\x{6ACF}' . + '\x{6AD0}\x{6AD1}\x{6AD2}\x{6AD3}\x{6AD4}\x{6AD5}\x{6AD6}\x{6AD7}\x{6AD9}' . + '\x{6ADA}\x{6ADB}\x{6ADC}\x{6ADD}\x{6ADE}\x{6ADF}\x{6AE0}\x{6AE1}\x{6AE2}' . + '\x{6AE3}\x{6AE4}\x{6AE5}\x{6AE6}\x{6AE7}\x{6AE8}\x{6AEA}\x{6AEB}\x{6AEC}' . + '\x{6AED}\x{6AEE}\x{6AEF}\x{6AF0}\x{6AF1}\x{6AF2}\x{6AF3}\x{6AF4}\x{6AF5}' . + '\x{6AF6}\x{6AF7}\x{6AF8}\x{6AF9}\x{6AFA}\x{6AFB}\x{6AFC}\x{6AFD}\x{6AFE}' . + '\x{6AFF}\x{6B00}\x{6B01}\x{6B02}\x{6B03}\x{6B04}\x{6B05}\x{6B06}\x{6B07}' . + '\x{6B08}\x{6B09}\x{6B0A}\x{6B0B}\x{6B0C}\x{6B0D}\x{6B0F}\x{6B10}\x{6B11}' . + '\x{6B12}\x{6B13}\x{6B14}\x{6B15}\x{6B16}\x{6B17}\x{6B18}\x{6B19}\x{6B1A}' . + '\x{6B1C}\x{6B1D}\x{6B1E}\x{6B1F}\x{6B20}\x{6B21}\x{6B22}\x{6B23}\x{6B24}' . + '\x{6B25}\x{6B26}\x{6B27}\x{6B28}\x{6B29}\x{6B2A}\x{6B2B}\x{6B2C}\x{6B2D}' . + '\x{6B2F}\x{6B30}\x{6B31}\x{6B32}\x{6B33}\x{6B34}\x{6B36}\x{6B37}\x{6B38}' . + '\x{6B39}\x{6B3A}\x{6B3B}\x{6B3C}\x{6B3D}\x{6B3E}\x{6B3F}\x{6B41}\x{6B42}' . + '\x{6B43}\x{6B44}\x{6B45}\x{6B46}\x{6B47}\x{6B48}\x{6B49}\x{6B4A}\x{6B4B}' . + '\x{6B4C}\x{6B4D}\x{6B4E}\x{6B4F}\x{6B50}\x{6B51}\x{6B52}\x{6B53}\x{6B54}' . + '\x{6B55}\x{6B56}\x{6B59}\x{6B5A}\x{6B5B}\x{6B5C}\x{6B5E}\x{6B5F}\x{6B60}' . + '\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B65}\x{6B66}\x{6B67}\x{6B69}\x{6B6A}' . + '\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}\x{6B73}\x{6B74}\x{6B76}\x{6B77}' . + '\x{6B78}\x{6B79}\x{6B7A}\x{6B7B}\x{6B7C}\x{6B7E}\x{6B7F}\x{6B80}\x{6B81}' . + '\x{6B82}\x{6B83}\x{6B84}\x{6B85}\x{6B86}\x{6B87}\x{6B88}\x{6B89}\x{6B8A}' . + '\x{6B8B}\x{6B8C}\x{6B8D}\x{6B8E}\x{6B8F}\x{6B90}\x{6B91}\x{6B92}\x{6B93}' . + '\x{6B94}\x{6B95}\x{6B96}\x{6B97}\x{6B98}\x{6B99}\x{6B9A}\x{6B9B}\x{6B9C}' . + '\x{6B9D}\x{6B9E}\x{6B9F}\x{6BA0}\x{6BA1}\x{6BA2}\x{6BA3}\x{6BA4}\x{6BA5}' . + '\x{6BA6}\x{6BA7}\x{6BA8}\x{6BA9}\x{6BAA}\x{6BAB}\x{6BAC}\x{6BAD}\x{6BAE}' . + '\x{6BAF}\x{6BB0}\x{6BB2}\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB6}\x{6BB7}\x{6BB9}' . + '\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBD}\x{6BBE}\x{6BBF}\x{6BC0}\x{6BC1}\x{6BC2}' . + '\x{6BC3}\x{6BC4}\x{6BC5}\x{6BC6}\x{6BC7}\x{6BC8}\x{6BC9}\x{6BCA}\x{6BCB}' . + '\x{6BCC}\x{6BCD}\x{6BCE}\x{6BCF}\x{6BD0}\x{6BD1}\x{6BD2}\x{6BD3}\x{6BD4}' . + '\x{6BD5}\x{6BD6}\x{6BD7}\x{6BD8}\x{6BD9}\x{6BDA}\x{6BDB}\x{6BDC}\x{6BDD}' . + '\x{6BDE}\x{6BDF}\x{6BE0}\x{6BE1}\x{6BE2}\x{6BE3}\x{6BE4}\x{6BE5}\x{6BE6}' . + '\x{6BE7}\x{6BE8}\x{6BEA}\x{6BEB}\x{6BEC}\x{6BED}\x{6BEE}\x{6BEF}\x{6BF0}' . + '\x{6BF2}\x{6BF3}\x{6BF5}\x{6BF6}\x{6BF7}\x{6BF8}\x{6BF9}\x{6BFB}\x{6BFC}' . + '\x{6BFD}\x{6BFE}\x{6BFF}\x{6C00}\x{6C01}\x{6C02}\x{6C03}\x{6C04}\x{6C05}' . + '\x{6C06}\x{6C07}\x{6C08}\x{6C09}\x{6C0B}\x{6C0C}\x{6C0D}\x{6C0E}\x{6C0F}' . + '\x{6C10}\x{6C11}\x{6C12}\x{6C13}\x{6C14}\x{6C15}\x{6C16}\x{6C18}\x{6C19}' . + '\x{6C1A}\x{6C1B}\x{6C1D}\x{6C1E}\x{6C1F}\x{6C20}\x{6C21}\x{6C22}\x{6C23}' . + '\x{6C24}\x{6C25}\x{6C26}\x{6C27}\x{6C28}\x{6C29}\x{6C2A}\x{6C2B}\x{6C2C}' . + '\x{6C2E}\x{6C2F}\x{6C30}\x{6C31}\x{6C32}\x{6C33}\x{6C34}\x{6C35}\x{6C36}' . + '\x{6C37}\x{6C38}\x{6C3A}\x{6C3B}\x{6C3D}\x{6C3E}\x{6C3F}\x{6C40}\x{6C41}' . + '\x{6C42}\x{6C43}\x{6C44}\x{6C46}\x{6C47}\x{6C48}\x{6C49}\x{6C4A}\x{6C4B}' . + '\x{6C4C}\x{6C4D}\x{6C4E}\x{6C4F}\x{6C50}\x{6C51}\x{6C52}\x{6C53}\x{6C54}' . + '\x{6C55}\x{6C56}\x{6C57}\x{6C58}\x{6C59}\x{6C5A}\x{6C5B}\x{6C5C}\x{6C5D}' . + '\x{6C5E}\x{6C5F}\x{6C60}\x{6C61}\x{6C62}\x{6C63}\x{6C64}\x{6C65}\x{6C66}' . + '\x{6C67}\x{6C68}\x{6C69}\x{6C6A}\x{6C6B}\x{6C6D}\x{6C6F}\x{6C70}\x{6C71}' . + '\x{6C72}\x{6C73}\x{6C74}\x{6C75}\x{6C76}\x{6C77}\x{6C78}\x{6C79}\x{6C7A}' . + '\x{6C7B}\x{6C7C}\x{6C7D}\x{6C7E}\x{6C7F}\x{6C80}\x{6C81}\x{6C82}\x{6C83}' . + '\x{6C84}\x{6C85}\x{6C86}\x{6C87}\x{6C88}\x{6C89}\x{6C8A}\x{6C8B}\x{6C8C}' . + '\x{6C8D}\x{6C8E}\x{6C8F}\x{6C90}\x{6C91}\x{6C92}\x{6C93}\x{6C94}\x{6C95}' . + '\x{6C96}\x{6C97}\x{6C98}\x{6C99}\x{6C9A}\x{6C9B}\x{6C9C}\x{6C9D}\x{6C9E}' . + '\x{6C9F}\x{6CA1}\x{6CA2}\x{6CA3}\x{6CA4}\x{6CA5}\x{6CA6}\x{6CA7}\x{6CA8}' . + '\x{6CA9}\x{6CAA}\x{6CAB}\x{6CAC}\x{6CAD}\x{6CAE}\x{6CAF}\x{6CB0}\x{6CB1}' . + '\x{6CB2}\x{6CB3}\x{6CB4}\x{6CB5}\x{6CB6}\x{6CB7}\x{6CB8}\x{6CB9}\x{6CBA}' . + '\x{6CBB}\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC0}\x{6CC1}\x{6CC2}\x{6CC3}' . + '\x{6CC4}\x{6CC5}\x{6CC6}\x{6CC7}\x{6CC8}\x{6CC9}\x{6CCA}\x{6CCB}\x{6CCC}' . + '\x{6CCD}\x{6CCE}\x{6CCF}\x{6CD0}\x{6CD1}\x{6CD2}\x{6CD3}\x{6CD4}\x{6CD5}' . + '\x{6CD6}\x{6CD7}\x{6CD9}\x{6CDA}\x{6CDB}\x{6CDC}\x{6CDD}\x{6CDE}\x{6CDF}' . + '\x{6CE0}\x{6CE1}\x{6CE2}\x{6CE3}\x{6CE4}\x{6CE5}\x{6CE6}\x{6CE7}\x{6CE8}' . + '\x{6CE9}\x{6CEA}\x{6CEB}\x{6CEC}\x{6CED}\x{6CEE}\x{6CEF}\x{6CF0}\x{6CF1}' . + '\x{6CF2}\x{6CF3}\x{6CF5}\x{6CF6}\x{6CF7}\x{6CF8}\x{6CF9}\x{6CFA}\x{6CFB}' . + '\x{6CFC}\x{6CFD}\x{6CFE}\x{6CFF}\x{6D00}\x{6D01}\x{6D03}\x{6D04}\x{6D05}' . + '\x{6D06}\x{6D07}\x{6D08}\x{6D09}\x{6D0A}\x{6D0B}\x{6D0C}\x{6D0D}\x{6D0E}' . + '\x{6D0F}\x{6D10}\x{6D11}\x{6D12}\x{6D13}\x{6D14}\x{6D15}\x{6D16}\x{6D17}' . + '\x{6D18}\x{6D19}\x{6D1A}\x{6D1B}\x{6D1D}\x{6D1E}\x{6D1F}\x{6D20}\x{6D21}' . + '\x{6D22}\x{6D23}\x{6D25}\x{6D26}\x{6D27}\x{6D28}\x{6D29}\x{6D2A}\x{6D2B}' . + '\x{6D2C}\x{6D2D}\x{6D2E}\x{6D2F}\x{6D30}\x{6D31}\x{6D32}\x{6D33}\x{6D34}' . + '\x{6D35}\x{6D36}\x{6D37}\x{6D38}\x{6D39}\x{6D3A}\x{6D3B}\x{6D3C}\x{6D3D}' . + '\x{6D3E}\x{6D3F}\x{6D40}\x{6D41}\x{6D42}\x{6D43}\x{6D44}\x{6D45}\x{6D46}' . + '\x{6D47}\x{6D48}\x{6D49}\x{6D4A}\x{6D4B}\x{6D4C}\x{6D4D}\x{6D4E}\x{6D4F}' . + '\x{6D50}\x{6D51}\x{6D52}\x{6D53}\x{6D54}\x{6D55}\x{6D56}\x{6D57}\x{6D58}' . + '\x{6D59}\x{6D5A}\x{6D5B}\x{6D5C}\x{6D5D}\x{6D5E}\x{6D5F}\x{6D60}\x{6D61}' . + '\x{6D62}\x{6D63}\x{6D64}\x{6D65}\x{6D66}\x{6D67}\x{6D68}\x{6D69}\x{6D6A}' . + '\x{6D6B}\x{6D6C}\x{6D6D}\x{6D6E}\x{6D6F}\x{6D70}\x{6D72}\x{6D73}\x{6D74}' . + '\x{6D75}\x{6D76}\x{6D77}\x{6D78}\x{6D79}\x{6D7A}\x{6D7B}\x{6D7C}\x{6D7D}' . + '\x{6D7E}\x{6D7F}\x{6D80}\x{6D82}\x{6D83}\x{6D84}\x{6D85}\x{6D86}\x{6D87}' . + '\x{6D88}\x{6D89}\x{6D8A}\x{6D8B}\x{6D8C}\x{6D8D}\x{6D8E}\x{6D8F}\x{6D90}' . + '\x{6D91}\x{6D92}\x{6D93}\x{6D94}\x{6D95}\x{6D97}\x{6D98}\x{6D99}\x{6D9A}' . + '\x{6D9B}\x{6D9D}\x{6D9E}\x{6D9F}\x{6DA0}\x{6DA1}\x{6DA2}\x{6DA3}\x{6DA4}' . + '\x{6DA5}\x{6DA6}\x{6DA7}\x{6DA8}\x{6DA9}\x{6DAA}\x{6DAB}\x{6DAC}\x{6DAD}' . + '\x{6DAE}\x{6DAF}\x{6DB2}\x{6DB3}\x{6DB4}\x{6DB5}\x{6DB7}\x{6DB8}\x{6DB9}' . + '\x{6DBA}\x{6DBB}\x{6DBC}\x{6DBD}\x{6DBE}\x{6DBF}\x{6DC0}\x{6DC1}\x{6DC2}' . + '\x{6DC3}\x{6DC4}\x{6DC5}\x{6DC6}\x{6DC7}\x{6DC8}\x{6DC9}\x{6DCA}\x{6DCB}' . + '\x{6DCC}\x{6DCD}\x{6DCE}\x{6DCF}\x{6DD0}\x{6DD1}\x{6DD2}\x{6DD3}\x{6DD4}' . + '\x{6DD5}\x{6DD6}\x{6DD7}\x{6DD8}\x{6DD9}\x{6DDA}\x{6DDB}\x{6DDC}\x{6DDD}' . + '\x{6DDE}\x{6DDF}\x{6DE0}\x{6DE1}\x{6DE2}\x{6DE3}\x{6DE4}\x{6DE5}\x{6DE6}' . + '\x{6DE7}\x{6DE8}\x{6DE9}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DED}\x{6DEE}\x{6DEF}' . + '\x{6DF0}\x{6DF1}\x{6DF2}\x{6DF3}\x{6DF4}\x{6DF5}\x{6DF6}\x{6DF7}\x{6DF8}' . + '\x{6DF9}\x{6DFA}\x{6DFB}\x{6DFC}\x{6DFD}\x{6E00}\x{6E03}\x{6E04}\x{6E05}' . + '\x{6E07}\x{6E08}\x{6E09}\x{6E0A}\x{6E0B}\x{6E0C}\x{6E0D}\x{6E0E}\x{6E0F}' . + '\x{6E10}\x{6E11}\x{6E14}\x{6E15}\x{6E16}\x{6E17}\x{6E19}\x{6E1A}\x{6E1B}' . + '\x{6E1C}\x{6E1D}\x{6E1E}\x{6E1F}\x{6E20}\x{6E21}\x{6E22}\x{6E23}\x{6E24}' . + '\x{6E25}\x{6E26}\x{6E27}\x{6E28}\x{6E29}\x{6E2B}\x{6E2C}\x{6E2D}\x{6E2E}' . + '\x{6E2F}\x{6E30}\x{6E31}\x{6E32}\x{6E33}\x{6E34}\x{6E35}\x{6E36}\x{6E37}' . + '\x{6E38}\x{6E39}\x{6E3A}\x{6E3B}\x{6E3C}\x{6E3D}\x{6E3E}\x{6E3F}\x{6E40}' . + '\x{6E41}\x{6E42}\x{6E43}\x{6E44}\x{6E45}\x{6E46}\x{6E47}\x{6E48}\x{6E49}' . + '\x{6E4A}\x{6E4B}\x{6E4D}\x{6E4E}\x{6E4F}\x{6E50}\x{6E51}\x{6E52}\x{6E53}' . + '\x{6E54}\x{6E55}\x{6E56}\x{6E57}\x{6E58}\x{6E59}\x{6E5A}\x{6E5B}\x{6E5C}' . + '\x{6E5D}\x{6E5E}\x{6E5F}\x{6E60}\x{6E61}\x{6E62}\x{6E63}\x{6E64}\x{6E65}' . + '\x{6E66}\x{6E67}\x{6E68}\x{6E69}\x{6E6A}\x{6E6B}\x{6E6D}\x{6E6E}\x{6E6F}' . + '\x{6E70}\x{6E71}\x{6E72}\x{6E73}\x{6E74}\x{6E75}\x{6E77}\x{6E78}\x{6E79}' . + '\x{6E7E}\x{6E7F}\x{6E80}\x{6E81}\x{6E82}\x{6E83}\x{6E84}\x{6E85}\x{6E86}' . + '\x{6E87}\x{6E88}\x{6E89}\x{6E8A}\x{6E8D}\x{6E8E}\x{6E8F}\x{6E90}\x{6E91}' . + '\x{6E92}\x{6E93}\x{6E94}\x{6E96}\x{6E97}\x{6E98}\x{6E99}\x{6E9A}\x{6E9B}' . + '\x{6E9C}\x{6E9D}\x{6E9E}\x{6E9F}\x{6EA0}\x{6EA1}\x{6EA2}\x{6EA3}\x{6EA4}' . + '\x{6EA5}\x{6EA6}\x{6EA7}\x{6EA8}\x{6EA9}\x{6EAA}\x{6EAB}\x{6EAC}\x{6EAD}' . + '\x{6EAE}\x{6EAF}\x{6EB0}\x{6EB1}\x{6EB2}\x{6EB3}\x{6EB4}\x{6EB5}\x{6EB6}' . + '\x{6EB7}\x{6EB8}\x{6EB9}\x{6EBA}\x{6EBB}\x{6EBC}\x{6EBD}\x{6EBE}\x{6EBF}' . + '\x{6EC0}\x{6EC1}\x{6EC2}\x{6EC3}\x{6EC4}\x{6EC5}\x{6EC6}\x{6EC7}\x{6EC8}' . + '\x{6EC9}\x{6ECA}\x{6ECB}\x{6ECC}\x{6ECD}\x{6ECE}\x{6ECF}\x{6ED0}\x{6ED1}' . + '\x{6ED2}\x{6ED3}\x{6ED4}\x{6ED5}\x{6ED6}\x{6ED7}\x{6ED8}\x{6ED9}\x{6EDA}' . + '\x{6EDC}\x{6EDE}\x{6EDF}\x{6EE0}\x{6EE1}\x{6EE2}\x{6EE4}\x{6EE5}\x{6EE6}' . + '\x{6EE7}\x{6EE8}\x{6EE9}\x{6EEA}\x{6EEB}\x{6EEC}\x{6EED}\x{6EEE}\x{6EEF}' . + '\x{6EF0}\x{6EF1}\x{6EF2}\x{6EF3}\x{6EF4}\x{6EF5}\x{6EF6}\x{6EF7}\x{6EF8}' . + '\x{6EF9}\x{6EFA}\x{6EFB}\x{6EFC}\x{6EFD}\x{6EFE}\x{6EFF}\x{6F00}\x{6F01}' . + '\x{6F02}\x{6F03}\x{6F05}\x{6F06}\x{6F07}\x{6F08}\x{6F09}\x{6F0A}\x{6F0C}' . + '\x{6F0D}\x{6F0E}\x{6F0F}\x{6F10}\x{6F11}\x{6F12}\x{6F13}\x{6F14}\x{6F15}' . + '\x{6F16}\x{6F17}\x{6F18}\x{6F19}\x{6F1A}\x{6F1B}\x{6F1C}\x{6F1D}\x{6F1E}' . + '\x{6F1F}\x{6F20}\x{6F21}\x{6F22}\x{6F23}\x{6F24}\x{6F25}\x{6F26}\x{6F27}' . + '\x{6F28}\x{6F29}\x{6F2A}\x{6F2B}\x{6F2C}\x{6F2D}\x{6F2E}\x{6F2F}\x{6F30}' . + '\x{6F31}\x{6F32}\x{6F33}\x{6F34}\x{6F35}\x{6F36}\x{6F37}\x{6F38}\x{6F39}' . + '\x{6F3A}\x{6F3B}\x{6F3C}\x{6F3D}\x{6F3E}\x{6F3F}\x{6F40}\x{6F41}\x{6F43}' . + '\x{6F44}\x{6F45}\x{6F46}\x{6F47}\x{6F49}\x{6F4B}\x{6F4C}\x{6F4D}\x{6F4E}' . + '\x{6F4F}\x{6F50}\x{6F51}\x{6F52}\x{6F53}\x{6F54}\x{6F55}\x{6F56}\x{6F57}' . + '\x{6F58}\x{6F59}\x{6F5A}\x{6F5B}\x{6F5C}\x{6F5D}\x{6F5E}\x{6F5F}\x{6F60}' . + '\x{6F61}\x{6F62}\x{6F63}\x{6F64}\x{6F65}\x{6F66}\x{6F67}\x{6F68}\x{6F69}' . + '\x{6F6A}\x{6F6B}\x{6F6C}\x{6F6D}\x{6F6E}\x{6F6F}\x{6F70}\x{6F71}\x{6F72}' . + '\x{6F73}\x{6F74}\x{6F75}\x{6F76}\x{6F77}\x{6F78}\x{6F7A}\x{6F7B}\x{6F7C}' . + '\x{6F7D}\x{6F7E}\x{6F7F}\x{6F80}\x{6F81}\x{6F82}\x{6F83}\x{6F84}\x{6F85}' . + '\x{6F86}\x{6F87}\x{6F88}\x{6F89}\x{6F8A}\x{6F8B}\x{6F8C}\x{6F8D}\x{6F8E}' . + '\x{6F8F}\x{6F90}\x{6F91}\x{6F92}\x{6F93}\x{6F94}\x{6F95}\x{6F96}\x{6F97}' . + '\x{6F99}\x{6F9B}\x{6F9C}\x{6F9D}\x{6F9E}\x{6FA0}\x{6FA1}\x{6FA2}\x{6FA3}' . + '\x{6FA4}\x{6FA5}\x{6FA6}\x{6FA7}\x{6FA8}\x{6FA9}\x{6FAA}\x{6FAB}\x{6FAC}' . + '\x{6FAD}\x{6FAE}\x{6FAF}\x{6FB0}\x{6FB1}\x{6FB2}\x{6FB3}\x{6FB4}\x{6FB5}' . + '\x{6FB6}\x{6FB8}\x{6FB9}\x{6FBA}\x{6FBB}\x{6FBC}\x{6FBD}\x{6FBE}\x{6FBF}' . + '\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC4}\x{6FC6}\x{6FC7}\x{6FC8}\x{6FC9}' . + '\x{6FCA}\x{6FCB}\x{6FCC}\x{6FCD}\x{6FCE}\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}' . + '\x{6FD5}\x{6FD6}\x{6FD7}\x{6FD8}\x{6FD9}\x{6FDA}\x{6FDB}\x{6FDC}\x{6FDD}' . + '\x{6FDE}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE2}\x{6FE3}\x{6FE4}\x{6FE5}\x{6FE6}' . + '\x{6FE7}\x{6FE8}\x{6FE9}\x{6FEA}\x{6FEB}\x{6FEC}\x{6FED}\x{6FEE}\x{6FEF}' . + '\x{6FF0}\x{6FF1}\x{6FF2}\x{6FF3}\x{6FF4}\x{6FF6}\x{6FF7}\x{6FF8}\x{6FF9}' . + '\x{6FFA}\x{6FFB}\x{6FFC}\x{6FFE}\x{6FFF}\x{7000}\x{7001}\x{7002}\x{7003}' . + '\x{7004}\x{7005}\x{7006}\x{7007}\x{7008}\x{7009}\x{700A}\x{700B}\x{700C}' . + '\x{700D}\x{700E}\x{700F}\x{7011}\x{7012}\x{7014}\x{7015}\x{7016}\x{7017}' . + '\x{7018}\x{7019}\x{701A}\x{701B}\x{701C}\x{701D}\x{701F}\x{7020}\x{7021}' . + '\x{7022}\x{7023}\x{7024}\x{7025}\x{7026}\x{7027}\x{7028}\x{7029}\x{702A}' . + '\x{702B}\x{702C}\x{702D}\x{702E}\x{702F}\x{7030}\x{7031}\x{7032}\x{7033}' . + '\x{7034}\x{7035}\x{7036}\x{7037}\x{7038}\x{7039}\x{703A}\x{703B}\x{703C}' . + '\x{703D}\x{703E}\x{703F}\x{7040}\x{7041}\x{7042}\x{7043}\x{7044}\x{7045}' . + '\x{7046}\x{7048}\x{7049}\x{704A}\x{704C}\x{704D}\x{704F}\x{7050}\x{7051}' . + '\x{7052}\x{7053}\x{7054}\x{7055}\x{7056}\x{7057}\x{7058}\x{7059}\x{705A}' . + '\x{705B}\x{705C}\x{705D}\x{705E}\x{705F}\x{7060}\x{7061}\x{7062}\x{7063}' . + '\x{7064}\x{7065}\x{7066}\x{7067}\x{7068}\x{7069}\x{706A}\x{706B}\x{706C}' . + '\x{706D}\x{706E}\x{706F}\x{7070}\x{7071}\x{7074}\x{7075}\x{7076}\x{7077}' . + '\x{7078}\x{7079}\x{707A}\x{707C}\x{707D}\x{707E}\x{707F}\x{7080}\x{7082}' . + '\x{7083}\x{7084}\x{7085}\x{7086}\x{7087}\x{7088}\x{7089}\x{708A}\x{708B}' . + '\x{708C}\x{708E}\x{708F}\x{7090}\x{7091}\x{7092}\x{7093}\x{7094}\x{7095}' . + '\x{7096}\x{7098}\x{7099}\x{709A}\x{709C}\x{709D}\x{709E}\x{709F}\x{70A0}' . + '\x{70A1}\x{70A2}\x{70A3}\x{70A4}\x{70A5}\x{70A6}\x{70A7}\x{70A8}\x{70A9}' . + '\x{70AB}\x{70AC}\x{70AD}\x{70AE}\x{70AF}\x{70B0}\x{70B1}\x{70B3}\x{70B4}' . + '\x{70B5}\x{70B7}\x{70B8}\x{70B9}\x{70BA}\x{70BB}\x{70BC}\x{70BD}\x{70BE}' . + '\x{70BF}\x{70C0}\x{70C1}\x{70C2}\x{70C3}\x{70C4}\x{70C5}\x{70C6}\x{70C7}' . + '\x{70C8}\x{70C9}\x{70CA}\x{70CB}\x{70CC}\x{70CD}\x{70CE}\x{70CF}\x{70D0}' . + '\x{70D1}\x{70D2}\x{70D3}\x{70D4}\x{70D6}\x{70D7}\x{70D8}\x{70D9}\x{70DA}' . + '\x{70DB}\x{70DC}\x{70DD}\x{70DE}\x{70DF}\x{70E0}\x{70E1}\x{70E2}\x{70E3}' . + '\x{70E4}\x{70E5}\x{70E6}\x{70E7}\x{70E8}\x{70E9}\x{70EA}\x{70EB}\x{70EC}' . + '\x{70ED}\x{70EE}\x{70EF}\x{70F0}\x{70F1}\x{70F2}\x{70F3}\x{70F4}\x{70F5}' . + '\x{70F6}\x{70F7}\x{70F8}\x{70F9}\x{70FA}\x{70FB}\x{70FC}\x{70FD}\x{70FF}' . + '\x{7100}\x{7101}\x{7102}\x{7103}\x{7104}\x{7105}\x{7106}\x{7107}\x{7109}' . + '\x{710A}\x{710B}\x{710C}\x{710D}\x{710E}\x{710F}\x{7110}\x{7111}\x{7112}' . + '\x{7113}\x{7115}\x{7116}\x{7117}\x{7118}\x{7119}\x{711A}\x{711B}\x{711C}' . + '\x{711D}\x{711E}\x{711F}\x{7120}\x{7121}\x{7122}\x{7123}\x{7125}\x{7126}' . + '\x{7127}\x{7128}\x{7129}\x{712A}\x{712B}\x{712C}\x{712D}\x{712E}\x{712F}' . + '\x{7130}\x{7131}\x{7132}\x{7135}\x{7136}\x{7137}\x{7138}\x{7139}\x{713A}' . + '\x{713B}\x{713D}\x{713E}\x{713F}\x{7140}\x{7141}\x{7142}\x{7143}\x{7144}' . + '\x{7145}\x{7146}\x{7147}\x{7148}\x{7149}\x{714A}\x{714B}\x{714C}\x{714D}' . + '\x{714E}\x{714F}\x{7150}\x{7151}\x{7152}\x{7153}\x{7154}\x{7156}\x{7158}' . + '\x{7159}\x{715A}\x{715B}\x{715C}\x{715D}\x{715E}\x{715F}\x{7160}\x{7161}' . + '\x{7162}\x{7163}\x{7164}\x{7165}\x{7166}\x{7167}\x{7168}\x{7169}\x{716A}' . + '\x{716C}\x{716E}\x{716F}\x{7170}\x{7171}\x{7172}\x{7173}\x{7174}\x{7175}' . + '\x{7176}\x{7177}\x{7178}\x{7179}\x{717A}\x{717B}\x{717C}\x{717D}\x{717E}' . + '\x{717F}\x{7180}\x{7181}\x{7182}\x{7183}\x{7184}\x{7185}\x{7186}\x{7187}' . + '\x{7188}\x{7189}\x{718A}\x{718B}\x{718C}\x{718E}\x{718F}\x{7190}\x{7191}' . + '\x{7192}\x{7193}\x{7194}\x{7195}\x{7197}\x{7198}\x{7199}\x{719A}\x{719B}' . + '\x{719C}\x{719D}\x{719E}\x{719F}\x{71A0}\x{71A1}\x{71A2}\x{71A3}\x{71A4}' . + '\x{71A5}\x{71A7}\x{71A8}\x{71A9}\x{71AA}\x{71AC}\x{71AD}\x{71AE}\x{71AF}' . + '\x{71B0}\x{71B1}\x{71B2}\x{71B3}\x{71B4}\x{71B5}\x{71B7}\x{71B8}\x{71B9}' . + '\x{71BA}\x{71BB}\x{71BC}\x{71BD}\x{71BE}\x{71BF}\x{71C0}\x{71C1}\x{71C2}' . + '\x{71C3}\x{71C4}\x{71C5}\x{71C6}\x{71C7}\x{71C8}\x{71C9}\x{71CA}\x{71CB}' . + '\x{71CD}\x{71CE}\x{71CF}\x{71D0}\x{71D1}\x{71D2}\x{71D4}\x{71D5}\x{71D6}' . + '\x{71D7}\x{71D8}\x{71D9}\x{71DA}\x{71DB}\x{71DC}\x{71DD}\x{71DE}\x{71DF}' . + '\x{71E0}\x{71E1}\x{71E2}\x{71E3}\x{71E4}\x{71E5}\x{71E6}\x{71E7}\x{71E8}' . + '\x{71E9}\x{71EA}\x{71EB}\x{71EC}\x{71ED}\x{71EE}\x{71EF}\x{71F0}\x{71F1}' . + '\x{71F2}\x{71F4}\x{71F5}\x{71F6}\x{71F7}\x{71F8}\x{71F9}\x{71FB}\x{71FC}' . + '\x{71FD}\x{71FE}\x{71FF}\x{7201}\x{7202}\x{7203}\x{7204}\x{7205}\x{7206}' . + '\x{7207}\x{7208}\x{7209}\x{720A}\x{720C}\x{720D}\x{720E}\x{720F}\x{7210}' . + '\x{7212}\x{7213}\x{7214}\x{7216}\x{7218}\x{7219}\x{721A}\x{721B}\x{721C}' . + '\x{721D}\x{721E}\x{721F}\x{7221}\x{7222}\x{7223}\x{7226}\x{7227}\x{7228}' . + '\x{7229}\x{722A}\x{722B}\x{722C}\x{722D}\x{722E}\x{7230}\x{7231}\x{7232}' . + '\x{7233}\x{7235}\x{7236}\x{7237}\x{7238}\x{7239}\x{723A}\x{723B}\x{723C}' . + '\x{723D}\x{723E}\x{723F}\x{7240}\x{7241}\x{7242}\x{7243}\x{7244}\x{7246}' . + '\x{7247}\x{7248}\x{7249}\x{724A}\x{724B}\x{724C}\x{724D}\x{724F}\x{7251}' . + '\x{7252}\x{7253}\x{7254}\x{7256}\x{7257}\x{7258}\x{7259}\x{725A}\x{725B}' . + '\x{725C}\x{725D}\x{725E}\x{725F}\x{7260}\x{7261}\x{7262}\x{7263}\x{7264}' . + '\x{7265}\x{7266}\x{7267}\x{7268}\x{7269}\x{726A}\x{726B}\x{726C}\x{726D}' . + '\x{726E}\x{726F}\x{7270}\x{7271}\x{7272}\x{7273}\x{7274}\x{7275}\x{7276}' . + '\x{7277}\x{7278}\x{7279}\x{727A}\x{727B}\x{727C}\x{727D}\x{727E}\x{727F}' . + '\x{7280}\x{7281}\x{7282}\x{7283}\x{7284}\x{7285}\x{7286}\x{7287}\x{7288}' . + '\x{7289}\x{728A}\x{728B}\x{728C}\x{728D}\x{728E}\x{728F}\x{7290}\x{7291}' . + '\x{7292}\x{7293}\x{7294}\x{7295}\x{7296}\x{7297}\x{7298}\x{7299}\x{729A}' . + '\x{729B}\x{729C}\x{729D}\x{729E}\x{729F}\x{72A1}\x{72A2}\x{72A3}\x{72A4}' . + '\x{72A5}\x{72A6}\x{72A7}\x{72A8}\x{72A9}\x{72AA}\x{72AC}\x{72AD}\x{72AE}' . + '\x{72AF}\x{72B0}\x{72B1}\x{72B2}\x{72B3}\x{72B4}\x{72B5}\x{72B6}\x{72B7}' . + '\x{72B8}\x{72B9}\x{72BA}\x{72BB}\x{72BC}\x{72BD}\x{72BF}\x{72C0}\x{72C1}' . + '\x{72C2}\x{72C3}\x{72C4}\x{72C5}\x{72C6}\x{72C7}\x{72C8}\x{72C9}\x{72CA}' . + '\x{72CB}\x{72CC}\x{72CD}\x{72CE}\x{72CF}\x{72D0}\x{72D1}\x{72D2}\x{72D3}' . + '\x{72D4}\x{72D5}\x{72D6}\x{72D7}\x{72D8}\x{72D9}\x{72DA}\x{72DB}\x{72DC}' . + '\x{72DD}\x{72DE}\x{72DF}\x{72E0}\x{72E1}\x{72E2}\x{72E3}\x{72E4}\x{72E5}' . + '\x{72E6}\x{72E7}\x{72E8}\x{72E9}\x{72EA}\x{72EB}\x{72EC}\x{72ED}\x{72EE}' . + '\x{72EF}\x{72F0}\x{72F1}\x{72F2}\x{72F3}\x{72F4}\x{72F5}\x{72F6}\x{72F7}' . + '\x{72F8}\x{72F9}\x{72FA}\x{72FB}\x{72FC}\x{72FD}\x{72FE}\x{72FF}\x{7300}' . + '\x{7301}\x{7303}\x{7304}\x{7305}\x{7306}\x{7307}\x{7308}\x{7309}\x{730A}' . + '\x{730B}\x{730C}\x{730D}\x{730E}\x{730F}\x{7311}\x{7312}\x{7313}\x{7314}' . + '\x{7315}\x{7316}\x{7317}\x{7318}\x{7319}\x{731A}\x{731B}\x{731C}\x{731D}' . + '\x{731E}\x{7320}\x{7321}\x{7322}\x{7323}\x{7324}\x{7325}\x{7326}\x{7327}' . + '\x{7329}\x{732A}\x{732B}\x{732C}\x{732D}\x{732E}\x{7330}\x{7331}\x{7332}' . + '\x{7333}\x{7334}\x{7335}\x{7336}\x{7337}\x{7338}\x{7339}\x{733A}\x{733B}' . + '\x{733C}\x{733D}\x{733E}\x{733F}\x{7340}\x{7341}\x{7342}\x{7343}\x{7344}' . + '\x{7345}\x{7346}\x{7347}\x{7348}\x{7349}\x{734A}\x{734B}\x{734C}\x{734D}' . + '\x{734E}\x{7350}\x{7351}\x{7352}\x{7354}\x{7355}\x{7356}\x{7357}\x{7358}' . + '\x{7359}\x{735A}\x{735B}\x{735C}\x{735D}\x{735E}\x{735F}\x{7360}\x{7361}' . + '\x{7362}\x{7364}\x{7365}\x{7366}\x{7367}\x{7368}\x{7369}\x{736A}\x{736B}' . + '\x{736C}\x{736D}\x{736E}\x{736F}\x{7370}\x{7371}\x{7372}\x{7373}\x{7374}' . + '\x{7375}\x{7376}\x{7377}\x{7378}\x{7379}\x{737A}\x{737B}\x{737C}\x{737D}' . + '\x{737E}\x{737F}\x{7380}\x{7381}\x{7382}\x{7383}\x{7384}\x{7385}\x{7386}' . + '\x{7387}\x{7388}\x{7389}\x{738A}\x{738B}\x{738C}\x{738D}\x{738E}\x{738F}' . + '\x{7390}\x{7391}\x{7392}\x{7393}\x{7394}\x{7395}\x{7396}\x{7397}\x{7398}' . + '\x{7399}\x{739A}\x{739B}\x{739D}\x{739E}\x{739F}\x{73A0}\x{73A1}\x{73A2}' . + '\x{73A3}\x{73A4}\x{73A5}\x{73A6}\x{73A7}\x{73A8}\x{73A9}\x{73AA}\x{73AB}' . + '\x{73AC}\x{73AD}\x{73AE}\x{73AF}\x{73B0}\x{73B1}\x{73B2}\x{73B3}\x{73B4}' . + '\x{73B5}\x{73B6}\x{73B7}\x{73B8}\x{73B9}\x{73BA}\x{73BB}\x{73BC}\x{73BD}' . + '\x{73BE}\x{73BF}\x{73C0}\x{73C2}\x{73C3}\x{73C4}\x{73C5}\x{73C6}\x{73C7}' . + '\x{73C8}\x{73C9}\x{73CA}\x{73CB}\x{73CC}\x{73CD}\x{73CE}\x{73CF}\x{73D0}' . + '\x{73D1}\x{73D2}\x{73D3}\x{73D4}\x{73D5}\x{73D6}\x{73D7}\x{73D8}\x{73D9}' . + '\x{73DA}\x{73DB}\x{73DC}\x{73DD}\x{73DE}\x{73DF}\x{73E0}\x{73E2}\x{73E3}' . + '\x{73E5}\x{73E6}\x{73E7}\x{73E8}\x{73E9}\x{73EA}\x{73EB}\x{73EC}\x{73ED}' . + '\x{73EE}\x{73EF}\x{73F0}\x{73F1}\x{73F2}\x{73F4}\x{73F5}\x{73F6}\x{73F7}' . + '\x{73F8}\x{73F9}\x{73FA}\x{73FC}\x{73FD}\x{73FE}\x{73FF}\x{7400}\x{7401}' . + '\x{7402}\x{7403}\x{7404}\x{7405}\x{7406}\x{7407}\x{7408}\x{7409}\x{740A}' . + '\x{740B}\x{740C}\x{740D}\x{740E}\x{740F}\x{7410}\x{7411}\x{7412}\x{7413}' . + '\x{7414}\x{7415}\x{7416}\x{7417}\x{7419}\x{741A}\x{741B}\x{741C}\x{741D}' . + '\x{741E}\x{741F}\x{7420}\x{7421}\x{7422}\x{7423}\x{7424}\x{7425}\x{7426}' . + '\x{7427}\x{7428}\x{7429}\x{742A}\x{742B}\x{742C}\x{742D}\x{742E}\x{742F}' . + '\x{7430}\x{7431}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{7437}\x{7438}' . + '\x{743A}\x{743B}\x{743C}\x{743D}\x{743F}\x{7440}\x{7441}\x{7442}\x{7443}' . + '\x{7444}\x{7445}\x{7446}\x{7448}\x{744A}\x{744B}\x{744C}\x{744D}\x{744E}' . + '\x{744F}\x{7450}\x{7451}\x{7452}\x{7453}\x{7454}\x{7455}\x{7456}\x{7457}' . + '\x{7459}\x{745A}\x{745B}\x{745C}\x{745D}\x{745E}\x{745F}\x{7461}\x{7462}' . + '\x{7463}\x{7464}\x{7465}\x{7466}\x{7467}\x{7468}\x{7469}\x{746A}\x{746B}' . + '\x{746C}\x{746D}\x{746E}\x{746F}\x{7470}\x{7471}\x{7472}\x{7473}\x{7474}' . + '\x{7475}\x{7476}\x{7477}\x{7478}\x{7479}\x{747A}\x{747C}\x{747D}\x{747E}' . + '\x{747F}\x{7480}\x{7481}\x{7482}\x{7483}\x{7485}\x{7486}\x{7487}\x{7488}' . + '\x{7489}\x{748A}\x{748B}\x{748C}\x{748D}\x{748E}\x{748F}\x{7490}\x{7491}' . + '\x{7492}\x{7493}\x{7494}\x{7495}\x{7497}\x{7498}\x{7499}\x{749A}\x{749B}' . + '\x{749C}\x{749E}\x{749F}\x{74A0}\x{74A1}\x{74A3}\x{74A4}\x{74A5}\x{74A6}' . + '\x{74A7}\x{74A8}\x{74A9}\x{74AA}\x{74AB}\x{74AC}\x{74AD}\x{74AE}\x{74AF}' . + '\x{74B0}\x{74B1}\x{74B2}\x{74B3}\x{74B4}\x{74B5}\x{74B6}\x{74B7}\x{74B8}' . + '\x{74B9}\x{74BA}\x{74BB}\x{74BC}\x{74BD}\x{74BE}\x{74BF}\x{74C0}\x{74C1}' . + '\x{74C2}\x{74C3}\x{74C4}\x{74C5}\x{74C6}\x{74CA}\x{74CB}\x{74CD}\x{74CE}' . + '\x{74CF}\x{74D0}\x{74D1}\x{74D2}\x{74D3}\x{74D4}\x{74D5}\x{74D6}\x{74D7}' . + '\x{74D8}\x{74D9}\x{74DA}\x{74DB}\x{74DC}\x{74DD}\x{74DE}\x{74DF}\x{74E0}' . + '\x{74E1}\x{74E2}\x{74E3}\x{74E4}\x{74E5}\x{74E6}\x{74E7}\x{74E8}\x{74E9}' . + '\x{74EA}\x{74EC}\x{74ED}\x{74EE}\x{74EF}\x{74F0}\x{74F1}\x{74F2}\x{74F3}' . + '\x{74F4}\x{74F5}\x{74F6}\x{74F7}\x{74F8}\x{74F9}\x{74FA}\x{74FB}\x{74FC}' . + '\x{74FD}\x{74FE}\x{74FF}\x{7500}\x{7501}\x{7502}\x{7503}\x{7504}\x{7505}' . + '\x{7506}\x{7507}\x{7508}\x{7509}\x{750A}\x{750B}\x{750C}\x{750D}\x{750F}' . + '\x{7510}\x{7511}\x{7512}\x{7513}\x{7514}\x{7515}\x{7516}\x{7517}\x{7518}' . + '\x{7519}\x{751A}\x{751B}\x{751C}\x{751D}\x{751E}\x{751F}\x{7521}\x{7522}' . + '\x{7523}\x{7524}\x{7525}\x{7526}\x{7527}\x{7528}\x{7529}\x{752A}\x{752B}' . + '\x{752C}\x{752D}\x{752E}\x{752F}\x{7530}\x{7531}\x{7532}\x{7533}\x{7535}' . + '\x{7536}\x{7537}\x{7538}\x{7539}\x{753A}\x{753B}\x{753C}\x{753D}\x{753E}' . + '\x{753F}\x{7540}\x{7542}\x{7543}\x{7544}\x{7545}\x{7546}\x{7547}\x{7548}' . + '\x{7549}\x{754B}\x{754C}\x{754D}\x{754E}\x{754F}\x{7550}\x{7551}\x{7553}' . + '\x{7554}\x{7556}\x{7557}\x{7558}\x{7559}\x{755A}\x{755B}\x{755C}\x{755D}' . + '\x{755F}\x{7560}\x{7562}\x{7563}\x{7564}\x{7565}\x{7566}\x{7567}\x{7568}' . + '\x{7569}\x{756A}\x{756B}\x{756C}\x{756D}\x{756E}\x{756F}\x{7570}\x{7572}' . + '\x{7574}\x{7575}\x{7576}\x{7577}\x{7578}\x{7579}\x{757C}\x{757D}\x{757E}' . + '\x{757F}\x{7580}\x{7581}\x{7582}\x{7583}\x{7584}\x{7586}\x{7587}\x{7588}' . + '\x{7589}\x{758A}\x{758B}\x{758C}\x{758D}\x{758F}\x{7590}\x{7591}\x{7592}' . + '\x{7593}\x{7594}\x{7595}\x{7596}\x{7597}\x{7598}\x{7599}\x{759A}\x{759B}' . + '\x{759C}\x{759D}\x{759E}\x{759F}\x{75A0}\x{75A1}\x{75A2}\x{75A3}\x{75A4}' . + '\x{75A5}\x{75A6}\x{75A7}\x{75A8}\x{75AA}\x{75AB}\x{75AC}\x{75AD}\x{75AE}' . + '\x{75AF}\x{75B0}\x{75B1}\x{75B2}\x{75B3}\x{75B4}\x{75B5}\x{75B6}\x{75B8}' . + '\x{75B9}\x{75BA}\x{75BB}\x{75BC}\x{75BD}\x{75BE}\x{75BF}\x{75C0}\x{75C1}' . + '\x{75C2}\x{75C3}\x{75C4}\x{75C5}\x{75C6}\x{75C7}\x{75C8}\x{75C9}\x{75CA}' . + '\x{75CB}\x{75CC}\x{75CD}\x{75CE}\x{75CF}\x{75D0}\x{75D1}\x{75D2}\x{75D3}' . + '\x{75D4}\x{75D5}\x{75D6}\x{75D7}\x{75D8}\x{75D9}\x{75DA}\x{75DB}\x{75DD}' . + '\x{75DE}\x{75DF}\x{75E0}\x{75E1}\x{75E2}\x{75E3}\x{75E4}\x{75E5}\x{75E6}' . + '\x{75E7}\x{75E8}\x{75EA}\x{75EB}\x{75EC}\x{75ED}\x{75EF}\x{75F0}\x{75F1}' . + '\x{75F2}\x{75F3}\x{75F4}\x{75F5}\x{75F6}\x{75F7}\x{75F8}\x{75F9}\x{75FA}' . + '\x{75FB}\x{75FC}\x{75FD}\x{75FE}\x{75FF}\x{7600}\x{7601}\x{7602}\x{7603}' . + '\x{7604}\x{7605}\x{7606}\x{7607}\x{7608}\x{7609}\x{760A}\x{760B}\x{760C}' . + '\x{760D}\x{760E}\x{760F}\x{7610}\x{7611}\x{7612}\x{7613}\x{7614}\x{7615}' . + '\x{7616}\x{7617}\x{7618}\x{7619}\x{761A}\x{761B}\x{761C}\x{761D}\x{761E}' . + '\x{761F}\x{7620}\x{7621}\x{7622}\x{7623}\x{7624}\x{7625}\x{7626}\x{7627}' . + '\x{7628}\x{7629}\x{762A}\x{762B}\x{762D}\x{762E}\x{762F}\x{7630}\x{7631}' . + '\x{7632}\x{7633}\x{7634}\x{7635}\x{7636}\x{7637}\x{7638}\x{7639}\x{763A}' . + '\x{763B}\x{763C}\x{763D}\x{763E}\x{763F}\x{7640}\x{7641}\x{7642}\x{7643}' . + '\x{7646}\x{7647}\x{7648}\x{7649}\x{764A}\x{764B}\x{764C}\x{764D}\x{764F}' . + '\x{7650}\x{7652}\x{7653}\x{7654}\x{7656}\x{7657}\x{7658}\x{7659}\x{765A}' . + '\x{765B}\x{765C}\x{765D}\x{765E}\x{765F}\x{7660}\x{7661}\x{7662}\x{7663}' . + '\x{7664}\x{7665}\x{7666}\x{7667}\x{7668}\x{7669}\x{766A}\x{766B}\x{766C}' . + '\x{766D}\x{766E}\x{766F}\x{7670}\x{7671}\x{7672}\x{7674}\x{7675}\x{7676}' . + '\x{7677}\x{7678}\x{7679}\x{767B}\x{767C}\x{767D}\x{767E}\x{767F}\x{7680}' . + '\x{7681}\x{7682}\x{7683}\x{7684}\x{7685}\x{7686}\x{7687}\x{7688}\x{7689}' . + '\x{768A}\x{768B}\x{768C}\x{768E}\x{768F}\x{7690}\x{7691}\x{7692}\x{7693}' . + '\x{7694}\x{7695}\x{7696}\x{7697}\x{7698}\x{7699}\x{769A}\x{769B}\x{769C}' . + '\x{769D}\x{769E}\x{769F}\x{76A0}\x{76A3}\x{76A4}\x{76A6}\x{76A7}\x{76A9}' . + '\x{76AA}\x{76AB}\x{76AC}\x{76AD}\x{76AE}\x{76AF}\x{76B0}\x{76B1}\x{76B2}' . + '\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}\x{76BB}\x{76BC}\x{76BD}\x{76BE}' . + '\x{76BF}\x{76C0}\x{76C2}\x{76C3}\x{76C4}\x{76C5}\x{76C6}\x{76C7}\x{76C8}' . + '\x{76C9}\x{76CA}\x{76CD}\x{76CE}\x{76CF}\x{76D0}\x{76D1}\x{76D2}\x{76D3}' . + '\x{76D4}\x{76D5}\x{76D6}\x{76D7}\x{76D8}\x{76DA}\x{76DB}\x{76DC}\x{76DD}' . + '\x{76DE}\x{76DF}\x{76E0}\x{76E1}\x{76E2}\x{76E3}\x{76E4}\x{76E5}\x{76E6}' . + '\x{76E7}\x{76E8}\x{76E9}\x{76EA}\x{76EC}\x{76ED}\x{76EE}\x{76EF}\x{76F0}' . + '\x{76F1}\x{76F2}\x{76F3}\x{76F4}\x{76F5}\x{76F6}\x{76F7}\x{76F8}\x{76F9}' . + '\x{76FA}\x{76FB}\x{76FC}\x{76FD}\x{76FE}\x{76FF}\x{7701}\x{7703}\x{7704}' . + '\x{7705}\x{7706}\x{7707}\x{7708}\x{7709}\x{770A}\x{770B}\x{770C}\x{770D}' . + '\x{770F}\x{7710}\x{7711}\x{7712}\x{7713}\x{7714}\x{7715}\x{7716}\x{7717}' . + '\x{7718}\x{7719}\x{771A}\x{771B}\x{771C}\x{771D}\x{771E}\x{771F}\x{7720}' . + '\x{7722}\x{7723}\x{7725}\x{7726}\x{7727}\x{7728}\x{7729}\x{772A}\x{772C}' . + '\x{772D}\x{772E}\x{772F}\x{7730}\x{7731}\x{7732}\x{7733}\x{7734}\x{7735}' . + '\x{7736}\x{7737}\x{7738}\x{7739}\x{773A}\x{773B}\x{773C}\x{773D}\x{773E}' . + '\x{7740}\x{7741}\x{7743}\x{7744}\x{7745}\x{7746}\x{7747}\x{7748}\x{7749}' . + '\x{774A}\x{774B}\x{774C}\x{774D}\x{774E}\x{774F}\x{7750}\x{7751}\x{7752}' . + '\x{7753}\x{7754}\x{7755}\x{7756}\x{7757}\x{7758}\x{7759}\x{775A}\x{775B}' . + '\x{775C}\x{775D}\x{775E}\x{775F}\x{7760}\x{7761}\x{7762}\x{7763}\x{7765}' . + '\x{7766}\x{7767}\x{7768}\x{7769}\x{776A}\x{776B}\x{776C}\x{776D}\x{776E}' . + '\x{776F}\x{7770}\x{7771}\x{7772}\x{7773}\x{7774}\x{7775}\x{7776}\x{7777}' . + '\x{7778}\x{7779}\x{777A}\x{777B}\x{777C}\x{777D}\x{777E}\x{777F}\x{7780}' . + '\x{7781}\x{7782}\x{7783}\x{7784}\x{7785}\x{7786}\x{7787}\x{7788}\x{7789}' . + '\x{778A}\x{778B}\x{778C}\x{778D}\x{778E}\x{778F}\x{7790}\x{7791}\x{7792}' . + '\x{7793}\x{7794}\x{7795}\x{7797}\x{7798}\x{7799}\x{779A}\x{779B}\x{779C}' . + '\x{779D}\x{779E}\x{779F}\x{77A0}\x{77A1}\x{77A2}\x{77A3}\x{77A5}\x{77A6}' . + '\x{77A7}\x{77A8}\x{77A9}\x{77AA}\x{77AB}\x{77AC}\x{77AD}\x{77AE}\x{77AF}' . + '\x{77B0}\x{77B1}\x{77B2}\x{77B3}\x{77B4}\x{77B5}\x{77B6}\x{77B7}\x{77B8}' . + '\x{77B9}\x{77BA}\x{77BB}\x{77BC}\x{77BD}\x{77BF}\x{77C0}\x{77C2}\x{77C3}' . + '\x{77C4}\x{77C5}\x{77C6}\x{77C7}\x{77C8}\x{77C9}\x{77CA}\x{77CB}\x{77CC}' . + '\x{77CD}\x{77CE}\x{77CF}\x{77D0}\x{77D1}\x{77D3}\x{77D4}\x{77D5}\x{77D6}' . + '\x{77D7}\x{77D8}\x{77D9}\x{77DA}\x{77DB}\x{77DC}\x{77DE}\x{77DF}\x{77E0}' . + '\x{77E1}\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E8}\x{77E9}\x{77EA}\x{77EB}' . + '\x{77EC}\x{77ED}\x{77EE}\x{77EF}\x{77F0}\x{77F1}\x{77F2}\x{77F3}\x{77F6}' . + '\x{77F7}\x{77F8}\x{77F9}\x{77FA}\x{77FB}\x{77FC}\x{77FD}\x{77FE}\x{77FF}' . + '\x{7800}\x{7801}\x{7802}\x{7803}\x{7804}\x{7805}\x{7806}\x{7808}\x{7809}' . + '\x{780A}\x{780B}\x{780C}\x{780D}\x{780E}\x{780F}\x{7810}\x{7811}\x{7812}' . + '\x{7813}\x{7814}\x{7815}\x{7816}\x{7817}\x{7818}\x{7819}\x{781A}\x{781B}' . + '\x{781C}\x{781D}\x{781E}\x{781F}\x{7820}\x{7821}\x{7822}\x{7823}\x{7825}' . + '\x{7826}\x{7827}\x{7828}\x{7829}\x{782A}\x{782B}\x{782C}\x{782D}\x{782E}' . + '\x{782F}\x{7830}\x{7831}\x{7832}\x{7833}\x{7834}\x{7835}\x{7837}\x{7838}' . + '\x{7839}\x{783A}\x{783B}\x{783C}\x{783D}\x{783E}\x{7840}\x{7841}\x{7843}' . + '\x{7844}\x{7845}\x{7847}\x{7848}\x{7849}\x{784A}\x{784C}\x{784D}\x{784E}' . + '\x{7850}\x{7851}\x{7852}\x{7853}\x{7854}\x{7855}\x{7856}\x{7857}\x{7858}' . + '\x{7859}\x{785A}\x{785B}\x{785C}\x{785D}\x{785E}\x{785F}\x{7860}\x{7861}' . + '\x{7862}\x{7863}\x{7864}\x{7865}\x{7866}\x{7867}\x{7868}\x{7869}\x{786A}' . + '\x{786B}\x{786C}\x{786D}\x{786E}\x{786F}\x{7870}\x{7871}\x{7872}\x{7873}' . + '\x{7874}\x{7875}\x{7877}\x{7878}\x{7879}\x{787A}\x{787B}\x{787C}\x{787D}' . + '\x{787E}\x{787F}\x{7880}\x{7881}\x{7882}\x{7883}\x{7884}\x{7885}\x{7886}' . + '\x{7887}\x{7889}\x{788A}\x{788B}\x{788C}\x{788D}\x{788E}\x{788F}\x{7890}' . + '\x{7891}\x{7892}\x{7893}\x{7894}\x{7895}\x{7896}\x{7897}\x{7898}\x{7899}' . + '\x{789A}\x{789B}\x{789C}\x{789D}\x{789E}\x{789F}\x{78A0}\x{78A1}\x{78A2}' . + '\x{78A3}\x{78A4}\x{78A5}\x{78A6}\x{78A7}\x{78A8}\x{78A9}\x{78AA}\x{78AB}' . + '\x{78AC}\x{78AD}\x{78AE}\x{78AF}\x{78B0}\x{78B1}\x{78B2}\x{78B3}\x{78B4}' . + '\x{78B5}\x{78B6}\x{78B7}\x{78B8}\x{78B9}\x{78BA}\x{78BB}\x{78BC}\x{78BD}' . + '\x{78BE}\x{78BF}\x{78C0}\x{78C1}\x{78C3}\x{78C4}\x{78C5}\x{78C6}\x{78C8}' . + '\x{78C9}\x{78CA}\x{78CB}\x{78CC}\x{78CD}\x{78CE}\x{78CF}\x{78D0}\x{78D1}' . + '\x{78D3}\x{78D4}\x{78D5}\x{78D6}\x{78D7}\x{78D8}\x{78D9}\x{78DA}\x{78DB}' . + '\x{78DC}\x{78DD}\x{78DE}\x{78DF}\x{78E0}\x{78E1}\x{78E2}\x{78E3}\x{78E4}' . + '\x{78E5}\x{78E6}\x{78E7}\x{78E8}\x{78E9}\x{78EA}\x{78EB}\x{78EC}\x{78ED}' . + '\x{78EE}\x{78EF}\x{78F1}\x{78F2}\x{78F3}\x{78F4}\x{78F5}\x{78F6}\x{78F7}' . + '\x{78F9}\x{78FA}\x{78FB}\x{78FC}\x{78FD}\x{78FE}\x{78FF}\x{7901}\x{7902}' . + '\x{7903}\x{7904}\x{7905}\x{7906}\x{7907}\x{7909}\x{790A}\x{790B}\x{790C}' . + '\x{790E}\x{790F}\x{7910}\x{7911}\x{7912}\x{7913}\x{7914}\x{7916}\x{7917}' . + '\x{7918}\x{7919}\x{791A}\x{791B}\x{791C}\x{791D}\x{791E}\x{7921}\x{7922}' . + '\x{7923}\x{7924}\x{7925}\x{7926}\x{7927}\x{7928}\x{7929}\x{792A}\x{792B}' . + '\x{792C}\x{792D}\x{792E}\x{792F}\x{7930}\x{7931}\x{7933}\x{7934}\x{7935}' . + '\x{7937}\x{7938}\x{7939}\x{793A}\x{793B}\x{793C}\x{793D}\x{793E}\x{793F}' . + '\x{7940}\x{7941}\x{7942}\x{7943}\x{7944}\x{7945}\x{7946}\x{7947}\x{7948}' . + '\x{7949}\x{794A}\x{794B}\x{794C}\x{794D}\x{794E}\x{794F}\x{7950}\x{7951}' . + '\x{7952}\x{7953}\x{7954}\x{7955}\x{7956}\x{7957}\x{7958}\x{795A}\x{795B}' . + '\x{795C}\x{795D}\x{795E}\x{795F}\x{7960}\x{7961}\x{7962}\x{7963}\x{7964}' . + '\x{7965}\x{7966}\x{7967}\x{7968}\x{7969}\x{796A}\x{796B}\x{796D}\x{796F}' . + '\x{7970}\x{7971}\x{7972}\x{7973}\x{7974}\x{7977}\x{7978}\x{7979}\x{797A}' . + '\x{797B}\x{797C}\x{797D}\x{797E}\x{797F}\x{7980}\x{7981}\x{7982}\x{7983}' . + '\x{7984}\x{7985}\x{7988}\x{7989}\x{798A}\x{798B}\x{798C}\x{798D}\x{798E}' . + '\x{798F}\x{7990}\x{7991}\x{7992}\x{7993}\x{7994}\x{7995}\x{7996}\x{7997}' . + '\x{7998}\x{7999}\x{799A}\x{799B}\x{799C}\x{799F}\x{79A0}\x{79A1}\x{79A2}' . + '\x{79A3}\x{79A4}\x{79A5}\x{79A6}\x{79A7}\x{79A8}\x{79AA}\x{79AB}\x{79AC}' . + '\x{79AD}\x{79AE}\x{79AF}\x{79B0}\x{79B1}\x{79B2}\x{79B3}\x{79B4}\x{79B5}' . + '\x{79B6}\x{79B7}\x{79B8}\x{79B9}\x{79BA}\x{79BB}\x{79BD}\x{79BE}\x{79BF}' . + '\x{79C0}\x{79C1}\x{79C2}\x{79C3}\x{79C5}\x{79C6}\x{79C8}\x{79C9}\x{79CA}' . + '\x{79CB}\x{79CD}\x{79CE}\x{79CF}\x{79D0}\x{79D1}\x{79D2}\x{79D3}\x{79D5}' . + '\x{79D6}\x{79D8}\x{79D9}\x{79DA}\x{79DB}\x{79DC}\x{79DD}\x{79DE}\x{79DF}' . + '\x{79E0}\x{79E1}\x{79E2}\x{79E3}\x{79E4}\x{79E5}\x{79E6}\x{79E7}\x{79E8}' . + '\x{79E9}\x{79EA}\x{79EB}\x{79EC}\x{79ED}\x{79EE}\x{79EF}\x{79F0}\x{79F1}' . + '\x{79F2}\x{79F3}\x{79F4}\x{79F5}\x{79F6}\x{79F7}\x{79F8}\x{79F9}\x{79FA}' . + '\x{79FB}\x{79FC}\x{79FD}\x{79FE}\x{79FF}\x{7A00}\x{7A02}\x{7A03}\x{7A04}' . + '\x{7A05}\x{7A06}\x{7A08}\x{7A0A}\x{7A0B}\x{7A0C}\x{7A0D}\x{7A0E}\x{7A0F}' . + '\x{7A10}\x{7A11}\x{7A12}\x{7A13}\x{7A14}\x{7A15}\x{7A16}\x{7A17}\x{7A18}' . + '\x{7A19}\x{7A1A}\x{7A1B}\x{7A1C}\x{7A1D}\x{7A1E}\x{7A1F}\x{7A20}\x{7A21}' . + '\x{7A22}\x{7A23}\x{7A24}\x{7A25}\x{7A26}\x{7A27}\x{7A28}\x{7A29}\x{7A2A}' . + '\x{7A2B}\x{7A2D}\x{7A2E}\x{7A2F}\x{7A30}\x{7A31}\x{7A32}\x{7A33}\x{7A34}' . + '\x{7A35}\x{7A37}\x{7A39}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . + '\x{7A41}\x{7A42}\x{7A43}\x{7A44}\x{7A45}\x{7A46}\x{7A47}\x{7A48}\x{7A49}' . + '\x{7A4A}\x{7A4B}\x{7A4C}\x{7A4D}\x{7A4E}\x{7A50}\x{7A51}\x{7A52}\x{7A53}' . + '\x{7A54}\x{7A55}\x{7A56}\x{7A57}\x{7A58}\x{7A59}\x{7A5A}\x{7A5B}\x{7A5C}' . + '\x{7A5D}\x{7A5E}\x{7A5F}\x{7A60}\x{7A61}\x{7A62}\x{7A65}\x{7A66}\x{7A67}' . + '\x{7A68}\x{7A69}\x{7A6B}\x{7A6C}\x{7A6D}\x{7A6E}\x{7A70}\x{7A71}\x{7A72}' . + '\x{7A73}\x{7A74}\x{7A75}\x{7A76}\x{7A77}\x{7A78}\x{7A79}\x{7A7A}\x{7A7B}' . + '\x{7A7C}\x{7A7D}\x{7A7E}\x{7A7F}\x{7A80}\x{7A81}\x{7A83}\x{7A84}\x{7A85}' . + '\x{7A86}\x{7A87}\x{7A88}\x{7A89}\x{7A8A}\x{7A8B}\x{7A8C}\x{7A8D}\x{7A8E}' . + '\x{7A8F}\x{7A90}\x{7A91}\x{7A92}\x{7A93}\x{7A94}\x{7A95}\x{7A96}\x{7A97}' . + '\x{7A98}\x{7A99}\x{7A9C}\x{7A9D}\x{7A9E}\x{7A9F}\x{7AA0}\x{7AA1}\x{7AA2}' . + '\x{7AA3}\x{7AA4}\x{7AA5}\x{7AA6}\x{7AA7}\x{7AA8}\x{7AA9}\x{7AAA}\x{7AAB}' . + '\x{7AAC}\x{7AAD}\x{7AAE}\x{7AAF}\x{7AB0}\x{7AB1}\x{7AB2}\x{7AB3}\x{7AB4}' . + '\x{7AB5}\x{7AB6}\x{7AB7}\x{7AB8}\x{7ABA}\x{7ABE}\x{7ABF}\x{7AC0}\x{7AC1}' . + '\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}\x{7AC9}\x{7ACA}\x{7ACB}\x{7ACC}\x{7ACD}' . + '\x{7ACE}\x{7ACF}\x{7AD0}\x{7AD1}\x{7AD2}\x{7AD3}\x{7AD4}\x{7AD5}\x{7AD6}' . + '\x{7AD8}\x{7AD9}\x{7ADB}\x{7ADC}\x{7ADD}\x{7ADE}\x{7ADF}\x{7AE0}\x{7AE1}' . + '\x{7AE2}\x{7AE3}\x{7AE4}\x{7AE5}\x{7AE6}\x{7AE7}\x{7AE8}\x{7AEA}\x{7AEB}' . + '\x{7AEC}\x{7AED}\x{7AEE}\x{7AEF}\x{7AF0}\x{7AF1}\x{7AF2}\x{7AF3}\x{7AF4}' . + '\x{7AF6}\x{7AF7}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFB}\x{7AFD}\x{7AFE}\x{7AFF}' . + '\x{7B00}\x{7B01}\x{7B02}\x{7B03}\x{7B04}\x{7B05}\x{7B06}\x{7B08}\x{7B09}' . + '\x{7B0A}\x{7B0B}\x{7B0C}\x{7B0D}\x{7B0E}\x{7B0F}\x{7B10}\x{7B11}\x{7B12}' . + '\x{7B13}\x{7B14}\x{7B15}\x{7B16}\x{7B17}\x{7B18}\x{7B19}\x{7B1A}\x{7B1B}' . + '\x{7B1C}\x{7B1D}\x{7B1E}\x{7B20}\x{7B21}\x{7B22}\x{7B23}\x{7B24}\x{7B25}' . + '\x{7B26}\x{7B28}\x{7B2A}\x{7B2B}\x{7B2C}\x{7B2D}\x{7B2E}\x{7B2F}\x{7B30}' . + '\x{7B31}\x{7B32}\x{7B33}\x{7B34}\x{7B35}\x{7B36}\x{7B37}\x{7B38}\x{7B39}' . + '\x{7B3A}\x{7B3B}\x{7B3C}\x{7B3D}\x{7B3E}\x{7B3F}\x{7B40}\x{7B41}\x{7B43}' . + '\x{7B44}\x{7B45}\x{7B46}\x{7B47}\x{7B48}\x{7B49}\x{7B4A}\x{7B4B}\x{7B4C}' . + '\x{7B4D}\x{7B4E}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B55}\x{7B56}' . + '\x{7B57}\x{7B58}\x{7B59}\x{7B5A}\x{7B5B}\x{7B5C}\x{7B5D}\x{7B5E}\x{7B5F}' . + '\x{7B60}\x{7B61}\x{7B62}\x{7B63}\x{7B64}\x{7B65}\x{7B66}\x{7B67}\x{7B68}' . + '\x{7B69}\x{7B6A}\x{7B6B}\x{7B6C}\x{7B6D}\x{7B6E}\x{7B70}\x{7B71}\x{7B72}' . + '\x{7B73}\x{7B74}\x{7B75}\x{7B76}\x{7B77}\x{7B78}\x{7B79}\x{7B7B}\x{7B7C}' . + '\x{7B7D}\x{7B7E}\x{7B7F}\x{7B80}\x{7B81}\x{7B82}\x{7B83}\x{7B84}\x{7B85}' . + '\x{7B87}\x{7B88}\x{7B89}\x{7B8A}\x{7B8B}\x{7B8C}\x{7B8D}\x{7B8E}\x{7B8F}' . + '\x{7B90}\x{7B91}\x{7B93}\x{7B94}\x{7B95}\x{7B96}\x{7B97}\x{7B98}\x{7B99}' . + '\x{7B9A}\x{7B9B}\x{7B9C}\x{7B9D}\x{7B9E}\x{7B9F}\x{7BA0}\x{7BA1}\x{7BA2}' . + '\x{7BA4}\x{7BA6}\x{7BA7}\x{7BA8}\x{7BA9}\x{7BAA}\x{7BAB}\x{7BAC}\x{7BAD}' . + '\x{7BAE}\x{7BAF}\x{7BB1}\x{7BB3}\x{7BB4}\x{7BB5}\x{7BB6}\x{7BB7}\x{7BB8}' . + '\x{7BB9}\x{7BBA}\x{7BBB}\x{7BBC}\x{7BBD}\x{7BBE}\x{7BBF}\x{7BC0}\x{7BC1}' . + '\x{7BC2}\x{7BC3}\x{7BC4}\x{7BC5}\x{7BC6}\x{7BC7}\x{7BC8}\x{7BC9}\x{7BCA}' . + '\x{7BCB}\x{7BCC}\x{7BCD}\x{7BCE}\x{7BD0}\x{7BD1}\x{7BD2}\x{7BD3}\x{7BD4}' . + '\x{7BD5}\x{7BD6}\x{7BD7}\x{7BD8}\x{7BD9}\x{7BDA}\x{7BDB}\x{7BDC}\x{7BDD}' . + '\x{7BDE}\x{7BDF}\x{7BE0}\x{7BE1}\x{7BE2}\x{7BE3}\x{7BE4}\x{7BE5}\x{7BE6}' . + '\x{7BE7}\x{7BE8}\x{7BE9}\x{7BEA}\x{7BEB}\x{7BEC}\x{7BED}\x{7BEE}\x{7BEF}' . + '\x{7BF0}\x{7BF1}\x{7BF2}\x{7BF3}\x{7BF4}\x{7BF5}\x{7BF6}\x{7BF7}\x{7BF8}' . + '\x{7BF9}\x{7BFB}\x{7BFC}\x{7BFD}\x{7BFE}\x{7BFF}\x{7C00}\x{7C01}\x{7C02}' . + '\x{7C03}\x{7C04}\x{7C05}\x{7C06}\x{7C07}\x{7C08}\x{7C09}\x{7C0A}\x{7C0B}' . + '\x{7C0C}\x{7C0D}\x{7C0E}\x{7C0F}\x{7C10}\x{7C11}\x{7C12}\x{7C13}\x{7C15}' . + '\x{7C16}\x{7C17}\x{7C18}\x{7C19}\x{7C1A}\x{7C1C}\x{7C1D}\x{7C1E}\x{7C1F}' . + '\x{7C20}\x{7C21}\x{7C22}\x{7C23}\x{7C24}\x{7C25}\x{7C26}\x{7C27}\x{7C28}' . + '\x{7C29}\x{7C2A}\x{7C2B}\x{7C2C}\x{7C2D}\x{7C30}\x{7C31}\x{7C32}\x{7C33}' . + '\x{7C34}\x{7C35}\x{7C36}\x{7C37}\x{7C38}\x{7C39}\x{7C3A}\x{7C3B}\x{7C3C}' . + '\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C41}\x{7C42}\x{7C43}\x{7C44}\x{7C45}' . + '\x{7C46}\x{7C47}\x{7C48}\x{7C49}\x{7C4A}\x{7C4B}\x{7C4C}\x{7C4D}\x{7C4E}' . + '\x{7C50}\x{7C51}\x{7C53}\x{7C54}\x{7C56}\x{7C57}\x{7C58}\x{7C59}\x{7C5A}' . + '\x{7C5B}\x{7C5C}\x{7C5E}\x{7C5F}\x{7C60}\x{7C61}\x{7C62}\x{7C63}\x{7C64}' . + '\x{7C65}\x{7C66}\x{7C67}\x{7C68}\x{7C69}\x{7C6A}\x{7C6B}\x{7C6C}\x{7C6D}' . + '\x{7C6E}\x{7C6F}\x{7C70}\x{7C71}\x{7C72}\x{7C73}\x{7C74}\x{7C75}\x{7C77}' . + '\x{7C78}\x{7C79}\x{7C7A}\x{7C7B}\x{7C7C}\x{7C7D}\x{7C7E}\x{7C7F}\x{7C80}' . + '\x{7C81}\x{7C82}\x{7C84}\x{7C85}\x{7C86}\x{7C88}\x{7C89}\x{7C8A}\x{7C8B}' . + '\x{7C8C}\x{7C8D}\x{7C8E}\x{7C8F}\x{7C90}\x{7C91}\x{7C92}\x{7C94}\x{7C95}' . + '\x{7C96}\x{7C97}\x{7C98}\x{7C99}\x{7C9B}\x{7C9C}\x{7C9D}\x{7C9E}\x{7C9F}' . + '\x{7CA0}\x{7CA1}\x{7CA2}\x{7CA3}\x{7CA4}\x{7CA5}\x{7CA6}\x{7CA7}\x{7CA8}' . + '\x{7CA9}\x{7CAA}\x{7CAD}\x{7CAE}\x{7CAF}\x{7CB0}\x{7CB1}\x{7CB2}\x{7CB3}' . + '\x{7CB4}\x{7CB5}\x{7CB6}\x{7CB7}\x{7CB8}\x{7CB9}\x{7CBA}\x{7CBB}\x{7CBC}' . + '\x{7CBD}\x{7CBE}\x{7CBF}\x{7CC0}\x{7CC1}\x{7CC2}\x{7CC3}\x{7CC4}\x{7CC5}' . + '\x{7CC6}\x{7CC7}\x{7CC8}\x{7CC9}\x{7CCA}\x{7CCB}\x{7CCC}\x{7CCD}\x{7CCE}' . + '\x{7CCF}\x{7CD0}\x{7CD1}\x{7CD2}\x{7CD4}\x{7CD5}\x{7CD6}\x{7CD7}\x{7CD8}' . + '\x{7CD9}\x{7CDC}\x{7CDD}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}' . + '\x{7CE8}\x{7CE9}\x{7CEA}\x{7CEB}\x{7CEC}\x{7CED}\x{7CEE}\x{7CEF}\x{7CF0}' . + '\x{7CF1}\x{7CF2}\x{7CF3}\x{7CF4}\x{7CF5}\x{7CF6}\x{7CF7}\x{7CF8}\x{7CF9}' . + '\x{7CFA}\x{7CFB}\x{7CFD}\x{7CFE}\x{7D00}\x{7D01}\x{7D02}\x{7D03}\x{7D04}' . + '\x{7D05}\x{7D06}\x{7D07}\x{7D08}\x{7D09}\x{7D0A}\x{7D0B}\x{7D0C}\x{7D0D}' . + '\x{7D0E}\x{7D0F}\x{7D10}\x{7D11}\x{7D12}\x{7D13}\x{7D14}\x{7D15}\x{7D16}' . + '\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D1D}\x{7D1E}\x{7D1F}' . + '\x{7D20}\x{7D21}\x{7D22}\x{7D24}\x{7D25}\x{7D26}\x{7D27}\x{7D28}\x{7D29}' . + '\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D31}\x{7D32}\x{7D33}\x{7D34}' . + '\x{7D35}\x{7D36}\x{7D37}\x{7D38}\x{7D39}\x{7D3A}\x{7D3B}\x{7D3C}\x{7D3D}' . + '\x{7D3E}\x{7D3F}\x{7D40}\x{7D41}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}' . + '\x{7D47}\x{7D49}\x{7D4A}\x{7D4B}\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D51}' . + '\x{7D52}\x{7D53}\x{7D54}\x{7D55}\x{7D56}\x{7D57}\x{7D58}\x{7D59}\x{7D5B}' . + '\x{7D5C}\x{7D5D}\x{7D5E}\x{7D5F}\x{7D60}\x{7D61}\x{7D62}\x{7D63}\x{7D65}' . + '\x{7D66}\x{7D67}\x{7D68}\x{7D69}\x{7D6A}\x{7D6B}\x{7D6C}\x{7D6D}\x{7D6E}' . + '\x{7D6F}\x{7D70}\x{7D71}\x{7D72}\x{7D73}\x{7D74}\x{7D75}\x{7D76}\x{7D77}' . + '\x{7D79}\x{7D7A}\x{7D7B}\x{7D7C}\x{7D7D}\x{7D7E}\x{7D7F}\x{7D80}\x{7D81}' . + '\x{7D83}\x{7D84}\x{7D85}\x{7D86}\x{7D87}\x{7D88}\x{7D89}\x{7D8A}\x{7D8B}' . + '\x{7D8C}\x{7D8D}\x{7D8E}\x{7D8F}\x{7D90}\x{7D91}\x{7D92}\x{7D93}\x{7D94}' . + '\x{7D96}\x{7D97}\x{7D99}\x{7D9B}\x{7D9C}\x{7D9D}\x{7D9E}\x{7D9F}\x{7DA0}' . + '\x{7DA1}\x{7DA2}\x{7DA3}\x{7DA5}\x{7DA6}\x{7DA7}\x{7DA9}\x{7DAA}\x{7DAB}' . + '\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}\x{7DB1}\x{7DB2}\x{7DB3}\x{7DB4}' . + '\x{7DB5}\x{7DB6}\x{7DB7}\x{7DB8}\x{7DB9}\x{7DBA}\x{7DBB}\x{7DBC}\x{7DBD}' . + '\x{7DBE}\x{7DBF}\x{7DC0}\x{7DC1}\x{7DC2}\x{7DC3}\x{7DC4}\x{7DC5}\x{7DC6}' . + '\x{7DC7}\x{7DC8}\x{7DC9}\x{7DCA}\x{7DCB}\x{7DCC}\x{7DCE}\x{7DCF}\x{7DD0}' . + '\x{7DD1}\x{7DD2}\x{7DD4}\x{7DD5}\x{7DD6}\x{7DD7}\x{7DD8}\x{7DD9}\x{7DDA}' . + '\x{7DDB}\x{7DDD}\x{7DDE}\x{7DDF}\x{7DE0}\x{7DE1}\x{7DE2}\x{7DE3}\x{7DE6}' . + '\x{7DE7}\x{7DE8}\x{7DE9}\x{7DEA}\x{7DEC}\x{7DED}\x{7DEE}\x{7DEF}\x{7DF0}' . + '\x{7DF1}\x{7DF2}\x{7DF3}\x{7DF4}\x{7DF5}\x{7DF6}\x{7DF7}\x{7DF8}\x{7DF9}' . + '\x{7DFA}\x{7DFB}\x{7DFC}\x{7E00}\x{7E01}\x{7E02}\x{7E03}\x{7E04}\x{7E05}' . + '\x{7E06}\x{7E07}\x{7E08}\x{7E09}\x{7E0A}\x{7E0B}\x{7E0C}\x{7E0D}\x{7E0E}' . + '\x{7E0F}\x{7E10}\x{7E11}\x{7E12}\x{7E13}\x{7E14}\x{7E15}\x{7E16}\x{7E17}' . + '\x{7E19}\x{7E1A}\x{7E1B}\x{7E1C}\x{7E1D}\x{7E1E}\x{7E1F}\x{7E20}\x{7E21}' . + '\x{7E22}\x{7E23}\x{7E24}\x{7E25}\x{7E26}\x{7E27}\x{7E28}\x{7E29}\x{7E2A}' . + '\x{7E2B}\x{7E2C}\x{7E2D}\x{7E2E}\x{7E2F}\x{7E30}\x{7E31}\x{7E32}\x{7E33}' . + '\x{7E34}\x{7E35}\x{7E36}\x{7E37}\x{7E38}\x{7E39}\x{7E3A}\x{7E3B}\x{7E3C}' . + '\x{7E3D}\x{7E3E}\x{7E3F}\x{7E40}\x{7E41}\x{7E42}\x{7E43}\x{7E44}\x{7E45}' . + '\x{7E46}\x{7E47}\x{7E48}\x{7E49}\x{7E4C}\x{7E4D}\x{7E4E}\x{7E4F}\x{7E50}' . + '\x{7E51}\x{7E52}\x{7E53}\x{7E54}\x{7E55}\x{7E56}\x{7E57}\x{7E58}\x{7E59}' . + '\x{7E5A}\x{7E5C}\x{7E5D}\x{7E5E}\x{7E5F}\x{7E60}\x{7E61}\x{7E62}\x{7E63}' . + '\x{7E65}\x{7E66}\x{7E67}\x{7E68}\x{7E69}\x{7E6A}\x{7E6B}\x{7E6C}\x{7E6D}' . + '\x{7E6E}\x{7E6F}\x{7E70}\x{7E71}\x{7E72}\x{7E73}\x{7E74}\x{7E75}\x{7E76}' . + '\x{7E77}\x{7E78}\x{7E79}\x{7E7A}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7E}\x{7E7F}' . + '\x{7E80}\x{7E81}\x{7E82}\x{7E83}\x{7E84}\x{7E85}\x{7E86}\x{7E87}\x{7E88}' . + '\x{7E89}\x{7E8A}\x{7E8B}\x{7E8C}\x{7E8D}\x{7E8E}\x{7E8F}\x{7E90}\x{7E91}' . + '\x{7E92}\x{7E93}\x{7E94}\x{7E95}\x{7E96}\x{7E97}\x{7E98}\x{7E99}\x{7E9A}' . + '\x{7E9B}\x{7E9C}\x{7E9E}\x{7E9F}\x{7EA0}\x{7EA1}\x{7EA2}\x{7EA3}\x{7EA4}' . + '\x{7EA5}\x{7EA6}\x{7EA7}\x{7EA8}\x{7EA9}\x{7EAA}\x{7EAB}\x{7EAC}\x{7EAD}' . + '\x{7EAE}\x{7EAF}\x{7EB0}\x{7EB1}\x{7EB2}\x{7EB3}\x{7EB4}\x{7EB5}\x{7EB6}' . + '\x{7EB7}\x{7EB8}\x{7EB9}\x{7EBA}\x{7EBB}\x{7EBC}\x{7EBD}\x{7EBE}\x{7EBF}' . + '\x{7EC0}\x{7EC1}\x{7EC2}\x{7EC3}\x{7EC4}\x{7EC5}\x{7EC6}\x{7EC7}\x{7EC8}' . + '\x{7EC9}\x{7ECA}\x{7ECB}\x{7ECC}\x{7ECD}\x{7ECE}\x{7ECF}\x{7ED0}\x{7ED1}' . + '\x{7ED2}\x{7ED3}\x{7ED4}\x{7ED5}\x{7ED6}\x{7ED7}\x{7ED8}\x{7ED9}\x{7EDA}' . + '\x{7EDB}\x{7EDC}\x{7EDD}\x{7EDE}\x{7EDF}\x{7EE0}\x{7EE1}\x{7EE2}\x{7EE3}' . + '\x{7EE4}\x{7EE5}\x{7EE6}\x{7EE7}\x{7EE8}\x{7EE9}\x{7EEA}\x{7EEB}\x{7EEC}' . + '\x{7EED}\x{7EEE}\x{7EEF}\x{7EF0}\x{7EF1}\x{7EF2}\x{7EF3}\x{7EF4}\x{7EF5}' . + '\x{7EF6}\x{7EF7}\x{7EF8}\x{7EF9}\x{7EFA}\x{7EFB}\x{7EFC}\x{7EFD}\x{7EFE}' . + '\x{7EFF}\x{7F00}\x{7F01}\x{7F02}\x{7F03}\x{7F04}\x{7F05}\x{7F06}\x{7F07}' . + '\x{7F08}\x{7F09}\x{7F0A}\x{7F0B}\x{7F0C}\x{7F0D}\x{7F0E}\x{7F0F}\x{7F10}' . + '\x{7F11}\x{7F12}\x{7F13}\x{7F14}\x{7F15}\x{7F16}\x{7F17}\x{7F18}\x{7F19}' . + '\x{7F1A}\x{7F1B}\x{7F1C}\x{7F1D}\x{7F1E}\x{7F1F}\x{7F20}\x{7F21}\x{7F22}' . + '\x{7F23}\x{7F24}\x{7F25}\x{7F26}\x{7F27}\x{7F28}\x{7F29}\x{7F2A}\x{7F2B}' . + '\x{7F2C}\x{7F2D}\x{7F2E}\x{7F2F}\x{7F30}\x{7F31}\x{7F32}\x{7F33}\x{7F34}' . + '\x{7F35}\x{7F36}\x{7F37}\x{7F38}\x{7F39}\x{7F3A}\x{7F3D}\x{7F3E}\x{7F3F}' . + '\x{7F40}\x{7F42}\x{7F43}\x{7F44}\x{7F45}\x{7F47}\x{7F48}\x{7F49}\x{7F4A}' . + '\x{7F4B}\x{7F4C}\x{7F4D}\x{7F4E}\x{7F4F}\x{7F50}\x{7F51}\x{7F52}\x{7F53}' . + '\x{7F54}\x{7F55}\x{7F56}\x{7F57}\x{7F58}\x{7F5A}\x{7F5B}\x{7F5C}\x{7F5D}' . + '\x{7F5E}\x{7F5F}\x{7F60}\x{7F61}\x{7F62}\x{7F63}\x{7F64}\x{7F65}\x{7F66}' . + '\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6C}\x{7F6D}\x{7F6E}\x{7F6F}' . + '\x{7F70}\x{7F71}\x{7F72}\x{7F73}\x{7F74}\x{7F75}\x{7F76}\x{7F77}\x{7F78}' . + '\x{7F79}\x{7F7A}\x{7F7B}\x{7F7C}\x{7F7D}\x{7F7E}\x{7F7F}\x{7F80}\x{7F81}' . + '\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}\x{7F88}\x{7F89}\x{7F8A}\x{7F8B}' . + '\x{7F8C}\x{7F8D}\x{7F8E}\x{7F8F}\x{7F91}\x{7F92}\x{7F93}\x{7F94}\x{7F95}' . + '\x{7F96}\x{7F98}\x{7F9A}\x{7F9B}\x{7F9C}\x{7F9D}\x{7F9E}\x{7F9F}\x{7FA0}' . + '\x{7FA1}\x{7FA2}\x{7FA3}\x{7FA4}\x{7FA5}\x{7FA6}\x{7FA7}\x{7FA8}\x{7FA9}' . + '\x{7FAA}\x{7FAB}\x{7FAC}\x{7FAD}\x{7FAE}\x{7FAF}\x{7FB0}\x{7FB1}\x{7FB2}' . + '\x{7FB3}\x{7FB5}\x{7FB6}\x{7FB7}\x{7FB8}\x{7FB9}\x{7FBA}\x{7FBB}\x{7FBC}' . + '\x{7FBD}\x{7FBE}\x{7FBF}\x{7FC0}\x{7FC1}\x{7FC2}\x{7FC3}\x{7FC4}\x{7FC5}' . + '\x{7FC6}\x{7FC7}\x{7FC8}\x{7FC9}\x{7FCA}\x{7FCB}\x{7FCC}\x{7FCD}\x{7FCE}' . + '\x{7FCF}\x{7FD0}\x{7FD1}\x{7FD2}\x{7FD3}\x{7FD4}\x{7FD5}\x{7FD7}\x{7FD8}' . + '\x{7FD9}\x{7FDA}\x{7FDB}\x{7FDC}\x{7FDE}\x{7FDF}\x{7FE0}\x{7FE1}\x{7FE2}' . + '\x{7FE3}\x{7FE5}\x{7FE6}\x{7FE7}\x{7FE8}\x{7FE9}\x{7FEA}\x{7FEB}\x{7FEC}' . + '\x{7FED}\x{7FEE}\x{7FEF}\x{7FF0}\x{7FF1}\x{7FF2}\x{7FF3}\x{7FF4}\x{7FF5}' . + '\x{7FF6}\x{7FF7}\x{7FF8}\x{7FF9}\x{7FFA}\x{7FFB}\x{7FFC}\x{7FFD}\x{7FFE}' . + '\x{7FFF}\x{8000}\x{8001}\x{8002}\x{8003}\x{8004}\x{8005}\x{8006}\x{8007}' . + '\x{8008}\x{8009}\x{800B}\x{800C}\x{800D}\x{800E}\x{800F}\x{8010}\x{8011}' . + '\x{8012}\x{8013}\x{8014}\x{8015}\x{8016}\x{8017}\x{8018}\x{8019}\x{801A}' . + '\x{801B}\x{801C}\x{801D}\x{801E}\x{801F}\x{8020}\x{8021}\x{8022}\x{8023}' . + '\x{8024}\x{8025}\x{8026}\x{8027}\x{8028}\x{8029}\x{802A}\x{802B}\x{802C}' . + '\x{802D}\x{802E}\x{8030}\x{8031}\x{8032}\x{8033}\x{8034}\x{8035}\x{8036}' . + '\x{8037}\x{8038}\x{8039}\x{803A}\x{803B}\x{803D}\x{803E}\x{803F}\x{8041}' . + '\x{8042}\x{8043}\x{8044}\x{8045}\x{8046}\x{8047}\x{8048}\x{8049}\x{804A}' . + '\x{804B}\x{804C}\x{804D}\x{804E}\x{804F}\x{8050}\x{8051}\x{8052}\x{8053}' . + '\x{8054}\x{8055}\x{8056}\x{8057}\x{8058}\x{8059}\x{805A}\x{805B}\x{805C}' . + '\x{805D}\x{805E}\x{805F}\x{8060}\x{8061}\x{8062}\x{8063}\x{8064}\x{8065}' . + '\x{8067}\x{8068}\x{8069}\x{806A}\x{806B}\x{806C}\x{806D}\x{806E}\x{806F}' . + '\x{8070}\x{8071}\x{8072}\x{8073}\x{8074}\x{8075}\x{8076}\x{8077}\x{8078}' . + '\x{8079}\x{807A}\x{807B}\x{807C}\x{807D}\x{807E}\x{807F}\x{8080}\x{8081}' . + '\x{8082}\x{8083}\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808A}\x{808B}' . + '\x{808C}\x{808D}\x{808F}\x{8090}\x{8091}\x{8092}\x{8093}\x{8095}\x{8096}' . + '\x{8097}\x{8098}\x{8099}\x{809A}\x{809B}\x{809C}\x{809D}\x{809E}\x{809F}' . + '\x{80A0}\x{80A1}\x{80A2}\x{80A3}\x{80A4}\x{80A5}\x{80A9}\x{80AA}\x{80AB}' . + '\x{80AD}\x{80AE}\x{80AF}\x{80B0}\x{80B1}\x{80B2}\x{80B4}\x{80B5}\x{80B6}' . + '\x{80B7}\x{80B8}\x{80BA}\x{80BB}\x{80BC}\x{80BD}\x{80BE}\x{80BF}\x{80C0}' . + '\x{80C1}\x{80C2}\x{80C3}\x{80C4}\x{80C5}\x{80C6}\x{80C7}\x{80C8}\x{80C9}' . + '\x{80CA}\x{80CB}\x{80CC}\x{80CD}\x{80CE}\x{80CF}\x{80D0}\x{80D1}\x{80D2}' . + '\x{80D3}\x{80D4}\x{80D5}\x{80D6}\x{80D7}\x{80D8}\x{80D9}\x{80DA}\x{80DB}' . + '\x{80DC}\x{80DD}\x{80DE}\x{80E0}\x{80E1}\x{80E2}\x{80E3}\x{80E4}\x{80E5}' . + '\x{80E6}\x{80E7}\x{80E8}\x{80E9}\x{80EA}\x{80EB}\x{80EC}\x{80ED}\x{80EE}' . + '\x{80EF}\x{80F0}\x{80F1}\x{80F2}\x{80F3}\x{80F4}\x{80F5}\x{80F6}\x{80F7}' . + '\x{80F8}\x{80F9}\x{80FA}\x{80FB}\x{80FC}\x{80FD}\x{80FE}\x{80FF}\x{8100}' . + '\x{8101}\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{810B}' . + '\x{810C}\x{810D}\x{810E}\x{810F}\x{8110}\x{8111}\x{8112}\x{8113}\x{8114}' . + '\x{8115}\x{8116}\x{8118}\x{8119}\x{811A}\x{811B}\x{811C}\x{811D}\x{811E}' . + '\x{811F}\x{8120}\x{8121}\x{8122}\x{8123}\x{8124}\x{8125}\x{8126}\x{8127}' . + '\x{8128}\x{8129}\x{812A}\x{812B}\x{812C}\x{812D}\x{812E}\x{812F}\x{8130}' . + '\x{8131}\x{8132}\x{8136}\x{8137}\x{8138}\x{8139}\x{813A}\x{813B}\x{813C}' . + '\x{813D}\x{813E}\x{813F}\x{8140}\x{8141}\x{8142}\x{8143}\x{8144}\x{8145}' . + '\x{8146}\x{8147}\x{8148}\x{8149}\x{814A}\x{814B}\x{814C}\x{814D}\x{814E}' . + '\x{814F}\x{8150}\x{8151}\x{8152}\x{8153}\x{8154}\x{8155}\x{8156}\x{8157}' . + '\x{8158}\x{8159}\x{815A}\x{815B}\x{815C}\x{815D}\x{815E}\x{8160}\x{8161}' . + '\x{8162}\x{8163}\x{8164}\x{8165}\x{8166}\x{8167}\x{8168}\x{8169}\x{816A}' . + '\x{816B}\x{816C}\x{816D}\x{816E}\x{816F}\x{8170}\x{8171}\x{8172}\x{8173}' . + '\x{8174}\x{8175}\x{8176}\x{8177}\x{8178}\x{8179}\x{817A}\x{817B}\x{817C}' . + '\x{817D}\x{817E}\x{817F}\x{8180}\x{8181}\x{8182}\x{8183}\x{8185}\x{8186}' . + '\x{8187}\x{8188}\x{8189}\x{818A}\x{818B}\x{818C}\x{818D}\x{818E}\x{818F}' . + '\x{8191}\x{8192}\x{8193}\x{8194}\x{8195}\x{8197}\x{8198}\x{8199}\x{819A}' . + '\x{819B}\x{819C}\x{819D}\x{819E}\x{819F}\x{81A0}\x{81A1}\x{81A2}\x{81A3}' . + '\x{81A4}\x{81A5}\x{81A6}\x{81A7}\x{81A8}\x{81A9}\x{81AA}\x{81AB}\x{81AC}' . + '\x{81AD}\x{81AE}\x{81AF}\x{81B0}\x{81B1}\x{81B2}\x{81B3}\x{81B4}\x{81B5}' . + '\x{81B6}\x{81B7}\x{81B8}\x{81B9}\x{81BA}\x{81BB}\x{81BC}\x{81BD}\x{81BE}' . + '\x{81BF}\x{81C0}\x{81C1}\x{81C2}\x{81C3}\x{81C4}\x{81C5}\x{81C6}\x{81C7}' . + '\x{81C8}\x{81C9}\x{81CA}\x{81CC}\x{81CD}\x{81CE}\x{81CF}\x{81D0}\x{81D1}' . + '\x{81D2}\x{81D4}\x{81D5}\x{81D6}\x{81D7}\x{81D8}\x{81D9}\x{81DA}\x{81DB}' . + '\x{81DC}\x{81DD}\x{81DE}\x{81DF}\x{81E0}\x{81E1}\x{81E2}\x{81E3}\x{81E5}' . + '\x{81E6}\x{81E7}\x{81E8}\x{81E9}\x{81EA}\x{81EB}\x{81EC}\x{81ED}\x{81EE}' . + '\x{81F1}\x{81F2}\x{81F3}\x{81F4}\x{81F5}\x{81F6}\x{81F7}\x{81F8}\x{81F9}' . + '\x{81FA}\x{81FB}\x{81FC}\x{81FD}\x{81FE}\x{81FF}\x{8200}\x{8201}\x{8202}' . + '\x{8203}\x{8204}\x{8205}\x{8206}\x{8207}\x{8208}\x{8209}\x{820A}\x{820B}' . + '\x{820C}\x{820D}\x{820E}\x{820F}\x{8210}\x{8211}\x{8212}\x{8214}\x{8215}' . + '\x{8216}\x{8218}\x{8219}\x{821A}\x{821B}\x{821C}\x{821D}\x{821E}\x{821F}' . + '\x{8220}\x{8221}\x{8222}\x{8223}\x{8225}\x{8226}\x{8227}\x{8228}\x{8229}' . + '\x{822A}\x{822B}\x{822C}\x{822D}\x{822F}\x{8230}\x{8231}\x{8232}\x{8233}' . + '\x{8234}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{823A}\x{823B}\x{823C}' . + '\x{823D}\x{823E}\x{823F}\x{8240}\x{8242}\x{8243}\x{8244}\x{8245}\x{8246}' . + '\x{8247}\x{8248}\x{8249}\x{824A}\x{824B}\x{824C}\x{824D}\x{824E}\x{824F}' . + '\x{8250}\x{8251}\x{8252}\x{8253}\x{8254}\x{8255}\x{8256}\x{8257}\x{8258}' . + '\x{8259}\x{825A}\x{825B}\x{825C}\x{825D}\x{825E}\x{825F}\x{8260}\x{8261}' . + '\x{8263}\x{8264}\x{8266}\x{8267}\x{8268}\x{8269}\x{826A}\x{826B}\x{826C}' . + '\x{826D}\x{826E}\x{826F}\x{8270}\x{8271}\x{8272}\x{8273}\x{8274}\x{8275}' . + '\x{8276}\x{8277}\x{8278}\x{8279}\x{827A}\x{827B}\x{827C}\x{827D}\x{827E}' . + '\x{827F}\x{8280}\x{8281}\x{8282}\x{8283}\x{8284}\x{8285}\x{8286}\x{8287}' . + '\x{8288}\x{8289}\x{828A}\x{828B}\x{828D}\x{828E}\x{828F}\x{8290}\x{8291}' . + '\x{8292}\x{8293}\x{8294}\x{8295}\x{8296}\x{8297}\x{8298}\x{8299}\x{829A}' . + '\x{829B}\x{829C}\x{829D}\x{829E}\x{829F}\x{82A0}\x{82A1}\x{82A2}\x{82A3}' . + '\x{82A4}\x{82A5}\x{82A6}\x{82A7}\x{82A8}\x{82A9}\x{82AA}\x{82AB}\x{82AC}' . + '\x{82AD}\x{82AE}\x{82AF}\x{82B0}\x{82B1}\x{82B3}\x{82B4}\x{82B5}\x{82B6}' . + '\x{82B7}\x{82B8}\x{82B9}\x{82BA}\x{82BB}\x{82BC}\x{82BD}\x{82BE}\x{82BF}' . + '\x{82C0}\x{82C1}\x{82C2}\x{82C3}\x{82C4}\x{82C5}\x{82C6}\x{82C7}\x{82C8}' . + '\x{82C9}\x{82CA}\x{82CB}\x{82CC}\x{82CD}\x{82CE}\x{82CF}\x{82D0}\x{82D1}' . + '\x{82D2}\x{82D3}\x{82D4}\x{82D5}\x{82D6}\x{82D7}\x{82D8}\x{82D9}\x{82DA}' . + '\x{82DB}\x{82DC}\x{82DD}\x{82DE}\x{82DF}\x{82E0}\x{82E1}\x{82E3}\x{82E4}' . + '\x{82E5}\x{82E6}\x{82E7}\x{82E8}\x{82E9}\x{82EA}\x{82EB}\x{82EC}\x{82ED}' . + '\x{82EE}\x{82EF}\x{82F0}\x{82F1}\x{82F2}\x{82F3}\x{82F4}\x{82F5}\x{82F6}' . + '\x{82F7}\x{82F8}\x{82F9}\x{82FA}\x{82FB}\x{82FD}\x{82FE}\x{82FF}\x{8300}' . + '\x{8301}\x{8302}\x{8303}\x{8304}\x{8305}\x{8306}\x{8307}\x{8308}\x{8309}' . + '\x{830B}\x{830C}\x{830D}\x{830E}\x{830F}\x{8311}\x{8312}\x{8313}\x{8314}' . + '\x{8315}\x{8316}\x{8317}\x{8318}\x{8319}\x{831A}\x{831B}\x{831C}\x{831D}' . + '\x{831E}\x{831F}\x{8320}\x{8321}\x{8322}\x{8323}\x{8324}\x{8325}\x{8326}' . + '\x{8327}\x{8328}\x{8329}\x{832A}\x{832B}\x{832C}\x{832D}\x{832E}\x{832F}' . + '\x{8331}\x{8332}\x{8333}\x{8334}\x{8335}\x{8336}\x{8337}\x{8338}\x{8339}' . + '\x{833A}\x{833B}\x{833C}\x{833D}\x{833E}\x{833F}\x{8340}\x{8341}\x{8342}' . + '\x{8343}\x{8344}\x{8345}\x{8346}\x{8347}\x{8348}\x{8349}\x{834A}\x{834B}' . + '\x{834C}\x{834D}\x{834E}\x{834F}\x{8350}\x{8351}\x{8352}\x{8353}\x{8354}' . + '\x{8356}\x{8357}\x{8358}\x{8359}\x{835A}\x{835B}\x{835C}\x{835D}\x{835E}' . + '\x{835F}\x{8360}\x{8361}\x{8362}\x{8363}\x{8364}\x{8365}\x{8366}\x{8367}' . + '\x{8368}\x{8369}\x{836A}\x{836B}\x{836C}\x{836D}\x{836E}\x{836F}\x{8370}' . + '\x{8371}\x{8372}\x{8373}\x{8374}\x{8375}\x{8376}\x{8377}\x{8378}\x{8379}' . + '\x{837A}\x{837B}\x{837C}\x{837D}\x{837E}\x{837F}\x{8380}\x{8381}\x{8382}' . + '\x{8383}\x{8384}\x{8385}\x{8386}\x{8387}\x{8388}\x{8389}\x{838A}\x{838B}' . + '\x{838C}\x{838D}\x{838E}\x{838F}\x{8390}\x{8391}\x{8392}\x{8393}\x{8394}' . + '\x{8395}\x{8396}\x{8397}\x{8398}\x{8399}\x{839A}\x{839B}\x{839C}\x{839D}' . + '\x{839E}\x{83A0}\x{83A1}\x{83A2}\x{83A3}\x{83A4}\x{83A5}\x{83A6}\x{83A7}' . + '\x{83A8}\x{83A9}\x{83AA}\x{83AB}\x{83AC}\x{83AD}\x{83AE}\x{83AF}\x{83B0}' . + '\x{83B1}\x{83B2}\x{83B3}\x{83B4}\x{83B6}\x{83B7}\x{83B8}\x{83B9}\x{83BA}' . + '\x{83BB}\x{83BC}\x{83BD}\x{83BF}\x{83C0}\x{83C1}\x{83C2}\x{83C3}\x{83C4}' . + '\x{83C5}\x{83C6}\x{83C7}\x{83C8}\x{83C9}\x{83CA}\x{83CB}\x{83CC}\x{83CD}' . + '\x{83CE}\x{83CF}\x{83D0}\x{83D1}\x{83D2}\x{83D3}\x{83D4}\x{83D5}\x{83D6}' . + '\x{83D7}\x{83D8}\x{83D9}\x{83DA}\x{83DB}\x{83DC}\x{83DD}\x{83DE}\x{83DF}' . + '\x{83E0}\x{83E1}\x{83E2}\x{83E3}\x{83E4}\x{83E5}\x{83E7}\x{83E8}\x{83E9}' . + '\x{83EA}\x{83EB}\x{83EC}\x{83EE}\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F3}' . + '\x{83F4}\x{83F5}\x{83F6}\x{83F7}\x{83F8}\x{83F9}\x{83FA}\x{83FB}\x{83FC}' . + '\x{83FD}\x{83FE}\x{83FF}\x{8400}\x{8401}\x{8402}\x{8403}\x{8404}\x{8405}' . + '\x{8406}\x{8407}\x{8408}\x{8409}\x{840A}\x{840B}\x{840C}\x{840D}\x{840E}' . + '\x{840F}\x{8410}\x{8411}\x{8412}\x{8413}\x{8415}\x{8418}\x{8419}\x{841A}' . + '\x{841B}\x{841C}\x{841D}\x{841E}\x{8421}\x{8422}\x{8423}\x{8424}\x{8425}' . + '\x{8426}\x{8427}\x{8428}\x{8429}\x{842A}\x{842B}\x{842C}\x{842D}\x{842E}' . + '\x{842F}\x{8430}\x{8431}\x{8432}\x{8433}\x{8434}\x{8435}\x{8436}\x{8437}' . + '\x{8438}\x{8439}\x{843A}\x{843B}\x{843C}\x{843D}\x{843E}\x{843F}\x{8440}' . + '\x{8441}\x{8442}\x{8443}\x{8444}\x{8445}\x{8446}\x{8447}\x{8448}\x{8449}' . + '\x{844A}\x{844B}\x{844C}\x{844D}\x{844E}\x{844F}\x{8450}\x{8451}\x{8452}' . + '\x{8453}\x{8454}\x{8455}\x{8456}\x{8457}\x{8459}\x{845A}\x{845B}\x{845C}' . + '\x{845D}\x{845E}\x{845F}\x{8460}\x{8461}\x{8462}\x{8463}\x{8464}\x{8465}' . + '\x{8466}\x{8467}\x{8468}\x{8469}\x{846A}\x{846B}\x{846C}\x{846D}\x{846E}' . + '\x{846F}\x{8470}\x{8471}\x{8472}\x{8473}\x{8474}\x{8475}\x{8476}\x{8477}' . + '\x{8478}\x{8479}\x{847A}\x{847B}\x{847C}\x{847D}\x{847E}\x{847F}\x{8480}' . + '\x{8481}\x{8482}\x{8484}\x{8485}\x{8486}\x{8487}\x{8488}\x{8489}\x{848A}' . + '\x{848B}\x{848C}\x{848D}\x{848E}\x{848F}\x{8490}\x{8491}\x{8492}\x{8493}' . + '\x{8494}\x{8496}\x{8497}\x{8498}\x{8499}\x{849A}\x{849B}\x{849C}\x{849D}' . + '\x{849E}\x{849F}\x{84A0}\x{84A1}\x{84A2}\x{84A3}\x{84A4}\x{84A5}\x{84A6}' . + '\x{84A7}\x{84A8}\x{84A9}\x{84AA}\x{84AB}\x{84AC}\x{84AE}\x{84AF}\x{84B0}' . + '\x{84B1}\x{84B2}\x{84B3}\x{84B4}\x{84B5}\x{84B6}\x{84B8}\x{84B9}\x{84BA}' . + '\x{84BB}\x{84BC}\x{84BD}\x{84BE}\x{84BF}\x{84C0}\x{84C1}\x{84C2}\x{84C4}' . + '\x{84C5}\x{84C6}\x{84C7}\x{84C8}\x{84C9}\x{84CA}\x{84CB}\x{84CC}\x{84CD}' . + '\x{84CE}\x{84CF}\x{84D0}\x{84D1}\x{84D2}\x{84D3}\x{84D4}\x{84D5}\x{84D6}' . + '\x{84D7}\x{84D8}\x{84D9}\x{84DB}\x{84DC}\x{84DD}\x{84DE}\x{84DF}\x{84E0}' . + '\x{84E1}\x{84E2}\x{84E3}\x{84E4}\x{84E5}\x{84E6}\x{84E7}\x{84E8}\x{84E9}' . + '\x{84EA}\x{84EB}\x{84EC}\x{84EE}\x{84EF}\x{84F0}\x{84F1}\x{84F2}\x{84F3}' . + '\x{84F4}\x{84F5}\x{84F6}\x{84F7}\x{84F8}\x{84F9}\x{84FA}\x{84FB}\x{84FC}' . + '\x{84FD}\x{84FE}\x{84FF}\x{8500}\x{8501}\x{8502}\x{8503}\x{8504}\x{8506}' . + '\x{8507}\x{8508}\x{8509}\x{850A}\x{850B}\x{850C}\x{850D}\x{850E}\x{850F}' . + '\x{8511}\x{8512}\x{8513}\x{8514}\x{8515}\x{8516}\x{8517}\x{8518}\x{8519}' . + '\x{851A}\x{851B}\x{851C}\x{851D}\x{851E}\x{851F}\x{8520}\x{8521}\x{8522}' . + '\x{8523}\x{8524}\x{8525}\x{8526}\x{8527}\x{8528}\x{8529}\x{852A}\x{852B}' . + '\x{852C}\x{852D}\x{852E}\x{852F}\x{8530}\x{8531}\x{8534}\x{8535}\x{8536}' . + '\x{8537}\x{8538}\x{8539}\x{853A}\x{853B}\x{853C}\x{853D}\x{853E}\x{853F}' . + '\x{8540}\x{8541}\x{8542}\x{8543}\x{8544}\x{8545}\x{8546}\x{8547}\x{8548}' . + '\x{8549}\x{854A}\x{854B}\x{854D}\x{854E}\x{854F}\x{8551}\x{8552}\x{8553}' . + '\x{8554}\x{8555}\x{8556}\x{8557}\x{8558}\x{8559}\x{855A}\x{855B}\x{855C}' . + '\x{855D}\x{855E}\x{855F}\x{8560}\x{8561}\x{8562}\x{8563}\x{8564}\x{8565}' . + '\x{8566}\x{8567}\x{8568}\x{8569}\x{856A}\x{856B}\x{856C}\x{856D}\x{856E}' . + '\x{856F}\x{8570}\x{8571}\x{8572}\x{8573}\x{8574}\x{8575}\x{8576}\x{8577}' . + '\x{8578}\x{8579}\x{857A}\x{857B}\x{857C}\x{857D}\x{857E}\x{8580}\x{8581}' . + '\x{8582}\x{8583}\x{8584}\x{8585}\x{8586}\x{8587}\x{8588}\x{8589}\x{858A}' . + '\x{858B}\x{858C}\x{858D}\x{858E}\x{858F}\x{8590}\x{8591}\x{8592}\x{8594}' . + '\x{8595}\x{8596}\x{8598}\x{8599}\x{859A}\x{859B}\x{859C}\x{859D}\x{859E}' . + '\x{859F}\x{85A0}\x{85A1}\x{85A2}\x{85A3}\x{85A4}\x{85A5}\x{85A6}\x{85A7}' . + '\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AD}\x{85AE}\x{85AF}\x{85B0}' . + '\x{85B1}\x{85B3}\x{85B4}\x{85B5}\x{85B6}\x{85B7}\x{85B8}\x{85B9}\x{85BA}' . + '\x{85BC}\x{85BD}\x{85BE}\x{85BF}\x{85C0}\x{85C1}\x{85C2}\x{85C3}\x{85C4}' . + '\x{85C5}\x{85C6}\x{85C7}\x{85C8}\x{85C9}\x{85CA}\x{85CB}\x{85CD}\x{85CE}' . + '\x{85CF}\x{85D0}\x{85D1}\x{85D2}\x{85D3}\x{85D4}\x{85D5}\x{85D6}\x{85D7}' . + '\x{85D8}\x{85D9}\x{85DA}\x{85DB}\x{85DC}\x{85DD}\x{85DE}\x{85DF}\x{85E0}' . + '\x{85E1}\x{85E2}\x{85E3}\x{85E4}\x{85E5}\x{85E6}\x{85E7}\x{85E8}\x{85E9}' . + '\x{85EA}\x{85EB}\x{85EC}\x{85ED}\x{85EF}\x{85F0}\x{85F1}\x{85F2}\x{85F4}' . + '\x{85F5}\x{85F6}\x{85F7}\x{85F8}\x{85F9}\x{85FA}\x{85FB}\x{85FD}\x{85FE}' . + '\x{85FF}\x{8600}\x{8601}\x{8602}\x{8604}\x{8605}\x{8606}\x{8607}\x{8608}' . + '\x{8609}\x{860A}\x{860B}\x{860C}\x{860F}\x{8611}\x{8612}\x{8613}\x{8614}' . + '\x{8616}\x{8617}\x{8618}\x{8619}\x{861A}\x{861B}\x{861C}\x{861E}\x{861F}' . + '\x{8620}\x{8621}\x{8622}\x{8623}\x{8624}\x{8625}\x{8626}\x{8627}\x{8628}' . + '\x{8629}\x{862A}\x{862B}\x{862C}\x{862D}\x{862E}\x{862F}\x{8630}\x{8631}' . + '\x{8632}\x{8633}\x{8634}\x{8635}\x{8636}\x{8638}\x{8639}\x{863A}\x{863B}' . + '\x{863C}\x{863D}\x{863E}\x{863F}\x{8640}\x{8641}\x{8642}\x{8643}\x{8644}' . + '\x{8645}\x{8646}\x{8647}\x{8648}\x{8649}\x{864A}\x{864B}\x{864C}\x{864D}' . + '\x{864E}\x{864F}\x{8650}\x{8651}\x{8652}\x{8653}\x{8654}\x{8655}\x{8656}' . + '\x{8658}\x{8659}\x{865A}\x{865B}\x{865C}\x{865D}\x{865E}\x{865F}\x{8660}' . + '\x{8661}\x{8662}\x{8663}\x{8664}\x{8665}\x{8666}\x{8667}\x{8668}\x{8669}' . + '\x{866A}\x{866B}\x{866C}\x{866D}\x{866E}\x{866F}\x{8670}\x{8671}\x{8672}' . + '\x{8673}\x{8674}\x{8676}\x{8677}\x{8678}\x{8679}\x{867A}\x{867B}\x{867C}' . + '\x{867D}\x{867E}\x{867F}\x{8680}\x{8681}\x{8682}\x{8683}\x{8684}\x{8685}' . + '\x{8686}\x{8687}\x{8688}\x{868A}\x{868B}\x{868C}\x{868D}\x{868E}\x{868F}' . + '\x{8690}\x{8691}\x{8693}\x{8694}\x{8695}\x{8696}\x{8697}\x{8698}\x{8699}' . + '\x{869A}\x{869B}\x{869C}\x{869D}\x{869E}\x{869F}\x{86A1}\x{86A2}\x{86A3}' . + '\x{86A4}\x{86A5}\x{86A7}\x{86A8}\x{86A9}\x{86AA}\x{86AB}\x{86AC}\x{86AD}' . + '\x{86AE}\x{86AF}\x{86B0}\x{86B1}\x{86B2}\x{86B3}\x{86B4}\x{86B5}\x{86B6}' . + '\x{86B7}\x{86B8}\x{86B9}\x{86BA}\x{86BB}\x{86BC}\x{86BD}\x{86BE}\x{86BF}' . + '\x{86C0}\x{86C1}\x{86C2}\x{86C3}\x{86C4}\x{86C5}\x{86C6}\x{86C7}\x{86C8}' . + '\x{86C9}\x{86CA}\x{86CB}\x{86CC}\x{86CE}\x{86CF}\x{86D0}\x{86D1}\x{86D2}' . + '\x{86D3}\x{86D4}\x{86D6}\x{86D7}\x{86D8}\x{86D9}\x{86DA}\x{86DB}\x{86DC}' . + '\x{86DD}\x{86DE}\x{86DF}\x{86E1}\x{86E2}\x{86E3}\x{86E4}\x{86E5}\x{86E6}' . + '\x{86E8}\x{86E9}\x{86EA}\x{86EB}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F0}' . + '\x{86F1}\x{86F2}\x{86F3}\x{86F4}\x{86F5}\x{86F6}\x{86F7}\x{86F8}\x{86F9}' . + '\x{86FA}\x{86FB}\x{86FC}\x{86FE}\x{86FF}\x{8700}\x{8701}\x{8702}\x{8703}' . + '\x{8704}\x{8705}\x{8706}\x{8707}\x{8708}\x{8709}\x{870A}\x{870B}\x{870C}' . + '\x{870D}\x{870E}\x{870F}\x{8710}\x{8711}\x{8712}\x{8713}\x{8714}\x{8715}' . + '\x{8716}\x{8717}\x{8718}\x{8719}\x{871A}\x{871B}\x{871C}\x{871E}\x{871F}' . + '\x{8720}\x{8721}\x{8722}\x{8723}\x{8724}\x{8725}\x{8726}\x{8727}\x{8728}' . + '\x{8729}\x{872A}\x{872B}\x{872C}\x{872D}\x{872E}\x{8730}\x{8731}\x{8732}' . + '\x{8733}\x{8734}\x{8735}\x{8736}\x{8737}\x{8738}\x{8739}\x{873A}\x{873B}' . + '\x{873C}\x{873E}\x{873F}\x{8740}\x{8741}\x{8742}\x{8743}\x{8744}\x{8746}' . + '\x{8747}\x{8748}\x{8749}\x{874A}\x{874C}\x{874D}\x{874E}\x{874F}\x{8750}' . + '\x{8751}\x{8752}\x{8753}\x{8754}\x{8755}\x{8756}\x{8757}\x{8758}\x{8759}' . + '\x{875A}\x{875B}\x{875C}\x{875D}\x{875E}\x{875F}\x{8760}\x{8761}\x{8762}' . + '\x{8763}\x{8764}\x{8765}\x{8766}\x{8767}\x{8768}\x{8769}\x{876A}\x{876B}' . + '\x{876C}\x{876D}\x{876E}\x{876F}\x{8770}\x{8772}\x{8773}\x{8774}\x{8775}' . + '\x{8776}\x{8777}\x{8778}\x{8779}\x{877A}\x{877B}\x{877C}\x{877D}\x{877E}' . + '\x{8780}\x{8781}\x{8782}\x{8783}\x{8784}\x{8785}\x{8786}\x{8787}\x{8788}' . + '\x{8789}\x{878A}\x{878B}\x{878C}\x{878D}\x{878F}\x{8790}\x{8791}\x{8792}' . + '\x{8793}\x{8794}\x{8795}\x{8796}\x{8797}\x{8798}\x{879A}\x{879B}\x{879C}' . + '\x{879D}\x{879E}\x{879F}\x{87A0}\x{87A1}\x{87A2}\x{87A3}\x{87A4}\x{87A5}' . + '\x{87A6}\x{87A7}\x{87A8}\x{87A9}\x{87AA}\x{87AB}\x{87AC}\x{87AD}\x{87AE}' . + '\x{87AF}\x{87B0}\x{87B1}\x{87B2}\x{87B3}\x{87B4}\x{87B5}\x{87B6}\x{87B7}' . + '\x{87B8}\x{87B9}\x{87BA}\x{87BB}\x{87BC}\x{87BD}\x{87BE}\x{87BF}\x{87C0}' . + '\x{87C1}\x{87C2}\x{87C3}\x{87C4}\x{87C5}\x{87C6}\x{87C7}\x{87C8}\x{87C9}' . + '\x{87CA}\x{87CB}\x{87CC}\x{87CD}\x{87CE}\x{87CF}\x{87D0}\x{87D1}\x{87D2}' . + '\x{87D3}\x{87D4}\x{87D5}\x{87D6}\x{87D7}\x{87D8}\x{87D9}\x{87DB}\x{87DC}' . + '\x{87DD}\x{87DE}\x{87DF}\x{87E0}\x{87E1}\x{87E2}\x{87E3}\x{87E4}\x{87E5}' . + '\x{87E6}\x{87E7}\x{87E8}\x{87E9}\x{87EA}\x{87EB}\x{87EC}\x{87ED}\x{87EE}' . + '\x{87EF}\x{87F1}\x{87F2}\x{87F3}\x{87F4}\x{87F5}\x{87F6}\x{87F7}\x{87F8}' . + '\x{87F9}\x{87FA}\x{87FB}\x{87FC}\x{87FD}\x{87FE}\x{87FF}\x{8800}\x{8801}' . + '\x{8802}\x{8803}\x{8804}\x{8805}\x{8806}\x{8808}\x{8809}\x{880A}\x{880B}' . + '\x{880C}\x{880D}\x{880E}\x{880F}\x{8810}\x{8811}\x{8813}\x{8814}\x{8815}' . + '\x{8816}\x{8817}\x{8818}\x{8819}\x{881A}\x{881B}\x{881C}\x{881D}\x{881E}' . + '\x{881F}\x{8820}\x{8821}\x{8822}\x{8823}\x{8824}\x{8825}\x{8826}\x{8827}' . + '\x{8828}\x{8829}\x{882A}\x{882B}\x{882C}\x{882E}\x{882F}\x{8830}\x{8831}' . + '\x{8832}\x{8833}\x{8834}\x{8835}\x{8836}\x{8837}\x{8838}\x{8839}\x{883B}' . + '\x{883C}\x{883D}\x{883E}\x{883F}\x{8840}\x{8841}\x{8842}\x{8843}\x{8844}' . + '\x{8845}\x{8846}\x{8848}\x{8849}\x{884A}\x{884B}\x{884C}\x{884D}\x{884E}' . + '\x{884F}\x{8850}\x{8851}\x{8852}\x{8853}\x{8854}\x{8855}\x{8856}\x{8857}' . + '\x{8859}\x{885A}\x{885B}\x{885D}\x{885E}\x{8860}\x{8861}\x{8862}\x{8863}' . + '\x{8864}\x{8865}\x{8866}\x{8867}\x{8868}\x{8869}\x{886A}\x{886B}\x{886C}' . + '\x{886D}\x{886E}\x{886F}\x{8870}\x{8871}\x{8872}\x{8873}\x{8874}\x{8875}' . + '\x{8876}\x{8877}\x{8878}\x{8879}\x{887B}\x{887C}\x{887D}\x{887E}\x{887F}' . + '\x{8880}\x{8881}\x{8882}\x{8883}\x{8884}\x{8885}\x{8886}\x{8887}\x{8888}' . + '\x{8889}\x{888A}\x{888B}\x{888C}\x{888D}\x{888E}\x{888F}\x{8890}\x{8891}' . + '\x{8892}\x{8893}\x{8894}\x{8895}\x{8896}\x{8897}\x{8898}\x{8899}\x{889A}' . + '\x{889B}\x{889C}\x{889D}\x{889E}\x{889F}\x{88A0}\x{88A1}\x{88A2}\x{88A3}' . + '\x{88A4}\x{88A5}\x{88A6}\x{88A7}\x{88A8}\x{88A9}\x{88AA}\x{88AB}\x{88AC}' . + '\x{88AD}\x{88AE}\x{88AF}\x{88B0}\x{88B1}\x{88B2}\x{88B3}\x{88B4}\x{88B6}' . + '\x{88B7}\x{88B8}\x{88B9}\x{88BA}\x{88BB}\x{88BC}\x{88BD}\x{88BE}\x{88BF}' . + '\x{88C0}\x{88C1}\x{88C2}\x{88C3}\x{88C4}\x{88C5}\x{88C6}\x{88C7}\x{88C8}' . + '\x{88C9}\x{88CA}\x{88CB}\x{88CC}\x{88CD}\x{88CE}\x{88CF}\x{88D0}\x{88D1}' . + '\x{88D2}\x{88D3}\x{88D4}\x{88D5}\x{88D6}\x{88D7}\x{88D8}\x{88D9}\x{88DA}' . + '\x{88DB}\x{88DC}\x{88DD}\x{88DE}\x{88DF}\x{88E0}\x{88E1}\x{88E2}\x{88E3}' . + '\x{88E4}\x{88E5}\x{88E7}\x{88E8}\x{88EA}\x{88EB}\x{88EC}\x{88EE}\x{88EF}' . + '\x{88F0}\x{88F1}\x{88F2}\x{88F3}\x{88F4}\x{88F5}\x{88F6}\x{88F7}\x{88F8}' . + '\x{88F9}\x{88FA}\x{88FB}\x{88FC}\x{88FD}\x{88FE}\x{88FF}\x{8900}\x{8901}' . + '\x{8902}\x{8904}\x{8905}\x{8906}\x{8907}\x{8908}\x{8909}\x{890A}\x{890B}' . + '\x{890C}\x{890D}\x{890E}\x{8910}\x{8911}\x{8912}\x{8913}\x{8914}\x{8915}' . + '\x{8916}\x{8917}\x{8918}\x{8919}\x{891A}\x{891B}\x{891C}\x{891D}\x{891E}' . + '\x{891F}\x{8920}\x{8921}\x{8922}\x{8923}\x{8925}\x{8926}\x{8927}\x{8928}' . + '\x{8929}\x{892A}\x{892B}\x{892C}\x{892D}\x{892E}\x{892F}\x{8930}\x{8931}' . + '\x{8932}\x{8933}\x{8934}\x{8935}\x{8936}\x{8937}\x{8938}\x{8939}\x{893A}' . + '\x{893B}\x{893C}\x{893D}\x{893E}\x{893F}\x{8940}\x{8941}\x{8942}\x{8943}' . + '\x{8944}\x{8945}\x{8946}\x{8947}\x{8948}\x{8949}\x{894A}\x{894B}\x{894C}' . + '\x{894E}\x{894F}\x{8950}\x{8951}\x{8952}\x{8953}\x{8954}\x{8955}\x{8956}' . + '\x{8957}\x{8958}\x{8959}\x{895A}\x{895B}\x{895C}\x{895D}\x{895E}\x{895F}' . + '\x{8960}\x{8961}\x{8962}\x{8963}\x{8964}\x{8966}\x{8967}\x{8968}\x{8969}' . + '\x{896A}\x{896B}\x{896C}\x{896D}\x{896E}\x{896F}\x{8970}\x{8971}\x{8972}' . + '\x{8973}\x{8974}\x{8976}\x{8977}\x{8978}\x{8979}\x{897A}\x{897B}\x{897C}' . + '\x{897E}\x{897F}\x{8980}\x{8981}\x{8982}\x{8983}\x{8984}\x{8985}\x{8986}' . + '\x{8987}\x{8988}\x{8989}\x{898A}\x{898B}\x{898C}\x{898E}\x{898F}\x{8991}' . + '\x{8992}\x{8993}\x{8995}\x{8996}\x{8997}\x{8998}\x{899A}\x{899B}\x{899C}' . + '\x{899D}\x{899E}\x{899F}\x{89A0}\x{89A1}\x{89A2}\x{89A3}\x{89A4}\x{89A5}' . + '\x{89A6}\x{89A7}\x{89A8}\x{89AA}\x{89AB}\x{89AC}\x{89AD}\x{89AE}\x{89AF}' . + '\x{89B1}\x{89B2}\x{89B3}\x{89B5}\x{89B6}\x{89B7}\x{89B8}\x{89B9}\x{89BA}' . + '\x{89BD}\x{89BE}\x{89BF}\x{89C0}\x{89C1}\x{89C2}\x{89C3}\x{89C4}\x{89C5}' . + '\x{89C6}\x{89C7}\x{89C8}\x{89C9}\x{89CA}\x{89CB}\x{89CC}\x{89CD}\x{89CE}' . + '\x{89CF}\x{89D0}\x{89D1}\x{89D2}\x{89D3}\x{89D4}\x{89D5}\x{89D6}\x{89D7}' . + '\x{89D8}\x{89D9}\x{89DA}\x{89DB}\x{89DC}\x{89DD}\x{89DE}\x{89DF}\x{89E0}' . + '\x{89E1}\x{89E2}\x{89E3}\x{89E4}\x{89E5}\x{89E6}\x{89E7}\x{89E8}\x{89E9}' . + '\x{89EA}\x{89EB}\x{89EC}\x{89ED}\x{89EF}\x{89F0}\x{89F1}\x{89F2}\x{89F3}' . + '\x{89F4}\x{89F6}\x{89F7}\x{89F8}\x{89FA}\x{89FB}\x{89FC}\x{89FE}\x{89FF}' . + '\x{8A00}\x{8A01}\x{8A02}\x{8A03}\x{8A04}\x{8A07}\x{8A08}\x{8A09}\x{8A0A}' . + '\x{8A0B}\x{8A0C}\x{8A0D}\x{8A0E}\x{8A0F}\x{8A10}\x{8A11}\x{8A12}\x{8A13}' . + '\x{8A15}\x{8A16}\x{8A17}\x{8A18}\x{8A1A}\x{8A1B}\x{8A1C}\x{8A1D}\x{8A1E}' . + '\x{8A1F}\x{8A22}\x{8A23}\x{8A24}\x{8A25}\x{8A26}\x{8A27}\x{8A28}\x{8A29}' . + '\x{8A2A}\x{8A2C}\x{8A2D}\x{8A2E}\x{8A2F}\x{8A30}\x{8A31}\x{8A32}\x{8A34}' . + '\x{8A35}\x{8A36}\x{8A37}\x{8A38}\x{8A39}\x{8A3A}\x{8A3B}\x{8A3C}\x{8A3E}' . + '\x{8A3F}\x{8A40}\x{8A41}\x{8A42}\x{8A43}\x{8A44}\x{8A45}\x{8A46}\x{8A47}' . + '\x{8A48}\x{8A49}\x{8A4A}\x{8A4C}\x{8A4D}\x{8A4E}\x{8A4F}\x{8A50}\x{8A51}' . + '\x{8A52}\x{8A53}\x{8A54}\x{8A55}\x{8A56}\x{8A57}\x{8A58}\x{8A59}\x{8A5A}' . + '\x{8A5B}\x{8A5C}\x{8A5D}\x{8A5E}\x{8A5F}\x{8A60}\x{8A61}\x{8A62}\x{8A63}' . + '\x{8A65}\x{8A66}\x{8A67}\x{8A68}\x{8A69}\x{8A6A}\x{8A6B}\x{8A6C}\x{8A6D}' . + '\x{8A6E}\x{8A6F}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A74}\x{8A75}\x{8A76}' . + '\x{8A77}\x{8A79}\x{8A7A}\x{8A7B}\x{8A7C}\x{8A7E}\x{8A7F}\x{8A80}\x{8A81}' . + '\x{8A82}\x{8A83}\x{8A84}\x{8A85}\x{8A86}\x{8A87}\x{8A89}\x{8A8A}\x{8A8B}' . + '\x{8A8C}\x{8A8D}\x{8A8E}\x{8A8F}\x{8A90}\x{8A91}\x{8A92}\x{8A93}\x{8A94}' . + '\x{8A95}\x{8A96}\x{8A97}\x{8A98}\x{8A99}\x{8A9A}\x{8A9B}\x{8A9C}\x{8A9D}' . + '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA2}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA7}' . + '\x{8AA8}\x{8AA9}\x{8AAA}\x{8AAB}\x{8AAC}\x{8AAE}\x{8AB0}\x{8AB1}\x{8AB2}' . + '\x{8AB3}\x{8AB4}\x{8AB5}\x{8AB6}\x{8AB8}\x{8AB9}\x{8ABA}\x{8ABB}\x{8ABC}' . + '\x{8ABD}\x{8ABE}\x{8ABF}\x{8AC0}\x{8AC1}\x{8AC2}\x{8AC3}\x{8AC4}\x{8AC5}' . + '\x{8AC6}\x{8AC7}\x{8AC8}\x{8AC9}\x{8ACA}\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACE}' . + '\x{8ACF}\x{8AD1}\x{8AD2}\x{8AD3}\x{8AD4}\x{8AD5}\x{8AD6}\x{8AD7}\x{8AD8}' . + '\x{8AD9}\x{8ADA}\x{8ADB}\x{8ADC}\x{8ADD}\x{8ADE}\x{8ADF}\x{8AE0}\x{8AE1}' . + '\x{8AE2}\x{8AE3}\x{8AE4}\x{8AE5}\x{8AE6}\x{8AE7}\x{8AE8}\x{8AE9}\x{8AEA}' . + '\x{8AEB}\x{8AED}\x{8AEE}\x{8AEF}\x{8AF0}\x{8AF1}\x{8AF2}\x{8AF3}\x{8AF4}' . + '\x{8AF5}\x{8AF6}\x{8AF7}\x{8AF8}\x{8AF9}\x{8AFA}\x{8AFB}\x{8AFC}\x{8AFD}' . + '\x{8AFE}\x{8AFF}\x{8B00}\x{8B01}\x{8B02}\x{8B03}\x{8B04}\x{8B05}\x{8B06}' . + '\x{8B07}\x{8B08}\x{8B09}\x{8B0A}\x{8B0B}\x{8B0D}\x{8B0E}\x{8B0F}\x{8B10}' . + '\x{8B11}\x{8B12}\x{8B13}\x{8B14}\x{8B15}\x{8B16}\x{8B17}\x{8B18}\x{8B19}' . + '\x{8B1A}\x{8B1B}\x{8B1C}\x{8B1D}\x{8B1E}\x{8B1F}\x{8B20}\x{8B21}\x{8B22}' . + '\x{8B23}\x{8B24}\x{8B25}\x{8B26}\x{8B27}\x{8B28}\x{8B2A}\x{8B2B}\x{8B2C}' . + '\x{8B2D}\x{8B2E}\x{8B2F}\x{8B30}\x{8B31}\x{8B33}\x{8B34}\x{8B35}\x{8B36}' . + '\x{8B37}\x{8B39}\x{8B3A}\x{8B3B}\x{8B3C}\x{8B3D}\x{8B3E}\x{8B40}\x{8B41}' . + '\x{8B42}\x{8B43}\x{8B44}\x{8B45}\x{8B46}\x{8B47}\x{8B48}\x{8B49}\x{8B4A}' . + '\x{8B4B}\x{8B4C}\x{8B4D}\x{8B4E}\x{8B4F}\x{8B50}\x{8B51}\x{8B52}\x{8B53}' . + '\x{8B54}\x{8B55}\x{8B56}\x{8B57}\x{8B58}\x{8B59}\x{8B5A}\x{8B5B}\x{8B5C}' . + '\x{8B5D}\x{8B5E}\x{8B5F}\x{8B60}\x{8B63}\x{8B64}\x{8B65}\x{8B66}\x{8B67}' . + '\x{8B68}\x{8B6A}\x{8B6B}\x{8B6C}\x{8B6D}\x{8B6E}\x{8B6F}\x{8B70}\x{8B71}' . + '\x{8B73}\x{8B74}\x{8B76}\x{8B77}\x{8B78}\x{8B79}\x{8B7A}\x{8B7B}\x{8B7D}' . + '\x{8B7E}\x{8B7F}\x{8B80}\x{8B82}\x{8B83}\x{8B84}\x{8B85}\x{8B86}\x{8B88}' . + '\x{8B89}\x{8B8A}\x{8B8B}\x{8B8C}\x{8B8E}\x{8B90}\x{8B91}\x{8B92}\x{8B93}' . + '\x{8B94}\x{8B95}\x{8B96}\x{8B97}\x{8B98}\x{8B99}\x{8B9A}\x{8B9C}\x{8B9D}' . + '\x{8B9E}\x{8B9F}\x{8BA0}\x{8BA1}\x{8BA2}\x{8BA3}\x{8BA4}\x{8BA5}\x{8BA6}' . + '\x{8BA7}\x{8BA8}\x{8BA9}\x{8BAA}\x{8BAB}\x{8BAC}\x{8BAD}\x{8BAE}\x{8BAF}' . + '\x{8BB0}\x{8BB1}\x{8BB2}\x{8BB3}\x{8BB4}\x{8BB5}\x{8BB6}\x{8BB7}\x{8BB8}' . + '\x{8BB9}\x{8BBA}\x{8BBB}\x{8BBC}\x{8BBD}\x{8BBE}\x{8BBF}\x{8BC0}\x{8BC1}' . + '\x{8BC2}\x{8BC3}\x{8BC4}\x{8BC5}\x{8BC6}\x{8BC7}\x{8BC8}\x{8BC9}\x{8BCA}' . + '\x{8BCB}\x{8BCC}\x{8BCD}\x{8BCE}\x{8BCF}\x{8BD0}\x{8BD1}\x{8BD2}\x{8BD3}' . + '\x{8BD4}\x{8BD5}\x{8BD6}\x{8BD7}\x{8BD8}\x{8BD9}\x{8BDA}\x{8BDB}\x{8BDC}' . + '\x{8BDD}\x{8BDE}\x{8BDF}\x{8BE0}\x{8BE1}\x{8BE2}\x{8BE3}\x{8BE4}\x{8BE5}' . + '\x{8BE6}\x{8BE7}\x{8BE8}\x{8BE9}\x{8BEA}\x{8BEB}\x{8BEC}\x{8BED}\x{8BEE}' . + '\x{8BEF}\x{8BF0}\x{8BF1}\x{8BF2}\x{8BF3}\x{8BF4}\x{8BF5}\x{8BF6}\x{8BF7}' . + '\x{8BF8}\x{8BF9}\x{8BFA}\x{8BFB}\x{8BFC}\x{8BFD}\x{8BFE}\x{8BFF}\x{8C00}' . + '\x{8C01}\x{8C02}\x{8C03}\x{8C04}\x{8C05}\x{8C06}\x{8C07}\x{8C08}\x{8C09}' . + '\x{8C0A}\x{8C0B}\x{8C0C}\x{8C0D}\x{8C0E}\x{8C0F}\x{8C10}\x{8C11}\x{8C12}' . + '\x{8C13}\x{8C14}\x{8C15}\x{8C16}\x{8C17}\x{8C18}\x{8C19}\x{8C1A}\x{8C1B}' . + '\x{8C1C}\x{8C1D}\x{8C1E}\x{8C1F}\x{8C20}\x{8C21}\x{8C22}\x{8C23}\x{8C24}' . + '\x{8C25}\x{8C26}\x{8C27}\x{8C28}\x{8C29}\x{8C2A}\x{8C2B}\x{8C2C}\x{8C2D}' . + '\x{8C2E}\x{8C2F}\x{8C30}\x{8C31}\x{8C32}\x{8C33}\x{8C34}\x{8C35}\x{8C36}' . + '\x{8C37}\x{8C39}\x{8C3A}\x{8C3B}\x{8C3C}\x{8C3D}\x{8C3E}\x{8C3F}\x{8C41}' . + '\x{8C42}\x{8C43}\x{8C45}\x{8C46}\x{8C47}\x{8C48}\x{8C49}\x{8C4A}\x{8C4B}' . + '\x{8C4C}\x{8C4D}\x{8C4E}\x{8C4F}\x{8C50}\x{8C54}\x{8C55}\x{8C56}\x{8C57}' . + '\x{8C59}\x{8C5A}\x{8C5B}\x{8C5C}\x{8C5D}\x{8C5E}\x{8C5F}\x{8C60}\x{8C61}' . + '\x{8C62}\x{8C63}\x{8C64}\x{8C65}\x{8C66}\x{8C67}\x{8C68}\x{8C69}\x{8C6A}' . + '\x{8C6B}\x{8C6C}\x{8C6D}\x{8C6E}\x{8C6F}\x{8C70}\x{8C71}\x{8C72}\x{8C73}' . + '\x{8C75}\x{8C76}\x{8C77}\x{8C78}\x{8C79}\x{8C7A}\x{8C7B}\x{8C7D}\x{8C7E}' . + '\x{8C80}\x{8C81}\x{8C82}\x{8C84}\x{8C85}\x{8C86}\x{8C88}\x{8C89}\x{8C8A}' . + '\x{8C8C}\x{8C8D}\x{8C8F}\x{8C90}\x{8C91}\x{8C92}\x{8C93}\x{8C94}\x{8C95}' . + '\x{8C96}\x{8C97}\x{8C98}\x{8C99}\x{8C9A}\x{8C9C}\x{8C9D}\x{8C9E}\x{8C9F}' . + '\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA3}\x{8CA4}\x{8CA5}\x{8CA7}\x{8CA8}\x{8CA9}' . + '\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}\x{8CB1}\x{8CB2}' . + '\x{8CB3}\x{8CB4}\x{8CB5}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CB9}\x{8CBA}\x{8CBB}' . + '\x{8CBC}\x{8CBD}\x{8CBE}\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}' . + '\x{8CC5}\x{8CC6}\x{8CC7}\x{8CC8}\x{8CC9}\x{8CCA}\x{8CCC}\x{8CCE}\x{8CCF}' . + '\x{8CD0}\x{8CD1}\x{8CD2}\x{8CD3}\x{8CD4}\x{8CD5}\x{8CD7}\x{8CD9}\x{8CDA}' . + '\x{8CDB}\x{8CDC}\x{8CDD}\x{8CDE}\x{8CDF}\x{8CE0}\x{8CE1}\x{8CE2}\x{8CE3}' . + '\x{8CE4}\x{8CE5}\x{8CE6}\x{8CE7}\x{8CE8}\x{8CEA}\x{8CEB}\x{8CEC}\x{8CED}' . + '\x{8CEE}\x{8CEF}\x{8CF0}\x{8CF1}\x{8CF2}\x{8CF3}\x{8CF4}\x{8CF5}\x{8CF6}' . + '\x{8CF8}\x{8CF9}\x{8CFA}\x{8CFB}\x{8CFC}\x{8CFD}\x{8CFE}\x{8CFF}\x{8D00}' . + '\x{8D02}\x{8D03}\x{8D04}\x{8D05}\x{8D06}\x{8D07}\x{8D08}\x{8D09}\x{8D0A}' . + '\x{8D0B}\x{8D0C}\x{8D0D}\x{8D0E}\x{8D0F}\x{8D10}\x{8D13}\x{8D14}\x{8D15}' . + '\x{8D16}\x{8D17}\x{8D18}\x{8D19}\x{8D1A}\x{8D1B}\x{8D1C}\x{8D1D}\x{8D1E}' . + '\x{8D1F}\x{8D20}\x{8D21}\x{8D22}\x{8D23}\x{8D24}\x{8D25}\x{8D26}\x{8D27}' . + '\x{8D28}\x{8D29}\x{8D2A}\x{8D2B}\x{8D2C}\x{8D2D}\x{8D2E}\x{8D2F}\x{8D30}' . + '\x{8D31}\x{8D32}\x{8D33}\x{8D34}\x{8D35}\x{8D36}\x{8D37}\x{8D38}\x{8D39}' . + '\x{8D3A}\x{8D3B}\x{8D3C}\x{8D3D}\x{8D3E}\x{8D3F}\x{8D40}\x{8D41}\x{8D42}' . + '\x{8D43}\x{8D44}\x{8D45}\x{8D46}\x{8D47}\x{8D48}\x{8D49}\x{8D4A}\x{8D4B}' . + '\x{8D4C}\x{8D4D}\x{8D4E}\x{8D4F}\x{8D50}\x{8D51}\x{8D52}\x{8D53}\x{8D54}' . + '\x{8D55}\x{8D56}\x{8D57}\x{8D58}\x{8D59}\x{8D5A}\x{8D5B}\x{8D5C}\x{8D5D}' . + '\x{8D5E}\x{8D5F}\x{8D60}\x{8D61}\x{8D62}\x{8D63}\x{8D64}\x{8D65}\x{8D66}' . + '\x{8D67}\x{8D68}\x{8D69}\x{8D6A}\x{8D6B}\x{8D6C}\x{8D6D}\x{8D6E}\x{8D6F}' . + '\x{8D70}\x{8D71}\x{8D72}\x{8D73}\x{8D74}\x{8D75}\x{8D76}\x{8D77}\x{8D78}' . + '\x{8D79}\x{8D7A}\x{8D7B}\x{8D7D}\x{8D7E}\x{8D7F}\x{8D80}\x{8D81}\x{8D82}' . + '\x{8D83}\x{8D84}\x{8D85}\x{8D86}\x{8D87}\x{8D88}\x{8D89}\x{8D8A}\x{8D8B}' . + '\x{8D8C}\x{8D8D}\x{8D8E}\x{8D8F}\x{8D90}\x{8D91}\x{8D92}\x{8D93}\x{8D94}' . + '\x{8D95}\x{8D96}\x{8D97}\x{8D98}\x{8D99}\x{8D9A}\x{8D9B}\x{8D9C}\x{8D9D}' . + '\x{8D9E}\x{8D9F}\x{8DA0}\x{8DA1}\x{8DA2}\x{8DA3}\x{8DA4}\x{8DA5}\x{8DA7}' . + '\x{8DA8}\x{8DA9}\x{8DAA}\x{8DAB}\x{8DAC}\x{8DAD}\x{8DAE}\x{8DAF}\x{8DB0}' . + '\x{8DB1}\x{8DB2}\x{8DB3}\x{8DB4}\x{8DB5}\x{8DB6}\x{8DB7}\x{8DB8}\x{8DB9}' . + '\x{8DBA}\x{8DBB}\x{8DBC}\x{8DBD}\x{8DBE}\x{8DBF}\x{8DC1}\x{8DC2}\x{8DC3}' . + '\x{8DC4}\x{8DC5}\x{8DC6}\x{8DC7}\x{8DC8}\x{8DC9}\x{8DCA}\x{8DCB}\x{8DCC}' . + '\x{8DCD}\x{8DCE}\x{8DCF}\x{8DD0}\x{8DD1}\x{8DD2}\x{8DD3}\x{8DD4}\x{8DD5}' . + '\x{8DD6}\x{8DD7}\x{8DD8}\x{8DD9}\x{8DDA}\x{8DDB}\x{8DDC}\x{8DDD}\x{8DDE}' . + '\x{8DDF}\x{8DE0}\x{8DE1}\x{8DE2}\x{8DE3}\x{8DE4}\x{8DE6}\x{8DE7}\x{8DE8}' . + '\x{8DE9}\x{8DEA}\x{8DEB}\x{8DEC}\x{8DED}\x{8DEE}\x{8DEF}\x{8DF0}\x{8DF1}' . + '\x{8DF2}\x{8DF3}\x{8DF4}\x{8DF5}\x{8DF6}\x{8DF7}\x{8DF8}\x{8DF9}\x{8DFA}' . + '\x{8DFB}\x{8DFC}\x{8DFD}\x{8DFE}\x{8DFF}\x{8E00}\x{8E02}\x{8E03}\x{8E04}' . + '\x{8E05}\x{8E06}\x{8E07}\x{8E08}\x{8E09}\x{8E0A}\x{8E0C}\x{8E0D}\x{8E0E}' . + '\x{8E0F}\x{8E10}\x{8E11}\x{8E12}\x{8E13}\x{8E14}\x{8E15}\x{8E16}\x{8E17}' . + '\x{8E18}\x{8E19}\x{8E1A}\x{8E1B}\x{8E1C}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E20}' . + '\x{8E21}\x{8E22}\x{8E23}\x{8E24}\x{8E25}\x{8E26}\x{8E27}\x{8E28}\x{8E29}' . + '\x{8E2A}\x{8E2B}\x{8E2C}\x{8E2D}\x{8E2E}\x{8E2F}\x{8E30}\x{8E31}\x{8E33}' . + '\x{8E34}\x{8E35}\x{8E36}\x{8E37}\x{8E38}\x{8E39}\x{8E3A}\x{8E3B}\x{8E3C}' . + '\x{8E3D}\x{8E3E}\x{8E3F}\x{8E40}\x{8E41}\x{8E42}\x{8E43}\x{8E44}\x{8E45}' . + '\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4B}\x{8E4C}\x{8E4D}\x{8E4E}\x{8E50}' . + '\x{8E51}\x{8E52}\x{8E53}\x{8E54}\x{8E55}\x{8E56}\x{8E57}\x{8E58}\x{8E59}' . + '\x{8E5A}\x{8E5B}\x{8E5C}\x{8E5D}\x{8E5E}\x{8E5F}\x{8E60}\x{8E61}\x{8E62}' . + '\x{8E63}\x{8E64}\x{8E65}\x{8E66}\x{8E67}\x{8E68}\x{8E69}\x{8E6A}\x{8E6B}' . + '\x{8E6C}\x{8E6D}\x{8E6F}\x{8E70}\x{8E71}\x{8E72}\x{8E73}\x{8E74}\x{8E76}' . + '\x{8E78}\x{8E7A}\x{8E7B}\x{8E7C}\x{8E7D}\x{8E7E}\x{8E7F}\x{8E80}\x{8E81}' . + '\x{8E82}\x{8E83}\x{8E84}\x{8E85}\x{8E86}\x{8E87}\x{8E88}\x{8E89}\x{8E8A}' . + '\x{8E8B}\x{8E8C}\x{8E8D}\x{8E8E}\x{8E8F}\x{8E90}\x{8E91}\x{8E92}\x{8E93}' . + '\x{8E94}\x{8E95}\x{8E96}\x{8E97}\x{8E98}\x{8E9A}\x{8E9C}\x{8E9D}\x{8E9E}' . + '\x{8E9F}\x{8EA0}\x{8EA1}\x{8EA3}\x{8EA4}\x{8EA5}\x{8EA6}\x{8EA7}\x{8EA8}' . + '\x{8EA9}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAD}\x{8EAE}\x{8EAF}\x{8EB0}\x{8EB1}' . + '\x{8EB2}\x{8EB4}\x{8EB5}\x{8EB8}\x{8EB9}\x{8EBA}\x{8EBB}\x{8EBC}\x{8EBD}' . + '\x{8EBE}\x{8EBF}\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}\x{8EC6}\x{8EC7}\x{8EC8}' . + '\x{8EC9}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ECE}\x{8ECF}\x{8ED0}\x{8ED1}' . + '\x{8ED2}\x{8ED3}\x{8ED4}\x{8ED5}\x{8ED6}\x{8ED7}\x{8ED8}\x{8EDA}\x{8EDB}' . + '\x{8EDC}\x{8EDD}\x{8EDE}\x{8EDF}\x{8EE0}\x{8EE1}\x{8EE4}\x{8EE5}\x{8EE6}' . + '\x{8EE7}\x{8EE8}\x{8EE9}\x{8EEA}\x{8EEB}\x{8EEC}\x{8EED}\x{8EEE}\x{8EEF}' . + '\x{8EF1}\x{8EF2}\x{8EF3}\x{8EF4}\x{8EF5}\x{8EF6}\x{8EF7}\x{8EF8}\x{8EF9}' . + '\x{8EFA}\x{8EFB}\x{8EFC}\x{8EFD}\x{8EFE}\x{8EFF}\x{8F00}\x{8F01}\x{8F02}' . + '\x{8F03}\x{8F04}\x{8F05}\x{8F06}\x{8F07}\x{8F08}\x{8F09}\x{8F0A}\x{8F0B}' . + '\x{8F0D}\x{8F0E}\x{8F10}\x{8F11}\x{8F12}\x{8F13}\x{8F14}\x{8F15}\x{8F16}' . + '\x{8F17}\x{8F18}\x{8F1A}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1E}\x{8F1F}\x{8F20}' . + '\x{8F21}\x{8F22}\x{8F23}\x{8F24}\x{8F25}\x{8F26}\x{8F27}\x{8F28}\x{8F29}' . + '\x{8F2A}\x{8F2B}\x{8F2C}\x{8F2E}\x{8F2F}\x{8F30}\x{8F31}\x{8F32}\x{8F33}' . + '\x{8F34}\x{8F35}\x{8F36}\x{8F37}\x{8F38}\x{8F39}\x{8F3B}\x{8F3C}\x{8F3D}' . + '\x{8F3E}\x{8F3F}\x{8F40}\x{8F42}\x{8F43}\x{8F44}\x{8F45}\x{8F46}\x{8F47}' . + '\x{8F48}\x{8F49}\x{8F4A}\x{8F4B}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F4F}\x{8F50}' . + '\x{8F51}\x{8F52}\x{8F53}\x{8F54}\x{8F55}\x{8F56}\x{8F57}\x{8F58}\x{8F59}' . + '\x{8F5A}\x{8F5B}\x{8F5D}\x{8F5E}\x{8F5F}\x{8F60}\x{8F61}\x{8F62}\x{8F63}' . + '\x{8F64}\x{8F65}\x{8F66}\x{8F67}\x{8F68}\x{8F69}\x{8F6A}\x{8F6B}\x{8F6C}' . + '\x{8F6D}\x{8F6E}\x{8F6F}\x{8F70}\x{8F71}\x{8F72}\x{8F73}\x{8F74}\x{8F75}' . + '\x{8F76}\x{8F77}\x{8F78}\x{8F79}\x{8F7A}\x{8F7B}\x{8F7C}\x{8F7D}\x{8F7E}' . + '\x{8F7F}\x{8F80}\x{8F81}\x{8F82}\x{8F83}\x{8F84}\x{8F85}\x{8F86}\x{8F87}' . + '\x{8F88}\x{8F89}\x{8F8A}\x{8F8B}\x{8F8C}\x{8F8D}\x{8F8E}\x{8F8F}\x{8F90}' . + '\x{8F91}\x{8F92}\x{8F93}\x{8F94}\x{8F95}\x{8F96}\x{8F97}\x{8F98}\x{8F99}' . + '\x{8F9A}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA0}\x{8FA1}\x{8FA2}\x{8FA3}' . + '\x{8FA5}\x{8FA6}\x{8FA7}\x{8FA8}\x{8FA9}\x{8FAA}\x{8FAB}\x{8FAC}\x{8FAD}' . + '\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB4}\x{8FB5}\x{8FB6}\x{8FB7}' . + '\x{8FB8}\x{8FB9}\x{8FBB}\x{8FBC}\x{8FBD}\x{8FBE}\x{8FBF}\x{8FC0}\x{8FC1}' . + '\x{8FC2}\x{8FC4}\x{8FC5}\x{8FC6}\x{8FC7}\x{8FC8}\x{8FC9}\x{8FCB}\x{8FCC}' . + '\x{8FCD}\x{8FCE}\x{8FCF}\x{8FD0}\x{8FD1}\x{8FD2}\x{8FD3}\x{8FD4}\x{8FD5}' . + '\x{8FD6}\x{8FD7}\x{8FD8}\x{8FD9}\x{8FDA}\x{8FDB}\x{8FDC}\x{8FDD}\x{8FDE}' . + '\x{8FDF}\x{8FE0}\x{8FE1}\x{8FE2}\x{8FE3}\x{8FE4}\x{8FE5}\x{8FE6}\x{8FE8}' . + '\x{8FE9}\x{8FEA}\x{8FEB}\x{8FEC}\x{8FED}\x{8FEE}\x{8FEF}\x{8FF0}\x{8FF1}' . + '\x{8FF2}\x{8FF3}\x{8FF4}\x{8FF5}\x{8FF6}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}' . + '\x{8FFB}\x{8FFC}\x{8FFD}\x{8FFE}\x{8FFF}\x{9000}\x{9001}\x{9002}\x{9003}' . + '\x{9004}\x{9005}\x{9006}\x{9007}\x{9008}\x{9009}\x{900A}\x{900B}\x{900C}' . + '\x{900D}\x{900F}\x{9010}\x{9011}\x{9012}\x{9013}\x{9014}\x{9015}\x{9016}' . + '\x{9017}\x{9018}\x{9019}\x{901A}\x{901B}\x{901C}\x{901D}\x{901E}\x{901F}' . + '\x{9020}\x{9021}\x{9022}\x{9023}\x{9024}\x{9025}\x{9026}\x{9027}\x{9028}' . + '\x{9029}\x{902B}\x{902D}\x{902E}\x{902F}\x{9030}\x{9031}\x{9032}\x{9033}' . + '\x{9034}\x{9035}\x{9036}\x{9038}\x{903A}\x{903B}\x{903C}\x{903D}\x{903E}' . + '\x{903F}\x{9041}\x{9042}\x{9043}\x{9044}\x{9045}\x{9047}\x{9048}\x{9049}' . + '\x{904A}\x{904B}\x{904C}\x{904D}\x{904E}\x{904F}\x{9050}\x{9051}\x{9052}' . + '\x{9053}\x{9054}\x{9055}\x{9056}\x{9057}\x{9058}\x{9059}\x{905A}\x{905B}' . + '\x{905C}\x{905D}\x{905E}\x{905F}\x{9060}\x{9061}\x{9062}\x{9063}\x{9064}' . + '\x{9065}\x{9066}\x{9067}\x{9068}\x{9069}\x{906A}\x{906B}\x{906C}\x{906D}' . + '\x{906E}\x{906F}\x{9070}\x{9071}\x{9072}\x{9073}\x{9074}\x{9075}\x{9076}' . + '\x{9077}\x{9078}\x{9079}\x{907A}\x{907B}\x{907C}\x{907D}\x{907E}\x{907F}' . + '\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9085}\x{9086}\x{9087}\x{9088}' . + '\x{9089}\x{908A}\x{908B}\x{908C}\x{908D}\x{908E}\x{908F}\x{9090}\x{9091}' . + '\x{9092}\x{9093}\x{9094}\x{9095}\x{9096}\x{9097}\x{9098}\x{9099}\x{909A}' . + '\x{909B}\x{909C}\x{909D}\x{909E}\x{909F}\x{90A0}\x{90A1}\x{90A2}\x{90A3}' . + '\x{90A4}\x{90A5}\x{90A6}\x{90A7}\x{90A8}\x{90A9}\x{90AA}\x{90AC}\x{90AD}' . + '\x{90AE}\x{90AF}\x{90B0}\x{90B1}\x{90B2}\x{90B3}\x{90B4}\x{90B5}\x{90B6}' . + '\x{90B7}\x{90B8}\x{90B9}\x{90BA}\x{90BB}\x{90BC}\x{90BD}\x{90BE}\x{90BF}' . + '\x{90C0}\x{90C1}\x{90C2}\x{90C3}\x{90C4}\x{90C5}\x{90C6}\x{90C7}\x{90C8}' . + '\x{90C9}\x{90CA}\x{90CB}\x{90CE}\x{90CF}\x{90D0}\x{90D1}\x{90D3}\x{90D4}' . + '\x{90D5}\x{90D6}\x{90D7}\x{90D8}\x{90D9}\x{90DA}\x{90DB}\x{90DC}\x{90DD}' . + '\x{90DE}\x{90DF}\x{90E0}\x{90E1}\x{90E2}\x{90E3}\x{90E4}\x{90E5}\x{90E6}' . + '\x{90E7}\x{90E8}\x{90E9}\x{90EA}\x{90EB}\x{90EC}\x{90ED}\x{90EE}\x{90EF}' . + '\x{90F0}\x{90F1}\x{90F2}\x{90F3}\x{90F4}\x{90F5}\x{90F7}\x{90F8}\x{90F9}' . + '\x{90FA}\x{90FB}\x{90FC}\x{90FD}\x{90FE}\x{90FF}\x{9100}\x{9101}\x{9102}' . + '\x{9103}\x{9104}\x{9105}\x{9106}\x{9107}\x{9108}\x{9109}\x{910B}\x{910C}' . + '\x{910D}\x{910E}\x{910F}\x{9110}\x{9111}\x{9112}\x{9113}\x{9114}\x{9115}' . + '\x{9116}\x{9117}\x{9118}\x{9119}\x{911A}\x{911B}\x{911C}\x{911D}\x{911E}' . + '\x{911F}\x{9120}\x{9121}\x{9122}\x{9123}\x{9124}\x{9125}\x{9126}\x{9127}' . + '\x{9128}\x{9129}\x{912A}\x{912B}\x{912C}\x{912D}\x{912E}\x{912F}\x{9130}' . + '\x{9131}\x{9132}\x{9133}\x{9134}\x{9135}\x{9136}\x{9137}\x{9138}\x{9139}' . + '\x{913A}\x{913B}\x{913E}\x{913F}\x{9140}\x{9141}\x{9142}\x{9143}\x{9144}' . + '\x{9145}\x{9146}\x{9147}\x{9148}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}' . + '\x{914E}\x{914F}\x{9150}\x{9151}\x{9152}\x{9153}\x{9154}\x{9155}\x{9156}' . + '\x{9157}\x{9158}\x{915A}\x{915B}\x{915C}\x{915D}\x{915E}\x{915F}\x{9160}' . + '\x{9161}\x{9162}\x{9163}\x{9164}\x{9165}\x{9166}\x{9167}\x{9168}\x{9169}' . + '\x{916A}\x{916B}\x{916C}\x{916D}\x{916E}\x{916F}\x{9170}\x{9171}\x{9172}' . + '\x{9173}\x{9174}\x{9175}\x{9176}\x{9177}\x{9178}\x{9179}\x{917A}\x{917C}' . + '\x{917D}\x{917E}\x{917F}\x{9180}\x{9181}\x{9182}\x{9183}\x{9184}\x{9185}' . + '\x{9186}\x{9187}\x{9188}\x{9189}\x{918A}\x{918B}\x{918C}\x{918D}\x{918E}' . + '\x{918F}\x{9190}\x{9191}\x{9192}\x{9193}\x{9194}\x{9196}\x{9199}\x{919A}' . + '\x{919B}\x{919C}\x{919D}\x{919E}\x{919F}\x{91A0}\x{91A1}\x{91A2}\x{91A3}' . + '\x{91A5}\x{91A6}\x{91A7}\x{91A8}\x{91AA}\x{91AB}\x{91AC}\x{91AD}\x{91AE}' . + '\x{91AF}\x{91B0}\x{91B1}\x{91B2}\x{91B3}\x{91B4}\x{91B5}\x{91B6}\x{91B7}' . + '\x{91B9}\x{91BA}\x{91BB}\x{91BC}\x{91BD}\x{91BE}\x{91C0}\x{91C1}\x{91C2}' . + '\x{91C3}\x{91C5}\x{91C6}\x{91C7}\x{91C9}\x{91CA}\x{91CB}\x{91CC}\x{91CD}' . + '\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D2}\x{91D3}\x{91D4}\x{91D5}\x{91D7}' . + '\x{91D8}\x{91D9}\x{91DA}\x{91DB}\x{91DC}\x{91DD}\x{91DE}\x{91DF}\x{91E2}' . + '\x{91E3}\x{91E4}\x{91E5}\x{91E6}\x{91E7}\x{91E8}\x{91E9}\x{91EA}\x{91EB}' . + '\x{91EC}\x{91ED}\x{91EE}\x{91F0}\x{91F1}\x{91F2}\x{91F3}\x{91F4}\x{91F5}' . + '\x{91F7}\x{91F8}\x{91F9}\x{91FA}\x{91FB}\x{91FD}\x{91FE}\x{91FF}\x{9200}' . + '\x{9201}\x{9202}\x{9203}\x{9204}\x{9205}\x{9206}\x{9207}\x{9208}\x{9209}' . + '\x{920A}\x{920B}\x{920C}\x{920D}\x{920E}\x{920F}\x{9210}\x{9211}\x{9212}' . + '\x{9214}\x{9215}\x{9216}\x{9217}\x{9218}\x{9219}\x{921A}\x{921B}\x{921C}' . + '\x{921D}\x{921E}\x{9220}\x{9221}\x{9223}\x{9224}\x{9225}\x{9226}\x{9227}' . + '\x{9228}\x{9229}\x{922A}\x{922B}\x{922D}\x{922E}\x{922F}\x{9230}\x{9231}' . + '\x{9232}\x{9233}\x{9234}\x{9235}\x{9236}\x{9237}\x{9238}\x{9239}\x{923A}' . + '\x{923B}\x{923C}\x{923D}\x{923E}\x{923F}\x{9240}\x{9241}\x{9242}\x{9245}' . + '\x{9246}\x{9247}\x{9248}\x{9249}\x{924A}\x{924B}\x{924C}\x{924D}\x{924E}' . + '\x{924F}\x{9250}\x{9251}\x{9252}\x{9253}\x{9254}\x{9255}\x{9256}\x{9257}' . + '\x{9258}\x{9259}\x{925A}\x{925B}\x{925C}\x{925D}\x{925E}\x{925F}\x{9260}' . + '\x{9261}\x{9262}\x{9263}\x{9264}\x{9265}\x{9266}\x{9267}\x{9268}\x{926B}' . + '\x{926C}\x{926D}\x{926E}\x{926F}\x{9270}\x{9272}\x{9273}\x{9274}\x{9275}' . + '\x{9276}\x{9277}\x{9278}\x{9279}\x{927A}\x{927B}\x{927C}\x{927D}\x{927E}' . + '\x{927F}\x{9280}\x{9282}\x{9283}\x{9285}\x{9286}\x{9287}\x{9288}\x{9289}' . + '\x{928A}\x{928B}\x{928C}\x{928D}\x{928E}\x{928F}\x{9290}\x{9291}\x{9292}' . + '\x{9293}\x{9294}\x{9295}\x{9296}\x{9297}\x{9298}\x{9299}\x{929A}\x{929B}' . + '\x{929C}\x{929D}\x{929F}\x{92A0}\x{92A1}\x{92A2}\x{92A3}\x{92A4}\x{92A5}' . + '\x{92A6}\x{92A7}\x{92A8}\x{92A9}\x{92AA}\x{92AB}\x{92AC}\x{92AD}\x{92AE}' . + '\x{92AF}\x{92B0}\x{92B1}\x{92B2}\x{92B3}\x{92B4}\x{92B5}\x{92B6}\x{92B7}' . + '\x{92B8}\x{92B9}\x{92BA}\x{92BB}\x{92BC}\x{92BE}\x{92BF}\x{92C0}\x{92C1}' . + '\x{92C2}\x{92C3}\x{92C4}\x{92C5}\x{92C6}\x{92C7}\x{92C8}\x{92C9}\x{92CA}' . + '\x{92CB}\x{92CC}\x{92CD}\x{92CE}\x{92CF}\x{92D0}\x{92D1}\x{92D2}\x{92D3}' . + '\x{92D5}\x{92D6}\x{92D7}\x{92D8}\x{92D9}\x{92DA}\x{92DC}\x{92DD}\x{92DE}' . + '\x{92DF}\x{92E0}\x{92E1}\x{92E3}\x{92E4}\x{92E5}\x{92E6}\x{92E7}\x{92E8}' . + '\x{92E9}\x{92EA}\x{92EB}\x{92EC}\x{92ED}\x{92EE}\x{92EF}\x{92F0}\x{92F1}' . + '\x{92F2}\x{92F3}\x{92F4}\x{92F5}\x{92F6}\x{92F7}\x{92F8}\x{92F9}\x{92FA}' . + '\x{92FB}\x{92FC}\x{92FD}\x{92FE}\x{92FF}\x{9300}\x{9301}\x{9302}\x{9303}' . + '\x{9304}\x{9305}\x{9306}\x{9307}\x{9308}\x{9309}\x{930A}\x{930B}\x{930C}' . + '\x{930D}\x{930E}\x{930F}\x{9310}\x{9311}\x{9312}\x{9313}\x{9314}\x{9315}' . + '\x{9316}\x{9317}\x{9318}\x{9319}\x{931A}\x{931B}\x{931D}\x{931E}\x{931F}' . + '\x{9320}\x{9321}\x{9322}\x{9323}\x{9324}\x{9325}\x{9326}\x{9327}\x{9328}' . + '\x{9329}\x{932A}\x{932B}\x{932D}\x{932E}\x{932F}\x{9332}\x{9333}\x{9334}' . + '\x{9335}\x{9336}\x{9337}\x{9338}\x{9339}\x{933A}\x{933B}\x{933C}\x{933D}' . + '\x{933E}\x{933F}\x{9340}\x{9341}\x{9342}\x{9343}\x{9344}\x{9345}\x{9346}' . + '\x{9347}\x{9348}\x{9349}\x{934A}\x{934B}\x{934C}\x{934D}\x{934E}\x{934F}' . + '\x{9350}\x{9351}\x{9352}\x{9353}\x{9354}\x{9355}\x{9356}\x{9357}\x{9358}' . + '\x{9359}\x{935A}\x{935B}\x{935C}\x{935D}\x{935E}\x{935F}\x{9360}\x{9361}' . + '\x{9363}\x{9364}\x{9365}\x{9366}\x{9367}\x{9369}\x{936A}\x{936C}\x{936D}' . + '\x{936E}\x{9370}\x{9371}\x{9372}\x{9374}\x{9375}\x{9376}\x{9377}\x{9379}' . + '\x{937A}\x{937B}\x{937C}\x{937D}\x{937E}\x{9380}\x{9382}\x{9383}\x{9384}' . + '\x{9385}\x{9386}\x{9387}\x{9388}\x{9389}\x{938A}\x{938C}\x{938D}\x{938E}' . + '\x{938F}\x{9390}\x{9391}\x{9392}\x{9393}\x{9394}\x{9395}\x{9396}\x{9397}' . + '\x{9398}\x{9399}\x{939A}\x{939B}\x{939D}\x{939E}\x{939F}\x{93A1}\x{93A2}' . + '\x{93A3}\x{93A4}\x{93A5}\x{93A6}\x{93A7}\x{93A8}\x{93A9}\x{93AA}\x{93AC}' . + '\x{93AD}\x{93AE}\x{93AF}\x{93B0}\x{93B1}\x{93B2}\x{93B3}\x{93B4}\x{93B5}' . + '\x{93B6}\x{93B7}\x{93B8}\x{93B9}\x{93BA}\x{93BC}\x{93BD}\x{93BE}\x{93BF}' . + '\x{93C0}\x{93C1}\x{93C2}\x{93C3}\x{93C4}\x{93C5}\x{93C6}\x{93C7}\x{93C8}' . + '\x{93C9}\x{93CA}\x{93CB}\x{93CC}\x{93CD}\x{93CE}\x{93CF}\x{93D0}\x{93D1}' . + '\x{93D2}\x{93D3}\x{93D4}\x{93D5}\x{93D6}\x{93D7}\x{93D8}\x{93D9}\x{93DA}' . + '\x{93DB}\x{93DC}\x{93DD}\x{93DE}\x{93DF}\x{93E1}\x{93E2}\x{93E3}\x{93E4}' . + '\x{93E6}\x{93E7}\x{93E8}\x{93E9}\x{93EA}\x{93EB}\x{93EC}\x{93ED}\x{93EE}' . + '\x{93EF}\x{93F0}\x{93F1}\x{93F2}\x{93F4}\x{93F5}\x{93F6}\x{93F7}\x{93F8}' . + '\x{93F9}\x{93FA}\x{93FB}\x{93FC}\x{93FD}\x{93FE}\x{93FF}\x{9400}\x{9401}' . + '\x{9403}\x{9404}\x{9405}\x{9406}\x{9407}\x{9408}\x{9409}\x{940A}\x{940B}' . + '\x{940C}\x{940D}\x{940E}\x{940F}\x{9410}\x{9411}\x{9412}\x{9413}\x{9414}' . + '\x{9415}\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}\x{9422}\x{9423}' . + '\x{9425}\x{9426}\x{9427}\x{9428}\x{9429}\x{942A}\x{942B}\x{942C}\x{942D}' . + '\x{942E}\x{942F}\x{9430}\x{9431}\x{9432}\x{9433}\x{9434}\x{9435}\x{9436}' . + '\x{9437}\x{9438}\x{9439}\x{943A}\x{943B}\x{943C}\x{943D}\x{943E}\x{943F}' . + '\x{9440}\x{9441}\x{9442}\x{9444}\x{9445}\x{9446}\x{9447}\x{9448}\x{9449}' . + '\x{944A}\x{944B}\x{944C}\x{944D}\x{944F}\x{9450}\x{9451}\x{9452}\x{9453}' . + '\x{9454}\x{9455}\x{9456}\x{9457}\x{9458}\x{9459}\x{945B}\x{945C}\x{945D}' . + '\x{945E}\x{945F}\x{9460}\x{9461}\x{9462}\x{9463}\x{9464}\x{9465}\x{9466}' . + '\x{9467}\x{9468}\x{9469}\x{946A}\x{946B}\x{946D}\x{946E}\x{946F}\x{9470}' . + '\x{9471}\x{9472}\x{9473}\x{9474}\x{9475}\x{9476}\x{9477}\x{9478}\x{9479}' . + '\x{947A}\x{947C}\x{947D}\x{947E}\x{947F}\x{9480}\x{9481}\x{9482}\x{9483}' . + '\x{9484}\x{9485}\x{9486}\x{9487}\x{9488}\x{9489}\x{948A}\x{948B}\x{948C}' . + '\x{948D}\x{948E}\x{948F}\x{9490}\x{9491}\x{9492}\x{9493}\x{9494}\x{9495}' . + '\x{9496}\x{9497}\x{9498}\x{9499}\x{949A}\x{949B}\x{949C}\x{949D}\x{949E}' . + '\x{949F}\x{94A0}\x{94A1}\x{94A2}\x{94A3}\x{94A4}\x{94A5}\x{94A6}\x{94A7}' . + '\x{94A8}\x{94A9}\x{94AA}\x{94AB}\x{94AC}\x{94AD}\x{94AE}\x{94AF}\x{94B0}' . + '\x{94B1}\x{94B2}\x{94B3}\x{94B4}\x{94B5}\x{94B6}\x{94B7}\x{94B8}\x{94B9}' . + '\x{94BA}\x{94BB}\x{94BC}\x{94BD}\x{94BE}\x{94BF}\x{94C0}\x{94C1}\x{94C2}' . + '\x{94C3}\x{94C4}\x{94C5}\x{94C6}\x{94C7}\x{94C8}\x{94C9}\x{94CA}\x{94CB}' . + '\x{94CC}\x{94CD}\x{94CE}\x{94CF}\x{94D0}\x{94D1}\x{94D2}\x{94D3}\x{94D4}' . + '\x{94D5}\x{94D6}\x{94D7}\x{94D8}\x{94D9}\x{94DA}\x{94DB}\x{94DC}\x{94DD}' . + '\x{94DE}\x{94DF}\x{94E0}\x{94E1}\x{94E2}\x{94E3}\x{94E4}\x{94E5}\x{94E6}' . + '\x{94E7}\x{94E8}\x{94E9}\x{94EA}\x{94EB}\x{94EC}\x{94ED}\x{94EE}\x{94EF}' . + '\x{94F0}\x{94F1}\x{94F2}\x{94F3}\x{94F4}\x{94F5}\x{94F6}\x{94F7}\x{94F8}' . + '\x{94F9}\x{94FA}\x{94FB}\x{94FC}\x{94FD}\x{94FE}\x{94FF}\x{9500}\x{9501}' . + '\x{9502}\x{9503}\x{9504}\x{9505}\x{9506}\x{9507}\x{9508}\x{9509}\x{950A}' . + '\x{950B}\x{950C}\x{950D}\x{950E}\x{950F}\x{9510}\x{9511}\x{9512}\x{9513}' . + '\x{9514}\x{9515}\x{9516}\x{9517}\x{9518}\x{9519}\x{951A}\x{951B}\x{951C}' . + '\x{951D}\x{951E}\x{951F}\x{9520}\x{9521}\x{9522}\x{9523}\x{9524}\x{9525}' . + '\x{9526}\x{9527}\x{9528}\x{9529}\x{952A}\x{952B}\x{952C}\x{952D}\x{952E}' . + '\x{952F}\x{9530}\x{9531}\x{9532}\x{9533}\x{9534}\x{9535}\x{9536}\x{9537}' . + '\x{9538}\x{9539}\x{953A}\x{953B}\x{953C}\x{953D}\x{953E}\x{953F}\x{9540}' . + '\x{9541}\x{9542}\x{9543}\x{9544}\x{9545}\x{9546}\x{9547}\x{9548}\x{9549}' . + '\x{954A}\x{954B}\x{954C}\x{954D}\x{954E}\x{954F}\x{9550}\x{9551}\x{9552}' . + '\x{9553}\x{9554}\x{9555}\x{9556}\x{9557}\x{9558}\x{9559}\x{955A}\x{955B}' . + '\x{955C}\x{955D}\x{955E}\x{955F}\x{9560}\x{9561}\x{9562}\x{9563}\x{9564}' . + '\x{9565}\x{9566}\x{9567}\x{9568}\x{9569}\x{956A}\x{956B}\x{956C}\x{956D}' . + '\x{956E}\x{956F}\x{9570}\x{9571}\x{9572}\x{9573}\x{9574}\x{9575}\x{9576}' . + '\x{9577}\x{957A}\x{957B}\x{957C}\x{957D}\x{957F}\x{9580}\x{9581}\x{9582}' . + '\x{9583}\x{9584}\x{9586}\x{9587}\x{9588}\x{9589}\x{958A}\x{958B}\x{958C}' . + '\x{958D}\x{958E}\x{958F}\x{9590}\x{9591}\x{9592}\x{9593}\x{9594}\x{9595}' . + '\x{9596}\x{9598}\x{9599}\x{959A}\x{959B}\x{959C}\x{959D}\x{959E}\x{959F}' . + '\x{95A1}\x{95A2}\x{95A3}\x{95A4}\x{95A5}\x{95A6}\x{95A7}\x{95A8}\x{95A9}' . + '\x{95AA}\x{95AB}\x{95AC}\x{95AD}\x{95AE}\x{95AF}\x{95B0}\x{95B1}\x{95B2}' . + '\x{95B5}\x{95B6}\x{95B7}\x{95B9}\x{95BA}\x{95BB}\x{95BC}\x{95BD}\x{95BE}' . + '\x{95BF}\x{95C0}\x{95C2}\x{95C3}\x{95C4}\x{95C5}\x{95C6}\x{95C7}\x{95C8}' . + '\x{95C9}\x{95CA}\x{95CB}\x{95CC}\x{95CD}\x{95CE}\x{95CF}\x{95D0}\x{95D1}' . + '\x{95D2}\x{95D3}\x{95D4}\x{95D5}\x{95D6}\x{95D7}\x{95D8}\x{95DA}\x{95DB}' . + '\x{95DC}\x{95DE}\x{95DF}\x{95E0}\x{95E1}\x{95E2}\x{95E3}\x{95E4}\x{95E5}' . + '\x{95E6}\x{95E7}\x{95E8}\x{95E9}\x{95EA}\x{95EB}\x{95EC}\x{95ED}\x{95EE}' . + '\x{95EF}\x{95F0}\x{95F1}\x{95F2}\x{95F3}\x{95F4}\x{95F5}\x{95F6}\x{95F7}' . + '\x{95F8}\x{95F9}\x{95FA}\x{95FB}\x{95FC}\x{95FD}\x{95FE}\x{95FF}\x{9600}' . + '\x{9601}\x{9602}\x{9603}\x{9604}\x{9605}\x{9606}\x{9607}\x{9608}\x{9609}' . + '\x{960A}\x{960B}\x{960C}\x{960D}\x{960E}\x{960F}\x{9610}\x{9611}\x{9612}' . + '\x{9613}\x{9614}\x{9615}\x{9616}\x{9617}\x{9618}\x{9619}\x{961A}\x{961B}' . + '\x{961C}\x{961D}\x{961E}\x{961F}\x{9620}\x{9621}\x{9622}\x{9623}\x{9624}' . + '\x{9627}\x{9628}\x{962A}\x{962B}\x{962C}\x{962D}\x{962E}\x{962F}\x{9630}' . + '\x{9631}\x{9632}\x{9633}\x{9634}\x{9635}\x{9636}\x{9637}\x{9638}\x{9639}' . + '\x{963A}\x{963B}\x{963C}\x{963D}\x{963F}\x{9640}\x{9641}\x{9642}\x{9643}' . + '\x{9644}\x{9645}\x{9646}\x{9647}\x{9648}\x{9649}\x{964A}\x{964B}\x{964C}' . + '\x{964D}\x{964E}\x{964F}\x{9650}\x{9651}\x{9652}\x{9653}\x{9654}\x{9655}' . + '\x{9658}\x{9659}\x{965A}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9660}' . + '\x{9661}\x{9662}\x{9663}\x{9664}\x{9666}\x{9667}\x{9668}\x{9669}\x{966A}' . + '\x{966B}\x{966C}\x{966D}\x{966E}\x{966F}\x{9670}\x{9671}\x{9672}\x{9673}' . + '\x{9674}\x{9675}\x{9676}\x{9677}\x{9678}\x{967C}\x{967D}\x{967E}\x{9680}' . + '\x{9683}\x{9684}\x{9685}\x{9686}\x{9687}\x{9688}\x{9689}\x{968A}\x{968B}' . + '\x{968D}\x{968E}\x{968F}\x{9690}\x{9691}\x{9692}\x{9693}\x{9694}\x{9695}' . + '\x{9697}\x{9698}\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}\x{96A1}\x{96A2}' . + '\x{96A3}\x{96A4}\x{96A5}\x{96A6}\x{96A7}\x{96A8}\x{96A9}\x{96AA}\x{96AC}' . + '\x{96AD}\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}\x{96B7}\x{96B8}' . + '\x{96B9}\x{96BA}\x{96BB}\x{96BC}\x{96BD}\x{96BE}\x{96BF}\x{96C0}\x{96C1}' . + '\x{96C2}\x{96C3}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C8}\x{96C9}\x{96CA}' . + '\x{96CB}\x{96CC}\x{96CD}\x{96CE}\x{96CF}\x{96D0}\x{96D1}\x{96D2}\x{96D3}' . + '\x{96D4}\x{96D5}\x{96D6}\x{96D7}\x{96D8}\x{96D9}\x{96DA}\x{96DB}\x{96DC}' . + '\x{96DD}\x{96DE}\x{96DF}\x{96E0}\x{96E1}\x{96E2}\x{96E3}\x{96E5}\x{96E8}' . + '\x{96E9}\x{96EA}\x{96EB}\x{96EC}\x{96ED}\x{96EE}\x{96EF}\x{96F0}\x{96F1}' . + '\x{96F2}\x{96F3}\x{96F4}\x{96F5}\x{96F6}\x{96F7}\x{96F8}\x{96F9}\x{96FA}' . + '\x{96FB}\x{96FD}\x{96FE}\x{96FF}\x{9700}\x{9701}\x{9702}\x{9703}\x{9704}' . + '\x{9705}\x{9706}\x{9707}\x{9708}\x{9709}\x{970A}\x{970B}\x{970C}\x{970D}' . + '\x{970E}\x{970F}\x{9710}\x{9711}\x{9712}\x{9713}\x{9715}\x{9716}\x{9718}' . + '\x{9719}\x{971C}\x{971D}\x{971E}\x{971F}\x{9720}\x{9721}\x{9722}\x{9723}' . + '\x{9724}\x{9725}\x{9726}\x{9727}\x{9728}\x{9729}\x{972A}\x{972B}\x{972C}' . + '\x{972D}\x{972E}\x{972F}\x{9730}\x{9731}\x{9732}\x{9735}\x{9736}\x{9738}' . + '\x{9739}\x{973A}\x{973B}\x{973C}\x{973D}\x{973E}\x{973F}\x{9742}\x{9743}' . + '\x{9744}\x{9745}\x{9746}\x{9747}\x{9748}\x{9749}\x{974A}\x{974B}\x{974C}' . + '\x{974E}\x{974F}\x{9750}\x{9751}\x{9752}\x{9753}\x{9754}\x{9755}\x{9756}' . + '\x{9758}\x{9759}\x{975A}\x{975B}\x{975C}\x{975D}\x{975E}\x{975F}\x{9760}' . + '\x{9761}\x{9762}\x{9765}\x{9766}\x{9767}\x{9768}\x{9769}\x{976A}\x{976B}' . + '\x{976C}\x{976D}\x{976E}\x{976F}\x{9770}\x{9772}\x{9773}\x{9774}\x{9776}' . + '\x{9777}\x{9778}\x{9779}\x{977A}\x{977B}\x{977C}\x{977D}\x{977E}\x{977F}' . + '\x{9780}\x{9781}\x{9782}\x{9783}\x{9784}\x{9785}\x{9786}\x{9788}\x{978A}' . + '\x{978B}\x{978C}\x{978D}\x{978E}\x{978F}\x{9790}\x{9791}\x{9792}\x{9793}' . + '\x{9794}\x{9795}\x{9796}\x{9797}\x{9798}\x{9799}\x{979A}\x{979C}\x{979D}' . + '\x{979E}\x{979F}\x{97A0}\x{97A1}\x{97A2}\x{97A3}\x{97A4}\x{97A5}\x{97A6}' . + '\x{97A7}\x{97A8}\x{97AA}\x{97AB}\x{97AC}\x{97AD}\x{97AE}\x{97AF}\x{97B2}' . + '\x{97B3}\x{97B4}\x{97B6}\x{97B7}\x{97B8}\x{97B9}\x{97BA}\x{97BB}\x{97BC}' . + '\x{97BD}\x{97BF}\x{97C1}\x{97C2}\x{97C3}\x{97C4}\x{97C5}\x{97C6}\x{97C7}' . + '\x{97C8}\x{97C9}\x{97CA}\x{97CB}\x{97CC}\x{97CD}\x{97CE}\x{97CF}\x{97D0}' . + '\x{97D1}\x{97D3}\x{97D4}\x{97D5}\x{97D6}\x{97D7}\x{97D8}\x{97D9}\x{97DA}' . + '\x{97DB}\x{97DC}\x{97DD}\x{97DE}\x{97DF}\x{97E0}\x{97E1}\x{97E2}\x{97E3}' . + '\x{97E4}\x{97E5}\x{97E6}\x{97E7}\x{97E8}\x{97E9}\x{97EA}\x{97EB}\x{97EC}' . + '\x{97ED}\x{97EE}\x{97EF}\x{97F0}\x{97F1}\x{97F2}\x{97F3}\x{97F4}\x{97F5}' . + '\x{97F6}\x{97F7}\x{97F8}\x{97F9}\x{97FA}\x{97FB}\x{97FD}\x{97FE}\x{97FF}' . + '\x{9800}\x{9801}\x{9802}\x{9803}\x{9804}\x{9805}\x{9806}\x{9807}\x{9808}' . + '\x{9809}\x{980A}\x{980B}\x{980C}\x{980D}\x{980E}\x{980F}\x{9810}\x{9811}' . + '\x{9812}\x{9813}\x{9814}\x{9815}\x{9816}\x{9817}\x{9818}\x{9819}\x{981A}' . + '\x{981B}\x{981C}\x{981D}\x{981E}\x{9820}\x{9821}\x{9822}\x{9823}\x{9824}' . + '\x{9826}\x{9827}\x{9828}\x{9829}\x{982B}\x{982D}\x{982E}\x{982F}\x{9830}' . + '\x{9831}\x{9832}\x{9834}\x{9835}\x{9836}\x{9837}\x{9838}\x{9839}\x{983B}' . + '\x{983C}\x{983D}\x{983F}\x{9840}\x{9841}\x{9843}\x{9844}\x{9845}\x{9846}' . + '\x{9848}\x{9849}\x{984A}\x{984C}\x{984D}\x{984E}\x{984F}\x{9850}\x{9851}' . + '\x{9852}\x{9853}\x{9854}\x{9855}\x{9857}\x{9858}\x{9859}\x{985A}\x{985B}' . + '\x{985C}\x{985D}\x{985E}\x{985F}\x{9860}\x{9861}\x{9862}\x{9863}\x{9864}' . + '\x{9865}\x{9867}\x{9869}\x{986A}\x{986B}\x{986C}\x{986D}\x{986E}\x{986F}' . + '\x{9870}\x{9871}\x{9872}\x{9873}\x{9874}\x{9875}\x{9876}\x{9877}\x{9878}' . + '\x{9879}\x{987A}\x{987B}\x{987C}\x{987D}\x{987E}\x{987F}\x{9880}\x{9881}' . + '\x{9882}\x{9883}\x{9884}\x{9885}\x{9886}\x{9887}\x{9888}\x{9889}\x{988A}' . + '\x{988B}\x{988C}\x{988D}\x{988E}\x{988F}\x{9890}\x{9891}\x{9892}\x{9893}' . + '\x{9894}\x{9895}\x{9896}\x{9897}\x{9898}\x{9899}\x{989A}\x{989B}\x{989C}' . + '\x{989D}\x{989E}\x{989F}\x{98A0}\x{98A1}\x{98A2}\x{98A3}\x{98A4}\x{98A5}' . + '\x{98A6}\x{98A7}\x{98A8}\x{98A9}\x{98AA}\x{98AB}\x{98AC}\x{98AD}\x{98AE}' . + '\x{98AF}\x{98B0}\x{98B1}\x{98B2}\x{98B3}\x{98B4}\x{98B5}\x{98B6}\x{98B8}' . + '\x{98B9}\x{98BA}\x{98BB}\x{98BC}\x{98BD}\x{98BE}\x{98BF}\x{98C0}\x{98C1}' . + '\x{98C2}\x{98C3}\x{98C4}\x{98C5}\x{98C6}\x{98C8}\x{98C9}\x{98CB}\x{98CC}' . + '\x{98CD}\x{98CE}\x{98CF}\x{98D0}\x{98D1}\x{98D2}\x{98D3}\x{98D4}\x{98D5}' . + '\x{98D6}\x{98D7}\x{98D8}\x{98D9}\x{98DA}\x{98DB}\x{98DC}\x{98DD}\x{98DE}' . + '\x{98DF}\x{98E0}\x{98E2}\x{98E3}\x{98E5}\x{98E6}\x{98E7}\x{98E8}\x{98E9}' . + '\x{98EA}\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}\x{98F3}\x{98F4}\x{98F5}' . + '\x{98F6}\x{98F7}\x{98F9}\x{98FA}\x{98FC}\x{98FD}\x{98FE}\x{98FF}\x{9900}' . + '\x{9901}\x{9902}\x{9903}\x{9904}\x{9905}\x{9906}\x{9907}\x{9908}\x{9909}' . + '\x{990A}\x{990B}\x{990C}\x{990D}\x{990E}\x{990F}\x{9910}\x{9911}\x{9912}' . + '\x{9913}\x{9914}\x{9915}\x{9916}\x{9917}\x{9918}\x{991A}\x{991B}\x{991C}' . + '\x{991D}\x{991E}\x{991F}\x{9920}\x{9921}\x{9922}\x{9923}\x{9924}\x{9925}' . + '\x{9926}\x{9927}\x{9928}\x{9929}\x{992A}\x{992B}\x{992C}\x{992D}\x{992E}' . + '\x{992F}\x{9930}\x{9931}\x{9932}\x{9933}\x{9934}\x{9935}\x{9936}\x{9937}' . + '\x{9938}\x{9939}\x{993A}\x{993C}\x{993D}\x{993E}\x{993F}\x{9940}\x{9941}' . + '\x{9942}\x{9943}\x{9945}\x{9946}\x{9947}\x{9948}\x{9949}\x{994A}\x{994B}' . + '\x{994C}\x{994E}\x{994F}\x{9950}\x{9951}\x{9952}\x{9953}\x{9954}\x{9955}' . + '\x{9956}\x{9957}\x{9958}\x{9959}\x{995B}\x{995C}\x{995E}\x{995F}\x{9960}' . + '\x{9961}\x{9962}\x{9963}\x{9964}\x{9965}\x{9966}\x{9967}\x{9968}\x{9969}' . + '\x{996A}\x{996B}\x{996C}\x{996D}\x{996E}\x{996F}\x{9970}\x{9971}\x{9972}' . + '\x{9973}\x{9974}\x{9975}\x{9976}\x{9977}\x{9978}\x{9979}\x{997A}\x{997B}' . + '\x{997C}\x{997D}\x{997E}\x{997F}\x{9980}\x{9981}\x{9982}\x{9983}\x{9984}' . + '\x{9985}\x{9986}\x{9987}\x{9988}\x{9989}\x{998A}\x{998B}\x{998C}\x{998D}' . + '\x{998E}\x{998F}\x{9990}\x{9991}\x{9992}\x{9993}\x{9994}\x{9995}\x{9996}' . + '\x{9997}\x{9998}\x{9999}\x{999A}\x{999B}\x{999C}\x{999D}\x{999E}\x{999F}' . + '\x{99A0}\x{99A1}\x{99A2}\x{99A3}\x{99A4}\x{99A5}\x{99A6}\x{99A7}\x{99A8}' . + '\x{99A9}\x{99AA}\x{99AB}\x{99AC}\x{99AD}\x{99AE}\x{99AF}\x{99B0}\x{99B1}' . + '\x{99B2}\x{99B3}\x{99B4}\x{99B5}\x{99B6}\x{99B7}\x{99B8}\x{99B9}\x{99BA}' . + '\x{99BB}\x{99BC}\x{99BD}\x{99BE}\x{99C0}\x{99C1}\x{99C2}\x{99C3}\x{99C4}' . + '\x{99C6}\x{99C7}\x{99C8}\x{99C9}\x{99CA}\x{99CB}\x{99CC}\x{99CD}\x{99CE}' . + '\x{99CF}\x{99D0}\x{99D1}\x{99D2}\x{99D3}\x{99D4}\x{99D5}\x{99D6}\x{99D7}' . + '\x{99D8}\x{99D9}\x{99DA}\x{99DB}\x{99DC}\x{99DD}\x{99DE}\x{99DF}\x{99E1}' . + '\x{99E2}\x{99E3}\x{99E4}\x{99E5}\x{99E7}\x{99E8}\x{99E9}\x{99EA}\x{99EC}' . + '\x{99ED}\x{99EE}\x{99EF}\x{99F0}\x{99F1}\x{99F2}\x{99F3}\x{99F4}\x{99F6}' . + '\x{99F7}\x{99F8}\x{99F9}\x{99FA}\x{99FB}\x{99FC}\x{99FD}\x{99FE}\x{99FF}' . + '\x{9A00}\x{9A01}\x{9A02}\x{9A03}\x{9A04}\x{9A05}\x{9A06}\x{9A07}\x{9A08}' . + '\x{9A09}\x{9A0A}\x{9A0B}\x{9A0C}\x{9A0D}\x{9A0E}\x{9A0F}\x{9A11}\x{9A14}' . + '\x{9A15}\x{9A16}\x{9A19}\x{9A1A}\x{9A1B}\x{9A1C}\x{9A1D}\x{9A1E}\x{9A1F}' . + '\x{9A20}\x{9A21}\x{9A22}\x{9A23}\x{9A24}\x{9A25}\x{9A26}\x{9A27}\x{9A29}' . + '\x{9A2A}\x{9A2B}\x{9A2C}\x{9A2D}\x{9A2E}\x{9A2F}\x{9A30}\x{9A31}\x{9A32}' . + '\x{9A33}\x{9A34}\x{9A35}\x{9A36}\x{9A37}\x{9A38}\x{9A39}\x{9A3A}\x{9A3C}' . + '\x{9A3D}\x{9A3E}\x{9A3F}\x{9A40}\x{9A41}\x{9A42}\x{9A43}\x{9A44}\x{9A45}' . + '\x{9A46}\x{9A47}\x{9A48}\x{9A49}\x{9A4A}\x{9A4B}\x{9A4C}\x{9A4D}\x{9A4E}' . + '\x{9A4F}\x{9A50}\x{9A52}\x{9A53}\x{9A54}\x{9A55}\x{9A56}\x{9A57}\x{9A59}' . + '\x{9A5A}\x{9A5B}\x{9A5C}\x{9A5E}\x{9A5F}\x{9A60}\x{9A61}\x{9A62}\x{9A64}' . + '\x{9A65}\x{9A66}\x{9A67}\x{9A68}\x{9A69}\x{9A6A}\x{9A6B}\x{9A6C}\x{9A6D}' . + '\x{9A6E}\x{9A6F}\x{9A70}\x{9A71}\x{9A72}\x{9A73}\x{9A74}\x{9A75}\x{9A76}' . + '\x{9A77}\x{9A78}\x{9A79}\x{9A7A}\x{9A7B}\x{9A7C}\x{9A7D}\x{9A7E}\x{9A7F}' . + '\x{9A80}\x{9A81}\x{9A82}\x{9A83}\x{9A84}\x{9A85}\x{9A86}\x{9A87}\x{9A88}' . + '\x{9A89}\x{9A8A}\x{9A8B}\x{9A8C}\x{9A8D}\x{9A8E}\x{9A8F}\x{9A90}\x{9A91}' . + '\x{9A92}\x{9A93}\x{9A94}\x{9A95}\x{9A96}\x{9A97}\x{9A98}\x{9A99}\x{9A9A}' . + '\x{9A9B}\x{9A9C}\x{9A9D}\x{9A9E}\x{9A9F}\x{9AA0}\x{9AA1}\x{9AA2}\x{9AA3}' . + '\x{9AA4}\x{9AA5}\x{9AA6}\x{9AA7}\x{9AA8}\x{9AAA}\x{9AAB}\x{9AAC}\x{9AAD}' . + '\x{9AAE}\x{9AAF}\x{9AB0}\x{9AB1}\x{9AB2}\x{9AB3}\x{9AB4}\x{9AB5}\x{9AB6}' . + '\x{9AB7}\x{9AB8}\x{9AB9}\x{9ABA}\x{9ABB}\x{9ABC}\x{9ABE}\x{9ABF}\x{9AC0}' . + '\x{9AC1}\x{9AC2}\x{9AC3}\x{9AC4}\x{9AC5}\x{9AC6}\x{9AC7}\x{9AC9}\x{9ACA}' . + '\x{9ACB}\x{9ACC}\x{9ACD}\x{9ACE}\x{9ACF}\x{9AD0}\x{9AD1}\x{9AD2}\x{9AD3}' . + '\x{9AD4}\x{9AD5}\x{9AD6}\x{9AD8}\x{9AD9}\x{9ADA}\x{9ADB}\x{9ADC}\x{9ADD}' . + '\x{9ADE}\x{9ADF}\x{9AE1}\x{9AE2}\x{9AE3}\x{9AE5}\x{9AE6}\x{9AE7}\x{9AEA}' . + '\x{9AEB}\x{9AEC}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF2}\x{9AF3}\x{9AF4}' . + '\x{9AF5}\x{9AF6}\x{9AF7}\x{9AF8}\x{9AF9}\x{9AFA}\x{9AFB}\x{9AFC}\x{9AFD}' . + '\x{9AFE}\x{9AFF}\x{9B01}\x{9B03}\x{9B04}\x{9B05}\x{9B06}\x{9B07}\x{9B08}' . + '\x{9B0A}\x{9B0B}\x{9B0C}\x{9B0D}\x{9B0E}\x{9B0F}\x{9B10}\x{9B11}\x{9B12}' . + '\x{9B13}\x{9B15}\x{9B16}\x{9B17}\x{9B18}\x{9B19}\x{9B1A}\x{9B1C}\x{9B1D}' . + '\x{9B1E}\x{9B1F}\x{9B20}\x{9B21}\x{9B22}\x{9B23}\x{9B24}\x{9B25}\x{9B26}' . + '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2B}\x{9B2C}\x{9B2D}\x{9B2E}\x{9B2F}' . + '\x{9B30}\x{9B31}\x{9B32}\x{9B33}\x{9B35}\x{9B36}\x{9B37}\x{9B38}\x{9B39}' . + '\x{9B3A}\x{9B3B}\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}\x{9B42}\x{9B43}\x{9B44}' . + '\x{9B45}\x{9B46}\x{9B47}\x{9B48}\x{9B49}\x{9B4A}\x{9B4B}\x{9B4C}\x{9B4D}' . + '\x{9B4E}\x{9B4F}\x{9B51}\x{9B52}\x{9B53}\x{9B54}\x{9B55}\x{9B56}\x{9B58}' . + '\x{9B59}\x{9B5A}\x{9B5B}\x{9B5C}\x{9B5D}\x{9B5E}\x{9B5F}\x{9B60}\x{9B61}' . + '\x{9B63}\x{9B64}\x{9B65}\x{9B66}\x{9B67}\x{9B68}\x{9B69}\x{9B6A}\x{9B6B}' . + '\x{9B6C}\x{9B6D}\x{9B6E}\x{9B6F}\x{9B70}\x{9B71}\x{9B73}\x{9B74}\x{9B75}' . + '\x{9B76}\x{9B77}\x{9B78}\x{9B79}\x{9B7A}\x{9B7B}\x{9B7C}\x{9B7D}\x{9B7E}' . + '\x{9B7F}\x{9B80}\x{9B81}\x{9B82}\x{9B83}\x{9B84}\x{9B85}\x{9B86}\x{9B87}' . + '\x{9B88}\x{9B8A}\x{9B8B}\x{9B8D}\x{9B8E}\x{9B8F}\x{9B90}\x{9B91}\x{9B92}' . + '\x{9B93}\x{9B94}\x{9B95}\x{9B96}\x{9B97}\x{9B98}\x{9B9A}\x{9B9B}\x{9B9C}' . + '\x{9B9D}\x{9B9E}\x{9B9F}\x{9BA0}\x{9BA1}\x{9BA2}\x{9BA3}\x{9BA4}\x{9BA5}' . + '\x{9BA6}\x{9BA7}\x{9BA8}\x{9BA9}\x{9BAA}\x{9BAB}\x{9BAC}\x{9BAD}\x{9BAE}' . + '\x{9BAF}\x{9BB0}\x{9BB1}\x{9BB2}\x{9BB3}\x{9BB4}\x{9BB5}\x{9BB6}\x{9BB7}' . + '\x{9BB8}\x{9BB9}\x{9BBA}\x{9BBB}\x{9BBC}\x{9BBD}\x{9BBE}\x{9BBF}\x{9BC0}' . + '\x{9BC1}\x{9BC3}\x{9BC4}\x{9BC5}\x{9BC6}\x{9BC7}\x{9BC8}\x{9BC9}\x{9BCA}' . + '\x{9BCB}\x{9BCC}\x{9BCD}\x{9BCE}\x{9BCF}\x{9BD0}\x{9BD1}\x{9BD2}\x{9BD3}' . + '\x{9BD4}\x{9BD5}\x{9BD6}\x{9BD7}\x{9BD8}\x{9BD9}\x{9BDA}\x{9BDB}\x{9BDC}' . + '\x{9BDD}\x{9BDE}\x{9BDF}\x{9BE0}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}\x{9BE5}' . + '\x{9BE6}\x{9BE7}\x{9BE8}\x{9BE9}\x{9BEA}\x{9BEB}\x{9BEC}\x{9BED}\x{9BEE}' . + '\x{9BEF}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF3}\x{9BF4}\x{9BF5}\x{9BF7}\x{9BF8}' . + '\x{9BF9}\x{9BFA}\x{9BFB}\x{9BFC}\x{9BFD}\x{9BFE}\x{9BFF}\x{9C02}\x{9C05}' . + '\x{9C06}\x{9C07}\x{9C08}\x{9C09}\x{9C0A}\x{9C0B}\x{9C0C}\x{9C0D}\x{9C0E}' . + '\x{9C0F}\x{9C10}\x{9C11}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C16}\x{9C17}' . + '\x{9C18}\x{9C19}\x{9C1A}\x{9C1B}\x{9C1C}\x{9C1D}\x{9C1E}\x{9C1F}\x{9C20}' . + '\x{9C21}\x{9C22}\x{9C23}\x{9C24}\x{9C25}\x{9C26}\x{9C27}\x{9C28}\x{9C29}' . + '\x{9C2A}\x{9C2B}\x{9C2C}\x{9C2D}\x{9C2F}\x{9C30}\x{9C31}\x{9C32}\x{9C33}' . + '\x{9C34}\x{9C35}\x{9C36}\x{9C37}\x{9C38}\x{9C39}\x{9C3A}\x{9C3B}\x{9C3C}' . + '\x{9C3D}\x{9C3E}\x{9C3F}\x{9C40}\x{9C41}\x{9C43}\x{9C44}\x{9C45}\x{9C46}' . + '\x{9C47}\x{9C48}\x{9C49}\x{9C4A}\x{9C4B}\x{9C4C}\x{9C4D}\x{9C4E}\x{9C50}' . + '\x{9C52}\x{9C53}\x{9C54}\x{9C55}\x{9C56}\x{9C57}\x{9C58}\x{9C59}\x{9C5A}' . + '\x{9C5B}\x{9C5C}\x{9C5D}\x{9C5E}\x{9C5F}\x{9C60}\x{9C62}\x{9C63}\x{9C65}' . + '\x{9C66}\x{9C67}\x{9C68}\x{9C69}\x{9C6A}\x{9C6B}\x{9C6C}\x{9C6D}\x{9C6E}' . + '\x{9C6F}\x{9C70}\x{9C71}\x{9C72}\x{9C73}\x{9C74}\x{9C75}\x{9C77}\x{9C78}' . + '\x{9C79}\x{9C7A}\x{9C7C}\x{9C7D}\x{9C7E}\x{9C7F}\x{9C80}\x{9C81}\x{9C82}' . + '\x{9C83}\x{9C84}\x{9C85}\x{9C86}\x{9C87}\x{9C88}\x{9C89}\x{9C8A}\x{9C8B}' . + '\x{9C8C}\x{9C8D}\x{9C8E}\x{9C8F}\x{9C90}\x{9C91}\x{9C92}\x{9C93}\x{9C94}' . + '\x{9C95}\x{9C96}\x{9C97}\x{9C98}\x{9C99}\x{9C9A}\x{9C9B}\x{9C9C}\x{9C9D}' . + '\x{9C9E}\x{9C9F}\x{9CA0}\x{9CA1}\x{9CA2}\x{9CA3}\x{9CA4}\x{9CA5}\x{9CA6}' . + '\x{9CA7}\x{9CA8}\x{9CA9}\x{9CAA}\x{9CAB}\x{9CAC}\x{9CAD}\x{9CAE}\x{9CAF}' . + '\x{9CB0}\x{9CB1}\x{9CB2}\x{9CB3}\x{9CB4}\x{9CB5}\x{9CB6}\x{9CB7}\x{9CB8}' . + '\x{9CB9}\x{9CBA}\x{9CBB}\x{9CBC}\x{9CBD}\x{9CBE}\x{9CBF}\x{9CC0}\x{9CC1}' . + '\x{9CC2}\x{9CC3}\x{9CC4}\x{9CC5}\x{9CC6}\x{9CC7}\x{9CC8}\x{9CC9}\x{9CCA}' . + '\x{9CCB}\x{9CCC}\x{9CCD}\x{9CCE}\x{9CCF}\x{9CD0}\x{9CD1}\x{9CD2}\x{9CD3}' . + '\x{9CD4}\x{9CD5}\x{9CD6}\x{9CD7}\x{9CD8}\x{9CD9}\x{9CDA}\x{9CDB}\x{9CDC}' . + '\x{9CDD}\x{9CDE}\x{9CDF}\x{9CE0}\x{9CE1}\x{9CE2}\x{9CE3}\x{9CE4}\x{9CE5}' . + '\x{9CE6}\x{9CE7}\x{9CE8}\x{9CE9}\x{9CEA}\x{9CEB}\x{9CEC}\x{9CED}\x{9CEE}' . + '\x{9CEF}\x{9CF0}\x{9CF1}\x{9CF2}\x{9CF3}\x{9CF4}\x{9CF5}\x{9CF6}\x{9CF7}' . + '\x{9CF8}\x{9CF9}\x{9CFA}\x{9CFB}\x{9CFC}\x{9CFD}\x{9CFE}\x{9CFF}\x{9D00}' . + '\x{9D01}\x{9D02}\x{9D03}\x{9D04}\x{9D05}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . + '\x{9D0A}\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}\x{9D13}\x{9D14}\x{9D15}\x{9D16}' . + '\x{9D17}\x{9D18}\x{9D19}\x{9D1A}\x{9D1B}\x{9D1C}\x{9D1D}\x{9D1E}\x{9D1F}' . + '\x{9D20}\x{9D21}\x{9D22}\x{9D23}\x{9D24}\x{9D25}\x{9D26}\x{9D28}\x{9D29}' . + '\x{9D2B}\x{9D2D}\x{9D2E}\x{9D2F}\x{9D30}\x{9D31}\x{9D32}\x{9D33}\x{9D34}' . + '\x{9D36}\x{9D37}\x{9D38}\x{9D39}\x{9D3A}\x{9D3B}\x{9D3D}\x{9D3E}\x{9D3F}' . + '\x{9D40}\x{9D41}\x{9D42}\x{9D43}\x{9D45}\x{9D46}\x{9D47}\x{9D48}\x{9D49}' . + '\x{9D4A}\x{9D4B}\x{9D4C}\x{9D4D}\x{9D4E}\x{9D4F}\x{9D50}\x{9D51}\x{9D52}' . + '\x{9D53}\x{9D54}\x{9D55}\x{9D56}\x{9D57}\x{9D58}\x{9D59}\x{9D5A}\x{9D5B}' . + '\x{9D5C}\x{9D5D}\x{9D5E}\x{9D5F}\x{9D60}\x{9D61}\x{9D62}\x{9D63}\x{9D64}' . + '\x{9D65}\x{9D66}\x{9D67}\x{9D68}\x{9D69}\x{9D6A}\x{9D6B}\x{9D6C}\x{9D6E}' . + '\x{9D6F}\x{9D70}\x{9D71}\x{9D72}\x{9D73}\x{9D74}\x{9D75}\x{9D76}\x{9D77}' . + '\x{9D78}\x{9D79}\x{9D7A}\x{9D7B}\x{9D7C}\x{9D7D}\x{9D7E}\x{9D7F}\x{9D80}' . + '\x{9D81}\x{9D82}\x{9D83}\x{9D84}\x{9D85}\x{9D86}\x{9D87}\x{9D88}\x{9D89}' . + '\x{9D8A}\x{9D8B}\x{9D8C}\x{9D8D}\x{9D8E}\x{9D90}\x{9D91}\x{9D92}\x{9D93}' . + '\x{9D94}\x{9D96}\x{9D97}\x{9D98}\x{9D99}\x{9D9A}\x{9D9B}\x{9D9C}\x{9D9D}' . + '\x{9D9E}\x{9D9F}\x{9DA0}\x{9DA1}\x{9DA2}\x{9DA3}\x{9DA4}\x{9DA5}\x{9DA6}' . + '\x{9DA7}\x{9DA8}\x{9DA9}\x{9DAA}\x{9DAB}\x{9DAC}\x{9DAD}\x{9DAF}\x{9DB0}' . + '\x{9DB1}\x{9DB2}\x{9DB3}\x{9DB4}\x{9DB5}\x{9DB6}\x{9DB7}\x{9DB8}\x{9DB9}' . + '\x{9DBA}\x{9DBB}\x{9DBC}\x{9DBE}\x{9DBF}\x{9DC1}\x{9DC2}\x{9DC3}\x{9DC4}' . + '\x{9DC5}\x{9DC7}\x{9DC8}\x{9DC9}\x{9DCA}\x{9DCB}\x{9DCC}\x{9DCD}\x{9DCE}' . + '\x{9DCF}\x{9DD0}\x{9DD1}\x{9DD2}\x{9DD3}\x{9DD4}\x{9DD5}\x{9DD6}\x{9DD7}' . + '\x{9DD8}\x{9DD9}\x{9DDA}\x{9DDB}\x{9DDC}\x{9DDD}\x{9DDE}\x{9DDF}\x{9DE0}' . + '\x{9DE1}\x{9DE2}\x{9DE3}\x{9DE4}\x{9DE5}\x{9DE6}\x{9DE7}\x{9DE8}\x{9DE9}' . + '\x{9DEB}\x{9DEC}\x{9DED}\x{9DEE}\x{9DEF}\x{9DF0}\x{9DF1}\x{9DF2}\x{9DF3}' . + '\x{9DF4}\x{9DF5}\x{9DF6}\x{9DF7}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFB}\x{9DFD}' . + '\x{9DFE}\x{9DFF}\x{9E00}\x{9E01}\x{9E02}\x{9E03}\x{9E04}\x{9E05}\x{9E06}' . + '\x{9E07}\x{9E08}\x{9E09}\x{9E0A}\x{9E0B}\x{9E0C}\x{9E0D}\x{9E0F}\x{9E10}' . + '\x{9E11}\x{9E12}\x{9E13}\x{9E14}\x{9E15}\x{9E17}\x{9E18}\x{9E19}\x{9E1A}' . + '\x{9E1B}\x{9E1D}\x{9E1E}\x{9E1F}\x{9E20}\x{9E21}\x{9E22}\x{9E23}\x{9E24}' . + '\x{9E25}\x{9E26}\x{9E27}\x{9E28}\x{9E29}\x{9E2A}\x{9E2B}\x{9E2C}\x{9E2D}' . + '\x{9E2E}\x{9E2F}\x{9E30}\x{9E31}\x{9E32}\x{9E33}\x{9E34}\x{9E35}\x{9E36}' . + '\x{9E37}\x{9E38}\x{9E39}\x{9E3A}\x{9E3B}\x{9E3C}\x{9E3D}\x{9E3E}\x{9E3F}' . + '\x{9E40}\x{9E41}\x{9E42}\x{9E43}\x{9E44}\x{9E45}\x{9E46}\x{9E47}\x{9E48}' . + '\x{9E49}\x{9E4A}\x{9E4B}\x{9E4C}\x{9E4D}\x{9E4E}\x{9E4F}\x{9E50}\x{9E51}' . + '\x{9E52}\x{9E53}\x{9E54}\x{9E55}\x{9E56}\x{9E57}\x{9E58}\x{9E59}\x{9E5A}' . + '\x{9E5B}\x{9E5C}\x{9E5D}\x{9E5E}\x{9E5F}\x{9E60}\x{9E61}\x{9E62}\x{9E63}' . + '\x{9E64}\x{9E65}\x{9E66}\x{9E67}\x{9E68}\x{9E69}\x{9E6A}\x{9E6B}\x{9E6C}' . + '\x{9E6D}\x{9E6E}\x{9E6F}\x{9E70}\x{9E71}\x{9E72}\x{9E73}\x{9E74}\x{9E75}' . + '\x{9E76}\x{9E77}\x{9E79}\x{9E7A}\x{9E7C}\x{9E7D}\x{9E7E}\x{9E7F}\x{9E80}' . + '\x{9E81}\x{9E82}\x{9E83}\x{9E84}\x{9E85}\x{9E86}\x{9E87}\x{9E88}\x{9E89}' . + '\x{9E8A}\x{9E8B}\x{9E8C}\x{9E8D}\x{9E8E}\x{9E91}\x{9E92}\x{9E93}\x{9E94}' . + '\x{9E96}\x{9E97}\x{9E99}\x{9E9A}\x{9E9B}\x{9E9C}\x{9E9D}\x{9E9F}\x{9EA0}' . + '\x{9EA1}\x{9EA3}\x{9EA4}\x{9EA5}\x{9EA6}\x{9EA7}\x{9EA8}\x{9EA9}\x{9EAA}' . + '\x{9EAD}\x{9EAE}\x{9EAF}\x{9EB0}\x{9EB2}\x{9EB3}\x{9EB4}\x{9EB5}\x{9EB6}' . + '\x{9EB7}\x{9EB8}\x{9EBB}\x{9EBC}\x{9EBD}\x{9EBE}\x{9EBF}\x{9EC0}\x{9EC1}' . + '\x{9EC2}\x{9EC3}\x{9EC4}\x{9EC5}\x{9EC6}\x{9EC7}\x{9EC8}\x{9EC9}\x{9ECA}' . + '\x{9ECB}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED1}\x{9ED2}\x{9ED3}' . + '\x{9ED4}\x{9ED5}\x{9ED6}\x{9ED7}\x{9ED8}\x{9ED9}\x{9EDA}\x{9EDB}\x{9EDC}' . + '\x{9EDD}\x{9EDE}\x{9EDF}\x{9EE0}\x{9EE1}\x{9EE2}\x{9EE3}\x{9EE4}\x{9EE5}' . + '\x{9EE6}\x{9EE7}\x{9EE8}\x{9EE9}\x{9EEA}\x{9EEB}\x{9EED}\x{9EEE}\x{9EEF}' . + '\x{9EF0}\x{9EF2}\x{9EF3}\x{9EF4}\x{9EF5}\x{9EF6}\x{9EF7}\x{9EF8}\x{9EF9}' . + '\x{9EFA}\x{9EFB}\x{9EFC}\x{9EFD}\x{9EFE}\x{9EFF}\x{9F00}\x{9F01}\x{9F02}' . + '\x{9F04}\x{9F05}\x{9F06}\x{9F07}\x{9F08}\x{9F09}\x{9F0A}\x{9F0B}\x{9F0C}' . + '\x{9F0D}\x{9F0E}\x{9F0F}\x{9F10}\x{9F12}\x{9F13}\x{9F15}\x{9F16}\x{9F17}' . + '\x{9F18}\x{9F19}\x{9F1A}\x{9F1B}\x{9F1C}\x{9F1D}\x{9F1E}\x{9F1F}\x{9F20}' . + '\x{9F22}\x{9F23}\x{9F24}\x{9F25}\x{9F27}\x{9F28}\x{9F29}\x{9F2A}\x{9F2B}' . + '\x{9F2C}\x{9F2D}\x{9F2E}\x{9F2F}\x{9F30}\x{9F31}\x{9F32}\x{9F33}\x{9F34}' . + '\x{9F35}\x{9F36}\x{9F37}\x{9F38}\x{9F39}\x{9F3A}\x{9F3B}\x{9F3C}\x{9F3D}' . + '\x{9F3E}\x{9F3F}\x{9F40}\x{9F41}\x{9F42}\x{9F43}\x{9F44}\x{9F46}\x{9F47}' . + '\x{9F48}\x{9F49}\x{9F4A}\x{9F4B}\x{9F4C}\x{9F4D}\x{9F4E}\x{9F4F}\x{9F50}' . + '\x{9F51}\x{9F52}\x{9F54}\x{9F55}\x{9F56}\x{9F57}\x{9F58}\x{9F59}\x{9F5A}' . + '\x{9F5B}\x{9F5C}\x{9F5D}\x{9F5E}\x{9F5F}\x{9F60}\x{9F61}\x{9F63}\x{9F64}' . + '\x{9F65}\x{9F66}\x{9F67}\x{9F68}\x{9F69}\x{9F6A}\x{9F6B}\x{9F6C}\x{9F6E}' . + '\x{9F6F}\x{9F70}\x{9F71}\x{9F72}\x{9F73}\x{9F74}\x{9F75}\x{9F76}\x{9F77}' . + '\x{9F78}\x{9F79}\x{9F7A}\x{9F7B}\x{9F7C}\x{9F7D}\x{9F7E}\x{9F7F}\x{9F80}' . + '\x{9F81}\x{9F82}\x{9F83}\x{9F84}\x{9F85}\x{9F86}\x{9F87}\x{9F88}\x{9F89}' . + '\x{9F8A}\x{9F8B}\x{9F8C}\x{9F8D}\x{9F8E}\x{9F8F}\x{9F90}\x{9F91}\x{9F92}' . + '\x{9F93}\x{9F94}\x{9F95}\x{9F96}\x{9F97}\x{9F98}\x{9F99}\x{9F9A}\x{9F9B}' . + '\x{9F9C}\x{9F9D}\x{9F9E}\x{9F9F}\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu', +); diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Cn.php b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Cn.php new file mode 100644 index 0000000000..2a6418555f --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Cn.php @@ -0,0 +1,2185 @@ + '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' . + '\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}' . + '\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}' . + '\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}' . + '\x{49B6}\x{49B7}\x{4C77}\x{4C9F}\x{4CA0}\x{4CA1}\x{4CA2}\x{4CA3}\x{4D13}' . + '\x{4D14}\x{4D15}\x{4D16}\x{4D17}\x{4D18}\x{4D19}\x{4DAE}\x{4E00}\x{4E01}' . + '\x{4E02}\x{4E03}\x{4E04}\x{4E05}\x{4E06}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . + '\x{4E0B}\x{4E0C}\x{4E0D}\x{4E0E}\x{4E0F}\x{4E10}\x{4E11}\x{4E13}\x{4E14}' . + '\x{4E15}\x{4E16}\x{4E17}\x{4E18}\x{4E19}\x{4E1A}\x{4E1B}\x{4E1C}\x{4E1D}' . + '\x{4E1E}\x{4E1F}\x{4E20}\x{4E21}\x{4E22}\x{4E23}\x{4E24}\x{4E25}\x{4E26}' . + '\x{4E27}\x{4E28}\x{4E2A}\x{4E2B}\x{4E2C}\x{4E2D}\x{4E2E}\x{4E2F}\x{4E30}' . + '\x{4E31}\x{4E32}\x{4E33}\x{4E34}\x{4E35}\x{4E36}\x{4E37}\x{4E38}\x{4E39}' . + '\x{4E3A}\x{4E3B}\x{4E3C}\x{4E3D}\x{4E3E}\x{4E3F}\x{4E40}\x{4E41}\x{4E42}' . + '\x{4E43}\x{4E44}\x{4E45}\x{4E46}\x{4E47}\x{4E48}\x{4E49}\x{4E4A}\x{4E4B}' . + '\x{4E4C}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E50}\x{4E51}\x{4E52}\x{4E53}\x{4E54}' . + '\x{4E56}\x{4E57}\x{4E58}\x{4E59}\x{4E5A}\x{4E5B}\x{4E5C}\x{4E5D}\x{4E5E}' . + '\x{4E5F}\x{4E60}\x{4E61}\x{4E62}\x{4E63}\x{4E64}\x{4E65}\x{4E66}\x{4E67}' . + '\x{4E69}\x{4E6A}\x{4E6B}\x{4E6C}\x{4E6D}\x{4E6E}\x{4E6F}\x{4E70}\x{4E71}' . + '\x{4E72}\x{4E73}\x{4E74}\x{4E75}\x{4E76}\x{4E77}\x{4E78}\x{4E7A}\x{4E7B}' . + '\x{4E7C}\x{4E7D}\x{4E7E}\x{4E7F}\x{4E80}\x{4E81}\x{4E82}\x{4E83}\x{4E84}' . + '\x{4E85}\x{4E86}\x{4E87}\x{4E88}\x{4E89}\x{4E8B}\x{4E8C}\x{4E8D}\x{4E8E}' . + '\x{4E8F}\x{4E90}\x{4E91}\x{4E92}\x{4E93}\x{4E94}\x{4E95}\x{4E97}\x{4E98}' . + '\x{4E99}\x{4E9A}\x{4E9B}\x{4E9C}\x{4E9D}\x{4E9E}\x{4E9F}\x{4EA0}\x{4EA1}' . + '\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA7}\x{4EA8}\x{4EA9}\x{4EAA}\x{4EAB}' . + '\x{4EAC}\x{4EAD}\x{4EAE}\x{4EAF}\x{4EB0}\x{4EB1}\x{4EB2}\x{4EB3}\x{4EB4}' . + '\x{4EB5}\x{4EB6}\x{4EB7}\x{4EB8}\x{4EB9}\x{4EBA}\x{4EBB}\x{4EBD}\x{4EBE}' . + '\x{4EBF}\x{4EC0}\x{4EC1}\x{4EC2}\x{4EC3}\x{4EC4}\x{4EC5}\x{4EC6}\x{4EC7}' . + '\x{4EC8}\x{4EC9}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED0}\x{4ED1}' . + '\x{4ED2}\x{4ED3}\x{4ED4}\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDA}' . + '\x{4EDB}\x{4EDC}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE0}\x{4EE1}\x{4EE2}\x{4EE3}' . + '\x{4EE4}\x{4EE5}\x{4EE6}\x{4EE8}\x{4EE9}\x{4EEA}\x{4EEB}\x{4EEC}\x{4EEF}' . + '\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EFB}' . + '\x{4EFD}\x{4EFF}\x{4F00}\x{4F01}\x{4F02}\x{4F03}\x{4F04}\x{4F05}\x{4F06}' . + '\x{4F08}\x{4F09}\x{4F0A}\x{4F0B}\x{4F0C}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}' . + '\x{4F11}\x{4F12}\x{4F13}\x{4F14}\x{4F15}\x{4F17}\x{4F18}\x{4F19}\x{4F1A}' . + '\x{4F1B}\x{4F1C}\x{4F1D}\x{4F1E}\x{4F1F}\x{4F20}\x{4F21}\x{4F22}\x{4F23}' . + '\x{4F24}\x{4F25}\x{4F26}\x{4F27}\x{4F29}\x{4F2A}\x{4F2B}\x{4F2C}\x{4F2D}' . + '\x{4F2E}\x{4F2F}\x{4F30}\x{4F32}\x{4F33}\x{4F34}\x{4F36}\x{4F38}\x{4F39}' . + '\x{4F3A}\x{4F3B}\x{4F3C}\x{4F3D}\x{4F3E}\x{4F3F}\x{4F41}\x{4F42}\x{4F43}' . + '\x{4F45}\x{4F46}\x{4F47}\x{4F48}\x{4F49}\x{4F4A}\x{4F4B}\x{4F4C}\x{4F4D}' . + '\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}\x{4F52}\x{4F53}\x{4F54}\x{4F55}\x{4F56}' . + '\x{4F57}\x{4F58}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}\x{4F5F}' . + '\x{4F60}\x{4F61}\x{4F62}\x{4F63}\x{4F64}\x{4F65}\x{4F66}\x{4F67}\x{4F68}' . + '\x{4F69}\x{4F6A}\x{4F6B}\x{4F6C}\x{4F6D}\x{4F6E}\x{4F6F}\x{4F70}\x{4F72}' . + '\x{4F73}\x{4F74}\x{4F75}\x{4F76}\x{4F77}\x{4F78}\x{4F79}\x{4F7A}\x{4F7B}' . + '\x{4F7C}\x{4F7D}\x{4F7E}\x{4F7F}\x{4F80}\x{4F81}\x{4F82}\x{4F83}\x{4F84}' . + '\x{4F85}\x{4F86}\x{4F87}\x{4F88}\x{4F89}\x{4F8A}\x{4F8B}\x{4F8D}\x{4F8F}' . + '\x{4F90}\x{4F91}\x{4F92}\x{4F93}\x{4F94}\x{4F95}\x{4F96}\x{4F97}\x{4F98}' . + '\x{4F99}\x{4F9A}\x{4F9B}\x{4F9C}\x{4F9D}\x{4F9E}\x{4F9F}\x{4FA0}\x{4FA1}' . + '\x{4FA3}\x{4FA4}\x{4FA5}\x{4FA6}\x{4FA7}\x{4FA8}\x{4FA9}\x{4FAA}\x{4FAB}' . + '\x{4FAC}\x{4FAE}\x{4FAF}\x{4FB0}\x{4FB1}\x{4FB2}\x{4FB3}\x{4FB4}\x{4FB5}' . + '\x{4FB6}\x{4FB7}\x{4FB8}\x{4FB9}\x{4FBA}\x{4FBB}\x{4FBC}\x{4FBE}\x{4FBF}' . + '\x{4FC0}\x{4FC1}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FC5}\x{4FC7}\x{4FC9}\x{4FCA}' . + '\x{4FCB}\x{4FCD}\x{4FCE}\x{4FCF}\x{4FD0}\x{4FD1}\x{4FD2}\x{4FD3}\x{4FD4}' . + '\x{4FD5}\x{4FD6}\x{4FD7}\x{4FD8}\x{4FD9}\x{4FDA}\x{4FDB}\x{4FDC}\x{4FDD}' . + '\x{4FDE}\x{4FDF}\x{4FE0}\x{4FE1}\x{4FE3}\x{4FE4}\x{4FE5}\x{4FE6}\x{4FE7}' . + '\x{4FE8}\x{4FE9}\x{4FEA}\x{4FEB}\x{4FEC}\x{4FED}\x{4FEE}\x{4FEF}\x{4FF0}' . + '\x{4FF1}\x{4FF2}\x{4FF3}\x{4FF4}\x{4FF5}\x{4FF6}\x{4FF7}\x{4FF8}\x{4FF9}' . + '\x{4FFA}\x{4FFB}\x{4FFE}\x{4FFF}\x{5000}\x{5001}\x{5002}\x{5003}\x{5004}' . + '\x{5005}\x{5006}\x{5007}\x{5008}\x{5009}\x{500A}\x{500B}\x{500C}\x{500D}' . + '\x{500E}\x{500F}\x{5011}\x{5012}\x{5013}\x{5014}\x{5015}\x{5016}\x{5017}' . + '\x{5018}\x{5019}\x{501A}\x{501B}\x{501C}\x{501D}\x{501E}\x{501F}\x{5020}' . + '\x{5021}\x{5022}\x{5023}\x{5024}\x{5025}\x{5026}\x{5027}\x{5028}\x{5029}' . + '\x{502A}\x{502B}\x{502C}\x{502D}\x{502E}\x{502F}\x{5030}\x{5031}\x{5032}' . + '\x{5033}\x{5035}\x{5036}\x{5037}\x{5039}\x{503A}\x{503B}\x{503C}\x{503E}' . + '\x{503F}\x{5040}\x{5041}\x{5043}\x{5044}\x{5045}\x{5046}\x{5047}\x{5048}' . + '\x{5049}\x{504A}\x{504B}\x{504C}\x{504D}\x{504E}\x{504F}\x{5051}\x{5053}' . + '\x{5054}\x{5055}\x{5056}\x{5057}\x{5059}\x{505A}\x{505B}\x{505C}\x{505D}' . + '\x{505E}\x{505F}\x{5060}\x{5061}\x{5062}\x{5063}\x{5064}\x{5065}\x{5066}' . + '\x{5067}\x{5068}\x{5069}\x{506A}\x{506B}\x{506C}\x{506D}\x{506E}\x{506F}' . + '\x{5070}\x{5071}\x{5072}\x{5073}\x{5074}\x{5075}\x{5076}\x{5077}\x{5078}' . + '\x{5079}\x{507A}\x{507B}\x{507D}\x{507E}\x{507F}\x{5080}\x{5082}\x{5083}' . + '\x{5084}\x{5085}\x{5086}\x{5087}\x{5088}\x{5089}\x{508A}\x{508B}\x{508C}' . + '\x{508D}\x{508E}\x{508F}\x{5090}\x{5091}\x{5092}\x{5094}\x{5095}\x{5096}' . + '\x{5098}\x{5099}\x{509A}\x{509B}\x{509C}\x{509D}\x{509E}\x{50A2}\x{50A3}' . + '\x{50A4}\x{50A5}\x{50A6}\x{50A7}\x{50A8}\x{50A9}\x{50AA}\x{50AB}\x{50AC}' . + '\x{50AD}\x{50AE}\x{50AF}\x{50B0}\x{50B1}\x{50B2}\x{50B3}\x{50B4}\x{50B5}' . + '\x{50B6}\x{50B7}\x{50B8}\x{50BA}\x{50BB}\x{50BC}\x{50BD}\x{50BE}\x{50BF}' . + '\x{50C0}\x{50C1}\x{50C2}\x{50C4}\x{50C5}\x{50C6}\x{50C7}\x{50C8}\x{50C9}' . + '\x{50CA}\x{50CB}\x{50CC}\x{50CD}\x{50CE}\x{50CF}\x{50D0}\x{50D1}\x{50D2}' . + '\x{50D3}\x{50D4}\x{50D5}\x{50D6}\x{50D7}\x{50D9}\x{50DA}\x{50DB}\x{50DC}' . + '\x{50DD}\x{50DE}\x{50E0}\x{50E3}\x{50E4}\x{50E5}\x{50E6}\x{50E7}\x{50E8}' . + '\x{50E9}\x{50EA}\x{50EC}\x{50ED}\x{50EE}\x{50EF}\x{50F0}\x{50F1}\x{50F2}' . + '\x{50F3}\x{50F5}\x{50F6}\x{50F8}\x{50F9}\x{50FA}\x{50FB}\x{50FC}\x{50FD}' . + '\x{50FE}\x{50FF}\x{5100}\x{5101}\x{5102}\x{5103}\x{5104}\x{5105}\x{5106}' . + '\x{5107}\x{5108}\x{5109}\x{510A}\x{510B}\x{510C}\x{510D}\x{510E}\x{510F}' . + '\x{5110}\x{5111}\x{5112}\x{5113}\x{5114}\x{5115}\x{5116}\x{5117}\x{5118}' . + '\x{5119}\x{511A}\x{511C}\x{511D}\x{511E}\x{511F}\x{5120}\x{5121}\x{5122}' . + '\x{5123}\x{5124}\x{5125}\x{5126}\x{5127}\x{5129}\x{512A}\x{512C}\x{512D}' . + '\x{512E}\x{512F}\x{5130}\x{5131}\x{5132}\x{5133}\x{5134}\x{5135}\x{5136}' . + '\x{5137}\x{5138}\x{5139}\x{513A}\x{513B}\x{513C}\x{513D}\x{513E}\x{513F}' . + '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . + '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5151}\x{5152}\x{5154}\x{5155}' . + '\x{5156}\x{5157}\x{5159}\x{515A}\x{515B}\x{515C}\x{515D}\x{515E}\x{515F}' . + '\x{5161}\x{5162}\x{5163}\x{5165}\x{5166}\x{5167}\x{5168}\x{5169}\x{516A}' . + '\x{516B}\x{516C}\x{516D}\x{516E}\x{516F}\x{5170}\x{5171}\x{5173}\x{5174}' . + '\x{5175}\x{5176}\x{5177}\x{5178}\x{5179}\x{517A}\x{517B}\x{517C}\x{517D}' . + '\x{517F}\x{5180}\x{5181}\x{5182}\x{5185}\x{5186}\x{5187}\x{5188}\x{5189}' . + '\x{518A}\x{518B}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}\x{5193}' . + '\x{5194}\x{5195}\x{5196}\x{5197}\x{5198}\x{5199}\x{519A}\x{519B}\x{519C}' . + '\x{519D}\x{519E}\x{519F}\x{51A0}\x{51A2}\x{51A4}\x{51A5}\x{51A6}\x{51A7}' . + '\x{51A8}\x{51AA}\x{51AB}\x{51AC}\x{51AE}\x{51AF}\x{51B0}\x{51B1}\x{51B2}' . + '\x{51B3}\x{51B5}\x{51B6}\x{51B7}\x{51B9}\x{51BB}\x{51BC}\x{51BD}\x{51BE}' . + '\x{51BF}\x{51C0}\x{51C1}\x{51C3}\x{51C4}\x{51C5}\x{51C6}\x{51C7}\x{51C8}' . + '\x{51C9}\x{51CA}\x{51CB}\x{51CC}\x{51CD}\x{51CE}\x{51CF}\x{51D0}\x{51D1}' . + '\x{51D4}\x{51D5}\x{51D6}\x{51D7}\x{51D8}\x{51D9}\x{51DA}\x{51DB}\x{51DC}' . + '\x{51DD}\x{51DE}\x{51E0}\x{51E1}\x{51E2}\x{51E3}\x{51E4}\x{51E5}\x{51E7}' . + '\x{51E8}\x{51E9}\x{51EA}\x{51EB}\x{51ED}\x{51EF}\x{51F0}\x{51F1}\x{51F3}' . + '\x{51F4}\x{51F5}\x{51F6}\x{51F7}\x{51F8}\x{51F9}\x{51FA}\x{51FB}\x{51FC}' . + '\x{51FD}\x{51FE}\x{51FF}\x{5200}\x{5201}\x{5202}\x{5203}\x{5204}\x{5205}' . + '\x{5206}\x{5207}\x{5208}\x{5209}\x{520A}\x{520B}\x{520C}\x{520D}\x{520E}' . + '\x{520F}\x{5210}\x{5211}\x{5212}\x{5213}\x{5214}\x{5215}\x{5216}\x{5217}' . + '\x{5218}\x{5219}\x{521A}\x{521B}\x{521C}\x{521D}\x{521E}\x{521F}\x{5220}' . + '\x{5221}\x{5222}\x{5223}\x{5224}\x{5225}\x{5226}\x{5228}\x{5229}\x{522A}' . + '\x{522B}\x{522C}\x{522D}\x{522E}\x{522F}\x{5230}\x{5231}\x{5232}\x{5233}' . + '\x{5234}\x{5235}\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{523C}' . + '\x{523D}\x{523E}\x{523F}\x{5240}\x{5241}\x{5242}\x{5243}\x{5244}\x{5245}' . + '\x{5246}\x{5247}\x{5248}\x{5249}\x{524A}\x{524B}\x{524C}\x{524D}\x{524E}' . + '\x{5250}\x{5251}\x{5252}\x{5254}\x{5255}\x{5256}\x{5257}\x{5258}\x{5259}' . + '\x{525A}\x{525B}\x{525C}\x{525D}\x{525E}\x{525F}\x{5260}\x{5261}\x{5262}' . + '\x{5263}\x{5264}\x{5265}\x{5267}\x{5268}\x{5269}\x{526A}\x{526B}\x{526C}' . + '\x{526D}\x{526E}\x{526F}\x{5270}\x{5272}\x{5273}\x{5274}\x{5275}\x{5276}' . + '\x{5277}\x{5278}\x{527A}\x{527B}\x{527C}\x{527D}\x{527E}\x{527F}\x{5280}' . + '\x{5281}\x{5282}\x{5283}\x{5284}\x{5286}\x{5287}\x{5288}\x{5289}\x{528A}' . + '\x{528B}\x{528C}\x{528D}\x{528F}\x{5290}\x{5291}\x{5292}\x{5293}\x{5294}' . + '\x{5295}\x{5296}\x{5297}\x{5298}\x{5299}\x{529A}\x{529B}\x{529C}\x{529D}' . + '\x{529E}\x{529F}\x{52A0}\x{52A1}\x{52A2}\x{52A3}\x{52A5}\x{52A6}\x{52A7}' . + '\x{52A8}\x{52A9}\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52AE}\x{52AF}\x{52B0}' . + '\x{52B1}\x{52B2}\x{52B3}\x{52B4}\x{52B5}\x{52B6}\x{52B7}\x{52B8}\x{52B9}' . + '\x{52BA}\x{52BB}\x{52BC}\x{52BD}\x{52BE}\x{52BF}\x{52C0}\x{52C1}\x{52C2}' . + '\x{52C3}\x{52C6}\x{52C7}\x{52C9}\x{52CA}\x{52CB}\x{52CD}\x{52CF}\x{52D0}' . + '\x{52D2}\x{52D3}\x{52D5}\x{52D6}\x{52D7}\x{52D8}\x{52D9}\x{52DA}\x{52DB}' . + '\x{52DC}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}\x{52E4}\x{52E6}' . + '\x{52E7}\x{52E8}\x{52E9}\x{52EA}\x{52EB}\x{52EC}\x{52ED}\x{52EF}\x{52F0}' . + '\x{52F1}\x{52F2}\x{52F3}\x{52F4}\x{52F5}\x{52F6}\x{52F7}\x{52F8}\x{52F9}' . + '\x{52FA}\x{52FB}\x{52FC}\x{52FD}\x{52FE}\x{52FF}\x{5300}\x{5301}\x{5302}' . + '\x{5305}\x{5306}\x{5307}\x{5308}\x{5309}\x{530A}\x{530B}\x{530C}\x{530D}' . + '\x{530E}\x{530F}\x{5310}\x{5311}\x{5312}\x{5313}\x{5314}\x{5315}\x{5316}' . + '\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}\x{5320}\x{5321}\x{5322}' . + '\x{5323}\x{5324}\x{5325}\x{5326}\x{5328}\x{532A}\x{532B}\x{532C}\x{532D}' . + '\x{532E}\x{532F}\x{5330}\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}\x{533A}' . + '\x{533B}\x{533C}\x{533D}\x{533E}\x{533F}\x{5340}\x{5341}\x{5343}\x{5344}' . + '\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}\x{534A}\x{534B}\x{534C}\x{534D}' . + '\x{534E}\x{534F}\x{5350}\x{5351}\x{5352}\x{5353}\x{5354}\x{5355}\x{5356}' . + '\x{5357}\x{5358}\x{5359}\x{535A}\x{535C}\x{535E}\x{535F}\x{5360}\x{5361}' . + '\x{5362}\x{5363}\x{5364}\x{5365}\x{5366}\x{5367}\x{5369}\x{536B}\x{536C}' . + '\x{536E}\x{536F}\x{5370}\x{5371}\x{5372}\x{5373}\x{5374}\x{5375}\x{5376}' . + '\x{5377}\x{5378}\x{5379}\x{537A}\x{537B}\x{537C}\x{537D}\x{537E}\x{537F}' . + '\x{5381}\x{5382}\x{5383}\x{5384}\x{5385}\x{5386}\x{5387}\x{5388}\x{5389}' . + '\x{538A}\x{538B}\x{538C}\x{538D}\x{538E}\x{538F}\x{5390}\x{5391}\x{5392}' . + '\x{5393}\x{5394}\x{5395}\x{5396}\x{5397}\x{5398}\x{5399}\x{539A}\x{539B}' . + '\x{539C}\x{539D}\x{539E}\x{539F}\x{53A0}\x{53A2}\x{53A3}\x{53A4}\x{53A5}' . + '\x{53A6}\x{53A7}\x{53A8}\x{53A9}\x{53AC}\x{53AD}\x{53AE}\x{53B0}\x{53B1}' . + '\x{53B2}\x{53B3}\x{53B4}\x{53B5}\x{53B6}\x{53B7}\x{53B8}\x{53B9}\x{53BB}' . + '\x{53BC}\x{53BD}\x{53BE}\x{53BF}\x{53C0}\x{53C1}\x{53C2}\x{53C3}\x{53C4}' . + '\x{53C6}\x{53C7}\x{53C8}\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}' . + '\x{53D0}\x{53D1}\x{53D2}\x{53D3}\x{53D4}\x{53D5}\x{53D6}\x{53D7}\x{53D8}' . + '\x{53D9}\x{53DB}\x{53DC}\x{53DF}\x{53E0}\x{53E1}\x{53E2}\x{53E3}\x{53E4}' . + '\x{53E5}\x{53E6}\x{53E8}\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}' . + '\x{53EF}\x{53F0}\x{53F1}\x{53F2}\x{53F3}\x{53F4}\x{53F5}\x{53F6}\x{53F7}' . + '\x{53F8}\x{53F9}\x{53FA}\x{53FB}\x{53FC}\x{53FD}\x{53FE}\x{5401}\x{5402}' . + '\x{5403}\x{5404}\x{5405}\x{5406}\x{5407}\x{5408}\x{5409}\x{540A}\x{540B}' . + '\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}\x{5411}\x{5412}\x{5413}\x{5414}' . + '\x{5415}\x{5416}\x{5417}\x{5418}\x{5419}\x{541B}\x{541C}\x{541D}\x{541E}' . + '\x{541F}\x{5420}\x{5421}\x{5423}\x{5424}\x{5425}\x{5426}\x{5427}\x{5428}' . + '\x{5429}\x{542A}\x{542B}\x{542C}\x{542D}\x{542E}\x{542F}\x{5430}\x{5431}' . + '\x{5432}\x{5433}\x{5434}\x{5435}\x{5436}\x{5437}\x{5438}\x{5439}\x{543A}' . + '\x{543B}\x{543C}\x{543D}\x{543E}\x{543F}\x{5440}\x{5441}\x{5442}\x{5443}' . + '\x{5444}\x{5445}\x{5446}\x{5447}\x{5448}\x{5449}\x{544A}\x{544B}\x{544D}' . + '\x{544E}\x{544F}\x{5450}\x{5451}\x{5452}\x{5453}\x{5454}\x{5455}\x{5456}' . + '\x{5457}\x{5458}\x{5459}\x{545A}\x{545B}\x{545C}\x{545E}\x{545F}\x{5460}' . + '\x{5461}\x{5462}\x{5463}\x{5464}\x{5465}\x{5466}\x{5467}\x{5468}\x{546A}' . + '\x{546B}\x{546C}\x{546D}\x{546E}\x{546F}\x{5470}\x{5471}\x{5472}\x{5473}' . + '\x{5474}\x{5475}\x{5476}\x{5477}\x{5478}\x{5479}\x{547A}\x{547B}\x{547C}' . + '\x{547D}\x{547E}\x{547F}\x{5480}\x{5481}\x{5482}\x{5483}\x{5484}\x{5485}' . + '\x{5486}\x{5487}\x{5488}\x{5489}\x{548B}\x{548C}\x{548D}\x{548E}\x{548F}' . + '\x{5490}\x{5491}\x{5492}\x{5493}\x{5494}\x{5495}\x{5496}\x{5497}\x{5498}' . + '\x{5499}\x{549A}\x{549B}\x{549C}\x{549D}\x{549E}\x{549F}\x{54A0}\x{54A1}' . + '\x{54A2}\x{54A3}\x{54A4}\x{54A5}\x{54A6}\x{54A7}\x{54A8}\x{54A9}\x{54AA}' . + '\x{54AB}\x{54AC}\x{54AD}\x{54AE}\x{54AF}\x{54B0}\x{54B1}\x{54B2}\x{54B3}' . + '\x{54B4}\x{54B6}\x{54B7}\x{54B8}\x{54B9}\x{54BA}\x{54BB}\x{54BC}\x{54BD}' . + '\x{54BE}\x{54BF}\x{54C0}\x{54C1}\x{54C2}\x{54C3}\x{54C4}\x{54C5}\x{54C6}' . + '\x{54C7}\x{54C8}\x{54C9}\x{54CA}\x{54CB}\x{54CC}\x{54CD}\x{54CE}\x{54CF}' . + '\x{54D0}\x{54D1}\x{54D2}\x{54D3}\x{54D4}\x{54D5}\x{54D6}\x{54D7}\x{54D8}' . + '\x{54D9}\x{54DA}\x{54DB}\x{54DC}\x{54DD}\x{54DE}\x{54DF}\x{54E0}\x{54E1}' . + '\x{54E2}\x{54E3}\x{54E4}\x{54E5}\x{54E6}\x{54E7}\x{54E8}\x{54E9}\x{54EA}' . + '\x{54EB}\x{54EC}\x{54ED}\x{54EE}\x{54EF}\x{54F0}\x{54F1}\x{54F2}\x{54F3}' . + '\x{54F4}\x{54F5}\x{54F7}\x{54F8}\x{54F9}\x{54FA}\x{54FB}\x{54FC}\x{54FD}' . + '\x{54FE}\x{54FF}\x{5500}\x{5501}\x{5502}\x{5503}\x{5504}\x{5505}\x{5506}' . + '\x{5507}\x{5508}\x{5509}\x{550A}\x{550B}\x{550C}\x{550D}\x{550E}\x{550F}' . + '\x{5510}\x{5511}\x{5512}\x{5513}\x{5514}\x{5516}\x{5517}\x{551A}\x{551B}' . + '\x{551C}\x{551D}\x{551E}\x{551F}\x{5520}\x{5521}\x{5522}\x{5523}\x{5524}' . + '\x{5525}\x{5526}\x{5527}\x{5528}\x{5529}\x{552A}\x{552B}\x{552C}\x{552D}' . + '\x{552E}\x{552F}\x{5530}\x{5531}\x{5532}\x{5533}\x{5534}\x{5535}\x{5536}' . + '\x{5537}\x{5538}\x{5539}\x{553A}\x{553B}\x{553C}\x{553D}\x{553E}\x{553F}' . + '\x{5540}\x{5541}\x{5542}\x{5543}\x{5544}\x{5545}\x{5546}\x{5548}\x{5549}' . + '\x{554A}\x{554B}\x{554C}\x{554D}\x{554E}\x{554F}\x{5550}\x{5551}\x{5552}' . + '\x{5553}\x{5554}\x{5555}\x{5556}\x{5557}\x{5558}\x{5559}\x{555A}\x{555B}' . + '\x{555C}\x{555D}\x{555E}\x{555F}\x{5561}\x{5562}\x{5563}\x{5564}\x{5565}' . + '\x{5566}\x{5567}\x{5568}\x{5569}\x{556A}\x{556B}\x{556C}\x{556D}\x{556E}' . + '\x{556F}\x{5570}\x{5571}\x{5572}\x{5573}\x{5574}\x{5575}\x{5576}\x{5577}' . + '\x{5578}\x{5579}\x{557B}\x{557C}\x{557D}\x{557E}\x{557F}\x{5580}\x{5581}' . + '\x{5582}\x{5583}\x{5584}\x{5585}\x{5586}\x{5587}\x{5588}\x{5589}\x{558A}' . + '\x{558B}\x{558C}\x{558D}\x{558E}\x{558F}\x{5590}\x{5591}\x{5592}\x{5593}' . + '\x{5594}\x{5595}\x{5596}\x{5597}\x{5598}\x{5599}\x{559A}\x{559B}\x{559C}' . + '\x{559D}\x{559E}\x{559F}\x{55A0}\x{55A1}\x{55A2}\x{55A3}\x{55A4}\x{55A5}' . + '\x{55A6}\x{55A7}\x{55A8}\x{55A9}\x{55AA}\x{55AB}\x{55AC}\x{55AD}\x{55AE}' . + '\x{55AF}\x{55B0}\x{55B1}\x{55B2}\x{55B3}\x{55B4}\x{55B5}\x{55B6}\x{55B7}' . + '\x{55B8}\x{55B9}\x{55BA}\x{55BB}\x{55BC}\x{55BD}\x{55BE}\x{55BF}\x{55C0}' . + '\x{55C1}\x{55C2}\x{55C3}\x{55C4}\x{55C5}\x{55C6}\x{55C7}\x{55C8}\x{55C9}' . + '\x{55CA}\x{55CB}\x{55CC}\x{55CD}\x{55CE}\x{55CF}\x{55D0}\x{55D1}\x{55D2}' . + '\x{55D3}\x{55D4}\x{55D5}\x{55D6}\x{55D7}\x{55D8}\x{55D9}\x{55DA}\x{55DB}' . + '\x{55DC}\x{55DD}\x{55DE}\x{55DF}\x{55E1}\x{55E2}\x{55E3}\x{55E4}\x{55E5}' . + '\x{55E6}\x{55E7}\x{55E8}\x{55E9}\x{55EA}\x{55EB}\x{55EC}\x{55ED}\x{55EE}' . + '\x{55EF}\x{55F0}\x{55F1}\x{55F2}\x{55F3}\x{55F4}\x{55F5}\x{55F6}\x{55F7}' . + '\x{55F9}\x{55FA}\x{55FB}\x{55FC}\x{55FD}\x{55FE}\x{55FF}\x{5600}\x{5601}' . + '\x{5602}\x{5603}\x{5604}\x{5606}\x{5607}\x{5608}\x{5609}\x{560C}\x{560D}' . + '\x{560E}\x{560F}\x{5610}\x{5611}\x{5612}\x{5613}\x{5614}\x{5615}\x{5616}' . + '\x{5617}\x{5618}\x{5619}\x{561A}\x{561B}\x{561C}\x{561D}\x{561E}\x{561F}' . + '\x{5621}\x{5622}\x{5623}\x{5624}\x{5625}\x{5626}\x{5627}\x{5628}\x{5629}' . + '\x{562A}\x{562C}\x{562D}\x{562E}\x{562F}\x{5630}\x{5631}\x{5632}\x{5633}' . + '\x{5634}\x{5635}\x{5636}\x{5638}\x{5639}\x{563A}\x{563B}\x{563D}\x{563E}' . + '\x{563F}\x{5640}\x{5641}\x{5642}\x{5643}\x{5645}\x{5646}\x{5647}\x{5648}' . + '\x{5649}\x{564A}\x{564C}\x{564D}\x{564E}\x{564F}\x{5650}\x{5652}\x{5653}' . + '\x{5654}\x{5655}\x{5657}\x{5658}\x{5659}\x{565A}\x{565B}\x{565C}\x{565D}' . + '\x{565E}\x{5660}\x{5662}\x{5663}\x{5664}\x{5665}\x{5666}\x{5667}\x{5668}' . + '\x{5669}\x{566A}\x{566B}\x{566C}\x{566D}\x{566E}\x{566F}\x{5670}\x{5671}' . + '\x{5672}\x{5673}\x{5674}\x{5676}\x{5677}\x{5678}\x{5679}\x{567A}\x{567B}' . + '\x{567C}\x{567E}\x{567F}\x{5680}\x{5681}\x{5682}\x{5683}\x{5684}\x{5685}' . + '\x{5686}\x{5687}\x{568A}\x{568C}\x{568D}\x{568E}\x{568F}\x{5690}\x{5691}' . + '\x{5692}\x{5693}\x{5694}\x{5695}\x{5697}\x{5698}\x{5699}\x{569A}\x{569B}' . + '\x{569C}\x{569D}\x{569F}\x{56A0}\x{56A1}\x{56A3}\x{56A4}\x{56A5}\x{56A6}' . + '\x{56A7}\x{56A8}\x{56A9}\x{56AA}\x{56AB}\x{56AC}\x{56AD}\x{56AE}\x{56AF}' . + '\x{56B0}\x{56B1}\x{56B2}\x{56B3}\x{56B4}\x{56B5}\x{56B6}\x{56B7}\x{56B8}' . + '\x{56B9}\x{56BB}\x{56BC}\x{56BD}\x{56BE}\x{56BF}\x{56C0}\x{56C1}\x{56C2}' . + '\x{56C3}\x{56C4}\x{56C5}\x{56C6}\x{56C7}\x{56C8}\x{56C9}\x{56CA}\x{56CB}' . + '\x{56CC}\x{56CD}\x{56CE}\x{56D0}\x{56D1}\x{56D2}\x{56D3}\x{56D4}\x{56D5}' . + '\x{56D6}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DC}\x{56DD}\x{56DE}\x{56DF}' . + '\x{56E0}\x{56E1}\x{56E2}\x{56E3}\x{56E4}\x{56E5}\x{56E7}\x{56E8}\x{56E9}' . + '\x{56EA}\x{56EB}\x{56EC}\x{56ED}\x{56EE}\x{56EF}\x{56F0}\x{56F1}\x{56F2}' . + '\x{56F3}\x{56F4}\x{56F5}\x{56F7}\x{56F9}\x{56FA}\x{56FD}\x{56FE}\x{56FF}' . + '\x{5700}\x{5701}\x{5702}\x{5703}\x{5704}\x{5706}\x{5707}\x{5708}\x{5709}' . + '\x{570A}\x{570B}\x{570C}\x{570D}\x{570E}\x{570F}\x{5710}\x{5712}\x{5713}' . + '\x{5714}\x{5715}\x{5716}\x{5718}\x{5719}\x{571A}\x{571B}\x{571C}\x{571D}' . + '\x{571E}\x{571F}\x{5720}\x{5722}\x{5723}\x{5725}\x{5726}\x{5727}\x{5728}' . + '\x{5729}\x{572A}\x{572B}\x{572C}\x{572D}\x{572E}\x{572F}\x{5730}\x{5731}' . + '\x{5732}\x{5733}\x{5734}\x{5735}\x{5736}\x{5737}\x{5738}\x{5739}\x{573A}' . + '\x{573B}\x{573C}\x{573E}\x{573F}\x{5740}\x{5741}\x{5742}\x{5744}\x{5745}' . + '\x{5746}\x{5747}\x{5749}\x{574A}\x{574B}\x{574C}\x{574D}\x{574E}\x{574F}' . + '\x{5750}\x{5751}\x{5752}\x{5753}\x{5754}\x{5757}\x{5759}\x{575A}\x{575B}' . + '\x{575C}\x{575D}\x{575E}\x{575F}\x{5760}\x{5761}\x{5762}\x{5764}\x{5765}' . + '\x{5766}\x{5767}\x{5768}\x{5769}\x{576A}\x{576B}\x{576C}\x{576D}\x{576F}' . + '\x{5770}\x{5771}\x{5772}\x{5773}\x{5774}\x{5775}\x{5776}\x{5777}\x{5779}' . + '\x{577A}\x{577B}\x{577C}\x{577D}\x{577E}\x{577F}\x{5780}\x{5782}\x{5783}' . + '\x{5784}\x{5785}\x{5786}\x{5788}\x{5789}\x{578A}\x{578B}\x{578C}\x{578D}' . + '\x{578E}\x{578F}\x{5790}\x{5791}\x{5792}\x{5793}\x{5794}\x{5795}\x{5797}' . + '\x{5798}\x{5799}\x{579A}\x{579B}\x{579C}\x{579D}\x{579E}\x{579F}\x{57A0}' . + '\x{57A1}\x{57A2}\x{57A3}\x{57A4}\x{57A5}\x{57A6}\x{57A7}\x{57A9}\x{57AA}' . + '\x{57AB}\x{57AC}\x{57AD}\x{57AE}\x{57AF}\x{57B0}\x{57B1}\x{57B2}\x{57B3}' . + '\x{57B4}\x{57B5}\x{57B6}\x{57B7}\x{57B8}\x{57B9}\x{57BA}\x{57BB}\x{57BC}' . + '\x{57BD}\x{57BE}\x{57BF}\x{57C0}\x{57C1}\x{57C2}\x{57C3}\x{57C4}\x{57C5}' . + '\x{57C6}\x{57C7}\x{57C8}\x{57C9}\x{57CB}\x{57CC}\x{57CD}\x{57CE}\x{57CF}' . + '\x{57D0}\x{57D2}\x{57D3}\x{57D4}\x{57D5}\x{57D6}\x{57D8}\x{57D9}\x{57DA}' . + '\x{57DC}\x{57DD}\x{57DF}\x{57E0}\x{57E1}\x{57E2}\x{57E3}\x{57E4}\x{57E5}' . + '\x{57E6}\x{57E7}\x{57E8}\x{57E9}\x{57EA}\x{57EB}\x{57EC}\x{57ED}\x{57EE}' . + '\x{57EF}\x{57F0}\x{57F1}\x{57F2}\x{57F3}\x{57F4}\x{57F5}\x{57F6}\x{57F7}' . + '\x{57F8}\x{57F9}\x{57FA}\x{57FB}\x{57FC}\x{57FD}\x{57FE}\x{57FF}\x{5800}' . + '\x{5801}\x{5802}\x{5803}\x{5804}\x{5805}\x{5806}\x{5807}\x{5808}\x{5809}' . + '\x{580A}\x{580B}\x{580C}\x{580D}\x{580E}\x{580F}\x{5810}\x{5811}\x{5812}' . + '\x{5813}\x{5814}\x{5815}\x{5816}\x{5819}\x{581A}\x{581B}\x{581C}\x{581D}' . + '\x{581E}\x{581F}\x{5820}\x{5821}\x{5822}\x{5823}\x{5824}\x{5825}\x{5826}' . + '\x{5827}\x{5828}\x{5829}\x{582A}\x{582B}\x{582C}\x{582D}\x{582E}\x{582F}' . + '\x{5830}\x{5831}\x{5832}\x{5833}\x{5834}\x{5835}\x{5836}\x{5837}\x{5838}' . + '\x{5839}\x{583A}\x{583B}\x{583C}\x{583D}\x{583E}\x{583F}\x{5840}\x{5842}' . + '\x{5843}\x{5844}\x{5845}\x{5846}\x{5847}\x{5848}\x{5849}\x{584A}\x{584B}' . + '\x{584C}\x{584D}\x{584E}\x{584F}\x{5851}\x{5852}\x{5853}\x{5854}\x{5855}' . + '\x{5857}\x{5858}\x{5859}\x{585A}\x{585B}\x{585C}\x{585D}\x{585E}\x{585F}' . + '\x{5861}\x{5862}\x{5863}\x{5864}\x{5865}\x{5868}\x{5869}\x{586A}\x{586B}' . + '\x{586C}\x{586D}\x{586E}\x{586F}\x{5870}\x{5871}\x{5872}\x{5873}\x{5874}' . + '\x{5875}\x{5876}\x{5878}\x{5879}\x{587A}\x{587B}\x{587C}\x{587D}\x{587E}' . + '\x{587F}\x{5880}\x{5881}\x{5882}\x{5883}\x{5884}\x{5885}\x{5886}\x{5887}' . + '\x{5888}\x{5889}\x{588A}\x{588B}\x{588C}\x{588D}\x{588E}\x{588F}\x{5890}' . + '\x{5891}\x{5892}\x{5893}\x{5894}\x{5896}\x{5897}\x{5898}\x{5899}\x{589A}' . + '\x{589B}\x{589C}\x{589D}\x{589E}\x{589F}\x{58A0}\x{58A1}\x{58A2}\x{58A3}' . + '\x{58A4}\x{58A5}\x{58A6}\x{58A7}\x{58A8}\x{58A9}\x{58AB}\x{58AC}\x{58AD}' . + '\x{58AE}\x{58AF}\x{58B0}\x{58B1}\x{58B2}\x{58B3}\x{58B4}\x{58B7}\x{58B8}' . + '\x{58B9}\x{58BA}\x{58BB}\x{58BC}\x{58BD}\x{58BE}\x{58BF}\x{58C1}\x{58C2}' . + '\x{58C5}\x{58C6}\x{58C7}\x{58C8}\x{58C9}\x{58CA}\x{58CB}\x{58CE}\x{58CF}' . + '\x{58D1}\x{58D2}\x{58D3}\x{58D4}\x{58D5}\x{58D6}\x{58D7}\x{58D8}\x{58D9}' . + '\x{58DA}\x{58DB}\x{58DD}\x{58DE}\x{58DF}\x{58E0}\x{58E2}\x{58E3}\x{58E4}' . + '\x{58E5}\x{58E7}\x{58E8}\x{58E9}\x{58EA}\x{58EB}\x{58EC}\x{58ED}\x{58EE}' . + '\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F3}\x{58F4}\x{58F6}\x{58F7}\x{58F8}' . + '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{58FE}\x{58FF}\x{5900}\x{5902}' . + '\x{5903}\x{5904}\x{5906}\x{5907}\x{5909}\x{590A}\x{590B}\x{590C}\x{590D}' . + '\x{590E}\x{590F}\x{5910}\x{5912}\x{5914}\x{5915}\x{5916}\x{5917}\x{5918}' . + '\x{5919}\x{591A}\x{591B}\x{591C}\x{591D}\x{591E}\x{591F}\x{5920}\x{5921}' . + '\x{5922}\x{5924}\x{5925}\x{5926}\x{5927}\x{5928}\x{5929}\x{592A}\x{592B}' . + '\x{592C}\x{592D}\x{592E}\x{592F}\x{5930}\x{5931}\x{5932}\x{5934}\x{5935}' . + '\x{5937}\x{5938}\x{5939}\x{593A}\x{593B}\x{593C}\x{593D}\x{593E}\x{593F}' . + '\x{5940}\x{5941}\x{5942}\x{5943}\x{5944}\x{5945}\x{5946}\x{5947}\x{5948}' . + '\x{5949}\x{594A}\x{594B}\x{594C}\x{594D}\x{594E}\x{594F}\x{5950}\x{5951}' . + '\x{5952}\x{5953}\x{5954}\x{5955}\x{5956}\x{5957}\x{5958}\x{595A}\x{595C}' . + '\x{595D}\x{595E}\x{595F}\x{5960}\x{5961}\x{5962}\x{5963}\x{5964}\x{5965}' . + '\x{5966}\x{5967}\x{5968}\x{5969}\x{596A}\x{596B}\x{596C}\x{596D}\x{596E}' . + '\x{596F}\x{5970}\x{5971}\x{5972}\x{5973}\x{5974}\x{5975}\x{5976}\x{5977}' . + '\x{5978}\x{5979}\x{597A}\x{597B}\x{597C}\x{597D}\x{597E}\x{597F}\x{5980}' . + '\x{5981}\x{5982}\x{5983}\x{5984}\x{5985}\x{5986}\x{5987}\x{5988}\x{5989}' . + '\x{598A}\x{598B}\x{598C}\x{598D}\x{598E}\x{598F}\x{5990}\x{5991}\x{5992}' . + '\x{5993}\x{5994}\x{5995}\x{5996}\x{5997}\x{5998}\x{5999}\x{599A}\x{599C}' . + '\x{599D}\x{599E}\x{599F}\x{59A0}\x{59A1}\x{59A2}\x{59A3}\x{59A4}\x{59A5}' . + '\x{59A6}\x{59A7}\x{59A8}\x{59A9}\x{59AA}\x{59AB}\x{59AC}\x{59AD}\x{59AE}' . + '\x{59AF}\x{59B0}\x{59B1}\x{59B2}\x{59B3}\x{59B4}\x{59B5}\x{59B6}\x{59B8}' . + '\x{59B9}\x{59BA}\x{59BB}\x{59BC}\x{59BD}\x{59BE}\x{59BF}\x{59C0}\x{59C1}' . + '\x{59C2}\x{59C3}\x{59C4}\x{59C5}\x{59C6}\x{59C7}\x{59C8}\x{59C9}\x{59CA}' . + '\x{59CB}\x{59CC}\x{59CD}\x{59CE}\x{59CF}\x{59D0}\x{59D1}\x{59D2}\x{59D3}' . + '\x{59D4}\x{59D5}\x{59D6}\x{59D7}\x{59D8}\x{59D9}\x{59DA}\x{59DB}\x{59DC}' . + '\x{59DD}\x{59DE}\x{59DF}\x{59E0}\x{59E1}\x{59E2}\x{59E3}\x{59E4}\x{59E5}' . + '\x{59E6}\x{59E8}\x{59E9}\x{59EA}\x{59EB}\x{59EC}\x{59ED}\x{59EE}\x{59EF}' . + '\x{59F0}\x{59F1}\x{59F2}\x{59F3}\x{59F4}\x{59F5}\x{59F6}\x{59F7}\x{59F8}' . + '\x{59F9}\x{59FA}\x{59FB}\x{59FC}\x{59FD}\x{59FE}\x{59FF}\x{5A00}\x{5A01}' . + '\x{5A02}\x{5A03}\x{5A04}\x{5A05}\x{5A06}\x{5A07}\x{5A08}\x{5A09}\x{5A0A}' . + '\x{5A0B}\x{5A0C}\x{5A0D}\x{5A0E}\x{5A0F}\x{5A10}\x{5A11}\x{5A12}\x{5A13}' . + '\x{5A14}\x{5A15}\x{5A16}\x{5A17}\x{5A18}\x{5A19}\x{5A1A}\x{5A1B}\x{5A1C}' . + '\x{5A1D}\x{5A1E}\x{5A1F}\x{5A20}\x{5A21}\x{5A22}\x{5A23}\x{5A25}\x{5A27}' . + '\x{5A28}\x{5A29}\x{5A2A}\x{5A2B}\x{5A2D}\x{5A2E}\x{5A2F}\x{5A31}\x{5A32}' . + '\x{5A33}\x{5A34}\x{5A35}\x{5A36}\x{5A37}\x{5A38}\x{5A39}\x{5A3A}\x{5A3B}' . + '\x{5A3C}\x{5A3D}\x{5A3E}\x{5A3F}\x{5A40}\x{5A41}\x{5A42}\x{5A43}\x{5A44}' . + '\x{5A45}\x{5A46}\x{5A47}\x{5A48}\x{5A49}\x{5A4A}\x{5A4B}\x{5A4C}\x{5A4D}' . + '\x{5A4E}\x{5A4F}\x{5A50}\x{5A51}\x{5A52}\x{5A53}\x{5A55}\x{5A56}\x{5A57}' . + '\x{5A58}\x{5A5A}\x{5A5B}\x{5A5C}\x{5A5D}\x{5A5E}\x{5A5F}\x{5A60}\x{5A61}' . + '\x{5A62}\x{5A63}\x{5A64}\x{5A65}\x{5A66}\x{5A67}\x{5A68}\x{5A69}\x{5A6A}' . + '\x{5A6B}\x{5A6C}\x{5A6D}\x{5A6E}\x{5A70}\x{5A72}\x{5A73}\x{5A74}\x{5A75}' . + '\x{5A76}\x{5A77}\x{5A78}\x{5A79}\x{5A7A}\x{5A7B}\x{5A7C}\x{5A7D}\x{5A7E}' . + '\x{5A7F}\x{5A80}\x{5A81}\x{5A82}\x{5A83}\x{5A84}\x{5A85}\x{5A86}\x{5A88}' . + '\x{5A89}\x{5A8A}\x{5A8B}\x{5A8C}\x{5A8E}\x{5A8F}\x{5A90}\x{5A91}\x{5A92}' . + '\x{5A93}\x{5A94}\x{5A95}\x{5A96}\x{5A97}\x{5A98}\x{5A99}\x{5A9A}\x{5A9B}' . + '\x{5A9C}\x{5A9D}\x{5A9E}\x{5A9F}\x{5AA0}\x{5AA1}\x{5AA2}\x{5AA3}\x{5AA4}' . + '\x{5AA5}\x{5AA6}\x{5AA7}\x{5AA8}\x{5AA9}\x{5AAA}\x{5AAC}\x{5AAD}\x{5AAE}' . + '\x{5AAF}\x{5AB0}\x{5AB1}\x{5AB2}\x{5AB3}\x{5AB4}\x{5AB5}\x{5AB6}\x{5AB7}' . + '\x{5AB8}\x{5AB9}\x{5ABA}\x{5ABB}\x{5ABC}\x{5ABD}\x{5ABE}\x{5ABF}\x{5AC0}' . + '\x{5AC1}\x{5AC2}\x{5AC3}\x{5AC4}\x{5AC5}\x{5AC6}\x{5AC7}\x{5AC8}\x{5AC9}' . + '\x{5ACA}\x{5ACB}\x{5ACC}\x{5ACD}\x{5ACE}\x{5ACF}\x{5AD1}\x{5AD2}\x{5AD4}' . + '\x{5AD5}\x{5AD6}\x{5AD7}\x{5AD8}\x{5AD9}\x{5ADA}\x{5ADB}\x{5ADC}\x{5ADD}' . + '\x{5ADE}\x{5ADF}\x{5AE0}\x{5AE1}\x{5AE2}\x{5AE3}\x{5AE4}\x{5AE5}\x{5AE6}' . + '\x{5AE7}\x{5AE8}\x{5AE9}\x{5AEA}\x{5AEB}\x{5AEC}\x{5AED}\x{5AEE}\x{5AF1}' . + '\x{5AF2}\x{5AF3}\x{5AF4}\x{5AF5}\x{5AF6}\x{5AF7}\x{5AF8}\x{5AF9}\x{5AFA}' . + '\x{5AFB}\x{5AFC}\x{5AFD}\x{5AFE}\x{5AFF}\x{5B00}\x{5B01}\x{5B02}\x{5B03}' . + '\x{5B04}\x{5B05}\x{5B06}\x{5B07}\x{5B08}\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}' . + '\x{5B0F}\x{5B10}\x{5B11}\x{5B12}\x{5B13}\x{5B14}\x{5B15}\x{5B16}\x{5B17}' . + '\x{5B18}\x{5B19}\x{5B1A}\x{5B1B}\x{5B1C}\x{5B1D}\x{5B1E}\x{5B1F}\x{5B20}' . + '\x{5B21}\x{5B22}\x{5B23}\x{5B24}\x{5B25}\x{5B26}\x{5B27}\x{5B28}\x{5B29}' . + '\x{5B2A}\x{5B2B}\x{5B2C}\x{5B2D}\x{5B2E}\x{5B2F}\x{5B30}\x{5B31}\x{5B32}' . + '\x{5B33}\x{5B34}\x{5B35}\x{5B36}\x{5B37}\x{5B38}\x{5B3A}\x{5B3B}\x{5B3C}' . + '\x{5B3D}\x{5B3E}\x{5B3F}\x{5B40}\x{5B41}\x{5B42}\x{5B43}\x{5B44}\x{5B45}' . + '\x{5B47}\x{5B48}\x{5B49}\x{5B4A}\x{5B4B}\x{5B4C}\x{5B4D}\x{5B4E}\x{5B50}' . + '\x{5B51}\x{5B53}\x{5B54}\x{5B55}\x{5B56}\x{5B57}\x{5B58}\x{5B59}\x{5B5A}' . + '\x{5B5B}\x{5B5C}\x{5B5D}\x{5B5E}\x{5B5F}\x{5B62}\x{5B63}\x{5B64}\x{5B65}' . + '\x{5B66}\x{5B67}\x{5B68}\x{5B69}\x{5B6A}\x{5B6B}\x{5B6C}\x{5B6D}\x{5B6E}' . + '\x{5B70}\x{5B71}\x{5B72}\x{5B73}\x{5B74}\x{5B75}\x{5B76}\x{5B77}\x{5B78}' . + '\x{5B7A}\x{5B7B}\x{5B7C}\x{5B7D}\x{5B7F}\x{5B80}\x{5B81}\x{5B82}\x{5B83}' . + '\x{5B84}\x{5B85}\x{5B87}\x{5B88}\x{5B89}\x{5B8A}\x{5B8B}\x{5B8C}\x{5B8D}' . + '\x{5B8E}\x{5B8F}\x{5B91}\x{5B92}\x{5B93}\x{5B94}\x{5B95}\x{5B96}\x{5B97}' . + '\x{5B98}\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9E}\x{5B9F}\x{5BA0}' . + '\x{5BA1}\x{5BA2}\x{5BA3}\x{5BA4}\x{5BA5}\x{5BA6}\x{5BA7}\x{5BA8}\x{5BAA}' . + '\x{5BAB}\x{5BAC}\x{5BAD}\x{5BAE}\x{5BAF}\x{5BB0}\x{5BB1}\x{5BB3}\x{5BB4}' . + '\x{5BB5}\x{5BB6}\x{5BB8}\x{5BB9}\x{5BBA}\x{5BBB}\x{5BBD}\x{5BBE}\x{5BBF}' . + '\x{5BC0}\x{5BC1}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BCA}' . + '\x{5BCB}\x{5BCC}\x{5BCD}\x{5BCE}\x{5BCF}\x{5BD0}\x{5BD1}\x{5BD2}\x{5BD3}' . + '\x{5BD4}\x{5BD5}\x{5BD6}\x{5BD8}\x{5BD9}\x{5BDB}\x{5BDC}\x{5BDD}\x{5BDE}' . + '\x{5BDF}\x{5BE0}\x{5BE1}\x{5BE2}\x{5BE3}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}' . + '\x{5BE8}\x{5BE9}\x{5BEA}\x{5BEB}\x{5BEC}\x{5BED}\x{5BEE}\x{5BEF}\x{5BF0}' . + '\x{5BF1}\x{5BF2}\x{5BF3}\x{5BF4}\x{5BF5}\x{5BF6}\x{5BF7}\x{5BF8}\x{5BF9}' . + '\x{5BFA}\x{5BFB}\x{5BFC}\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}\x{5C04}\x{5C05}' . + '\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}\x{5C0B}\x{5C0C}\x{5C0D}\x{5C0E}' . + '\x{5C0F}\x{5C10}\x{5C11}\x{5C12}\x{5C13}\x{5C14}\x{5C15}\x{5C16}\x{5C17}' . + '\x{5C18}\x{5C19}\x{5C1A}\x{5C1C}\x{5C1D}\x{5C1E}\x{5C1F}\x{5C20}\x{5C21}' . + '\x{5C22}\x{5C24}\x{5C25}\x{5C27}\x{5C28}\x{5C2A}\x{5C2B}\x{5C2C}\x{5C2D}' . + '\x{5C2E}\x{5C2F}\x{5C30}\x{5C31}\x{5C32}\x{5C33}\x{5C34}\x{5C35}\x{5C37}' . + '\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}' . + '\x{5C41}\x{5C42}\x{5C43}\x{5C44}\x{5C45}\x{5C46}\x{5C47}\x{5C48}\x{5C49}' . + '\x{5C4A}\x{5C4B}\x{5C4C}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C52}' . + '\x{5C53}\x{5C54}\x{5C55}\x{5C56}\x{5C57}\x{5C58}\x{5C59}\x{5C5B}\x{5C5C}' . + '\x{5C5D}\x{5C5E}\x{5C5F}\x{5C60}\x{5C61}\x{5C62}\x{5C63}\x{5C64}\x{5C65}' . + '\x{5C66}\x{5C67}\x{5C68}\x{5C69}\x{5C6A}\x{5C6B}\x{5C6C}\x{5C6D}\x{5C6E}' . + '\x{5C6F}\x{5C70}\x{5C71}\x{5C72}\x{5C73}\x{5C74}\x{5C75}\x{5C76}\x{5C77}' . + '\x{5C78}\x{5C79}\x{5C7A}\x{5C7B}\x{5C7C}\x{5C7D}\x{5C7E}\x{5C7F}\x{5C80}' . + '\x{5C81}\x{5C82}\x{5C83}\x{5C84}\x{5C86}\x{5C87}\x{5C88}\x{5C89}\x{5C8A}' . + '\x{5C8B}\x{5C8C}\x{5C8D}\x{5C8E}\x{5C8F}\x{5C90}\x{5C91}\x{5C92}\x{5C93}' . + '\x{5C94}\x{5C95}\x{5C96}\x{5C97}\x{5C98}\x{5C99}\x{5C9A}\x{5C9B}\x{5C9C}' . + '\x{5C9D}\x{5C9E}\x{5C9F}\x{5CA0}\x{5CA1}\x{5CA2}\x{5CA3}\x{5CA4}\x{5CA5}' . + '\x{5CA6}\x{5CA7}\x{5CA8}\x{5CA9}\x{5CAA}\x{5CAB}\x{5CAC}\x{5CAD}\x{5CAE}' . + '\x{5CAF}\x{5CB0}\x{5CB1}\x{5CB2}\x{5CB3}\x{5CB5}\x{5CB6}\x{5CB7}\x{5CB8}' . + '\x{5CBA}\x{5CBB}\x{5CBC}\x{5CBD}\x{5CBE}\x{5CBF}\x{5CC1}\x{5CC2}\x{5CC3}' . + '\x{5CC4}\x{5CC5}\x{5CC6}\x{5CC7}\x{5CC8}\x{5CC9}\x{5CCA}\x{5CCB}\x{5CCC}' . + '\x{5CCD}\x{5CCE}\x{5CCF}\x{5CD0}\x{5CD1}\x{5CD2}\x{5CD3}\x{5CD4}\x{5CD6}' . + '\x{5CD7}\x{5CD8}\x{5CD9}\x{5CDA}\x{5CDB}\x{5CDC}\x{5CDE}\x{5CDF}\x{5CE0}' . + '\x{5CE1}\x{5CE2}\x{5CE3}\x{5CE4}\x{5CE5}\x{5CE6}\x{5CE7}\x{5CE8}\x{5CE9}' . + '\x{5CEA}\x{5CEB}\x{5CEC}\x{5CED}\x{5CEE}\x{5CEF}\x{5CF0}\x{5CF1}\x{5CF2}' . + '\x{5CF3}\x{5CF4}\x{5CF6}\x{5CF7}\x{5CF8}\x{5CF9}\x{5CFA}\x{5CFB}\x{5CFC}' . + '\x{5CFD}\x{5CFE}\x{5CFF}\x{5D00}\x{5D01}\x{5D02}\x{5D03}\x{5D04}\x{5D05}' . + '\x{5D06}\x{5D07}\x{5D08}\x{5D09}\x{5D0A}\x{5D0B}\x{5D0C}\x{5D0D}\x{5D0E}' . + '\x{5D0F}\x{5D10}\x{5D11}\x{5D12}\x{5D13}\x{5D14}\x{5D15}\x{5D16}\x{5D17}' . + '\x{5D18}\x{5D19}\x{5D1A}\x{5D1B}\x{5D1C}\x{5D1D}\x{5D1E}\x{5D1F}\x{5D20}' . + '\x{5D21}\x{5D22}\x{5D23}\x{5D24}\x{5D25}\x{5D26}\x{5D27}\x{5D28}\x{5D29}' . + '\x{5D2A}\x{5D2C}\x{5D2D}\x{5D2E}\x{5D30}\x{5D31}\x{5D32}\x{5D33}\x{5D34}' . + '\x{5D35}\x{5D36}\x{5D37}\x{5D38}\x{5D39}\x{5D3A}\x{5D3C}\x{5D3D}\x{5D3E}' . + '\x{5D3F}\x{5D40}\x{5D41}\x{5D42}\x{5D43}\x{5D44}\x{5D45}\x{5D46}\x{5D47}' . + '\x{5D48}\x{5D49}\x{5D4A}\x{5D4B}\x{5D4C}\x{5D4D}\x{5D4E}\x{5D4F}\x{5D50}' . + '\x{5D51}\x{5D52}\x{5D54}\x{5D55}\x{5D56}\x{5D58}\x{5D59}\x{5D5A}\x{5D5B}' . + '\x{5D5D}\x{5D5E}\x{5D5F}\x{5D61}\x{5D62}\x{5D63}\x{5D64}\x{5D65}\x{5D66}' . + '\x{5D67}\x{5D68}\x{5D69}\x{5D6A}\x{5D6B}\x{5D6C}\x{5D6D}\x{5D6E}\x{5D6F}' . + '\x{5D70}\x{5D71}\x{5D72}\x{5D73}\x{5D74}\x{5D75}\x{5D76}\x{5D77}\x{5D78}' . + '\x{5D79}\x{5D7A}\x{5D7B}\x{5D7C}\x{5D7D}\x{5D7E}\x{5D7F}\x{5D80}\x{5D81}' . + '\x{5D82}\x{5D84}\x{5D85}\x{5D86}\x{5D87}\x{5D88}\x{5D89}\x{5D8A}\x{5D8B}' . + '\x{5D8C}\x{5D8D}\x{5D8E}\x{5D8F}\x{5D90}\x{5D91}\x{5D92}\x{5D93}\x{5D94}' . + '\x{5D95}\x{5D97}\x{5D98}\x{5D99}\x{5D9A}\x{5D9B}\x{5D9C}\x{5D9D}\x{5D9E}' . + '\x{5D9F}\x{5DA0}\x{5DA1}\x{5DA2}\x{5DA5}\x{5DA6}\x{5DA7}\x{5DA8}\x{5DA9}' . + '\x{5DAA}\x{5DAC}\x{5DAD}\x{5DAE}\x{5DAF}\x{5DB0}\x{5DB1}\x{5DB2}\x{5DB4}' . + '\x{5DB5}\x{5DB6}\x{5DB7}\x{5DB8}\x{5DBA}\x{5DBB}\x{5DBC}\x{5DBD}\x{5DBE}' . + '\x{5DBF}\x{5DC0}\x{5DC1}\x{5DC2}\x{5DC3}\x{5DC5}\x{5DC6}\x{5DC7}\x{5DC8}' . + '\x{5DC9}\x{5DCA}\x{5DCB}\x{5DCC}\x{5DCD}\x{5DCE}\x{5DCF}\x{5DD0}\x{5DD1}' . + '\x{5DD2}\x{5DD3}\x{5DD4}\x{5DD5}\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}' . + '\x{5DDE}\x{5DDF}\x{5DE0}\x{5DE1}\x{5DE2}\x{5DE3}\x{5DE4}\x{5DE5}\x{5DE6}' . + '\x{5DE7}\x{5DE8}\x{5DE9}\x{5DEA}\x{5DEB}\x{5DEC}\x{5DED}\x{5DEE}\x{5DEF}' . + '\x{5DF0}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DF8}\x{5DF9}' . + '\x{5DFA}\x{5DFB}\x{5DFC}\x{5DFD}\x{5DFE}\x{5DFF}\x{5E00}\x{5E01}\x{5E02}' . + '\x{5E03}\x{5E04}\x{5E05}\x{5E06}\x{5E07}\x{5E08}\x{5E09}\x{5E0A}\x{5E0B}' . + '\x{5E0C}\x{5E0D}\x{5E0E}\x{5E0F}\x{5E10}\x{5E11}\x{5E13}\x{5E14}\x{5E15}' . + '\x{5E16}\x{5E17}\x{5E18}\x{5E19}\x{5E1A}\x{5E1B}\x{5E1C}\x{5E1D}\x{5E1E}' . + '\x{5E1F}\x{5E20}\x{5E21}\x{5E22}\x{5E23}\x{5E24}\x{5E25}\x{5E26}\x{5E27}' . + '\x{5E28}\x{5E29}\x{5E2A}\x{5E2B}\x{5E2C}\x{5E2D}\x{5E2E}\x{5E2F}\x{5E30}' . + '\x{5E31}\x{5E32}\x{5E33}\x{5E34}\x{5E35}\x{5E36}\x{5E37}\x{5E38}\x{5E39}' . + '\x{5E3A}\x{5E3B}\x{5E3C}\x{5E3D}\x{5E3E}\x{5E40}\x{5E41}\x{5E42}\x{5E43}' . + '\x{5E44}\x{5E45}\x{5E46}\x{5E47}\x{5E49}\x{5E4A}\x{5E4B}\x{5E4C}\x{5E4D}' . + '\x{5E4E}\x{5E4F}\x{5E50}\x{5E52}\x{5E53}\x{5E54}\x{5E55}\x{5E56}\x{5E57}' . + '\x{5E58}\x{5E59}\x{5E5A}\x{5E5B}\x{5E5C}\x{5E5D}\x{5E5E}\x{5E5F}\x{5E60}' . + '\x{5E61}\x{5E62}\x{5E63}\x{5E64}\x{5E65}\x{5E66}\x{5E67}\x{5E68}\x{5E69}' . + '\x{5E6A}\x{5E6B}\x{5E6C}\x{5E6D}\x{5E6E}\x{5E6F}\x{5E70}\x{5E71}\x{5E72}' . + '\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E77}\x{5E78}\x{5E79}\x{5E7A}\x{5E7B}' . + '\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E80}\x{5E81}\x{5E82}\x{5E83}\x{5E84}' . + '\x{5E85}\x{5E86}\x{5E87}\x{5E88}\x{5E89}\x{5E8A}\x{5E8B}\x{5E8C}\x{5E8D}' . + '\x{5E8E}\x{5E8F}\x{5E90}\x{5E91}\x{5E93}\x{5E94}\x{5E95}\x{5E96}\x{5E97}' . + '\x{5E98}\x{5E99}\x{5E9A}\x{5E9B}\x{5E9C}\x{5E9D}\x{5E9E}\x{5E9F}\x{5EA0}' . + '\x{5EA1}\x{5EA2}\x{5EA3}\x{5EA4}\x{5EA5}\x{5EA6}\x{5EA7}\x{5EA8}\x{5EA9}' . + '\x{5EAA}\x{5EAB}\x{5EAC}\x{5EAD}\x{5EAE}\x{5EAF}\x{5EB0}\x{5EB1}\x{5EB2}' . + '\x{5EB3}\x{5EB4}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EB9}\x{5EBB}\x{5EBC}' . + '\x{5EBD}\x{5EBE}\x{5EBF}\x{5EC1}\x{5EC2}\x{5EC3}\x{5EC4}\x{5EC5}\x{5EC6}' . + '\x{5EC7}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECB}\x{5ECC}\x{5ECD}\x{5ECE}\x{5ECF}' . + '\x{5ED0}\x{5ED1}\x{5ED2}\x{5ED3}\x{5ED4}\x{5ED5}\x{5ED6}\x{5ED7}\x{5ED8}' . + '\x{5ED9}\x{5EDA}\x{5EDB}\x{5EDC}\x{5EDD}\x{5EDE}\x{5EDF}\x{5EE0}\x{5EE1}' . + '\x{5EE2}\x{5EE3}\x{5EE4}\x{5EE5}\x{5EE6}\x{5EE7}\x{5EE8}\x{5EE9}\x{5EEA}' . + '\x{5EEC}\x{5EED}\x{5EEE}\x{5EEF}\x{5EF0}\x{5EF1}\x{5EF2}\x{5EF3}\x{5EF4}' . + '\x{5EF5}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}\x{5EFB}\x{5EFC}\x{5EFD}\x{5EFE}' . + '\x{5EFF}\x{5F00}\x{5F01}\x{5F02}\x{5F03}\x{5F04}\x{5F05}\x{5F06}\x{5F07}' . + '\x{5F08}\x{5F0A}\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F11}\x{5F12}\x{5F13}' . + '\x{5F14}\x{5F15}\x{5F16}\x{5F17}\x{5F18}\x{5F19}\x{5F1A}\x{5F1B}\x{5F1C}' . + '\x{5F1D}\x{5F1E}\x{5F1F}\x{5F20}\x{5F21}\x{5F22}\x{5F23}\x{5F24}\x{5F25}' . + '\x{5F26}\x{5F27}\x{5F28}\x{5F29}\x{5F2A}\x{5F2B}\x{5F2C}\x{5F2D}\x{5F2E}' . + '\x{5F2F}\x{5F30}\x{5F31}\x{5F32}\x{5F33}\x{5F34}\x{5F35}\x{5F36}\x{5F37}' . + '\x{5F38}\x{5F39}\x{5F3A}\x{5F3C}\x{5F3E}\x{5F3F}\x{5F40}\x{5F41}\x{5F42}' . + '\x{5F43}\x{5F44}\x{5F45}\x{5F46}\x{5F47}\x{5F48}\x{5F49}\x{5F4A}\x{5F4B}' . + '\x{5F4C}\x{5F4D}\x{5F4E}\x{5F4F}\x{5F50}\x{5F51}\x{5F52}\x{5F53}\x{5F54}' . + '\x{5F55}\x{5F56}\x{5F57}\x{5F58}\x{5F59}\x{5F5A}\x{5F5B}\x{5F5C}\x{5F5D}' . + '\x{5F5E}\x{5F5F}\x{5F60}\x{5F61}\x{5F62}\x{5F63}\x{5F64}\x{5F65}\x{5F66}' . + '\x{5F67}\x{5F68}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}\x{5F6D}\x{5F6E}\x{5F6F}' . + '\x{5F70}\x{5F71}\x{5F72}\x{5F73}\x{5F74}\x{5F75}\x{5F76}\x{5F77}\x{5F78}' . + '\x{5F79}\x{5F7A}\x{5F7B}\x{5F7C}\x{5F7D}\x{5F7E}\x{5F7F}\x{5F80}\x{5F81}' . + '\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F86}\x{5F87}\x{5F88}\x{5F89}\x{5F8A}' . + '\x{5F8B}\x{5F8C}\x{5F8D}\x{5F8E}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F94}' . + '\x{5F95}\x{5F96}\x{5F97}\x{5F98}\x{5F99}\x{5F9B}\x{5F9C}\x{5F9D}\x{5F9E}' . + '\x{5F9F}\x{5FA0}\x{5FA1}\x{5FA2}\x{5FA5}\x{5FA6}\x{5FA7}\x{5FA8}\x{5FA9}' . + '\x{5FAA}\x{5FAB}\x{5FAC}\x{5FAD}\x{5FAE}\x{5FAF}\x{5FB1}\x{5FB2}\x{5FB3}' . + '\x{5FB4}\x{5FB5}\x{5FB6}\x{5FB7}\x{5FB8}\x{5FB9}\x{5FBA}\x{5FBB}\x{5FBC}' . + '\x{5FBD}\x{5FBE}\x{5FBF}\x{5FC0}\x{5FC1}\x{5FC3}\x{5FC4}\x{5FC5}\x{5FC6}' . + '\x{5FC7}\x{5FC8}\x{5FC9}\x{5FCA}\x{5FCB}\x{5FCC}\x{5FCD}\x{5FCF}\x{5FD0}' . + '\x{5FD1}\x{5FD2}\x{5FD3}\x{5FD4}\x{5FD5}\x{5FD6}\x{5FD7}\x{5FD8}\x{5FD9}' . + '\x{5FDA}\x{5FDC}\x{5FDD}\x{5FDE}\x{5FE0}\x{5FE1}\x{5FE3}\x{5FE4}\x{5FE5}' . + '\x{5FE6}\x{5FE7}\x{5FE8}\x{5FE9}\x{5FEA}\x{5FEB}\x{5FED}\x{5FEE}\x{5FEF}' . + '\x{5FF0}\x{5FF1}\x{5FF2}\x{5FF3}\x{5FF4}\x{5FF5}\x{5FF6}\x{5FF7}\x{5FF8}' . + '\x{5FF9}\x{5FFA}\x{5FFB}\x{5FFD}\x{5FFE}\x{5FFF}\x{6000}\x{6001}\x{6002}' . + '\x{6003}\x{6004}\x{6005}\x{6006}\x{6007}\x{6008}\x{6009}\x{600A}\x{600B}' . + '\x{600C}\x{600D}\x{600E}\x{600F}\x{6010}\x{6011}\x{6012}\x{6013}\x{6014}' . + '\x{6015}\x{6016}\x{6017}\x{6018}\x{6019}\x{601A}\x{601B}\x{601C}\x{601D}' . + '\x{601E}\x{601F}\x{6020}\x{6021}\x{6022}\x{6024}\x{6025}\x{6026}\x{6027}' . + '\x{6028}\x{6029}\x{602A}\x{602B}\x{602C}\x{602D}\x{602E}\x{602F}\x{6030}' . + '\x{6031}\x{6032}\x{6033}\x{6034}\x{6035}\x{6036}\x{6037}\x{6038}\x{6039}' . + '\x{603A}\x{603B}\x{603C}\x{603D}\x{603E}\x{603F}\x{6040}\x{6041}\x{6042}' . + '\x{6043}\x{6044}\x{6045}\x{6046}\x{6047}\x{6048}\x{6049}\x{604A}\x{604B}' . + '\x{604C}\x{604D}\x{604E}\x{604F}\x{6050}\x{6051}\x{6052}\x{6053}\x{6054}' . + '\x{6055}\x{6057}\x{6058}\x{6059}\x{605A}\x{605B}\x{605C}\x{605D}\x{605E}' . + '\x{605F}\x{6062}\x{6063}\x{6064}\x{6065}\x{6066}\x{6067}\x{6068}\x{6069}' . + '\x{606A}\x{606B}\x{606C}\x{606D}\x{606E}\x{606F}\x{6070}\x{6072}\x{6073}' . + '\x{6075}\x{6076}\x{6077}\x{6078}\x{6079}\x{607A}\x{607B}\x{607C}\x{607D}' . + '\x{607E}\x{607F}\x{6080}\x{6081}\x{6082}\x{6083}\x{6084}\x{6085}\x{6086}' . + '\x{6087}\x{6088}\x{6089}\x{608A}\x{608B}\x{608C}\x{608D}\x{608E}\x{608F}' . + '\x{6090}\x{6092}\x{6094}\x{6095}\x{6096}\x{6097}\x{6098}\x{6099}\x{609A}' . + '\x{609B}\x{609C}\x{609D}\x{609E}\x{609F}\x{60A0}\x{60A1}\x{60A2}\x{60A3}' . + '\x{60A4}\x{60A6}\x{60A7}\x{60A8}\x{60AA}\x{60AB}\x{60AC}\x{60AD}\x{60AE}' . + '\x{60AF}\x{60B0}\x{60B1}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B7}' . + '\x{60B8}\x{60B9}\x{60BA}\x{60BB}\x{60BC}\x{60BD}\x{60BE}\x{60BF}\x{60C0}' . + '\x{60C1}\x{60C2}\x{60C3}\x{60C4}\x{60C5}\x{60C6}\x{60C7}\x{60C8}\x{60C9}' . + '\x{60CA}\x{60CB}\x{60CC}\x{60CD}\x{60CE}\x{60CF}\x{60D0}\x{60D1}\x{60D3}' . + '\x{60D4}\x{60D5}\x{60D7}\x{60D8}\x{60D9}\x{60DA}\x{60DB}\x{60DC}\x{60DD}' . + '\x{60DF}\x{60E0}\x{60E1}\x{60E2}\x{60E4}\x{60E6}\x{60E7}\x{60E8}\x{60E9}' . + '\x{60EA}\x{60EB}\x{60EC}\x{60ED}\x{60EE}\x{60EF}\x{60F0}\x{60F1}\x{60F2}' . + '\x{60F3}\x{60F4}\x{60F5}\x{60F6}\x{60F7}\x{60F8}\x{60F9}\x{60FA}\x{60FB}' . + '\x{60FC}\x{60FE}\x{60FF}\x{6100}\x{6101}\x{6103}\x{6104}\x{6105}\x{6106}' . + '\x{6108}\x{6109}\x{610A}\x{610B}\x{610C}\x{610D}\x{610E}\x{610F}\x{6110}' . + '\x{6112}\x{6113}\x{6114}\x{6115}\x{6116}\x{6117}\x{6118}\x{6119}\x{611A}' . + '\x{611B}\x{611C}\x{611D}\x{611F}\x{6120}\x{6122}\x{6123}\x{6124}\x{6125}' . + '\x{6126}\x{6127}\x{6128}\x{6129}\x{612A}\x{612B}\x{612C}\x{612D}\x{612E}' . + '\x{612F}\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}\x{613B}\x{613C}' . + '\x{613D}\x{613E}\x{613F}\x{6140}\x{6141}\x{6142}\x{6143}\x{6144}\x{6145}' . + '\x{6146}\x{6147}\x{6148}\x{6149}\x{614A}\x{614B}\x{614C}\x{614D}\x{614E}' . + '\x{614F}\x{6150}\x{6151}\x{6152}\x{6153}\x{6154}\x{6155}\x{6156}\x{6157}' . + '\x{6158}\x{6159}\x{615A}\x{615B}\x{615C}\x{615D}\x{615E}\x{615F}\x{6161}' . + '\x{6162}\x{6163}\x{6164}\x{6165}\x{6166}\x{6167}\x{6168}\x{6169}\x{616A}' . + '\x{616B}\x{616C}\x{616D}\x{616E}\x{6170}\x{6171}\x{6172}\x{6173}\x{6174}' . + '\x{6175}\x{6176}\x{6177}\x{6178}\x{6179}\x{617A}\x{617C}\x{617E}\x{6180}' . + '\x{6181}\x{6182}\x{6183}\x{6184}\x{6185}\x{6187}\x{6188}\x{6189}\x{618A}' . + '\x{618B}\x{618C}\x{618D}\x{618E}\x{618F}\x{6190}\x{6191}\x{6192}\x{6193}' . + '\x{6194}\x{6195}\x{6196}\x{6198}\x{6199}\x{619A}\x{619B}\x{619D}\x{619E}' . + '\x{619F}\x{61A0}\x{61A1}\x{61A2}\x{61A3}\x{61A4}\x{61A5}\x{61A6}\x{61A7}' . + '\x{61A8}\x{61A9}\x{61AA}\x{61AB}\x{61AC}\x{61AD}\x{61AE}\x{61AF}\x{61B0}' . + '\x{61B1}\x{61B2}\x{61B3}\x{61B4}\x{61B5}\x{61B6}\x{61B7}\x{61B8}\x{61BA}' . + '\x{61BC}\x{61BD}\x{61BE}\x{61BF}\x{61C0}\x{61C1}\x{61C2}\x{61C3}\x{61C4}' . + '\x{61C5}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . + '\x{61CE}\x{61CF}\x{61D0}\x{61D1}\x{61D2}\x{61D4}\x{61D6}\x{61D7}\x{61D8}' . + '\x{61D9}\x{61DA}\x{61DB}\x{61DC}\x{61DD}\x{61DE}\x{61DF}\x{61E0}\x{61E1}' . + '\x{61E2}\x{61E3}\x{61E4}\x{61E5}\x{61E6}\x{61E7}\x{61E8}\x{61E9}\x{61EA}' . + '\x{61EB}\x{61ED}\x{61EE}\x{61F0}\x{61F1}\x{61F2}\x{61F3}\x{61F5}\x{61F6}' . + '\x{61F7}\x{61F8}\x{61F9}\x{61FA}\x{61FB}\x{61FC}\x{61FD}\x{61FE}\x{61FF}' . + '\x{6200}\x{6201}\x{6202}\x{6203}\x{6204}\x{6206}\x{6207}\x{6208}\x{6209}' . + '\x{620A}\x{620B}\x{620C}\x{620D}\x{620E}\x{620F}\x{6210}\x{6211}\x{6212}' . + '\x{6213}\x{6214}\x{6215}\x{6216}\x{6217}\x{6218}\x{6219}\x{621A}\x{621B}' . + '\x{621C}\x{621D}\x{621E}\x{621F}\x{6220}\x{6221}\x{6222}\x{6223}\x{6224}' . + '\x{6225}\x{6226}\x{6227}\x{6228}\x{6229}\x{622A}\x{622B}\x{622C}\x{622D}' . + '\x{622E}\x{622F}\x{6230}\x{6231}\x{6232}\x{6233}\x{6234}\x{6236}\x{6237}' . + '\x{6238}\x{623A}\x{623B}\x{623C}\x{623D}\x{623E}\x{623F}\x{6240}\x{6241}' . + '\x{6242}\x{6243}\x{6244}\x{6245}\x{6246}\x{6247}\x{6248}\x{6249}\x{624A}' . + '\x{624B}\x{624C}\x{624D}\x{624E}\x{624F}\x{6250}\x{6251}\x{6252}\x{6253}' . + '\x{6254}\x{6255}\x{6256}\x{6258}\x{6259}\x{625A}\x{625B}\x{625C}\x{625D}' . + '\x{625E}\x{625F}\x{6260}\x{6261}\x{6262}\x{6263}\x{6264}\x{6265}\x{6266}' . + '\x{6267}\x{6268}\x{6269}\x{626A}\x{626B}\x{626C}\x{626D}\x{626E}\x{626F}' . + '\x{6270}\x{6271}\x{6272}\x{6273}\x{6274}\x{6275}\x{6276}\x{6277}\x{6278}' . + '\x{6279}\x{627A}\x{627B}\x{627C}\x{627D}\x{627E}\x{627F}\x{6280}\x{6281}' . + '\x{6283}\x{6284}\x{6285}\x{6286}\x{6287}\x{6288}\x{6289}\x{628A}\x{628B}' . + '\x{628C}\x{628E}\x{628F}\x{6290}\x{6291}\x{6292}\x{6293}\x{6294}\x{6295}' . + '\x{6296}\x{6297}\x{6298}\x{6299}\x{629A}\x{629B}\x{629C}\x{629E}\x{629F}' . + '\x{62A0}\x{62A1}\x{62A2}\x{62A3}\x{62A4}\x{62A5}\x{62A7}\x{62A8}\x{62A9}' . + '\x{62AA}\x{62AB}\x{62AC}\x{62AD}\x{62AE}\x{62AF}\x{62B0}\x{62B1}\x{62B2}' . + '\x{62B3}\x{62B4}\x{62B5}\x{62B6}\x{62B7}\x{62B8}\x{62B9}\x{62BA}\x{62BB}' . + '\x{62BC}\x{62BD}\x{62BE}\x{62BF}\x{62C0}\x{62C1}\x{62C2}\x{62C3}\x{62C4}' . + '\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CB}\x{62CC}\x{62CD}' . + '\x{62CE}\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D5}\x{62D6}' . + '\x{62D7}\x{62D8}\x{62D9}\x{62DA}\x{62DB}\x{62DC}\x{62DD}\x{62DF}\x{62E0}' . + '\x{62E1}\x{62E2}\x{62E3}\x{62E4}\x{62E5}\x{62E6}\x{62E7}\x{62E8}\x{62E9}' . + '\x{62EB}\x{62EC}\x{62ED}\x{62EE}\x{62EF}\x{62F0}\x{62F1}\x{62F2}\x{62F3}' . + '\x{62F4}\x{62F5}\x{62F6}\x{62F7}\x{62F8}\x{62F9}\x{62FA}\x{62FB}\x{62FC}' . + '\x{62FD}\x{62FE}\x{62FF}\x{6300}\x{6301}\x{6302}\x{6303}\x{6304}\x{6305}' . + '\x{6306}\x{6307}\x{6308}\x{6309}\x{630B}\x{630C}\x{630D}\x{630E}\x{630F}' . + '\x{6310}\x{6311}\x{6312}\x{6313}\x{6314}\x{6315}\x{6316}\x{6318}\x{6319}' . + '\x{631A}\x{631B}\x{631C}\x{631D}\x{631E}\x{631F}\x{6320}\x{6321}\x{6322}' . + '\x{6323}\x{6324}\x{6325}\x{6326}\x{6327}\x{6328}\x{6329}\x{632A}\x{632B}' . + '\x{632C}\x{632D}\x{632E}\x{632F}\x{6330}\x{6332}\x{6333}\x{6334}\x{6336}' . + '\x{6338}\x{6339}\x{633A}\x{633B}\x{633C}\x{633D}\x{633E}\x{6340}\x{6341}' . + '\x{6342}\x{6343}\x{6344}\x{6345}\x{6346}\x{6347}\x{6348}\x{6349}\x{634A}' . + '\x{634B}\x{634C}\x{634D}\x{634E}\x{634F}\x{6350}\x{6351}\x{6352}\x{6353}' . + '\x{6354}\x{6355}\x{6356}\x{6357}\x{6358}\x{6359}\x{635A}\x{635C}\x{635D}' . + '\x{635E}\x{635F}\x{6360}\x{6361}\x{6362}\x{6363}\x{6364}\x{6365}\x{6366}' . + '\x{6367}\x{6368}\x{6369}\x{636A}\x{636B}\x{636C}\x{636D}\x{636E}\x{636F}' . + '\x{6370}\x{6371}\x{6372}\x{6373}\x{6374}\x{6375}\x{6376}\x{6377}\x{6378}' . + '\x{6379}\x{637A}\x{637B}\x{637C}\x{637D}\x{637E}\x{6380}\x{6381}\x{6382}' . + '\x{6383}\x{6384}\x{6385}\x{6386}\x{6387}\x{6388}\x{6389}\x{638A}\x{638C}' . + '\x{638D}\x{638E}\x{638F}\x{6390}\x{6391}\x{6392}\x{6394}\x{6395}\x{6396}' . + '\x{6397}\x{6398}\x{6399}\x{639A}\x{639B}\x{639C}\x{639D}\x{639E}\x{639F}' . + '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A4}\x{63A5}\x{63A6}\x{63A7}\x{63A8}' . + '\x{63A9}\x{63AA}\x{63AB}\x{63AC}\x{63AD}\x{63AE}\x{63AF}\x{63B0}\x{63B1}' . + '\x{63B2}\x{63B3}\x{63B4}\x{63B5}\x{63B6}\x{63B7}\x{63B8}\x{63B9}\x{63BA}' . + '\x{63BC}\x{63BD}\x{63BE}\x{63BF}\x{63C0}\x{63C1}\x{63C2}\x{63C3}\x{63C4}' . + '\x{63C5}\x{63C6}\x{63C7}\x{63C8}\x{63C9}\x{63CA}\x{63CB}\x{63CC}\x{63CD}' . + '\x{63CE}\x{63CF}\x{63D0}\x{63D2}\x{63D3}\x{63D4}\x{63D5}\x{63D6}\x{63D7}' . + '\x{63D8}\x{63D9}\x{63DA}\x{63DB}\x{63DC}\x{63DD}\x{63DE}\x{63DF}\x{63E0}' . + '\x{63E1}\x{63E2}\x{63E3}\x{63E4}\x{63E5}\x{63E6}\x{63E7}\x{63E8}\x{63E9}' . + '\x{63EA}\x{63EB}\x{63EC}\x{63ED}\x{63EE}\x{63EF}\x{63F0}\x{63F1}\x{63F2}' . + '\x{63F3}\x{63F4}\x{63F5}\x{63F6}\x{63F7}\x{63F8}\x{63F9}\x{63FA}\x{63FB}' . + '\x{63FC}\x{63FD}\x{63FE}\x{63FF}\x{6400}\x{6401}\x{6402}\x{6403}\x{6404}' . + '\x{6405}\x{6406}\x{6408}\x{6409}\x{640A}\x{640B}\x{640C}\x{640D}\x{640E}' . + '\x{640F}\x{6410}\x{6411}\x{6412}\x{6413}\x{6414}\x{6415}\x{6416}\x{6417}' . + '\x{6418}\x{6419}\x{641A}\x{641B}\x{641C}\x{641D}\x{641E}\x{641F}\x{6420}' . + '\x{6421}\x{6422}\x{6423}\x{6424}\x{6425}\x{6426}\x{6427}\x{6428}\x{6429}' . + '\x{642A}\x{642B}\x{642C}\x{642D}\x{642E}\x{642F}\x{6430}\x{6431}\x{6432}' . + '\x{6433}\x{6434}\x{6435}\x{6436}\x{6437}\x{6438}\x{6439}\x{643A}\x{643D}' . + '\x{643E}\x{643F}\x{6440}\x{6441}\x{6443}\x{6444}\x{6445}\x{6446}\x{6447}' . + '\x{6448}\x{644A}\x{644B}\x{644C}\x{644D}\x{644E}\x{644F}\x{6450}\x{6451}' . + '\x{6452}\x{6453}\x{6454}\x{6455}\x{6456}\x{6457}\x{6458}\x{6459}\x{645B}' . + '\x{645C}\x{645D}\x{645E}\x{645F}\x{6460}\x{6461}\x{6462}\x{6463}\x{6464}' . + '\x{6465}\x{6466}\x{6467}\x{6468}\x{6469}\x{646A}\x{646B}\x{646C}\x{646D}' . + '\x{646E}\x{646F}\x{6470}\x{6471}\x{6472}\x{6473}\x{6474}\x{6475}\x{6476}' . + '\x{6477}\x{6478}\x{6479}\x{647A}\x{647B}\x{647C}\x{647D}\x{647F}\x{6480}' . + '\x{6481}\x{6482}\x{6483}\x{6484}\x{6485}\x{6487}\x{6488}\x{6489}\x{648A}' . + '\x{648B}\x{648C}\x{648D}\x{648E}\x{648F}\x{6490}\x{6491}\x{6492}\x{6493}' . + '\x{6494}\x{6495}\x{6496}\x{6497}\x{6498}\x{6499}\x{649A}\x{649B}\x{649C}' . + '\x{649D}\x{649E}\x{649F}\x{64A0}\x{64A2}\x{64A3}\x{64A4}\x{64A5}\x{64A6}' . + '\x{64A7}\x{64A8}\x{64A9}\x{64AA}\x{64AB}\x{64AC}\x{64AD}\x{64AE}\x{64B0}' . + '\x{64B1}\x{64B2}\x{64B3}\x{64B4}\x{64B5}\x{64B7}\x{64B8}\x{64B9}\x{64BA}' . + '\x{64BB}\x{64BC}\x{64BD}\x{64BE}\x{64BF}\x{64C0}\x{64C1}\x{64C2}\x{64C3}' . + '\x{64C4}\x{64C5}\x{64C6}\x{64C7}\x{64C9}\x{64CA}\x{64CB}\x{64CC}\x{64CD}' . + '\x{64CE}\x{64CF}\x{64D0}\x{64D1}\x{64D2}\x{64D3}\x{64D4}\x{64D6}\x{64D7}' . + '\x{64D8}\x{64D9}\x{64DA}\x{64DB}\x{64DC}\x{64DD}\x{64DE}\x{64DF}\x{64E0}' . + '\x{64E2}\x{64E3}\x{64E4}\x{64E6}\x{64E7}\x{64E8}\x{64E9}\x{64EA}\x{64EB}' . + '\x{64EC}\x{64ED}\x{64EF}\x{64F0}\x{64F1}\x{64F2}\x{64F3}\x{64F4}\x{64F6}' . + '\x{64F7}\x{64F8}\x{64FA}\x{64FB}\x{64FC}\x{64FD}\x{64FE}\x{64FF}\x{6500}' . + '\x{6501}\x{6503}\x{6504}\x{6505}\x{6506}\x{6507}\x{6508}\x{6509}\x{650B}' . + '\x{650C}\x{650D}\x{650E}\x{650F}\x{6510}\x{6511}\x{6512}\x{6513}\x{6514}' . + '\x{6515}\x{6516}\x{6517}\x{6518}\x{6519}\x{651A}\x{651B}\x{651C}\x{651D}' . + '\x{651E}\x{6520}\x{6521}\x{6522}\x{6523}\x{6524}\x{6525}\x{6526}\x{6527}' . + '\x{6529}\x{652A}\x{652B}\x{652C}\x{652D}\x{652E}\x{652F}\x{6530}\x{6531}' . + '\x{6532}\x{6533}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}\x{653A}' . + '\x{653B}\x{653C}\x{653D}\x{653E}\x{653F}\x{6541}\x{6543}\x{6544}\x{6545}' . + '\x{6546}\x{6547}\x{6548}\x{6549}\x{654A}\x{654B}\x{654C}\x{654D}\x{654E}' . + '\x{654F}\x{6550}\x{6551}\x{6552}\x{6553}\x{6554}\x{6555}\x{6556}\x{6557}' . + '\x{6558}\x{6559}\x{655B}\x{655C}\x{655D}\x{655E}\x{6560}\x{6561}\x{6562}' . + '\x{6563}\x{6564}\x{6565}\x{6566}\x{6567}\x{6568}\x{6569}\x{656A}\x{656B}' . + '\x{656C}\x{656E}\x{656F}\x{6570}\x{6571}\x{6572}\x{6573}\x{6574}\x{6575}' . + '\x{6576}\x{6577}\x{6578}\x{6579}\x{657A}\x{657B}\x{657C}\x{657E}\x{657F}' . + '\x{6580}\x{6581}\x{6582}\x{6583}\x{6584}\x{6585}\x{6586}\x{6587}\x{6588}' . + '\x{6589}\x{658B}\x{658C}\x{658D}\x{658E}\x{658F}\x{6590}\x{6591}\x{6592}' . + '\x{6593}\x{6594}\x{6595}\x{6596}\x{6597}\x{6598}\x{6599}\x{659B}\x{659C}' . + '\x{659D}\x{659E}\x{659F}\x{65A0}\x{65A1}\x{65A2}\x{65A3}\x{65A4}\x{65A5}' . + '\x{65A6}\x{65A7}\x{65A8}\x{65A9}\x{65AA}\x{65AB}\x{65AC}\x{65AD}\x{65AE}' . + '\x{65AF}\x{65B0}\x{65B1}\x{65B2}\x{65B3}\x{65B4}\x{65B6}\x{65B7}\x{65B8}' . + '\x{65B9}\x{65BA}\x{65BB}\x{65BC}\x{65BD}\x{65BF}\x{65C0}\x{65C1}\x{65C2}' . + '\x{65C3}\x{65C4}\x{65C5}\x{65C6}\x{65C7}\x{65CA}\x{65CB}\x{65CC}\x{65CD}' . + '\x{65CE}\x{65CF}\x{65D0}\x{65D2}\x{65D3}\x{65D4}\x{65D5}\x{65D6}\x{65D7}' . + '\x{65DA}\x{65DB}\x{65DD}\x{65DE}\x{65DF}\x{65E0}\x{65E1}\x{65E2}\x{65E3}' . + '\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}\x{65EB}\x{65EC}\x{65ED}\x{65EE}' . + '\x{65EF}\x{65F0}\x{65F1}\x{65F2}\x{65F3}\x{65F4}\x{65F5}\x{65F6}\x{65F7}' . + '\x{65F8}\x{65FA}\x{65FB}\x{65FC}\x{65FD}\x{6600}\x{6601}\x{6602}\x{6603}' . + '\x{6604}\x{6605}\x{6606}\x{6607}\x{6608}\x{6609}\x{660A}\x{660B}\x{660C}' . + '\x{660D}\x{660E}\x{660F}\x{6610}\x{6611}\x{6612}\x{6613}\x{6614}\x{6615}' . + '\x{6616}\x{6618}\x{6619}\x{661A}\x{661B}\x{661C}\x{661D}\x{661F}\x{6620}' . + '\x{6621}\x{6622}\x{6623}\x{6624}\x{6625}\x{6626}\x{6627}\x{6628}\x{6629}' . + '\x{662A}\x{662B}\x{662D}\x{662E}\x{662F}\x{6630}\x{6631}\x{6632}\x{6633}' . + '\x{6634}\x{6635}\x{6636}\x{6639}\x{663A}\x{663C}\x{663D}\x{663E}\x{6640}' . + '\x{6641}\x{6642}\x{6643}\x{6644}\x{6645}\x{6646}\x{6647}\x{6649}\x{664A}' . + '\x{664B}\x{664C}\x{664E}\x{664F}\x{6650}\x{6651}\x{6652}\x{6653}\x{6654}' . + '\x{6655}\x{6656}\x{6657}\x{6658}\x{6659}\x{665A}\x{665B}\x{665C}\x{665D}' . + '\x{665E}\x{665F}\x{6661}\x{6662}\x{6664}\x{6665}\x{6666}\x{6668}\x{6669}' . + '\x{666A}\x{666B}\x{666C}\x{666D}\x{666E}\x{666F}\x{6670}\x{6671}\x{6672}' . + '\x{6673}\x{6674}\x{6675}\x{6676}\x{6677}\x{6678}\x{6679}\x{667A}\x{667B}' . + '\x{667C}\x{667D}\x{667E}\x{667F}\x{6680}\x{6681}\x{6682}\x{6683}\x{6684}' . + '\x{6685}\x{6686}\x{6687}\x{6688}\x{6689}\x{668A}\x{668B}\x{668C}\x{668D}' . + '\x{668E}\x{668F}\x{6690}\x{6691}\x{6693}\x{6694}\x{6695}\x{6696}\x{6697}' . + '\x{6698}\x{6699}\x{669A}\x{669B}\x{669D}\x{669F}\x{66A0}\x{66A1}\x{66A2}' . + '\x{66A3}\x{66A4}\x{66A5}\x{66A6}\x{66A7}\x{66A8}\x{66A9}\x{66AA}\x{66AB}' . + '\x{66AE}\x{66AF}\x{66B0}\x{66B1}\x{66B2}\x{66B3}\x{66B4}\x{66B5}\x{66B6}' . + '\x{66B7}\x{66B8}\x{66B9}\x{66BA}\x{66BB}\x{66BC}\x{66BD}\x{66BE}\x{66BF}' . + '\x{66C0}\x{66C1}\x{66C2}\x{66C3}\x{66C4}\x{66C5}\x{66C6}\x{66C7}\x{66C8}' . + '\x{66C9}\x{66CA}\x{66CB}\x{66CC}\x{66CD}\x{66CE}\x{66CF}\x{66D1}\x{66D2}' . + '\x{66D4}\x{66D5}\x{66D6}\x{66D8}\x{66D9}\x{66DA}\x{66DB}\x{66DC}\x{66DD}' . + '\x{66DE}\x{66E0}\x{66E1}\x{66E2}\x{66E3}\x{66E4}\x{66E5}\x{66E6}\x{66E7}' . + '\x{66E8}\x{66E9}\x{66EA}\x{66EB}\x{66EC}\x{66ED}\x{66EE}\x{66F0}\x{66F1}' . + '\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F6}\x{66F7}\x{66F8}\x{66F9}\x{66FA}' . + '\x{66FB}\x{66FC}\x{66FE}\x{66FF}\x{6700}\x{6701}\x{6703}\x{6704}\x{6705}' . + '\x{6706}\x{6708}\x{6709}\x{670A}\x{670B}\x{670C}\x{670D}\x{670E}\x{670F}' . + '\x{6710}\x{6711}\x{6712}\x{6713}\x{6714}\x{6715}\x{6716}\x{6717}\x{6718}' . + '\x{671A}\x{671B}\x{671C}\x{671D}\x{671E}\x{671F}\x{6720}\x{6721}\x{6722}' . + '\x{6723}\x{6725}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}\x{672D}' . + '\x{672E}\x{672F}\x{6730}\x{6731}\x{6732}\x{6733}\x{6734}\x{6735}\x{6736}' . + '\x{6737}\x{6738}\x{6739}\x{673A}\x{673B}\x{673C}\x{673D}\x{673E}\x{673F}' . + '\x{6740}\x{6741}\x{6742}\x{6743}\x{6744}\x{6745}\x{6746}\x{6747}\x{6748}' . + '\x{6749}\x{674A}\x{674B}\x{674C}\x{674D}\x{674E}\x{674F}\x{6750}\x{6751}' . + '\x{6752}\x{6753}\x{6754}\x{6755}\x{6756}\x{6757}\x{6758}\x{6759}\x{675A}' . + '\x{675B}\x{675C}\x{675D}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . + '\x{6764}\x{6765}\x{6766}\x{6768}\x{6769}\x{676A}\x{676B}\x{676C}\x{676D}' . + '\x{676E}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}\x{6774}\x{6775}\x{6776}' . + '\x{6777}\x{6778}\x{6779}\x{677A}\x{677B}\x{677C}\x{677D}\x{677E}\x{677F}' . + '\x{6780}\x{6781}\x{6782}\x{6783}\x{6784}\x{6785}\x{6786}\x{6787}\x{6789}' . + '\x{678A}\x{678B}\x{678C}\x{678D}\x{678E}\x{678F}\x{6790}\x{6791}\x{6792}' . + '\x{6793}\x{6794}\x{6795}\x{6797}\x{6798}\x{6799}\x{679A}\x{679B}\x{679C}' . + '\x{679D}\x{679E}\x{679F}\x{67A0}\x{67A1}\x{67A2}\x{67A3}\x{67A4}\x{67A5}' . + '\x{67A6}\x{67A7}\x{67A8}\x{67AA}\x{67AB}\x{67AC}\x{67AD}\x{67AE}\x{67AF}' . + '\x{67B0}\x{67B1}\x{67B2}\x{67B3}\x{67B4}\x{67B5}\x{67B6}\x{67B7}\x{67B8}' . + '\x{67B9}\x{67BA}\x{67BB}\x{67BC}\x{67BE}\x{67C0}\x{67C1}\x{67C2}\x{67C3}' . + '\x{67C4}\x{67C5}\x{67C6}\x{67C7}\x{67C8}\x{67C9}\x{67CA}\x{67CB}\x{67CC}' . + '\x{67CD}\x{67CE}\x{67CF}\x{67D0}\x{67D1}\x{67D2}\x{67D3}\x{67D4}\x{67D6}' . + '\x{67D8}\x{67D9}\x{67DA}\x{67DB}\x{67DC}\x{67DD}\x{67DE}\x{67DF}\x{67E0}' . + '\x{67E1}\x{67E2}\x{67E3}\x{67E4}\x{67E5}\x{67E6}\x{67E7}\x{67E8}\x{67E9}' . + '\x{67EA}\x{67EB}\x{67EC}\x{67ED}\x{67EE}\x{67EF}\x{67F0}\x{67F1}\x{67F2}' . + '\x{67F3}\x{67F4}\x{67F5}\x{67F6}\x{67F7}\x{67F8}\x{67FA}\x{67FB}\x{67FC}' . + '\x{67FD}\x{67FE}\x{67FF}\x{6800}\x{6802}\x{6803}\x{6804}\x{6805}\x{6806}' . + '\x{6807}\x{6808}\x{6809}\x{680A}\x{680B}\x{680C}\x{680D}\x{680E}\x{680F}' . + '\x{6810}\x{6811}\x{6812}\x{6813}\x{6814}\x{6816}\x{6817}\x{6818}\x{6819}' . + '\x{681A}\x{681B}\x{681C}\x{681D}\x{681F}\x{6820}\x{6821}\x{6822}\x{6823}' . + '\x{6824}\x{6825}\x{6826}\x{6828}\x{6829}\x{682A}\x{682B}\x{682C}\x{682D}' . + '\x{682E}\x{682F}\x{6831}\x{6832}\x{6833}\x{6834}\x{6835}\x{6836}\x{6837}' . + '\x{6838}\x{6839}\x{683A}\x{683B}\x{683C}\x{683D}\x{683E}\x{683F}\x{6840}' . + '\x{6841}\x{6842}\x{6843}\x{6844}\x{6845}\x{6846}\x{6847}\x{6848}\x{6849}' . + '\x{684A}\x{684B}\x{684C}\x{684D}\x{684E}\x{684F}\x{6850}\x{6851}\x{6852}' . + '\x{6853}\x{6854}\x{6855}\x{6856}\x{6857}\x{685B}\x{685D}\x{6860}\x{6861}' . + '\x{6862}\x{6863}\x{6864}\x{6865}\x{6866}\x{6867}\x{6868}\x{6869}\x{686A}' . + '\x{686B}\x{686C}\x{686D}\x{686E}\x{686F}\x{6870}\x{6871}\x{6872}\x{6873}' . + '\x{6874}\x{6875}\x{6876}\x{6877}\x{6878}\x{6879}\x{687B}\x{687C}\x{687D}' . + '\x{687E}\x{687F}\x{6880}\x{6881}\x{6882}\x{6883}\x{6884}\x{6885}\x{6886}' . + '\x{6887}\x{6888}\x{6889}\x{688A}\x{688B}\x{688C}\x{688D}\x{688E}\x{688F}' . + '\x{6890}\x{6891}\x{6892}\x{6893}\x{6894}\x{6896}\x{6897}\x{6898}\x{689A}' . + '\x{689B}\x{689C}\x{689D}\x{689E}\x{689F}\x{68A0}\x{68A1}\x{68A2}\x{68A3}' . + '\x{68A4}\x{68A6}\x{68A7}\x{68A8}\x{68A9}\x{68AA}\x{68AB}\x{68AC}\x{68AD}' . + '\x{68AE}\x{68AF}\x{68B0}\x{68B1}\x{68B2}\x{68B3}\x{68B4}\x{68B5}\x{68B6}' . + '\x{68B7}\x{68B9}\x{68BB}\x{68BC}\x{68BD}\x{68BE}\x{68BF}\x{68C0}\x{68C1}' . + '\x{68C2}\x{68C4}\x{68C6}\x{68C7}\x{68C8}\x{68C9}\x{68CA}\x{68CB}\x{68CC}' . + '\x{68CD}\x{68CE}\x{68CF}\x{68D0}\x{68D1}\x{68D2}\x{68D3}\x{68D4}\x{68D5}' . + '\x{68D6}\x{68D7}\x{68D8}\x{68DA}\x{68DB}\x{68DC}\x{68DD}\x{68DE}\x{68DF}' . + '\x{68E0}\x{68E1}\x{68E3}\x{68E4}\x{68E6}\x{68E7}\x{68E8}\x{68E9}\x{68EA}' . + '\x{68EB}\x{68EC}\x{68ED}\x{68EE}\x{68EF}\x{68F0}\x{68F1}\x{68F2}\x{68F3}' . + '\x{68F4}\x{68F5}\x{68F6}\x{68F7}\x{68F8}\x{68F9}\x{68FA}\x{68FB}\x{68FC}' . + '\x{68FD}\x{68FE}\x{68FF}\x{6901}\x{6902}\x{6903}\x{6904}\x{6905}\x{6906}' . + '\x{6907}\x{6908}\x{690A}\x{690B}\x{690C}\x{690D}\x{690E}\x{690F}\x{6910}' . + '\x{6911}\x{6912}\x{6913}\x{6914}\x{6915}\x{6916}\x{6917}\x{6918}\x{6919}' . + '\x{691A}\x{691B}\x{691C}\x{691D}\x{691E}\x{691F}\x{6920}\x{6921}\x{6922}' . + '\x{6923}\x{6924}\x{6925}\x{6926}\x{6927}\x{6928}\x{6929}\x{692A}\x{692B}' . + '\x{692C}\x{692D}\x{692E}\x{692F}\x{6930}\x{6931}\x{6932}\x{6933}\x{6934}' . + '\x{6935}\x{6936}\x{6937}\x{6938}\x{6939}\x{693A}\x{693B}\x{693C}\x{693D}' . + '\x{693F}\x{6940}\x{6941}\x{6942}\x{6943}\x{6944}\x{6945}\x{6946}\x{6947}' . + '\x{6948}\x{6949}\x{694A}\x{694B}\x{694C}\x{694E}\x{694F}\x{6950}\x{6951}' . + '\x{6952}\x{6953}\x{6954}\x{6955}\x{6956}\x{6957}\x{6958}\x{6959}\x{695A}' . + '\x{695B}\x{695C}\x{695D}\x{695E}\x{695F}\x{6960}\x{6961}\x{6962}\x{6963}' . + '\x{6964}\x{6965}\x{6966}\x{6967}\x{6968}\x{6969}\x{696A}\x{696B}\x{696C}' . + '\x{696D}\x{696E}\x{696F}\x{6970}\x{6971}\x{6972}\x{6973}\x{6974}\x{6975}' . + '\x{6976}\x{6977}\x{6978}\x{6979}\x{697A}\x{697B}\x{697C}\x{697D}\x{697E}' . + '\x{697F}\x{6980}\x{6981}\x{6982}\x{6983}\x{6984}\x{6985}\x{6986}\x{6987}' . + '\x{6988}\x{6989}\x{698A}\x{698B}\x{698C}\x{698D}\x{698E}\x{698F}\x{6990}' . + '\x{6991}\x{6992}\x{6993}\x{6994}\x{6995}\x{6996}\x{6997}\x{6998}\x{6999}' . + '\x{699A}\x{699B}\x{699C}\x{699D}\x{699E}\x{69A0}\x{69A1}\x{69A3}\x{69A4}' . + '\x{69A5}\x{69A6}\x{69A7}\x{69A8}\x{69A9}\x{69AA}\x{69AB}\x{69AC}\x{69AD}' . + '\x{69AE}\x{69AF}\x{69B0}\x{69B1}\x{69B2}\x{69B3}\x{69B4}\x{69B5}\x{69B6}' . + '\x{69B7}\x{69B8}\x{69B9}\x{69BA}\x{69BB}\x{69BC}\x{69BD}\x{69BE}\x{69BF}' . + '\x{69C1}\x{69C2}\x{69C3}\x{69C4}\x{69C5}\x{69C6}\x{69C7}\x{69C8}\x{69C9}' . + '\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}\x{69CF}\x{69D0}\x{69D3}\x{69D4}' . + '\x{69D8}\x{69D9}\x{69DA}\x{69DB}\x{69DC}\x{69DD}\x{69DE}\x{69DF}\x{69E0}' . + '\x{69E1}\x{69E2}\x{69E3}\x{69E4}\x{69E5}\x{69E6}\x{69E7}\x{69E8}\x{69E9}' . + '\x{69EA}\x{69EB}\x{69EC}\x{69ED}\x{69EE}\x{69EF}\x{69F0}\x{69F1}\x{69F2}' . + '\x{69F3}\x{69F4}\x{69F5}\x{69F6}\x{69F7}\x{69F8}\x{69FA}\x{69FB}\x{69FC}' . + '\x{69FD}\x{69FE}\x{69FF}\x{6A00}\x{6A01}\x{6A02}\x{6A04}\x{6A05}\x{6A06}' . + '\x{6A07}\x{6A08}\x{6A09}\x{6A0A}\x{6A0B}\x{6A0D}\x{6A0E}\x{6A0F}\x{6A10}' . + '\x{6A11}\x{6A12}\x{6A13}\x{6A14}\x{6A15}\x{6A16}\x{6A17}\x{6A18}\x{6A19}' . + '\x{6A1A}\x{6A1B}\x{6A1D}\x{6A1E}\x{6A1F}\x{6A20}\x{6A21}\x{6A22}\x{6A23}' . + '\x{6A25}\x{6A26}\x{6A27}\x{6A28}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2C}\x{6A2D}' . + '\x{6A2E}\x{6A2F}\x{6A30}\x{6A31}\x{6A32}\x{6A33}\x{6A34}\x{6A35}\x{6A36}' . + '\x{6A38}\x{6A39}\x{6A3A}\x{6A3B}\x{6A3C}\x{6A3D}\x{6A3E}\x{6A3F}\x{6A40}' . + '\x{6A41}\x{6A42}\x{6A43}\x{6A44}\x{6A45}\x{6A46}\x{6A47}\x{6A48}\x{6A49}' . + '\x{6A4B}\x{6A4C}\x{6A4D}\x{6A4E}\x{6A4F}\x{6A50}\x{6A51}\x{6A52}\x{6A54}' . + '\x{6A55}\x{6A56}\x{6A57}\x{6A58}\x{6A59}\x{6A5A}\x{6A5B}\x{6A5D}\x{6A5E}' . + '\x{6A5F}\x{6A60}\x{6A61}\x{6A62}\x{6A63}\x{6A64}\x{6A65}\x{6A66}\x{6A67}' . + '\x{6A68}\x{6A69}\x{6A6A}\x{6A6B}\x{6A6C}\x{6A6D}\x{6A6F}\x{6A71}\x{6A72}' . + '\x{6A73}\x{6A74}\x{6A75}\x{6A76}\x{6A77}\x{6A78}\x{6A79}\x{6A7A}\x{6A7B}' . + '\x{6A7C}\x{6A7D}\x{6A7E}\x{6A7F}\x{6A80}\x{6A81}\x{6A82}\x{6A83}\x{6A84}' . + '\x{6A85}\x{6A87}\x{6A88}\x{6A89}\x{6A8B}\x{6A8C}\x{6A8D}\x{6A8E}\x{6A90}' . + '\x{6A91}\x{6A92}\x{6A93}\x{6A94}\x{6A95}\x{6A96}\x{6A97}\x{6A98}\x{6A9A}' . + '\x{6A9B}\x{6A9C}\x{6A9E}\x{6A9F}\x{6AA0}\x{6AA1}\x{6AA2}\x{6AA3}\x{6AA4}' . + '\x{6AA5}\x{6AA6}\x{6AA7}\x{6AA8}\x{6AA9}\x{6AAB}\x{6AAC}\x{6AAD}\x{6AAE}' . + '\x{6AAF}\x{6AB0}\x{6AB2}\x{6AB3}\x{6AB4}\x{6AB5}\x{6AB6}\x{6AB7}\x{6AB8}' . + '\x{6AB9}\x{6ABA}\x{6ABB}\x{6ABC}\x{6ABD}\x{6ABF}\x{6AC1}\x{6AC2}\x{6AC3}' . + '\x{6AC5}\x{6AC6}\x{6AC7}\x{6ACA}\x{6ACB}\x{6ACC}\x{6ACD}\x{6ACE}\x{6ACF}' . + '\x{6AD0}\x{6AD1}\x{6AD2}\x{6AD3}\x{6AD4}\x{6AD5}\x{6AD6}\x{6AD7}\x{6AD9}' . + '\x{6ADA}\x{6ADB}\x{6ADC}\x{6ADD}\x{6ADE}\x{6ADF}\x{6AE0}\x{6AE1}\x{6AE2}' . + '\x{6AE3}\x{6AE4}\x{6AE5}\x{6AE6}\x{6AE7}\x{6AE8}\x{6AEA}\x{6AEB}\x{6AEC}' . + '\x{6AED}\x{6AEE}\x{6AEF}\x{6AF0}\x{6AF1}\x{6AF2}\x{6AF3}\x{6AF4}\x{6AF5}' . + '\x{6AF6}\x{6AF7}\x{6AF8}\x{6AF9}\x{6AFA}\x{6AFB}\x{6AFC}\x{6AFD}\x{6AFE}' . + '\x{6AFF}\x{6B00}\x{6B01}\x{6B02}\x{6B03}\x{6B04}\x{6B05}\x{6B06}\x{6B07}' . + '\x{6B08}\x{6B09}\x{6B0A}\x{6B0B}\x{6B0C}\x{6B0D}\x{6B0F}\x{6B10}\x{6B11}' . + '\x{6B12}\x{6B13}\x{6B14}\x{6B15}\x{6B16}\x{6B17}\x{6B18}\x{6B19}\x{6B1A}' . + '\x{6B1C}\x{6B1D}\x{6B1E}\x{6B1F}\x{6B20}\x{6B21}\x{6B22}\x{6B23}\x{6B24}' . + '\x{6B25}\x{6B26}\x{6B27}\x{6B28}\x{6B29}\x{6B2A}\x{6B2B}\x{6B2C}\x{6B2D}' . + '\x{6B2F}\x{6B30}\x{6B31}\x{6B32}\x{6B33}\x{6B34}\x{6B36}\x{6B37}\x{6B38}' . + '\x{6B39}\x{6B3A}\x{6B3B}\x{6B3C}\x{6B3D}\x{6B3E}\x{6B3F}\x{6B41}\x{6B42}' . + '\x{6B43}\x{6B44}\x{6B45}\x{6B46}\x{6B47}\x{6B48}\x{6B49}\x{6B4A}\x{6B4B}' . + '\x{6B4C}\x{6B4D}\x{6B4E}\x{6B4F}\x{6B50}\x{6B51}\x{6B52}\x{6B53}\x{6B54}' . + '\x{6B55}\x{6B56}\x{6B59}\x{6B5A}\x{6B5B}\x{6B5C}\x{6B5E}\x{6B5F}\x{6B60}' . + '\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B65}\x{6B66}\x{6B67}\x{6B69}\x{6B6A}' . + '\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}\x{6B73}\x{6B74}\x{6B76}\x{6B77}' . + '\x{6B78}\x{6B79}\x{6B7A}\x{6B7B}\x{6B7C}\x{6B7E}\x{6B7F}\x{6B80}\x{6B81}' . + '\x{6B82}\x{6B83}\x{6B84}\x{6B85}\x{6B86}\x{6B87}\x{6B88}\x{6B89}\x{6B8A}' . + '\x{6B8B}\x{6B8C}\x{6B8D}\x{6B8E}\x{6B8F}\x{6B90}\x{6B91}\x{6B92}\x{6B93}' . + '\x{6B94}\x{6B95}\x{6B96}\x{6B97}\x{6B98}\x{6B99}\x{6B9A}\x{6B9B}\x{6B9C}' . + '\x{6B9D}\x{6B9E}\x{6B9F}\x{6BA0}\x{6BA1}\x{6BA2}\x{6BA3}\x{6BA4}\x{6BA5}' . + '\x{6BA6}\x{6BA7}\x{6BA8}\x{6BA9}\x{6BAA}\x{6BAB}\x{6BAC}\x{6BAD}\x{6BAE}' . + '\x{6BAF}\x{6BB0}\x{6BB2}\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB6}\x{6BB7}\x{6BB9}' . + '\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBD}\x{6BBE}\x{6BBF}\x{6BC0}\x{6BC1}\x{6BC2}' . + '\x{6BC3}\x{6BC4}\x{6BC5}\x{6BC6}\x{6BC7}\x{6BC8}\x{6BC9}\x{6BCA}\x{6BCB}' . + '\x{6BCC}\x{6BCD}\x{6BCE}\x{6BCF}\x{6BD0}\x{6BD1}\x{6BD2}\x{6BD3}\x{6BD4}' . + '\x{6BD5}\x{6BD6}\x{6BD7}\x{6BD8}\x{6BD9}\x{6BDA}\x{6BDB}\x{6BDC}\x{6BDD}' . + '\x{6BDE}\x{6BDF}\x{6BE0}\x{6BE1}\x{6BE2}\x{6BE3}\x{6BE4}\x{6BE5}\x{6BE6}' . + '\x{6BE7}\x{6BE8}\x{6BEA}\x{6BEB}\x{6BEC}\x{6BED}\x{6BEE}\x{6BEF}\x{6BF0}' . + '\x{6BF2}\x{6BF3}\x{6BF5}\x{6BF6}\x{6BF7}\x{6BF8}\x{6BF9}\x{6BFB}\x{6BFC}' . + '\x{6BFD}\x{6BFE}\x{6BFF}\x{6C00}\x{6C01}\x{6C02}\x{6C03}\x{6C04}\x{6C05}' . + '\x{6C06}\x{6C07}\x{6C08}\x{6C09}\x{6C0B}\x{6C0C}\x{6C0D}\x{6C0E}\x{6C0F}' . + '\x{6C10}\x{6C11}\x{6C12}\x{6C13}\x{6C14}\x{6C15}\x{6C16}\x{6C18}\x{6C19}' . + '\x{6C1A}\x{6C1B}\x{6C1D}\x{6C1E}\x{6C1F}\x{6C20}\x{6C21}\x{6C22}\x{6C23}' . + '\x{6C24}\x{6C25}\x{6C26}\x{6C27}\x{6C28}\x{6C29}\x{6C2A}\x{6C2B}\x{6C2C}' . + '\x{6C2E}\x{6C2F}\x{6C30}\x{6C31}\x{6C32}\x{6C33}\x{6C34}\x{6C35}\x{6C36}' . + '\x{6C37}\x{6C38}\x{6C3A}\x{6C3B}\x{6C3D}\x{6C3E}\x{6C3F}\x{6C40}\x{6C41}' . + '\x{6C42}\x{6C43}\x{6C44}\x{6C46}\x{6C47}\x{6C48}\x{6C49}\x{6C4A}\x{6C4B}' . + '\x{6C4C}\x{6C4D}\x{6C4E}\x{6C4F}\x{6C50}\x{6C51}\x{6C52}\x{6C53}\x{6C54}' . + '\x{6C55}\x{6C56}\x{6C57}\x{6C58}\x{6C59}\x{6C5A}\x{6C5B}\x{6C5C}\x{6C5D}' . + '\x{6C5E}\x{6C5F}\x{6C60}\x{6C61}\x{6C62}\x{6C63}\x{6C64}\x{6C65}\x{6C66}' . + '\x{6C67}\x{6C68}\x{6C69}\x{6C6A}\x{6C6B}\x{6C6D}\x{6C6F}\x{6C70}\x{6C71}' . + '\x{6C72}\x{6C73}\x{6C74}\x{6C75}\x{6C76}\x{6C77}\x{6C78}\x{6C79}\x{6C7A}' . + '\x{6C7B}\x{6C7C}\x{6C7D}\x{6C7E}\x{6C7F}\x{6C80}\x{6C81}\x{6C82}\x{6C83}' . + '\x{6C84}\x{6C85}\x{6C86}\x{6C87}\x{6C88}\x{6C89}\x{6C8A}\x{6C8B}\x{6C8C}' . + '\x{6C8D}\x{6C8E}\x{6C8F}\x{6C90}\x{6C91}\x{6C92}\x{6C93}\x{6C94}\x{6C95}' . + '\x{6C96}\x{6C97}\x{6C98}\x{6C99}\x{6C9A}\x{6C9B}\x{6C9C}\x{6C9D}\x{6C9E}' . + '\x{6C9F}\x{6CA1}\x{6CA2}\x{6CA3}\x{6CA4}\x{6CA5}\x{6CA6}\x{6CA7}\x{6CA8}' . + '\x{6CA9}\x{6CAA}\x{6CAB}\x{6CAC}\x{6CAD}\x{6CAE}\x{6CAF}\x{6CB0}\x{6CB1}' . + '\x{6CB2}\x{6CB3}\x{6CB4}\x{6CB5}\x{6CB6}\x{6CB7}\x{6CB8}\x{6CB9}\x{6CBA}' . + '\x{6CBB}\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC0}\x{6CC1}\x{6CC2}\x{6CC3}' . + '\x{6CC4}\x{6CC5}\x{6CC6}\x{6CC7}\x{6CC8}\x{6CC9}\x{6CCA}\x{6CCB}\x{6CCC}' . + '\x{6CCD}\x{6CCE}\x{6CCF}\x{6CD0}\x{6CD1}\x{6CD2}\x{6CD3}\x{6CD4}\x{6CD5}' . + '\x{6CD6}\x{6CD7}\x{6CD9}\x{6CDA}\x{6CDB}\x{6CDC}\x{6CDD}\x{6CDE}\x{6CDF}' . + '\x{6CE0}\x{6CE1}\x{6CE2}\x{6CE3}\x{6CE4}\x{6CE5}\x{6CE6}\x{6CE7}\x{6CE8}' . + '\x{6CE9}\x{6CEA}\x{6CEB}\x{6CEC}\x{6CED}\x{6CEE}\x{6CEF}\x{6CF0}\x{6CF1}' . + '\x{6CF2}\x{6CF3}\x{6CF5}\x{6CF6}\x{6CF7}\x{6CF8}\x{6CF9}\x{6CFA}\x{6CFB}' . + '\x{6CFC}\x{6CFD}\x{6CFE}\x{6CFF}\x{6D00}\x{6D01}\x{6D03}\x{6D04}\x{6D05}' . + '\x{6D06}\x{6D07}\x{6D08}\x{6D09}\x{6D0A}\x{6D0B}\x{6D0C}\x{6D0D}\x{6D0E}' . + '\x{6D0F}\x{6D10}\x{6D11}\x{6D12}\x{6D13}\x{6D14}\x{6D15}\x{6D16}\x{6D17}' . + '\x{6D18}\x{6D19}\x{6D1A}\x{6D1B}\x{6D1D}\x{6D1E}\x{6D1F}\x{6D20}\x{6D21}' . + '\x{6D22}\x{6D23}\x{6D25}\x{6D26}\x{6D27}\x{6D28}\x{6D29}\x{6D2A}\x{6D2B}' . + '\x{6D2C}\x{6D2D}\x{6D2E}\x{6D2F}\x{6D30}\x{6D31}\x{6D32}\x{6D33}\x{6D34}' . + '\x{6D35}\x{6D36}\x{6D37}\x{6D38}\x{6D39}\x{6D3A}\x{6D3B}\x{6D3C}\x{6D3D}' . + '\x{6D3E}\x{6D3F}\x{6D40}\x{6D41}\x{6D42}\x{6D43}\x{6D44}\x{6D45}\x{6D46}' . + '\x{6D47}\x{6D48}\x{6D49}\x{6D4A}\x{6D4B}\x{6D4C}\x{6D4D}\x{6D4E}\x{6D4F}' . + '\x{6D50}\x{6D51}\x{6D52}\x{6D53}\x{6D54}\x{6D55}\x{6D56}\x{6D57}\x{6D58}' . + '\x{6D59}\x{6D5A}\x{6D5B}\x{6D5C}\x{6D5D}\x{6D5E}\x{6D5F}\x{6D60}\x{6D61}' . + '\x{6D62}\x{6D63}\x{6D64}\x{6D65}\x{6D66}\x{6D67}\x{6D68}\x{6D69}\x{6D6A}' . + '\x{6D6B}\x{6D6C}\x{6D6D}\x{6D6E}\x{6D6F}\x{6D70}\x{6D72}\x{6D73}\x{6D74}' . + '\x{6D75}\x{6D76}\x{6D77}\x{6D78}\x{6D79}\x{6D7A}\x{6D7B}\x{6D7C}\x{6D7D}' . + '\x{6D7E}\x{6D7F}\x{6D80}\x{6D82}\x{6D83}\x{6D84}\x{6D85}\x{6D86}\x{6D87}' . + '\x{6D88}\x{6D89}\x{6D8A}\x{6D8B}\x{6D8C}\x{6D8D}\x{6D8E}\x{6D8F}\x{6D90}' . + '\x{6D91}\x{6D92}\x{6D93}\x{6D94}\x{6D95}\x{6D97}\x{6D98}\x{6D99}\x{6D9A}' . + '\x{6D9B}\x{6D9D}\x{6D9E}\x{6D9F}\x{6DA0}\x{6DA1}\x{6DA2}\x{6DA3}\x{6DA4}' . + '\x{6DA5}\x{6DA6}\x{6DA7}\x{6DA8}\x{6DA9}\x{6DAA}\x{6DAB}\x{6DAC}\x{6DAD}' . + '\x{6DAE}\x{6DAF}\x{6DB2}\x{6DB3}\x{6DB4}\x{6DB5}\x{6DB7}\x{6DB8}\x{6DB9}' . + '\x{6DBA}\x{6DBB}\x{6DBC}\x{6DBD}\x{6DBE}\x{6DBF}\x{6DC0}\x{6DC1}\x{6DC2}' . + '\x{6DC3}\x{6DC4}\x{6DC5}\x{6DC6}\x{6DC7}\x{6DC8}\x{6DC9}\x{6DCA}\x{6DCB}' . + '\x{6DCC}\x{6DCD}\x{6DCE}\x{6DCF}\x{6DD0}\x{6DD1}\x{6DD2}\x{6DD3}\x{6DD4}' . + '\x{6DD5}\x{6DD6}\x{6DD7}\x{6DD8}\x{6DD9}\x{6DDA}\x{6DDB}\x{6DDC}\x{6DDD}' . + '\x{6DDE}\x{6DDF}\x{6DE0}\x{6DE1}\x{6DE2}\x{6DE3}\x{6DE4}\x{6DE5}\x{6DE6}' . + '\x{6DE7}\x{6DE8}\x{6DE9}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DED}\x{6DEE}\x{6DEF}' . + '\x{6DF0}\x{6DF1}\x{6DF2}\x{6DF3}\x{6DF4}\x{6DF5}\x{6DF6}\x{6DF7}\x{6DF8}' . + '\x{6DF9}\x{6DFA}\x{6DFB}\x{6DFC}\x{6DFD}\x{6E00}\x{6E03}\x{6E04}\x{6E05}' . + '\x{6E07}\x{6E08}\x{6E09}\x{6E0A}\x{6E0B}\x{6E0C}\x{6E0D}\x{6E0E}\x{6E0F}' . + '\x{6E10}\x{6E11}\x{6E14}\x{6E15}\x{6E16}\x{6E17}\x{6E19}\x{6E1A}\x{6E1B}' . + '\x{6E1C}\x{6E1D}\x{6E1E}\x{6E1F}\x{6E20}\x{6E21}\x{6E22}\x{6E23}\x{6E24}' . + '\x{6E25}\x{6E26}\x{6E27}\x{6E28}\x{6E29}\x{6E2B}\x{6E2C}\x{6E2D}\x{6E2E}' . + '\x{6E2F}\x{6E30}\x{6E31}\x{6E32}\x{6E33}\x{6E34}\x{6E35}\x{6E36}\x{6E37}' . + '\x{6E38}\x{6E39}\x{6E3A}\x{6E3B}\x{6E3C}\x{6E3D}\x{6E3E}\x{6E3F}\x{6E40}' . + '\x{6E41}\x{6E42}\x{6E43}\x{6E44}\x{6E45}\x{6E46}\x{6E47}\x{6E48}\x{6E49}' . + '\x{6E4A}\x{6E4B}\x{6E4D}\x{6E4E}\x{6E4F}\x{6E50}\x{6E51}\x{6E52}\x{6E53}' . + '\x{6E54}\x{6E55}\x{6E56}\x{6E57}\x{6E58}\x{6E59}\x{6E5A}\x{6E5B}\x{6E5C}' . + '\x{6E5D}\x{6E5E}\x{6E5F}\x{6E60}\x{6E61}\x{6E62}\x{6E63}\x{6E64}\x{6E65}' . + '\x{6E66}\x{6E67}\x{6E68}\x{6E69}\x{6E6A}\x{6E6B}\x{6E6D}\x{6E6E}\x{6E6F}' . + '\x{6E70}\x{6E71}\x{6E72}\x{6E73}\x{6E74}\x{6E75}\x{6E77}\x{6E78}\x{6E79}' . + '\x{6E7E}\x{6E7F}\x{6E80}\x{6E81}\x{6E82}\x{6E83}\x{6E84}\x{6E85}\x{6E86}' . + '\x{6E87}\x{6E88}\x{6E89}\x{6E8A}\x{6E8D}\x{6E8E}\x{6E8F}\x{6E90}\x{6E91}' . + '\x{6E92}\x{6E93}\x{6E94}\x{6E96}\x{6E97}\x{6E98}\x{6E99}\x{6E9A}\x{6E9B}' . + '\x{6E9C}\x{6E9D}\x{6E9E}\x{6E9F}\x{6EA0}\x{6EA1}\x{6EA2}\x{6EA3}\x{6EA4}' . + '\x{6EA5}\x{6EA6}\x{6EA7}\x{6EA8}\x{6EA9}\x{6EAA}\x{6EAB}\x{6EAC}\x{6EAD}' . + '\x{6EAE}\x{6EAF}\x{6EB0}\x{6EB1}\x{6EB2}\x{6EB3}\x{6EB4}\x{6EB5}\x{6EB6}' . + '\x{6EB7}\x{6EB8}\x{6EB9}\x{6EBA}\x{6EBB}\x{6EBC}\x{6EBD}\x{6EBE}\x{6EBF}' . + '\x{6EC0}\x{6EC1}\x{6EC2}\x{6EC3}\x{6EC4}\x{6EC5}\x{6EC6}\x{6EC7}\x{6EC8}' . + '\x{6EC9}\x{6ECA}\x{6ECB}\x{6ECC}\x{6ECD}\x{6ECE}\x{6ECF}\x{6ED0}\x{6ED1}' . + '\x{6ED2}\x{6ED3}\x{6ED4}\x{6ED5}\x{6ED6}\x{6ED7}\x{6ED8}\x{6ED9}\x{6EDA}' . + '\x{6EDC}\x{6EDE}\x{6EDF}\x{6EE0}\x{6EE1}\x{6EE2}\x{6EE4}\x{6EE5}\x{6EE6}' . + '\x{6EE7}\x{6EE8}\x{6EE9}\x{6EEA}\x{6EEB}\x{6EEC}\x{6EED}\x{6EEE}\x{6EEF}' . + '\x{6EF0}\x{6EF1}\x{6EF2}\x{6EF3}\x{6EF4}\x{6EF5}\x{6EF6}\x{6EF7}\x{6EF8}' . + '\x{6EF9}\x{6EFA}\x{6EFB}\x{6EFC}\x{6EFD}\x{6EFE}\x{6EFF}\x{6F00}\x{6F01}' . + '\x{6F02}\x{6F03}\x{6F05}\x{6F06}\x{6F07}\x{6F08}\x{6F09}\x{6F0A}\x{6F0C}' . + '\x{6F0D}\x{6F0E}\x{6F0F}\x{6F10}\x{6F11}\x{6F12}\x{6F13}\x{6F14}\x{6F15}' . + '\x{6F16}\x{6F17}\x{6F18}\x{6F19}\x{6F1A}\x{6F1B}\x{6F1C}\x{6F1D}\x{6F1E}' . + '\x{6F1F}\x{6F20}\x{6F21}\x{6F22}\x{6F23}\x{6F24}\x{6F25}\x{6F26}\x{6F27}' . + '\x{6F28}\x{6F29}\x{6F2A}\x{6F2B}\x{6F2C}\x{6F2D}\x{6F2E}\x{6F2F}\x{6F30}' . + '\x{6F31}\x{6F32}\x{6F33}\x{6F34}\x{6F35}\x{6F36}\x{6F37}\x{6F38}\x{6F39}' . + '\x{6F3A}\x{6F3B}\x{6F3C}\x{6F3D}\x{6F3E}\x{6F3F}\x{6F40}\x{6F41}\x{6F43}' . + '\x{6F44}\x{6F45}\x{6F46}\x{6F47}\x{6F49}\x{6F4B}\x{6F4C}\x{6F4D}\x{6F4E}' . + '\x{6F4F}\x{6F50}\x{6F51}\x{6F52}\x{6F53}\x{6F54}\x{6F55}\x{6F56}\x{6F57}' . + '\x{6F58}\x{6F59}\x{6F5A}\x{6F5B}\x{6F5C}\x{6F5D}\x{6F5E}\x{6F5F}\x{6F60}' . + '\x{6F61}\x{6F62}\x{6F63}\x{6F64}\x{6F65}\x{6F66}\x{6F67}\x{6F68}\x{6F69}' . + '\x{6F6A}\x{6F6B}\x{6F6C}\x{6F6D}\x{6F6E}\x{6F6F}\x{6F70}\x{6F71}\x{6F72}' . + '\x{6F73}\x{6F74}\x{6F75}\x{6F76}\x{6F77}\x{6F78}\x{6F7A}\x{6F7B}\x{6F7C}' . + '\x{6F7D}\x{6F7E}\x{6F7F}\x{6F80}\x{6F81}\x{6F82}\x{6F83}\x{6F84}\x{6F85}' . + '\x{6F86}\x{6F87}\x{6F88}\x{6F89}\x{6F8A}\x{6F8B}\x{6F8C}\x{6F8D}\x{6F8E}' . + '\x{6F8F}\x{6F90}\x{6F91}\x{6F92}\x{6F93}\x{6F94}\x{6F95}\x{6F96}\x{6F97}' . + '\x{6F99}\x{6F9B}\x{6F9C}\x{6F9D}\x{6F9E}\x{6FA0}\x{6FA1}\x{6FA2}\x{6FA3}' . + '\x{6FA4}\x{6FA5}\x{6FA6}\x{6FA7}\x{6FA8}\x{6FA9}\x{6FAA}\x{6FAB}\x{6FAC}' . + '\x{6FAD}\x{6FAE}\x{6FAF}\x{6FB0}\x{6FB1}\x{6FB2}\x{6FB3}\x{6FB4}\x{6FB5}' . + '\x{6FB6}\x{6FB8}\x{6FB9}\x{6FBA}\x{6FBB}\x{6FBC}\x{6FBD}\x{6FBE}\x{6FBF}' . + '\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC4}\x{6FC6}\x{6FC7}\x{6FC8}\x{6FC9}' . + '\x{6FCA}\x{6FCB}\x{6FCC}\x{6FCD}\x{6FCE}\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}' . + '\x{6FD5}\x{6FD6}\x{6FD7}\x{6FD8}\x{6FD9}\x{6FDA}\x{6FDB}\x{6FDC}\x{6FDD}' . + '\x{6FDE}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE2}\x{6FE3}\x{6FE4}\x{6FE5}\x{6FE6}' . + '\x{6FE7}\x{6FE8}\x{6FE9}\x{6FEA}\x{6FEB}\x{6FEC}\x{6FED}\x{6FEE}\x{6FEF}' . + '\x{6FF0}\x{6FF1}\x{6FF2}\x{6FF3}\x{6FF4}\x{6FF6}\x{6FF7}\x{6FF8}\x{6FF9}' . + '\x{6FFA}\x{6FFB}\x{6FFC}\x{6FFE}\x{6FFF}\x{7000}\x{7001}\x{7002}\x{7003}' . + '\x{7004}\x{7005}\x{7006}\x{7007}\x{7008}\x{7009}\x{700A}\x{700B}\x{700C}' . + '\x{700D}\x{700E}\x{700F}\x{7011}\x{7012}\x{7014}\x{7015}\x{7016}\x{7017}' . + '\x{7018}\x{7019}\x{701A}\x{701B}\x{701C}\x{701D}\x{701F}\x{7020}\x{7021}' . + '\x{7022}\x{7023}\x{7024}\x{7025}\x{7026}\x{7027}\x{7028}\x{7029}\x{702A}' . + '\x{702B}\x{702C}\x{702D}\x{702E}\x{702F}\x{7030}\x{7031}\x{7032}\x{7033}' . + '\x{7034}\x{7035}\x{7036}\x{7037}\x{7038}\x{7039}\x{703A}\x{703B}\x{703C}' . + '\x{703D}\x{703E}\x{703F}\x{7040}\x{7041}\x{7042}\x{7043}\x{7044}\x{7045}' . + '\x{7046}\x{7048}\x{7049}\x{704A}\x{704C}\x{704D}\x{704F}\x{7050}\x{7051}' . + '\x{7052}\x{7053}\x{7054}\x{7055}\x{7056}\x{7057}\x{7058}\x{7059}\x{705A}' . + '\x{705B}\x{705C}\x{705D}\x{705E}\x{705F}\x{7060}\x{7061}\x{7062}\x{7063}' . + '\x{7064}\x{7065}\x{7066}\x{7067}\x{7068}\x{7069}\x{706A}\x{706B}\x{706C}' . + '\x{706D}\x{706E}\x{706F}\x{7070}\x{7071}\x{7074}\x{7075}\x{7076}\x{7077}' . + '\x{7078}\x{7079}\x{707A}\x{707C}\x{707D}\x{707E}\x{707F}\x{7080}\x{7082}' . + '\x{7083}\x{7084}\x{7085}\x{7086}\x{7087}\x{7088}\x{7089}\x{708A}\x{708B}' . + '\x{708C}\x{708E}\x{708F}\x{7090}\x{7091}\x{7092}\x{7093}\x{7094}\x{7095}' . + '\x{7096}\x{7098}\x{7099}\x{709A}\x{709C}\x{709D}\x{709E}\x{709F}\x{70A0}' . + '\x{70A1}\x{70A2}\x{70A3}\x{70A4}\x{70A5}\x{70A6}\x{70A7}\x{70A8}\x{70A9}' . + '\x{70AB}\x{70AC}\x{70AD}\x{70AE}\x{70AF}\x{70B0}\x{70B1}\x{70B3}\x{70B4}' . + '\x{70B5}\x{70B7}\x{70B8}\x{70B9}\x{70BA}\x{70BB}\x{70BC}\x{70BD}\x{70BE}' . + '\x{70BF}\x{70C0}\x{70C1}\x{70C2}\x{70C3}\x{70C4}\x{70C5}\x{70C6}\x{70C7}' . + '\x{70C8}\x{70C9}\x{70CA}\x{70CB}\x{70CC}\x{70CD}\x{70CE}\x{70CF}\x{70D0}' . + '\x{70D1}\x{70D2}\x{70D3}\x{70D4}\x{70D6}\x{70D7}\x{70D8}\x{70D9}\x{70DA}' . + '\x{70DB}\x{70DC}\x{70DD}\x{70DE}\x{70DF}\x{70E0}\x{70E1}\x{70E2}\x{70E3}' . + '\x{70E4}\x{70E5}\x{70E6}\x{70E7}\x{70E8}\x{70E9}\x{70EA}\x{70EB}\x{70EC}' . + '\x{70ED}\x{70EE}\x{70EF}\x{70F0}\x{70F1}\x{70F2}\x{70F3}\x{70F4}\x{70F5}' . + '\x{70F6}\x{70F7}\x{70F8}\x{70F9}\x{70FA}\x{70FB}\x{70FC}\x{70FD}\x{70FF}' . + '\x{7100}\x{7101}\x{7102}\x{7103}\x{7104}\x{7105}\x{7106}\x{7107}\x{7109}' . + '\x{710A}\x{710B}\x{710C}\x{710D}\x{710E}\x{710F}\x{7110}\x{7111}\x{7112}' . + '\x{7113}\x{7115}\x{7116}\x{7117}\x{7118}\x{7119}\x{711A}\x{711B}\x{711C}' . + '\x{711D}\x{711E}\x{711F}\x{7120}\x{7121}\x{7122}\x{7123}\x{7125}\x{7126}' . + '\x{7127}\x{7128}\x{7129}\x{712A}\x{712B}\x{712C}\x{712D}\x{712E}\x{712F}' . + '\x{7130}\x{7131}\x{7132}\x{7135}\x{7136}\x{7137}\x{7138}\x{7139}\x{713A}' . + '\x{713B}\x{713D}\x{713E}\x{713F}\x{7140}\x{7141}\x{7142}\x{7143}\x{7144}' . + '\x{7145}\x{7146}\x{7147}\x{7148}\x{7149}\x{714A}\x{714B}\x{714C}\x{714D}' . + '\x{714E}\x{714F}\x{7150}\x{7151}\x{7152}\x{7153}\x{7154}\x{7156}\x{7158}' . + '\x{7159}\x{715A}\x{715B}\x{715C}\x{715D}\x{715E}\x{715F}\x{7160}\x{7161}' . + '\x{7162}\x{7163}\x{7164}\x{7165}\x{7166}\x{7167}\x{7168}\x{7169}\x{716A}' . + '\x{716C}\x{716E}\x{716F}\x{7170}\x{7171}\x{7172}\x{7173}\x{7174}\x{7175}' . + '\x{7176}\x{7177}\x{7178}\x{7179}\x{717A}\x{717B}\x{717C}\x{717D}\x{717E}' . + '\x{717F}\x{7180}\x{7181}\x{7182}\x{7183}\x{7184}\x{7185}\x{7186}\x{7187}' . + '\x{7188}\x{7189}\x{718A}\x{718B}\x{718C}\x{718E}\x{718F}\x{7190}\x{7191}' . + '\x{7192}\x{7193}\x{7194}\x{7195}\x{7197}\x{7198}\x{7199}\x{719A}\x{719B}' . + '\x{719C}\x{719D}\x{719E}\x{719F}\x{71A0}\x{71A1}\x{71A2}\x{71A3}\x{71A4}' . + '\x{71A5}\x{71A7}\x{71A8}\x{71A9}\x{71AA}\x{71AC}\x{71AD}\x{71AE}\x{71AF}' . + '\x{71B0}\x{71B1}\x{71B2}\x{71B3}\x{71B4}\x{71B5}\x{71B7}\x{71B8}\x{71B9}' . + '\x{71BA}\x{71BB}\x{71BC}\x{71BD}\x{71BE}\x{71BF}\x{71C0}\x{71C1}\x{71C2}' . + '\x{71C3}\x{71C4}\x{71C5}\x{71C6}\x{71C7}\x{71C8}\x{71C9}\x{71CA}\x{71CB}' . + '\x{71CD}\x{71CE}\x{71CF}\x{71D0}\x{71D1}\x{71D2}\x{71D4}\x{71D5}\x{71D6}' . + '\x{71D7}\x{71D8}\x{71D9}\x{71DA}\x{71DB}\x{71DC}\x{71DD}\x{71DE}\x{71DF}' . + '\x{71E0}\x{71E1}\x{71E2}\x{71E3}\x{71E4}\x{71E5}\x{71E6}\x{71E7}\x{71E8}' . + '\x{71E9}\x{71EA}\x{71EB}\x{71EC}\x{71ED}\x{71EE}\x{71EF}\x{71F0}\x{71F1}' . + '\x{71F2}\x{71F4}\x{71F5}\x{71F6}\x{71F7}\x{71F8}\x{71F9}\x{71FB}\x{71FC}' . + '\x{71FD}\x{71FE}\x{71FF}\x{7201}\x{7202}\x{7203}\x{7204}\x{7205}\x{7206}' . + '\x{7207}\x{7208}\x{7209}\x{720A}\x{720C}\x{720D}\x{720E}\x{720F}\x{7210}' . + '\x{7212}\x{7213}\x{7214}\x{7216}\x{7218}\x{7219}\x{721A}\x{721B}\x{721C}' . + '\x{721D}\x{721E}\x{721F}\x{7221}\x{7222}\x{7223}\x{7226}\x{7227}\x{7228}' . + '\x{7229}\x{722A}\x{722B}\x{722C}\x{722D}\x{722E}\x{7230}\x{7231}\x{7232}' . + '\x{7233}\x{7235}\x{7236}\x{7237}\x{7238}\x{7239}\x{723A}\x{723B}\x{723C}' . + '\x{723D}\x{723E}\x{723F}\x{7240}\x{7241}\x{7242}\x{7243}\x{7244}\x{7246}' . + '\x{7247}\x{7248}\x{7249}\x{724A}\x{724B}\x{724C}\x{724D}\x{724F}\x{7251}' . + '\x{7252}\x{7253}\x{7254}\x{7256}\x{7257}\x{7258}\x{7259}\x{725A}\x{725B}' . + '\x{725C}\x{725D}\x{725E}\x{725F}\x{7260}\x{7261}\x{7262}\x{7263}\x{7264}' . + '\x{7265}\x{7266}\x{7267}\x{7268}\x{7269}\x{726A}\x{726B}\x{726C}\x{726D}' . + '\x{726E}\x{726F}\x{7270}\x{7271}\x{7272}\x{7273}\x{7274}\x{7275}\x{7276}' . + '\x{7277}\x{7278}\x{7279}\x{727A}\x{727B}\x{727C}\x{727D}\x{727E}\x{727F}' . + '\x{7280}\x{7281}\x{7282}\x{7283}\x{7284}\x{7285}\x{7286}\x{7287}\x{7288}' . + '\x{7289}\x{728A}\x{728B}\x{728C}\x{728D}\x{728E}\x{728F}\x{7290}\x{7291}' . + '\x{7292}\x{7293}\x{7294}\x{7295}\x{7296}\x{7297}\x{7298}\x{7299}\x{729A}' . + '\x{729B}\x{729C}\x{729D}\x{729E}\x{729F}\x{72A1}\x{72A2}\x{72A3}\x{72A4}' . + '\x{72A5}\x{72A6}\x{72A7}\x{72A8}\x{72A9}\x{72AA}\x{72AC}\x{72AD}\x{72AE}' . + '\x{72AF}\x{72B0}\x{72B1}\x{72B2}\x{72B3}\x{72B4}\x{72B5}\x{72B6}\x{72B7}' . + '\x{72B8}\x{72B9}\x{72BA}\x{72BB}\x{72BC}\x{72BD}\x{72BF}\x{72C0}\x{72C1}' . + '\x{72C2}\x{72C3}\x{72C4}\x{72C5}\x{72C6}\x{72C7}\x{72C8}\x{72C9}\x{72CA}' . + '\x{72CB}\x{72CC}\x{72CD}\x{72CE}\x{72CF}\x{72D0}\x{72D1}\x{72D2}\x{72D3}' . + '\x{72D4}\x{72D5}\x{72D6}\x{72D7}\x{72D8}\x{72D9}\x{72DA}\x{72DB}\x{72DC}' . + '\x{72DD}\x{72DE}\x{72DF}\x{72E0}\x{72E1}\x{72E2}\x{72E3}\x{72E4}\x{72E5}' . + '\x{72E6}\x{72E7}\x{72E8}\x{72E9}\x{72EA}\x{72EB}\x{72EC}\x{72ED}\x{72EE}' . + '\x{72EF}\x{72F0}\x{72F1}\x{72F2}\x{72F3}\x{72F4}\x{72F5}\x{72F6}\x{72F7}' . + '\x{72F8}\x{72F9}\x{72FA}\x{72FB}\x{72FC}\x{72FD}\x{72FE}\x{72FF}\x{7300}' . + '\x{7301}\x{7303}\x{7304}\x{7305}\x{7306}\x{7307}\x{7308}\x{7309}\x{730A}' . + '\x{730B}\x{730C}\x{730D}\x{730E}\x{730F}\x{7311}\x{7312}\x{7313}\x{7314}' . + '\x{7315}\x{7316}\x{7317}\x{7318}\x{7319}\x{731A}\x{731B}\x{731C}\x{731D}' . + '\x{731E}\x{7320}\x{7321}\x{7322}\x{7323}\x{7324}\x{7325}\x{7326}\x{7327}' . + '\x{7329}\x{732A}\x{732B}\x{732C}\x{732D}\x{732E}\x{7330}\x{7331}\x{7332}' . + '\x{7333}\x{7334}\x{7335}\x{7336}\x{7337}\x{7338}\x{7339}\x{733A}\x{733B}' . + '\x{733C}\x{733D}\x{733E}\x{733F}\x{7340}\x{7341}\x{7342}\x{7343}\x{7344}' . + '\x{7345}\x{7346}\x{7347}\x{7348}\x{7349}\x{734A}\x{734B}\x{734C}\x{734D}' . + '\x{734E}\x{7350}\x{7351}\x{7352}\x{7354}\x{7355}\x{7356}\x{7357}\x{7358}' . + '\x{7359}\x{735A}\x{735B}\x{735C}\x{735D}\x{735E}\x{735F}\x{7360}\x{7361}' . + '\x{7362}\x{7364}\x{7365}\x{7366}\x{7367}\x{7368}\x{7369}\x{736A}\x{736B}' . + '\x{736C}\x{736D}\x{736E}\x{736F}\x{7370}\x{7371}\x{7372}\x{7373}\x{7374}' . + '\x{7375}\x{7376}\x{7377}\x{7378}\x{7379}\x{737A}\x{737B}\x{737C}\x{737D}' . + '\x{737E}\x{737F}\x{7380}\x{7381}\x{7382}\x{7383}\x{7384}\x{7385}\x{7386}' . + '\x{7387}\x{7388}\x{7389}\x{738A}\x{738B}\x{738C}\x{738D}\x{738E}\x{738F}' . + '\x{7390}\x{7391}\x{7392}\x{7393}\x{7394}\x{7395}\x{7396}\x{7397}\x{7398}' . + '\x{7399}\x{739A}\x{739B}\x{739D}\x{739E}\x{739F}\x{73A0}\x{73A1}\x{73A2}' . + '\x{73A3}\x{73A4}\x{73A5}\x{73A6}\x{73A7}\x{73A8}\x{73A9}\x{73AA}\x{73AB}' . + '\x{73AC}\x{73AD}\x{73AE}\x{73AF}\x{73B0}\x{73B1}\x{73B2}\x{73B3}\x{73B4}' . + '\x{73B5}\x{73B6}\x{73B7}\x{73B8}\x{73B9}\x{73BA}\x{73BB}\x{73BC}\x{73BD}' . + '\x{73BE}\x{73BF}\x{73C0}\x{73C2}\x{73C3}\x{73C4}\x{73C5}\x{73C6}\x{73C7}' . + '\x{73C8}\x{73C9}\x{73CA}\x{73CB}\x{73CC}\x{73CD}\x{73CE}\x{73CF}\x{73D0}' . + '\x{73D1}\x{73D2}\x{73D3}\x{73D4}\x{73D5}\x{73D6}\x{73D7}\x{73D8}\x{73D9}' . + '\x{73DA}\x{73DB}\x{73DC}\x{73DD}\x{73DE}\x{73DF}\x{73E0}\x{73E2}\x{73E3}' . + '\x{73E5}\x{73E6}\x{73E7}\x{73E8}\x{73E9}\x{73EA}\x{73EB}\x{73EC}\x{73ED}' . + '\x{73EE}\x{73EF}\x{73F0}\x{73F1}\x{73F2}\x{73F4}\x{73F5}\x{73F6}\x{73F7}' . + '\x{73F8}\x{73F9}\x{73FA}\x{73FC}\x{73FD}\x{73FE}\x{73FF}\x{7400}\x{7401}' . + '\x{7402}\x{7403}\x{7404}\x{7405}\x{7406}\x{7407}\x{7408}\x{7409}\x{740A}' . + '\x{740B}\x{740C}\x{740D}\x{740E}\x{740F}\x{7410}\x{7411}\x{7412}\x{7413}' . + '\x{7414}\x{7415}\x{7416}\x{7417}\x{7419}\x{741A}\x{741B}\x{741C}\x{741D}' . + '\x{741E}\x{741F}\x{7420}\x{7421}\x{7422}\x{7423}\x{7424}\x{7425}\x{7426}' . + '\x{7427}\x{7428}\x{7429}\x{742A}\x{742B}\x{742C}\x{742D}\x{742E}\x{742F}' . + '\x{7430}\x{7431}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{7437}\x{7438}' . + '\x{743A}\x{743B}\x{743C}\x{743D}\x{743F}\x{7440}\x{7441}\x{7442}\x{7443}' . + '\x{7444}\x{7445}\x{7446}\x{7448}\x{744A}\x{744B}\x{744C}\x{744D}\x{744E}' . + '\x{744F}\x{7450}\x{7451}\x{7452}\x{7453}\x{7454}\x{7455}\x{7456}\x{7457}' . + '\x{7459}\x{745A}\x{745B}\x{745C}\x{745D}\x{745E}\x{745F}\x{7461}\x{7462}' . + '\x{7463}\x{7464}\x{7465}\x{7466}\x{7467}\x{7468}\x{7469}\x{746A}\x{746B}' . + '\x{746C}\x{746D}\x{746E}\x{746F}\x{7470}\x{7471}\x{7472}\x{7473}\x{7474}' . + '\x{7475}\x{7476}\x{7477}\x{7478}\x{7479}\x{747A}\x{747C}\x{747D}\x{747E}' . + '\x{747F}\x{7480}\x{7481}\x{7482}\x{7483}\x{7485}\x{7486}\x{7487}\x{7488}' . + '\x{7489}\x{748A}\x{748B}\x{748C}\x{748D}\x{748E}\x{748F}\x{7490}\x{7491}' . + '\x{7492}\x{7493}\x{7494}\x{7495}\x{7497}\x{7498}\x{7499}\x{749A}\x{749B}' . + '\x{749C}\x{749E}\x{749F}\x{74A0}\x{74A1}\x{74A3}\x{74A4}\x{74A5}\x{74A6}' . + '\x{74A7}\x{74A8}\x{74A9}\x{74AA}\x{74AB}\x{74AC}\x{74AD}\x{74AE}\x{74AF}' . + '\x{74B0}\x{74B1}\x{74B2}\x{74B3}\x{74B4}\x{74B5}\x{74B6}\x{74B7}\x{74B8}' . + '\x{74B9}\x{74BA}\x{74BB}\x{74BC}\x{74BD}\x{74BE}\x{74BF}\x{74C0}\x{74C1}' . + '\x{74C2}\x{74C3}\x{74C4}\x{74C5}\x{74C6}\x{74CA}\x{74CB}\x{74CD}\x{74CE}' . + '\x{74CF}\x{74D0}\x{74D1}\x{74D2}\x{74D3}\x{74D4}\x{74D5}\x{74D6}\x{74D7}' . + '\x{74D8}\x{74D9}\x{74DA}\x{74DB}\x{74DC}\x{74DD}\x{74DE}\x{74DF}\x{74E0}' . + '\x{74E1}\x{74E2}\x{74E3}\x{74E4}\x{74E5}\x{74E6}\x{74E7}\x{74E8}\x{74E9}' . + '\x{74EA}\x{74EC}\x{74ED}\x{74EE}\x{74EF}\x{74F0}\x{74F1}\x{74F2}\x{74F3}' . + '\x{74F4}\x{74F5}\x{74F6}\x{74F7}\x{74F8}\x{74F9}\x{74FA}\x{74FB}\x{74FC}' . + '\x{74FD}\x{74FE}\x{74FF}\x{7500}\x{7501}\x{7502}\x{7503}\x{7504}\x{7505}' . + '\x{7506}\x{7507}\x{7508}\x{7509}\x{750A}\x{750B}\x{750C}\x{750D}\x{750F}' . + '\x{7510}\x{7511}\x{7512}\x{7513}\x{7514}\x{7515}\x{7516}\x{7517}\x{7518}' . + '\x{7519}\x{751A}\x{751B}\x{751C}\x{751D}\x{751E}\x{751F}\x{7521}\x{7522}' . + '\x{7523}\x{7524}\x{7525}\x{7526}\x{7527}\x{7528}\x{7529}\x{752A}\x{752B}' . + '\x{752C}\x{752D}\x{752E}\x{752F}\x{7530}\x{7531}\x{7532}\x{7533}\x{7535}' . + '\x{7536}\x{7537}\x{7538}\x{7539}\x{753A}\x{753B}\x{753C}\x{753D}\x{753E}' . + '\x{753F}\x{7540}\x{7542}\x{7543}\x{7544}\x{7545}\x{7546}\x{7547}\x{7548}' . + '\x{7549}\x{754B}\x{754C}\x{754D}\x{754E}\x{754F}\x{7550}\x{7551}\x{7553}' . + '\x{7554}\x{7556}\x{7557}\x{7558}\x{7559}\x{755A}\x{755B}\x{755C}\x{755D}' . + '\x{755F}\x{7560}\x{7562}\x{7563}\x{7564}\x{7565}\x{7566}\x{7567}\x{7568}' . + '\x{7569}\x{756A}\x{756B}\x{756C}\x{756D}\x{756E}\x{756F}\x{7570}\x{7572}' . + '\x{7574}\x{7575}\x{7576}\x{7577}\x{7578}\x{7579}\x{757C}\x{757D}\x{757E}' . + '\x{757F}\x{7580}\x{7581}\x{7582}\x{7583}\x{7584}\x{7586}\x{7587}\x{7588}' . + '\x{7589}\x{758A}\x{758B}\x{758C}\x{758D}\x{758F}\x{7590}\x{7591}\x{7592}' . + '\x{7593}\x{7594}\x{7595}\x{7596}\x{7597}\x{7598}\x{7599}\x{759A}\x{759B}' . + '\x{759C}\x{759D}\x{759E}\x{759F}\x{75A0}\x{75A1}\x{75A2}\x{75A3}\x{75A4}' . + '\x{75A5}\x{75A6}\x{75A7}\x{75A8}\x{75AA}\x{75AB}\x{75AC}\x{75AD}\x{75AE}' . + '\x{75AF}\x{75B0}\x{75B1}\x{75B2}\x{75B3}\x{75B4}\x{75B5}\x{75B6}\x{75B8}' . + '\x{75B9}\x{75BA}\x{75BB}\x{75BC}\x{75BD}\x{75BE}\x{75BF}\x{75C0}\x{75C1}' . + '\x{75C2}\x{75C3}\x{75C4}\x{75C5}\x{75C6}\x{75C7}\x{75C8}\x{75C9}\x{75CA}' . + '\x{75CB}\x{75CC}\x{75CD}\x{75CE}\x{75CF}\x{75D0}\x{75D1}\x{75D2}\x{75D3}' . + '\x{75D4}\x{75D5}\x{75D6}\x{75D7}\x{75D8}\x{75D9}\x{75DA}\x{75DB}\x{75DD}' . + '\x{75DE}\x{75DF}\x{75E0}\x{75E1}\x{75E2}\x{75E3}\x{75E4}\x{75E5}\x{75E6}' . + '\x{75E7}\x{75E8}\x{75EA}\x{75EB}\x{75EC}\x{75ED}\x{75EF}\x{75F0}\x{75F1}' . + '\x{75F2}\x{75F3}\x{75F4}\x{75F5}\x{75F6}\x{75F7}\x{75F8}\x{75F9}\x{75FA}' . + '\x{75FB}\x{75FC}\x{75FD}\x{75FE}\x{75FF}\x{7600}\x{7601}\x{7602}\x{7603}' . + '\x{7604}\x{7605}\x{7606}\x{7607}\x{7608}\x{7609}\x{760A}\x{760B}\x{760C}' . + '\x{760D}\x{760E}\x{760F}\x{7610}\x{7611}\x{7612}\x{7613}\x{7614}\x{7615}' . + '\x{7616}\x{7617}\x{7618}\x{7619}\x{761A}\x{761B}\x{761C}\x{761D}\x{761E}' . + '\x{761F}\x{7620}\x{7621}\x{7622}\x{7623}\x{7624}\x{7625}\x{7626}\x{7627}' . + '\x{7628}\x{7629}\x{762A}\x{762B}\x{762D}\x{762E}\x{762F}\x{7630}\x{7631}' . + '\x{7632}\x{7633}\x{7634}\x{7635}\x{7636}\x{7637}\x{7638}\x{7639}\x{763A}' . + '\x{763B}\x{763C}\x{763D}\x{763E}\x{763F}\x{7640}\x{7641}\x{7642}\x{7643}' . + '\x{7646}\x{7647}\x{7648}\x{7649}\x{764A}\x{764B}\x{764C}\x{764D}\x{764F}' . + '\x{7650}\x{7652}\x{7653}\x{7654}\x{7656}\x{7657}\x{7658}\x{7659}\x{765A}' . + '\x{765B}\x{765C}\x{765D}\x{765E}\x{765F}\x{7660}\x{7661}\x{7662}\x{7663}' . + '\x{7664}\x{7665}\x{7666}\x{7667}\x{7668}\x{7669}\x{766A}\x{766B}\x{766C}' . + '\x{766D}\x{766E}\x{766F}\x{7670}\x{7671}\x{7672}\x{7674}\x{7675}\x{7676}' . + '\x{7677}\x{7678}\x{7679}\x{767B}\x{767C}\x{767D}\x{767E}\x{767F}\x{7680}' . + '\x{7681}\x{7682}\x{7683}\x{7684}\x{7685}\x{7686}\x{7687}\x{7688}\x{7689}' . + '\x{768A}\x{768B}\x{768C}\x{768E}\x{768F}\x{7690}\x{7691}\x{7692}\x{7693}' . + '\x{7694}\x{7695}\x{7696}\x{7697}\x{7698}\x{7699}\x{769A}\x{769B}\x{769C}' . + '\x{769D}\x{769E}\x{769F}\x{76A0}\x{76A3}\x{76A4}\x{76A6}\x{76A7}\x{76A9}' . + '\x{76AA}\x{76AB}\x{76AC}\x{76AD}\x{76AE}\x{76AF}\x{76B0}\x{76B1}\x{76B2}' . + '\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}\x{76BB}\x{76BC}\x{76BD}\x{76BE}' . + '\x{76BF}\x{76C0}\x{76C2}\x{76C3}\x{76C4}\x{76C5}\x{76C6}\x{76C7}\x{76C8}' . + '\x{76C9}\x{76CA}\x{76CD}\x{76CE}\x{76CF}\x{76D0}\x{76D1}\x{76D2}\x{76D3}' . + '\x{76D4}\x{76D5}\x{76D6}\x{76D7}\x{76D8}\x{76DA}\x{76DB}\x{76DC}\x{76DD}' . + '\x{76DE}\x{76DF}\x{76E0}\x{76E1}\x{76E2}\x{76E3}\x{76E4}\x{76E5}\x{76E6}' . + '\x{76E7}\x{76E8}\x{76E9}\x{76EA}\x{76EC}\x{76ED}\x{76EE}\x{76EF}\x{76F0}' . + '\x{76F1}\x{76F2}\x{76F3}\x{76F4}\x{76F5}\x{76F6}\x{76F7}\x{76F8}\x{76F9}' . + '\x{76FA}\x{76FB}\x{76FC}\x{76FD}\x{76FE}\x{76FF}\x{7701}\x{7703}\x{7704}' . + '\x{7705}\x{7706}\x{7707}\x{7708}\x{7709}\x{770A}\x{770B}\x{770C}\x{770D}' . + '\x{770F}\x{7710}\x{7711}\x{7712}\x{7713}\x{7714}\x{7715}\x{7716}\x{7717}' . + '\x{7718}\x{7719}\x{771A}\x{771B}\x{771C}\x{771D}\x{771E}\x{771F}\x{7720}' . + '\x{7722}\x{7723}\x{7725}\x{7726}\x{7727}\x{7728}\x{7729}\x{772A}\x{772C}' . + '\x{772D}\x{772E}\x{772F}\x{7730}\x{7731}\x{7732}\x{7733}\x{7734}\x{7735}' . + '\x{7736}\x{7737}\x{7738}\x{7739}\x{773A}\x{773B}\x{773C}\x{773D}\x{773E}' . + '\x{7740}\x{7741}\x{7743}\x{7744}\x{7745}\x{7746}\x{7747}\x{7748}\x{7749}' . + '\x{774A}\x{774B}\x{774C}\x{774D}\x{774E}\x{774F}\x{7750}\x{7751}\x{7752}' . + '\x{7753}\x{7754}\x{7755}\x{7756}\x{7757}\x{7758}\x{7759}\x{775A}\x{775B}' . + '\x{775C}\x{775D}\x{775E}\x{775F}\x{7760}\x{7761}\x{7762}\x{7763}\x{7765}' . + '\x{7766}\x{7767}\x{7768}\x{7769}\x{776A}\x{776B}\x{776C}\x{776D}\x{776E}' . + '\x{776F}\x{7770}\x{7771}\x{7772}\x{7773}\x{7774}\x{7775}\x{7776}\x{7777}' . + '\x{7778}\x{7779}\x{777A}\x{777B}\x{777C}\x{777D}\x{777E}\x{777F}\x{7780}' . + '\x{7781}\x{7782}\x{7783}\x{7784}\x{7785}\x{7786}\x{7787}\x{7788}\x{7789}' . + '\x{778A}\x{778B}\x{778C}\x{778D}\x{778E}\x{778F}\x{7790}\x{7791}\x{7792}' . + '\x{7793}\x{7794}\x{7795}\x{7797}\x{7798}\x{7799}\x{779A}\x{779B}\x{779C}' . + '\x{779D}\x{779E}\x{779F}\x{77A0}\x{77A1}\x{77A2}\x{77A3}\x{77A5}\x{77A6}' . + '\x{77A7}\x{77A8}\x{77A9}\x{77AA}\x{77AB}\x{77AC}\x{77AD}\x{77AE}\x{77AF}' . + '\x{77B0}\x{77B1}\x{77B2}\x{77B3}\x{77B4}\x{77B5}\x{77B6}\x{77B7}\x{77B8}' . + '\x{77B9}\x{77BA}\x{77BB}\x{77BC}\x{77BD}\x{77BF}\x{77C0}\x{77C2}\x{77C3}' . + '\x{77C4}\x{77C5}\x{77C6}\x{77C7}\x{77C8}\x{77C9}\x{77CA}\x{77CB}\x{77CC}' . + '\x{77CD}\x{77CE}\x{77CF}\x{77D0}\x{77D1}\x{77D3}\x{77D4}\x{77D5}\x{77D6}' . + '\x{77D7}\x{77D8}\x{77D9}\x{77DA}\x{77DB}\x{77DC}\x{77DE}\x{77DF}\x{77E0}' . + '\x{77E1}\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E8}\x{77E9}\x{77EA}\x{77EB}' . + '\x{77EC}\x{77ED}\x{77EE}\x{77EF}\x{77F0}\x{77F1}\x{77F2}\x{77F3}\x{77F6}' . + '\x{77F7}\x{77F8}\x{77F9}\x{77FA}\x{77FB}\x{77FC}\x{77FD}\x{77FE}\x{77FF}' . + '\x{7800}\x{7801}\x{7802}\x{7803}\x{7804}\x{7805}\x{7806}\x{7808}\x{7809}' . + '\x{780A}\x{780B}\x{780C}\x{780D}\x{780E}\x{780F}\x{7810}\x{7811}\x{7812}' . + '\x{7813}\x{7814}\x{7815}\x{7816}\x{7817}\x{7818}\x{7819}\x{781A}\x{781B}' . + '\x{781C}\x{781D}\x{781E}\x{781F}\x{7820}\x{7821}\x{7822}\x{7823}\x{7825}' . + '\x{7826}\x{7827}\x{7828}\x{7829}\x{782A}\x{782B}\x{782C}\x{782D}\x{782E}' . + '\x{782F}\x{7830}\x{7831}\x{7832}\x{7833}\x{7834}\x{7835}\x{7837}\x{7838}' . + '\x{7839}\x{783A}\x{783B}\x{783C}\x{783D}\x{783E}\x{7840}\x{7841}\x{7843}' . + '\x{7844}\x{7845}\x{7847}\x{7848}\x{7849}\x{784A}\x{784C}\x{784D}\x{784E}' . + '\x{7850}\x{7851}\x{7852}\x{7853}\x{7854}\x{7855}\x{7856}\x{7857}\x{7858}' . + '\x{7859}\x{785A}\x{785B}\x{785C}\x{785D}\x{785E}\x{785F}\x{7860}\x{7861}' . + '\x{7862}\x{7863}\x{7864}\x{7865}\x{7866}\x{7867}\x{7868}\x{7869}\x{786A}' . + '\x{786B}\x{786C}\x{786D}\x{786E}\x{786F}\x{7870}\x{7871}\x{7872}\x{7873}' . + '\x{7874}\x{7875}\x{7877}\x{7878}\x{7879}\x{787A}\x{787B}\x{787C}\x{787D}' . + '\x{787E}\x{787F}\x{7880}\x{7881}\x{7882}\x{7883}\x{7884}\x{7885}\x{7886}' . + '\x{7887}\x{7889}\x{788A}\x{788B}\x{788C}\x{788D}\x{788E}\x{788F}\x{7890}' . + '\x{7891}\x{7892}\x{7893}\x{7894}\x{7895}\x{7896}\x{7897}\x{7898}\x{7899}' . + '\x{789A}\x{789B}\x{789C}\x{789D}\x{789E}\x{789F}\x{78A0}\x{78A1}\x{78A2}' . + '\x{78A3}\x{78A4}\x{78A5}\x{78A6}\x{78A7}\x{78A8}\x{78A9}\x{78AA}\x{78AB}' . + '\x{78AC}\x{78AD}\x{78AE}\x{78AF}\x{78B0}\x{78B1}\x{78B2}\x{78B3}\x{78B4}' . + '\x{78B5}\x{78B6}\x{78B7}\x{78B8}\x{78B9}\x{78BA}\x{78BB}\x{78BC}\x{78BD}' . + '\x{78BE}\x{78BF}\x{78C0}\x{78C1}\x{78C3}\x{78C4}\x{78C5}\x{78C6}\x{78C8}' . + '\x{78C9}\x{78CA}\x{78CB}\x{78CC}\x{78CD}\x{78CE}\x{78CF}\x{78D0}\x{78D1}' . + '\x{78D3}\x{78D4}\x{78D5}\x{78D6}\x{78D7}\x{78D8}\x{78D9}\x{78DA}\x{78DB}' . + '\x{78DC}\x{78DD}\x{78DE}\x{78DF}\x{78E0}\x{78E1}\x{78E2}\x{78E3}\x{78E4}' . + '\x{78E5}\x{78E6}\x{78E7}\x{78E8}\x{78E9}\x{78EA}\x{78EB}\x{78EC}\x{78ED}' . + '\x{78EE}\x{78EF}\x{78F1}\x{78F2}\x{78F3}\x{78F4}\x{78F5}\x{78F6}\x{78F7}' . + '\x{78F9}\x{78FA}\x{78FB}\x{78FC}\x{78FD}\x{78FE}\x{78FF}\x{7901}\x{7902}' . + '\x{7903}\x{7904}\x{7905}\x{7906}\x{7907}\x{7909}\x{790A}\x{790B}\x{790C}' . + '\x{790E}\x{790F}\x{7910}\x{7911}\x{7912}\x{7913}\x{7914}\x{7916}\x{7917}' . + '\x{7918}\x{7919}\x{791A}\x{791B}\x{791C}\x{791D}\x{791E}\x{7921}\x{7922}' . + '\x{7923}\x{7924}\x{7925}\x{7926}\x{7927}\x{7928}\x{7929}\x{792A}\x{792B}' . + '\x{792C}\x{792D}\x{792E}\x{792F}\x{7930}\x{7931}\x{7933}\x{7934}\x{7935}' . + '\x{7937}\x{7938}\x{7939}\x{793A}\x{793B}\x{793C}\x{793D}\x{793E}\x{793F}' . + '\x{7940}\x{7941}\x{7942}\x{7943}\x{7944}\x{7945}\x{7946}\x{7947}\x{7948}' . + '\x{7949}\x{794A}\x{794B}\x{794C}\x{794D}\x{794E}\x{794F}\x{7950}\x{7951}' . + '\x{7952}\x{7953}\x{7954}\x{7955}\x{7956}\x{7957}\x{7958}\x{795A}\x{795B}' . + '\x{795C}\x{795D}\x{795E}\x{795F}\x{7960}\x{7961}\x{7962}\x{7963}\x{7964}' . + '\x{7965}\x{7966}\x{7967}\x{7968}\x{7969}\x{796A}\x{796B}\x{796D}\x{796F}' . + '\x{7970}\x{7971}\x{7972}\x{7973}\x{7974}\x{7977}\x{7978}\x{7979}\x{797A}' . + '\x{797B}\x{797C}\x{797D}\x{797E}\x{797F}\x{7980}\x{7981}\x{7982}\x{7983}' . + '\x{7984}\x{7985}\x{7988}\x{7989}\x{798A}\x{798B}\x{798C}\x{798D}\x{798E}' . + '\x{798F}\x{7990}\x{7991}\x{7992}\x{7993}\x{7994}\x{7995}\x{7996}\x{7997}' . + '\x{7998}\x{7999}\x{799A}\x{799B}\x{799C}\x{799F}\x{79A0}\x{79A1}\x{79A2}' . + '\x{79A3}\x{79A4}\x{79A5}\x{79A6}\x{79A7}\x{79A8}\x{79AA}\x{79AB}\x{79AC}' . + '\x{79AD}\x{79AE}\x{79AF}\x{79B0}\x{79B1}\x{79B2}\x{79B3}\x{79B4}\x{79B5}' . + '\x{79B6}\x{79B7}\x{79B8}\x{79B9}\x{79BA}\x{79BB}\x{79BD}\x{79BE}\x{79BF}' . + '\x{79C0}\x{79C1}\x{79C2}\x{79C3}\x{79C5}\x{79C6}\x{79C8}\x{79C9}\x{79CA}' . + '\x{79CB}\x{79CD}\x{79CE}\x{79CF}\x{79D0}\x{79D1}\x{79D2}\x{79D3}\x{79D5}' . + '\x{79D6}\x{79D8}\x{79D9}\x{79DA}\x{79DB}\x{79DC}\x{79DD}\x{79DE}\x{79DF}' . + '\x{79E0}\x{79E1}\x{79E2}\x{79E3}\x{79E4}\x{79E5}\x{79E6}\x{79E7}\x{79E8}' . + '\x{79E9}\x{79EA}\x{79EB}\x{79EC}\x{79ED}\x{79EE}\x{79EF}\x{79F0}\x{79F1}' . + '\x{79F2}\x{79F3}\x{79F4}\x{79F5}\x{79F6}\x{79F7}\x{79F8}\x{79F9}\x{79FA}' . + '\x{79FB}\x{79FC}\x{79FD}\x{79FE}\x{79FF}\x{7A00}\x{7A02}\x{7A03}\x{7A04}' . + '\x{7A05}\x{7A06}\x{7A08}\x{7A0A}\x{7A0B}\x{7A0C}\x{7A0D}\x{7A0E}\x{7A0F}' . + '\x{7A10}\x{7A11}\x{7A12}\x{7A13}\x{7A14}\x{7A15}\x{7A16}\x{7A17}\x{7A18}' . + '\x{7A19}\x{7A1A}\x{7A1B}\x{7A1C}\x{7A1D}\x{7A1E}\x{7A1F}\x{7A20}\x{7A21}' . + '\x{7A22}\x{7A23}\x{7A24}\x{7A25}\x{7A26}\x{7A27}\x{7A28}\x{7A29}\x{7A2A}' . + '\x{7A2B}\x{7A2D}\x{7A2E}\x{7A2F}\x{7A30}\x{7A31}\x{7A32}\x{7A33}\x{7A34}' . + '\x{7A35}\x{7A37}\x{7A39}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . + '\x{7A41}\x{7A42}\x{7A43}\x{7A44}\x{7A45}\x{7A46}\x{7A47}\x{7A48}\x{7A49}' . + '\x{7A4A}\x{7A4B}\x{7A4C}\x{7A4D}\x{7A4E}\x{7A50}\x{7A51}\x{7A52}\x{7A53}' . + '\x{7A54}\x{7A55}\x{7A56}\x{7A57}\x{7A58}\x{7A59}\x{7A5A}\x{7A5B}\x{7A5C}' . + '\x{7A5D}\x{7A5E}\x{7A5F}\x{7A60}\x{7A61}\x{7A62}\x{7A65}\x{7A66}\x{7A67}' . + '\x{7A68}\x{7A69}\x{7A6B}\x{7A6C}\x{7A6D}\x{7A6E}\x{7A70}\x{7A71}\x{7A72}' . + '\x{7A73}\x{7A74}\x{7A75}\x{7A76}\x{7A77}\x{7A78}\x{7A79}\x{7A7A}\x{7A7B}' . + '\x{7A7C}\x{7A7D}\x{7A7E}\x{7A7F}\x{7A80}\x{7A81}\x{7A83}\x{7A84}\x{7A85}' . + '\x{7A86}\x{7A87}\x{7A88}\x{7A89}\x{7A8A}\x{7A8B}\x{7A8C}\x{7A8D}\x{7A8E}' . + '\x{7A8F}\x{7A90}\x{7A91}\x{7A92}\x{7A93}\x{7A94}\x{7A95}\x{7A96}\x{7A97}' . + '\x{7A98}\x{7A99}\x{7A9C}\x{7A9D}\x{7A9E}\x{7A9F}\x{7AA0}\x{7AA1}\x{7AA2}' . + '\x{7AA3}\x{7AA4}\x{7AA5}\x{7AA6}\x{7AA7}\x{7AA8}\x{7AA9}\x{7AAA}\x{7AAB}' . + '\x{7AAC}\x{7AAD}\x{7AAE}\x{7AAF}\x{7AB0}\x{7AB1}\x{7AB2}\x{7AB3}\x{7AB4}' . + '\x{7AB5}\x{7AB6}\x{7AB7}\x{7AB8}\x{7ABA}\x{7ABE}\x{7ABF}\x{7AC0}\x{7AC1}' . + '\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}\x{7AC9}\x{7ACA}\x{7ACB}\x{7ACC}\x{7ACD}' . + '\x{7ACE}\x{7ACF}\x{7AD0}\x{7AD1}\x{7AD2}\x{7AD3}\x{7AD4}\x{7AD5}\x{7AD6}' . + '\x{7AD8}\x{7AD9}\x{7ADB}\x{7ADC}\x{7ADD}\x{7ADE}\x{7ADF}\x{7AE0}\x{7AE1}' . + '\x{7AE2}\x{7AE3}\x{7AE4}\x{7AE5}\x{7AE6}\x{7AE7}\x{7AE8}\x{7AEA}\x{7AEB}' . + '\x{7AEC}\x{7AED}\x{7AEE}\x{7AEF}\x{7AF0}\x{7AF1}\x{7AF2}\x{7AF3}\x{7AF4}' . + '\x{7AF6}\x{7AF7}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFB}\x{7AFD}\x{7AFE}\x{7AFF}' . + '\x{7B00}\x{7B01}\x{7B02}\x{7B03}\x{7B04}\x{7B05}\x{7B06}\x{7B08}\x{7B09}' . + '\x{7B0A}\x{7B0B}\x{7B0C}\x{7B0D}\x{7B0E}\x{7B0F}\x{7B10}\x{7B11}\x{7B12}' . + '\x{7B13}\x{7B14}\x{7B15}\x{7B16}\x{7B17}\x{7B18}\x{7B19}\x{7B1A}\x{7B1B}' . + '\x{7B1C}\x{7B1D}\x{7B1E}\x{7B20}\x{7B21}\x{7B22}\x{7B23}\x{7B24}\x{7B25}' . + '\x{7B26}\x{7B28}\x{7B2A}\x{7B2B}\x{7B2C}\x{7B2D}\x{7B2E}\x{7B2F}\x{7B30}' . + '\x{7B31}\x{7B32}\x{7B33}\x{7B34}\x{7B35}\x{7B36}\x{7B37}\x{7B38}\x{7B39}' . + '\x{7B3A}\x{7B3B}\x{7B3C}\x{7B3D}\x{7B3E}\x{7B3F}\x{7B40}\x{7B41}\x{7B43}' . + '\x{7B44}\x{7B45}\x{7B46}\x{7B47}\x{7B48}\x{7B49}\x{7B4A}\x{7B4B}\x{7B4C}' . + '\x{7B4D}\x{7B4E}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B55}\x{7B56}' . + '\x{7B57}\x{7B58}\x{7B59}\x{7B5A}\x{7B5B}\x{7B5C}\x{7B5D}\x{7B5E}\x{7B5F}' . + '\x{7B60}\x{7B61}\x{7B62}\x{7B63}\x{7B64}\x{7B65}\x{7B66}\x{7B67}\x{7B68}' . + '\x{7B69}\x{7B6A}\x{7B6B}\x{7B6C}\x{7B6D}\x{7B6E}\x{7B70}\x{7B71}\x{7B72}' . + '\x{7B73}\x{7B74}\x{7B75}\x{7B76}\x{7B77}\x{7B78}\x{7B79}\x{7B7B}\x{7B7C}' . + '\x{7B7D}\x{7B7E}\x{7B7F}\x{7B80}\x{7B81}\x{7B82}\x{7B83}\x{7B84}\x{7B85}' . + '\x{7B87}\x{7B88}\x{7B89}\x{7B8A}\x{7B8B}\x{7B8C}\x{7B8D}\x{7B8E}\x{7B8F}' . + '\x{7B90}\x{7B91}\x{7B93}\x{7B94}\x{7B95}\x{7B96}\x{7B97}\x{7B98}\x{7B99}' . + '\x{7B9A}\x{7B9B}\x{7B9C}\x{7B9D}\x{7B9E}\x{7B9F}\x{7BA0}\x{7BA1}\x{7BA2}' . + '\x{7BA4}\x{7BA6}\x{7BA7}\x{7BA8}\x{7BA9}\x{7BAA}\x{7BAB}\x{7BAC}\x{7BAD}' . + '\x{7BAE}\x{7BAF}\x{7BB1}\x{7BB3}\x{7BB4}\x{7BB5}\x{7BB6}\x{7BB7}\x{7BB8}' . + '\x{7BB9}\x{7BBA}\x{7BBB}\x{7BBC}\x{7BBD}\x{7BBE}\x{7BBF}\x{7BC0}\x{7BC1}' . + '\x{7BC2}\x{7BC3}\x{7BC4}\x{7BC5}\x{7BC6}\x{7BC7}\x{7BC8}\x{7BC9}\x{7BCA}' . + '\x{7BCB}\x{7BCC}\x{7BCD}\x{7BCE}\x{7BD0}\x{7BD1}\x{7BD2}\x{7BD3}\x{7BD4}' . + '\x{7BD5}\x{7BD6}\x{7BD7}\x{7BD8}\x{7BD9}\x{7BDA}\x{7BDB}\x{7BDC}\x{7BDD}' . + '\x{7BDE}\x{7BDF}\x{7BE0}\x{7BE1}\x{7BE2}\x{7BE3}\x{7BE4}\x{7BE5}\x{7BE6}' . + '\x{7BE7}\x{7BE8}\x{7BE9}\x{7BEA}\x{7BEB}\x{7BEC}\x{7BED}\x{7BEE}\x{7BEF}' . + '\x{7BF0}\x{7BF1}\x{7BF2}\x{7BF3}\x{7BF4}\x{7BF5}\x{7BF6}\x{7BF7}\x{7BF8}' . + '\x{7BF9}\x{7BFB}\x{7BFC}\x{7BFD}\x{7BFE}\x{7BFF}\x{7C00}\x{7C01}\x{7C02}' . + '\x{7C03}\x{7C04}\x{7C05}\x{7C06}\x{7C07}\x{7C08}\x{7C09}\x{7C0A}\x{7C0B}' . + '\x{7C0C}\x{7C0D}\x{7C0E}\x{7C0F}\x{7C10}\x{7C11}\x{7C12}\x{7C13}\x{7C15}' . + '\x{7C16}\x{7C17}\x{7C18}\x{7C19}\x{7C1A}\x{7C1C}\x{7C1D}\x{7C1E}\x{7C1F}' . + '\x{7C20}\x{7C21}\x{7C22}\x{7C23}\x{7C24}\x{7C25}\x{7C26}\x{7C27}\x{7C28}' . + '\x{7C29}\x{7C2A}\x{7C2B}\x{7C2C}\x{7C2D}\x{7C30}\x{7C31}\x{7C32}\x{7C33}' . + '\x{7C34}\x{7C35}\x{7C36}\x{7C37}\x{7C38}\x{7C39}\x{7C3A}\x{7C3B}\x{7C3C}' . + '\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C41}\x{7C42}\x{7C43}\x{7C44}\x{7C45}' . + '\x{7C46}\x{7C47}\x{7C48}\x{7C49}\x{7C4A}\x{7C4B}\x{7C4C}\x{7C4D}\x{7C4E}' . + '\x{7C50}\x{7C51}\x{7C53}\x{7C54}\x{7C56}\x{7C57}\x{7C58}\x{7C59}\x{7C5A}' . + '\x{7C5B}\x{7C5C}\x{7C5E}\x{7C5F}\x{7C60}\x{7C61}\x{7C62}\x{7C63}\x{7C64}' . + '\x{7C65}\x{7C66}\x{7C67}\x{7C68}\x{7C69}\x{7C6A}\x{7C6B}\x{7C6C}\x{7C6D}' . + '\x{7C6E}\x{7C6F}\x{7C70}\x{7C71}\x{7C72}\x{7C73}\x{7C74}\x{7C75}\x{7C77}' . + '\x{7C78}\x{7C79}\x{7C7A}\x{7C7B}\x{7C7C}\x{7C7D}\x{7C7E}\x{7C7F}\x{7C80}' . + '\x{7C81}\x{7C82}\x{7C84}\x{7C85}\x{7C86}\x{7C88}\x{7C89}\x{7C8A}\x{7C8B}' . + '\x{7C8C}\x{7C8D}\x{7C8E}\x{7C8F}\x{7C90}\x{7C91}\x{7C92}\x{7C94}\x{7C95}' . + '\x{7C96}\x{7C97}\x{7C98}\x{7C99}\x{7C9B}\x{7C9C}\x{7C9D}\x{7C9E}\x{7C9F}' . + '\x{7CA0}\x{7CA1}\x{7CA2}\x{7CA3}\x{7CA4}\x{7CA5}\x{7CA6}\x{7CA7}\x{7CA8}' . + '\x{7CA9}\x{7CAA}\x{7CAD}\x{7CAE}\x{7CAF}\x{7CB0}\x{7CB1}\x{7CB2}\x{7CB3}' . + '\x{7CB4}\x{7CB5}\x{7CB6}\x{7CB7}\x{7CB8}\x{7CB9}\x{7CBA}\x{7CBB}\x{7CBC}' . + '\x{7CBD}\x{7CBE}\x{7CBF}\x{7CC0}\x{7CC1}\x{7CC2}\x{7CC3}\x{7CC4}\x{7CC5}' . + '\x{7CC6}\x{7CC7}\x{7CC8}\x{7CC9}\x{7CCA}\x{7CCB}\x{7CCC}\x{7CCD}\x{7CCE}' . + '\x{7CCF}\x{7CD0}\x{7CD1}\x{7CD2}\x{7CD4}\x{7CD5}\x{7CD6}\x{7CD7}\x{7CD8}' . + '\x{7CD9}\x{7CDC}\x{7CDD}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}' . + '\x{7CE8}\x{7CE9}\x{7CEA}\x{7CEB}\x{7CEC}\x{7CED}\x{7CEE}\x{7CEF}\x{7CF0}' . + '\x{7CF1}\x{7CF2}\x{7CF3}\x{7CF4}\x{7CF5}\x{7CF6}\x{7CF7}\x{7CF8}\x{7CF9}' . + '\x{7CFA}\x{7CFB}\x{7CFD}\x{7CFE}\x{7D00}\x{7D01}\x{7D02}\x{7D03}\x{7D04}' . + '\x{7D05}\x{7D06}\x{7D07}\x{7D08}\x{7D09}\x{7D0A}\x{7D0B}\x{7D0C}\x{7D0D}' . + '\x{7D0E}\x{7D0F}\x{7D10}\x{7D11}\x{7D12}\x{7D13}\x{7D14}\x{7D15}\x{7D16}' . + '\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D1D}\x{7D1E}\x{7D1F}' . + '\x{7D20}\x{7D21}\x{7D22}\x{7D24}\x{7D25}\x{7D26}\x{7D27}\x{7D28}\x{7D29}' . + '\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D31}\x{7D32}\x{7D33}\x{7D34}' . + '\x{7D35}\x{7D36}\x{7D37}\x{7D38}\x{7D39}\x{7D3A}\x{7D3B}\x{7D3C}\x{7D3D}' . + '\x{7D3E}\x{7D3F}\x{7D40}\x{7D41}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}' . + '\x{7D47}\x{7D49}\x{7D4A}\x{7D4B}\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D51}' . + '\x{7D52}\x{7D53}\x{7D54}\x{7D55}\x{7D56}\x{7D57}\x{7D58}\x{7D59}\x{7D5B}' . + '\x{7D5C}\x{7D5D}\x{7D5E}\x{7D5F}\x{7D60}\x{7D61}\x{7D62}\x{7D63}\x{7D65}' . + '\x{7D66}\x{7D67}\x{7D68}\x{7D69}\x{7D6A}\x{7D6B}\x{7D6C}\x{7D6D}\x{7D6E}' . + '\x{7D6F}\x{7D70}\x{7D71}\x{7D72}\x{7D73}\x{7D74}\x{7D75}\x{7D76}\x{7D77}' . + '\x{7D79}\x{7D7A}\x{7D7B}\x{7D7C}\x{7D7D}\x{7D7E}\x{7D7F}\x{7D80}\x{7D81}' . + '\x{7D83}\x{7D84}\x{7D85}\x{7D86}\x{7D87}\x{7D88}\x{7D89}\x{7D8A}\x{7D8B}' . + '\x{7D8C}\x{7D8D}\x{7D8E}\x{7D8F}\x{7D90}\x{7D91}\x{7D92}\x{7D93}\x{7D94}' . + '\x{7D96}\x{7D97}\x{7D99}\x{7D9B}\x{7D9C}\x{7D9D}\x{7D9E}\x{7D9F}\x{7DA0}' . + '\x{7DA1}\x{7DA2}\x{7DA3}\x{7DA5}\x{7DA6}\x{7DA7}\x{7DA9}\x{7DAA}\x{7DAB}' . + '\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}\x{7DB1}\x{7DB2}\x{7DB3}\x{7DB4}' . + '\x{7DB5}\x{7DB6}\x{7DB7}\x{7DB8}\x{7DB9}\x{7DBA}\x{7DBB}\x{7DBC}\x{7DBD}' . + '\x{7DBE}\x{7DBF}\x{7DC0}\x{7DC1}\x{7DC2}\x{7DC3}\x{7DC4}\x{7DC5}\x{7DC6}' . + '\x{7DC7}\x{7DC8}\x{7DC9}\x{7DCA}\x{7DCB}\x{7DCC}\x{7DCE}\x{7DCF}\x{7DD0}' . + '\x{7DD1}\x{7DD2}\x{7DD4}\x{7DD5}\x{7DD6}\x{7DD7}\x{7DD8}\x{7DD9}\x{7DDA}' . + '\x{7DDB}\x{7DDD}\x{7DDE}\x{7DDF}\x{7DE0}\x{7DE1}\x{7DE2}\x{7DE3}\x{7DE6}' . + '\x{7DE7}\x{7DE8}\x{7DE9}\x{7DEA}\x{7DEC}\x{7DED}\x{7DEE}\x{7DEF}\x{7DF0}' . + '\x{7DF1}\x{7DF2}\x{7DF3}\x{7DF4}\x{7DF5}\x{7DF6}\x{7DF7}\x{7DF8}\x{7DF9}' . + '\x{7DFA}\x{7DFB}\x{7DFC}\x{7E00}\x{7E01}\x{7E02}\x{7E03}\x{7E04}\x{7E05}' . + '\x{7E06}\x{7E07}\x{7E08}\x{7E09}\x{7E0A}\x{7E0B}\x{7E0C}\x{7E0D}\x{7E0E}' . + '\x{7E0F}\x{7E10}\x{7E11}\x{7E12}\x{7E13}\x{7E14}\x{7E15}\x{7E16}\x{7E17}' . + '\x{7E19}\x{7E1A}\x{7E1B}\x{7E1C}\x{7E1D}\x{7E1E}\x{7E1F}\x{7E20}\x{7E21}' . + '\x{7E22}\x{7E23}\x{7E24}\x{7E25}\x{7E26}\x{7E27}\x{7E28}\x{7E29}\x{7E2A}' . + '\x{7E2B}\x{7E2C}\x{7E2D}\x{7E2E}\x{7E2F}\x{7E30}\x{7E31}\x{7E32}\x{7E33}' . + '\x{7E34}\x{7E35}\x{7E36}\x{7E37}\x{7E38}\x{7E39}\x{7E3A}\x{7E3B}\x{7E3C}' . + '\x{7E3D}\x{7E3E}\x{7E3F}\x{7E40}\x{7E41}\x{7E42}\x{7E43}\x{7E44}\x{7E45}' . + '\x{7E46}\x{7E47}\x{7E48}\x{7E49}\x{7E4C}\x{7E4D}\x{7E4E}\x{7E4F}\x{7E50}' . + '\x{7E51}\x{7E52}\x{7E53}\x{7E54}\x{7E55}\x{7E56}\x{7E57}\x{7E58}\x{7E59}' . + '\x{7E5A}\x{7E5C}\x{7E5D}\x{7E5E}\x{7E5F}\x{7E60}\x{7E61}\x{7E62}\x{7E63}' . + '\x{7E65}\x{7E66}\x{7E67}\x{7E68}\x{7E69}\x{7E6A}\x{7E6B}\x{7E6C}\x{7E6D}' . + '\x{7E6E}\x{7E6F}\x{7E70}\x{7E71}\x{7E72}\x{7E73}\x{7E74}\x{7E75}\x{7E76}' . + '\x{7E77}\x{7E78}\x{7E79}\x{7E7A}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7E}\x{7E7F}' . + '\x{7E80}\x{7E81}\x{7E82}\x{7E83}\x{7E84}\x{7E85}\x{7E86}\x{7E87}\x{7E88}' . + '\x{7E89}\x{7E8A}\x{7E8B}\x{7E8C}\x{7E8D}\x{7E8E}\x{7E8F}\x{7E90}\x{7E91}' . + '\x{7E92}\x{7E93}\x{7E94}\x{7E95}\x{7E96}\x{7E97}\x{7E98}\x{7E99}\x{7E9A}' . + '\x{7E9B}\x{7E9C}\x{7E9E}\x{7E9F}\x{7EA0}\x{7EA1}\x{7EA2}\x{7EA3}\x{7EA4}' . + '\x{7EA5}\x{7EA6}\x{7EA7}\x{7EA8}\x{7EA9}\x{7EAA}\x{7EAB}\x{7EAC}\x{7EAD}' . + '\x{7EAE}\x{7EAF}\x{7EB0}\x{7EB1}\x{7EB2}\x{7EB3}\x{7EB4}\x{7EB5}\x{7EB6}' . + '\x{7EB7}\x{7EB8}\x{7EB9}\x{7EBA}\x{7EBB}\x{7EBC}\x{7EBD}\x{7EBE}\x{7EBF}' . + '\x{7EC0}\x{7EC1}\x{7EC2}\x{7EC3}\x{7EC4}\x{7EC5}\x{7EC6}\x{7EC7}\x{7EC8}' . + '\x{7EC9}\x{7ECA}\x{7ECB}\x{7ECC}\x{7ECD}\x{7ECE}\x{7ECF}\x{7ED0}\x{7ED1}' . + '\x{7ED2}\x{7ED3}\x{7ED4}\x{7ED5}\x{7ED6}\x{7ED7}\x{7ED8}\x{7ED9}\x{7EDA}' . + '\x{7EDB}\x{7EDC}\x{7EDD}\x{7EDE}\x{7EDF}\x{7EE0}\x{7EE1}\x{7EE2}\x{7EE3}' . + '\x{7EE4}\x{7EE5}\x{7EE6}\x{7EE7}\x{7EE8}\x{7EE9}\x{7EEA}\x{7EEB}\x{7EEC}' . + '\x{7EED}\x{7EEE}\x{7EEF}\x{7EF0}\x{7EF1}\x{7EF2}\x{7EF3}\x{7EF4}\x{7EF5}' . + '\x{7EF6}\x{7EF7}\x{7EF8}\x{7EF9}\x{7EFA}\x{7EFB}\x{7EFC}\x{7EFD}\x{7EFE}' . + '\x{7EFF}\x{7F00}\x{7F01}\x{7F02}\x{7F03}\x{7F04}\x{7F05}\x{7F06}\x{7F07}' . + '\x{7F08}\x{7F09}\x{7F0A}\x{7F0B}\x{7F0C}\x{7F0D}\x{7F0E}\x{7F0F}\x{7F10}' . + '\x{7F11}\x{7F12}\x{7F13}\x{7F14}\x{7F15}\x{7F16}\x{7F17}\x{7F18}\x{7F19}' . + '\x{7F1A}\x{7F1B}\x{7F1C}\x{7F1D}\x{7F1E}\x{7F1F}\x{7F20}\x{7F21}\x{7F22}' . + '\x{7F23}\x{7F24}\x{7F25}\x{7F26}\x{7F27}\x{7F28}\x{7F29}\x{7F2A}\x{7F2B}' . + '\x{7F2C}\x{7F2D}\x{7F2E}\x{7F2F}\x{7F30}\x{7F31}\x{7F32}\x{7F33}\x{7F34}' . + '\x{7F35}\x{7F36}\x{7F37}\x{7F38}\x{7F39}\x{7F3A}\x{7F3D}\x{7F3E}\x{7F3F}' . + '\x{7F40}\x{7F42}\x{7F43}\x{7F44}\x{7F45}\x{7F47}\x{7F48}\x{7F49}\x{7F4A}' . + '\x{7F4B}\x{7F4C}\x{7F4D}\x{7F4E}\x{7F4F}\x{7F50}\x{7F51}\x{7F52}\x{7F53}' . + '\x{7F54}\x{7F55}\x{7F56}\x{7F57}\x{7F58}\x{7F5A}\x{7F5B}\x{7F5C}\x{7F5D}' . + '\x{7F5E}\x{7F5F}\x{7F60}\x{7F61}\x{7F62}\x{7F63}\x{7F64}\x{7F65}\x{7F66}' . + '\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6C}\x{7F6D}\x{7F6E}\x{7F6F}' . + '\x{7F70}\x{7F71}\x{7F72}\x{7F73}\x{7F74}\x{7F75}\x{7F76}\x{7F77}\x{7F78}' . + '\x{7F79}\x{7F7A}\x{7F7B}\x{7F7C}\x{7F7D}\x{7F7E}\x{7F7F}\x{7F80}\x{7F81}' . + '\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}\x{7F88}\x{7F89}\x{7F8A}\x{7F8B}' . + '\x{7F8C}\x{7F8D}\x{7F8E}\x{7F8F}\x{7F91}\x{7F92}\x{7F93}\x{7F94}\x{7F95}' . + '\x{7F96}\x{7F98}\x{7F9A}\x{7F9B}\x{7F9C}\x{7F9D}\x{7F9E}\x{7F9F}\x{7FA0}' . + '\x{7FA1}\x{7FA2}\x{7FA3}\x{7FA4}\x{7FA5}\x{7FA6}\x{7FA7}\x{7FA8}\x{7FA9}' . + '\x{7FAA}\x{7FAB}\x{7FAC}\x{7FAD}\x{7FAE}\x{7FAF}\x{7FB0}\x{7FB1}\x{7FB2}' . + '\x{7FB3}\x{7FB5}\x{7FB6}\x{7FB7}\x{7FB8}\x{7FB9}\x{7FBA}\x{7FBB}\x{7FBC}' . + '\x{7FBD}\x{7FBE}\x{7FBF}\x{7FC0}\x{7FC1}\x{7FC2}\x{7FC3}\x{7FC4}\x{7FC5}' . + '\x{7FC6}\x{7FC7}\x{7FC8}\x{7FC9}\x{7FCA}\x{7FCB}\x{7FCC}\x{7FCD}\x{7FCE}' . + '\x{7FCF}\x{7FD0}\x{7FD1}\x{7FD2}\x{7FD3}\x{7FD4}\x{7FD5}\x{7FD7}\x{7FD8}' . + '\x{7FD9}\x{7FDA}\x{7FDB}\x{7FDC}\x{7FDE}\x{7FDF}\x{7FE0}\x{7FE1}\x{7FE2}' . + '\x{7FE3}\x{7FE5}\x{7FE6}\x{7FE7}\x{7FE8}\x{7FE9}\x{7FEA}\x{7FEB}\x{7FEC}' . + '\x{7FED}\x{7FEE}\x{7FEF}\x{7FF0}\x{7FF1}\x{7FF2}\x{7FF3}\x{7FF4}\x{7FF5}' . + '\x{7FF6}\x{7FF7}\x{7FF8}\x{7FF9}\x{7FFA}\x{7FFB}\x{7FFC}\x{7FFD}\x{7FFE}' . + '\x{7FFF}\x{8000}\x{8001}\x{8002}\x{8003}\x{8004}\x{8005}\x{8006}\x{8007}' . + '\x{8008}\x{8009}\x{800B}\x{800C}\x{800D}\x{800E}\x{800F}\x{8010}\x{8011}' . + '\x{8012}\x{8013}\x{8014}\x{8015}\x{8016}\x{8017}\x{8018}\x{8019}\x{801A}' . + '\x{801B}\x{801C}\x{801D}\x{801E}\x{801F}\x{8020}\x{8021}\x{8022}\x{8023}' . + '\x{8024}\x{8025}\x{8026}\x{8027}\x{8028}\x{8029}\x{802A}\x{802B}\x{802C}' . + '\x{802D}\x{802E}\x{8030}\x{8031}\x{8032}\x{8033}\x{8034}\x{8035}\x{8036}' . + '\x{8037}\x{8038}\x{8039}\x{803A}\x{803B}\x{803D}\x{803E}\x{803F}\x{8041}' . + '\x{8042}\x{8043}\x{8044}\x{8045}\x{8046}\x{8047}\x{8048}\x{8049}\x{804A}' . + '\x{804B}\x{804C}\x{804D}\x{804E}\x{804F}\x{8050}\x{8051}\x{8052}\x{8053}' . + '\x{8054}\x{8055}\x{8056}\x{8057}\x{8058}\x{8059}\x{805A}\x{805B}\x{805C}' . + '\x{805D}\x{805E}\x{805F}\x{8060}\x{8061}\x{8062}\x{8063}\x{8064}\x{8065}' . + '\x{8067}\x{8068}\x{8069}\x{806A}\x{806B}\x{806C}\x{806D}\x{806E}\x{806F}' . + '\x{8070}\x{8071}\x{8072}\x{8073}\x{8074}\x{8075}\x{8076}\x{8077}\x{8078}' . + '\x{8079}\x{807A}\x{807B}\x{807C}\x{807D}\x{807E}\x{807F}\x{8080}\x{8081}' . + '\x{8082}\x{8083}\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808A}\x{808B}' . + '\x{808C}\x{808D}\x{808F}\x{8090}\x{8091}\x{8092}\x{8093}\x{8095}\x{8096}' . + '\x{8097}\x{8098}\x{8099}\x{809A}\x{809B}\x{809C}\x{809D}\x{809E}\x{809F}' . + '\x{80A0}\x{80A1}\x{80A2}\x{80A3}\x{80A4}\x{80A5}\x{80A9}\x{80AA}\x{80AB}' . + '\x{80AD}\x{80AE}\x{80AF}\x{80B0}\x{80B1}\x{80B2}\x{80B4}\x{80B5}\x{80B6}' . + '\x{80B7}\x{80B8}\x{80BA}\x{80BB}\x{80BC}\x{80BD}\x{80BE}\x{80BF}\x{80C0}' . + '\x{80C1}\x{80C2}\x{80C3}\x{80C4}\x{80C5}\x{80C6}\x{80C7}\x{80C8}\x{80C9}' . + '\x{80CA}\x{80CB}\x{80CC}\x{80CD}\x{80CE}\x{80CF}\x{80D0}\x{80D1}\x{80D2}' . + '\x{80D3}\x{80D4}\x{80D5}\x{80D6}\x{80D7}\x{80D8}\x{80D9}\x{80DA}\x{80DB}' . + '\x{80DC}\x{80DD}\x{80DE}\x{80E0}\x{80E1}\x{80E2}\x{80E3}\x{80E4}\x{80E5}' . + '\x{80E6}\x{80E7}\x{80E8}\x{80E9}\x{80EA}\x{80EB}\x{80EC}\x{80ED}\x{80EE}' . + '\x{80EF}\x{80F0}\x{80F1}\x{80F2}\x{80F3}\x{80F4}\x{80F5}\x{80F6}\x{80F7}' . + '\x{80F8}\x{80F9}\x{80FA}\x{80FB}\x{80FC}\x{80FD}\x{80FE}\x{80FF}\x{8100}' . + '\x{8101}\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{810B}' . + '\x{810C}\x{810D}\x{810E}\x{810F}\x{8110}\x{8111}\x{8112}\x{8113}\x{8114}' . + '\x{8115}\x{8116}\x{8118}\x{8119}\x{811A}\x{811B}\x{811C}\x{811D}\x{811E}' . + '\x{811F}\x{8120}\x{8121}\x{8122}\x{8123}\x{8124}\x{8125}\x{8126}\x{8127}' . + '\x{8128}\x{8129}\x{812A}\x{812B}\x{812C}\x{812D}\x{812E}\x{812F}\x{8130}' . + '\x{8131}\x{8132}\x{8136}\x{8137}\x{8138}\x{8139}\x{813A}\x{813B}\x{813C}' . + '\x{813D}\x{813E}\x{813F}\x{8140}\x{8141}\x{8142}\x{8143}\x{8144}\x{8145}' . + '\x{8146}\x{8147}\x{8148}\x{8149}\x{814A}\x{814B}\x{814C}\x{814D}\x{814E}' . + '\x{814F}\x{8150}\x{8151}\x{8152}\x{8153}\x{8154}\x{8155}\x{8156}\x{8157}' . + '\x{8158}\x{8159}\x{815A}\x{815B}\x{815C}\x{815D}\x{815E}\x{8160}\x{8161}' . + '\x{8162}\x{8163}\x{8164}\x{8165}\x{8166}\x{8167}\x{8168}\x{8169}\x{816A}' . + '\x{816B}\x{816C}\x{816D}\x{816E}\x{816F}\x{8170}\x{8171}\x{8172}\x{8173}' . + '\x{8174}\x{8175}\x{8176}\x{8177}\x{8178}\x{8179}\x{817A}\x{817B}\x{817C}' . + '\x{817D}\x{817E}\x{817F}\x{8180}\x{8181}\x{8182}\x{8183}\x{8185}\x{8186}' . + '\x{8187}\x{8188}\x{8189}\x{818A}\x{818B}\x{818C}\x{818D}\x{818E}\x{818F}' . + '\x{8191}\x{8192}\x{8193}\x{8194}\x{8195}\x{8197}\x{8198}\x{8199}\x{819A}' . + '\x{819B}\x{819C}\x{819D}\x{819E}\x{819F}\x{81A0}\x{81A1}\x{81A2}\x{81A3}' . + '\x{81A4}\x{81A5}\x{81A6}\x{81A7}\x{81A8}\x{81A9}\x{81AA}\x{81AB}\x{81AC}' . + '\x{81AD}\x{81AE}\x{81AF}\x{81B0}\x{81B1}\x{81B2}\x{81B3}\x{81B4}\x{81B5}' . + '\x{81B6}\x{81B7}\x{81B8}\x{81B9}\x{81BA}\x{81BB}\x{81BC}\x{81BD}\x{81BE}' . + '\x{81BF}\x{81C0}\x{81C1}\x{81C2}\x{81C3}\x{81C4}\x{81C5}\x{81C6}\x{81C7}' . + '\x{81C8}\x{81C9}\x{81CA}\x{81CC}\x{81CD}\x{81CE}\x{81CF}\x{81D0}\x{81D1}' . + '\x{81D2}\x{81D4}\x{81D5}\x{81D6}\x{81D7}\x{81D8}\x{81D9}\x{81DA}\x{81DB}' . + '\x{81DC}\x{81DD}\x{81DE}\x{81DF}\x{81E0}\x{81E1}\x{81E2}\x{81E3}\x{81E5}' . + '\x{81E6}\x{81E7}\x{81E8}\x{81E9}\x{81EA}\x{81EB}\x{81EC}\x{81ED}\x{81EE}' . + '\x{81F1}\x{81F2}\x{81F3}\x{81F4}\x{81F5}\x{81F6}\x{81F7}\x{81F8}\x{81F9}' . + '\x{81FA}\x{81FB}\x{81FC}\x{81FD}\x{81FE}\x{81FF}\x{8200}\x{8201}\x{8202}' . + '\x{8203}\x{8204}\x{8205}\x{8206}\x{8207}\x{8208}\x{8209}\x{820A}\x{820B}' . + '\x{820C}\x{820D}\x{820E}\x{820F}\x{8210}\x{8211}\x{8212}\x{8214}\x{8215}' . + '\x{8216}\x{8218}\x{8219}\x{821A}\x{821B}\x{821C}\x{821D}\x{821E}\x{821F}' . + '\x{8220}\x{8221}\x{8222}\x{8223}\x{8225}\x{8226}\x{8227}\x{8228}\x{8229}' . + '\x{822A}\x{822B}\x{822C}\x{822D}\x{822F}\x{8230}\x{8231}\x{8232}\x{8233}' . + '\x{8234}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{823A}\x{823B}\x{823C}' . + '\x{823D}\x{823E}\x{823F}\x{8240}\x{8242}\x{8243}\x{8244}\x{8245}\x{8246}' . + '\x{8247}\x{8248}\x{8249}\x{824A}\x{824B}\x{824C}\x{824D}\x{824E}\x{824F}' . + '\x{8250}\x{8251}\x{8252}\x{8253}\x{8254}\x{8255}\x{8256}\x{8257}\x{8258}' . + '\x{8259}\x{825A}\x{825B}\x{825C}\x{825D}\x{825E}\x{825F}\x{8260}\x{8261}' . + '\x{8263}\x{8264}\x{8266}\x{8267}\x{8268}\x{8269}\x{826A}\x{826B}\x{826C}' . + '\x{826D}\x{826E}\x{826F}\x{8270}\x{8271}\x{8272}\x{8273}\x{8274}\x{8275}' . + '\x{8276}\x{8277}\x{8278}\x{8279}\x{827A}\x{827B}\x{827C}\x{827D}\x{827E}' . + '\x{827F}\x{8280}\x{8281}\x{8282}\x{8283}\x{8284}\x{8285}\x{8286}\x{8287}' . + '\x{8288}\x{8289}\x{828A}\x{828B}\x{828D}\x{828E}\x{828F}\x{8290}\x{8291}' . + '\x{8292}\x{8293}\x{8294}\x{8295}\x{8296}\x{8297}\x{8298}\x{8299}\x{829A}' . + '\x{829B}\x{829C}\x{829D}\x{829E}\x{829F}\x{82A0}\x{82A1}\x{82A2}\x{82A3}' . + '\x{82A4}\x{82A5}\x{82A6}\x{82A7}\x{82A8}\x{82A9}\x{82AA}\x{82AB}\x{82AC}' . + '\x{82AD}\x{82AE}\x{82AF}\x{82B0}\x{82B1}\x{82B3}\x{82B4}\x{82B5}\x{82B6}' . + '\x{82B7}\x{82B8}\x{82B9}\x{82BA}\x{82BB}\x{82BC}\x{82BD}\x{82BE}\x{82BF}' . + '\x{82C0}\x{82C1}\x{82C2}\x{82C3}\x{82C4}\x{82C5}\x{82C6}\x{82C7}\x{82C8}' . + '\x{82C9}\x{82CA}\x{82CB}\x{82CC}\x{82CD}\x{82CE}\x{82CF}\x{82D0}\x{82D1}' . + '\x{82D2}\x{82D3}\x{82D4}\x{82D5}\x{82D6}\x{82D7}\x{82D8}\x{82D9}\x{82DA}' . + '\x{82DB}\x{82DC}\x{82DD}\x{82DE}\x{82DF}\x{82E0}\x{82E1}\x{82E3}\x{82E4}' . + '\x{82E5}\x{82E6}\x{82E7}\x{82E8}\x{82E9}\x{82EA}\x{82EB}\x{82EC}\x{82ED}' . + '\x{82EE}\x{82EF}\x{82F0}\x{82F1}\x{82F2}\x{82F3}\x{82F4}\x{82F5}\x{82F6}' . + '\x{82F7}\x{82F8}\x{82F9}\x{82FA}\x{82FB}\x{82FD}\x{82FE}\x{82FF}\x{8300}' . + '\x{8301}\x{8302}\x{8303}\x{8304}\x{8305}\x{8306}\x{8307}\x{8308}\x{8309}' . + '\x{830B}\x{830C}\x{830D}\x{830E}\x{830F}\x{8311}\x{8312}\x{8313}\x{8314}' . + '\x{8315}\x{8316}\x{8317}\x{8318}\x{8319}\x{831A}\x{831B}\x{831C}\x{831D}' . + '\x{831E}\x{831F}\x{8320}\x{8321}\x{8322}\x{8323}\x{8324}\x{8325}\x{8326}' . + '\x{8327}\x{8328}\x{8329}\x{832A}\x{832B}\x{832C}\x{832D}\x{832E}\x{832F}' . + '\x{8331}\x{8332}\x{8333}\x{8334}\x{8335}\x{8336}\x{8337}\x{8338}\x{8339}' . + '\x{833A}\x{833B}\x{833C}\x{833D}\x{833E}\x{833F}\x{8340}\x{8341}\x{8342}' . + '\x{8343}\x{8344}\x{8345}\x{8346}\x{8347}\x{8348}\x{8349}\x{834A}\x{834B}' . + '\x{834C}\x{834D}\x{834E}\x{834F}\x{8350}\x{8351}\x{8352}\x{8353}\x{8354}' . + '\x{8356}\x{8357}\x{8358}\x{8359}\x{835A}\x{835B}\x{835C}\x{835D}\x{835E}' . + '\x{835F}\x{8360}\x{8361}\x{8362}\x{8363}\x{8364}\x{8365}\x{8366}\x{8367}' . + '\x{8368}\x{8369}\x{836A}\x{836B}\x{836C}\x{836D}\x{836E}\x{836F}\x{8370}' . + '\x{8371}\x{8372}\x{8373}\x{8374}\x{8375}\x{8376}\x{8377}\x{8378}\x{8379}' . + '\x{837A}\x{837B}\x{837C}\x{837D}\x{837E}\x{837F}\x{8380}\x{8381}\x{8382}' . + '\x{8383}\x{8384}\x{8385}\x{8386}\x{8387}\x{8388}\x{8389}\x{838A}\x{838B}' . + '\x{838C}\x{838D}\x{838E}\x{838F}\x{8390}\x{8391}\x{8392}\x{8393}\x{8394}' . + '\x{8395}\x{8396}\x{8397}\x{8398}\x{8399}\x{839A}\x{839B}\x{839C}\x{839D}' . + '\x{839E}\x{83A0}\x{83A1}\x{83A2}\x{83A3}\x{83A4}\x{83A5}\x{83A6}\x{83A7}' . + '\x{83A8}\x{83A9}\x{83AA}\x{83AB}\x{83AC}\x{83AD}\x{83AE}\x{83AF}\x{83B0}' . + '\x{83B1}\x{83B2}\x{83B3}\x{83B4}\x{83B6}\x{83B7}\x{83B8}\x{83B9}\x{83BA}' . + '\x{83BB}\x{83BC}\x{83BD}\x{83BF}\x{83C0}\x{83C1}\x{83C2}\x{83C3}\x{83C4}' . + '\x{83C5}\x{83C6}\x{83C7}\x{83C8}\x{83C9}\x{83CA}\x{83CB}\x{83CC}\x{83CD}' . + '\x{83CE}\x{83CF}\x{83D0}\x{83D1}\x{83D2}\x{83D3}\x{83D4}\x{83D5}\x{83D6}' . + '\x{83D7}\x{83D8}\x{83D9}\x{83DA}\x{83DB}\x{83DC}\x{83DD}\x{83DE}\x{83DF}' . + '\x{83E0}\x{83E1}\x{83E2}\x{83E3}\x{83E4}\x{83E5}\x{83E7}\x{83E8}\x{83E9}' . + '\x{83EA}\x{83EB}\x{83EC}\x{83EE}\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F3}' . + '\x{83F4}\x{83F5}\x{83F6}\x{83F7}\x{83F8}\x{83F9}\x{83FA}\x{83FB}\x{83FC}' . + '\x{83FD}\x{83FE}\x{83FF}\x{8400}\x{8401}\x{8402}\x{8403}\x{8404}\x{8405}' . + '\x{8406}\x{8407}\x{8408}\x{8409}\x{840A}\x{840B}\x{840C}\x{840D}\x{840E}' . + '\x{840F}\x{8410}\x{8411}\x{8412}\x{8413}\x{8415}\x{8418}\x{8419}\x{841A}' . + '\x{841B}\x{841C}\x{841D}\x{841E}\x{8421}\x{8422}\x{8423}\x{8424}\x{8425}' . + '\x{8426}\x{8427}\x{8428}\x{8429}\x{842A}\x{842B}\x{842C}\x{842D}\x{842E}' . + '\x{842F}\x{8430}\x{8431}\x{8432}\x{8433}\x{8434}\x{8435}\x{8436}\x{8437}' . + '\x{8438}\x{8439}\x{843A}\x{843B}\x{843C}\x{843D}\x{843E}\x{843F}\x{8440}' . + '\x{8441}\x{8442}\x{8443}\x{8444}\x{8445}\x{8446}\x{8447}\x{8448}\x{8449}' . + '\x{844A}\x{844B}\x{844C}\x{844D}\x{844E}\x{844F}\x{8450}\x{8451}\x{8452}' . + '\x{8453}\x{8454}\x{8455}\x{8456}\x{8457}\x{8459}\x{845A}\x{845B}\x{845C}' . + '\x{845D}\x{845E}\x{845F}\x{8460}\x{8461}\x{8462}\x{8463}\x{8464}\x{8465}' . + '\x{8466}\x{8467}\x{8468}\x{8469}\x{846A}\x{846B}\x{846C}\x{846D}\x{846E}' . + '\x{846F}\x{8470}\x{8471}\x{8472}\x{8473}\x{8474}\x{8475}\x{8476}\x{8477}' . + '\x{8478}\x{8479}\x{847A}\x{847B}\x{847C}\x{847D}\x{847E}\x{847F}\x{8480}' . + '\x{8481}\x{8482}\x{8484}\x{8485}\x{8486}\x{8487}\x{8488}\x{8489}\x{848A}' . + '\x{848B}\x{848C}\x{848D}\x{848E}\x{848F}\x{8490}\x{8491}\x{8492}\x{8493}' . + '\x{8494}\x{8496}\x{8497}\x{8498}\x{8499}\x{849A}\x{849B}\x{849C}\x{849D}' . + '\x{849E}\x{849F}\x{84A0}\x{84A1}\x{84A2}\x{84A3}\x{84A4}\x{84A5}\x{84A6}' . + '\x{84A7}\x{84A8}\x{84A9}\x{84AA}\x{84AB}\x{84AC}\x{84AE}\x{84AF}\x{84B0}' . + '\x{84B1}\x{84B2}\x{84B3}\x{84B4}\x{84B5}\x{84B6}\x{84B8}\x{84B9}\x{84BA}' . + '\x{84BB}\x{84BC}\x{84BD}\x{84BE}\x{84BF}\x{84C0}\x{84C1}\x{84C2}\x{84C4}' . + '\x{84C5}\x{84C6}\x{84C7}\x{84C8}\x{84C9}\x{84CA}\x{84CB}\x{84CC}\x{84CD}' . + '\x{84CE}\x{84CF}\x{84D0}\x{84D1}\x{84D2}\x{84D3}\x{84D4}\x{84D5}\x{84D6}' . + '\x{84D7}\x{84D8}\x{84D9}\x{84DB}\x{84DC}\x{84DD}\x{84DE}\x{84DF}\x{84E0}' . + '\x{84E1}\x{84E2}\x{84E3}\x{84E4}\x{84E5}\x{84E6}\x{84E7}\x{84E8}\x{84E9}' . + '\x{84EA}\x{84EB}\x{84EC}\x{84EE}\x{84EF}\x{84F0}\x{84F1}\x{84F2}\x{84F3}' . + '\x{84F4}\x{84F5}\x{84F6}\x{84F7}\x{84F8}\x{84F9}\x{84FA}\x{84FB}\x{84FC}' . + '\x{84FD}\x{84FE}\x{84FF}\x{8500}\x{8501}\x{8502}\x{8503}\x{8504}\x{8506}' . + '\x{8507}\x{8508}\x{8509}\x{850A}\x{850B}\x{850C}\x{850D}\x{850E}\x{850F}' . + '\x{8511}\x{8512}\x{8513}\x{8514}\x{8515}\x{8516}\x{8517}\x{8518}\x{8519}' . + '\x{851A}\x{851B}\x{851C}\x{851D}\x{851E}\x{851F}\x{8520}\x{8521}\x{8522}' . + '\x{8523}\x{8524}\x{8525}\x{8526}\x{8527}\x{8528}\x{8529}\x{852A}\x{852B}' . + '\x{852C}\x{852D}\x{852E}\x{852F}\x{8530}\x{8531}\x{8534}\x{8535}\x{8536}' . + '\x{8537}\x{8538}\x{8539}\x{853A}\x{853B}\x{853C}\x{853D}\x{853E}\x{853F}' . + '\x{8540}\x{8541}\x{8542}\x{8543}\x{8544}\x{8545}\x{8546}\x{8547}\x{8548}' . + '\x{8549}\x{854A}\x{854B}\x{854D}\x{854E}\x{854F}\x{8551}\x{8552}\x{8553}' . + '\x{8554}\x{8555}\x{8556}\x{8557}\x{8558}\x{8559}\x{855A}\x{855B}\x{855C}' . + '\x{855D}\x{855E}\x{855F}\x{8560}\x{8561}\x{8562}\x{8563}\x{8564}\x{8565}' . + '\x{8566}\x{8567}\x{8568}\x{8569}\x{856A}\x{856B}\x{856C}\x{856D}\x{856E}' . + '\x{856F}\x{8570}\x{8571}\x{8572}\x{8573}\x{8574}\x{8575}\x{8576}\x{8577}' . + '\x{8578}\x{8579}\x{857A}\x{857B}\x{857C}\x{857D}\x{857E}\x{8580}\x{8581}' . + '\x{8582}\x{8583}\x{8584}\x{8585}\x{8586}\x{8587}\x{8588}\x{8589}\x{858A}' . + '\x{858B}\x{858C}\x{858D}\x{858E}\x{858F}\x{8590}\x{8591}\x{8592}\x{8594}' . + '\x{8595}\x{8596}\x{8598}\x{8599}\x{859A}\x{859B}\x{859C}\x{859D}\x{859E}' . + '\x{859F}\x{85A0}\x{85A1}\x{85A2}\x{85A3}\x{85A4}\x{85A5}\x{85A6}\x{85A7}' . + '\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AD}\x{85AE}\x{85AF}\x{85B0}' . + '\x{85B1}\x{85B3}\x{85B4}\x{85B5}\x{85B6}\x{85B7}\x{85B8}\x{85B9}\x{85BA}' . + '\x{85BC}\x{85BD}\x{85BE}\x{85BF}\x{85C0}\x{85C1}\x{85C2}\x{85C3}\x{85C4}' . + '\x{85C5}\x{85C6}\x{85C7}\x{85C8}\x{85C9}\x{85CA}\x{85CB}\x{85CD}\x{85CE}' . + '\x{85CF}\x{85D0}\x{85D1}\x{85D2}\x{85D3}\x{85D4}\x{85D5}\x{85D6}\x{85D7}' . + '\x{85D8}\x{85D9}\x{85DA}\x{85DB}\x{85DC}\x{85DD}\x{85DE}\x{85DF}\x{85E0}' . + '\x{85E1}\x{85E2}\x{85E3}\x{85E4}\x{85E5}\x{85E6}\x{85E7}\x{85E8}\x{85E9}' . + '\x{85EA}\x{85EB}\x{85EC}\x{85ED}\x{85EF}\x{85F0}\x{85F1}\x{85F2}\x{85F4}' . + '\x{85F5}\x{85F6}\x{85F7}\x{85F8}\x{85F9}\x{85FA}\x{85FB}\x{85FD}\x{85FE}' . + '\x{85FF}\x{8600}\x{8601}\x{8602}\x{8604}\x{8605}\x{8606}\x{8607}\x{8608}' . + '\x{8609}\x{860A}\x{860B}\x{860C}\x{860F}\x{8611}\x{8612}\x{8613}\x{8614}' . + '\x{8616}\x{8617}\x{8618}\x{8619}\x{861A}\x{861B}\x{861C}\x{861E}\x{861F}' . + '\x{8620}\x{8621}\x{8622}\x{8623}\x{8624}\x{8625}\x{8626}\x{8627}\x{8628}' . + '\x{8629}\x{862A}\x{862B}\x{862C}\x{862D}\x{862E}\x{862F}\x{8630}\x{8631}' . + '\x{8632}\x{8633}\x{8634}\x{8635}\x{8636}\x{8638}\x{8639}\x{863A}\x{863B}' . + '\x{863C}\x{863D}\x{863E}\x{863F}\x{8640}\x{8641}\x{8642}\x{8643}\x{8644}' . + '\x{8645}\x{8646}\x{8647}\x{8648}\x{8649}\x{864A}\x{864B}\x{864C}\x{864D}' . + '\x{864E}\x{864F}\x{8650}\x{8651}\x{8652}\x{8653}\x{8654}\x{8655}\x{8656}' . + '\x{8658}\x{8659}\x{865A}\x{865B}\x{865C}\x{865D}\x{865E}\x{865F}\x{8660}' . + '\x{8661}\x{8662}\x{8663}\x{8664}\x{8665}\x{8666}\x{8667}\x{8668}\x{8669}' . + '\x{866A}\x{866B}\x{866C}\x{866D}\x{866E}\x{866F}\x{8670}\x{8671}\x{8672}' . + '\x{8673}\x{8674}\x{8676}\x{8677}\x{8678}\x{8679}\x{867A}\x{867B}\x{867C}' . + '\x{867D}\x{867E}\x{867F}\x{8680}\x{8681}\x{8682}\x{8683}\x{8684}\x{8685}' . + '\x{8686}\x{8687}\x{8688}\x{868A}\x{868B}\x{868C}\x{868D}\x{868E}\x{868F}' . + '\x{8690}\x{8691}\x{8693}\x{8694}\x{8695}\x{8696}\x{8697}\x{8698}\x{8699}' . + '\x{869A}\x{869B}\x{869C}\x{869D}\x{869E}\x{869F}\x{86A1}\x{86A2}\x{86A3}' . + '\x{86A4}\x{86A5}\x{86A7}\x{86A8}\x{86A9}\x{86AA}\x{86AB}\x{86AC}\x{86AD}' . + '\x{86AE}\x{86AF}\x{86B0}\x{86B1}\x{86B2}\x{86B3}\x{86B4}\x{86B5}\x{86B6}' . + '\x{86B7}\x{86B8}\x{86B9}\x{86BA}\x{86BB}\x{86BC}\x{86BD}\x{86BE}\x{86BF}' . + '\x{86C0}\x{86C1}\x{86C2}\x{86C3}\x{86C4}\x{86C5}\x{86C6}\x{86C7}\x{86C8}' . + '\x{86C9}\x{86CA}\x{86CB}\x{86CC}\x{86CE}\x{86CF}\x{86D0}\x{86D1}\x{86D2}' . + '\x{86D3}\x{86D4}\x{86D6}\x{86D7}\x{86D8}\x{86D9}\x{86DA}\x{86DB}\x{86DC}' . + '\x{86DD}\x{86DE}\x{86DF}\x{86E1}\x{86E2}\x{86E3}\x{86E4}\x{86E5}\x{86E6}' . + '\x{86E8}\x{86E9}\x{86EA}\x{86EB}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F0}' . + '\x{86F1}\x{86F2}\x{86F3}\x{86F4}\x{86F5}\x{86F6}\x{86F7}\x{86F8}\x{86F9}' . + '\x{86FA}\x{86FB}\x{86FC}\x{86FE}\x{86FF}\x{8700}\x{8701}\x{8702}\x{8703}' . + '\x{8704}\x{8705}\x{8706}\x{8707}\x{8708}\x{8709}\x{870A}\x{870B}\x{870C}' . + '\x{870D}\x{870E}\x{870F}\x{8710}\x{8711}\x{8712}\x{8713}\x{8714}\x{8715}' . + '\x{8716}\x{8717}\x{8718}\x{8719}\x{871A}\x{871B}\x{871C}\x{871E}\x{871F}' . + '\x{8720}\x{8721}\x{8722}\x{8723}\x{8724}\x{8725}\x{8726}\x{8727}\x{8728}' . + '\x{8729}\x{872A}\x{872B}\x{872C}\x{872D}\x{872E}\x{8730}\x{8731}\x{8732}' . + '\x{8733}\x{8734}\x{8735}\x{8736}\x{8737}\x{8738}\x{8739}\x{873A}\x{873B}' . + '\x{873C}\x{873E}\x{873F}\x{8740}\x{8741}\x{8742}\x{8743}\x{8744}\x{8746}' . + '\x{8747}\x{8748}\x{8749}\x{874A}\x{874C}\x{874D}\x{874E}\x{874F}\x{8750}' . + '\x{8751}\x{8752}\x{8753}\x{8754}\x{8755}\x{8756}\x{8757}\x{8758}\x{8759}' . + '\x{875A}\x{875B}\x{875C}\x{875D}\x{875E}\x{875F}\x{8760}\x{8761}\x{8762}' . + '\x{8763}\x{8764}\x{8765}\x{8766}\x{8767}\x{8768}\x{8769}\x{876A}\x{876B}' . + '\x{876C}\x{876D}\x{876E}\x{876F}\x{8770}\x{8772}\x{8773}\x{8774}\x{8775}' . + '\x{8776}\x{8777}\x{8778}\x{8779}\x{877A}\x{877B}\x{877C}\x{877D}\x{877E}' . + '\x{8780}\x{8781}\x{8782}\x{8783}\x{8784}\x{8785}\x{8786}\x{8787}\x{8788}' . + '\x{8789}\x{878A}\x{878B}\x{878C}\x{878D}\x{878F}\x{8790}\x{8791}\x{8792}' . + '\x{8793}\x{8794}\x{8795}\x{8796}\x{8797}\x{8798}\x{879A}\x{879B}\x{879C}' . + '\x{879D}\x{879E}\x{879F}\x{87A0}\x{87A1}\x{87A2}\x{87A3}\x{87A4}\x{87A5}' . + '\x{87A6}\x{87A7}\x{87A8}\x{87A9}\x{87AA}\x{87AB}\x{87AC}\x{87AD}\x{87AE}' . + '\x{87AF}\x{87B0}\x{87B1}\x{87B2}\x{87B3}\x{87B4}\x{87B5}\x{87B6}\x{87B7}' . + '\x{87B8}\x{87B9}\x{87BA}\x{87BB}\x{87BC}\x{87BD}\x{87BE}\x{87BF}\x{87C0}' . + '\x{87C1}\x{87C2}\x{87C3}\x{87C4}\x{87C5}\x{87C6}\x{87C7}\x{87C8}\x{87C9}' . + '\x{87CA}\x{87CB}\x{87CC}\x{87CD}\x{87CE}\x{87CF}\x{87D0}\x{87D1}\x{87D2}' . + '\x{87D3}\x{87D4}\x{87D5}\x{87D6}\x{87D7}\x{87D8}\x{87D9}\x{87DB}\x{87DC}' . + '\x{87DD}\x{87DE}\x{87DF}\x{87E0}\x{87E1}\x{87E2}\x{87E3}\x{87E4}\x{87E5}' . + '\x{87E6}\x{87E7}\x{87E8}\x{87E9}\x{87EA}\x{87EB}\x{87EC}\x{87ED}\x{87EE}' . + '\x{87EF}\x{87F1}\x{87F2}\x{87F3}\x{87F4}\x{87F5}\x{87F6}\x{87F7}\x{87F8}' . + '\x{87F9}\x{87FA}\x{87FB}\x{87FC}\x{87FD}\x{87FE}\x{87FF}\x{8800}\x{8801}' . + '\x{8802}\x{8803}\x{8804}\x{8805}\x{8806}\x{8808}\x{8809}\x{880A}\x{880B}' . + '\x{880C}\x{880D}\x{880E}\x{880F}\x{8810}\x{8811}\x{8813}\x{8814}\x{8815}' . + '\x{8816}\x{8817}\x{8818}\x{8819}\x{881A}\x{881B}\x{881C}\x{881D}\x{881E}' . + '\x{881F}\x{8820}\x{8821}\x{8822}\x{8823}\x{8824}\x{8825}\x{8826}\x{8827}' . + '\x{8828}\x{8829}\x{882A}\x{882B}\x{882C}\x{882E}\x{882F}\x{8830}\x{8831}' . + '\x{8832}\x{8833}\x{8834}\x{8835}\x{8836}\x{8837}\x{8838}\x{8839}\x{883B}' . + '\x{883C}\x{883D}\x{883E}\x{883F}\x{8840}\x{8841}\x{8842}\x{8843}\x{8844}' . + '\x{8845}\x{8846}\x{8848}\x{8849}\x{884A}\x{884B}\x{884C}\x{884D}\x{884E}' . + '\x{884F}\x{8850}\x{8851}\x{8852}\x{8853}\x{8854}\x{8855}\x{8856}\x{8857}' . + '\x{8859}\x{885A}\x{885B}\x{885D}\x{885E}\x{8860}\x{8861}\x{8862}\x{8863}' . + '\x{8864}\x{8865}\x{8866}\x{8867}\x{8868}\x{8869}\x{886A}\x{886B}\x{886C}' . + '\x{886D}\x{886E}\x{886F}\x{8870}\x{8871}\x{8872}\x{8873}\x{8874}\x{8875}' . + '\x{8876}\x{8877}\x{8878}\x{8879}\x{887B}\x{887C}\x{887D}\x{887E}\x{887F}' . + '\x{8880}\x{8881}\x{8882}\x{8883}\x{8884}\x{8885}\x{8886}\x{8887}\x{8888}' . + '\x{8889}\x{888A}\x{888B}\x{888C}\x{888D}\x{888E}\x{888F}\x{8890}\x{8891}' . + '\x{8892}\x{8893}\x{8894}\x{8895}\x{8896}\x{8897}\x{8898}\x{8899}\x{889A}' . + '\x{889B}\x{889C}\x{889D}\x{889E}\x{889F}\x{88A0}\x{88A1}\x{88A2}\x{88A3}' . + '\x{88A4}\x{88A5}\x{88A6}\x{88A7}\x{88A8}\x{88A9}\x{88AA}\x{88AB}\x{88AC}' . + '\x{88AD}\x{88AE}\x{88AF}\x{88B0}\x{88B1}\x{88B2}\x{88B3}\x{88B4}\x{88B6}' . + '\x{88B7}\x{88B8}\x{88B9}\x{88BA}\x{88BB}\x{88BC}\x{88BD}\x{88BE}\x{88BF}' . + '\x{88C0}\x{88C1}\x{88C2}\x{88C3}\x{88C4}\x{88C5}\x{88C6}\x{88C7}\x{88C8}' . + '\x{88C9}\x{88CA}\x{88CB}\x{88CC}\x{88CD}\x{88CE}\x{88CF}\x{88D0}\x{88D1}' . + '\x{88D2}\x{88D3}\x{88D4}\x{88D5}\x{88D6}\x{88D7}\x{88D8}\x{88D9}\x{88DA}' . + '\x{88DB}\x{88DC}\x{88DD}\x{88DE}\x{88DF}\x{88E0}\x{88E1}\x{88E2}\x{88E3}' . + '\x{88E4}\x{88E5}\x{88E7}\x{88E8}\x{88EA}\x{88EB}\x{88EC}\x{88EE}\x{88EF}' . + '\x{88F0}\x{88F1}\x{88F2}\x{88F3}\x{88F4}\x{88F5}\x{88F6}\x{88F7}\x{88F8}' . + '\x{88F9}\x{88FA}\x{88FB}\x{88FC}\x{88FD}\x{88FE}\x{88FF}\x{8900}\x{8901}' . + '\x{8902}\x{8904}\x{8905}\x{8906}\x{8907}\x{8908}\x{8909}\x{890A}\x{890B}' . + '\x{890C}\x{890D}\x{890E}\x{8910}\x{8911}\x{8912}\x{8913}\x{8914}\x{8915}' . + '\x{8916}\x{8917}\x{8918}\x{8919}\x{891A}\x{891B}\x{891C}\x{891D}\x{891E}' . + '\x{891F}\x{8920}\x{8921}\x{8922}\x{8923}\x{8925}\x{8926}\x{8927}\x{8928}' . + '\x{8929}\x{892A}\x{892B}\x{892C}\x{892D}\x{892E}\x{892F}\x{8930}\x{8931}' . + '\x{8932}\x{8933}\x{8934}\x{8935}\x{8936}\x{8937}\x{8938}\x{8939}\x{893A}' . + '\x{893B}\x{893C}\x{893D}\x{893E}\x{893F}\x{8940}\x{8941}\x{8942}\x{8943}' . + '\x{8944}\x{8945}\x{8946}\x{8947}\x{8948}\x{8949}\x{894A}\x{894B}\x{894C}' . + '\x{894E}\x{894F}\x{8950}\x{8951}\x{8952}\x{8953}\x{8954}\x{8955}\x{8956}' . + '\x{8957}\x{8958}\x{8959}\x{895A}\x{895B}\x{895C}\x{895D}\x{895E}\x{895F}' . + '\x{8960}\x{8961}\x{8962}\x{8963}\x{8964}\x{8966}\x{8967}\x{8968}\x{8969}' . + '\x{896A}\x{896B}\x{896C}\x{896D}\x{896E}\x{896F}\x{8970}\x{8971}\x{8972}' . + '\x{8973}\x{8974}\x{8976}\x{8977}\x{8978}\x{8979}\x{897A}\x{897B}\x{897C}' . + '\x{897E}\x{897F}\x{8980}\x{8981}\x{8982}\x{8983}\x{8984}\x{8985}\x{8986}' . + '\x{8987}\x{8988}\x{8989}\x{898A}\x{898B}\x{898C}\x{898E}\x{898F}\x{8991}' . + '\x{8992}\x{8993}\x{8995}\x{8996}\x{8997}\x{8998}\x{899A}\x{899B}\x{899C}' . + '\x{899D}\x{899E}\x{899F}\x{89A0}\x{89A1}\x{89A2}\x{89A3}\x{89A4}\x{89A5}' . + '\x{89A6}\x{89A7}\x{89A8}\x{89AA}\x{89AB}\x{89AC}\x{89AD}\x{89AE}\x{89AF}' . + '\x{89B1}\x{89B2}\x{89B3}\x{89B5}\x{89B6}\x{89B7}\x{89B8}\x{89B9}\x{89BA}' . + '\x{89BD}\x{89BE}\x{89BF}\x{89C0}\x{89C1}\x{89C2}\x{89C3}\x{89C4}\x{89C5}' . + '\x{89C6}\x{89C7}\x{89C8}\x{89C9}\x{89CA}\x{89CB}\x{89CC}\x{89CD}\x{89CE}' . + '\x{89CF}\x{89D0}\x{89D1}\x{89D2}\x{89D3}\x{89D4}\x{89D5}\x{89D6}\x{89D7}' . + '\x{89D8}\x{89D9}\x{89DA}\x{89DB}\x{89DC}\x{89DD}\x{89DE}\x{89DF}\x{89E0}' . + '\x{89E1}\x{89E2}\x{89E3}\x{89E4}\x{89E5}\x{89E6}\x{89E7}\x{89E8}\x{89E9}' . + '\x{89EA}\x{89EB}\x{89EC}\x{89ED}\x{89EF}\x{89F0}\x{89F1}\x{89F2}\x{89F3}' . + '\x{89F4}\x{89F6}\x{89F7}\x{89F8}\x{89FA}\x{89FB}\x{89FC}\x{89FE}\x{89FF}' . + '\x{8A00}\x{8A01}\x{8A02}\x{8A03}\x{8A04}\x{8A07}\x{8A08}\x{8A09}\x{8A0A}' . + '\x{8A0B}\x{8A0C}\x{8A0D}\x{8A0E}\x{8A0F}\x{8A10}\x{8A11}\x{8A12}\x{8A13}' . + '\x{8A15}\x{8A16}\x{8A17}\x{8A18}\x{8A1A}\x{8A1B}\x{8A1C}\x{8A1D}\x{8A1E}' . + '\x{8A1F}\x{8A22}\x{8A23}\x{8A24}\x{8A25}\x{8A26}\x{8A27}\x{8A28}\x{8A29}' . + '\x{8A2A}\x{8A2C}\x{8A2D}\x{8A2E}\x{8A2F}\x{8A30}\x{8A31}\x{8A32}\x{8A34}' . + '\x{8A35}\x{8A36}\x{8A37}\x{8A38}\x{8A39}\x{8A3A}\x{8A3B}\x{8A3C}\x{8A3E}' . + '\x{8A3F}\x{8A40}\x{8A41}\x{8A42}\x{8A43}\x{8A44}\x{8A45}\x{8A46}\x{8A47}' . + '\x{8A48}\x{8A49}\x{8A4A}\x{8A4C}\x{8A4D}\x{8A4E}\x{8A4F}\x{8A50}\x{8A51}' . + '\x{8A52}\x{8A53}\x{8A54}\x{8A55}\x{8A56}\x{8A57}\x{8A58}\x{8A59}\x{8A5A}' . + '\x{8A5B}\x{8A5C}\x{8A5D}\x{8A5E}\x{8A5F}\x{8A60}\x{8A61}\x{8A62}\x{8A63}' . + '\x{8A65}\x{8A66}\x{8A67}\x{8A68}\x{8A69}\x{8A6A}\x{8A6B}\x{8A6C}\x{8A6D}' . + '\x{8A6E}\x{8A6F}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A74}\x{8A75}\x{8A76}' . + '\x{8A77}\x{8A79}\x{8A7A}\x{8A7B}\x{8A7C}\x{8A7E}\x{8A7F}\x{8A80}\x{8A81}' . + '\x{8A82}\x{8A83}\x{8A84}\x{8A85}\x{8A86}\x{8A87}\x{8A89}\x{8A8A}\x{8A8B}' . + '\x{8A8C}\x{8A8D}\x{8A8E}\x{8A8F}\x{8A90}\x{8A91}\x{8A92}\x{8A93}\x{8A94}' . + '\x{8A95}\x{8A96}\x{8A97}\x{8A98}\x{8A99}\x{8A9A}\x{8A9B}\x{8A9C}\x{8A9D}' . + '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA2}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA7}' . + '\x{8AA8}\x{8AA9}\x{8AAA}\x{8AAB}\x{8AAC}\x{8AAE}\x{8AB0}\x{8AB1}\x{8AB2}' . + '\x{8AB3}\x{8AB4}\x{8AB5}\x{8AB6}\x{8AB8}\x{8AB9}\x{8ABA}\x{8ABB}\x{8ABC}' . + '\x{8ABD}\x{8ABE}\x{8ABF}\x{8AC0}\x{8AC1}\x{8AC2}\x{8AC3}\x{8AC4}\x{8AC5}' . + '\x{8AC6}\x{8AC7}\x{8AC8}\x{8AC9}\x{8ACA}\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACE}' . + '\x{8ACF}\x{8AD1}\x{8AD2}\x{8AD3}\x{8AD4}\x{8AD5}\x{8AD6}\x{8AD7}\x{8AD8}' . + '\x{8AD9}\x{8ADA}\x{8ADB}\x{8ADC}\x{8ADD}\x{8ADE}\x{8ADF}\x{8AE0}\x{8AE1}' . + '\x{8AE2}\x{8AE3}\x{8AE4}\x{8AE5}\x{8AE6}\x{8AE7}\x{8AE8}\x{8AE9}\x{8AEA}' . + '\x{8AEB}\x{8AED}\x{8AEE}\x{8AEF}\x{8AF0}\x{8AF1}\x{8AF2}\x{8AF3}\x{8AF4}' . + '\x{8AF5}\x{8AF6}\x{8AF7}\x{8AF8}\x{8AF9}\x{8AFA}\x{8AFB}\x{8AFC}\x{8AFD}' . + '\x{8AFE}\x{8AFF}\x{8B00}\x{8B01}\x{8B02}\x{8B03}\x{8B04}\x{8B05}\x{8B06}' . + '\x{8B07}\x{8B08}\x{8B09}\x{8B0A}\x{8B0B}\x{8B0D}\x{8B0E}\x{8B0F}\x{8B10}' . + '\x{8B11}\x{8B12}\x{8B13}\x{8B14}\x{8B15}\x{8B16}\x{8B17}\x{8B18}\x{8B19}' . + '\x{8B1A}\x{8B1B}\x{8B1C}\x{8B1D}\x{8B1E}\x{8B1F}\x{8B20}\x{8B21}\x{8B22}' . + '\x{8B23}\x{8B24}\x{8B25}\x{8B26}\x{8B27}\x{8B28}\x{8B2A}\x{8B2B}\x{8B2C}' . + '\x{8B2D}\x{8B2E}\x{8B2F}\x{8B30}\x{8B31}\x{8B33}\x{8B34}\x{8B35}\x{8B36}' . + '\x{8B37}\x{8B39}\x{8B3A}\x{8B3B}\x{8B3C}\x{8B3D}\x{8B3E}\x{8B40}\x{8B41}' . + '\x{8B42}\x{8B43}\x{8B44}\x{8B45}\x{8B46}\x{8B47}\x{8B48}\x{8B49}\x{8B4A}' . + '\x{8B4B}\x{8B4C}\x{8B4D}\x{8B4E}\x{8B4F}\x{8B50}\x{8B51}\x{8B52}\x{8B53}' . + '\x{8B54}\x{8B55}\x{8B56}\x{8B57}\x{8B58}\x{8B59}\x{8B5A}\x{8B5B}\x{8B5C}' . + '\x{8B5D}\x{8B5E}\x{8B5F}\x{8B60}\x{8B63}\x{8B64}\x{8B65}\x{8B66}\x{8B67}' . + '\x{8B68}\x{8B6A}\x{8B6B}\x{8B6C}\x{8B6D}\x{8B6E}\x{8B6F}\x{8B70}\x{8B71}' . + '\x{8B73}\x{8B74}\x{8B76}\x{8B77}\x{8B78}\x{8B79}\x{8B7A}\x{8B7B}\x{8B7D}' . + '\x{8B7E}\x{8B7F}\x{8B80}\x{8B82}\x{8B83}\x{8B84}\x{8B85}\x{8B86}\x{8B88}' . + '\x{8B89}\x{8B8A}\x{8B8B}\x{8B8C}\x{8B8E}\x{8B90}\x{8B91}\x{8B92}\x{8B93}' . + '\x{8B94}\x{8B95}\x{8B96}\x{8B97}\x{8B98}\x{8B99}\x{8B9A}\x{8B9C}\x{8B9D}' . + '\x{8B9E}\x{8B9F}\x{8BA0}\x{8BA1}\x{8BA2}\x{8BA3}\x{8BA4}\x{8BA5}\x{8BA6}' . + '\x{8BA7}\x{8BA8}\x{8BA9}\x{8BAA}\x{8BAB}\x{8BAC}\x{8BAD}\x{8BAE}\x{8BAF}' . + '\x{8BB0}\x{8BB1}\x{8BB2}\x{8BB3}\x{8BB4}\x{8BB5}\x{8BB6}\x{8BB7}\x{8BB8}' . + '\x{8BB9}\x{8BBA}\x{8BBB}\x{8BBC}\x{8BBD}\x{8BBE}\x{8BBF}\x{8BC0}\x{8BC1}' . + '\x{8BC2}\x{8BC3}\x{8BC4}\x{8BC5}\x{8BC6}\x{8BC7}\x{8BC8}\x{8BC9}\x{8BCA}' . + '\x{8BCB}\x{8BCC}\x{8BCD}\x{8BCE}\x{8BCF}\x{8BD0}\x{8BD1}\x{8BD2}\x{8BD3}' . + '\x{8BD4}\x{8BD5}\x{8BD6}\x{8BD7}\x{8BD8}\x{8BD9}\x{8BDA}\x{8BDB}\x{8BDC}' . + '\x{8BDD}\x{8BDE}\x{8BDF}\x{8BE0}\x{8BE1}\x{8BE2}\x{8BE3}\x{8BE4}\x{8BE5}' . + '\x{8BE6}\x{8BE7}\x{8BE8}\x{8BE9}\x{8BEA}\x{8BEB}\x{8BEC}\x{8BED}\x{8BEE}' . + '\x{8BEF}\x{8BF0}\x{8BF1}\x{8BF2}\x{8BF3}\x{8BF4}\x{8BF5}\x{8BF6}\x{8BF7}' . + '\x{8BF8}\x{8BF9}\x{8BFA}\x{8BFB}\x{8BFC}\x{8BFD}\x{8BFE}\x{8BFF}\x{8C00}' . + '\x{8C01}\x{8C02}\x{8C03}\x{8C04}\x{8C05}\x{8C06}\x{8C07}\x{8C08}\x{8C09}' . + '\x{8C0A}\x{8C0B}\x{8C0C}\x{8C0D}\x{8C0E}\x{8C0F}\x{8C10}\x{8C11}\x{8C12}' . + '\x{8C13}\x{8C14}\x{8C15}\x{8C16}\x{8C17}\x{8C18}\x{8C19}\x{8C1A}\x{8C1B}' . + '\x{8C1C}\x{8C1D}\x{8C1E}\x{8C1F}\x{8C20}\x{8C21}\x{8C22}\x{8C23}\x{8C24}' . + '\x{8C25}\x{8C26}\x{8C27}\x{8C28}\x{8C29}\x{8C2A}\x{8C2B}\x{8C2C}\x{8C2D}' . + '\x{8C2E}\x{8C2F}\x{8C30}\x{8C31}\x{8C32}\x{8C33}\x{8C34}\x{8C35}\x{8C36}' . + '\x{8C37}\x{8C39}\x{8C3A}\x{8C3B}\x{8C3C}\x{8C3D}\x{8C3E}\x{8C3F}\x{8C41}' . + '\x{8C42}\x{8C43}\x{8C45}\x{8C46}\x{8C47}\x{8C48}\x{8C49}\x{8C4A}\x{8C4B}' . + '\x{8C4C}\x{8C4D}\x{8C4E}\x{8C4F}\x{8C50}\x{8C54}\x{8C55}\x{8C56}\x{8C57}' . + '\x{8C59}\x{8C5A}\x{8C5B}\x{8C5C}\x{8C5D}\x{8C5E}\x{8C5F}\x{8C60}\x{8C61}' . + '\x{8C62}\x{8C63}\x{8C64}\x{8C65}\x{8C66}\x{8C67}\x{8C68}\x{8C69}\x{8C6A}' . + '\x{8C6B}\x{8C6C}\x{8C6D}\x{8C6E}\x{8C6F}\x{8C70}\x{8C71}\x{8C72}\x{8C73}' . + '\x{8C75}\x{8C76}\x{8C77}\x{8C78}\x{8C79}\x{8C7A}\x{8C7B}\x{8C7D}\x{8C7E}' . + '\x{8C80}\x{8C81}\x{8C82}\x{8C84}\x{8C85}\x{8C86}\x{8C88}\x{8C89}\x{8C8A}' . + '\x{8C8C}\x{8C8D}\x{8C8F}\x{8C90}\x{8C91}\x{8C92}\x{8C93}\x{8C94}\x{8C95}' . + '\x{8C96}\x{8C97}\x{8C98}\x{8C99}\x{8C9A}\x{8C9C}\x{8C9D}\x{8C9E}\x{8C9F}' . + '\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA3}\x{8CA4}\x{8CA5}\x{8CA7}\x{8CA8}\x{8CA9}' . + '\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}\x{8CB1}\x{8CB2}' . + '\x{8CB3}\x{8CB4}\x{8CB5}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CB9}\x{8CBA}\x{8CBB}' . + '\x{8CBC}\x{8CBD}\x{8CBE}\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}' . + '\x{8CC5}\x{8CC6}\x{8CC7}\x{8CC8}\x{8CC9}\x{8CCA}\x{8CCC}\x{8CCE}\x{8CCF}' . + '\x{8CD0}\x{8CD1}\x{8CD2}\x{8CD3}\x{8CD4}\x{8CD5}\x{8CD7}\x{8CD9}\x{8CDA}' . + '\x{8CDB}\x{8CDC}\x{8CDD}\x{8CDE}\x{8CDF}\x{8CE0}\x{8CE1}\x{8CE2}\x{8CE3}' . + '\x{8CE4}\x{8CE5}\x{8CE6}\x{8CE7}\x{8CE8}\x{8CEA}\x{8CEB}\x{8CEC}\x{8CED}' . + '\x{8CEE}\x{8CEF}\x{8CF0}\x{8CF1}\x{8CF2}\x{8CF3}\x{8CF4}\x{8CF5}\x{8CF6}' . + '\x{8CF8}\x{8CF9}\x{8CFA}\x{8CFB}\x{8CFC}\x{8CFD}\x{8CFE}\x{8CFF}\x{8D00}' . + '\x{8D02}\x{8D03}\x{8D04}\x{8D05}\x{8D06}\x{8D07}\x{8D08}\x{8D09}\x{8D0A}' . + '\x{8D0B}\x{8D0C}\x{8D0D}\x{8D0E}\x{8D0F}\x{8D10}\x{8D13}\x{8D14}\x{8D15}' . + '\x{8D16}\x{8D17}\x{8D18}\x{8D19}\x{8D1A}\x{8D1B}\x{8D1C}\x{8D1D}\x{8D1E}' . + '\x{8D1F}\x{8D20}\x{8D21}\x{8D22}\x{8D23}\x{8D24}\x{8D25}\x{8D26}\x{8D27}' . + '\x{8D28}\x{8D29}\x{8D2A}\x{8D2B}\x{8D2C}\x{8D2D}\x{8D2E}\x{8D2F}\x{8D30}' . + '\x{8D31}\x{8D32}\x{8D33}\x{8D34}\x{8D35}\x{8D36}\x{8D37}\x{8D38}\x{8D39}' . + '\x{8D3A}\x{8D3B}\x{8D3C}\x{8D3D}\x{8D3E}\x{8D3F}\x{8D40}\x{8D41}\x{8D42}' . + '\x{8D43}\x{8D44}\x{8D45}\x{8D46}\x{8D47}\x{8D48}\x{8D49}\x{8D4A}\x{8D4B}' . + '\x{8D4C}\x{8D4D}\x{8D4E}\x{8D4F}\x{8D50}\x{8D51}\x{8D52}\x{8D53}\x{8D54}' . + '\x{8D55}\x{8D56}\x{8D57}\x{8D58}\x{8D59}\x{8D5A}\x{8D5B}\x{8D5C}\x{8D5D}' . + '\x{8D5E}\x{8D5F}\x{8D60}\x{8D61}\x{8D62}\x{8D63}\x{8D64}\x{8D65}\x{8D66}' . + '\x{8D67}\x{8D68}\x{8D69}\x{8D6A}\x{8D6B}\x{8D6C}\x{8D6D}\x{8D6E}\x{8D6F}' . + '\x{8D70}\x{8D71}\x{8D72}\x{8D73}\x{8D74}\x{8D75}\x{8D76}\x{8D77}\x{8D78}' . + '\x{8D79}\x{8D7A}\x{8D7B}\x{8D7D}\x{8D7E}\x{8D7F}\x{8D80}\x{8D81}\x{8D82}' . + '\x{8D83}\x{8D84}\x{8D85}\x{8D86}\x{8D87}\x{8D88}\x{8D89}\x{8D8A}\x{8D8B}' . + '\x{8D8C}\x{8D8D}\x{8D8E}\x{8D8F}\x{8D90}\x{8D91}\x{8D92}\x{8D93}\x{8D94}' . + '\x{8D95}\x{8D96}\x{8D97}\x{8D98}\x{8D99}\x{8D9A}\x{8D9B}\x{8D9C}\x{8D9D}' . + '\x{8D9E}\x{8D9F}\x{8DA0}\x{8DA1}\x{8DA2}\x{8DA3}\x{8DA4}\x{8DA5}\x{8DA7}' . + '\x{8DA8}\x{8DA9}\x{8DAA}\x{8DAB}\x{8DAC}\x{8DAD}\x{8DAE}\x{8DAF}\x{8DB0}' . + '\x{8DB1}\x{8DB2}\x{8DB3}\x{8DB4}\x{8DB5}\x{8DB6}\x{8DB7}\x{8DB8}\x{8DB9}' . + '\x{8DBA}\x{8DBB}\x{8DBC}\x{8DBD}\x{8DBE}\x{8DBF}\x{8DC1}\x{8DC2}\x{8DC3}' . + '\x{8DC4}\x{8DC5}\x{8DC6}\x{8DC7}\x{8DC8}\x{8DC9}\x{8DCA}\x{8DCB}\x{8DCC}' . + '\x{8DCD}\x{8DCE}\x{8DCF}\x{8DD0}\x{8DD1}\x{8DD2}\x{8DD3}\x{8DD4}\x{8DD5}' . + '\x{8DD6}\x{8DD7}\x{8DD8}\x{8DD9}\x{8DDA}\x{8DDB}\x{8DDC}\x{8DDD}\x{8DDE}' . + '\x{8DDF}\x{8DE0}\x{8DE1}\x{8DE2}\x{8DE3}\x{8DE4}\x{8DE6}\x{8DE7}\x{8DE8}' . + '\x{8DE9}\x{8DEA}\x{8DEB}\x{8DEC}\x{8DED}\x{8DEE}\x{8DEF}\x{8DF0}\x{8DF1}' . + '\x{8DF2}\x{8DF3}\x{8DF4}\x{8DF5}\x{8DF6}\x{8DF7}\x{8DF8}\x{8DF9}\x{8DFA}' . + '\x{8DFB}\x{8DFC}\x{8DFD}\x{8DFE}\x{8DFF}\x{8E00}\x{8E02}\x{8E03}\x{8E04}' . + '\x{8E05}\x{8E06}\x{8E07}\x{8E08}\x{8E09}\x{8E0A}\x{8E0C}\x{8E0D}\x{8E0E}' . + '\x{8E0F}\x{8E10}\x{8E11}\x{8E12}\x{8E13}\x{8E14}\x{8E15}\x{8E16}\x{8E17}' . + '\x{8E18}\x{8E19}\x{8E1A}\x{8E1B}\x{8E1C}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E20}' . + '\x{8E21}\x{8E22}\x{8E23}\x{8E24}\x{8E25}\x{8E26}\x{8E27}\x{8E28}\x{8E29}' . + '\x{8E2A}\x{8E2B}\x{8E2C}\x{8E2D}\x{8E2E}\x{8E2F}\x{8E30}\x{8E31}\x{8E33}' . + '\x{8E34}\x{8E35}\x{8E36}\x{8E37}\x{8E38}\x{8E39}\x{8E3A}\x{8E3B}\x{8E3C}' . + '\x{8E3D}\x{8E3E}\x{8E3F}\x{8E40}\x{8E41}\x{8E42}\x{8E43}\x{8E44}\x{8E45}' . + '\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4B}\x{8E4C}\x{8E4D}\x{8E4E}\x{8E50}' . + '\x{8E51}\x{8E52}\x{8E53}\x{8E54}\x{8E55}\x{8E56}\x{8E57}\x{8E58}\x{8E59}' . + '\x{8E5A}\x{8E5B}\x{8E5C}\x{8E5D}\x{8E5E}\x{8E5F}\x{8E60}\x{8E61}\x{8E62}' . + '\x{8E63}\x{8E64}\x{8E65}\x{8E66}\x{8E67}\x{8E68}\x{8E69}\x{8E6A}\x{8E6B}' . + '\x{8E6C}\x{8E6D}\x{8E6F}\x{8E70}\x{8E71}\x{8E72}\x{8E73}\x{8E74}\x{8E76}' . + '\x{8E78}\x{8E7A}\x{8E7B}\x{8E7C}\x{8E7D}\x{8E7E}\x{8E7F}\x{8E80}\x{8E81}' . + '\x{8E82}\x{8E83}\x{8E84}\x{8E85}\x{8E86}\x{8E87}\x{8E88}\x{8E89}\x{8E8A}' . + '\x{8E8B}\x{8E8C}\x{8E8D}\x{8E8E}\x{8E8F}\x{8E90}\x{8E91}\x{8E92}\x{8E93}' . + '\x{8E94}\x{8E95}\x{8E96}\x{8E97}\x{8E98}\x{8E9A}\x{8E9C}\x{8E9D}\x{8E9E}' . + '\x{8E9F}\x{8EA0}\x{8EA1}\x{8EA3}\x{8EA4}\x{8EA5}\x{8EA6}\x{8EA7}\x{8EA8}' . + '\x{8EA9}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAD}\x{8EAE}\x{8EAF}\x{8EB0}\x{8EB1}' . + '\x{8EB2}\x{8EB4}\x{8EB5}\x{8EB8}\x{8EB9}\x{8EBA}\x{8EBB}\x{8EBC}\x{8EBD}' . + '\x{8EBE}\x{8EBF}\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}\x{8EC6}\x{8EC7}\x{8EC8}' . + '\x{8EC9}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ECE}\x{8ECF}\x{8ED0}\x{8ED1}' . + '\x{8ED2}\x{8ED3}\x{8ED4}\x{8ED5}\x{8ED6}\x{8ED7}\x{8ED8}\x{8EDA}\x{8EDB}' . + '\x{8EDC}\x{8EDD}\x{8EDE}\x{8EDF}\x{8EE0}\x{8EE1}\x{8EE4}\x{8EE5}\x{8EE6}' . + '\x{8EE7}\x{8EE8}\x{8EE9}\x{8EEA}\x{8EEB}\x{8EEC}\x{8EED}\x{8EEE}\x{8EEF}' . + '\x{8EF1}\x{8EF2}\x{8EF3}\x{8EF4}\x{8EF5}\x{8EF6}\x{8EF7}\x{8EF8}\x{8EF9}' . + '\x{8EFA}\x{8EFB}\x{8EFC}\x{8EFD}\x{8EFE}\x{8EFF}\x{8F00}\x{8F01}\x{8F02}' . + '\x{8F03}\x{8F04}\x{8F05}\x{8F06}\x{8F07}\x{8F08}\x{8F09}\x{8F0A}\x{8F0B}' . + '\x{8F0D}\x{8F0E}\x{8F10}\x{8F11}\x{8F12}\x{8F13}\x{8F14}\x{8F15}\x{8F16}' . + '\x{8F17}\x{8F18}\x{8F1A}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1E}\x{8F1F}\x{8F20}' . + '\x{8F21}\x{8F22}\x{8F23}\x{8F24}\x{8F25}\x{8F26}\x{8F27}\x{8F28}\x{8F29}' . + '\x{8F2A}\x{8F2B}\x{8F2C}\x{8F2E}\x{8F2F}\x{8F30}\x{8F31}\x{8F32}\x{8F33}' . + '\x{8F34}\x{8F35}\x{8F36}\x{8F37}\x{8F38}\x{8F39}\x{8F3B}\x{8F3C}\x{8F3D}' . + '\x{8F3E}\x{8F3F}\x{8F40}\x{8F42}\x{8F43}\x{8F44}\x{8F45}\x{8F46}\x{8F47}' . + '\x{8F48}\x{8F49}\x{8F4A}\x{8F4B}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F4F}\x{8F50}' . + '\x{8F51}\x{8F52}\x{8F53}\x{8F54}\x{8F55}\x{8F56}\x{8F57}\x{8F58}\x{8F59}' . + '\x{8F5A}\x{8F5B}\x{8F5D}\x{8F5E}\x{8F5F}\x{8F60}\x{8F61}\x{8F62}\x{8F63}' . + '\x{8F64}\x{8F65}\x{8F66}\x{8F67}\x{8F68}\x{8F69}\x{8F6A}\x{8F6B}\x{8F6C}' . + '\x{8F6D}\x{8F6E}\x{8F6F}\x{8F70}\x{8F71}\x{8F72}\x{8F73}\x{8F74}\x{8F75}' . + '\x{8F76}\x{8F77}\x{8F78}\x{8F79}\x{8F7A}\x{8F7B}\x{8F7C}\x{8F7D}\x{8F7E}' . + '\x{8F7F}\x{8F80}\x{8F81}\x{8F82}\x{8F83}\x{8F84}\x{8F85}\x{8F86}\x{8F87}' . + '\x{8F88}\x{8F89}\x{8F8A}\x{8F8B}\x{8F8C}\x{8F8D}\x{8F8E}\x{8F8F}\x{8F90}' . + '\x{8F91}\x{8F92}\x{8F93}\x{8F94}\x{8F95}\x{8F96}\x{8F97}\x{8F98}\x{8F99}' . + '\x{8F9A}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA0}\x{8FA1}\x{8FA2}\x{8FA3}' . + '\x{8FA5}\x{8FA6}\x{8FA7}\x{8FA8}\x{8FA9}\x{8FAA}\x{8FAB}\x{8FAC}\x{8FAD}' . + '\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB4}\x{8FB5}\x{8FB6}\x{8FB7}' . + '\x{8FB8}\x{8FB9}\x{8FBB}\x{8FBC}\x{8FBD}\x{8FBE}\x{8FBF}\x{8FC0}\x{8FC1}' . + '\x{8FC2}\x{8FC4}\x{8FC5}\x{8FC6}\x{8FC7}\x{8FC8}\x{8FC9}\x{8FCB}\x{8FCC}' . + '\x{8FCD}\x{8FCE}\x{8FCF}\x{8FD0}\x{8FD1}\x{8FD2}\x{8FD3}\x{8FD4}\x{8FD5}' . + '\x{8FD6}\x{8FD7}\x{8FD8}\x{8FD9}\x{8FDA}\x{8FDB}\x{8FDC}\x{8FDD}\x{8FDE}' . + '\x{8FDF}\x{8FE0}\x{8FE1}\x{8FE2}\x{8FE3}\x{8FE4}\x{8FE5}\x{8FE6}\x{8FE8}' . + '\x{8FE9}\x{8FEA}\x{8FEB}\x{8FEC}\x{8FED}\x{8FEE}\x{8FEF}\x{8FF0}\x{8FF1}' . + '\x{8FF2}\x{8FF3}\x{8FF4}\x{8FF5}\x{8FF6}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}' . + '\x{8FFB}\x{8FFC}\x{8FFD}\x{8FFE}\x{8FFF}\x{9000}\x{9001}\x{9002}\x{9003}' . + '\x{9004}\x{9005}\x{9006}\x{9007}\x{9008}\x{9009}\x{900A}\x{900B}\x{900C}' . + '\x{900D}\x{900F}\x{9010}\x{9011}\x{9012}\x{9013}\x{9014}\x{9015}\x{9016}' . + '\x{9017}\x{9018}\x{9019}\x{901A}\x{901B}\x{901C}\x{901D}\x{901E}\x{901F}' . + '\x{9020}\x{9021}\x{9022}\x{9023}\x{9024}\x{9025}\x{9026}\x{9027}\x{9028}' . + '\x{9029}\x{902B}\x{902D}\x{902E}\x{902F}\x{9030}\x{9031}\x{9032}\x{9033}' . + '\x{9034}\x{9035}\x{9036}\x{9038}\x{903A}\x{903B}\x{903C}\x{903D}\x{903E}' . + '\x{903F}\x{9041}\x{9042}\x{9043}\x{9044}\x{9045}\x{9047}\x{9048}\x{9049}' . + '\x{904A}\x{904B}\x{904C}\x{904D}\x{904E}\x{904F}\x{9050}\x{9051}\x{9052}' . + '\x{9053}\x{9054}\x{9055}\x{9056}\x{9057}\x{9058}\x{9059}\x{905A}\x{905B}' . + '\x{905C}\x{905D}\x{905E}\x{905F}\x{9060}\x{9061}\x{9062}\x{9063}\x{9064}' . + '\x{9065}\x{9066}\x{9067}\x{9068}\x{9069}\x{906A}\x{906B}\x{906C}\x{906D}' . + '\x{906E}\x{906F}\x{9070}\x{9071}\x{9072}\x{9073}\x{9074}\x{9075}\x{9076}' . + '\x{9077}\x{9078}\x{9079}\x{907A}\x{907B}\x{907C}\x{907D}\x{907E}\x{907F}' . + '\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9085}\x{9086}\x{9087}\x{9088}' . + '\x{9089}\x{908A}\x{908B}\x{908C}\x{908D}\x{908E}\x{908F}\x{9090}\x{9091}' . + '\x{9092}\x{9093}\x{9094}\x{9095}\x{9096}\x{9097}\x{9098}\x{9099}\x{909A}' . + '\x{909B}\x{909C}\x{909D}\x{909E}\x{909F}\x{90A0}\x{90A1}\x{90A2}\x{90A3}' . + '\x{90A4}\x{90A5}\x{90A6}\x{90A7}\x{90A8}\x{90A9}\x{90AA}\x{90AC}\x{90AD}' . + '\x{90AE}\x{90AF}\x{90B0}\x{90B1}\x{90B2}\x{90B3}\x{90B4}\x{90B5}\x{90B6}' . + '\x{90B7}\x{90B8}\x{90B9}\x{90BA}\x{90BB}\x{90BC}\x{90BD}\x{90BE}\x{90BF}' . + '\x{90C0}\x{90C1}\x{90C2}\x{90C3}\x{90C4}\x{90C5}\x{90C6}\x{90C7}\x{90C8}' . + '\x{90C9}\x{90CA}\x{90CB}\x{90CE}\x{90CF}\x{90D0}\x{90D1}\x{90D3}\x{90D4}' . + '\x{90D5}\x{90D6}\x{90D7}\x{90D8}\x{90D9}\x{90DA}\x{90DB}\x{90DC}\x{90DD}' . + '\x{90DE}\x{90DF}\x{90E0}\x{90E1}\x{90E2}\x{90E3}\x{90E4}\x{90E5}\x{90E6}' . + '\x{90E7}\x{90E8}\x{90E9}\x{90EA}\x{90EB}\x{90EC}\x{90ED}\x{90EE}\x{90EF}' . + '\x{90F0}\x{90F1}\x{90F2}\x{90F3}\x{90F4}\x{90F5}\x{90F7}\x{90F8}\x{90F9}' . + '\x{90FA}\x{90FB}\x{90FC}\x{90FD}\x{90FE}\x{90FF}\x{9100}\x{9101}\x{9102}' . + '\x{9103}\x{9104}\x{9105}\x{9106}\x{9107}\x{9108}\x{9109}\x{910B}\x{910C}' . + '\x{910D}\x{910E}\x{910F}\x{9110}\x{9111}\x{9112}\x{9113}\x{9114}\x{9115}' . + '\x{9116}\x{9117}\x{9118}\x{9119}\x{911A}\x{911B}\x{911C}\x{911D}\x{911E}' . + '\x{911F}\x{9120}\x{9121}\x{9122}\x{9123}\x{9124}\x{9125}\x{9126}\x{9127}' . + '\x{9128}\x{9129}\x{912A}\x{912B}\x{912C}\x{912D}\x{912E}\x{912F}\x{9130}' . + '\x{9131}\x{9132}\x{9133}\x{9134}\x{9135}\x{9136}\x{9137}\x{9138}\x{9139}' . + '\x{913A}\x{913B}\x{913E}\x{913F}\x{9140}\x{9141}\x{9142}\x{9143}\x{9144}' . + '\x{9145}\x{9146}\x{9147}\x{9148}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}' . + '\x{914E}\x{914F}\x{9150}\x{9151}\x{9152}\x{9153}\x{9154}\x{9155}\x{9156}' . + '\x{9157}\x{9158}\x{915A}\x{915B}\x{915C}\x{915D}\x{915E}\x{915F}\x{9160}' . + '\x{9161}\x{9162}\x{9163}\x{9164}\x{9165}\x{9166}\x{9167}\x{9168}\x{9169}' . + '\x{916A}\x{916B}\x{916C}\x{916D}\x{916E}\x{916F}\x{9170}\x{9171}\x{9172}' . + '\x{9173}\x{9174}\x{9175}\x{9176}\x{9177}\x{9178}\x{9179}\x{917A}\x{917C}' . + '\x{917D}\x{917E}\x{917F}\x{9180}\x{9181}\x{9182}\x{9183}\x{9184}\x{9185}' . + '\x{9186}\x{9187}\x{9188}\x{9189}\x{918A}\x{918B}\x{918C}\x{918D}\x{918E}' . + '\x{918F}\x{9190}\x{9191}\x{9192}\x{9193}\x{9194}\x{9196}\x{9199}\x{919A}' . + '\x{919B}\x{919C}\x{919D}\x{919E}\x{919F}\x{91A0}\x{91A1}\x{91A2}\x{91A3}' . + '\x{91A5}\x{91A6}\x{91A7}\x{91A8}\x{91AA}\x{91AB}\x{91AC}\x{91AD}\x{91AE}' . + '\x{91AF}\x{91B0}\x{91B1}\x{91B2}\x{91B3}\x{91B4}\x{91B5}\x{91B6}\x{91B7}' . + '\x{91B9}\x{91BA}\x{91BB}\x{91BC}\x{91BD}\x{91BE}\x{91C0}\x{91C1}\x{91C2}' . + '\x{91C3}\x{91C5}\x{91C6}\x{91C7}\x{91C9}\x{91CA}\x{91CB}\x{91CC}\x{91CD}' . + '\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D2}\x{91D3}\x{91D4}\x{91D5}\x{91D7}' . + '\x{91D8}\x{91D9}\x{91DA}\x{91DB}\x{91DC}\x{91DD}\x{91DE}\x{91DF}\x{91E2}' . + '\x{91E3}\x{91E4}\x{91E5}\x{91E6}\x{91E7}\x{91E8}\x{91E9}\x{91EA}\x{91EB}' . + '\x{91EC}\x{91ED}\x{91EE}\x{91F0}\x{91F1}\x{91F2}\x{91F3}\x{91F4}\x{91F5}' . + '\x{91F7}\x{91F8}\x{91F9}\x{91FA}\x{91FB}\x{91FD}\x{91FE}\x{91FF}\x{9200}' . + '\x{9201}\x{9202}\x{9203}\x{9204}\x{9205}\x{9206}\x{9207}\x{9208}\x{9209}' . + '\x{920A}\x{920B}\x{920C}\x{920D}\x{920E}\x{920F}\x{9210}\x{9211}\x{9212}' . + '\x{9214}\x{9215}\x{9216}\x{9217}\x{9218}\x{9219}\x{921A}\x{921B}\x{921C}' . + '\x{921D}\x{921E}\x{9220}\x{9221}\x{9223}\x{9224}\x{9225}\x{9226}\x{9227}' . + '\x{9228}\x{9229}\x{922A}\x{922B}\x{922D}\x{922E}\x{922F}\x{9230}\x{9231}' . + '\x{9232}\x{9233}\x{9234}\x{9235}\x{9236}\x{9237}\x{9238}\x{9239}\x{923A}' . + '\x{923B}\x{923C}\x{923D}\x{923E}\x{923F}\x{9240}\x{9241}\x{9242}\x{9245}' . + '\x{9246}\x{9247}\x{9248}\x{9249}\x{924A}\x{924B}\x{924C}\x{924D}\x{924E}' . + '\x{924F}\x{9250}\x{9251}\x{9252}\x{9253}\x{9254}\x{9255}\x{9256}\x{9257}' . + '\x{9258}\x{9259}\x{925A}\x{925B}\x{925C}\x{925D}\x{925E}\x{925F}\x{9260}' . + '\x{9261}\x{9262}\x{9263}\x{9264}\x{9265}\x{9266}\x{9267}\x{9268}\x{926B}' . + '\x{926C}\x{926D}\x{926E}\x{926F}\x{9270}\x{9272}\x{9273}\x{9274}\x{9275}' . + '\x{9276}\x{9277}\x{9278}\x{9279}\x{927A}\x{927B}\x{927C}\x{927D}\x{927E}' . + '\x{927F}\x{9280}\x{9282}\x{9283}\x{9285}\x{9286}\x{9287}\x{9288}\x{9289}' . + '\x{928A}\x{928B}\x{928C}\x{928D}\x{928E}\x{928F}\x{9290}\x{9291}\x{9292}' . + '\x{9293}\x{9294}\x{9295}\x{9296}\x{9297}\x{9298}\x{9299}\x{929A}\x{929B}' . + '\x{929C}\x{929D}\x{929F}\x{92A0}\x{92A1}\x{92A2}\x{92A3}\x{92A4}\x{92A5}' . + '\x{92A6}\x{92A7}\x{92A8}\x{92A9}\x{92AA}\x{92AB}\x{92AC}\x{92AD}\x{92AE}' . + '\x{92AF}\x{92B0}\x{92B1}\x{92B2}\x{92B3}\x{92B4}\x{92B5}\x{92B6}\x{92B7}' . + '\x{92B8}\x{92B9}\x{92BA}\x{92BB}\x{92BC}\x{92BE}\x{92BF}\x{92C0}\x{92C1}' . + '\x{92C2}\x{92C3}\x{92C4}\x{92C5}\x{92C6}\x{92C7}\x{92C8}\x{92C9}\x{92CA}' . + '\x{92CB}\x{92CC}\x{92CD}\x{92CE}\x{92CF}\x{92D0}\x{92D1}\x{92D2}\x{92D3}' . + '\x{92D5}\x{92D6}\x{92D7}\x{92D8}\x{92D9}\x{92DA}\x{92DC}\x{92DD}\x{92DE}' . + '\x{92DF}\x{92E0}\x{92E1}\x{92E3}\x{92E4}\x{92E5}\x{92E6}\x{92E7}\x{92E8}' . + '\x{92E9}\x{92EA}\x{92EB}\x{92EC}\x{92ED}\x{92EE}\x{92EF}\x{92F0}\x{92F1}' . + '\x{92F2}\x{92F3}\x{92F4}\x{92F5}\x{92F6}\x{92F7}\x{92F8}\x{92F9}\x{92FA}' . + '\x{92FB}\x{92FC}\x{92FD}\x{92FE}\x{92FF}\x{9300}\x{9301}\x{9302}\x{9303}' . + '\x{9304}\x{9305}\x{9306}\x{9307}\x{9308}\x{9309}\x{930A}\x{930B}\x{930C}' . + '\x{930D}\x{930E}\x{930F}\x{9310}\x{9311}\x{9312}\x{9313}\x{9314}\x{9315}' . + '\x{9316}\x{9317}\x{9318}\x{9319}\x{931A}\x{931B}\x{931D}\x{931E}\x{931F}' . + '\x{9320}\x{9321}\x{9322}\x{9323}\x{9324}\x{9325}\x{9326}\x{9327}\x{9328}' . + '\x{9329}\x{932A}\x{932B}\x{932D}\x{932E}\x{932F}\x{9332}\x{9333}\x{9334}' . + '\x{9335}\x{9336}\x{9337}\x{9338}\x{9339}\x{933A}\x{933B}\x{933C}\x{933D}' . + '\x{933E}\x{933F}\x{9340}\x{9341}\x{9342}\x{9343}\x{9344}\x{9345}\x{9346}' . + '\x{9347}\x{9348}\x{9349}\x{934A}\x{934B}\x{934C}\x{934D}\x{934E}\x{934F}' . + '\x{9350}\x{9351}\x{9352}\x{9353}\x{9354}\x{9355}\x{9356}\x{9357}\x{9358}' . + '\x{9359}\x{935A}\x{935B}\x{935C}\x{935D}\x{935E}\x{935F}\x{9360}\x{9361}' . + '\x{9363}\x{9364}\x{9365}\x{9366}\x{9367}\x{9369}\x{936A}\x{936C}\x{936D}' . + '\x{936E}\x{9370}\x{9371}\x{9372}\x{9374}\x{9375}\x{9376}\x{9377}\x{9379}' . + '\x{937A}\x{937B}\x{937C}\x{937D}\x{937E}\x{9380}\x{9382}\x{9383}\x{9384}' . + '\x{9385}\x{9386}\x{9387}\x{9388}\x{9389}\x{938A}\x{938C}\x{938D}\x{938E}' . + '\x{938F}\x{9390}\x{9391}\x{9392}\x{9393}\x{9394}\x{9395}\x{9396}\x{9397}' . + '\x{9398}\x{9399}\x{939A}\x{939B}\x{939D}\x{939E}\x{939F}\x{93A1}\x{93A2}' . + '\x{93A3}\x{93A4}\x{93A5}\x{93A6}\x{93A7}\x{93A8}\x{93A9}\x{93AA}\x{93AC}' . + '\x{93AD}\x{93AE}\x{93AF}\x{93B0}\x{93B1}\x{93B2}\x{93B3}\x{93B4}\x{93B5}' . + '\x{93B6}\x{93B7}\x{93B8}\x{93B9}\x{93BA}\x{93BC}\x{93BD}\x{93BE}\x{93BF}' . + '\x{93C0}\x{93C1}\x{93C2}\x{93C3}\x{93C4}\x{93C5}\x{93C6}\x{93C7}\x{93C8}' . + '\x{93C9}\x{93CA}\x{93CB}\x{93CC}\x{93CD}\x{93CE}\x{93CF}\x{93D0}\x{93D1}' . + '\x{93D2}\x{93D3}\x{93D4}\x{93D5}\x{93D6}\x{93D7}\x{93D8}\x{93D9}\x{93DA}' . + '\x{93DB}\x{93DC}\x{93DD}\x{93DE}\x{93DF}\x{93E1}\x{93E2}\x{93E3}\x{93E4}' . + '\x{93E6}\x{93E7}\x{93E8}\x{93E9}\x{93EA}\x{93EB}\x{93EC}\x{93ED}\x{93EE}' . + '\x{93EF}\x{93F0}\x{93F1}\x{93F2}\x{93F4}\x{93F5}\x{93F6}\x{93F7}\x{93F8}' . + '\x{93F9}\x{93FA}\x{93FB}\x{93FC}\x{93FD}\x{93FE}\x{93FF}\x{9400}\x{9401}' . + '\x{9403}\x{9404}\x{9405}\x{9406}\x{9407}\x{9408}\x{9409}\x{940A}\x{940B}' . + '\x{940C}\x{940D}\x{940E}\x{940F}\x{9410}\x{9411}\x{9412}\x{9413}\x{9414}' . + '\x{9415}\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}\x{9422}\x{9423}' . + '\x{9425}\x{9426}\x{9427}\x{9428}\x{9429}\x{942A}\x{942B}\x{942C}\x{942D}' . + '\x{942E}\x{942F}\x{9430}\x{9431}\x{9432}\x{9433}\x{9434}\x{9435}\x{9436}' . + '\x{9437}\x{9438}\x{9439}\x{943A}\x{943B}\x{943C}\x{943D}\x{943E}\x{943F}' . + '\x{9440}\x{9441}\x{9442}\x{9444}\x{9445}\x{9446}\x{9447}\x{9448}\x{9449}' . + '\x{944A}\x{944B}\x{944C}\x{944D}\x{944F}\x{9450}\x{9451}\x{9452}\x{9453}' . + '\x{9454}\x{9455}\x{9456}\x{9457}\x{9458}\x{9459}\x{945B}\x{945C}\x{945D}' . + '\x{945E}\x{945F}\x{9460}\x{9461}\x{9462}\x{9463}\x{9464}\x{9465}\x{9466}' . + '\x{9467}\x{9468}\x{9469}\x{946A}\x{946B}\x{946D}\x{946E}\x{946F}\x{9470}' . + '\x{9471}\x{9472}\x{9473}\x{9474}\x{9475}\x{9476}\x{9477}\x{9478}\x{9479}' . + '\x{947A}\x{947C}\x{947D}\x{947E}\x{947F}\x{9480}\x{9481}\x{9482}\x{9483}' . + '\x{9484}\x{9485}\x{9486}\x{9487}\x{9488}\x{9489}\x{948A}\x{948B}\x{948C}' . + '\x{948D}\x{948E}\x{948F}\x{9490}\x{9491}\x{9492}\x{9493}\x{9494}\x{9495}' . + '\x{9496}\x{9497}\x{9498}\x{9499}\x{949A}\x{949B}\x{949C}\x{949D}\x{949E}' . + '\x{949F}\x{94A0}\x{94A1}\x{94A2}\x{94A3}\x{94A4}\x{94A5}\x{94A6}\x{94A7}' . + '\x{94A8}\x{94A9}\x{94AA}\x{94AB}\x{94AC}\x{94AD}\x{94AE}\x{94AF}\x{94B0}' . + '\x{94B1}\x{94B2}\x{94B3}\x{94B4}\x{94B5}\x{94B6}\x{94B7}\x{94B8}\x{94B9}' . + '\x{94BA}\x{94BB}\x{94BC}\x{94BD}\x{94BE}\x{94BF}\x{94C0}\x{94C1}\x{94C2}' . + '\x{94C3}\x{94C4}\x{94C5}\x{94C6}\x{94C7}\x{94C8}\x{94C9}\x{94CA}\x{94CB}' . + '\x{94CC}\x{94CD}\x{94CE}\x{94CF}\x{94D0}\x{94D1}\x{94D2}\x{94D3}\x{94D4}' . + '\x{94D5}\x{94D6}\x{94D7}\x{94D8}\x{94D9}\x{94DA}\x{94DB}\x{94DC}\x{94DD}' . + '\x{94DE}\x{94DF}\x{94E0}\x{94E1}\x{94E2}\x{94E3}\x{94E4}\x{94E5}\x{94E6}' . + '\x{94E7}\x{94E8}\x{94E9}\x{94EA}\x{94EB}\x{94EC}\x{94ED}\x{94EE}\x{94EF}' . + '\x{94F0}\x{94F1}\x{94F2}\x{94F3}\x{94F4}\x{94F5}\x{94F6}\x{94F7}\x{94F8}' . + '\x{94F9}\x{94FA}\x{94FB}\x{94FC}\x{94FD}\x{94FE}\x{94FF}\x{9500}\x{9501}' . + '\x{9502}\x{9503}\x{9504}\x{9505}\x{9506}\x{9507}\x{9508}\x{9509}\x{950A}' . + '\x{950B}\x{950C}\x{950D}\x{950E}\x{950F}\x{9510}\x{9511}\x{9512}\x{9513}' . + '\x{9514}\x{9515}\x{9516}\x{9517}\x{9518}\x{9519}\x{951A}\x{951B}\x{951C}' . + '\x{951D}\x{951E}\x{951F}\x{9520}\x{9521}\x{9522}\x{9523}\x{9524}\x{9525}' . + '\x{9526}\x{9527}\x{9528}\x{9529}\x{952A}\x{952B}\x{952C}\x{952D}\x{952E}' . + '\x{952F}\x{9530}\x{9531}\x{9532}\x{9533}\x{9534}\x{9535}\x{9536}\x{9537}' . + '\x{9538}\x{9539}\x{953A}\x{953B}\x{953C}\x{953D}\x{953E}\x{953F}\x{9540}' . + '\x{9541}\x{9542}\x{9543}\x{9544}\x{9545}\x{9546}\x{9547}\x{9548}\x{9549}' . + '\x{954A}\x{954B}\x{954C}\x{954D}\x{954E}\x{954F}\x{9550}\x{9551}\x{9552}' . + '\x{9553}\x{9554}\x{9555}\x{9556}\x{9557}\x{9558}\x{9559}\x{955A}\x{955B}' . + '\x{955C}\x{955D}\x{955E}\x{955F}\x{9560}\x{9561}\x{9562}\x{9563}\x{9564}' . + '\x{9565}\x{9566}\x{9567}\x{9568}\x{9569}\x{956A}\x{956B}\x{956C}\x{956D}' . + '\x{956E}\x{956F}\x{9570}\x{9571}\x{9572}\x{9573}\x{9574}\x{9575}\x{9576}' . + '\x{9577}\x{957A}\x{957B}\x{957C}\x{957D}\x{957F}\x{9580}\x{9581}\x{9582}' . + '\x{9583}\x{9584}\x{9586}\x{9587}\x{9588}\x{9589}\x{958A}\x{958B}\x{958C}' . + '\x{958D}\x{958E}\x{958F}\x{9590}\x{9591}\x{9592}\x{9593}\x{9594}\x{9595}' . + '\x{9596}\x{9598}\x{9599}\x{959A}\x{959B}\x{959C}\x{959D}\x{959E}\x{959F}' . + '\x{95A1}\x{95A2}\x{95A3}\x{95A4}\x{95A5}\x{95A6}\x{95A7}\x{95A8}\x{95A9}' . + '\x{95AA}\x{95AB}\x{95AC}\x{95AD}\x{95AE}\x{95AF}\x{95B0}\x{95B1}\x{95B2}' . + '\x{95B5}\x{95B6}\x{95B7}\x{95B9}\x{95BA}\x{95BB}\x{95BC}\x{95BD}\x{95BE}' . + '\x{95BF}\x{95C0}\x{95C2}\x{95C3}\x{95C4}\x{95C5}\x{95C6}\x{95C7}\x{95C8}' . + '\x{95C9}\x{95CA}\x{95CB}\x{95CC}\x{95CD}\x{95CE}\x{95CF}\x{95D0}\x{95D1}' . + '\x{95D2}\x{95D3}\x{95D4}\x{95D5}\x{95D6}\x{95D7}\x{95D8}\x{95DA}\x{95DB}' . + '\x{95DC}\x{95DE}\x{95DF}\x{95E0}\x{95E1}\x{95E2}\x{95E3}\x{95E4}\x{95E5}' . + '\x{95E6}\x{95E7}\x{95E8}\x{95E9}\x{95EA}\x{95EB}\x{95EC}\x{95ED}\x{95EE}' . + '\x{95EF}\x{95F0}\x{95F1}\x{95F2}\x{95F3}\x{95F4}\x{95F5}\x{95F6}\x{95F7}' . + '\x{95F8}\x{95F9}\x{95FA}\x{95FB}\x{95FC}\x{95FD}\x{95FE}\x{95FF}\x{9600}' . + '\x{9601}\x{9602}\x{9603}\x{9604}\x{9605}\x{9606}\x{9607}\x{9608}\x{9609}' . + '\x{960A}\x{960B}\x{960C}\x{960D}\x{960E}\x{960F}\x{9610}\x{9611}\x{9612}' . + '\x{9613}\x{9614}\x{9615}\x{9616}\x{9617}\x{9618}\x{9619}\x{961A}\x{961B}' . + '\x{961C}\x{961D}\x{961E}\x{961F}\x{9620}\x{9621}\x{9622}\x{9623}\x{9624}' . + '\x{9627}\x{9628}\x{962A}\x{962B}\x{962C}\x{962D}\x{962E}\x{962F}\x{9630}' . + '\x{9631}\x{9632}\x{9633}\x{9634}\x{9635}\x{9636}\x{9637}\x{9638}\x{9639}' . + '\x{963A}\x{963B}\x{963C}\x{963D}\x{963F}\x{9640}\x{9641}\x{9642}\x{9643}' . + '\x{9644}\x{9645}\x{9646}\x{9647}\x{9648}\x{9649}\x{964A}\x{964B}\x{964C}' . + '\x{964D}\x{964E}\x{964F}\x{9650}\x{9651}\x{9652}\x{9653}\x{9654}\x{9655}' . + '\x{9658}\x{9659}\x{965A}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9660}' . + '\x{9661}\x{9662}\x{9663}\x{9664}\x{9666}\x{9667}\x{9668}\x{9669}\x{966A}' . + '\x{966B}\x{966C}\x{966D}\x{966E}\x{966F}\x{9670}\x{9671}\x{9672}\x{9673}' . + '\x{9674}\x{9675}\x{9676}\x{9677}\x{9678}\x{967C}\x{967D}\x{967E}\x{9680}' . + '\x{9683}\x{9684}\x{9685}\x{9686}\x{9687}\x{9688}\x{9689}\x{968A}\x{968B}' . + '\x{968D}\x{968E}\x{968F}\x{9690}\x{9691}\x{9692}\x{9693}\x{9694}\x{9695}' . + '\x{9697}\x{9698}\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}\x{96A1}\x{96A2}' . + '\x{96A3}\x{96A4}\x{96A5}\x{96A6}\x{96A7}\x{96A8}\x{96A9}\x{96AA}\x{96AC}' . + '\x{96AD}\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}\x{96B7}\x{96B8}' . + '\x{96B9}\x{96BA}\x{96BB}\x{96BC}\x{96BD}\x{96BE}\x{96BF}\x{96C0}\x{96C1}' . + '\x{96C2}\x{96C3}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C8}\x{96C9}\x{96CA}' . + '\x{96CB}\x{96CC}\x{96CD}\x{96CE}\x{96CF}\x{96D0}\x{96D1}\x{96D2}\x{96D3}' . + '\x{96D4}\x{96D5}\x{96D6}\x{96D7}\x{96D8}\x{96D9}\x{96DA}\x{96DB}\x{96DC}' . + '\x{96DD}\x{96DE}\x{96DF}\x{96E0}\x{96E1}\x{96E2}\x{96E3}\x{96E5}\x{96E8}' . + '\x{96E9}\x{96EA}\x{96EB}\x{96EC}\x{96ED}\x{96EE}\x{96EF}\x{96F0}\x{96F1}' . + '\x{96F2}\x{96F3}\x{96F4}\x{96F5}\x{96F6}\x{96F7}\x{96F8}\x{96F9}\x{96FA}' . + '\x{96FB}\x{96FD}\x{96FE}\x{96FF}\x{9700}\x{9701}\x{9702}\x{9703}\x{9704}' . + '\x{9705}\x{9706}\x{9707}\x{9708}\x{9709}\x{970A}\x{970B}\x{970C}\x{970D}' . + '\x{970E}\x{970F}\x{9710}\x{9711}\x{9712}\x{9713}\x{9715}\x{9716}\x{9718}' . + '\x{9719}\x{971C}\x{971D}\x{971E}\x{971F}\x{9720}\x{9721}\x{9722}\x{9723}' . + '\x{9724}\x{9725}\x{9726}\x{9727}\x{9728}\x{9729}\x{972A}\x{972B}\x{972C}' . + '\x{972D}\x{972E}\x{972F}\x{9730}\x{9731}\x{9732}\x{9735}\x{9736}\x{9738}' . + '\x{9739}\x{973A}\x{973B}\x{973C}\x{973D}\x{973E}\x{973F}\x{9742}\x{9743}' . + '\x{9744}\x{9745}\x{9746}\x{9747}\x{9748}\x{9749}\x{974A}\x{974B}\x{974C}' . + '\x{974E}\x{974F}\x{9750}\x{9751}\x{9752}\x{9753}\x{9754}\x{9755}\x{9756}' . + '\x{9758}\x{9759}\x{975A}\x{975B}\x{975C}\x{975D}\x{975E}\x{975F}\x{9760}' . + '\x{9761}\x{9762}\x{9765}\x{9766}\x{9767}\x{9768}\x{9769}\x{976A}\x{976B}' . + '\x{976C}\x{976D}\x{976E}\x{976F}\x{9770}\x{9772}\x{9773}\x{9774}\x{9776}' . + '\x{9777}\x{9778}\x{9779}\x{977A}\x{977B}\x{977C}\x{977D}\x{977E}\x{977F}' . + '\x{9780}\x{9781}\x{9782}\x{9783}\x{9784}\x{9785}\x{9786}\x{9788}\x{978A}' . + '\x{978B}\x{978C}\x{978D}\x{978E}\x{978F}\x{9790}\x{9791}\x{9792}\x{9793}' . + '\x{9794}\x{9795}\x{9796}\x{9797}\x{9798}\x{9799}\x{979A}\x{979C}\x{979D}' . + '\x{979E}\x{979F}\x{97A0}\x{97A1}\x{97A2}\x{97A3}\x{97A4}\x{97A5}\x{97A6}' . + '\x{97A7}\x{97A8}\x{97AA}\x{97AB}\x{97AC}\x{97AD}\x{97AE}\x{97AF}\x{97B2}' . + '\x{97B3}\x{97B4}\x{97B6}\x{97B7}\x{97B8}\x{97B9}\x{97BA}\x{97BB}\x{97BC}' . + '\x{97BD}\x{97BF}\x{97C1}\x{97C2}\x{97C3}\x{97C4}\x{97C5}\x{97C6}\x{97C7}' . + '\x{97C8}\x{97C9}\x{97CA}\x{97CB}\x{97CC}\x{97CD}\x{97CE}\x{97CF}\x{97D0}' . + '\x{97D1}\x{97D3}\x{97D4}\x{97D5}\x{97D6}\x{97D7}\x{97D8}\x{97D9}\x{97DA}' . + '\x{97DB}\x{97DC}\x{97DD}\x{97DE}\x{97DF}\x{97E0}\x{97E1}\x{97E2}\x{97E3}' . + '\x{97E4}\x{97E5}\x{97E6}\x{97E7}\x{97E8}\x{97E9}\x{97EA}\x{97EB}\x{97EC}' . + '\x{97ED}\x{97EE}\x{97EF}\x{97F0}\x{97F1}\x{97F2}\x{97F3}\x{97F4}\x{97F5}' . + '\x{97F6}\x{97F7}\x{97F8}\x{97F9}\x{97FA}\x{97FB}\x{97FD}\x{97FE}\x{97FF}' . + '\x{9800}\x{9801}\x{9802}\x{9803}\x{9804}\x{9805}\x{9806}\x{9807}\x{9808}' . + '\x{9809}\x{980A}\x{980B}\x{980C}\x{980D}\x{980E}\x{980F}\x{9810}\x{9811}' . + '\x{9812}\x{9813}\x{9814}\x{9815}\x{9816}\x{9817}\x{9818}\x{9819}\x{981A}' . + '\x{981B}\x{981C}\x{981D}\x{981E}\x{9820}\x{9821}\x{9822}\x{9823}\x{9824}' . + '\x{9826}\x{9827}\x{9828}\x{9829}\x{982B}\x{982D}\x{982E}\x{982F}\x{9830}' . + '\x{9831}\x{9832}\x{9834}\x{9835}\x{9836}\x{9837}\x{9838}\x{9839}\x{983B}' . + '\x{983C}\x{983D}\x{983F}\x{9840}\x{9841}\x{9843}\x{9844}\x{9845}\x{9846}' . + '\x{9848}\x{9849}\x{984A}\x{984C}\x{984D}\x{984E}\x{984F}\x{9850}\x{9851}' . + '\x{9852}\x{9853}\x{9854}\x{9855}\x{9857}\x{9858}\x{9859}\x{985A}\x{985B}' . + '\x{985C}\x{985D}\x{985E}\x{985F}\x{9860}\x{9861}\x{9862}\x{9863}\x{9864}' . + '\x{9865}\x{9867}\x{9869}\x{986A}\x{986B}\x{986C}\x{986D}\x{986E}\x{986F}' . + '\x{9870}\x{9871}\x{9872}\x{9873}\x{9874}\x{9875}\x{9876}\x{9877}\x{9878}' . + '\x{9879}\x{987A}\x{987B}\x{987C}\x{987D}\x{987E}\x{987F}\x{9880}\x{9881}' . + '\x{9882}\x{9883}\x{9884}\x{9885}\x{9886}\x{9887}\x{9888}\x{9889}\x{988A}' . + '\x{988B}\x{988C}\x{988D}\x{988E}\x{988F}\x{9890}\x{9891}\x{9892}\x{9893}' . + '\x{9894}\x{9895}\x{9896}\x{9897}\x{9898}\x{9899}\x{989A}\x{989B}\x{989C}' . + '\x{989D}\x{989E}\x{989F}\x{98A0}\x{98A1}\x{98A2}\x{98A3}\x{98A4}\x{98A5}' . + '\x{98A6}\x{98A7}\x{98A8}\x{98A9}\x{98AA}\x{98AB}\x{98AC}\x{98AD}\x{98AE}' . + '\x{98AF}\x{98B0}\x{98B1}\x{98B2}\x{98B3}\x{98B4}\x{98B5}\x{98B6}\x{98B8}' . + '\x{98B9}\x{98BA}\x{98BB}\x{98BC}\x{98BD}\x{98BE}\x{98BF}\x{98C0}\x{98C1}' . + '\x{98C2}\x{98C3}\x{98C4}\x{98C5}\x{98C6}\x{98C8}\x{98C9}\x{98CB}\x{98CC}' . + '\x{98CD}\x{98CE}\x{98CF}\x{98D0}\x{98D1}\x{98D2}\x{98D3}\x{98D4}\x{98D5}' . + '\x{98D6}\x{98D7}\x{98D8}\x{98D9}\x{98DA}\x{98DB}\x{98DC}\x{98DD}\x{98DE}' . + '\x{98DF}\x{98E0}\x{98E2}\x{98E3}\x{98E5}\x{98E6}\x{98E7}\x{98E8}\x{98E9}' . + '\x{98EA}\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}\x{98F3}\x{98F4}\x{98F5}' . + '\x{98F6}\x{98F7}\x{98F9}\x{98FA}\x{98FC}\x{98FD}\x{98FE}\x{98FF}\x{9900}' . + '\x{9901}\x{9902}\x{9903}\x{9904}\x{9905}\x{9906}\x{9907}\x{9908}\x{9909}' . + '\x{990A}\x{990B}\x{990C}\x{990D}\x{990E}\x{990F}\x{9910}\x{9911}\x{9912}' . + '\x{9913}\x{9914}\x{9915}\x{9916}\x{9917}\x{9918}\x{991A}\x{991B}\x{991C}' . + '\x{991D}\x{991E}\x{991F}\x{9920}\x{9921}\x{9922}\x{9923}\x{9924}\x{9925}' . + '\x{9926}\x{9927}\x{9928}\x{9929}\x{992A}\x{992B}\x{992C}\x{992D}\x{992E}' . + '\x{992F}\x{9930}\x{9931}\x{9932}\x{9933}\x{9934}\x{9935}\x{9936}\x{9937}' . + '\x{9938}\x{9939}\x{993A}\x{993C}\x{993D}\x{993E}\x{993F}\x{9940}\x{9941}' . + '\x{9942}\x{9943}\x{9945}\x{9946}\x{9947}\x{9948}\x{9949}\x{994A}\x{994B}' . + '\x{994C}\x{994E}\x{994F}\x{9950}\x{9951}\x{9952}\x{9953}\x{9954}\x{9955}' . + '\x{9956}\x{9957}\x{9958}\x{9959}\x{995B}\x{995C}\x{995E}\x{995F}\x{9960}' . + '\x{9961}\x{9962}\x{9963}\x{9964}\x{9965}\x{9966}\x{9967}\x{9968}\x{9969}' . + '\x{996A}\x{996B}\x{996C}\x{996D}\x{996E}\x{996F}\x{9970}\x{9971}\x{9972}' . + '\x{9973}\x{9974}\x{9975}\x{9976}\x{9977}\x{9978}\x{9979}\x{997A}\x{997B}' . + '\x{997C}\x{997D}\x{997E}\x{997F}\x{9980}\x{9981}\x{9982}\x{9983}\x{9984}' . + '\x{9985}\x{9986}\x{9987}\x{9988}\x{9989}\x{998A}\x{998B}\x{998C}\x{998D}' . + '\x{998E}\x{998F}\x{9990}\x{9991}\x{9992}\x{9993}\x{9994}\x{9995}\x{9996}' . + '\x{9997}\x{9998}\x{9999}\x{999A}\x{999B}\x{999C}\x{999D}\x{999E}\x{999F}' . + '\x{99A0}\x{99A1}\x{99A2}\x{99A3}\x{99A4}\x{99A5}\x{99A6}\x{99A7}\x{99A8}' . + '\x{99A9}\x{99AA}\x{99AB}\x{99AC}\x{99AD}\x{99AE}\x{99AF}\x{99B0}\x{99B1}' . + '\x{99B2}\x{99B3}\x{99B4}\x{99B5}\x{99B6}\x{99B7}\x{99B8}\x{99B9}\x{99BA}' . + '\x{99BB}\x{99BC}\x{99BD}\x{99BE}\x{99C0}\x{99C1}\x{99C2}\x{99C3}\x{99C4}' . + '\x{99C6}\x{99C7}\x{99C8}\x{99C9}\x{99CA}\x{99CB}\x{99CC}\x{99CD}\x{99CE}' . + '\x{99CF}\x{99D0}\x{99D1}\x{99D2}\x{99D3}\x{99D4}\x{99D5}\x{99D6}\x{99D7}' . + '\x{99D8}\x{99D9}\x{99DA}\x{99DB}\x{99DC}\x{99DD}\x{99DE}\x{99DF}\x{99E1}' . + '\x{99E2}\x{99E3}\x{99E4}\x{99E5}\x{99E7}\x{99E8}\x{99E9}\x{99EA}\x{99EC}' . + '\x{99ED}\x{99EE}\x{99EF}\x{99F0}\x{99F1}\x{99F2}\x{99F3}\x{99F4}\x{99F6}' . + '\x{99F7}\x{99F8}\x{99F9}\x{99FA}\x{99FB}\x{99FC}\x{99FD}\x{99FE}\x{99FF}' . + '\x{9A00}\x{9A01}\x{9A02}\x{9A03}\x{9A04}\x{9A05}\x{9A06}\x{9A07}\x{9A08}' . + '\x{9A09}\x{9A0A}\x{9A0B}\x{9A0C}\x{9A0D}\x{9A0E}\x{9A0F}\x{9A11}\x{9A14}' . + '\x{9A15}\x{9A16}\x{9A19}\x{9A1A}\x{9A1B}\x{9A1C}\x{9A1D}\x{9A1E}\x{9A1F}' . + '\x{9A20}\x{9A21}\x{9A22}\x{9A23}\x{9A24}\x{9A25}\x{9A26}\x{9A27}\x{9A29}' . + '\x{9A2A}\x{9A2B}\x{9A2C}\x{9A2D}\x{9A2E}\x{9A2F}\x{9A30}\x{9A31}\x{9A32}' . + '\x{9A33}\x{9A34}\x{9A35}\x{9A36}\x{9A37}\x{9A38}\x{9A39}\x{9A3A}\x{9A3C}' . + '\x{9A3D}\x{9A3E}\x{9A3F}\x{9A40}\x{9A41}\x{9A42}\x{9A43}\x{9A44}\x{9A45}' . + '\x{9A46}\x{9A47}\x{9A48}\x{9A49}\x{9A4A}\x{9A4B}\x{9A4C}\x{9A4D}\x{9A4E}' . + '\x{9A4F}\x{9A50}\x{9A52}\x{9A53}\x{9A54}\x{9A55}\x{9A56}\x{9A57}\x{9A59}' . + '\x{9A5A}\x{9A5B}\x{9A5C}\x{9A5E}\x{9A5F}\x{9A60}\x{9A61}\x{9A62}\x{9A64}' . + '\x{9A65}\x{9A66}\x{9A67}\x{9A68}\x{9A69}\x{9A6A}\x{9A6B}\x{9A6C}\x{9A6D}' . + '\x{9A6E}\x{9A6F}\x{9A70}\x{9A71}\x{9A72}\x{9A73}\x{9A74}\x{9A75}\x{9A76}' . + '\x{9A77}\x{9A78}\x{9A79}\x{9A7A}\x{9A7B}\x{9A7C}\x{9A7D}\x{9A7E}\x{9A7F}' . + '\x{9A80}\x{9A81}\x{9A82}\x{9A83}\x{9A84}\x{9A85}\x{9A86}\x{9A87}\x{9A88}' . + '\x{9A89}\x{9A8A}\x{9A8B}\x{9A8C}\x{9A8D}\x{9A8E}\x{9A8F}\x{9A90}\x{9A91}' . + '\x{9A92}\x{9A93}\x{9A94}\x{9A95}\x{9A96}\x{9A97}\x{9A98}\x{9A99}\x{9A9A}' . + '\x{9A9B}\x{9A9C}\x{9A9D}\x{9A9E}\x{9A9F}\x{9AA0}\x{9AA1}\x{9AA2}\x{9AA3}' . + '\x{9AA4}\x{9AA5}\x{9AA6}\x{9AA7}\x{9AA8}\x{9AAA}\x{9AAB}\x{9AAC}\x{9AAD}' . + '\x{9AAE}\x{9AAF}\x{9AB0}\x{9AB1}\x{9AB2}\x{9AB3}\x{9AB4}\x{9AB5}\x{9AB6}' . + '\x{9AB7}\x{9AB8}\x{9AB9}\x{9ABA}\x{9ABB}\x{9ABC}\x{9ABE}\x{9ABF}\x{9AC0}' . + '\x{9AC1}\x{9AC2}\x{9AC3}\x{9AC4}\x{9AC5}\x{9AC6}\x{9AC7}\x{9AC9}\x{9ACA}' . + '\x{9ACB}\x{9ACC}\x{9ACD}\x{9ACE}\x{9ACF}\x{9AD0}\x{9AD1}\x{9AD2}\x{9AD3}' . + '\x{9AD4}\x{9AD5}\x{9AD6}\x{9AD8}\x{9AD9}\x{9ADA}\x{9ADB}\x{9ADC}\x{9ADD}' . + '\x{9ADE}\x{9ADF}\x{9AE1}\x{9AE2}\x{9AE3}\x{9AE5}\x{9AE6}\x{9AE7}\x{9AEA}' . + '\x{9AEB}\x{9AEC}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF2}\x{9AF3}\x{9AF4}' . + '\x{9AF5}\x{9AF6}\x{9AF7}\x{9AF8}\x{9AF9}\x{9AFA}\x{9AFB}\x{9AFC}\x{9AFD}' . + '\x{9AFE}\x{9AFF}\x{9B01}\x{9B03}\x{9B04}\x{9B05}\x{9B06}\x{9B07}\x{9B08}' . + '\x{9B0A}\x{9B0B}\x{9B0C}\x{9B0D}\x{9B0E}\x{9B0F}\x{9B10}\x{9B11}\x{9B12}' . + '\x{9B13}\x{9B15}\x{9B16}\x{9B17}\x{9B18}\x{9B19}\x{9B1A}\x{9B1C}\x{9B1D}' . + '\x{9B1E}\x{9B1F}\x{9B20}\x{9B21}\x{9B22}\x{9B23}\x{9B24}\x{9B25}\x{9B26}' . + '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2B}\x{9B2C}\x{9B2D}\x{9B2E}\x{9B2F}' . + '\x{9B30}\x{9B31}\x{9B32}\x{9B33}\x{9B35}\x{9B36}\x{9B37}\x{9B38}\x{9B39}' . + '\x{9B3A}\x{9B3B}\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}\x{9B42}\x{9B43}\x{9B44}' . + '\x{9B45}\x{9B46}\x{9B47}\x{9B48}\x{9B49}\x{9B4A}\x{9B4B}\x{9B4C}\x{9B4D}' . + '\x{9B4E}\x{9B4F}\x{9B51}\x{9B52}\x{9B53}\x{9B54}\x{9B55}\x{9B56}\x{9B58}' . + '\x{9B59}\x{9B5A}\x{9B5B}\x{9B5C}\x{9B5D}\x{9B5E}\x{9B5F}\x{9B60}\x{9B61}' . + '\x{9B63}\x{9B64}\x{9B65}\x{9B66}\x{9B67}\x{9B68}\x{9B69}\x{9B6A}\x{9B6B}' . + '\x{9B6C}\x{9B6D}\x{9B6E}\x{9B6F}\x{9B70}\x{9B71}\x{9B73}\x{9B74}\x{9B75}' . + '\x{9B76}\x{9B77}\x{9B78}\x{9B79}\x{9B7A}\x{9B7B}\x{9B7C}\x{9B7D}\x{9B7E}' . + '\x{9B7F}\x{9B80}\x{9B81}\x{9B82}\x{9B83}\x{9B84}\x{9B85}\x{9B86}\x{9B87}' . + '\x{9B88}\x{9B8A}\x{9B8B}\x{9B8D}\x{9B8E}\x{9B8F}\x{9B90}\x{9B91}\x{9B92}' . + '\x{9B93}\x{9B94}\x{9B95}\x{9B96}\x{9B97}\x{9B98}\x{9B9A}\x{9B9B}\x{9B9C}' . + '\x{9B9D}\x{9B9E}\x{9B9F}\x{9BA0}\x{9BA1}\x{9BA2}\x{9BA3}\x{9BA4}\x{9BA5}' . + '\x{9BA6}\x{9BA7}\x{9BA8}\x{9BA9}\x{9BAA}\x{9BAB}\x{9BAC}\x{9BAD}\x{9BAE}' . + '\x{9BAF}\x{9BB0}\x{9BB1}\x{9BB2}\x{9BB3}\x{9BB4}\x{9BB5}\x{9BB6}\x{9BB7}' . + '\x{9BB8}\x{9BB9}\x{9BBA}\x{9BBB}\x{9BBC}\x{9BBD}\x{9BBE}\x{9BBF}\x{9BC0}' . + '\x{9BC1}\x{9BC3}\x{9BC4}\x{9BC5}\x{9BC6}\x{9BC7}\x{9BC8}\x{9BC9}\x{9BCA}' . + '\x{9BCB}\x{9BCC}\x{9BCD}\x{9BCE}\x{9BCF}\x{9BD0}\x{9BD1}\x{9BD2}\x{9BD3}' . + '\x{9BD4}\x{9BD5}\x{9BD6}\x{9BD7}\x{9BD8}\x{9BD9}\x{9BDA}\x{9BDB}\x{9BDC}' . + '\x{9BDD}\x{9BDE}\x{9BDF}\x{9BE0}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}\x{9BE5}' . + '\x{9BE6}\x{9BE7}\x{9BE8}\x{9BE9}\x{9BEA}\x{9BEB}\x{9BEC}\x{9BED}\x{9BEE}' . + '\x{9BEF}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF3}\x{9BF4}\x{9BF5}\x{9BF7}\x{9BF8}' . + '\x{9BF9}\x{9BFA}\x{9BFB}\x{9BFC}\x{9BFD}\x{9BFE}\x{9BFF}\x{9C02}\x{9C05}' . + '\x{9C06}\x{9C07}\x{9C08}\x{9C09}\x{9C0A}\x{9C0B}\x{9C0C}\x{9C0D}\x{9C0E}' . + '\x{9C0F}\x{9C10}\x{9C11}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C16}\x{9C17}' . + '\x{9C18}\x{9C19}\x{9C1A}\x{9C1B}\x{9C1C}\x{9C1D}\x{9C1E}\x{9C1F}\x{9C20}' . + '\x{9C21}\x{9C22}\x{9C23}\x{9C24}\x{9C25}\x{9C26}\x{9C27}\x{9C28}\x{9C29}' . + '\x{9C2A}\x{9C2B}\x{9C2C}\x{9C2D}\x{9C2F}\x{9C30}\x{9C31}\x{9C32}\x{9C33}' . + '\x{9C34}\x{9C35}\x{9C36}\x{9C37}\x{9C38}\x{9C39}\x{9C3A}\x{9C3B}\x{9C3C}' . + '\x{9C3D}\x{9C3E}\x{9C3F}\x{9C40}\x{9C41}\x{9C43}\x{9C44}\x{9C45}\x{9C46}' . + '\x{9C47}\x{9C48}\x{9C49}\x{9C4A}\x{9C4B}\x{9C4C}\x{9C4D}\x{9C4E}\x{9C50}' . + '\x{9C52}\x{9C53}\x{9C54}\x{9C55}\x{9C56}\x{9C57}\x{9C58}\x{9C59}\x{9C5A}' . + '\x{9C5B}\x{9C5C}\x{9C5D}\x{9C5E}\x{9C5F}\x{9C60}\x{9C62}\x{9C63}\x{9C65}' . + '\x{9C66}\x{9C67}\x{9C68}\x{9C69}\x{9C6A}\x{9C6B}\x{9C6C}\x{9C6D}\x{9C6E}' . + '\x{9C6F}\x{9C70}\x{9C71}\x{9C72}\x{9C73}\x{9C74}\x{9C75}\x{9C77}\x{9C78}' . + '\x{9C79}\x{9C7A}\x{9C7C}\x{9C7D}\x{9C7E}\x{9C7F}\x{9C80}\x{9C81}\x{9C82}' . + '\x{9C83}\x{9C84}\x{9C85}\x{9C86}\x{9C87}\x{9C88}\x{9C89}\x{9C8A}\x{9C8B}' . + '\x{9C8C}\x{9C8D}\x{9C8E}\x{9C8F}\x{9C90}\x{9C91}\x{9C92}\x{9C93}\x{9C94}' . + '\x{9C95}\x{9C96}\x{9C97}\x{9C98}\x{9C99}\x{9C9A}\x{9C9B}\x{9C9C}\x{9C9D}' . + '\x{9C9E}\x{9C9F}\x{9CA0}\x{9CA1}\x{9CA2}\x{9CA3}\x{9CA4}\x{9CA5}\x{9CA6}' . + '\x{9CA7}\x{9CA8}\x{9CA9}\x{9CAA}\x{9CAB}\x{9CAC}\x{9CAD}\x{9CAE}\x{9CAF}' . + '\x{9CB0}\x{9CB1}\x{9CB2}\x{9CB3}\x{9CB4}\x{9CB5}\x{9CB6}\x{9CB7}\x{9CB8}' . + '\x{9CB9}\x{9CBA}\x{9CBB}\x{9CBC}\x{9CBD}\x{9CBE}\x{9CBF}\x{9CC0}\x{9CC1}' . + '\x{9CC2}\x{9CC3}\x{9CC4}\x{9CC5}\x{9CC6}\x{9CC7}\x{9CC8}\x{9CC9}\x{9CCA}' . + '\x{9CCB}\x{9CCC}\x{9CCD}\x{9CCE}\x{9CCF}\x{9CD0}\x{9CD1}\x{9CD2}\x{9CD3}' . + '\x{9CD4}\x{9CD5}\x{9CD6}\x{9CD7}\x{9CD8}\x{9CD9}\x{9CDA}\x{9CDB}\x{9CDC}' . + '\x{9CDD}\x{9CDE}\x{9CDF}\x{9CE0}\x{9CE1}\x{9CE2}\x{9CE3}\x{9CE4}\x{9CE5}' . + '\x{9CE6}\x{9CE7}\x{9CE8}\x{9CE9}\x{9CEA}\x{9CEB}\x{9CEC}\x{9CED}\x{9CEE}' . + '\x{9CEF}\x{9CF0}\x{9CF1}\x{9CF2}\x{9CF3}\x{9CF4}\x{9CF5}\x{9CF6}\x{9CF7}' . + '\x{9CF8}\x{9CF9}\x{9CFA}\x{9CFB}\x{9CFC}\x{9CFD}\x{9CFE}\x{9CFF}\x{9D00}' . + '\x{9D01}\x{9D02}\x{9D03}\x{9D04}\x{9D05}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . + '\x{9D0A}\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}\x{9D13}\x{9D14}\x{9D15}\x{9D16}' . + '\x{9D17}\x{9D18}\x{9D19}\x{9D1A}\x{9D1B}\x{9D1C}\x{9D1D}\x{9D1E}\x{9D1F}' . + '\x{9D20}\x{9D21}\x{9D22}\x{9D23}\x{9D24}\x{9D25}\x{9D26}\x{9D28}\x{9D29}' . + '\x{9D2B}\x{9D2D}\x{9D2E}\x{9D2F}\x{9D30}\x{9D31}\x{9D32}\x{9D33}\x{9D34}' . + '\x{9D36}\x{9D37}\x{9D38}\x{9D39}\x{9D3A}\x{9D3B}\x{9D3D}\x{9D3E}\x{9D3F}' . + '\x{9D40}\x{9D41}\x{9D42}\x{9D43}\x{9D45}\x{9D46}\x{9D47}\x{9D48}\x{9D49}' . + '\x{9D4A}\x{9D4B}\x{9D4C}\x{9D4D}\x{9D4E}\x{9D4F}\x{9D50}\x{9D51}\x{9D52}' . + '\x{9D53}\x{9D54}\x{9D55}\x{9D56}\x{9D57}\x{9D58}\x{9D59}\x{9D5A}\x{9D5B}' . + '\x{9D5C}\x{9D5D}\x{9D5E}\x{9D5F}\x{9D60}\x{9D61}\x{9D62}\x{9D63}\x{9D64}' . + '\x{9D65}\x{9D66}\x{9D67}\x{9D68}\x{9D69}\x{9D6A}\x{9D6B}\x{9D6C}\x{9D6E}' . + '\x{9D6F}\x{9D70}\x{9D71}\x{9D72}\x{9D73}\x{9D74}\x{9D75}\x{9D76}\x{9D77}' . + '\x{9D78}\x{9D79}\x{9D7A}\x{9D7B}\x{9D7C}\x{9D7D}\x{9D7E}\x{9D7F}\x{9D80}' . + '\x{9D81}\x{9D82}\x{9D83}\x{9D84}\x{9D85}\x{9D86}\x{9D87}\x{9D88}\x{9D89}' . + '\x{9D8A}\x{9D8B}\x{9D8C}\x{9D8D}\x{9D8E}\x{9D90}\x{9D91}\x{9D92}\x{9D93}' . + '\x{9D94}\x{9D96}\x{9D97}\x{9D98}\x{9D99}\x{9D9A}\x{9D9B}\x{9D9C}\x{9D9D}' . + '\x{9D9E}\x{9D9F}\x{9DA0}\x{9DA1}\x{9DA2}\x{9DA3}\x{9DA4}\x{9DA5}\x{9DA6}' . + '\x{9DA7}\x{9DA8}\x{9DA9}\x{9DAA}\x{9DAB}\x{9DAC}\x{9DAD}\x{9DAF}\x{9DB0}' . + '\x{9DB1}\x{9DB2}\x{9DB3}\x{9DB4}\x{9DB5}\x{9DB6}\x{9DB7}\x{9DB8}\x{9DB9}' . + '\x{9DBA}\x{9DBB}\x{9DBC}\x{9DBE}\x{9DBF}\x{9DC1}\x{9DC2}\x{9DC3}\x{9DC4}' . + '\x{9DC5}\x{9DC7}\x{9DC8}\x{9DC9}\x{9DCA}\x{9DCB}\x{9DCC}\x{9DCD}\x{9DCE}' . + '\x{9DCF}\x{9DD0}\x{9DD1}\x{9DD2}\x{9DD3}\x{9DD4}\x{9DD5}\x{9DD6}\x{9DD7}' . + '\x{9DD8}\x{9DD9}\x{9DDA}\x{9DDB}\x{9DDC}\x{9DDD}\x{9DDE}\x{9DDF}\x{9DE0}' . + '\x{9DE1}\x{9DE2}\x{9DE3}\x{9DE4}\x{9DE5}\x{9DE6}\x{9DE7}\x{9DE8}\x{9DE9}' . + '\x{9DEB}\x{9DEC}\x{9DED}\x{9DEE}\x{9DEF}\x{9DF0}\x{9DF1}\x{9DF2}\x{9DF3}' . + '\x{9DF4}\x{9DF5}\x{9DF6}\x{9DF7}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFB}\x{9DFD}' . + '\x{9DFE}\x{9DFF}\x{9E00}\x{9E01}\x{9E02}\x{9E03}\x{9E04}\x{9E05}\x{9E06}' . + '\x{9E07}\x{9E08}\x{9E09}\x{9E0A}\x{9E0B}\x{9E0C}\x{9E0D}\x{9E0F}\x{9E10}' . + '\x{9E11}\x{9E12}\x{9E13}\x{9E14}\x{9E15}\x{9E17}\x{9E18}\x{9E19}\x{9E1A}' . + '\x{9E1B}\x{9E1D}\x{9E1E}\x{9E1F}\x{9E20}\x{9E21}\x{9E22}\x{9E23}\x{9E24}' . + '\x{9E25}\x{9E26}\x{9E27}\x{9E28}\x{9E29}\x{9E2A}\x{9E2B}\x{9E2C}\x{9E2D}' . + '\x{9E2E}\x{9E2F}\x{9E30}\x{9E31}\x{9E32}\x{9E33}\x{9E34}\x{9E35}\x{9E36}' . + '\x{9E37}\x{9E38}\x{9E39}\x{9E3A}\x{9E3B}\x{9E3C}\x{9E3D}\x{9E3E}\x{9E3F}' . + '\x{9E40}\x{9E41}\x{9E42}\x{9E43}\x{9E44}\x{9E45}\x{9E46}\x{9E47}\x{9E48}' . + '\x{9E49}\x{9E4A}\x{9E4B}\x{9E4C}\x{9E4D}\x{9E4E}\x{9E4F}\x{9E50}\x{9E51}' . + '\x{9E52}\x{9E53}\x{9E54}\x{9E55}\x{9E56}\x{9E57}\x{9E58}\x{9E59}\x{9E5A}' . + '\x{9E5B}\x{9E5C}\x{9E5D}\x{9E5E}\x{9E5F}\x{9E60}\x{9E61}\x{9E62}\x{9E63}' . + '\x{9E64}\x{9E65}\x{9E66}\x{9E67}\x{9E68}\x{9E69}\x{9E6A}\x{9E6B}\x{9E6C}' . + '\x{9E6D}\x{9E6E}\x{9E6F}\x{9E70}\x{9E71}\x{9E72}\x{9E73}\x{9E74}\x{9E75}' . + '\x{9E76}\x{9E77}\x{9E79}\x{9E7A}\x{9E7C}\x{9E7D}\x{9E7E}\x{9E7F}\x{9E80}' . + '\x{9E81}\x{9E82}\x{9E83}\x{9E84}\x{9E85}\x{9E86}\x{9E87}\x{9E88}\x{9E89}' . + '\x{9E8A}\x{9E8B}\x{9E8C}\x{9E8D}\x{9E8E}\x{9E91}\x{9E92}\x{9E93}\x{9E94}' . + '\x{9E96}\x{9E97}\x{9E99}\x{9E9A}\x{9E9B}\x{9E9C}\x{9E9D}\x{9E9F}\x{9EA0}' . + '\x{9EA1}\x{9EA3}\x{9EA4}\x{9EA5}\x{9EA6}\x{9EA7}\x{9EA8}\x{9EA9}\x{9EAA}' . + '\x{9EAD}\x{9EAE}\x{9EAF}\x{9EB0}\x{9EB2}\x{9EB3}\x{9EB4}\x{9EB5}\x{9EB6}' . + '\x{9EB7}\x{9EB8}\x{9EBB}\x{9EBC}\x{9EBD}\x{9EBE}\x{9EBF}\x{9EC0}\x{9EC1}' . + '\x{9EC2}\x{9EC3}\x{9EC4}\x{9EC5}\x{9EC6}\x{9EC7}\x{9EC8}\x{9EC9}\x{9ECA}' . + '\x{9ECB}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED1}\x{9ED2}\x{9ED3}' . + '\x{9ED4}\x{9ED5}\x{9ED6}\x{9ED7}\x{9ED8}\x{9ED9}\x{9EDA}\x{9EDB}\x{9EDC}' . + '\x{9EDD}\x{9EDE}\x{9EDF}\x{9EE0}\x{9EE1}\x{9EE2}\x{9EE3}\x{9EE4}\x{9EE5}' . + '\x{9EE6}\x{9EE7}\x{9EE8}\x{9EE9}\x{9EEA}\x{9EEB}\x{9EED}\x{9EEE}\x{9EEF}' . + '\x{9EF0}\x{9EF2}\x{9EF3}\x{9EF4}\x{9EF5}\x{9EF6}\x{9EF7}\x{9EF8}\x{9EF9}' . + '\x{9EFA}\x{9EFB}\x{9EFC}\x{9EFD}\x{9EFE}\x{9EFF}\x{9F00}\x{9F01}\x{9F02}' . + '\x{9F04}\x{9F05}\x{9F06}\x{9F07}\x{9F08}\x{9F09}\x{9F0A}\x{9F0B}\x{9F0C}' . + '\x{9F0D}\x{9F0E}\x{9F0F}\x{9F10}\x{9F12}\x{9F13}\x{9F15}\x{9F16}\x{9F17}' . + '\x{9F18}\x{9F19}\x{9F1A}\x{9F1B}\x{9F1C}\x{9F1D}\x{9F1E}\x{9F1F}\x{9F20}' . + '\x{9F22}\x{9F23}\x{9F24}\x{9F25}\x{9F27}\x{9F28}\x{9F29}\x{9F2A}\x{9F2B}' . + '\x{9F2C}\x{9F2D}\x{9F2E}\x{9F2F}\x{9F30}\x{9F31}\x{9F32}\x{9F33}\x{9F34}' . + '\x{9F35}\x{9F36}\x{9F37}\x{9F38}\x{9F39}\x{9F3A}\x{9F3B}\x{9F3C}\x{9F3D}' . + '\x{9F3E}\x{9F3F}\x{9F40}\x{9F41}\x{9F42}\x{9F43}\x{9F44}\x{9F46}\x{9F47}' . + '\x{9F48}\x{9F49}\x{9F4A}\x{9F4B}\x{9F4C}\x{9F4D}\x{9F4E}\x{9F4F}\x{9F50}' . + '\x{9F51}\x{9F52}\x{9F54}\x{9F55}\x{9F56}\x{9F57}\x{9F58}\x{9F59}\x{9F5A}' . + '\x{9F5B}\x{9F5C}\x{9F5D}\x{9F5E}\x{9F5F}\x{9F60}\x{9F61}\x{9F63}\x{9F64}' . + '\x{9F65}\x{9F66}\x{9F67}\x{9F68}\x{9F69}\x{9F6A}\x{9F6B}\x{9F6C}\x{9F6E}' . + '\x{9F6F}\x{9F70}\x{9F71}\x{9F72}\x{9F73}\x{9F74}\x{9F75}\x{9F76}\x{9F77}' . + '\x{9F78}\x{9F79}\x{9F7A}\x{9F7B}\x{9F7C}\x{9F7D}\x{9F7E}\x{9F7F}\x{9F80}' . + '\x{9F81}\x{9F82}\x{9F83}\x{9F84}\x{9F85}\x{9F86}\x{9F87}\x{9F88}\x{9F89}' . + '\x{9F8A}\x{9F8B}\x{9F8C}\x{9F8D}\x{9F8E}\x{9F8F}\x{9F90}\x{9F91}\x{9F92}' . + '\x{9F93}\x{9F94}\x{9F95}\x{9F96}\x{9F97}\x{9F98}\x{9F99}\x{9F9A}\x{9F9B}' . + '\x{9F9C}\x{9F9D}\x{9F9E}\x{9F9F}\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu', +); diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Com.php b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Com.php new file mode 100644 index 0000000000..a86e806c9b --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Com.php @@ -0,0 +1,182 @@ + '/^[\x{002d}0-9\x{0400}-\x{052f}]{1,63}$/iu', + 2 => '/^[\x{002d}0-9\x{0370}-\x{03ff}]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-z\x{ac00}-\x{d7a3}]{1,17}$/iu', + 4 => '/^[\x{002d}0-9a-z·à-öø-ÿÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıĵķĸĺļľłńņňŋÅÅőœŕŗřśÅşšţťŧũūŭůűųŵŷźżž]{1,63}$/iu', + 5 => '/^[\x{002d}0-9A-Za-z\x{3400}-\x{3401}\x{3404}-\x{3406}\x{340C}\x{3416}\x{341C}' . +'\x{3421}\x{3424}\x{3428}-\x{3429}\x{342B}-\x{342E}\x{3430}-\x{3434}\x{3436}' . +'\x{3438}-\x{343C}\x{343E}\x{3441}-\x{3445}\x{3447}\x{3449}-\x{3451}\x{3453}' . +'\x{3457}-\x{345F}\x{3463}-\x{3467}\x{346E}-\x{3471}\x{3473}-\x{3477}\x{3479}-\x{348E}\x{3491}-\x{3497}' . +'\x{3499}-\x{34A1}\x{34A4}-\x{34AD}\x{34AF}-\x{34B0}\x{34B2}-\x{34BF}\x{34C2}-\x{34C5}\x{34C7}-\x{34CC}' . +'\x{34CE}-\x{34D1}\x{34D3}-\x{34D8}\x{34DA}-\x{34E4}\x{34E7}-\x{34E9}\x{34EC}-\x{34EF}\x{34F1}-\x{34FE}' . +'\x{3500}-\x{3507}\x{350A}-\x{3513}\x{3515}\x{3517}-\x{351A}\x{351C}-\x{351E}\x{3520}-\x{352A}' . +'\x{352C}-\x{3552}\x{3554}-\x{355C}\x{355E}-\x{3567}\x{3569}-\x{3573}\x{3575}-\x{357C}\x{3580}-\x{3588}' . +'\x{358F}-\x{3598}\x{359E}-\x{35AB}\x{35B4}-\x{35CD}\x{35D0}\x{35D3}-\x{35DC}\x{35E2}-\x{35ED}' . +'\x{35F0}-\x{35F6}\x{35FB}-\x{3602}\x{3605}-\x{360E}\x{3610}-\x{3611}\x{3613}-\x{3616}\x{3619}-\x{362D}' . +'\x{362F}-\x{3634}\x{3636}-\x{363B}\x{363F}-\x{3645}\x{3647}-\x{364B}\x{364D}-\x{3653}\x{3655}' . +'\x{3659}-\x{365E}\x{3660}-\x{3665}\x{3667}-\x{367C}\x{367E}\x{3680}-\x{3685}\x{3687}' . +'\x{3689}-\x{3690}\x{3692}-\x{3698}\x{369A}\x{369C}-\x{36AE}\x{36B0}-\x{36BF}\x{36C1}-\x{36C5}' . +'\x{36C9}-\x{36CA}\x{36CD}-\x{36DE}\x{36E1}-\x{36E2}\x{36E5}-\x{36FE}\x{3701}-\x{3713}\x{3715}-\x{371E}' . +'\x{3720}-\x{372C}\x{372E}-\x{3745}\x{3747}-\x{3748}\x{374A}\x{374C}-\x{3759}\x{375B}-\x{3760}' . +'\x{3762}-\x{3767}\x{3769}-\x{3772}\x{3774}-\x{378C}\x{378F}-\x{379C}\x{379F}\x{37A1}-\x{37AD}' . +'\x{37AF}-\x{37B7}\x{37B9}-\x{37C1}\x{37C3}-\x{37C5}\x{37C7}-\x{37D4}\x{37D6}-\x{37E0}\x{37E2}' . +'\x{37E5}-\x{37ED}\x{37EF}-\x{37F6}\x{37F8}-\x{3802}\x{3804}-\x{381D}\x{3820}-\x{3822}\x{3825}-\x{382A}' . +'\x{382D}-\x{382F}\x{3831}-\x{3832}\x{3834}-\x{384C}\x{384E}-\x{3860}\x{3862}-\x{3863}\x{3865}-\x{386B}' . +'\x{386D}-\x{3886}\x{3888}-\x{38A1}\x{38A3}\x{38A5}-\x{38AA}\x{38AC}\x{38AE}-\x{38B0}' . +'\x{38B2}-\x{38B6}\x{38B8}\x{38BA}-\x{38BE}\x{38C0}-\x{38C9}\x{38CB}-\x{38D4}\x{38D8}-\x{38E0}' . +'\x{38E2}-\x{38E6}\x{38EB}-\x{38ED}\x{38EF}-\x{38F2}\x{38F5}-\x{38F7}\x{38FA}-\x{38FF}\x{3901}-\x{392A}' . +'\x{392C}\x{392E}-\x{393B}\x{393E}-\x{3956}\x{395A}-\x{3969}\x{396B}-\x{397A}\x{397C}-\x{3987}' . +'\x{3989}-\x{3998}\x{399A}-\x{39B0}\x{39B2}\x{39B4}-\x{39D0}\x{39D2}-\x{39DA}\x{39DE}-\x{39DF}' . +'\x{39E1}-\x{39EF}\x{39F1}-\x{3A17}\x{3A19}-\x{3A2A}\x{3A2D}-\x{3A40}\x{3A43}-\x{3A4E}\x{3A50}' . +'\x{3A52}-\x{3A5E}\x{3A60}-\x{3A6D}\x{3A6F}-\x{3A77}\x{3A79}-\x{3A82}\x{3A84}-\x{3A85}\x{3A87}-\x{3A89}' . +'\x{3A8B}-\x{3A8F}\x{3A91}-\x{3A93}\x{3A95}-\x{3A96}\x{3A9A}\x{3A9C}-\x{3AA6}\x{3AA8}-\x{3AA9}' . +'\x{3AAB}-\x{3AB1}\x{3AB4}-\x{3ABC}\x{3ABE}-\x{3AC5}\x{3ACA}-\x{3ACB}\x{3ACD}-\x{3AD5}\x{3AD7}-\x{3AE1}' . +'\x{3AE4}-\x{3AE7}\x{3AE9}-\x{3AEC}\x{3AEE}-\x{3AFD}\x{3B01}-\x{3B10}\x{3B12}-\x{3B15}\x{3B17}-\x{3B1E}' . +'\x{3B20}-\x{3B23}\x{3B25}-\x{3B27}\x{3B29}-\x{3B36}\x{3B38}-\x{3B39}\x{3B3B}-\x{3B3C}\x{3B3F}' . +'\x{3B41}-\x{3B44}\x{3B47}-\x{3B4C}\x{3B4E}\x{3B51}-\x{3B55}\x{3B58}-\x{3B62}\x{3B68}-\x{3B72}' . +'\x{3B78}-\x{3B88}\x{3B8B}-\x{3B9F}\x{3BA1}\x{3BA3}-\x{3BBA}\x{3BBC}\x{3BBF}-\x{3BD0}' . +'\x{3BD3}-\x{3BE6}\x{3BEA}-\x{3BFB}\x{3BFE}-\x{3C12}\x{3C14}-\x{3C1B}\x{3C1D}-\x{3C37}\x{3C39}-\x{3C4F}' . +'\x{3C52}\x{3C54}-\x{3C5C}\x{3C5E}-\x{3C68}\x{3C6A}-\x{3C76}\x{3C78}-\x{3C8F}\x{3C91}-\x{3CA8}' . +'\x{3CAA}-\x{3CAD}\x{3CAF}-\x{3CBE}\x{3CC0}-\x{3CC8}\x{3CCA}-\x{3CD3}\x{3CD6}-\x{3CE0}\x{3CE4}-\x{3CEE}' . +'\x{3CF3}-\x{3D0A}\x{3D0E}-\x{3D1E}\x{3D20}-\x{3D21}\x{3D25}-\x{3D38}\x{3D3B}-\x{3D46}\x{3D4A}-\x{3D59}' . +'\x{3D5D}-\x{3D7B}\x{3D7D}-\x{3D81}\x{3D84}-\x{3D88}\x{3D8C}-\x{3D8F}\x{3D91}-\x{3D98}\x{3D9A}-\x{3D9C}' . +'\x{3D9E}-\x{3DA1}\x{3DA3}-\x{3DB0}\x{3DB2}-\x{3DB5}\x{3DB9}-\x{3DBC}\x{3DBE}-\x{3DCB}\x{3DCD}-\x{3DDB}' . +'\x{3DDF}-\x{3DE8}\x{3DEB}-\x{3DF0}\x{3DF3}-\x{3DF9}\x{3DFB}-\x{3DFC}\x{3DFE}-\x{3E05}\x{3E08}-\x{3E33}' . +'\x{3E35}-\x{3E3E}\x{3E40}-\x{3E47}\x{3E49}-\x{3E67}\x{3E6B}-\x{3E6F}\x{3E71}-\x{3E85}\x{3E87}-\x{3E8C}' . +'\x{3E8E}-\x{3E98}\x{3E9A}-\x{3EA1}\x{3EA3}-\x{3EAE}\x{3EB0}-\x{3EB5}\x{3EB7}-\x{3EBA}\x{3EBD}' . +'\x{3EBF}-\x{3EC4}\x{3EC7}-\x{3ECE}\x{3ED1}-\x{3ED7}\x{3ED9}-\x{3EDA}\x{3EDD}-\x{3EE3}\x{3EE7}-\x{3EE8}' . +'\x{3EEB}-\x{3EF2}\x{3EF5}-\x{3EFF}\x{3F01}-\x{3F02}\x{3F04}-\x{3F07}\x{3F09}-\x{3F44}\x{3F46}-\x{3F4E}' . +'\x{3F50}-\x{3F53}\x{3F55}-\x{3F72}\x{3F74}-\x{3F75}\x{3F77}-\x{3F7B}\x{3F7D}-\x{3FB0}\x{3FB6}-\x{3FBF}' . +'\x{3FC1}-\x{3FCF}\x{3FD1}-\x{3FD3}\x{3FD5}-\x{3FDF}\x{3FE1}-\x{400B}\x{400D}-\x{401C}\x{401E}-\x{4024}' . +'\x{4027}-\x{403F}\x{4041}-\x{4060}\x{4062}-\x{4069}\x{406B}-\x{408A}\x{408C}-\x{40A7}\x{40A9}-\x{40B4}' . +'\x{40B6}-\x{40C2}\x{40C7}-\x{40CF}\x{40D1}-\x{40DE}\x{40E0}-\x{40E7}\x{40E9}-\x{40EE}\x{40F0}-\x{40FB}' . +'\x{40FD}-\x{4109}\x{410B}-\x{4115}\x{4118}-\x{411D}\x{411F}-\x{4122}\x{4124}-\x{4133}\x{4136}-\x{4138}' . +'\x{413A}-\x{4148}\x{414A}-\x{4169}\x{416C}-\x{4185}\x{4188}-\x{418B}\x{418D}-\x{41AD}\x{41AF}-\x{41B3}' . +'\x{41B5}-\x{41C3}\x{41C5}-\x{41C9}\x{41CB}-\x{41F2}\x{41F5}-\x{41FE}\x{4200}-\x{4227}\x{422A}-\x{4246}' . +'\x{4248}-\x{4263}\x{4265}-\x{428B}\x{428D}-\x{42A1}\x{42A3}-\x{42C4}\x{42C8}-\x{42DC}\x{42DE}-\x{430A}' . +'\x{430C}-\x{4335}\x{4337}\x{4342}-\x{435F}\x{4361}-\x{439A}\x{439C}-\x{439D}\x{439F}-\x{43A4}' . +'\x{43A6}-\x{43EC}\x{43EF}-\x{4405}\x{4407}-\x{4429}\x{442B}-\x{4455}\x{4457}-\x{4468}\x{446A}-\x{446D}' . +'\x{446F}-\x{4476}\x{4479}-\x{447D}\x{447F}-\x{4486}\x{4488}-\x{4490}\x{4492}-\x{4498}\x{449A}-\x{44AD}' . +'\x{44B0}-\x{44BD}\x{44C1}-\x{44D3}\x{44D6}-\x{44E7}\x{44EA}\x{44EC}-\x{44FA}\x{44FC}-\x{4541}' . +'\x{4543}-\x{454F}\x{4551}-\x{4562}\x{4564}-\x{4575}\x{4577}-\x{45AB}\x{45AD}-\x{45BD}\x{45BF}-\x{45D5}' . +'\x{45D7}-\x{45EC}\x{45EE}-\x{45F2}\x{45F4}-\x{45FA}\x{45FC}-\x{461A}\x{461C}-\x{461D}\x{461F}-\x{4631}' . +'\x{4633}-\x{4649}\x{464C}\x{464E}-\x{4652}\x{4654}-\x{466A}\x{466C}-\x{4675}\x{4677}-\x{467A}' . +'\x{467C}-\x{4694}\x{4696}-\x{46A3}\x{46A5}-\x{46AB}\x{46AD}-\x{46D2}\x{46D4}-\x{4723}\x{4729}-\x{4732}' . +'\x{4734}-\x{4758}\x{475A}\x{475C}-\x{478B}\x{478D}\x{4791}-\x{47B1}\x{47B3}-\x{47F1}' . +'\x{47F3}-\x{480B}\x{480D}-\x{4815}\x{4817}-\x{4839}\x{483B}-\x{4870}\x{4872}-\x{487A}\x{487C}-\x{487F}' . +'\x{4883}-\x{488E}\x{4890}-\x{4896}\x{4899}-\x{48A2}\x{48A4}-\x{48B9}\x{48BB}-\x{48C8}\x{48CA}-\x{48D1}' . +'\x{48D3}-\x{48E5}\x{48E7}-\x{48F2}\x{48F4}-\x{48FF}\x{4901}-\x{4922}\x{4924}-\x{4928}\x{492A}-\x{4931}' . +'\x{4933}-\x{495B}\x{495D}-\x{4978}\x{497A}\x{497D}\x{4982}-\x{4983}\x{4985}-\x{49A8}' . +'\x{49AA}-\x{49AF}\x{49B1}-\x{49B7}\x{49B9}-\x{49BD}\x{49C1}-\x{49C7}\x{49C9}-\x{49CE}\x{49D0}-\x{49E8}' . +'\x{49EA}\x{49EC}\x{49EE}-\x{4A19}\x{4A1B}-\x{4A43}\x{4A45}-\x{4A4D}\x{4A4F}-\x{4A9E}' . +'\x{4AA0}-\x{4AA9}\x{4AAB}-\x{4B4E}\x{4B50}-\x{4B5B}\x{4B5D}-\x{4B69}\x{4B6B}-\x{4BC2}\x{4BC6}-\x{4BE8}' . +'\x{4BEA}-\x{4BFA}\x{4BFC}-\x{4C06}\x{4C08}-\x{4C2D}\x{4C2F}-\x{4C32}\x{4C34}-\x{4C35}\x{4C37}-\x{4C69}' . +'\x{4C6B}-\x{4C73}\x{4C75}-\x{4C86}\x{4C88}-\x{4C97}\x{4C99}-\x{4C9C}\x{4C9F}-\x{4CA3}\x{4CA5}-\x{4CB5}' . +'\x{4CB7}-\x{4CF8}\x{4CFA}-\x{4D27}\x{4D29}-\x{4DAC}\x{4DAE}-\x{4DB1}\x{4DB3}-\x{4DB5}\x{4E00}-\x{4E54}' . +'\x{4E56}-\x{4E89}\x{4E8B}-\x{4EEC}\x{4EEE}-\x{4FAC}\x{4FAE}-\x{503C}\x{503E}-\x{51E5}\x{51E7}-\x{5270}' . +'\x{5272}-\x{56A1}\x{56A3}-\x{5840}\x{5842}-\x{58B5}\x{58B7}-\x{58CB}\x{58CD}-\x{5BC8}\x{5BCA}-\x{5C01}' . +'\x{5C03}-\x{5C25}\x{5C27}-\x{5D5B}\x{5D5D}-\x{5F08}\x{5F0A}-\x{61F3}\x{61F5}-\x{63BA}\x{63BC}-\x{6441}' . +'\x{6443}-\x{657C}\x{657E}-\x{663E}\x{6640}-\x{66FC}\x{66FE}-\x{6728}\x{672A}-\x{6766}\x{6768}-\x{67A8}' . +'\x{67AA}-\x{685B}\x{685D}-\x{685E}\x{6860}-\x{68B9}\x{68BB}-\x{6AC8}\x{6ACA}-\x{6BB0}\x{6BB2}-\x{6C16}' . +'\x{6C18}-\x{6D9B}\x{6D9D}-\x{6E12}\x{6E14}-\x{6E8B}\x{6E8D}-\x{704D}\x{704F}-\x{7113}\x{7115}-\x{713B}' . +'\x{713D}-\x{7154}\x{7156}-\x{729F}\x{72A1}-\x{731E}\x{7320}-\x{7362}\x{7364}-\x{7533}\x{7535}-\x{7551}' . +'\x{7553}-\x{7572}\x{7574}-\x{75E8}\x{75EA}-\x{7679}\x{767B}-\x{783E}\x{7840}-\x{7A62}\x{7A64}-\x{7AC2}' . +'\x{7AC4}-\x{7B06}\x{7B08}-\x{7B79}\x{7B7B}-\x{7BCE}\x{7BD0}-\x{7D99}\x{7D9B}-\x{7E49}\x{7E4C}-\x{8132}' . +'\x{8134}\x{8136}-\x{81D2}\x{81D4}-\x{8216}\x{8218}-\x{822D}\x{822F}-\x{83B4}\x{83B6}-\x{841F}' . +'\x{8421}-\x{86CC}\x{86CE}-\x{874A}\x{874C}-\x{877E}\x{8780}-\x{8A32}\x{8A34}-\x{8B71}\x{8B73}-\x{8B8E}' . +'\x{8B90}-\x{8DE4}\x{8DE6}-\x{8E9A}\x{8E9C}-\x{8EE1}\x{8EE4}-\x{8F0B}\x{8F0D}-\x{8FB9}\x{8FBB}-\x{9038}' . +'\x{903A}-\x{9196}\x{9198}-\x{91A3}\x{91A5}-\x{91B7}\x{91B9}-\x{91C7}\x{91C9}-\x{91E0}\x{91E2}-\x{91FB}' . +'\x{91FD}-\x{922B}\x{922D}-\x{9270}\x{9272}-\x{9420}\x{9422}-\x{9664}\x{9666}-\x{9679}\x{967B}-\x{9770}' . +'\x{9772}-\x{982B}\x{982D}-\x{98ED}\x{98EF}-\x{99C4}\x{99C6}-\x{9A11}\x{9A14}-\x{9A27}\x{9A29}-\x{9D0D}' . +'\x{9D0F}-\x{9D2B}\x{9D2D}-\x{9D8E}\x{9D90}-\x{9DC5}\x{9DC7}-\x{9E77}\x{9E79}-\x{9EB8}\x{9EBB}-\x{9F20}' . +'\x{9F22}-\x{9F61}\x{9F63}-\x{9FA5}\x{FA28}]{1,20}$/iu', + 6 => '/^[\x{002d}0-9A-Za-z]{1,63}$/iu', + 7 => '/^[\x{00A1}-\x{00FF}]{1,63}$/iu', + 8 => '/^[\x{0100}-\x{017f}]{1,63}$/iu', + 9 => '/^[\x{0180}-\x{024f}]{1,63}$/iu', + 10 => '/^[\x{0250}-\x{02af}]{1,63}$/iu', + 11 => '/^[\x{02b0}-\x{02ff}]{1,63}$/iu', + 12 => '/^[\x{0300}-\x{036f}]{1,63}$/iu', + 13 => '/^[\x{0370}-\x{03ff}]{1,63}$/iu', + 14 => '/^[\x{0400}-\x{04ff}]{1,63}$/iu', + 15 => '/^[\x{0500}-\x{052f}]{1,63}$/iu', + 16 => '/^[\x{0530}-\x{058F}]{1,63}$/iu', + 17 => '/^[\x{0590}-\x{05FF}]{1,63}$/iu', + 18 => '/^[\x{0600}-\x{06FF}]{1,63}$/iu', + 19 => '/^[\x{0700}-\x{074F}]{1,63}$/iu', + 20 => '/^[\x{0780}-\x{07BF}]{1,63}$/iu', + 21 => '/^[\x{0900}-\x{097F}]{1,63}$/iu', + 22 => '/^[\x{0980}-\x{09FF}]{1,63}$/iu', + 23 => '/^[\x{0A00}-\x{0A7F}]{1,63}$/iu', + 24 => '/^[\x{0A80}-\x{0AFF}]{1,63}$/iu', + 25 => '/^[\x{0B00}-\x{0B7F}]{1,63}$/iu', + 26 => '/^[\x{0B80}-\x{0BFF}]{1,63}$/iu', + 27 => '/^[\x{0C00}-\x{0C7F}]{1,63}$/iu', + 28 => '/^[\x{0C80}-\x{0CFF}]{1,63}$/iu', + 29 => '/^[\x{0D00}-\x{0D7F}]{1,63}$/iu', + 30 => '/^[\x{0D80}-\x{0DFF}]{1,63}$/iu', + 31 => '/^[\x{0E00}-\x{0E7F}]{1,63}$/iu', + 32 => '/^[\x{0E80}-\x{0EFF}]{1,63}$/iu', + 33 => '/^[\x{0F00}-\x{0FFF}]{1,63}$/iu', + 34 => '/^[\x{1000}-\x{109F}]{1,63}$/iu', + 35 => '/^[\x{10A0}-\x{10FF}]{1,63}$/iu', + 36 => '/^[\x{1100}-\x{11FF}]{1,63}$/iu', + 37 => '/^[\x{1200}-\x{137F}]{1,63}$/iu', + 38 => '/^[\x{13A0}-\x{13FF}]{1,63}$/iu', + 39 => '/^[\x{1400}-\x{167F}]{1,63}$/iu', + 40 => '/^[\x{1680}-\x{169F}]{1,63}$/iu', + 41 => '/^[\x{16A0}-\x{16FF}]{1,63}$/iu', + 42 => '/^[\x{1700}-\x{171F}]{1,63}$/iu', + 43 => '/^[\x{1720}-\x{173F}]{1,63}$/iu', + 44 => '/^[\x{1740}-\x{175F}]{1,63}$/iu', + 45 => '/^[\x{1760}-\x{177F}]{1,63}$/iu', + 46 => '/^[\x{1780}-\x{17FF}]{1,63}$/iu', + 47 => '/^[\x{1800}-\x{18AF}]{1,63}$/iu', + 48 => '/^[\x{1E00}-\x{1EFF}]{1,63}$/iu', + 49 => '/^[\x{1F00}-\x{1FFF}]{1,63}$/iu', + 50 => '/^[\x{2070}-\x{209F}]{1,63}$/iu', + 51 => '/^[\x{2100}-\x{214F}]{1,63}$/iu', + 52 => '/^[\x{2150}-\x{218F}]{1,63}$/iu', + 53 => '/^[\x{2460}-\x{24FF}]{1,63}$/iu', + 54 => '/^[\x{2E80}-\x{2EFF}]{1,63}$/iu', + 55 => '/^[\x{2F00}-\x{2FDF}]{1,63}$/iu', + 56 => '/^[\x{2FF0}-\x{2FFF}]{1,63}$/iu', + 57 => '/^[\x{3040}-\x{309F}]{1,63}$/iu', + 58 => '/^[\x{30A0}-\x{30FF}]{1,63}$/iu', + 59 => '/^[\x{3100}-\x{312F}]{1,63}$/iu', + 60 => '/^[\x{3130}-\x{318F}]{1,63}$/iu', + 61 => '/^[\x{3190}-\x{319F}]{1,63}$/iu', + 62 => '/^[\x{31A0}-\x{31BF}]{1,63}$/iu', + 63 => '/^[\x{31F0}-\x{31FF}]{1,63}$/iu', + 64 => '/^[\x{3200}-\x{32FF}]{1,63}$/iu', + 65 => '/^[\x{3300}-\x{33FF}]{1,63}$/iu', + 66 => '/^[\x{3400}-\x{4DBF}]{1,63}$/iu', + 67 => '/^[\x{4E00}-\x{9FFF}]{1,63}$/iu', + 68 => '/^[\x{A000}-\x{A48F}]{1,63}$/iu', + 69 => '/^[\x{A490}-\x{A4CF}]{1,63}$/iu', + 70 => '/^[\x{AC00}-\x{D7AF}]{1,63}$/iu', + 71 => '/^[\x{D800}-\x{DB7F}]{1,63}$/iu', + 72 => '/^[\x{DC00}-\x{DFFF}]{1,63}$/iu', + 73 => '/^[\x{F900}-\x{FAFF}]{1,63}$/iu', + 74 => '/^[\x{FB00}-\x{FB4F}]{1,63}$/iu', + 75 => '/^[\x{FB50}-\x{FDFF}]{1,63}$/iu', + 76 => '/^[\x{FE20}-\x{FE2F}]{1,63}$/iu', + 77 => '/^[\x{FE70}-\x{FEFF}]{1,63}$/iu', + 78 => '/^[\x{FF00}-\x{FFEF}]{1,63}$/iu', + 79 => '/^[\x{20000}-\x{2A6DF}]{1,63}$/iu', + 80 => '/^[\x{2F800}-\x{2FA1F}]{1,63}$/iu', +); diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Jp.php b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Jp.php new file mode 100644 index 0000000000..f1cf75fb05 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Hostname/Jp.php @@ -0,0 +1,725 @@ + '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}' . + '\x{30A1}-\x{30F6}\x{30FC}' . + '\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . + '\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}' . + '\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}' . + '\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}' . + '\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}' . + '\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}' . + '\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}' . + '\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}' . + '\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}' . + '\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}' . + '\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}' . + '\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}' . + '\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}' . + '\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}' . + '\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}' . + '\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}' . + '\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}' . + '\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}' . + '\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}' . + '\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}' . + '\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}' . + '\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}' . + '\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}' . + '\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}' . + '\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}' . + '\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}' . + '\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}' . + '\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}' . + '\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}' . + '\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}' . + '\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}' . + '\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}' . + '\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}' . + '\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}' . + '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . + '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}' . + '\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}' . + '\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}' . + '\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}' . + '\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}' . + '\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}' . + '\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}' . + '\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}' . + '\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}' . + '\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}' . + '\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}' . + '\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}' . + '\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}' . + '\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}' . + '\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}' . + '\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}' . + '\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}' . + '\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}' . + '\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}' . + '\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}' . + '\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}' . + '\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}' . + '\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}' . + '\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}' . + '\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}' . + '\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}' . + '\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}' . + '\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}' . + '\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}' . + '\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}' . + '\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}' . + '\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}' . + '\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}' . + '\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}' . + '\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}' . + '\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}' . + '\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}' . + '\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}' . + '\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}' . + '\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}' . + '\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}' . + '\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}' . + '\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}' . + '\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}' . + '\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}' . + '\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}' . + '\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}' . + '\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}' . + '\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}' . + '\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}' . + '\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}' . + '\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}' . + '\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}' . + '\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}' . + '\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}' . + '\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}' . + '\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}' . + '\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}' . + '\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}' . + '\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}' . + '\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}' . + '\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}' . + '\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}' . + '\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}' . + '\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}' . + '\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}' . + '\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}' . + '\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}' . + '\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}' . + '\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}' . + '\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}' . + '\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}' . + '\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}' . + '\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}' . + '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}' . + '\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}' . + '\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}' . + '\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}' . + '\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}' . + '\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}' . + '\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}' . + '\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}' . + '\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}' . + '\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}' . + '\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}' . + '\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}' . + '\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}' . + '\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}' . + '\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}' . + '\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}' . + '\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}' . + '\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}' . + '\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}' . + '\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}' . + '\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}' . + '\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}' . + '\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}' . + '\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}' . + '\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}' . + '\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}' . + '\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}' . + '\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}' . + '\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}' . + '\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}' . + '\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}' . + '\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}' . + '\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}' . + '\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}' . + '\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}' . + '\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}' . + '\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}' . + '\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}' . + '\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}' . + '\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}' . + '\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}' . + '\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}' . + '\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}' . + '\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}' . + '\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}' . + '\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}' . + '\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}' . + '\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}' . + '\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}' . + '\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}' . + '\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}' . + '\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}' . + '\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}' . + '\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}' . + '\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}' . + '\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}' . + '\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}' . + '\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}' . + '\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}' . + '\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}' . + '\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}' . + '\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}' . + '\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}' . + '\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}' . + '\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}' . + '\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}' . + '\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}' . + '\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}' . + '\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}' . + '\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}' . + '\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}' . + '\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}' . + '\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}' . + '\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}' . + '\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}' . + '\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}' . + '\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}' . + '\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}' . + '\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}' . + '\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}' . + '\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}' . + '\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}' . + '\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}' . + '\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}' . + '\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}' . + '\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}' . + '\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}' . + '\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . + '\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}' . + '\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}' . + '\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}' . + '\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}' . + '\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}' . + '\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}' . + '\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}' . + '\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}' . + '\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}' . + '\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}' . + '\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}' . + '\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}' . + '\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}' . + '\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}' . + '\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}' . + '\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}' . + '\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}' . + '\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}' . + '\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}' . + '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}' . + '\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}' . + '\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}' . + '\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}' . + '\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}' . + '\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}' . + '\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}' . + '\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}' . + '\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}' . + '\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}' . + '\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}' . + '\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}' . + '\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}' . + '\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}' . + '\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}' . + '\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}' . + '\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}' . + '\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}' . + '\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}' . + '\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}' . + '\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}' . + '\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}' . + '\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}' . + '\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}' . + '\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}' . + '\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}' . + '\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}' . + '\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}' . + '\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}' . + '\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}' . + '\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}' . + '\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}' . + '\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}' . + '\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}' . + '\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}' . + '\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}' . + '\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . + '\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}' . + '\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}' . + '\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}' . + '\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}' . + '\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}' . + '\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}' . + '\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}' . + '\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}' . + '\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}' . + '\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}' . + '\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}' . + '\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}' . + '\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}' . + '\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}' . + '\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}' . + '\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}' . + '\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}' . + '\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}' . + '\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}' . + '\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}' . + '\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}' . + '\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}' . + '\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}' . + '\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}' . + '\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}' . + '\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}' . + '\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}' . + '\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}' . + '\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}' . + '\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}' . + '\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}' . + '\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}' . + '\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}' . + '\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}' . + '\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}' . + '\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}' . + '\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}' . + '\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}' . + '\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}' . + '\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}' . + '\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}' . + '\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}' . + '\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}' . + '\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}' . + '\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}' . + '\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}' . + '\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}' . + '\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}' . + '\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}' . + '\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}' . + '\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}' . + '\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}' . + '\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}' . + '\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}' . + '\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}' . + '\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}' . + '\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}' . + '\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}' . + '\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}' . + '\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}' . + '\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}' . + '\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}' . + '\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}' . + '\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}' . + '\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}' . + '\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}' . + '\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}' . + '\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}' . + '\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}' . + '\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}' . + '\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}' . + '\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}' . + '\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}' . + '\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}' . + '\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}' . + '\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}' . + '\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}' . + '\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}' . + '\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}' . + '\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}' . + '\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}' . + '\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}' . + '\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}' . + '\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}' . + '\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}' . + '\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}' . + '\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}' . + '\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}' . + '\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}' . + '\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}' . + '\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}' . + '\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}' . + '\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}' . + '\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}' . + '\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}' . + '\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}' . + '\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}' . + '\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}' . + '\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}' . + '\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}' . + '\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}' . + '\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}' . + '\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}' . + '\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}' . + '\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}' . + '\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}' . + '\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}' . + '\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}' . + '\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}' . + '\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}' . + '\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}' . + '\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}' . + '\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}' . + '\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}' . + '\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}' . + '\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}' . + '\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}' . + '\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}' . + '\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}' . + '\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}' . + '\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}' . + '\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}' . + '\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}' . + '\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}' . + '\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}' . + '\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}' . + '\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}' . + '\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}' . + '\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}' . + '\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}' . + '\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}' . + '\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}' . + '\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}' . + '\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}' . + '\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}' . + '\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}' . + '\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}' . + '\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}' . + '\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}' . + '\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}' . + '\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}' . + '\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}' . + '\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}' . + '\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}' . + '\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}' . + '\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}' . + '\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}' . + '\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}' . + '\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}' . + '\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}' . + '\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}' . + '\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}' . + '\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}' . + '\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}' . + '\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}' . + '\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}' . + '\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}' . + '\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . + '\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}' . + '\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}' . + '\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}' . + '\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}' . + '\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}' . + '\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}' . + '\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}' . + '\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}' . + '\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}' . + '\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}' . + '\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}' . + '\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}' . + '\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}' . + '\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}' . + '\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}' . + '\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}' . + '\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}' . + '\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}' . + '\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}' . + '\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}' . + '\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}' . + '\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}' . + '\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}' . + '\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}' . + '\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}' . + '\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}' . + '\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}' . + '\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}' . + '\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}' . + '\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}' . + '\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}' . + '\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}' . + '\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}' . + '\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}' . + '\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}' . + '\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}' . + '\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}' . + '\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}' . + '\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}' . + '\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}' . + '\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}' . + '\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}' . + '\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}' . + '\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}' . + '\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}' . + '\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}' . + '\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}' . + '\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}' . + '\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}' . + '\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}' . + '\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}' . + '\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}' . + '\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}' . + '\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}' . + '\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}' . + '\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}' . + '\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}' . + '\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}' . + '\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}' . + '\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}' . + '\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}' . + '\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}' . + '\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}' . + '\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}' . + '\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}' . + '\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}' . + '\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}' . + '\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}' . + '\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}' . + '\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}' . + '\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}' . + '\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}' . + '\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}' . + '\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}' . + '\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}' . + '\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}' . + '\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}' . + '\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}' . + '\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}' . + '\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}' . + '\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}' . + '\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}' . + '\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}' . + '\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}' . + '\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}' . + '\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}' . + '\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}' . + '\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}' . + '\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}' . + '\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}' . + '\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}' . + '\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}' . + '\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}' . + '\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}' . + '\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}' . + '\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}' . + '\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}' . + '\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}' . + '\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}' . + '\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}' . + '\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}' . + '\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}' . + '\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}' . + '\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}' . + '\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}' . + '\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}' . + '\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}' . + '\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}' . + '\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}' . + '\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}' . + '\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}' . + '\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}' . + '\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}' . + '\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}' . + '\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}' . + '\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}' . + '\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}' . + '\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}' . + '\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}' . + '\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}' . + '\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}' . + '\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}' . + '\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}' . + '\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}' . + '\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}' . + '\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}' . + '\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}' . + '\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}' . + '\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}' . + '\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}' . + '\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}' . + '\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}' . + '\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}' . + '\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}' . + '\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}' . + '\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}' . + '\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}' . + '\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}' . + '\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}' . + '\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}' . + '\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}' . + '\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}' . + '\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}' . + '\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}' . + '\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}' . + '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}' . + '\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}' . + '\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}' . + '\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}' . + '\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}' . + '\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}' . + '\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}' . + '\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}' . + '\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}' . + '\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}' . + '\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}' . + '\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}' . + '\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}' . + '\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}' . + '\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}' . + '\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}' . + '\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}' . + '\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}' . + '\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}' . + '\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}' . + '\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}' . + '\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}' . + '\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}' . + '\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}' . + '\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}' . + '\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}' . + '\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}' . + '\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}' . + '\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}' . + '\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}' . + '\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}' . + '\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}' . + '\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}' . + '\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}' . + '\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}' . + '\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}' . + '\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}' . + '\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}' . + '\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}' . + '\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}' . + '\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}' . + '\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}' . + '\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}' . + '\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}' . + '\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}' . + '\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}' . + '\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}' . + '\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}' . + '\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}' . + '\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}' . + '\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}' . + '\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}' . + '\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}' . + '\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}' . + '\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}' . + '\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}' . + '\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}' . + '\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}' . + '\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}' . + '\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}' . + '\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}' . + '\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}' . + '\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}' . + '\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}' . + '\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}' . + '\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}' . + '\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}' . + '\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}' . + '\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}' . + '\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}' . + '\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}' . + '\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}' . + '\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}' . + '\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}' . + '\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}' . + '\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}' . + '\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}' . + '\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}' . + '\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}' . + '\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}' . + '\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}' . + '\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}' . + '\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}' . + '\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}' . + '\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}' . + '\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}' . + '\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}' . + '\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}' . + '\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}' . + '\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}' . + '\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}' . + '\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}' . + '\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}' . + '\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}' . + '\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}' . + '\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}' . + '\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}' . + '\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}' . + '\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}' . + '\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}' . + '\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}' . + '\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}' . + '\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}' . + '\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}' . + '\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}' . + '\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}' . + '\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}' . + '\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}' . + '\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}' . + '\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}' . + '\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}' . + '\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}' . + '\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}' . + '\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}' . + '\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}' . + '\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}' . + '\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}' . + '\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}' . + '\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}' . + '\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}' . + '\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}' . + '\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}' . + '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}' . + '\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}' . + '\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}' . + '\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}' . + '\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}' . + '\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}' . + '\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}' . + '\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}' . + '\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}' . + '\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}' . + '\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}' . + '\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . + '\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}' . + '\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}' . + '\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}' . + '\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}' . + '\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}' . + '\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}' . + '\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}' . + '\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}' . + '\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}' . + '\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}' . + '\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}' . + '\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}' . + '\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}' . + '\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}' . + '\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}' . + '\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}' . + '\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu', +); diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Iban.php b/vendor/zendframework/zend-validator/Zend/Validator/Iban.php new file mode 100644 index 0000000000..6a96f74c0d --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Iban.php @@ -0,0 +1,273 @@ + "Unknown country within the IBAN", + self::SEPANOTSUPPORTED => "Countries outside the Single Euro Payments Area (SEPA) are not supported", + self::FALSEFORMAT => "The input has a false IBAN format", + self::CHECKFAILED => "The input has failed the IBAN check", + ); + + /** + * Optional country code by ISO 3166-1 + * + * @var string|null + */ + protected $countryCode; + + /** + * Optionally allow IBAN codes from non-SEPA countries. Defaults to true + * + * @var bool + */ + protected $allowNonSepa = true; + + /** + * The SEPA country codes + * + * @var array + */ + protected static $sepaCountries = array( + 'AT', 'BE', 'BG', 'CY', 'CZ', 'DK', 'FO', 'GL', 'EE', 'FI', 'FR', 'DE', + 'GI', 'GR', 'HU', 'IS', 'IE', 'IT', 'LV', 'LI', 'LT', 'LU', 'MT', 'MC', + 'NL', 'NO', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB' + ); + + /** + * IBAN regexes by country code + * + * @var array + */ + protected static $ibanRegex = array( + 'AD' => 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}', + 'AE' => 'AE[0-9]{2}[0-9]{3}[0-9]{16}', + 'AL' => 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}', + 'AT' => 'AT[0-9]{2}[0-9]{5}[0-9]{11}', + 'AZ' => 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}', + 'BA' => 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}', + 'BE' => 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}', + 'BG' => 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}', + 'BH' => 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}', + 'BR' => 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]', + 'CH' => 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}', + 'CR' => 'CR[0-9]{2}[0-9]{3}[0-9]{14}', + 'CY' => 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}', + 'CZ' => 'CZ[0-9]{2}[0-9]{20}', + 'DE' => 'DE[0-9]{2}[0-9]{8}[0-9]{10}', + 'DO' => 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}', + 'DK' => 'DK[0-9]{2}[0-9]{14}', + 'EE' => 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}', + 'ES' => 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}', + 'FI' => 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}', + 'FO' => 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', + 'FR' => 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', + 'GB' => 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', + 'GE' => 'GE[0-9]{2}[A-Z]{2}[0-9]{16}', + 'GI' => 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}', + 'GL' => 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', + 'GR' => 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}', + 'GT' => 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}', + 'HR' => 'HR[0-9]{2}[0-9]{7}[0-9]{10}', + 'HU' => 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}', + 'IE' => 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', + 'IL' => 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}', + 'IS' => 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}', + 'IT' => 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', + 'KW' => 'KW[0-9]{2}[A-Z]{4}[0-9]{22}', + 'KZ' => 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}', + 'LB' => 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}', + 'LI' => 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}', + 'LT' => 'LT[0-9]{2}[0-9]{5}[0-9]{11}', + 'LU' => 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}', + 'LV' => 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}', + 'MC' => 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', + 'MD' => 'MD[0-9]{2}[A-Z0-9]{20}', + 'ME' => 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', + 'MK' => 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}', + 'MR' => 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}', + 'MT' => 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}', + 'MU' => 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}', + 'NL' => 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', + 'NO' => 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}', + 'PK' => 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', + 'PL' => 'PL[0-9]{2}[0-9]{8}[0-9]{16}', + 'PS' => 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', + 'PT' => 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}', + 'RO' => 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', + 'RS' => 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', + 'SA' => 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}', + 'SE' => 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}', + 'SI' => 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}', + 'SK' => 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}', + 'SM' => 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', + 'TN' => 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', + 'TR' => 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}', + 'VG' => 'VG[0-9]{2}[A-Z]{4}[0-9]{16}', + ); + + /** + * Sets validator options + * + * @param array|Traversable $options OPTIONAL + */ + public function __construct($options = array()) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (array_key_exists('country_code', $options)) { + $this->setCountryCode($options['country_code']); + } + + if (array_key_exists('allow_non_sepa', $options)) { + $this->setAllowNonSepa($options['allow_non_sepa']); + } + + parent::__construct($options); + } + + /** + * Returns the optional country code by ISO 3166-1 + * + * @return string|null + */ + public function getCountryCode() + { + return $this->countryCode; + } + + /** + * Sets an optional country code by ISO 3166-1 + * + * @param string|null $countryCode + * @return Iban provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setCountryCode($countryCode = null) + { + if ($countryCode !== null) { + $countryCode = (string) $countryCode; + + if (!isset(static::$ibanRegex[$countryCode])) { + throw new Exception\InvalidArgumentException( + "Country code '{$countryCode}' invalid by ISO 3166-1 or not supported" + ); + } + } + + $this->countryCode = $countryCode; + return $this; + } + + /** + * Returns the optional allow non-sepa countries setting + * + * @return bool + */ + public function allowNonSepa() + { + return $this->allowNonSepa; + } + + /** + * Sets the optional allow non-sepa countries setting + * + * @param bool $allowNonSepa + * @return Iban provides a fluent interface + */ + public function setAllowNonSepa($allowNonSepa) + { + $this->allowNonSepa = (bool) $allowNonSepa; + return $this; + } + + /** + * Returns true if $value is a valid IBAN + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::FALSEFORMAT); + return false; + } + + $value = str_replace(' ', '', strtoupper($value)); + $this->setValue($value); + + $countryCode = $this->getCountryCode(); + if ($countryCode === null) { + $countryCode = substr($value, 0, 2); + } + + if (!array_key_exists($countryCode, static::$ibanRegex)) { + $this->setValue($countryCode); + $this->error(self::NOTSUPPORTED); + return false; + } + + if (!$this->allowNonSepa && !in_array($countryCode, static::$sepaCountries)) { + $this->setValue($countryCode); + $this->error(self::SEPANOTSUPPORTED); + return false; + } + + if (!preg_match('/^' . static::$ibanRegex[$countryCode] . '$/', $value)) { + $this->error(self::FALSEFORMAT); + return false; + } + + $format = substr($value, 4) . substr($value, 0, 4); + $format = str_replace( + array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), + array('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'), + $format + ); + + $temp = intval(substr($format, 0, 1)); + $len = strlen($format); + for ($x = 1; $x < $len; ++$x) { + $temp *= 10; + $temp += intval(substr($format, $x, 1)); + $temp %= 97; + } + + if ($temp != 1) { + $this->error(self::CHECKFAILED); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Identical.php b/vendor/zendframework/zend-validator/Zend/Validator/Identical.php new file mode 100644 index 0000000000..25927163be --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Identical.php @@ -0,0 +1,193 @@ + "The two given tokens do not match", + self::MISSING_TOKEN => 'No token was provided to match against', + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'token' => 'tokenString' + ); + + /** + * Original token against which to validate + * @var string + */ + protected $tokenString; + protected $token; + protected $strict = true; + protected $literal = false; + + /** + * Sets validator options + * + * @param mixed $token + */ + public function __construct($token = null) + { + if ($token instanceof Traversable) { + $token = ArrayUtils::iteratorToArray($token); + } + + if (is_array($token) && array_key_exists('token', $token)) { + if (array_key_exists('strict', $token)) { + $this->setStrict($token['strict']); + } + + if (array_key_exists('literal', $token)) { + $this->setLiteral($token['literal']); + } + + $this->setToken($token['token']); + } elseif (null !== $token) { + $this->setToken($token); + } + + parent::__construct(is_array($token) ? $token : null); + } + + /** + * Retrieve token + * + * @return mixed + */ + public function getToken() + { + return $this->token; + } + + /** + * Set token against which to compare + * + * @param mixed $token + * @return Identical + */ + public function setToken($token) + { + $this->tokenString = (is_array($token) ? var_export($token, true) : (string) $token); + $this->token = $token; + return $this; + } + + /** + * Returns the strict parameter + * + * @return bool + */ + public function getStrict() + { + return $this->strict; + } + + /** + * Sets the strict parameter + * + * @param bool $strict + * @return Identical + */ + public function setStrict($strict) + { + $this->strict = (bool) $strict; + return $this; + } + + /** + * Returns the literal parameter + * + * @return bool + */ + public function getLiteral() + { + return $this->literal; + } + + /** + * Sets the literal parameter + * + * @param bool $literal + * @return Identical + */ + public function setLiteral($literal) + { + $this->literal = (bool) $literal; + return $this; + } + + /** + * Returns true if and only if a token has been set and the provided value + * matches that token. + * + * @param mixed $value + * @param array $context + * @return bool + * @throws Exception\RuntimeException if the token doesn't exist in the context array + */ + public function isValid($value, array $context = null) + { + $this->setValue($value); + + $token = $this->getToken(); + + if (!$this->getLiteral() && $context !== null) { + if (is_array($token)) { + while (is_array($token)) { + $key = key($token); + if (!isset($context[$key])) { + break; + } + $context = $context[$key]; + $token = $token[$key]; + } + } + + // if $token is an array it means the above loop didn't went all the way down to the leaf, + // so the $token structure doesn't match the $context structure + if (is_array($token) || !isset($context[$token])) { + $token = $this->getToken(); + } else { + $token = $context[$token]; + } + } + + if ($token === null) { + $this->error(self::MISSING_TOKEN); + return false; + } + + $strict = $this->getStrict(); + if (($strict && ($value !== $token)) || (!$strict && ($value != $token))) { + $this->error(self::NOT_SAME); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/InArray.php b/vendor/zendframework/zend-validator/Zend/Validator/InArray.php new file mode 100644 index 0000000000..6c34210e69 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/InArray.php @@ -0,0 +1,234 @@ + 'The input was not found in the haystack', + ); + + /** + * Haystack of possible values + * + * @var array + */ + protected $haystack; + + /** + * Type of strict check to be used. Due to "foo" == 0 === TRUE with in_array when strict = false, + * an option has been added to prevent this. When $strict = 0/false, the most + * secure non-strict check is implemented. if $strict = -1, the default in_array non-strict + * behaviour is used + * + * @var int + */ + protected $strict = self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY; + + /** + * Whether a recursive search should be done + * + * @var bool + */ + protected $recursive = false; + + /** + * Returns the haystack option + * + * @return mixed + * @throws Exception\RuntimeException if haystack option is not set + */ + public function getHaystack() + { + if ($this->haystack === null) { + throw new Exception\RuntimeException('haystack option is mandatory'); + } + return $this->haystack; + } + + /** + * Sets the haystack option + * + * @param mixed $haystack + * @return InArray Provides a fluent interface + */ + public function setHaystack(array $haystack) + { + $this->haystack = $haystack; + return $this; + } + + /** + * Returns the strict option + * + * @return bool|int + */ + public function getStrict() + { + // To keep BC with new strict modes + if ($this->strict == self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY + || $this->strict == self::COMPARE_STRICT + ) { + return (bool) $this->strict; + } + return $this->strict; + } + + /** + * Sets the strict option mode + * InArray::CHECK_STRICT | InArray::CHECK_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY | InArray::CHECK_NOT_STRICT + * + * @param int $strict + * @return InArray Provides a fluent interface + * @throws Exception\InvalidArgumentException + */ + public function setStrict($strict) + { + $checkTypes = array( + self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY, // 0 + self::COMPARE_STRICT, // 1 + self::COMPARE_NOT_STRICT // -1 + ); + + // validate strict value + if (!in_array($strict, $checkTypes)) { + throw new Exception\InvalidArgumentException('Strict option must be one of the COMPARE_ constants'); + } + + $this->strict = $strict; + return $this; + } + + /** + * Returns the recursive option + * + * @return bool + */ + public function getRecursive() + { + return $this->recursive; + } + + /** + * Sets the recursive option + * + * @param bool $recursive + * @return InArray Provides a fluent interface + */ + public function setRecursive($recursive) + { + $this->recursive = (bool) $recursive; + return $this; + } + + /** + * Returns true if and only if $value is contained in the haystack option. If the strict + * option is true, then the type of $value is also checked. + * + * @param mixed $value + * See {@link http://php.net/manual/function.in-array.php#104501} + * @return bool + */ + public function isValid($value) + { + // we create a copy of the haystack in case we need to modify it + $haystack = $this->getHaystack(); + + // if the input is a string or float, and vulnerability protection is on + // we type cast the input to a string + if (self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY == $this->strict + && (is_int($value) || is_float($value))) { + $value = (string) $value; + } + + $this->setValue($value); + + if ($this->getRecursive()) { + $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack)); + foreach ($iterator as $element) { + if (self::COMPARE_STRICT == $this->strict) { + + if ($element === $value) { + return true; + } + + } else { + + // add protection to prevent string to int vuln's + $el = $element; + if (self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY == $this->strict + && is_string($value) && (is_int($el) || is_float($el)) + ) { + $el = (string) $el; + } + + if ($el == $value) { + return true; + } + + } + } + } else { + + /** + * If the check is not strict, then, to prevent "asdf" being converted to 0 + * and returning a false positive if 0 is in haystack, we type cast + * the haystack to strings. To prevent "56asdf" == 56 === TRUE we also + * type cast values like 56 to strings as well. + * + * This occurs only if the input is a string and a haystack member is an int + */ + if (self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY == $this->strict + && is_string($value) + ) { + foreach ($haystack as &$h) { + if (is_int($h) || is_float($h)) { + $h = (string) $h; + } + } + } + + if (in_array($value, $haystack, $this->strict == self::COMPARE_STRICT ? true : false)) { + return true; + } + } + + $this->error(self::NOT_IN_ARRAY); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Ip.php b/vendor/zendframework/zend-validator/Zend/Validator/Ip.php new file mode 100644 index 0000000000..10ecf5f92e --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Ip.php @@ -0,0 +1,189 @@ + 'Invalid type given. String expected', + self::NOT_IP_ADDRESS => "The input does not appear to be a valid IP address", + ); + + /** + * Internal options + * + * @var array + */ + protected $options = array( + 'allowipv4' => true, // Enable IPv4 Validation + 'allowipv6' => true, // Enable IPv6 Validation + 'allowipvfuture' => false, // Enable IPvFuture Validation + 'allowliteral' => true, // Enable IPs in literal format (only IPv6 and IPvFuture) + ); + + /** + * Sets the options for this validator + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException If there is any kind of IP allowed or $options is not an array or Traversable. + * @return AbstractValidator + */ + public function setOptions($options = array()) + { + parent::setOptions($options); + + if (!$this->options['allowipv4'] && !$this->options['allowipv6'] && !$this->options['allowipvfuture']) { + throw new Exception\InvalidArgumentException('Nothing to validate. Check your options'); + } + + return $this; + } + + /** + * Returns true if and only if $value is a valid IP address + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + if ($this->options['allowipv4'] && $this->validateIPv4($value)) { + return true; + } else { + if ((bool) $this->options['allowliteral']) { + static $regex = '/^\[(.*)\]$/'; + if ((bool) preg_match($regex, $value, $matches)) { + $value = $matches[1]; + } + } + + if (($this->options['allowipv6'] && $this->validateIPv6($value)) || + ($this->options['allowipvfuture'] && $this->validateIPvFuture($value)) + ) { + return true; + } + } + $this->error(self::NOT_IP_ADDRESS); + return false; + } + + /** + * Validates an IPv4 address + * + * @param string $value + * @return bool + */ + protected function validateIPv4($value) + { + if (preg_match('/^([01]{8}.){3}[01]{8}$/i', $value)) { + // binary format 00000000.00000000.00000000.00000000 + $value = bindec(substr($value, 0, 8)) . '.' . bindec(substr($value, 9, 8)) . '.' + . bindec(substr($value, 18, 8)) . '.' . bindec(substr($value, 27, 8)); + } elseif (preg_match('/^([0-9]{3}.){3}[0-9]{3}$/i', $value)) { + // octet format 777.777.777.777 + $value = (int) substr($value, 0, 3) . '.' . (int) substr($value, 4, 3) . '.' + . (int) substr($value, 8, 3) . '.' . (int) substr($value, 12, 3); + } elseif (preg_match('/^([0-9a-f]{2}.){3}[0-9a-f]{2}$/i', $value)) { + // hex format ff.ff.ff.ff + $value = hexdec(substr($value, 0, 2)) . '.' . hexdec(substr($value, 3, 2)) . '.' + . hexdec(substr($value, 6, 2)) . '.' . hexdec(substr($value, 9, 2)); + } + + $ip2long = ip2long($value); + if ($ip2long === false) { + return false; + } + + return ($value == long2ip($ip2long)); + } + + /** + * Validates an IPv6 address + * + * @param string $value Value to check against + * @return bool True when $value is a valid ipv6 address + * False otherwise + */ + protected function validateIPv6($value) + { + if (strlen($value) < 3) { + return $value == '::'; + } + + if (strpos($value, '.')) { + $lastcolon = strrpos($value, ':'); + if (!($lastcolon && $this->validateIPv4(substr($value, $lastcolon + 1)))) { + return false; + } + + $value = substr($value, 0, $lastcolon) . ':0:0'; + } + + if (strpos($value, '::') === false) { + return preg_match('/\A(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}\z/i', $value); + } + + $colonCount = substr_count($value, ':'); + if ($colonCount < 8) { + return preg_match('/\A(?::|(?:[a-f0-9]{1,4}:)+):(?:(?:[a-f0-9]{1,4}:)*[a-f0-9]{1,4})?\z/i', $value); + } + + // special case with ending or starting double colon + if ($colonCount == 8) { + return preg_match('/\A(?:::)?(?:[a-f0-9]{1,4}:){6}[a-f0-9]{1,4}(?:::)?\z/i', $value); + } + + return false; + } + + /** + * Validates an IPvFuture address. + * + * IPvFuture is loosely defined in the Section 3.2.2 of RFC 3986 + * + * @param string $value Value to check against + * @return bool True when $value is a valid IPvFuture address + * False otherwise + */ + protected function validateIPvFuture($value) + { + /* + * ABNF: + * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," + * / ";" / "=" + */ + static $regex = '/^v([[:xdigit:]]+)\.[[:alnum:]\-\._~!\$&\'\(\)\*\+,;=:]+$/'; + + $result = (bool) preg_match($regex, $value, $matches); + + /* + * "As such, implementations must not provide the version flag for the + * existing IPv4 and IPv6 literal address forms described below." + */ + return ($result && $matches[1] != 4 && $matches[1] != 6); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/IsInstanceOf.php b/vendor/zendframework/zend-validator/Zend/Validator/IsInstanceOf.php new file mode 100644 index 0000000000..89219e50c4 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/IsInstanceOf.php @@ -0,0 +1,107 @@ + "The input is not an instance of '%className%'", + ); + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = array( + 'className' => 'className' + ); + + /** + * Class name + * + * @var string + */ + protected $className; + + /** + * Sets validator options + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } + + // If argument is not an array, consider first argument as class name + if (!is_array($options)) { + $options = func_get_args(); + + $tmpOptions = array(); + $tmpOptions['className'] = array_shift($options); + + $options = $tmpOptions; + } + + if (!array_key_exists('className', $options)) { + throw new Exception\InvalidArgumentException('Missing option "className"'); + } + + parent::__construct($options); + } + + /** + * Get class name + * + * @return string + */ + public function getClassName() + { + return $this->className; + } + + /** + * Set class name + * + * @param string $className + * @return self + */ + public function setClassName($className) + { + $this->className = $className; + return $this; + } + + /** + * Returns true if $value is instance of $this->className + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if ($value instanceof $this->className) { + return true; + } + $this->error(self::NOT_INSTANCE_OF); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Isbn.php b/vendor/zendframework/zend-validator/Zend/Validator/Isbn.php new file mode 100644 index 0000000000..966153754a --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Isbn.php @@ -0,0 +1,208 @@ + "Invalid type given. String or integer expected", + self::NO_ISBN => "The input is not a valid ISBN number", + ); + + protected $options = array( + 'type' => self::AUTO, // Allowed type + 'separator' => '', // Separator character + ); + + /** + * Detect input format. + * + * @return string + */ + protected function detectFormat() + { + // prepare separator and pattern list + $sep = quotemeta($this->getSeparator()); + $patterns = array(); + $lengths = array(); + $type = $this->getType(); + + // check for ISBN-10 + if ($type == self::ISBN10 || $type == self::AUTO) { + if (empty($sep)) { + $pattern = '/^[0-9]{9}[0-9X]{1}$/'; + $length = 10; + } else { + $pattern = "/^[0-9]{1,7}[{$sep}]{1}[0-9]{1,7}[{$sep}]{1}[0-9]{1,7}[{$sep}]{1}[0-9X]{1}$/"; + $length = 13; + } + + $patterns[$pattern] = self::ISBN10; + $lengths[$pattern] = $length; + } + + // check for ISBN-13 + if ($type == self::ISBN13 || $type == self::AUTO) { + if (empty($sep)) { + $pattern = '/^[0-9]{13}$/'; + $length = 13; + } else { + $pattern = "/^[0-9]{1,9}[{$sep}]{1}[0-9]{1,5}[{$sep}]{1}[0-9]{1,9}[{$sep}]{1}[0-9]{1,9}[{$sep}]{1}[0-9]{1}$/"; + $length = 17; + } + + $patterns[$pattern] = self::ISBN13; + $lengths[$pattern] = $length; + } + + // check pattern list + foreach ($patterns as $pattern => $type) { + if ((strlen($this->getValue()) == $lengths[$pattern]) && preg_match($pattern, $this->getValue())) { + return $type; + } + } + + return null; + } + + /** + * Returns true if and only if $value is a valid ISBN. + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value)) { + $this->error(self::INVALID); + return false; + } + + $value = (string) $value; + $this->setValue($value); + + switch ($this->detectFormat()) { + case self::ISBN10: + // sum + $isbn10 = str_replace($this->getSeparator(), '', $value); + $sum = 0; + for ($i = 0; $i < 9; $i++) { + $sum += (10 - $i) * $isbn10{$i}; + } + + // checksum + $checksum = 11 - ($sum % 11); + if ($checksum == 11) { + $checksum = '0'; + } elseif ($checksum == 10) { + $checksum = 'X'; + } + break; + + case self::ISBN13: + // sum + $isbn13 = str_replace($this->getSeparator(), '', $value); + $sum = 0; + for ($i = 0; $i < 12; $i++) { + if ($i % 2 == 0) { + $sum += $isbn13{$i}; + } else { + $sum += 3 * $isbn13{$i}; + } + } + // checksum + $checksum = 10 - ($sum % 10); + if ($checksum == 10) { + $checksum = '0'; + } + break; + + default: + $this->error(self::NO_ISBN); + return false; + } + + // validate + if (substr($this->getValue(), -1) != $checksum) { + $this->error(self::NO_ISBN); + return false; + } + return true; + } + + /** + * Set separator characters. + * + * It is allowed only empty string, hyphen and space. + * + * @param string $separator + * @throws Exception\InvalidArgumentException When $separator is not valid + * @return Isbn Provides a fluent interface + */ + public function setSeparator($separator) + { + // check separator + if (!in_array($separator, array('-', ' ', ''))) { + throw new Exception\InvalidArgumentException('Invalid ISBN separator.'); + } + + $this->options['separator'] = $separator; + return $this; + } + + /** + * Get separator characters. + * + * @return string + */ + public function getSeparator() + { + return $this->options['separator']; + } + + /** + * Set allowed ISBN type. + * + * @param string $type + * @throws Exception\InvalidArgumentException When $type is not valid + * @return Isbn Provides a fluent interface + */ + public function setType($type) + { + // check type + if (!in_array($type, array(self::AUTO, self::ISBN10, self::ISBN13))) { + throw new Exception\InvalidArgumentException('Invalid ISBN type'); + } + + $this->options['type'] = $type; + return $this; + } + + /** + * Get allowed ISBN type. + * + * @return string + */ + public function getType() + { + return $this->options['type']; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/LessThan.php b/vendor/zendframework/zend-validator/Zend/Validator/LessThan.php new file mode 100644 index 0000000000..7925fd8e1b --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/LessThan.php @@ -0,0 +1,161 @@ + "The input is not less than '%max%'", + self::NOT_LESS_INCLUSIVE => "The input is not less or equal than '%max%'" + ); + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $messageVariables = array( + 'max' => 'max' + ); + + /** + * Maximum value + * + * @var mixed + */ + protected $max; + + /** + * Whether to do inclusive comparisons, allowing equivalence to max + * + * If false, then strict comparisons are done, and the value may equal + * the max option + * + * @var bool + */ + protected $inclusive; + + /** + * Sets validator options + * + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + */ + public function __construct($options = null) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + if (!is_array($options)) { + $options = func_get_args(); + $temp['max'] = array_shift($options); + + if (!empty($options)) { + $temp['inclusive'] = array_shift($options); + } + + $options = $temp; + } + + if (!array_key_exists('max', $options)) { + throw new Exception\InvalidArgumentException("Missing option 'max'"); + } + + if (!array_key_exists('inclusive', $options)) { + $options['inclusive'] = false; + } + + $this->setMax($options['max']) + ->setInclusive($options['inclusive']); + + parent::__construct($options); + } + + /** + * Returns the max option + * + * @return mixed + */ + public function getMax() + { + return $this->max; + } + + /** + * Sets the max option + * + * @param mixed $max + * @return LessThan Provides a fluent interface + */ + public function setMax($max) + { + $this->max = $max; + return $this; + } + + /** + * Returns the inclusive option + * + * @return bool + */ + public function getInclusive() + { + return $this->inclusive; + } + + /** + * Sets the inclusive option + * + * @param bool $inclusive + * @return LessThan Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->inclusive = $inclusive; + return $this; + } + + /** + * Returns true if and only if $value is less than max option, inclusively + * when the inclusive option is true + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->setValue($value); + + if ($this->inclusive) { + if ($value > $this->max) { + $this->error(self::NOT_LESS_INCLUSIVE); + return false; + } + } else { + if ($value >= $this->max) { + $this->error(self::NOT_LESS); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/NotEmpty.php b/vendor/zendframework/zend-validator/Zend/Validator/NotEmpty.php new file mode 100644 index 0000000000..52a23f59da --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/NotEmpty.php @@ -0,0 +1,302 @@ + 'boolean', + self::INTEGER => 'integer', + self::FLOAT => 'float', + self::STRING => 'string', + self::ZERO => 'zero', + self::EMPTY_ARRAY => 'array', + self::NULL => 'null', + self::PHP => 'php', + self::SPACE => 'space', + self::OBJECT => 'object', + self::OBJECT_STRING => 'objectstring', + self::OBJECT_COUNT => 'objectcount', + self::ALL => 'all', + ); + + /** + * Default value for types; value = 493 + * + * @var array + */ + protected $defaultType = array( + self::OBJECT, + self::SPACE, + self::NULL, + self::EMPTY_ARRAY, + self::STRING, + self::FLOAT, + self::BOOLEAN + ); + + /** + * @var array + */ + protected $messageTemplates = array( + self::IS_EMPTY => "Value is required and can't be empty", + self::INVALID => "Invalid type given. String, integer, float, boolean or array expected", + ); + + /** + * Options for this validator + * + * @var array + */ + protected $options = array(); + + /** + * Constructor + * + * @param array|Traversable|int $options OPTIONAL + */ + public function __construct($options = null) + { + $this->setType($this->defaultType); + + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (!is_array($options)) { + $options = func_get_args(); + $temp = array(); + if (!empty($options)) { + $temp['type'] = array_shift($options); + } + + $options = $temp; + } + + if (is_array($options)) { + if (!array_key_exists('type', $options)) { + $detected = 0; + $found = false; + foreach ($options as $option) { + if (in_array($option, $this->constants, true)) { + $found = true; + $detected += array_search($option, $this->constants); + } + } + + if ($found) { + $options['type'] = $detected; + } + } + } + + parent::__construct($options); + } + + /** + * Returns the set types + * + * @return array + */ + public function getType() + { + return $this->options['type']; + } + + /** + * @return int + */ + public function getDefaultType() + { + return $this->calculateTypeValue($this->defaultType); + } + + /** + * @param array|int|string $type + * @return int + */ + protected function calculateTypeValue($type) + { + if (is_array($type)) { + $detected = 0; + foreach ($type as $value) { + if (is_int($value)) { + $detected |= $value; + } elseif (in_array($value, $this->constants)) { + $detected |= array_search($value, $this->constants); + } + } + + $type = $detected; + } elseif (is_string($type) && in_array($type, $this->constants)) { + $type = array_search($type, $this->constants); + } + + return $type; + } + + /** + * Set the types + * + * @param int|array $type + * @throws Exception\InvalidArgumentException + * @return NotEmpty + */ + public function setType($type = null) + { + $type = $this->calculateTypeValue($type); + + if (!is_int($type) || ($type < 0) || ($type > self::ALL)) { + throw new Exception\InvalidArgumentException('Unknown type'); + } + + $this->options['type'] = $type; + + return $this; + } + + /** + * Returns true if and only if $value is not an empty value. + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if ($value !== null && !is_string($value) && !is_int($value) && !is_float($value) && + !is_bool($value) && !is_array($value) && !is_object($value) + ) { + $this->error(self::INVALID); + return false; + } + + $type = $this->getType(); + $this->setValue($value); + $object = false; + + // OBJECT_COUNT (countable object) + if ($type & self::OBJECT_COUNT) { + $object = true; + + if (is_object($value) && ($value instanceof \Countable) && (count($value) == 0)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // OBJECT_STRING (object's toString) + if ($type & self::OBJECT_STRING) { + $object = true; + + if ((is_object($value) && (!method_exists($value, '__toString'))) || + (is_object($value) && (method_exists($value, '__toString')) && (((string) $value) == ""))) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // OBJECT (object) + if ($type & self::OBJECT) { + // fall trough, objects are always not empty + } elseif ($object === false) { + // object not allowed but object given -> return false + if (is_object($value)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // SPACE (' ') + if ($type & self::SPACE) { + if (is_string($value) && (preg_match('/^\s+$/s', $value))) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // NULL (null) + if ($type & self::NULL) { + if ($value === null) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // EMPTY_ARRAY (array()) + if ($type & self::EMPTY_ARRAY) { + if (is_array($value) && ($value == array())) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // ZERO ('0') + if ($type & self::ZERO) { + if (is_string($value) && ($value == '0')) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // STRING ('') + if ($type & self::STRING) { + if (is_string($value) && ($value == '')) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // FLOAT (0.0) + if ($type & self::FLOAT) { + if (is_float($value) && ($value == 0.0)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // INTEGER (0) + if ($type & self::INTEGER) { + if (is_int($value) && ($value == 0)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + // BOOLEAN (false) + if ($type & self::BOOLEAN) { + if (is_bool($value) && ($value == false)) { + $this->error(self::IS_EMPTY); + return false; + } + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/README.md b/vendor/zendframework/zend-validator/Zend/Validator/README.md new file mode 100644 index 0000000000..a402c2e366 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/README.md @@ -0,0 +1,15 @@ +Validator Component from ZF2 +============================ + +This is the Validator component for ZF2. + +- File issues at https://github.com/zendframework/zf2/issues +- Create pull requests against https://github.com/zendframework/zf2 +- Documentation is at http://framework.zend.com/docs + +LICENSE +------- + +The files in this archive are released under the [Zend Framework +license](http://framework.zend.com/license), which is a 3-clause BSD license. + diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Regex.php b/vendor/zendframework/zend-validator/Zend/Validator/Regex.php new file mode 100644 index 0000000000..af14aac65e --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Regex.php @@ -0,0 +1,137 @@ + "Invalid type given. String, integer or float expected", + self::NOT_MATCH => "The input does not match against pattern '%pattern%'", + self::ERROROUS => "There was an internal error while using the pattern '%pattern%'", + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'pattern' => 'pattern' + ); + + /** + * Regular expression pattern + * + * @var string + */ + protected $pattern; + + /** + * Sets validator options + * + * @param string|Traversable $pattern + * @throws Exception\InvalidArgumentException On missing 'pattern' parameter + */ + public function __construct($pattern) + { + if (is_string($pattern)) { + $this->setPattern($pattern); + parent::__construct(array()); + return; + } + + if ($pattern instanceof Traversable) { + $pattern = ArrayUtils::iteratorToArray($pattern); + } + + if (!is_array($pattern)) { + throw new Exception\InvalidArgumentException('Invalid options provided to constructor'); + } + + if (!array_key_exists('pattern', $pattern)) { + throw new Exception\InvalidArgumentException("Missing option 'pattern'"); + } + + $this->setPattern($pattern['pattern']); + unset($pattern['pattern']); + parent::__construct($pattern); + } + + /** + * Returns the pattern option + * + * @return string + */ + public function getPattern() + { + return $this->pattern; + } + + /** + * Sets the pattern option + * + * @param string $pattern + * @throws Exception\InvalidArgumentException if there is a fatal error in pattern matching + * @return Regex Provides a fluent interface + */ + public function setPattern($pattern) + { + ErrorHandler::start(); + $this->pattern = (string) $pattern; + $status = preg_match($this->pattern, "Test"); + $error = ErrorHandler::stop(); + + if (false === $status) { + throw new Exception\InvalidArgumentException("Internal error parsing the pattern '{$this->pattern}'", 0, $error); + } + + return $this; + } + + /** + * Returns true if and only if $value matches against the pattern option + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + ErrorHandler::start(); + $status = preg_match($this->pattern, $value); + ErrorHandler::stop(); + if (false === $status) { + $this->error(self::ERROROUS); + return false; + } + + if (!$status) { + $this->error(self::NOT_MATCH); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Changefreq.php b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Changefreq.php new file mode 100644 index 0000000000..a959b023d3 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Changefreq.php @@ -0,0 +1,75 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + */ +class Changefreq extends AbstractValidator +{ + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'sitemapChangefreqNotValid'; + const INVALID = 'sitemapChangefreqInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = array( + self::NOT_VALID => "The input is not a valid sitemap changefreq", + self::INVALID => "Invalid type given. String expected", + ); + + /** + * Valid change frequencies + * + * @var array + */ + protected $changeFreqs = array( + 'always', 'hourly', 'daily', 'weekly', + 'monthly', 'yearly', 'never' + ); + + /** + * Validates if a string is valid as a sitemap changefreq + * + * @link http://www.sitemaps.org/protocol.php#changefreqdef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + if (!is_string($value)) { + return false; + } + + if (!in_array($value, $this->changeFreqs, true)) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Lastmod.php b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Lastmod.php new file mode 100644 index 0000000000..ace679fdc2 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Lastmod.php @@ -0,0 +1,71 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + */ +class Lastmod extends AbstractValidator +{ + /** + * Regular expression to use when validating + * + */ + const LASTMOD_REGEX = '/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9])(:[0-5][0-9])?(\\+|-)([0-1][0-9]|2[0-3]):[0-5][0-9])?$/'; + + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'sitemapLastmodNotValid'; + const INVALID = 'sitemapLastmodInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = array( + self::NOT_VALID => "The input is not a valid sitemap lastmod", + self::INVALID => "Invalid type given. String expected", + ); + + /** + * Validates if a string is valid as a sitemap lastmod + * + * @link http://www.sitemaps.org/protocol.php#lastmoddef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + ErrorHandler::start(); + $result = preg_match(self::LASTMOD_REGEX, $value); + ErrorHandler::stop(); + if ($result != 1) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Loc.php b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Loc.php new file mode 100644 index 0000000000..481b286e99 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Loc.php @@ -0,0 +1,65 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @see Zend\Uri\Uri + */ +class Loc extends AbstractValidator +{ + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'sitemapLocNotValid'; + const INVALID = 'sitemapLocInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = array( + self::NOT_VALID => "The input is not a valid sitemap location", + self::INVALID => "Invalid type given. String expected", + ); + + /** + * Validates if a string is valid as a sitemap location + * + * @link http://www.sitemaps.org/protocol.php#locdef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + $uri = Uri\UriFactory::factory($value); + if (!$uri->isValid()) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Priority.php b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Priority.php new file mode 100644 index 0000000000..d5313f3746 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Sitemap/Priority.php @@ -0,0 +1,62 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + */ +class Priority extends AbstractValidator +{ + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'sitemapPriorityNotValid'; + const INVALID = 'sitemapPriorityInvalid'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $messageTemplates = array( + self::NOT_VALID => "The input is not a valid sitemap priority", + self::INVALID => "Invalid type given. Numeric string, integer or float expected", + ); + + /** + * Validates if a string is valid as a sitemap priority + * + * @link http://www.sitemaps.org/protocol.php#prioritydef + * + * @param string $value value to validate + * @return bool + */ + public function isValid($value) + { + if (!is_numeric($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + $value = (float) $value; + if ($value < 0 || $value > 1) { + $this->error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/StaticValidator.php b/vendor/zendframework/zend-validator/Zend/Validator/StaticValidator.php new file mode 100644 index 0000000000..84eca56353 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/StaticValidator.php @@ -0,0 +1,60 @@ +setShareByDefault(false); + } + static::$plugins = $plugins; + } + + /** + * Get plugin manager for locating validators + * + * @return ValidatorPluginManager + */ + public static function getPluginManager() + { + if (null === static::$plugins) { + static::setPluginManager(new ValidatorPluginManager()); + } + return static::$plugins; + } + + /** + * @param mixed $value + * @param string $classBaseName + * @param array $args OPTIONAL + * @return bool + */ + public static function execute($value, $classBaseName, array $args = array()) + { + $plugins = static::getPluginManager(); + + $validator = $plugins->get($classBaseName, $args); + return $validator->isValid($value); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Step.php b/vendor/zendframework/zend-validator/Zend/Validator/Step.php new file mode 100644 index 0000000000..8b82bfd455 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Step.php @@ -0,0 +1,153 @@ + "Invalid value given. Scalar expected", + self::NOT_STEP => "The input is not a valid step" + ); + + /** + * @var mixed + */ + protected $baseValue = 0; + + /** + * @var mixed + */ + protected $step = 1; + + /** + * Set default options for this instance + * + * @param array $options + */ + public function __construct($options = array()) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } elseif (!is_array($options)) { + $options = func_get_args(); + $temp['baseValue'] = array_shift($options); + if (!empty($options)) { + $temp['step'] = array_shift($options); + } + + $options = $temp; + } + + if (isset($options['baseValue'])) { + $this->setBaseValue($options['baseValue']); + } + if (isset($options['step'])) { + $this->setStep($options['step']); + } + + parent::__construct($options); + } + + /** + * Sets the base value from which the step should be computed + * + * @param mixed $baseValue + * @return Step + */ + public function setBaseValue($baseValue) + { + $this->baseValue = $baseValue; + return $this; + } + + /** + * Returns the base value from which the step should be computed + * + * @return string + */ + public function getBaseValue() + { + return $this->baseValue; + } + + /** + * Sets the step value + * + * @param mixed $step + * @return Step + */ + public function setStep($step) + { + $this->step = (float) $step; + return $this; + } + + /** + * Returns the step value + * + * @return string + */ + public function getStep() + { + return $this->step; + } + + /** + * Returns true if $value is a scalar and a valid step value + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + if (!is_numeric($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + $fmod = $this->fmod($value - $this->baseValue, $this->step); + + if ($fmod !== 0.0 && $fmod !== $this->step) { + $this->error(self::NOT_STEP); + return false; + } + + return true; + } + + /** + * replaces the internal fmod function which give wrong results on many cases + * + * @param float $x + * @param float $y + * @return float + */ + protected function fmod($x, $y) + { + if ($y == 0.0) { + return 1.0; + } + + //find the maximum precision from both input params to give accurate results + $precision = strlen(substr($x, strpos($x, '.')+1)) + strlen(substr($y, strpos($y, '.')+1)); + + return round($x - $y * floor($x / $y), $precision); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/StringLength.php b/vendor/zendframework/zend-validator/Zend/Validator/StringLength.php new file mode 100644 index 0000000000..53a162c6c1 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/StringLength.php @@ -0,0 +1,209 @@ + "Invalid type given. String expected", + self::TOO_SHORT => "The input is less than %min% characters long", + self::TOO_LONG => "The input is more than %max% characters long", + ); + + /** + * @var array + */ + protected $messageVariables = array( + 'min' => array('options' => 'min'), + 'max' => array('options' => 'max'), + ); + + protected $options = array( + 'min' => 0, // Minimum length + 'max' => null, // Maximum length, null if there is no length limitation + 'encoding' => 'UTF-8', // Encoding to use + ); + + protected $stringWrapper; + + /** + * Sets validator options + * + * @param int|array|\Traversable $options + */ + public function __construct($options = array()) + { + if (!is_array($options)) { + $options = func_get_args(); + $temp['min'] = array_shift($options); + if (!empty($options)) { + $temp['max'] = array_shift($options); + } + + if (!empty($options)) { + $temp['encoding'] = array_shift($options); + } + + $options = $temp; + } + + parent::__construct($options); + } + + /** + * Returns the min option + * + * @return int + */ + public function getMin() + { + return $this->options['min']; + } + + /** + * Sets the min option + * + * @param int $min + * @throws Exception\InvalidArgumentException + * @return StringLength Provides a fluent interface + */ + public function setMin($min) + { + if (null !== $this->getMax() && $min > $this->getMax()) { + throw new Exception\InvalidArgumentException("The minimum must be less than or equal to the maximum length, but $min >" + . " " . $this->getMax()); + } + + $this->options['min'] = max(0, (int) $min); + return $this; + } + + /** + * Returns the max option + * + * @return int|null + */ + public function getMax() + { + return $this->options['max']; + } + + /** + * Sets the max option + * + * @param int|null $max + * @throws Exception\InvalidArgumentException + * @return StringLength Provides a fluent interface + */ + public function setMax($max) + { + if (null === $max) { + $this->options['max'] = null; + } elseif ($max < $this->getMin()) { + throw new Exception\InvalidArgumentException("The maximum must be greater than or equal to the minimum length, but " + . "$max < " . $this->getMin()); + } else { + $this->options['max'] = (int) $max; + } + + return $this; + } + + /** + * Get the string wrapper to detect the string length + * + * @return StringWrapper + */ + public function getStringWrapper() + { + if (!$this->stringWrapper) { + $this->stringWrapper = StringUtils::getWrapper($this->getEncoding()); + } + return $this->stringWrapper; + } + + /** + * Set the string wrapper to detect the string length + * + * @param StringWrapper $stringWrapper + * @return StringLength + */ + public function setStringWrapper(StringWrapper $stringWrapper) + { + $stringWrapper->setEncoding($this->getEncoding()); + $this->stringWrapper = $stringWrapper; + } + + /** + * Returns the actual encoding + * + * @return string + */ + public function getEncoding() + { + return $this->options['encoding']; + } + + /** + * Sets a new encoding to use + * + * @param string $encoding + * @return StringLength + * @throws Exception\InvalidArgumentException + */ + public function setEncoding($encoding) + { + $this->stringWrapper = StringUtils::getWrapper($encoding); + $this->options['encoding'] = $encoding; + return $this; + } + + /** + * Returns true if and only if the string length of $value is at least the min option and + * no greater than the max option (when the max option is not null). + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $this->setValue($value); + + $length = $this->getStringWrapper()->strlen($value); + if ($length < $this->getMin()) { + $this->error(self::TOO_SHORT); + } + + if (null !== $this->getMax() && $this->getMax() < $length) { + $this->error(self::TOO_LONG); + } + + if (count($this->getMessages())) { + return false; + } + + return true; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/Translator/TranslatorAwareInterface.php b/vendor/zendframework/zend-validator/Zend/Validator/Translator/TranslatorAwareInterface.php new file mode 100644 index 0000000000..a9fb45d3b5 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/Translator/TranslatorAwareInterface.php @@ -0,0 +1,69 @@ + "Invalid type given. String expected", + self::NOT_URI => "The input does not appear to be a valid Uri", + ); + + /** + * @var UriHandler + */ + protected $uriHandler; + + /** + * @var bool + */ + protected $allowRelative = true; + + /** + * @var bool + */ + protected $allowAbsolute = true; + + /** + * Sets default option values for this instance + * + * @param array|Traversable $options + */ + public function __construct($options = array()) + { + if ($options instanceof Traversable) { + $options = iterator_to_array($options); + } elseif (!is_array($options)) { + $options = func_get_args(); + $temp['uriHandler'] = array_shift($options); + if (!empty($options)) { + $temp['allowRelative'] = array_shift($options); + } + if (!empty($options)) { + $temp['allowAbsolute'] = array_shift($options); + } + + $options = $temp; + } + + if (isset($options['uriHandler'])) { + $this->setUriHandler($options['uriHandler']); + } + if (isset($options['allowRelative'])) { + $this->setAllowRelative($options['allowRelative']); + } + if (isset($options['allowAbsolute'])) { + $this->setAllowAbsolute($options['allowAbsolute']); + } + + parent::__construct($options); + } + + /** + * @throws InvalidArgumentException + * @return UriHandler + */ + public function getUriHandler() + { + if (null === $this->uriHandler) { + // Lazy load the base Uri handler + $this->uriHandler = new UriHandler(); + } elseif (is_string($this->uriHandler) && class_exists($this->uriHandler)) { + // Instantiate string Uri handler that references a class + $this->uriHandler = new $this->uriHandler; + } + + if (! $this->uriHandler instanceof UriHandler) { + throw new InvalidArgumentException('URI handler is expected to be a Zend\Uri\Uri object'); + } + + return $this->uriHandler; + } + + /** + * @param UriHandler $uriHandler + * @throws InvalidArgumentException + * @return Uri + */ + public function setUriHandler($uriHandler) + { + if (! is_subclass_of($uriHandler, 'Zend\Uri\Uri')) { + throw new InvalidArgumentException('Expecting a subclass name or instance of Zend\Uri\Uri as $uriHandler'); + } + + $this->uriHandler = $uriHandler; + return $this; + } + + /** + * Returns the allowAbsolute option + * + * @return bool + */ + public function getAllowAbsolute() + { + return $this->allowAbsolute; + } + + /** + * Sets the allowAbsolute option + * + * @param bool $allowAbsolute + * @return Uri + */ + public function setAllowAbsolute($allowAbsolute) + { + $this->allowAbsolute = (bool) $allowAbsolute; + return $this; + } + + /** + * Returns the allowRelative option + * + * @return bool + */ + public function getAllowRelative() + { + return $this->allowRelative; + } + + /** + * Sets the allowRelative option + * + * @param bool $allowRelative + * @return Uri + */ + public function setAllowRelative($allowRelative) + { + $this->allowRelative = (bool) $allowRelative; + return $this; + } + + /** + * Returns true if and only if $value validates as a Uri + * + * @param string $value + * @return bool + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->error(self::INVALID); + return false; + } + + $uriHandler = $this->getUriHandler(); + try { + $uriHandler->parse($value); + if ($uriHandler->isValid()) { + // It will either be a valid absolute or relative URI + if (($this->allowRelative && $this->allowAbsolute) + || ($this->allowAbsolute && $uriHandler->isAbsolute()) + || ($this->allowRelative && $uriHandler->isValidRelative()) + ) { + return true; + } + } + } catch (UriException $ex) { + // Error parsing URI, it must be invalid + } + + $this->error(self::NOT_URI); + return false; + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/ValidatorChain.php b/vendor/zendframework/zend-validator/Zend/Validator/ValidatorChain.php new file mode 100644 index 0000000000..22590c2a59 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/ValidatorChain.php @@ -0,0 +1,279 @@ +validators); + } + + /** + * Get plugin manager instance + * + * @return ValidatorPluginManager + */ + public function getPluginManager() + { + if (!$this->plugins) { + $this->setPluginManager(new ValidatorPluginManager()); + } + return $this->plugins; + } + + /** + * Set plugin manager instance + * + * @param ValidatorPluginManager $plugins Plugin manager + * @return ValidatorChain + */ + public function setPluginManager(ValidatorPluginManager $plugins) + { + $this->plugins = $plugins; + return $this; + } + + /** + * Retrieve a validator by name + * + * @param string $name Name of validator to return + * @param null|array $options Options to pass to validator constructor (if not already instantiated) + * @return ValidatorInterface + */ + public function plugin($name, array $options = null) + { + $plugins = $this->getPluginManager(); + return $plugins->get($name, $options); + } + + /** + * Attach a validator to the end of the chain + * + * If $breakChainOnFailure is true, then if the validator fails, the next validator in the chain, + * if one exists, will not be executed. + * + * @param ValidatorInterface $validator + * @param bool $breakChainOnFailure + * @return ValidatorChain Provides a fluent interface + */ + public function attach(ValidatorInterface $validator, $breakChainOnFailure = false) + { + $this->validators[] = array( + 'instance' => $validator, + 'breakChainOnFailure' => (bool) $breakChainOnFailure, + ); + return $this; + } + + /** + * Proxy to attach() to keep BC + * + * @deprecated Please use attach() + * @param ValidatorInterface $validator + * @param bool $breakChainOnFailure + * @return ValidatorChain Provides a fluent interface + */ + public function addValidator(ValidatorInterface $validator, $breakChainOnFailure = false) + { + return $this->attach($validator, $breakChainOnFailure); + } + + /** + * Adds a validator to the beginning of the chain + * + * If $breakChainOnFailure is true, then if the validator fails, the next validator in the chain, + * if one exists, will not be executed. + * + * @param ValidatorInterface $validator + * @param bool $breakChainOnFailure + * @return ValidatorChain Provides a fluent interface + */ + public function prependValidator(ValidatorInterface $validator, $breakChainOnFailure = false) + { + array_unshift( + $this->validators, + array( + 'instance' => $validator, + 'breakChainOnFailure' => (bool) $breakChainOnFailure, + ) + ); + return $this; + } + + /** + * Use the plugin manager to add a validator by name + * + * @param string $name + * @param array $options + * @param bool $breakChainOnFailure + * @return ValidatorChain + */ + public function attachByName($name, $options = array(), $breakChainOnFailure = false) + { + if (isset($options['break_chain_on_failure'])) { + $breakChainOnFailure = (bool) $options['break_chain_on_failure']; + } + + if (isset($options['breakchainonfailure'])) { + $breakChainOnFailure = (bool) $options['breakchainonfailure']; + } + + $validator = $this->plugin($name, $options); + $this->attach($validator, $breakChainOnFailure); + return $this; + } + + /** + * Proxy to attachByName() to keep BC + * + * @deprecated Please use attachByName() + * @param string $name + * @param array $options + * @param bool $breakChainOnFailure + * @return ValidatorChain + */ + public function addByName($name, $options = array(), $breakChainOnFailure = false) + { + return $this->attachByName($name, $options, $breakChainOnFailure); + } + + /** + * Use the plugin manager to prepend a validator by name + * + * @param string $name + * @param array $options + * @param bool $breakChainOnFailure + * @return ValidatorChain + */ + public function prependByName($name, $options = array(), $breakChainOnFailure = false) + { + $validator = $this->plugin($name, $options); + $this->prependValidator($validator, $breakChainOnFailure); + return $this; + } + + /** + * Returns true if and only if $value passes all validations in the chain + * + * Validators are run in the order in which they were added to the chain (FIFO). + * + * @param mixed $value + * @param mixed $context Extra "context" to provide the validator + * @return bool + */ + public function isValid($value, $context = null) + { + $this->messages = array(); + $result = true; + foreach ($this->validators as $element) { + $validator = $element['instance']; + if ($validator->isValid($value, $context)) { + continue; + } + $result = false; + $messages = $validator->getMessages(); + $this->messages = array_replace_recursive($this->messages, $messages); + if ($element['breakChainOnFailure']) { + break; + } + } + return $result; + } + + /** + * Merge the validator chain with the one given in parameter + * + * @param ValidatorChain $validatorChain + * @return ValidatorChain + */ + public function merge(ValidatorChain $validatorChain) + { + foreach ($validatorChain->validators as $validator) { + $this->validators[] = $validator; + } + + return $this; + } + + /** + * Returns array of validation failure messages + * + * @return array + */ + public function getMessages() + { + return $this->messages; + } + + /** + * Get all the validators + * + * @return array + */ + public function getValidators() + { + return $this->validators; + } + + /** + * Invoke chain as command + * + * @param mixed $value + * @return bool + */ + public function __invoke($value) + { + return $this->isValid($value); + } + + /** + * Prepare validator chain for serialization + * + * Plugin manager (property 'plugins') cannot + * be serialized. On wakeup the property remains unset + * and next invokation to getPluginManager() sets + * the default plugin manager instance (ValidatorPluginManager). + * + * @return array + */ + public function __sleep() + { + return array('validators', 'messages'); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/ValidatorInterface.php b/vendor/zendframework/zend-validator/Zend/Validator/ValidatorInterface.php new file mode 100644 index 0000000000..d48aa15863 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/ValidatorInterface.php @@ -0,0 +1,38 @@ + 'Zend\I18n\Validator\Alnum', + 'alpha' => 'Zend\I18n\Validator\Alpha', + 'barcodecode25interleaved' => 'Zend\Validator\Barcode\Code25interleaved', + 'barcodecode25' => 'Zend\Validator\Barcode\Code25', + 'barcodecode39ext' => 'Zend\Validator\Barcode\Code39ext', + 'barcodecode39' => 'Zend\Validator\Barcode\Code39', + 'barcodecode93ext' => 'Zend\Validator\Barcode\Code93ext', + 'barcodecode93' => 'Zend\Validator\Barcode\Code93', + 'barcodeean12' => 'Zend\Validator\Barcode\Ean12', + 'barcodeean13' => 'Zend\Validator\Barcode\Ean13', + 'barcodeean14' => 'Zend\Validator\Barcode\Ean14', + 'barcodeean18' => 'Zend\Validator\Barcode\Ean18', + 'barcodeean2' => 'Zend\Validator\Barcode\Ean2', + 'barcodeean5' => 'Zend\Validator\Barcode\Ean5', + 'barcodeean8' => 'Zend\Validator\Barcode\Ean8', + 'barcodegtin12' => 'Zend\Validator\Barcode\Gtin12', + 'barcodegtin13' => 'Zend\Validator\Barcode\Gtin13', + 'barcodegtin14' => 'Zend\Validator\Barcode\Gtin14', + 'barcodeidentcode' => 'Zend\Validator\Barcode\Identcode', + 'barcodeintelligentmail' => 'Zend\Validator\Barcode\Intelligentmail', + 'barcodeissn' => 'Zend\Validator\Barcode\Issn', + 'barcodeitf14' => 'Zend\Validator\Barcode\Itf14', + 'barcodeleitcode' => 'Zend\Validator\Barcode\Leitcode', + 'barcodeplanet' => 'Zend\Validator\Barcode\Planet', + 'barcodepostnet' => 'Zend\Validator\Barcode\Postnet', + 'barcoderoyalmail' => 'Zend\Validator\Barcode\Royalmail', + 'barcodesscc' => 'Zend\Validator\Barcode\Sscc', + 'barcodeupca' => 'Zend\Validator\Barcode\Upca', + 'barcodeupce' => 'Zend\Validator\Barcode\Upce', + 'barcode' => 'Zend\Validator\Barcode', + 'between' => 'Zend\Validator\Between', + 'callback' => 'Zend\Validator\Callback', + 'creditcard' => 'Zend\Validator\CreditCard', + 'csrf' => 'Zend\Validator\Csrf', + 'date' => 'Zend\Validator\Date', + 'datestep' => 'Zend\Validator\DateStep', + 'datetime' => 'Zend\I18n\Validator\DateTime', + 'dbnorecordexists' => 'Zend\Validator\Db\NoRecordExists', + 'dbrecordexists' => 'Zend\Validator\Db\RecordExists', + 'digits' => 'Zend\Validator\Digits', + 'emailaddress' => 'Zend\Validator\EmailAddress', + 'explode' => 'Zend\Validator\Explode', + 'filecount' => 'Zend\Validator\File\Count', + 'filecrc32' => 'Zend\Validator\File\Crc32', + 'fileexcludeextension' => 'Zend\Validator\File\ExcludeExtension', + 'fileexcludemimetype' => 'Zend\Validator\File\ExcludeMimeType', + 'fileexists' => 'Zend\Validator\File\Exists', + 'fileextension' => 'Zend\Validator\File\Extension', + 'filefilessize' => 'Zend\Validator\File\FilesSize', + 'filehash' => 'Zend\Validator\File\Hash', + 'fileimagesize' => 'Zend\Validator\File\ImageSize', + 'fileiscompressed' => 'Zend\Validator\File\IsCompressed', + 'fileisimage' => 'Zend\Validator\File\IsImage', + 'filemd5' => 'Zend\Validator\File\Md5', + 'filemimetype' => 'Zend\Validator\File\MimeType', + 'filenotexists' => 'Zend\Validator\File\NotExists', + 'filesha1' => 'Zend\Validator\File\Sha1', + 'filesize' => 'Zend\Validator\File\Size', + 'fileupload' => 'Zend\Validator\File\Upload', + 'fileuploadfile' => 'Zend\Validator\File\UploadFile', + 'filewordcount' => 'Zend\Validator\File\WordCount', + 'float' => 'Zend\I18n\Validator\Float', + 'greaterthan' => 'Zend\Validator\GreaterThan', + 'hex' => 'Zend\Validator\Hex', + 'hostname' => 'Zend\Validator\Hostname', + 'iban' => 'Zend\Validator\Iban', + 'identical' => 'Zend\Validator\Identical', + 'inarray' => 'Zend\Validator\InArray', + 'int' => 'Zend\I18n\Validator\Int', + 'ip' => 'Zend\Validator\Ip', + 'isbn' => 'Zend\Validator\Isbn', + 'isinstanceof' => 'Zend\Validator\IsInstanceOf', + 'lessthan' => 'Zend\Validator\LessThan', + 'notempty' => 'Zend\Validator\NotEmpty', + 'phonenumber' => 'Zend\I18n\Validator\PhoneNumber', + 'postcode' => 'Zend\I18n\Validator\PostCode', + 'regex' => 'Zend\Validator\Regex', + 'sitemapchangefreq' => 'Zend\Validator\Sitemap\Changefreq', + 'sitemaplastmod' => 'Zend\Validator\Sitemap\Lastmod', + 'sitemaploc' => 'Zend\Validator\Sitemap\Loc', + 'sitemappriority' => 'Zend\Validator\Sitemap\Priority', + 'stringlength' => 'Zend\Validator\StringLength', + 'step' => 'Zend\Validator\Step', + 'uri' => 'Zend\Validator\Uri', + ); + + /** + * Whether or not to share by default; default to false + * + * @var bool + */ + protected $shareByDefault = false; + + /** + * Constructor + * + * After invoking parent constructor, add an initializer to inject the + * attached translator, if any, to the currently requested helper. + * + * @param null|ConfigInterface $configuration + */ + public function __construct(ConfigInterface $configuration = null) + { + parent::__construct($configuration); + $this->addInitializer(array($this, 'injectTranslator')); + $this->addInitializer(array($this, 'injectValidatorPluginManager')); + } + + /** + * Inject a validator instance with the registered translator + * + * @param ValidatorInterface $validator + * @return void + */ + public function injectTranslator($validator) + { + if ($validator instanceof Translator\TranslatorAwareInterface) { + $locator = $this->getServiceLocator(); + if ($locator && $locator->has('MvcTranslator')) { + $validator->setTranslator($locator->get('MvcTranslator')); + } + } + } + + /** + * Inject a validator plugin manager + * + * @param $validator + * @return void + */ + public function injectValidatorPluginManager($validator) + { + if ($validator instanceof ValidatorPluginManagerAwareInterface) { + $validator->setValidatorPluginManager($this); + } + } + + /** + * Validate the plugin + * + * Checks that the validator loaded is an instance of ValidatorInterface. + * + * @param mixed $plugin + * @return void + * @throws Exception\RuntimeException if invalid + */ + public function validatePlugin($plugin) + { + if ($plugin instanceof ValidatorInterface) { + // we're okay + return; + } + + throw new Exception\RuntimeException(sprintf( + 'Plugin of type %s is invalid; must implement %s\ValidatorInterface', + (is_object($plugin) ? get_class($plugin) : gettype($plugin)), + __NAMESPACE__ + )); + } +} diff --git a/vendor/zendframework/zend-validator/Zend/Validator/ValidatorPluginManagerAwareInterface.php b/vendor/zendframework/zend-validator/Zend/Validator/ValidatorPluginManagerAwareInterface.php new file mode 100644 index 0000000000..4d9c8d0970 --- /dev/null +++ b/vendor/zendframework/zend-validator/Zend/Validator/ValidatorPluginManagerAwareInterface.php @@ -0,0 +1,27 @@ +=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "zendframework/zend-db": "self.version", + "zendframework/zend-filter": "self.version", + "zendframework/zend-i18n": "self.version", + "zendframework/zend-math": "self.version", + "zendframework/zend-servicemanager": "self.version", + "zendframework/zend-session": "self.version", + "zendframework/zend-uri": "self.version" + }, + "suggest": { + "zendframework/zend-db": "Zend\\Db component", + "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator", + "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages as well as to use the various Date validators", + "zendframework/zend-math": "Zend\\Math component", + "zendframework/zend-resources": "Translations of validator messages", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "zendframework/zend-session": "Zend\\Session component", + "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators" + }, + "extra": { + "branch-alias": { + "dev-master": "2.2-dev", + "dev-develop": "2.3-dev" + } + } +}